diff --git a/CHANGELOG.md b/CHANGELOG.md index 1050d31a6..094cf57ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.2.1-1] - 2026-07-25 + +## [4.2.1-0] - 2026-07-24 + ## [4.2.0] - 2026-07-22 ### Added @@ -2379,7 +2383,9 @@ Frodo CLI 2.x automatically refreshes session and access tokens before they expi - Fixed problem with adding connection profiles - Miscellaneous bug fixes -[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.2.0...HEAD +[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.2.1-1...HEAD +[4.2.1-1]: https://github.com/rockcarver/frodo-cli/compare/v4.2.1-0...v4.2.1-1 +[4.2.1-0]: https://github.com/rockcarver/frodo-cli/compare/v4.2.0...v4.2.1-0 [4.2.0]: https://github.com/rockcarver/frodo-cli/compare/v4.1.0...v4.2.0 [4.1.0]: https://github.com/rockcarver/frodo-cli/compare/v4.0.2-0...v4.1.0 [4.0.2-0]: https://github.com/rockcarver/frodo-cli/compare/v4.0.1...v4.0.2-0 diff --git a/docs/EXAMPLE_SECURE_E2E_TEST_MIGRATION.md b/docs/EXAMPLE_SECURE_E2E_TEST_MIGRATION.md index 93df5e070..f47803399 100644 --- a/docs/EXAMPLE_SECURE_E2E_TEST_MIGRATION.md +++ b/docs/EXAMPLE_SECURE_E2E_TEST_MIGRATION.md @@ -8,7 +8,6 @@ This shows how to update `test/e2e/agent-delete.e2e.test.js` to use the global ` import { clearFixture, getEnv, - removeAnsiEscapeCodes, stageFixture, } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; @@ -39,7 +38,6 @@ describe('frodo agent delete', () => { import { clearFixture, getEnv, - removeAnsiEscapeCodes, stageFixture, } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; diff --git a/package-lock.json b/package-lock.json index 34130dfc2..b34240420 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.2.0", + "version": "4.2.1-1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rockcarver/frodo-cli", - "version": "4.2.0", + "version": "4.2.1-1", "license": "MIT", "bin": { "frodo": "dist/launch.cjs" }, "devDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", - "@rockcarver/frodo-lib": "4.1.0", + "@rockcarver/frodo-lib": "4.1.2", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", @@ -24,7 +24,6 @@ "chokidar": "^4.0.3", "cli-progress": "^3.11.2", "cli-table3": "^0.6.3", - "colors": "^1.4.0", "commander": "^14.0.3", "compare-versions": "^6.1.0", "copyfiles": "^2.4.1", @@ -216,9 +215,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", "engines": { @@ -341,13 +340,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -383,13 +382,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -509,13 +508,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -591,9 +590,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], @@ -608,9 +607,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -625,9 +624,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -642,9 +641,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -659,9 +658,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -676,9 +675,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -693,9 +692,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -710,9 +709,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -727,9 +726,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -744,9 +743,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -761,9 +760,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -778,9 +777,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -795,9 +794,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -812,9 +811,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -829,9 +828,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -846,9 +845,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -863,9 +862,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -880,9 +879,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -897,9 +896,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -914,9 +913,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -931,9 +930,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -948,9 +947,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -965,9 +964,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -982,9 +981,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -999,9 +998,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -1016,9 +1015,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -1085,6 +1084,30 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", @@ -1096,6 +1119,23 @@ "concat-map": "0.0.1" } }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -1120,9 +1160,9 @@ } }, "node_modules/@hono/node-server": { - "version": "1.19.14", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "version": "1.19.15", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.15.tgz", + "integrity": "sha512-Za2ai6TLdKjUvnur+eenO6nuYYipVAEhyCAdaV8IRvmU9kK8crOZUSYvIXn72E4f8fJqyAbpcJuTsYYmZp9Deg==", "dev": true, "license": "MIT", "engines": { @@ -1148,6 +1188,13 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", @@ -1315,9 +1362,9 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -1757,30 +1804,6 @@ } } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1820,22 +1843,32 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/pkgr" } }, + "node_modules/@roberts_lando/vfs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.3.tgz", + "integrity": "sha512-YjkxVSLw5WMZQoARaryRAjcxA+GbBzWMJdwYZX5oLUt9cC/gew9as4Dn7tcLzPp7BPoR221VpTZ+78TRPawnjg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 22" + } + }, "node_modules/@rockcarver/frodo-lib": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.1.0.tgz", - "integrity": "sha512-me89srYvRWsv5q1R6TtmLhYlLsOQgISHEiyntrMhJUP7W1VGWNUUoIXZhqRoMYY0yT9P7Q7zIN+MH5ZO1JELFQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.1.2.tgz", + "integrity": "sha512-lKFGzTjG/JRQwgXtI0XGJnS7zx3hBbkU2deTpsns6Tu7/vhk/Genbc0QknyMnp4dW+OiXHPWCf/lXiG/9h0h/A==", "dev": true, "license": "MIT", "engines": { @@ -1843,9 +1876,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", "cpu": [ "arm" ], @@ -1857,9 +1890,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", "cpu": [ "arm64" ], @@ -1871,9 +1904,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", "cpu": [ "arm64" ], @@ -1885,9 +1918,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", "cpu": [ "x64" ], @@ -1899,9 +1932,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", "cpu": [ "arm64" ], @@ -1913,9 +1946,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", "cpu": [ "x64" ], @@ -1927,13 +1960,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", "cpu": [ "arm" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1941,13 +1977,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", "cpu": [ "arm" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1955,13 +1994,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1969,13 +2011,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1983,13 +2028,16 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", "cpu": [ "loong64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1997,13 +2045,16 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", "cpu": [ "loong64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2011,13 +2062,16 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2025,13 +2079,16 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2039,13 +2096,16 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2053,13 +2113,16 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2067,13 +2130,16 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2081,13 +2147,16 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2095,13 +2164,16 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2109,9 +2181,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", "cpu": [ "x64" ], @@ -2123,9 +2195,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", "cpu": [ "arm64" ], @@ -2137,9 +2209,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", "cpu": [ "arm64" ], @@ -2151,9 +2223,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", "cpu": [ "ia32" ], @@ -2165,9 +2237,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", "cpu": [ "x64" ], @@ -2179,9 +2251,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", "cpu": [ "x64" ], @@ -2200,9 +2272,9 @@ "license": "MIT" }, "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", + "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==", "dev": true, "license": "MIT" }, @@ -2296,9 +2368,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -2379,13 +2451,13 @@ } }, "node_modules/@types/node": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", - "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "version": "25.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.5.tgz", + "integrity": "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.18.0" + "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/@types/stack-utils": { @@ -2413,20 +2485,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz", - "integrity": "sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", + "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.57.2", - "@typescript-eslint/type-utils": "8.57.2", - "@typescript-eslint/utils": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/type-utils": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2436,32 +2508,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.57.2", + "@typescript-eslint/parser": "^8.65.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.2.tgz", - "integrity": "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", + "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.57.2", - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/typescript-estree": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", "debug": "^4.4.3" }, "engines": { @@ -2473,18 +2535,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.2.tgz", - "integrity": "sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.57.2", - "@typescript-eslint/types": "^8.57.2", + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", "debug": "^4.4.3" }, "engines": { @@ -2495,18 +2557,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz", - "integrity": "sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2" + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2517,9 +2579,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.2.tgz", - "integrity": "sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", "dev": true, "license": "MIT", "engines": { @@ -2530,21 +2592,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.2.tgz", - "integrity": "sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", + "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/typescript-estree": "8.57.2", - "@typescript-eslint/utils": "8.57.2", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0", "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2555,13 +2617,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.2.tgz", - "integrity": "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", "dev": true, "license": "MIT", "engines": { @@ -2573,21 +2635,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.2.tgz", - "integrity": "sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.57.2", - "@typescript-eslint/tsconfig-utils": "8.57.2", - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2", + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2597,20 +2659,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.2.tgz", - "integrity": "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.57.2", - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/typescript-estree": "8.57.2" + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2621,17 +2683,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.2.tgz", - "integrity": "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/types": "8.65.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -2656,32 +2718,36 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "dev": true, "license": "ISC" }, "node_modules/@yao-pkg/pkg": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.12.0.tgz", - "integrity": "sha512-yXdr5XTnEUm+AuBWPvMdv1z6dCcuKLUPYGZKPwb0pS8YE+P/Jspb47QjutcjfA31tIkGU6JTsOhlGxDxrO/A2w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.21.0.tgz", + "integrity": "sha512-dZl2C7rdwwEI4tv7WW+Cvnl+2K8OqHKUXfNQRq3mZCTC4degoFx1jA4d5wOn9d8lHrUy58xuEt1eJD0pTddW5w==", "dev": true, "license": "MIT", "dependencies": { "@babel/generator": "^7.23.0", "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", - "@yao-pkg/pkg-fetch": "3.5.32", - "into-stream": "^6.0.0", - "minimist": "^1.2.6", + "@roberts_lando/vfs": "^0.3.3", + "@yao-pkg/pkg-fetch": "3.6.4", + "esbuild": "^0.28.1", + "into-stream": "^9.1.0", "multistream": "^4.1.0", "picocolors": "^1.1.0", "picomatch": "^4.0.2", + "postject": "^1.0.0-alpha.6", "prebuild-install": "^7.1.1", "resolve": "^1.22.10", + "resolve.exports": "^2.0.3", "stream-meter": "^1.0.4", - "tar": "^7.4.3", + "tar": "^7.5.7", "tinyglobby": "^0.2.11", "unzipper": "^0.12.3" }, @@ -2689,22 +2755,21 @@ "pkg": "lib-es5/bin.js" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@yao-pkg/pkg-fetch": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.32.tgz", - "integrity": "sha512-hS8zzze5VVyVAciZoNX4q3ZmCdn0gi34P2SElk4PFbzkA4LPs7qBJ3LhUKb4d4KGw1HVkFJJOMgGomH7cMqQ5Q==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.6.4.tgz", + "integrity": "sha512-2JXvS9HbMudLlzEjSaJ7bLNnF/WlTv7iaTAJp2Tk8pBsgwCyL9p4rIN8cztHlyZF7qVzr1EaBjd7DQooFk0azQ==", "dev": true, "license": "MIT", "dependencies": { - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.6", "picocolors": "^1.1.0", "progress": "^2.0.3", "semver": "^7.3.5", "tar-fs": "^3.1.1", + "undici": "^7.28.0", "yargs": "^16.2.0" }, "bin": { @@ -2726,9 +2791,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", "bin": { @@ -2748,30 +2813,17 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -2796,30 +2848,6 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -3092,9 +3120,9 @@ } }, "node_modules/axe-core": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", - "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz", + "integrity": "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==", "dev": true, "license": "MPL-2.0", "engines": { @@ -3112,9 +3140,9 @@ } }, "node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -3263,16 +3291,19 @@ } }, "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==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", + "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -3285,12 +3316,11 @@ } }, "node_modules/bare-fs": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.3.tgz", - "integrity": "sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.4.tgz", + "integrity": "sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", @@ -3310,43 +3340,33 @@ } } }, - "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.1.tgz", + "integrity": "sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==", "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } + "license": "Apache-2.0" }, "node_modules/bare-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", - "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz", + "integrity": "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { - "streamx": "^2.21.0" + "b4a": "^1.8.1", + "streamx": "^2.25.0", + "teex": "^1.0.1" }, "peerDependencies": { + "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, "bare-buffer": { "optional": true }, @@ -3356,12 +3376,11 @@ } }, "node_modules/bare-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", - "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.6.tgz", + "integrity": "sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-path": "^3.0.0" } @@ -3388,9 +3407,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.40", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", - "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.0.tgz", + "integrity": "sha512-oCu2wfipvX3AePSgmOuKkIywOu+8n9psz7hXYmk56ghpu3+7KzNIBopaOs4c9BrtdnTtW30unG9GTfHo7EwERQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3412,21 +3431,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -3486,16 +3490,6 @@ "node": "18 || 20 || >=22" } }, - "node_modules/brace-expansion/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -3510,9 +3504,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "dev": true, "funding": [ { @@ -3530,10 +3524,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -3635,15 +3629,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -3705,9 +3699,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "dev": true, "funding": [ { @@ -3855,6 +3849,24 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3945,9 +3957,9 @@ } }, "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "dev": true, "license": "MIT", "engines": { @@ -4015,6 +4027,13 @@ "copyup": "copyfiles" } }, + "node_modules/copyfiles/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/copyfiles/node_modules/brace-expansion": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", @@ -4197,9 +4216,9 @@ } }, "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -4215,6 +4234,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "license": "MIT" }, @@ -4303,68 +4323,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del/node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/del/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">= 4" - } - }, - "node_modules/del/node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" + "node": ">=8" } }, "node_modules/detect-newline": { @@ -4425,6 +4401,46 @@ "readable-stream": "^2.0.2" } }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4433,9 +4449,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.381", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.381.tgz", - "integrity": "sha512-n9Wa6yB+vDsGuA8AKbl/0z7HbvWqt5jxIdvr1IUicd0ryPrk7/xzwqLv8D9AbbvZ6avVNtXYLTfmgFHkwkyelg==", + "version": "1.5.394", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.394.tgz", + "integrity": "sha512-Wmt2Gm0o8JWBuGgmc4XZ0u9s1RaCRqhxP47phplmfg04+qypTUurpeJGP45A7Fhv7jdrrVH44PLlR9qXo37cVQ==", "dev": true, "license": "ISC" }, @@ -4490,9 +4506,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { @@ -4558,6 +4574,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -4579,9 +4614,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -4621,15 +4656,18 @@ } }, "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "dev": true, "license": "MIT", "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -4639,9 +4677,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4652,32 +4690,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, "node_modules/escalade": { @@ -4784,15 +4822,15 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -4805,10 +4843,34 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", "dev": true, "license": "MIT", "dependencies": { @@ -4867,6 +4929,13 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", @@ -4980,6 +5049,13 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", @@ -5005,14 +5081,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", - "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz", + "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.1", - "synckit": "^0.11.12" + "synckit": "^0.11.13" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -5075,6 +5151,30 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", @@ -5086,6 +5186,16 @@ "concat-map": "0.0.1" } }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/eslint/node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -5096,6 +5206,13 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -5221,9 +5338,9 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", "dev": true, "license": "MIT", "engines": { @@ -5335,12 +5452,13 @@ } }, "node_modules/express-rate-limit": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.0.tgz", + "integrity": "sha512-XKJXDsASUOo0LLtFwW5hCcQGH0N4WQc/Rn8/Pvoia+TJFOkkFPvrtW9lZOeeNcxQJspvOIERMwiRLsVFlhHEkA==", "dev": true, "license": "MIT", "dependencies": { + "debug": "^4.4.3", "ip-address": "^10.2.0" }, "engines": { @@ -5625,17 +5743,6 @@ "node": ">= 0.8" } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -5644,9 +5751,9 @@ "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.6.tgz", + "integrity": "sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==", "dev": true, "license": "MIT", "dependencies": { @@ -5691,18 +5798,21 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -5873,6 +5983,13 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", @@ -5930,6 +6047,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -6061,9 +6199,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -6074,9 +6212,9 @@ } }, "node_modules/hono": { - "version": "4.12.27", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.27.tgz", - "integrity": "sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==", + "version": "4.12.31", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.31.tgz", + "integrity": "sha512-zJIHFrl6bq3RDd2YusFNCDlM8qUprxKswyi/OPzPyzKDdyBXDqWx8bZlZ7R+saTdSTatUmb3O7K4SspGPaEOQg==", "dev": true, "license": "MIT", "engines": { @@ -6111,20 +6249,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -6136,9 +6260,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6174,9 +6298,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", "engines": { @@ -6272,17 +6396,13 @@ } }, "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-9.1.0.tgz", + "integrity": "sha512-DRsRnQrbzdFjaQ1oe4C6/EIUymIOEix1qROEJTF9dbMq+M4Zrm6VaLp6SD/B9IsiEjPZuBSnWWFN+udajugdWA==", "dev": true, "license": "MIT", - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6400,13 +6520,13 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -6450,6 +6570,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6774,9 +6910,9 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, @@ -6991,10 +7127,28 @@ "node": ">=12" } }, + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/jest-cli/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, "license": "MIT", "dependencies": { @@ -7539,9 +7693,9 @@ } }, "node_modules/jose": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", - "integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", + "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", "dev": true, "license": "MIT", "funding": { @@ -7616,9 +7770,9 @@ "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, @@ -7650,9 +7804,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7821,21 +7975,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/loglevel": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", @@ -8038,13 +8177,13 @@ } }, "node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -8064,11 +8203,11 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -8107,16 +8246,16 @@ "license": "MIT" }, "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", - "ufo": "^1.6.1" + "ufo": "^1.6.3" } }, "node_modules/ms": { @@ -8151,21 +8290,6 @@ "readable-stream": "^3.6.0" } }, - "node_modules/multistream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -8210,9 +8334,9 @@ "license": "MIT" }, "node_modules/node-abi": { - "version": "3.87.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", - "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "version": "3.94.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.94.0.tgz", + "integrity": "sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==", "dev": true, "license": "MIT", "dependencies": { @@ -8222,25 +8346,33 @@ "node": ">=10" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", "dev": true, "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/node-int64": { @@ -8251,9 +8383,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "dev": true, "license": "MIT", "engines": { @@ -8375,6 +8507,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", @@ -8486,13 +8634,14 @@ } }, "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.6", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" }, @@ -8503,16 +8652,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8546,9 +8685,9 @@ } }, "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "dev": true, "license": "MIT", "engines": { @@ -8655,9 +8794,9 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -8665,16 +8804,16 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -8682,9 +8821,9 @@ } }, "node_modules/path-to-regexp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.1.tgz", - "integrity": "sha512-fvU78fIjZ+SBM9YwCknCvKOUKkLVqtWDVctl0s7xIqfmfb38t2TT4ZU2gHm+Z8xGwgW+QWEU3oQSAzIbo89Ggw==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "dev": true, "license": "MIT", "funding": { @@ -8692,6 +8831,19 @@ "url": "https://opencollective.com/express" } }, + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -8707,9 +8859,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { @@ -8873,10 +9025,37 @@ } } }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "dev": true, "license": "MIT", "dependencies": { @@ -8907,25 +9086,10 @@ "dev": true, "license": "ISC" }, - "node_modules/prebuild-install/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz", + "integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==", "dev": true, "license": "MIT", "dependencies": { @@ -8976,9 +9140,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "dev": true, "license": "MIT", "bin": { @@ -9095,9 +9259,9 @@ } }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, "license": "MIT", "dependencies": { @@ -9171,13 +9335,17 @@ "license": "MIT" }, "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/raw-body": { @@ -9230,19 +9398,18 @@ "license": "MIT" }, "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/readdirp": { @@ -9343,12 +9510,13 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -9432,13 +9600,13 @@ } }, "node_modules/rimraf": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", - "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^13.0.0", + "glob": "^13.0.3", "package-json-from-dist": "^1.0.1" }, "bin": { @@ -9452,31 +9620,31 @@ } }, "node_modules/rimraf/node_modules/glob": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", - "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.1.2", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -9486,31 +9654,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", "fsevents": "~2.3.2" } }, @@ -9556,15 +9724,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -9575,18 +9743,25 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, "node_modules/safe-push-apply": { @@ -9606,13 +9781,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", @@ -9639,9 +9807,9 @@ "license": "MIT" }, "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", "dev": true, "license": "WTFPL OR ISC", "dependencies": { @@ -9956,9 +10124,9 @@ } }, "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", + "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==", "dev": true, "license": "MIT", "engines": { @@ -10050,10 +10218,50 @@ "readable-stream": "^2.1.4" } }, + "node_modules/stream-meter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", + "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", "dev": true, "license": "MIT", "dependencies": { @@ -10063,13 +10271,13 @@ } }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "node_modules/string-length": { @@ -10124,19 +10332,20 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -10146,16 +10355,16 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.2" }, "engines": { "node": ">= 0.4" @@ -10288,13 +10497,13 @@ } }, "node_modules/synckit": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", - "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.9" + "@pkgr/core": "^0.3.6" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -10304,9 +10513,9 @@ } }, "node_modules/tar": { - "version": "7.5.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.19.tgz", - "integrity": "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==", + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -10321,9 +10530,9 @@ } }, "node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.3.tgz", + "integrity": "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10336,13 +10545,14 @@ } }, "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", + "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", "dev": true, "license": "MIT", "dependencies": { "b4a": "^1.6.4", + "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } @@ -10357,7 +10567,17 @@ "node": ">=18" } }, - "node_modules/test-exclude": { + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", @@ -10372,6 +10592,13 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", @@ -10397,9 +10624,9 @@ } }, "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10447,6 +10674,46 @@ "xtend": "~4.0.1" } }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", @@ -10455,14 +10722,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -10472,9 +10739,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { @@ -10521,13 +10788,6 @@ "node": ">=0.6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -10723,482 +10983,619 @@ } } }, - "node_modules/tsup/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/tsup/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/tsup/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "node_modules/tsup/node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 12" + "node": ">=18" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "node_modules/tsup/node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/tsup/node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.8.0" + "node": ">=18" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/tsup/node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/type-is": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", - "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "node_modules/tsup/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "content-type": "^2.0.0", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=18" } }, - "node_modules/type-is/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "node_modules/tsup/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "node_modules/tsup/node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "node_modules/tsup/node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "node_modules/tsup/node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, + "node_modules/tsup/node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "node_modules/tsup/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.17" + "node": ">=18" } }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "node_modules/tsup/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "node_modules/tsup/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=0.8.0" + "node": ">=18" } }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "node_modules/tsup/node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "node_modules/tsup/node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "node_modules/tsup/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/tsup/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 10.0.0" + "node": ">=18" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/tsup/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "node_modules/tsup/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/unzipper": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", - "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", + "node_modules/tsup/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "bluebird": "~3.7.2", - "duplexer2": "~0.1.4", - "fs-extra": "^11.2.0", - "graceful-fs": "^4.2.2", - "node-int64": "^0.4.0" + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "node_modules/tsup/node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" ], + "dev": true, "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/tsup/node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "node_modules/tsup/node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "(WTFPL OR MIT)" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "node_modules/tsup/node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/uuid": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", - "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", + "node_modules/tsup/node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "hasInstallScript": true, "license": "MIT", "bin": { - "uuid": "dist/esm/bin/uuid" + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" } }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10.12.0" + "node": ">=8" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/tsup/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.8" + "node": ">= 12" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "makeerror": "1.0.12" + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "BSD-2-Clause" + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "engines": { + "node": ">=4" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "ISC", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, - "bin": { - "node-which": "bin/node-which" + "engines": { + "node": ">= 18" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -11207,24 +11604,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -11233,20 +11626,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", + "call-bind": "^1.0.9", "for-each": "^0.3.5", - "get-proto": "^1.0.1", "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -11255,167 +11647,11870 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.17" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", "dev": true, "license": "MIT" }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=0.8.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/undici": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4" + "node": ">=20.18.1" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/unzipper": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz", + "integrity": "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "11.3.1", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">=10" + "node": ">=14.14" } }, - "node_modules/yesno": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.4.0.tgz", - "integrity": "sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==", + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, - "license": "BSD" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "engines": { - "node": ">=10" + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10.12.0" } }, - "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "engines": { + "node": ">= 0.8" } }, - "node_modules/zod-to-json-schema": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", - "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", - "peerDependencies": { - "zod": "^3.25.28 || ^4" + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", + "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yesno": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.4.0.tgz", + "integrity": "sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==", + "dev": true, + "license": "BSD" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.14", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", + "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", + "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", + "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@rockcarver/frodo-lib": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.1.0.tgz", + "integrity": "sha512-me89srYvRWsv5q1R6TtmLhYlLsOQgISHEiyntrMhJUP7W1VGWNUUoIXZhqRoMYY0yT9P7Q7zIN+MH5ZO1JELFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/colors": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/colors/-/colors-1.2.4.tgz", + "integrity": "sha512-oSQxEVIDcYisAzWLa+wr50GSIPu8ml4PsKNJzgrDX3SmEHVBBqbaUurqsUceFauNlCRxNtENKkQm3yOe3m3nfg==", + "deprecated": "This is a stub types definition. colors provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "colors": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz", + "integrity": "sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/type-utils": "8.57.2", + "@typescript-eslint/utils": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.2", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.2.tgz", + "integrity": "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.2.tgz", + "integrity": "sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.2", + "@typescript-eslint/types": "^8.57.2", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz", + "integrity": "sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.2.tgz", + "integrity": "sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.2.tgz", + "integrity": "sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/utils": "8.57.2", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.2.tgz", + "integrity": "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.2.tgz", + "integrity": "sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.2", + "@typescript-eslint/tsconfig-utils": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.2.tgz", + "integrity": "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.2.tgz", + "integrity": "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.2", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@yao-pkg/pkg": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.12.0.tgz", + "integrity": "sha512-yXdr5XTnEUm+AuBWPvMdv1z6dCcuKLUPYGZKPwb0pS8YE+P/Jspb47QjutcjfA31tIkGU6JTsOhlGxDxrO/A2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "@yao-pkg/pkg-fetch": "3.5.32", + "into-stream": "^6.0.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "picocolors": "^1.1.0", + "picomatch": "^4.0.2", + "prebuild-install": "^7.1.1", + "resolve": "^1.22.10", + "stream-meter": "^1.0.4", + "tar": "^7.4.3", + "tinyglobby": "^0.2.11", + "unzipper": "^0.12.3" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@yao-pkg/pkg-fetch": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.32.tgz", + "integrity": "sha512-hS8zzze5VVyVAciZoNX4q3ZmCdn0gi34P2SElk4PFbzkA4LPs7qBJ3LhUKb4d4KGw1HVkFJJOMgGomH7cMqQ5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "picocolors": "^1.1.0", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^3.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.3.tgz", + "integrity": "sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.40", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", + "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/copyfiles/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/copyfiles/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-diff": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", + "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/del/-/del-8.0.1.tgz", + "integrity": "sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "^14.0.2", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^7.0.2", + "presentable-error": "^0.0.1", + "slash": "^5.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/del/node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.381", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.381.tgz", + "integrity": "sha512-n9Wa6yB+vDsGuA8AKbl/0z7HbvWqt5jxIdvr1IUicd0ryPrk7/xzwqLv8D9AbbvZ6avVNtXYLTfmgFHkwkyelg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "28.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz", + "integrity": "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "engines": { + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", + "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", + "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fix-dts-default-cjs-exports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", + "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "rollup": "^4.34.8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.12.27", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.27.tgz", + "integrity": "sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jose": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", + "integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/multistream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dev": true, + "license": "ISC", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/noms/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/noms/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/noms/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.1.tgz", + "integrity": "sha512-fvU78fIjZ+SBM9YwCknCvKOUKkLVqtWDVctl0s7xIqfmfb38t2TT4ZU2gHm+Z8xGwgW+QWEU3oQSAzIbo89Ggw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC" + }, + "node_modules/prebuild-install/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/presentable-error": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/presentable-error/-/presentable-error-0.0.1.tgz", + "integrity": "sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/properties-reader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-2.3.0.tgz", + "integrity": "sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/properties?sponsor=1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/replaceall": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz", + "integrity": "sha512-sL26E4+8Kec7bwpRjHlQvbNZcpnGroT3PA7ywsgH6GjzxAg4IGNlNalLoRC/JmTed7cMhyDbi44pWw1kMhDxlw==", + "dev": true, + "engines": { + "node": ">= 0.8.x" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", + "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.2", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tar": { + "version": "7.5.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.19.tgz", + "integrity": "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ts-jest": { + "version": "29.4.11", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.11.tgz", + "integrity": "sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.8.0", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsup": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", + "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.27.0", + "fix-dts-default-cjs-exports": "^1.0.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "^0.7.6", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tsup/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/unzipper": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", + "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "^11.2.0", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yesno": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.4.0.tgz", + "integrity": "sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==", + "dev": true, + "license": "BSD" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" } } } diff --git a/package.json b/package.json index 669503ad6..597c6b1e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.2.0", + "version": "4.2.1-1", "type": "module", "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.", "keywords": [ @@ -33,10 +33,10 @@ "main": "dist/launch.cjs", "scripts": { "test": "npm run test:only", - "test:only": "FRODO_TEST=1 NODE_OPTIONS='--no-warnings --experimental-vm-modules' npx jest --silent", - "test:serial": "FRODO_TEST=1 NODE_OPTIONS='--no-warnings --experimental-vm-modules' npx jest --silent --runInBand", - "test:debug": "FRODO_TEST=1 NODE_OPTIONS='--no-warnings --experimental-vm-modules' npx jest --silent=false --json --outputFile=./testResults.json", - "test:update": "FRODO_TEST=1 NODE_OPTIONS='--no-warnings --experimental-vm-modules' npx jest --silent=false --updateSnapshot", + "test:only": "FRODO_TEST=1 NO_COLOR=1 NODE_OPTIONS='--no-warnings --experimental-vm-modules' npx jest --silent", + "test:serial": "FRODO_TEST=1 NO_COLOR=1 NODE_OPTIONS='--no-warnings --experimental-vm-modules' npx jest --silent --runInBand", + "test:debug": "FRODO_TEST=1 NO_COLOR=1 NODE_OPTIONS='--no-warnings --experimental-vm-modules' npx jest --silent=false --json --outputFile=./testResults.json", + "test:update": "FRODO_TEST=1 NO_COLOR=1 NODE_OPTIONS='--no-warnings --experimental-vm-modules' npx jest --silent=false --updateSnapshot", "mcp:batch1": "node tools/mcp-agentic-batch-run.mjs --output docs/mcp-agentic-run-log.batch1.json", "mcp:batch2": "node tools/mcp-agentic-batch-run.mjs --batch batch2 --output docs/mcp-agentic-run-log.batch2.json", "mcp:batch3": "node tools/mcp-agentic-batch-run.mjs --batch batch3 --output docs/mcp-agentic-run-log.batch3.json", @@ -105,7 +105,7 @@ }, "devDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", - "@rockcarver/frodo-lib": "4.1.0", + "@rockcarver/frodo-lib": "4.1.2", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", @@ -116,7 +116,6 @@ "chokidar": "^4.0.3", "cli-progress": "^3.11.2", "cli-table3": "^0.6.3", - "colors": "^1.4.0", "commander": "^14.0.3", "compare-versions": "^6.1.0", "copyfiles": "^2.4.1", diff --git a/src/cli/_template/something-delete.ts b/src/cli/_template/something-delete.ts index 4e72f51e0..6490c6186 100644 --- a/src/cli/_template/something-delete.ts +++ b/src/cli/_template/something-delete.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -37,17 +38,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-describe.ts b/src/cli/_template/something-describe.ts index 33928b065..571f39f1a 100644 --- a/src/cli/_template/something-describe.ts +++ b/src/cli/_template/something-describe.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -25,17 +26,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-else-delete.ts b/src/cli/_template/something-else-delete.ts index 818b705a5..af163e697 100644 --- a/src/cli/_template/something-else-delete.ts +++ b/src/cli/_template/something-else-delete.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -35,17 +36,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-else-describe.ts b/src/cli/_template/something-else-describe.ts index b64a9e1e9..29228913f 100644 --- a/src/cli/_template/something-else-describe.ts +++ b/src/cli/_template/something-else-describe.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -23,17 +24,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-else-export.ts b/src/cli/_template/something-else-export.ts index da1efba41..d5017875d 100644 --- a/src/cli/_template/something-else-export.ts +++ b/src/cli/_template/something-else-export.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -47,17 +48,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-else-import.ts b/src/cli/_template/something-else-import.ts index af35a4894..7e8e4f955 100644 --- a/src/cli/_template/something-else-import.ts +++ b/src/cli/_template/something-else-import.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -41,17 +42,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-else-list.ts b/src/cli/_template/something-else-list.ts index b20ffdcb3..c78367c19 100644 --- a/src/cli/_template/something-else-list.ts +++ b/src/cli/_template/something-else-list.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -25,17 +26,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-export.ts b/src/cli/_template/something-export.ts index ff4dafc16..5f051a5e4 100644 --- a/src/cli/_template/something-export.ts +++ b/src/cli/_template/something-export.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -47,17 +48,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-import.ts b/src/cli/_template/something-import.ts index 2feaa8f0f..8db1fb9c4 100644 --- a/src/cli/_template/something-import.ts +++ b/src/cli/_template/something-import.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -41,17 +42,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-list.ts b/src/cli/_template/something-list.ts index 7d79e8c2b..56b8450d9 100644 --- a/src/cli/_template/something-list.ts +++ b/src/cli/_template/something-list.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -21,17 +22,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-other-delete.ts b/src/cli/_template/something-other-delete.ts index 5a62ceb2d..09ec16a7a 100644 --- a/src/cli/_template/something-other-delete.ts +++ b/src/cli/_template/something-other-delete.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -35,17 +36,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-other-describe.ts b/src/cli/_template/something-other-describe.ts index 127d96d5d..0b5db7415 100644 --- a/src/cli/_template/something-other-describe.ts +++ b/src/cli/_template/something-other-describe.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -23,17 +24,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-other-export.ts b/src/cli/_template/something-other-export.ts index eb965b599..8ebd1a062 100644 --- a/src/cli/_template/something-other-export.ts +++ b/src/cli/_template/something-other-export.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -47,17 +48,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-other-import.ts b/src/cli/_template/something-other-import.ts index 2f078687a..d7eb32e0a 100644 --- a/src/cli/_template/something-other-import.ts +++ b/src/cli/_template/something-other-import.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -41,17 +42,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/_template/something-other-list.ts b/src/cli/_template/something-other-list.ts index c56664d76..db17da389 100644 --- a/src/cli/_template/something-other-list.ts +++ b/src/cli/_template/something-other-list.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -25,17 +26,17 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Example command one with params and explanation what it does:\n` + - ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Example command two with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Example command three with params and explanation what it does:\n` + - ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo something --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts b/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts index 680122c69..2ef09c70f 100644 --- a/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts +++ b/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts @@ -1,6 +1,7 @@ import { frodo, state } from '@rockcarver/frodo-lib'; import Table from 'cli-table3'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import { v4 as uuidv4 } from 'uuid'; import { @@ -106,8 +107,8 @@ export default function setup() { style: { 'padding-left': 0, 'padding-right': 0 }, wordWrap: true, }); - table.push(['Client ID'['brightCyan'], clientId]); - table.push(['Client Secret'['brightCyan'], clientSecret]); + table.push([c.cyanBright('Client ID'), clientId]); + table.push([c.cyanBright('Client Secret'), clientSecret]); if (options.llt) { try { const response = await createLongLivedToken( @@ -118,9 +119,9 @@ export default function setup() { options.lltTtl ); if (options.lltEsv) - table.push(['Secret Name'['brightCyan'], response.secret]); - table.push(['Scope'['brightCyan'], response.scope]); - table.push(['Expires'['brightCyan'], response.expires_on]); + table.push([c.cyanBright('Secret Name'), response.secret]); + table.push([c.cyanBright('Scope'), response.scope]); + table.push([c.cyanBright('Expires'), response.expires_on]); printMessage(table.toString()); if (options.lltEsv === false) { printMessage(`\nBearer token:`, 'info'); diff --git a/src/cli/admin/admin-execute-rfc7523-authz-grant-flow.ts b/src/cli/admin/admin-execute-rfc7523-authz-grant-flow.ts index 2b0efbc03..f589b616b 100644 --- a/src/cli/admin/admin-execute-rfc7523-authz-grant-flow.ts +++ b/src/cli/admin/admin-execute-rfc7523-authz-grant-flow.ts @@ -1,6 +1,7 @@ import { JwkRsa } from '@rockcarver/frodo-lib/types/ops/JoseOps.js'; import { Option } from 'commander'; import fs from 'fs'; +import c from 'tinyrainbow'; import { v4 as uuidv4 } from 'uuid'; import * as s from '../../help/SampleData'; @@ -40,19 +41,19 @@ export default function setup() { 'after', `Usage Examples:\n` + ` If you used frodo to create the RFC7523 configuration (see 'Related Commands' below), then you can test your configuration with minimal input and frodo will locate the missing parameters. The command below returns access token and identity token:\n` + - ` $ frodo admin execute-rfc7523-authz-grant-flow --client-id rfc7523-client1 ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo admin execute-rfc7523-authz-grant-flow --client-id rfc7523-client1 ${s.amBaseUrl}\n` + ) + ` Same as above but output raw json:\n` + - ` $ frodo admin execute-rfc7523-authz-grant-flow --client-id rfc7523-client1 --json ${s.amBaseUrl}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo admin execute-rfc7523-authz-grant-flow --client-id rfc7523-client1 --json ${s.amBaseUrl}'\n` + ) + ` Same as first command above but explicitly provide all parameters:\n` + - ` $ frodo admin execute-rfc7523-authz-grant-flow --client-id rfc7523-client1 --iss https://my-issuer.com/issuer --sub 146c2230-9448-4442-b86d-eb4a81a0121d --jwk-file rfc7523-client1_private.jwk.json ${s.amBaseUrl}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo admin execute-rfc7523-authz-grant-flow --client-id rfc7523-client1 --iss https://my-issuer.com/issuer --sub 146c2230-9448-4442-b86d-eb4a81a0121d --jwk-file rfc7523-client1_private.jwk.json ${s.amBaseUrl}'\n` + ) + `\nRelated Commands:\n` + - ` Run ${'frodo admin generate-rfc7523-authz-grant-artefacts --help'['brightCyan']} to see how to create the required configuration artefacts for ${'frodo admin execute-rfc7523-authz-grant-flow'['brightCyan']}:\n` + ` Run ${c.cyanBright('frodo admin generate-rfc7523-authz-grant-artefacts --help')} to see how to create the required configuration artefacts for ${c.cyanBright('frodo admin execute-rfc7523-authz-grant-flow')}:\n` ) .action( // implement command logic inside action handler diff --git a/src/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.ts b/src/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.ts index 349c7fc04..640a28d10 100644 --- a/src/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.ts +++ b/src/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.ts @@ -2,6 +2,7 @@ import { state } from '@rockcarver/frodo-lib'; import { JwkRsa } from '@rockcarver/frodo-lib/types/ops/JoseOps.js'; import { Option } from 'commander'; import fs from 'fs'; +import c from 'tinyrainbow'; import { v4 as uuidv4 } from 'uuid'; import * as s from '../../help/SampleData'; @@ -51,23 +52,23 @@ export default function setup() { ` - Fully configured OAuth2 trusted issuer - named '-issuer'\n` + ` - Private Key as Json Web Key (JWK) - named '_private.jwk.json'\n` + ` - Public Key as Json Web Key Set (JWKS) - named '_public.jwks.json'\n` + - ` $ frodo admin generate-rfc7523-authz-grant-artefacts --client-id rfc7523-client1 --iss https://my-issuer.com/issuer --sub 146c2230-9448-4442-b86d-eb4a81a0121d ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo admin generate-rfc7523-authz-grant-artefacts --client-id rfc7523-client1 --iss https://my-issuer.com/issuer --sub 146c2230-9448-4442-b86d-eb4a81a0121d ${s.amBaseUrl}\n` + ) + ` Same as above but use an existing JWK file instead of creating one.\n` + - ` $ frodo admin generate-rfc7523-authz-grant-artefacts --client-id rfc7523-client1 --iss https://my-issuer.com/issuer --sub 146c2230-9448-4442-b86d-eb4a81a0121d --jwk-file rfc7523-client1_private.jwk.json ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo admin generate-rfc7523-authz-grant-artefacts --client-id rfc7523-client1 --iss https://my-issuer.com/issuer --sub 146c2230-9448-4442-b86d-eb4a81a0121d --jwk-file rfc7523-client1_private.jwk.json ${s.amBaseUrl}\n` + ) + ` Generate and output to console all the artefacts for an RFC7523 authorization grant flow configuration but do not create any configuration or files.\n` + - ` $ frodo admin generate-rfc7523-authz-grant-artefacts --client-id rfc7523-client1 --iss https://my-issuer.com/issuer --sub 146c2230-9448-4442-b86d-eb4a81a0121d --no-save ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo admin generate-rfc7523-authz-grant-artefacts --client-id rfc7523-client1 --iss https://my-issuer.com/issuer --sub 146c2230-9448-4442-b86d-eb4a81a0121d --no-save ${s.amBaseUrl}\n` + ) + ` Generate and output in json format all the artefacts for an RFC7523 authorization grant flow configuration.\n` + - ` $ frodo admin generate-rfc7523-authz-grant-artefacts --client-id rfc7523-client1 --iss https://my-issuer.com/issuer --sub 146c2230-9448-4442-b86d-eb4a81a0121d --json ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo admin generate-rfc7523-authz-grant-artefacts --client-id rfc7523-client1 --iss https://my-issuer.com/issuer --sub 146c2230-9448-4442-b86d-eb4a81a0121d --json ${s.amBaseUrl}\n` + ) + `\nRelated Commands:\n` + - ` Run ${'frodo admin execute-rfc7523-authz-grant-flow --help'['brightCyan']} to see how to test your configuration created with ${'frodo admin generate-rfc7523-authz-grant-artefacts'['brightCyan']}:\n` + ` Run ${c.cyanBright('frodo admin execute-rfc7523-authz-grant-flow --help')} to see how to test your configuration created with ${c.cyanBright('frodo admin generate-rfc7523-authz-grant-artefacts')}:\n` ) .action( // implement command logic inside action handler diff --git a/src/cli/app/app-delete.ts b/src/cli/app/app-delete.ts index 0e202d361..87e0506a2 100644 --- a/src/cli/app/app-delete.ts +++ b/src/cli/app/app-delete.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { @@ -46,14 +47,14 @@ export default function setup() { ) .addHelpText( 'after', - `Important Note:\n`['brightYellow'] + - ` The ${'frodo app'['brightCyan']} command to manage OAuth2 clients in v1.x has been renamed to ${'frodo oauth client'['brightCyan']} in v2.x\n` + - ` The ${'frodo app'['brightCyan']} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${'frodo oauth client'['brightCyan']} command.\n\n` + + c.yellowBright(`Important Note:\n`) + + ` The ${c.cyanBright('frodo app')} command to manage OAuth2 clients in v1.x has been renamed to ${c.cyanBright('frodo oauth client')} in v2.x\n` + + ` The ${c.cyanBright('frodo app')} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${c.cyanBright('frodo oauth client')} command.\n\n` + `Usage Examples:\n` + ` Delete application 'myApp':\n` + - ` $ frodo app delete -i 'myApp' ${s.amBaseUrl}\n`['brightCyan'] + + c.cyanBright(` $ frodo app delete -i 'myApp' ${s.amBaseUrl}\n`) + ` Delete all applications:\n` + - ` $ frodo app delete -a ${s.connId}\n`['brightCyan'] + c.cyanBright(` $ frodo app delete -a ${s.connId}\n`) ) .action( // implement command logic inside action handler diff --git a/src/cli/app/app-describe.ts b/src/cli/app/app-describe.ts index 05c0852f7..fa11e87d4 100644 --- a/src/cli/app/app-describe.ts +++ b/src/cli/app/app-describe.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -27,14 +28,14 @@ export default function setup() { .addOption(new Option('-n, --app-name ', 'Application name.')) .addHelpText( 'after', - `Important Note:\n`['brightYellow'] + - ` The ${'frodo app'['brightCyan']} command to manage OAuth2 clients in v1.x has been renamed to ${'frodo oauth client'['brightCyan']} in v2.x\n` + - ` The ${'frodo app'['brightCyan']} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${'frodo oauth client'['brightCyan']} command.\n\n` + + c.yellowBright(`Important Note:\n`) + + ` The ${c.cyanBright('frodo app')} command to manage OAuth2 clients in v1.x has been renamed to ${c.cyanBright('frodo oauth client')} in v2.x\n` + + ` The ${c.cyanBright('frodo app')} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${c.cyanBright('frodo oauth client')} command.\n\n` + `Usage Examples:\n` + ` Describe application 'myApp':\n` + - ` $ frodo app describe -i myApp ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo app describe -i myApp ${s.connId}\n`) + ` Describe application 'myApp' in raw JSON:\n` + - ` $ frodo app describe -i myApp --json ${s.connId}\n`['brightCyan'] + c.cyanBright(` $ frodo app describe -i myApp --json ${s.connId}\n`) ) .action( // implement command logic inside action handler diff --git a/src/cli/app/app-export.ts b/src/cli/app/app-export.ts index 1b93d3505..447835f46 100644 --- a/src/cli/app/app-export.ts +++ b/src/cli/app/app-export.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { @@ -60,22 +61,22 @@ export default function setup() { ) .addHelpText( 'after', - `Important Note:\n`['brightYellow'] + - ` The ${'frodo app'['brightCyan']} command to manage OAuth2 clients in v1.x has been renamed to ${'frodo oauth client'['brightCyan']} in v2.x\n` + - ` The ${'frodo app'['brightCyan']} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${'frodo oauth client'['brightCyan']} command.\n\n` + + c.yellowBright(`Important Note:\n`) + + ` The ${c.cyanBright('frodo app')} command to manage OAuth2 clients in v1.x has been renamed to ${c.cyanBright('frodo oauth client')} in v2.x\n` + + ` The ${c.cyanBright('frodo app')} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${c.cyanBright('frodo oauth client')} command.\n\n` + `Usage Examples:\n` + ` Export all applications to a single export file with an auto-generated filename using a connection profile:\n` + - ` $ frodo app export -a ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo app export -a ${s.connId}\n`) + ` Export the first application to a single export file with a custom filename:\n` + - ` $ frodo app export -f ./allMyApplications.application.json ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo app export -f ./allMyApplications.application.json ${s.connId}\n` + ) + ` Export all applications to separate export files with an auto-generated filenames:\n` + - ` $ frodo app export -A ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo app export -A ${s.connId}\n`) + ` Export all applications without dependencies to a single export file:\n` + - ` $ frodo app export --no-deps -a ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo app export --no-deps -a ${s.connId}\n`) + ` Export the application 'myApp' to a file with an auto-generated filename of 'myApp.application.json':\n` + - ` $ frodo app export -i myApp ${s.connId}\n`['brightCyan'] + c.cyanBright(` $ frodo app export -i myApp ${s.connId}\n`) ) .action( // implement command logic inside action handler diff --git a/src/cli/app/app-import.ts b/src/cli/app/app-import.ts index aac23edc7..35a9177fc 100644 --- a/src/cli/app/app-import.ts +++ b/src/cli/app/app-import.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { @@ -55,28 +56,28 @@ export default function setup() { ) .addHelpText( 'after', - `Important Note:\n`['brightYellow'] + - ` The ${'frodo app'['brightCyan']} command to manage OAuth2 clients in v1.x has been renamed to ${'frodo oauth client'['brightCyan']} in v2.x\n` + - ` The ${'frodo app'['brightCyan']} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${'frodo oauth client'['brightCyan']} command.\n\n` + + c.yellowBright(`Important Note:\n`) + + ` The ${c.cyanBright('frodo app')} command to manage OAuth2 clients in v1.x has been renamed to ${c.cyanBright('frodo oauth client')} in v2.x\n` + + ` The ${c.cyanBright('frodo app')} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${c.cyanBright('frodo oauth client')} command.\n\n` + `Usage Examples:\n` + ` Import all applications from a single export file using a connection profile:\n` + - ` $ frodo app import -a -f ./allAlphaApplications.application.json ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo app import -a -f ./allAlphaApplications.application.json ${s.connId}\n` + ) + ` Import the first application from a single export file:\n` + - ` $ frodo app import -f ./allAlphaApplications.application.json ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo app import -f ./allAlphaApplications.application.json ${s.connId}\n` + ) + ` Import all applications from separate export files:\n` + - ` $ frodo app import -A ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo app import -A ${s.connId}\n`) + ` Import all applications without dependencies from a single export file:\n` + - ` $ frodo app import --no-deps -a -f ./allAlphaApplications.application.json ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo app import --no-deps -a -f ./allAlphaApplications.application.json ${s.connId}\n` + ) + ` Import only the application 'myApp' from a file with an export file containing multiple applications:\n` + - ` $ frodo app import -i myApp -f ./allAlphaApplications.application.json ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo app import -i myApp -f ./allAlphaApplications.application.json ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/app/app-list.ts b/src/cli/app/app-list.ts index 6b4d75d3f..72fded7d0 100644 --- a/src/cli/app/app-list.ts +++ b/src/cli/app/app-list.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { listApplications } from '../../ops/ApplicationOps'; @@ -25,18 +26,18 @@ export default function setup() { ) .addHelpText( 'after', - `Important Note:\n`['brightYellow'] + - ` The ${'frodo app'['brightCyan']} command to manage OAuth2 clients in v1.x has been renamed to ${'frodo oauth client'['brightCyan']} in v2.x\n` + - ` The ${'frodo app'['brightCyan']} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${'frodo oauth client'['brightCyan']} command.\n\n` + + c.yellowBright(`Important Note:\n`) + + ` The ${c.cyanBright('frodo app')} command to manage OAuth2 clients in v1.x has been renamed to ${c.cyanBright('frodo oauth client')} in v2.x\n` + + ` The ${c.cyanBright('frodo app')} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${c.cyanBright('frodo oauth client')} command.\n\n` + `Usage Examples:\n` + ` List applications using AM base URL, username, and password (note the quotes around password to allow special characters):\n` + - ` $ frodo app list ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo app list ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` List applications using a connection profile (identified by the full AM base URL):\n` + - ` $ frodo app list ${s.amBaseUrl}\n`['brightCyan'] + + c.cyanBright(` $ frodo app list ${s.amBaseUrl}\n`) + ` List applications using a connection profile (identified by a unique substring of the AM base URL or a saved alias):\n` + - ` $ frodo app list ${s.connId}\n`['brightCyan'] + c.cyanBright(` $ frodo app list ${s.connId}\n`) ) .action( // implement command logic inside action handler diff --git a/src/cli/app/app.ts b/src/cli/app/app.ts index 48768e4f9..42f3ef700 100644 --- a/src/cli/app/app.ts +++ b/src/cli/app/app.ts @@ -1,3 +1,5 @@ +import c from 'tinyrainbow'; + import { FrodoStubCommand } from '../FrodoCommand'; import DeleteCmd from './app-delete.js'; // import DescribeCmd from './app-describe.js'; @@ -10,9 +12,9 @@ export default function setup() { .description('Manage applications.') .addHelpText( 'after', - `\nImportant Note:\n`['brightYellow'] + - ` The ${'frodo app'['brightCyan']} command to manage OAuth2 clients in v1.x has been renamed to ${'frodo oauth client'['brightCyan']} in v2.x\n` + - ` The ${'frodo app'['brightCyan']} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${'frodo oauth client'['brightCyan']} command.\n\n` + c.yellowBright(`\nImportant Note:\n`) + + ` The ${c.cyanBright('frodo app')} command to manage OAuth2 clients in v1.x has been renamed to ${c.cyanBright('frodo oauth client')} in v2.x\n` + + ` The ${c.cyanBright('frodo app')} command in v2.x manages the new applications created using the new application templates in ForgeRock Identity Cloud. To manage oauth clients, use the ${c.cyanBright('frodo oauth client')} command.\n\n` ); program.addCommand(ListCmd().name('list')); diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-iga-workflows.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-iga-workflows.ts new file mode 100644 index 000000000..16dd0adf8 --- /dev/null +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-iga-workflows.ts @@ -0,0 +1,58 @@ +import { frodo, state } from '@rockcarver/frodo-lib'; +import { Option } from 'commander'; + +import { configManagerExportIgaWorkflows } from '../../../configManagerOps/FrConfigIgaWorkflowsOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { printMessage, verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager pull iga-workflows', + [], + deploymentTypes + ); + program + .description('Export iga-workflows.') + .addOption( + new Option( + '-n, --name ', + 'Workflow name. Only export the workflow with this name.' + ) + ) + .addOption( + new Option('-i, --include-immutable ', 'Include immutable IGA workflows.') + ) + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + if (!state.getIsIGA()) { + printMessage( + 'Command not supported for non-IGA cloud tenants', + 'error' + ); + process.exit(1); + } + verboseMessage('Exporting IGA workflows'); + const outcome = await configManagerExportIgaWorkflows( + options.name, + options.includeImmutable + ); + if (!outcome) process.exit(1); + }); + return program; +} diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull.ts index fb9327378..cc5701a31 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull.ts @@ -14,6 +14,7 @@ import CustomNodes from './config-manager-pull-custom-nodes'; import EmailProvider from './config-manager-pull-email-provider'; import EmailTemplates from './config-manager-pull-email-templates'; import Endpoints from './config-manager-pull-endpoints'; +import IgaWorkflows from './config-manager-pull-iga-workflows'; import InternalRoles from './config-manager-pull-internal-roles'; import Journeys from './config-manager-pull-journeys'; import Kba from './config-manager-pull-kba'; @@ -79,6 +80,7 @@ export default function setup() { program.addCommand(Test().name('test')); program.addCommand(UiConfig().name('ui-config')); program.addCommand(Variables().name('variables')); + program.addCommand(IgaWorkflows().name('iga-workflows')); return program; } diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-restart.ts b/src/cli/config-manager/config-manager-push/config-manager-push-restart.ts new file mode 100644 index 000000000..4ee5e03e1 --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-restart.ts @@ -0,0 +1,51 @@ +import { frodo } from '@rockcarver/frodo-lib'; + +import { configManagerRestart } from '../../../configManagerOps/FrConfigRestartOps.ts'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; + +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager push restart', + [], + deploymentTypes + ); + program + .description('Restart the environment.') + .addOption( + program.createOption('-s, --status', 'Check restart status only.') + ) + .addOption( + program.createOption('-c, --check', 'Only restart if ESVs need loading.') + ) + .addOption( + program.createOption('-w, --wait', 'Wait for restart to complete.') + ) + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + const outcome = await configManagerRestart( + options.status, + options.check, + options.wait + ); + if (!outcome) process.exitCode = 1; + }); + return program; +} diff --git a/src/cli/config-manager/config-manager-push/config-manager-push.ts b/src/cli/config-manager/config-manager-push/config-manager-push.ts index d9fff9f52..797d8c946 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push.ts @@ -18,6 +18,7 @@ import ManagedObjects from './config-manager-push-managed-objects'; import OrgPrivileges from './config-manager-push-org-privileges'; import PasswordPolicy from './config-manager-push-password-policy'; import RemoteServers from './config-manager-push-remote-servers'; +import Restart from './config-manager-push-restart'; import Schedules from './config-manager-push-schedules'; import SecretMappings from './config-manager-push-secret-mappings'; import ServiceObjects from './config-manager-push-service-objects'; @@ -53,7 +54,8 @@ export default function setup() { program.addCommand(RemoteServers().name('remote-servers')); program.addCommand(SecretMappings().name('secret-mappings')); program.addCommand(CustomNodes().name('custom-nodes')); - program.addCommand(CSP().name('csp')); + program.addCommand(Restart().name('restart')); + return program; } diff --git a/src/cli/config/config-export.ts b/src/cli/config/config-export.ts index 5db7cef15..7e7943a0a 100644 --- a/src/cli/config/config-export.ts +++ b/src/cli/config/config-export.ts @@ -1,5 +1,6 @@ import { state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -107,34 +108,34 @@ export default function setup() { ) .addHelpText( 'after', - `How Frodo handles secrets:\n`['brightGreen'] + - ` Frodo supports exporting and importing of ESV secret values. To leave stuartship of secret values with the cloud environment where they belong, frodo always encrypts values using either encryption keys from the source environment (default) or the target environment (--target parameter). Frodo never exports secrets in the clear.\n\n`[ - 'brightGreen' - ] + + c.greenBright(`How Frodo handles secrets:\n`) + + c.greenBright( + ` Frodo supports exporting and importing of ESV secret values. To leave stuartship of secret values with the cloud environment where they belong, frodo always encrypts values using either encryption keys from the source environment (default) or the target environment (--target parameter). Frodo never exports secrets in the clear.\n\n` + ) + `Usage Examples:\n` + ` Export global and realm configuration for version control (e.g. Git) into the current directory.\n` + ` Note that -x and -s separates script and mapping config to better track changes made to them, and -N removes metadata since it changes every export (you may consider using --no-coords as well if you don't care to track node positions in journeys):\n` + - ` $ frodo config export -sxAND . ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo config export -sxAND . ${s.connId}\n`) + ` Export global and realm configuration from cloud to be later imported into a classic, on-prem deployment.\n` + ` Note -dR is used for exporting all read-only config from cloud since certain cloud read-only config (like the realm config) can be imported into a classic on-prem deployment:\n` + - ` $ frodo config export -adR ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo config export -adR ${s.connId}\n`) + ` Export only the bravo realm configuration:\n` + - ` $ frodo config export -ar ${s.connId} bravo\n`['brightCyan'] + + c.cyanBright(` $ frodo config export -ar ${s.connId} bravo\n`) + ` Backup global and realm configuration including active secret values to a single file (Note: only values of active and loaded secrets can be exported):\n` + - ` $ frodo config export -a --include-active-values ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo config export -a --include-active-values ${s.connId}\n` + ) + ` Backup global and realm configuration including active secret values to individual files in a directory structure (Note: only values of active and loaded secrets can be exported):\n` + - ` $ frodo config export -A -D ${s.connId}-backup --include-active-values ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo config export -A -D ${s.connId}-backup --include-active-values ${s.connId}\n` + ) + ` Export global and realm configuration including active secret values for import into another environment.\n` + ` The --target parameter instructs frodo to encrypt the exported secret values using the target environment so they can be imported into that target environment without requiring the source environment they were exported from.\n` + ` Using the --target parameter, the target environment must be available at the time of export and the person performing the export must have a connection profile for the target environment.\n` + ` Without the --target parameter, the source environment must be available at the time of import and the person performing the import must have a connection profile for the source environment.\n` + - ` $ frodo config export -a --include-active-values --target ${s.connId2} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo config export -a --include-active-values --target ${s.connId2} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/config/config-import.ts b/src/cli/config/config-import.ts index 16c02d90c..c4e2ffc56 100644 --- a/src/cli/config/config-import.ts +++ b/src/cli/config/config-import.ts @@ -1,5 +1,6 @@ import { state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -87,25 +88,25 @@ export default function setup() { ) .addHelpText( 'after', - `How Frodo handles secrets:\n`['brightGreen'] + - ` Frodo supports exporting and importing of ESV secret values. To leave stuartship of secret values with the cloud environment where they belong, frodo always encrypts values using either encryption keys from the source environment (default) or the target environment (--target parameter). Frodo never exports secrets in the clear.\n\n`[ - 'brightGreen' - ] + + c.greenBright(`How Frodo handles secrets:\n`) + + c.greenBright( + ` Frodo supports exporting and importing of ESV secret values. To leave stuartship of secret values with the cloud environment where they belong, frodo always encrypts values using either encryption keys from the source environment (default) or the target environment (--target parameter). Frodo never exports secrets in the clear.\n\n` + ) + `Usage Examples:\n` + ` Restore global and active realm configuration including active secret values from a single file (Note: config export must have been performed using the --include-active-values option):\n` + - ` $ frodo config import -a -f Alpha.everything.json --include-active-values ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo config import -a -f Alpha.everything.json --include-active-values ${s.connId}\n` + ) + ` Restore global and active realm configuration including active secret values from separate files in a directory structure (Note: config export must have been performed using the --include-active-values option):\n` + - ` $ frodo config import -A -D ${s.connId}-backup --include-active-values ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo config import -A -D ${s.connId}-backup --include-active-values ${s.connId}\n` + ) + ` Import global and active realm configuration including active secret values, wich were exported from another environment using the --include-active-values option but without using the --target parameter, therefore requiring the --source parameter on import:\n` + ` The --source parameter instructs frodo to decrypt the secret values during import using the source environment, which was used to encrypt them.\n` + ` Using the --source parameter, the source environment must be available at the time of import and the person performing the import must have a connection profile for the source environment.\n` + - ` $ frodo config import -a -f Alpha.everything.json --include-active-values --source ${s.connId} ${s.connId2}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo config import -a -f Alpha.everything.json --include-active-values --source ${s.connId} ${s.connId2}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/conn/conn-save.ts b/src/cli/conn/conn-save.ts index 25ed84c77..282b1d654 100644 --- a/src/cli/conn/conn-save.ts +++ b/src/cli/conn/conn-save.ts @@ -1,5 +1,6 @@ import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -63,49 +64,49 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Create a connection profile with a new log API key and secret and a new service account:\n` + - ` $ frodo conn save ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo conn save ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Create a connection profile using Amster private key credentials (PingAM classic deployments only):\n` + - ` $ frodo conn save --private-key ${s.amsterPrivateKey} ${s.amClassicBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo conn save --private-key ${s.amsterPrivateKey} ${s.amClassicBaseUrl}\n` + ) + ` Create a connection profile with a new log API key and secret and a new service account and set an alias:\n` + - ` $ frodo conn save --alias ${s.alias} ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo conn save --alias ${s.alias} ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Save an existing service account to an existing or new connection profile:\n` + - ` $ frodo conn save --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo conn save --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Save an existing service account to an existing or new connection profile and set an alias:\n` + - ` $ frodo conn save --alias ${s.alias} --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo conn save --alias ${s.alias} --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.amBaseUrl}\n` + ) + ` Save an existing service account to an existing connection profile (partial host URL only updates an existing profile):\n` + - ` $ frodo conn save --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo conn save --sa-id ${s.saId} --sa-jwk-file ${s.saJwkFile} ${s.connId}\n` + ) + ` Save a connection profile for a Proxy Connect-protected PingOne Advanced Identity Cloud environment:\n` + - ` $ frodo conn save --authentication-header-overrides '{"MY-SECRET-HEADER": "proxyconnect secret header value"}' ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo conn save --authentication-header-overrides '{"MY-SECRET-HEADER": "proxyconnect secret header value"}' ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Update an existing connection profile with a custom header override for a freshly Proxy Connect-protected PingOne Advanced Identity Cloud environment:\n` + - ` $ frodo conn save --authentication-header-overrides '{"MY-SECRET-HEADER": "proxyconnect secret header value"}' ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo conn save --authentication-header-overrides '{"MY-SECRET-HEADER": "proxyconnect secret header value"}' ${s.connId}\n` + ) + ` Save a connection profile for a mutable PingOne Advanced Identity Cloud environment:\n` + - ` $ frodo conn save --configuration-header-overrides '{"X-Configuration-Type": "mutable"}' ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo conn save --configuration-header-overrides '{"X-Configuration-Type": "mutable"}' ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Update an existing connection profile with a configuration header override for a freshly mutable PingOne Advanced Identity Cloud environment:\n` + - ` $ frodo conn save --configuration-header-overrides '{"X-Configuration-Type": "mutable"}' ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo conn save --configuration-header-overrides '{"X-Configuration-Type": "mutable"}' ${s.connId}\n` + ) + ` Update an existing connection profile to use Amster private key credentials with a custom Amster journey (PingAM classic deployments only):\n` + - ` $ frodo conn save --private-key ${s.amsterPrivateKey} --authentication-service ${s.customAmsterService} ${s.classicConnId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo conn save --private-key ${s.amsterPrivateKey} --authentication-service ${s.customAmsterService} ${s.classicConnId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/dcc/dcc-session-abort.ts b/src/cli/dcc/dcc-session-abort.ts index 45201cd39..8d9c3e78b 100644 --- a/src/cli/dcc/dcc-session-abort.ts +++ b/src/cli/dcc/dcc-session-abort.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -24,15 +25,15 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Abort a direct configuration session with full tenant URL, username, and password:\n` + - ` $ frodo direct-config-session abort ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo direct-config-session abort ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Abort a direct configuration session with connection ID:\n` + - ` $ frodo direct-config-session abort ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo direct-config-session abort ${s.connId}\n`) + ` Abort a direct configuration session in JSON format with connection ID:\n` + - ` $ frodo direct-config-session abort --json ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo direct-config-session abort --json ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/dcc/dcc-session-apply.ts b/src/cli/dcc/dcc-session-apply.ts index 3843594bc..862c2fcde 100644 --- a/src/cli/dcc/dcc-session-apply.ts +++ b/src/cli/dcc/dcc-session-apply.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -24,15 +25,15 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Apply configuration and end a direct configuration session with full tenant URL, username, and password:\n` + - ` $ frodo direct-config-session apply ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo direct-config-session apply ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Apply configuration and end a direct configuration session with connection ID:\n` + - ` $ frodo direct-config-session apply ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo direct-config-session apply ${s.connId}\n`) + ` Apply configuration and end a direct configuration session in JSON format with connection ID:\n` + - ` $ frodo direct-config-session apply --json ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo direct-config-session apply --json ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/dcc/dcc-session-init.ts b/src/cli/dcc/dcc-session-init.ts index f6c659ce2..205a2e7d6 100644 --- a/src/cli/dcc/dcc-session-init.ts +++ b/src/cli/dcc/dcc-session-init.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -24,15 +25,15 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Initialize a direct configuration session with full tenant URL, username, and password:\n` + - ` $ frodo direct-config-session init ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo direct-config-session init ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Initialize a direct configuration session with connection ID:\n` + - ` $ frodo direct-config-session init ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo direct-config-session init ${s.connId}\n`) + ` Initialize a direct configuration session in JSON format with connection ID:\n` + - ` $ frodo direct-config-session init --json ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo direct-config-session init --json ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/dcc/dcc-session-state.ts b/src/cli/dcc/dcc-session-state.ts index 0abb7a5bf..a7aca63a2 100644 --- a/src/cli/dcc/dcc-session-state.ts +++ b/src/cli/dcc/dcc-session-state.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -24,15 +25,15 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Retrieve the state of the direct configuration session with full tenant URL, username, and password:\n` + - ` $ frodo direct-config-session state ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo direct-config-session state ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Retrieve the state of the direct configuration session with connection ID:\n` + - ` $ frodo direct-config-session state ${s.connId}\n`['brightCyan'] + + c.cyanBright(` $ frodo direct-config-session state ${s.connId}\n`) + ` Retrieve the state of the direct configuration session in JSON format with connection ID:\n` + - ` $ frodo direct-config-session state --json ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo direct-config-session state --json ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/esv/esv-secret-export.ts b/src/cli/esv/esv-secret-export.ts index 57da05c80..31878347b 100644 --- a/src/cli/esv/esv-secret-export.ts +++ b/src/cli/esv/esv-secret-export.ts @@ -1,5 +1,6 @@ import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -69,26 +70,26 @@ export default function setup() { ) .addHelpText( 'after', - `How Frodo handles secrets:\n`['brightGreen'] + - ` Frodo supports exporting and importing of ESV secret values. To leave stuartship of secret values with the cloud environment where they belong, frodo always encrypts values using either encryption keys from the source environment (default) or the target environment (--target parameter). Frodo never exports secrets in the clear.\n\n`[ - 'brightGreen' - ] + + c.greenBright(`How Frodo handles secrets:\n`) + + c.greenBright( + ` Frodo supports exporting and importing of ESV secret values. To leave stuartship of secret values with the cloud environment where they belong, frodo always encrypts values using either encryption keys from the source environment (default) or the target environment (--target parameter). Frodo never exports secrets in the clear.\n\n` + ) + `Usage Examples:\n` + ` Export secrets including active secret values to a single file (Note: only values of active and loaded secrets can be exported):\n` + - ` $ frodo esv secret export -a --include-active-values ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo esv secret export -a --include-active-values ${s.connId}\n` + ) + ` Export secrets including active secret values to individual files in a directory (Note: only values of active and loaded secrets can be exported):\n` + - ` $ frodo esv secret export -A -D ${s.connId}-secrets --include-active-values ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo esv secret export -A -D ${s.connId}-secrets --include-active-values ${s.connId}\n` + ) + ` Export secrets including active secret values to a single file for import into another environment.\n` + ` The --target parameter instructs frodo to encrypt the exported secret values using the target environment so they can be imported into that target environment without requiring the source environment they were exported from.\n` + ` Using the --target parameter, the target environment must be available at the time of export and the person performing the export must have a connection profile for the target environment.\n` + ` Without the --target parameter, the source environment must be available at the time of import and the person performing the import must have a connection profile for the source environment.\n` + - ` $ frodo esv secret export -a --include-active-values --target ${s.connId2} ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo esv secret export -a --include-active-values --target ${s.connId2} ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/esv/esv-secret-import.ts b/src/cli/esv/esv-secret-import.ts index 48e2523a2..2d4e22e76 100644 --- a/src/cli/esv/esv-secret-import.ts +++ b/src/cli/esv/esv-secret-import.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -57,25 +58,25 @@ export default function setup() { ) .addHelpText( 'after', - `How Frodo handles secrets:\n`['brightGreen'] + - ` Frodo supports exporting and importing of ESV secret values. To leave stuartship of secret values with the cloud environment where they belong, frodo always encrypts values using either encryption keys from the source environment (default) or the target environment (--target parameter). Frodo never exports secrets in the clear.\n\n`[ - 'brightGreen' - ] + + c.greenBright(`How Frodo handles secrets:\n`) + + c.greenBright( + ` Frodo supports exporting and importing of ESV secret values. To leave stuartship of secret values with the cloud environment where they belong, frodo always encrypts values using either encryption keys from the source environment (default) or the target environment (--target parameter). Frodo never exports secrets in the clear.\n\n` + ) + `Usage Examples:\n` + ` Import secrets including active secret values from a single file (Note: secrets must have been exported using the --include-active-values option):\n` + - ` $ frodo esv secret import -a -f allAlphaSecrets.secret.json --include-active-values ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo esv secret import -a -f allAlphaSecrets.secret.json --include-active-values ${s.connId}\n` + ) + ` Import secrets including active secret values from separate files in a directory (Note: secrets must have been exported using the --include-active-values option):\n` + - ` $ frodo esv secret import -A -D ${s.connId}-secrets --include-active-values ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo esv secret import -A -D ${s.connId}-secrets --include-active-values ${s.connId}\n` + ) + ` Import secrets including active secret values from a single file that was exported from another environment using the --include-active-values option but without using the --target parameter, therefore requiring the --source parameter on import:\n` + ` The --source parameter instructs frodo to decrypt the secret values during import using the source environment, which was used to encrypt them.\n` + ` Using the --source parameter, the source environment must be available at the time of import and the person performing the import must have a connection profile for the source environment.\n` + - ` $ frodo esv secret import -a -f allAlphaSecrets.secret.json --include-active-values --source ${s.connId} ${s.connId2}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo esv secret import -a -f allAlphaSecrets.secret.json --include-active-values --source ${s.connId} ${s.connId2}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/esv/esv-variable-create.ts b/src/cli/esv/esv-variable-create.ts index a1bb7f958..1228cc2c8 100644 --- a/src/cli/esv/esv-variable-create.ts +++ b/src/cli/esv/esv-variable-create.ts @@ -1,4 +1,5 @@ import { frodo } from '@rockcarver/frodo-lib'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -31,25 +32,25 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Create an ESV variable using implied default type "string":\n` + - ` $ frodo esv variable create --variable-id "esv-trinity-phone" --value "(312)-555-0690" --description "Trinity's phone number." ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo esv variable create --variable-id "esv-trinity-phone" --value "(312)-555-0690" --description "Trinity's phone number." ${s.connId}\n` + ) + ` Create an ESV variable of type "array":\n` + - ` $ frodo esv variable create --variable-id "esv-nebuchadnezzar-crew" --variable-type array --value '["Morpheus","Trinity","Link","Tank","Dozer","Apoc","Cypher","Mouse","Neo","Switch"]' --description "The crew of the Nebuchadnezzar hovercraft." ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo esv variable create --variable-id "esv-nebuchadnezzar-crew" --variable-type array --value '["Morpheus","Trinity","Link","Tank","Dozer","Apoc","Cypher","Mouse","Neo","Switch"]' --description "The crew of the Nebuchadnezzar hovercraft." ${s.connId}\n` + ) + ` Create an ESV variable of type "object":\n` + - ` $ frodo esv variable create --variable-id "esv-nebuchadnezzar-crew-structure" --variable-type object --value '{"Captain":"Morpheus","FirstMate":"Trinity","Operator":["Link","Tank"],"Medic":"Dozer","Crewmen":["Apoc","Cypher","Mouse","Neo","Switch"]}' --description "The structure of the crew of the Nebuchadnezzar hovercraft." ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo esv variable create --variable-id "esv-nebuchadnezzar-crew-structure" --variable-type object --value '{"Captain":"Morpheus","FirstMate":"Trinity","Operator":["Link","Tank"],"Medic":"Dozer","Crewmen":["Apoc","Cypher","Mouse","Neo","Switch"]}' --description "The structure of the crew of the Nebuchadnezzar hovercraft." ${s.connId}\n` + ) + ` Create an ESV variable of type "int":\n` + - ` $ frodo esv variable create --variable-id "esv-neo-age" --variable-type int --value '28' --description "Neo's age in the matrix." ${s.connId}\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo esv variable create --variable-id "esv-neo-age" --variable-type int --value '28' --description "Neo's age in the matrix." ${s.connId}\n` + ) + ` Create an ESV variable of type "bool":\n` + - ` $ frodo esv variable create --variable-id "esv-blue-piller" --variable-type bool --value 'false' --description "Zion membership criteria." ${s.connId}\n`[ - 'brightCyan' - ] + c.cyanBright( + ` $ frodo esv variable create --variable-id "esv-blue-piller" --variable-type bool --value 'false' --description "Zion membership criteria." ${s.connId}\n` + ) ) .action( // implement command logic inside action handler diff --git a/src/cli/info/info.ts b/src/cli/info/info.ts index 1b78a0216..16ecdd01f 100644 --- a/src/cli/info/info.ts +++ b/src/cli/info/info.ts @@ -1,5 +1,6 @@ import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -29,15 +30,15 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Show human-readable output and login using AM base URL, username, and password (note the quotes around password to allow special characters):\n` + - ` $ frodo info ${s.amBaseUrl} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo info ${s.amBaseUrl} ${s.username} '${s.password}'\n` + ) + ` Show human-readable output and login using a connection profile (identified by the full AM base URL):\n` + - ` $ frodo info ${s.amBaseUrl}\n`['brightCyan'] + + c.cyanBright(` $ frodo info ${s.amBaseUrl}\n`) + ` Show human-readable output and login using a connection profile (identified by a unique substring of the AM base URL or a saved alias):\n` + - ` $ frodo info ${s.connId}\n`['brightCyan'] + - ` Show JSON output and login using the AM base URL's unique substring or a saved alias to identify the connection profile:\n` + - ` $ frodo info --json ${s.connId}\n`['brightCyan'] + c.cyanBright(` $ frodo info ${s.connId}\n`) + + ` Show JSON output and login using the AM base URL's unique substring to identify the connection profile:\n` + + c.cyanBright(` $ frodo info --json ${s.connId}\n`) ) .action(async (host, user, password, options, command) => { command.handleDefaultArgsAndOpts(host, user, password, options, command); diff --git a/src/cli/shell/shell.ts b/src/cli/shell/shell.ts index ccd5c282c..e2f627d4e 100644 --- a/src/cli/shell/shell.ts +++ b/src/cli/shell/shell.ts @@ -3,6 +3,7 @@ import repl from 'node:repl'; import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; +import c from 'tinyrainbow'; import util from 'util'; import vm from 'vm'; @@ -101,7 +102,7 @@ async function startRepl(allowAwait = false, host?: string) { const text = typeof message === 'object' ? util.inspect(message, { depth: 6, colors: true }) - : String(message)['brightMagenta']; + : c.magentaBright(String(message)); replServer.output.write(text + '\n'); }); state.setVerboseHandler((message) => { @@ -110,7 +111,7 @@ async function startRepl(allowAwait = false, host?: string) { }); state.setCurlirizeHandler((message) => { if (!message || !state.getCurlirize()) return; - replServer.output.write(String(message)['brightBlue'] + '\n'); + replServer.output.write(c.blueBright(String(message)) + '\n'); }); // Inject the help() function, which surfaces type signatures and JSDoc from @@ -289,13 +290,13 @@ export default function setup() { 'after', `Usage Examples:\n` + ` Launch a frodo shell using explicit login parameters:\n` + - ` $ frodo shell ${s.amBaseUrl} ${s.realm} ${s.username} '${s.password}'\n`[ - 'brightCyan' - ] + + c.cyanBright( + ` $ frodo shell ${s.amBaseUrl} ${s.realm} ${s.username} '${s.password}'\n` + ) + ` Launch a frodo shell using a connection profile (identified by the full AM base URL):\n` + - ` $ frodo shell ${s.amBaseUrl}\n`['brightCyan'] + + c.cyanBright(` $ frodo shell ${s.amBaseUrl}\n`) + ` Launch a frodo shell using a connection profile (identified by a unique substring of the AM base URL or a saved alias):\n` + - ` $ frodo shell ${s.connId}\n`['brightCyan'] + c.cyanBright(` $ frodo shell ${s.connId}\n`) ) .addOption( new Option( diff --git a/src/configManagerOps/FrConfigIgaWorkflowsOps.ts b/src/configManagerOps/FrConfigIgaWorkflowsOps.ts new file mode 100644 index 000000000..86c30477c --- /dev/null +++ b/src/configManagerOps/FrConfigIgaWorkflowsOps.ts @@ -0,0 +1,67 @@ +import { frodo } from '@rockcarver/frodo-lib'; + +import { extractFrConfigDataToFile } from '../utils/Config'; +import { printError } from '../utils/Console'; +import { safeFileName } from '../utils/FrConfig'; + +const { saveJsonToFile, getFilePath } = frodo.utils; +const { readWorkflows } = frodo.cloud.iga.workflow; + +/** + * Export IGA workflows in fr-config-manager format. + * @param {string} name optional workflow name to filter by + * @param {boolean} includeImmutable if true, also export immutable workflows + * @returns {Promise} a promise that resolves to true if successful, false otherwise + */ +export async function configManagerExportIgaWorkflows( + name?: string, + includeImmutable: boolean = false +): Promise { + try { + const workflows = (await readWorkflows()).filter( + (w) => (!name || w.name === name) && (includeImmutable || w.mutable) + ); + if (name && workflows.length === 0) { + throw new Error(`Workflow ${name} not found`); + } + workflows.forEach(processIgaWorkflow); + return true; + } catch (error) { + printError(error, 'Error exporting iga-workflows to files'); + } + return false; +} +/** + * Export a single IGA workflow to files in fr-config-manager format. + * @param {object} workflow the workflow to export + */ +async function processIgaWorkflow(workflow) { + try { + const workflowName = safeFileName(workflow.name); + const stepsPath = `${workflowName}/steps`; + workflow.steps.forEach((step) => { + const uniqueId = safeFileName(`${step.displayName} - ${step.name}`); + const stepPath = `${stepsPath}/${uniqueId}`; + const stepBody = step[step.type]; + if ( + stepBody && + typeof stepBody === 'object' && + typeof stepBody.script === 'string' && + stepBody.script + ) { + const scriptFilename = `${uniqueId}.js`; + extractFrConfigDataToFile(stepBody.script, scriptFilename, stepPath); + stepBody.script = { + file: scriptFilename, + }; + } + const stepFileName = `${stepPath}/${uniqueId}.json`; + saveJsonToFile(step, getFilePath(stepFileName, true), false, true); + }); + delete workflow.steps; + const fileName = `${workflowName}/${workflowName}.json`; + saveJsonToFile(workflow, getFilePath(fileName, true), false, true); + } catch (err) { + printError(err); + } +} diff --git a/src/configManagerOps/FrConfigRestartOps.ts.ts b/src/configManagerOps/FrConfigRestartOps.ts.ts new file mode 100644 index 000000000..2a26e8014 --- /dev/null +++ b/src/configManagerOps/FrConfigRestartOps.ts.ts @@ -0,0 +1,43 @@ +import { frodo } from '@rockcarver/frodo-lib'; + +import { printError, printMessage } from '../utils/Console'; + +const { checkForUpdates, applyUpdates, readStatus } = frodo.cloud.startup; + +/** + * Restart the environment to apply pending ESV updates. + * @param {boolean} status if true, only report the current restart status without restarting + * @param {boolean} check if true, only restart if there are ESVs that need loading + * @param {boolean} wait if true, wait for the restart to complete before returning + * @return {Promise} a promise that resolves to true if successful, false otherwise + */ +export async function configManagerRestart( + status?: boolean, + check?: boolean, + wait?: boolean +): Promise { + try { + const restartStatus = await readStatus(); + if (status) { + printMessage(restartStatus); + return true; + } + if (restartStatus === 'restarting') { + printMessage('Environment already restarting.', 'error'); + return false; + } + if (check) { + const updates = await checkForUpdates(); + const updateCount = + (updates.secrets?.length || 0) + (updates.variables?.length || 0); + if (updateCount === 0) { + printMessage('All ESVs loaded - not restarting'); + return true; + } + } + return await applyUpdates(!!wait); + } catch (error) { + printError(error, 'Error restarting environment'); + return false; + } +} diff --git a/src/ops/AdminOps.ts b/src/ops/AdminOps.ts index 0463401a0..675047101 100644 --- a/src/ops/AdminOps.ts +++ b/src/ops/AdminOps.ts @@ -6,6 +6,7 @@ import { OAuth2TrustedJwtIssuerSkeleton } from '@rockcarver/frodo-lib/types/api/ import { JwkRsa, JwksInterface } from '@rockcarver/frodo-lib/types/ops/JoseOps'; import { AccessTokenMetaType } from '@rockcarver/frodo-lib/types/ops/OAuth2OidcOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { cleanupProgressIndicators, @@ -1177,21 +1178,21 @@ export async function generateRfc7523AuthZGrantArtefacts( : `\nIn AM, create an OAuth2 client in the ${state.getRealm()} realm with the following information:` ); const client = createKeyValueTable(); - client.push(['Client ID'['brightCyan'], clientId]); - client.push(['Client Name'['brightCyan'], clientId]); + client.push([c.cyanBright('Client ID'), clientId]); + client.push([c.cyanBright('Client Name'), clientId]); client.push([ - 'Scopes'['brightCyan'], + c.cyanBright('Scopes'), ( artefacts.client.coreOAuth2ClientConfig.scopes as Writable ).value.join(', '), ]); client.push([ - 'Client Type'['brightCyan'], + c.cyanBright('Client Type'), (artefacts.client.coreOAuth2ClientConfig.clientType as Writable) .value, ]); client.push([ - 'Grant Types'['brightCyan'], + c.cyanBright('Grant Types'), ( artefacts.client.advancedOAuth2ClientConfig.grantTypes as Writable< string[] @@ -1199,28 +1200,28 @@ export async function generateRfc7523AuthZGrantArtefacts( ).value.join(', '), ]); client.push([ - 'Implied Consent'['brightCyan'], + c.cyanBright('Implied Consent'), ( artefacts.client.advancedOAuth2ClientConfig .isConsentImplied as Writable ).value, ]); client.push([ - 'Token Endpoint Authentication '['brightCyan'], + c.cyanBright('Token Endpoint Authentication '), ( artefacts.client.advancedOAuth2ClientConfig .tokenEndpointAuthMethod as Writable ).value, ]); client.push([ - 'Public Key Selector'['brightCyan'], + c.cyanBright('Public Key Selector'), ( artefacts.client.signEncOAuth2ClientConfig .publicKeyLocation as Writable ).value, ]); client.push([ - 'JWKS (Public Key)'['brightCyan'], + c.cyanBright('JWKS (Public Key)'), options.save ? `${jwksFile}` : 'See below', ]); printMessage(`\n${client.toString()}`); @@ -1231,13 +1232,13 @@ export async function generateRfc7523AuthZGrantArtefacts( : `\nIn AM, create a trusted issuer in the ${state.getRealm()} realm with the following information:` ); const issuer = createKeyValueTable(); - issuer.push(['Name'['brightCyan'], artefacts.issuer._id]); + issuer.push([c.cyanBright('Name'), artefacts.issuer._id]); issuer.push([ - 'JWT Issuer'['brightCyan'], + c.cyanBright('JWT Issuer'), (artefacts.issuer.issuer as Writable).value, ]); issuer.push([ - 'Allowed Subjects '['brightCyan'], + c.cyanBright('Allowed Subjects '), (artefacts.issuer.allowedSubjects as Writable)?.value.length ? ( artefacts.issuer.allowedSubjects as Writable @@ -1245,14 +1246,14 @@ export async function generateRfc7523AuthZGrantArtefacts( : `Any ${state.getRealm()} realm user`, ]); issuer.push([ - 'JWKS (Public Key)'['brightCyan'], + c.cyanBright('JWKS (Public Key)'), options.save ? `${jwksFile}` : 'See below', ]); printMessage(`\n${issuer.toString()}`); if (!options.save) { - printMessage('\nJWK (Private Key)'['brightCyan']); + printMessage(c.cyanBright('\nJWK (Private Key)')); printMessage(stringify(artefacts.jwk)); - printMessage('\nJWKS (Public Key)'['brightCyan']); + printMessage(c.cyanBright('\nJWKS (Public Key)')); printMessage(stringify(artefacts.jwks)); } } @@ -1395,10 +1396,10 @@ export async function executeRfc7523AuthZGrantFlow( if (json) { printMessage(tokenResponse, 'data'); } else { - printMessage('\nAccess Token'['brightCyan']); + printMessage(c.cyanBright('\nAccess Token')); printMessage(tokenResponse.access_token); if (tokenResponse.id_token) { - printMessage('\nIdentity Token'['brightCyan']); + printMessage(c.cyanBright('\nIdentity Token')); printMessage(tokenResponse.id_token); } } diff --git a/src/ops/AgentOps.ts b/src/ops/AgentOps.ts index 729664136..0aba22695 100644 --- a/src/ops/AgentOps.ts +++ b/src/ops/AgentOps.ts @@ -1,6 +1,7 @@ import { frodo, FrodoError, state } from '@rockcarver/frodo-lib'; import { type AgentExportInterface } from '@rockcarver/frodo-lib/types/ops/AgentOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { createProgressIndicator, @@ -122,7 +123,7 @@ export async function listAgents( const status = resolveAgentStatus(agent); table.push([ agent._id, - status === 'Active' ? 'Active'['brightGreen'] : status['brightRed'], + status === 'Active' ? c.greenBright('Active') : c.redBright(status), agent._type.name, ]); } @@ -154,8 +155,8 @@ export async function listIdentityGatewayAgents( table.push([ agent._id, agent.status === 'Active' - ? 'Active'['brightGreen'] - : agent.status['brightRed'], + ? c.greenBright('Active') + : c.redBright(agent.status), ]); } printMessage(table.toString(), 'data'); @@ -184,8 +185,8 @@ export async function listJavaAgents(long: boolean = false): Promise { table.push([ agent._id, agent['globalJ2EEAgentConfig']['status'] === 'Active' - ? 'Active'['brightGreen'] - : agent['globalJ2EEAgentConfig']['status']['brightRed'], + ? c.greenBright('Active') + : c.redBright(agent['globalJ2EEAgentConfig']['status']), ]); } printMessage(table.toString(), 'data'); @@ -214,8 +215,8 @@ export async function listWebAgents(long: boolean = false): Promise { table.push([ agent._id, agent['globalWebAgentConfig']['status'] === 'Active' - ? 'Active'['brightGreen'] - : agent['globalWebAgentConfig']['status']['brightRed'], + ? c.greenBright('Active') + : c.redBright(agent['globalWebAgentConfig']['status']), ]); } printMessage(table.toString(), 'data'); @@ -1463,7 +1464,7 @@ export async function listAIAgents(long: boolean = false): Promise { const status = resolveAgentStatus(agent); table.push([ agent._id, - status === 'Active' ? 'Active'['brightGreen'] : status['brightRed'], + status === 'Active' ? c.greenBright('Active') : c.redBright(status), ]); } printMessage(table.toString(), 'data'); @@ -1706,7 +1707,7 @@ export async function describeAIAgent( table.push(['Agent Id', agent._id]); table.push([ 'Status', - status === 'Active' ? 'Active'['brightGreen'] : status['brightRed'], + status === 'Active' ? c.greenBright('Active') : c.redBright(status), ]); table.push(['Type', agent._type.name]); return table.toString(); @@ -1740,7 +1741,7 @@ export async function describeIdentityGatewayAgent( table.push(['Agent Id', targetAgent._id]); table.push([ 'Status', - status === 'Active' ? 'Active'['brightGreen'] : status['brightRed'], + status === 'Active' ? c.greenBright('Active') : c.redBright(status), ]); table.push(['Type', targetAgent._type.name]); return table.toString(); @@ -1774,7 +1775,7 @@ export async function describeJavaAgent( table.push(['Agent Id', targetAgent._id]); table.push([ 'Status', - status === 'Active' ? 'Active'['brightGreen'] : status['brightRed'], + status === 'Active' ? c.greenBright('Active') : c.redBright(status), ]); table.push(['Type', targetAgent._type.name]); return table.toString(); @@ -1808,7 +1809,7 @@ export async function describeWebAgent( table.push(['Agent Id', targetAgent._id]); table.push([ 'Status', - status === 'Active' ? 'Active'['brightGreen'] : status['brightRed'], + status === 'Active' ? c.greenBright('Active') : c.redBright(status), ]); table.push(['Type', targetAgent._type.name]); return table.toString(); @@ -1844,7 +1845,7 @@ export async function describeAgent( table.push(['Agent Id', targetAgent._id]); table.push([ 'Status', - status === 'Active' ? 'Active'['brightGreen'] : status['brightRed'], + status === 'Active' ? c.greenBright('Active') : c.redBright(status), ]); table.push(['Type', targetAgent._type.name]); return table.toString(); @@ -1874,7 +1875,7 @@ export async function describeAgents( const status = resolveAgentStatus(agent); table.push([ agent._id, - status === 'Active' ? 'Active'['brightGreen'] : status['brightRed'], + status === 'Active' ? c.greenBright('Active') : c.redBright(status), agent._type.name, ]); } diff --git a/src/ops/CirclesOfTrustOps.ts b/src/ops/CirclesOfTrustOps.ts index 570e56515..adbd5bd57 100644 --- a/src/ops/CirclesOfTrustOps.ts +++ b/src/ops/CirclesOfTrustOps.ts @@ -2,6 +2,7 @@ import { frodo, FrodoError, state } from '@rockcarver/frodo-lib'; import { type CircleOfTrustSkeleton } from '@rockcarver/frodo-lib/types/api/CirclesOfTrustApi'; import { type CirclesOfTrustExportInterface } from '@rockcarver/frodo-lib/types/ops/CirclesOfTrustOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { createProgressIndicator, @@ -36,7 +37,7 @@ const { * @returns {string} a one-line description */ export function getOneLineDescription(cotObj: CircleOfTrustSkeleton): string { - const description = `[${cotObj._id['brightCyan']}]`; + const description = `[${c.cyanBright(cotObj._id)}]`; return description; } @@ -85,10 +86,10 @@ export async function listCirclesOfTrust( return true; } else { const table = createTable([ - 'Name'['brightCyan'], - 'Description'['brightCyan'], - 'Status'['brightCyan'], - 'Trusted Providers'['brightCyan'], + c.cyanBright('Name'), + c.cyanBright('Description'), + c.cyanBright('Status'), + c.cyanBright('Trusted Providers'), ]); cotList.forEach((cot) => { table.push([ diff --git a/src/ops/EmailTemplateOps.ts b/src/ops/EmailTemplateOps.ts index b27f9429c..b07fecfd6 100644 --- a/src/ops/EmailTemplateOps.ts +++ b/src/ops/EmailTemplateOps.ts @@ -2,6 +2,7 @@ import { frodo, FrodoError } from '@rockcarver/frodo-lib'; import { EmailTemplateSkeleton } from '@rockcarver/frodo-lib/types/ops/EmailTemplateOps'; import fs from 'fs'; import path from 'path'; +import c from 'tinyrainbow'; import { createProgressIndicator, @@ -55,7 +56,7 @@ function getFileDataTemplate() { export function getOneLineDescription( templateObj: EmailTemplateSkeleton ): string { - const description = `[${templateObj._id.split('/')[1]['brightCyan']}] ${ + const description = `[${c.cyanBright(templateObj._id.split('/')[1])}] ${ templateObj.displayName ? templateObj.displayName : '' } - ${ templateObj.defaultLocale @@ -123,12 +124,12 @@ export async function listEmailTemplates( } } else { const table = createTable([ - 'Id'['brightCyan'], - 'Name'['brightCyan'], - 'Status'['brightCyan'], - 'Locale(s)'['brightCyan'], - 'From'['brightCyan'], - 'Subject'['brightCyan'], + c.cyanBright('Id'), + c.cyanBright('Name'), + c.cyanBright('Status'), + c.cyanBright('Locale(s)'), + c.cyanBright('From'), + c.cyanBright('Subject'), ]); for (const emailTemplate of emailTemplates) { table.push([ @@ -138,8 +139,8 @@ export async function listEmailTemplates( `${emailTemplate.displayName ? emailTemplate.displayName : ''}`, // Status emailTemplate.enabled === false - ? 'disabled'['brightRed'] - : 'enabled'['brightGreen'], + ? c.redBright('disabled') + : c.greenBright('enabled'), // Locale(s) `${emailTemplate.defaultLocale}${ Object.keys(emailTemplate.subject).length > 1 @@ -190,7 +191,7 @@ export async function exportEmailTemplateToFile( saveJsonToFile(fileData, filePath, includeMeta); stopProgressIndicator( indicatorId, - `Exported ${templateId['brightCyan']} to ${filePath['brightCyan']}.` + `Exported ${c.cyanBright(templateId)} to ${c.cyanBright(filePath)}.` ); return true; } catch (error) { diff --git a/src/ops/IdpOps.ts b/src/ops/IdpOps.ts index aeab67c27..ca43dc090 100644 --- a/src/ops/IdpOps.ts +++ b/src/ops/IdpOps.ts @@ -2,6 +2,7 @@ import { frodo, FrodoError } from '@rockcarver/frodo-lib'; import { SocialIdpSkeleton } from '@rockcarver/frodo-lib/types/api/SocialIdentityProvidersApi'; import { type SocialIdentityProviderImportOptions } from '@rockcarver/frodo-lib/types/ops/IdpOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { createProgressIndicator, @@ -31,7 +32,7 @@ const { getFilePath, getWorkingDirectory } = frodo.utils; * @returns {string} a one-line description */ export function getOneLineDescription(socialIdpObj: SocialIdpSkeleton): string { - const description = `[${socialIdpObj._id['brightCyan']}] ${socialIdpObj._type._id}`; + const description = `[${c.cyanBright(socialIdpObj._id)}] ${socialIdpObj._type._id}`; return description; } @@ -107,7 +108,7 @@ export async function exportSocialIdentityProviderToFile( saveJsonToFile(fileData, filePath, includeMeta); stopProgressIndicator( indicatorId, - `Exported ${providerId['brightCyan']} to ${filePath['brightCyan']}.` + `Exported ${c.cyanBright(providerId)} to ${c.cyanBright(filePath)}.` ); debugMessage(`cli.IdpOps.exportSocialIdentityProviderToFile: end`); return true; diff --git a/src/ops/JourneyOps.ts b/src/ops/JourneyOps.ts index c4ae145f4..79595fbb6 100644 --- a/src/ops/JourneyOps.ts +++ b/src/ops/JourneyOps.ts @@ -11,6 +11,7 @@ import { type TreeImportOptions, } from '@rockcarver/frodo-lib/types/ops/JourneyOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { createProgressIndicator, @@ -116,20 +117,20 @@ export async function listJourneys(long: boolean = false): Promise { table.push([ `${treeExport.tree._id}`, treeExport.tree.enabled === false - ? 'disabled'['brightRed'] - : 'enabled'['brightGreen'], + ? c.redBright('disabled') + : c.greenBright('enabled'), treeExport.tree.innerTreeOnly - ? 'yes'['brightYellow'] - : 'no'['brightGreen'], + ? c.yellowBright('yes') + : c.greenBright('no'), treeExport.tree.mustRun - ? 'yes'['brightYellow'] - : 'no'['brightGreen'], + ? c.yellowBright('yes') + : c.greenBright('no'), treeExport.tree.noSession - ? 'yes'['brightYellow'] - : 'no'['brightGreen'], + ? c.yellowBright('yes') + : c.greenBright('no'), treeExport.tree.transactionalOnly - ? 'yes'['brightYellow'] - : 'no'['brightGreen'], + ? c.yellowBright('yes') + : c.greenBright('no'), treeExport.tree.identityResource ? treeExport.tree.identityResource : '', @@ -196,7 +197,7 @@ export async function exportJourneyToFile( saveJsonToFile(fileData, filePath, includeMeta); stopProgressIndicator( spinnerId, - `Exported ${journeyId['brightCyan']} to ${filePath['brightCyan']}.`, + `Exported ${c.cyanBright(journeyId)} to ${c.cyanBright(filePath)}.`, 'success' ); return true; @@ -572,7 +573,7 @@ export async function importJourneysFromFiles( * @returns {string} a one-line description */ export function getOneLineDescription(treeObj: TreeSkeleton): string { - const description = `[${treeObj._id['brightCyan']}]`; + const description = `[${c.cyanBright(treeObj._id)}]`; return description; } @@ -607,7 +608,7 @@ function describeTreeDescendents( .fill(' ') .join(''); const [tree] = Object.keys(descendents); - printMessage(`${indent}- ${tree['brightCyan']}`, 'data'); + printMessage(`${indent}- ${c.cyanBright(tree)}`, 'data'); for (const descendent of descendents[tree]) { describeTreeDescendents(descendent, depth + 1); } @@ -700,8 +701,8 @@ export async function describeJourney( printMessage( `\nStatus\n${ journeyData.tree.enabled === false - ? 'disabled'['brightRed'] - : 'enabled'['brightGreen'] + ? c.redBright('disabled') + : c.greenBright('enabled') }` ); @@ -709,18 +710,18 @@ export async function describeJourney( printMessage( `\nFlags\n- Inner Tree Only: ${ journeyData.tree.innerTreeOnly - ? 'true'['brightGreen'] - : 'false'['brightRed'] + ? c.greenBright('true') + : c.redBright('false') }\n- Must Run: ${ - journeyData.tree.mustRun ? 'true'['brightGreen'] : 'false'['brightRed'] + journeyData.tree.mustRun ? c.greenBright('true') : c.redBright('false') }\n- No Session: ${ journeyData.tree.noSession - ? 'true'['brightGreen'] - : 'false'['brightRed'] + ? c.greenBright('true') + : c.redBright('false') }\n- Transactional Only: ${ journeyData.tree.transactionalOnly - ? 'true'['brightGreen'] - : 'false'['brightRed'] + ? c.greenBright('true') + : c.redBright('false') }` ); @@ -754,7 +755,7 @@ export async function describeJourney( 'data' ); for (const [nodeType, count] of Object.entries(nodeTypeMap)) { - printMessage(`- ${String(count)} [${nodeType['brightCyan']}]`, 'data'); + printMessage(`- ${String(count)} [${c.cyanBright(nodeType)}]`, 'data'); } } diff --git a/src/ops/MappingOps.ts b/src/ops/MappingOps.ts index 12bf3b80a..e74c3f132 100644 --- a/src/ops/MappingOps.ts +++ b/src/ops/MappingOps.ts @@ -8,6 +8,7 @@ import { } from '@rockcarver/frodo-lib/types/ops/MappingOps'; import fs from 'fs'; import path from 'path'; +import c from 'tinyrainbow'; import { extractDataToFile, getExtractedJsonData } from '../utils/Config'; import { @@ -74,10 +75,10 @@ export async function listMappings(long: boolean = false): Promise { mapping.displayName, mapping.source, mapping.target, - mapping.consentRequired ? 'yes'['brightGreen'] : 'no'['brightRed'], + mapping.consentRequired ? c.greenBright('yes') : c.redBright('no'), isLegacyMapping(mapping._id) - ? 'yes'['brightGreen'] - : 'no'['brightRed'], + ? c.greenBright('yes') + : c.redBright('no'), ]); } printMessage(table.toString(), 'data'); diff --git a/src/ops/NodeOps.ts b/src/ops/NodeOps.ts index d79c76e5b..7fa969509 100644 --- a/src/ops/NodeOps.ts +++ b/src/ops/NodeOps.ts @@ -12,6 +12,7 @@ import { type CustomNodeImportOptions, } from '@rockcarver/frodo-lib/types/ops/NodeOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { extractDataToFile, getExtractedData } from '../utils/Config'; import { @@ -59,7 +60,7 @@ export function getOneLineDescription( nodeObj: NodeSkeleton, nodeRef?: NodeRefSkeletonInterface | InnerNodeRefSkeletonInterface ): string { - const description = `[${nodeObj._id['brightCyan']}] ${nodeObj._type._id}${ + const description = `[${c.cyanBright(nodeObj._id)}] ${nodeObj._type._id}${ nodeRef ? ' - ' + nodeRef?.displayName : '' }`; return description; @@ -138,11 +139,11 @@ export async function listCustomNodes(long: boolean = false): Promise { table.push([ wordwrap(node.displayName, 25, ' '), node._id, - numJourneys ? String(numJourneys)['brightGreen'] : '0'['brightRed'], - numInstances ? String(numInstances)['brightGreen'] : '0'['brightRed'], + numJourneys ? c.greenBright(String(numJourneys)) : c.redBright('0'), + numInstances ? c.greenBright(String(numInstances)) : c.redBright('0'), node.errorOutcome - ? 'enabled'['brightGreen'] - : 'disabled'['brightRed'], + ? c.greenBright('enabled') + : c.redBright('disabled'), wordwrap(node.description, 30), ]); } @@ -184,10 +185,10 @@ export async function describeCustomNode( return true; } const nodeTable = createKeyValueTable(); - nodeTable.push(['Id'['brightCyan'], node._id]); - nodeTable.push(['Service Name'['brightCyan'], node.serviceName]); - nodeTable.push(['Display Name'['brightCyan'], node.displayName]); - nodeTable.push(['Description'['brightCyan'], node.description]); + nodeTable.push([c.cyanBright('Id'), node._id]); + nodeTable.push([c.cyanBright('Service Name'), node.serviceName]); + nodeTable.push([c.cyanBright('Display Name'), node.displayName]); + nodeTable.push([c.cyanBright('Description'), node.description]); getTableRowsFromArray(nodeTable, 'Inputs', node.inputs); getTableRowsFromArray(nodeTable, 'Outputs', node.outputs); const outcomes = node.outcomes; @@ -203,17 +204,17 @@ export async function describeCustomNode( printMessage('\nProperties', 'data'); for (const [name, prop] of Object.entries(node.properties)) { const propTable = createKeyValueTable(); - propTable.push(['Name'['brightCyan'], name]); - propTable.push(['Title'['brightCyan'], prop.title]); - propTable.push(['Description'['brightCyan'], prop.description]); + propTable.push([c.cyanBright('Name'), name]); + propTable.push([c.cyanBright('Title'), prop.title]); + propTable.push([c.cyanBright('Description'), prop.description]); propTable.push([ - 'Required'['brightCyan'], - prop.required ? 'true'['brightGreen'] : 'false'['brightRed'], + c.cyanBright('Required'), + prop.required ? c.greenBright('true') : c.redBright('false'), ]); - propTable.push(['Type'['brightCyan'], prop.type]); + propTable.push([c.cyanBright('Type'), prop.type]); propTable.push([ - 'Multivalued'['brightCyan'], - prop.multivalued ? 'true'['brightGreen'] : 'false'['brightRed'], + c.cyanBright('Multivalued'), + prop.multivalued ? c.greenBright('true') : c.redBright('false'), ]); if (prop.defaultValue) { getTableRowsFromArray( diff --git a/src/ops/OAuth2ClientOps.ts b/src/ops/OAuth2ClientOps.ts index 7584716e4..2032cba96 100644 --- a/src/ops/OAuth2ClientOps.ts +++ b/src/ops/OAuth2ClientOps.ts @@ -6,6 +6,7 @@ import { type OAuth2ClientImportOptions, } from '@rockcarver/frodo-lib/types/ops/OAuth2ClientOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { createProgressIndicator, @@ -73,8 +74,8 @@ export async function listOAuth2Clients(long = false) { table.push([ client._id, client.coreOAuth2ClientConfig.status === 'Active' - ? 'Active'['brightGreen'] - : (client.coreOAuth2ClientConfig.status as string)['brightRed'], + ? c.greenBright('Active') + : (c.cyanBright(client.coreOAuth2ClientConfig.status) as string), client.coreOAuth2ClientConfig.clientType, (client.advancedOAuth2ClientConfig.grantTypes as Readable) .map((type) => grantTypesMap[type]) @@ -84,7 +85,7 @@ export async function listOAuth2Clients(long = false) { ), (client.coreOAuth2ClientConfig.redirectionUris as string[]).join( '\n' - ), + ) as any, // wordwrap(client.description, 30), ]); }); diff --git a/src/ops/PolicyOps.ts b/src/ops/PolicyOps.ts index f9bfa7714..97e82c767 100644 --- a/src/ops/PolicyOps.ts +++ b/src/ops/PolicyOps.ts @@ -6,6 +6,7 @@ import type { PolicyImportOptions, } from '@rockcarver/frodo-lib/types/ops/PolicyOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { createObjectTable, @@ -57,7 +58,7 @@ export async function listPolicies(long: boolean = false): Promise { table.push([ `${policy._id}`, `${policy.description}`, - policy.active ? 'active'['brightGreen'] : 'inactive'['brightRed'], + policy.active ? c.greenBright('active') : c.redBright('inactive'), ]); } printMessage(table.toString(), 'data'); @@ -93,7 +94,7 @@ export async function listPoliciesByPolicySet( table.push([ `${policy._id}`, `${policy.description}`, - policy.active ? 'active'['brightGreen'] : 'inactive'['brightRed'], + policy.active ? c.greenBright('active') : c.redBright('inactive'), ]); } printMessage(table.toString(), 'data'); diff --git a/src/ops/RealmOps.ts b/src/ops/RealmOps.ts index 173d19445..e39ada235 100644 --- a/src/ops/RealmOps.ts +++ b/src/ops/RealmOps.ts @@ -1,6 +1,7 @@ import { frodo, FrodoError } from '@rockcarver/frodo-lib'; import { RealmExportInterface } from '@rockcarver/frodo-lib/types/ops/RealmOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { createKeyValueTable, @@ -39,19 +40,19 @@ export async function listRealms(long = false) { const realms = await readRealms(); if (long) { const table = createTable([ - 'Id'['brightCyan'], - 'Name'['brightCyan'], - 'Status'['brightCyan'], - 'Custom Domains'['brightCyan'], - 'Parent Path'['brightCyan'], + c.cyanBright('Id'), + c.cyanBright('Name'), + c.cyanBright('Status'), + c.cyanBright('Custom Domains'), + c.cyanBright('Parent Path'), ]); realms.forEach((realmConfig) => { table.push([ realmConfig._id, realmConfig.name, realmConfig.active - ? 'active'['brightGreen'] - : 'inactive'['brightRed'], + ? c.greenBright('active') + : c.redBright('inactive'), realmConfig.aliases.join('\n'), realmConfig.parentPath, ]); @@ -338,17 +339,17 @@ export async function describeRealm(realm: string) { try { const realmConfig = await readRealmByName(realm); const table = createKeyValueTable(); - table.push(['Name'['brightCyan'], realmConfig.name]); + table.push([c.cyanBright('Name'), realmConfig.name]); table.push([ - 'Status'['brightCyan'], - realmConfig.active ? 'active'['brightGreen'] : 'inactive'['brightRed'], + c.cyanBright('Status'), + realmConfig.active ? c.greenBright('active') : c.redBright('inactive'), ]); table.push([ - 'Custom Domains'['brightCyan'], + c.cyanBright('Custom Domains'), realmConfig.aliases.join('\n'), ]); - table.push(['Parent'['brightCyan'], realmConfig.parentPath]); - table.push(['Id'['brightCyan'], realmConfig._id]); + table.push([c.cyanBright('Parent'), realmConfig.parentPath]); + table.push([c.cyanBright('Id'), realmConfig._id]); printMessage(table.toString(), 'data'); } catch { printMessage(`Realm ${realm} not found!`, 'error'); @@ -374,19 +375,19 @@ export async function addCustomDomain(realm: string, domain: string) { realmConfig.aliases.push(domain.toLowerCase()); realmConfig = await updateRealm(realmConfig._id, realmConfig); const table = createKeyValueTable(); - table.push(['Name'['brightCyan'], realmConfig.name]); + table.push([c.cyanBright('Name'), realmConfig.name]); table.push([ - 'Status'['brightCyan'], + c.cyanBright('Status'), realmConfig.active - ? 'active'['brightGreen'] - : 'inactive'['brightRed'], + ? c.greenBright('active') + : c.redBright('inactive'), ]); table.push([ - 'Custom Domains'['brightCyan'], + c.cyanBright('Custom Domains'), realmConfig.aliases.join('\n'), ]); - table.push(['Parent'['brightCyan'], realmConfig.parentPath]); - table.push(['Id'['brightCyan'], realmConfig._id]); + table.push([c.cyanBright('Parent'), realmConfig.parentPath]); + table.push([c.cyanBright('Id'), realmConfig._id]); printMessage(table.toString()); } catch (error) { printMessage(`Error adding custom domain: ${error.message}`, 'error'); @@ -413,19 +414,19 @@ export async function removeCustomDomain(realm: string, domain: string) { realmConfig.aliases = aliases; realmConfig = await updateRealm(realmConfig._id, realmConfig); const table = createKeyValueTable(); - table.push(['Name'['brightCyan'], realmConfig.name]); + table.push([c.cyanBright('Name'), realmConfig.name]); table.push([ - 'Status'['brightCyan'], + c.cyanBright('Status'), realmConfig.active - ? 'active'['brightGreen'] - : 'inactive'['brightRed'], + ? c.greenBright('active') + : c.redBright('inactive'), ]); table.push([ - 'Custom Domains'['brightCyan'], + c.cyanBright('Custom Domains'), realmConfig.aliases.join('\n'), ]); - table.push(['Parent'['brightCyan'], realmConfig.parentPath]); - table.push(['Id'['brightCyan'], realmConfig._id]); + table.push([c.cyanBright('Parent'), realmConfig.parentPath]); + table.push([c.cyanBright('Id'), realmConfig._id]); printMessage(table.toString()); } catch (error) { printMessage(`Error removing custom domain: ${error.message}`, 'error'); diff --git a/src/ops/Saml2Ops.ts b/src/ops/Saml2Ops.ts index f707f8c6e..81efc5585 100644 --- a/src/ops/Saml2Ops.ts +++ b/src/ops/Saml2Ops.ts @@ -6,6 +6,7 @@ import type { Saml2ExportInterface, } from '@rockcarver/frodo-lib/types/ops/Saml2Ops'; import fs from 'fs'; +import c from 'tinyrainbow'; import { createObjectTable, @@ -55,7 +56,7 @@ export function getOneLineDescription( roles.push(value); } } - const description = `[${saml2ProviderObj.entityId['brightCyan']}]${ + const description = `[${c.cyanBright(saml2ProviderObj.entityId)}]${ ' (' + saml2ProviderObj.entityLocation }${roles.length ? ' ' + roles.join(', ') + ')' : ')'}`; return description; @@ -108,9 +109,9 @@ export async function listSaml2Providers( return true; } else { const table = createTable([ - 'Entity Id'['brightCyan'], - 'Location'['brightCyan'], - 'Role(s)'['brightCyan'], + c.cyanBright('Entity Id'), + c.cyanBright('Location'), + c.cyanBright('Role(s)'), ]); for (const provider of providerList) { table.push([ @@ -182,7 +183,7 @@ export async function exportSaml2MetadataToFile( updateProgressIndicator(indicatorId, `Exported provider ${entityId}`); stopProgressIndicator( indicatorId, - `Exported ${entityId['brightCyan']} metadata to ${filePath['brightCyan']}.` + `Exported ${c.cyanBright(entityId)} metadata to ${c.cyanBright(filePath)}.` ); return true; } catch (error) { @@ -228,8 +229,7 @@ export async function exportSaml2ProviderToFile( updateProgressIndicator(indicatorId, `Exported provider ${entityId}`); stopProgressIndicator( indicatorId, - // @ts-expect-error - brightCyan colors the string, even though it is not a property of string - `Exported ${entityId.brightCyan} to ${filePath.brightCyan}.` + `Exported ${c.cyanBright(entityId)} to ${c.cyanBright(filePath)}.` ); debugMessage( `cli.Saml2Ops.exportSaml2ProviderToFile: end [entityId=${entityId}, file=${filePath}]` diff --git a/src/ops/ScriptOps.ts b/src/ops/ScriptOps.ts index 7428e58ba..3648a8fa4 100644 --- a/src/ops/ScriptOps.ts +++ b/src/ops/ScriptOps.ts @@ -8,6 +8,7 @@ import { } from '@rockcarver/frodo-lib/types/ops/ScriptOps'; import chokidar from 'chokidar'; import fs from 'fs'; +import c from 'tinyrainbow'; import { extractDataToFile, @@ -145,7 +146,7 @@ function filterTypedScriptExport( * @returns {string} a one-line description */ export function getOneLineDescription(scriptObj: ScriptSkeleton): string { - const description = `[${scriptObj._id['brightCyan']}] ${scriptObj.context} - ${scriptObj.name}`; + const description = `[${c.cyanBright(scriptObj._id)}] ${scriptObj.context} - ${scriptObj.name}`; return description; } @@ -247,8 +248,8 @@ export async function listScripts( ); values.push( locations.length > 0 - ? `${'yes'['brightGreen']} (${locations.length === 1 ? `at` : `${locations.length} uses, including:`} ${locations[0]})` - : 'no'['brightRed'] + ? `${c.greenBright('yes')} (${locations.length === 1 ? `at` : `${locations.length} uses, including:`} ${locations[0]})` + : c.redBright('no') ); } table.push(values); @@ -301,29 +302,29 @@ export async function describeScript( printMessage(script, 'data'); } else { const table = createKeyValueTable(); - table.push(['Id'['brightCyan'], script._id]); - table.push(['Name'['brightCyan'], script.name]); - table.push(['Language'['brightCyan'], langMap[script.language]]); + table.push([c.cyanBright('Id'), script._id]); + table.push([c.cyanBright('Name'), script.name]); + table.push([c.cyanBright('Language'), langMap[script.language]]); table.push([ - 'Context'['brightCyan'], + c.cyanBright('Context'), titleCase(script.context.split('_').join(' ')), ]); - table.push(['Description'['brightCyan'], script.description]); + table.push([c.cyanBright('Description'), script.description]); table.push([ - 'Default'['brightCyan'], - script.default ? 'true'['brightGreen'] : 'false'['brightRed'], + c.cyanBright('Default'), + script.default ? c.greenBright('true') : c.redBright('false'), ]); - table.push(['Evaluator Version'['brightCyan'], script.evaluatorVersion]); + table.push([c.cyanBright('Evaluator Version'), script.evaluatorVersion]); const scriptWrapLength = 80; const wrapRegex = new RegExp(`.{1,${scriptWrapLength + 1}}`, 'g'); const scriptParts = script.script.match(wrapRegex); - table.push(['Script (Base 64)'['brightCyan'], scriptParts[0]]); + table.push([c.cyanBright('Script (Base 64)'), scriptParts[0]]); for (let i = 1; i < scriptParts.length; i++) { table.push(['', scriptParts[i]]); } if (usage) { table.push([ - `Usage Locations (${script.locations.length} total)`['brightCyan'], + c.cyanBright(`Usage Locations (${script.locations.length} total)`), script.locations.length > 0 ? script.locations[0] : '', ]); for (let i = 1; i < script.locations.length; i++) { diff --git a/src/ops/SecretStoreOps.ts b/src/ops/SecretStoreOps.ts index 1cf6ea6ca..37b2c12e2 100644 --- a/src/ops/SecretStoreOps.ts +++ b/src/ops/SecretStoreOps.ts @@ -1,6 +1,7 @@ import { frodo, FrodoError, state } from '@rockcarver/frodo-lib'; import { SecretStoreMappingSkeleton } from '@rockcarver/frodo-lib/types/api/SecretStoreApi'; import fs from 'fs'; +import c from 'tinyrainbow'; import { createKeyValueTable, @@ -65,7 +66,7 @@ export async function listSecretStores( store._type.name, mappings ? mappings.map((m) => m.secretId).join('\n') - : 'N/A'['brightRed'], + : c.redBright('N/A'), ]); } printMessage(table.toString(), 'data'); @@ -142,8 +143,8 @@ export async function listSecretStoreMappingAliases( alias, // The first one is always active active && !(active = false) - ? 'true'['brightGreen'] - : 'false'['brightRed'], + ? c.greenBright('true') + : c.redBright('false'), ]); } printMessage(table.toString(), 'data'); @@ -179,13 +180,13 @@ export async function describeSecretStore( secretStoreTypeId = secretStore._type._id || secretStoreTypeId; const schema = await readSecretStoreSchema(secretStoreTypeId, global); const table = createKeyValueTable(); - table.push(['Id'['brightCyan'], secretStoreId]); - table.push(['Type'['brightCyan'], secretStoreTypeId]); + table.push([c.cyanBright('Id'), secretStoreId]); + table.push([c.cyanBright('Type'), secretStoreTypeId]); for (const [key, info] of Object.entries(schema.properties).sort( // This sorts the properties in ascending order (see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#parameters) (p1, p2) => p1[1].propertyOrder - p2[1].propertyOrder )) { - table.push([`${info.title}`['brightCyan'], secretStore[key]]); + table.push([c.cyanBright(info.title) as any, secretStore[key]]); } printMessage(table.toString(), 'data'); if (!canSecretStoreHaveMappings(secretStoreTypeId)) return true; diff --git a/src/ops/ThemeOps.ts b/src/ops/ThemeOps.ts index 846113b69..9dc1f780f 100644 --- a/src/ops/ThemeOps.ts +++ b/src/ops/ThemeOps.ts @@ -4,6 +4,7 @@ import { type ThemeSkeleton, } from '@rockcarver/frodo-lib/types/ops/ThemeOps'; import * as fs from 'fs'; +import c from 'tinyrainbow'; import { v4 as uuidv4 } from 'uuid'; import { @@ -42,9 +43,9 @@ const { * @returns {string} a one-line description */ export function getOneLineDescription(themeObj: ThemeSkeleton): string { - const description = `[${themeObj._id['brightCyan']}] ${themeObj.name}${ + const description = `[${c.cyanBright(themeObj._id)}] ${themeObj.name}${ themeObj.linkedTrees - ? ' (' + themeObj.linkedTrees.join(', ')['brightCyan'] + ')' + ? ' (' + c.cyanBright(themeObj.linkedTrees.join(', ')) + ')' : '' }`; return description; @@ -85,21 +86,21 @@ export async function listThemes(long: boolean = false): Promise { if (!long) { themeList.forEach((theme) => { printMessage( - `${theme.isDefault ? theme.name['brightCyan'] : theme.name}`, + `${theme.isDefault ? c.cyanBright(theme.name) : theme.name}`, 'data' ); }); } else { const table = createTable([ - 'Name'['brightCyan'], - 'Id'['brightCyan'], - 'Default'['brightCyan'], + c.cyanBright('Name'), + c.cyanBright('Id'), + c.cyanBright('Default'), ]); themeList.forEach((theme) => { table.push([ `${theme.name}`, `${theme._id}`, - `${theme.isDefault ? 'Yes'['brightGreen'] : ''}`, + `${theme.isDefault ? c.greenBright('Yes') : ''}`, ]); }); printMessage(table.toString(), 'data'); diff --git a/src/ops/cloud/AdminFederationOps.ts b/src/ops/cloud/AdminFederationOps.ts index 550154daa..1d2c77d0e 100644 --- a/src/ops/cloud/AdminFederationOps.ts +++ b/src/ops/cloud/AdminFederationOps.ts @@ -1,5 +1,6 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; +import c from 'tinyrainbow'; import { createProgressIndicator, @@ -70,7 +71,7 @@ export async function exportAdminFederationProviderToFile( saveJsonToFile(fileData, filePath, includeMeta); stopProgressIndicator( indicatorId, - `Exported ${providerId['brightCyan']} to ${filePath['brightCyan']}.` + `Exported ${c.cyanBright(providerId)} to ${c.cyanBright(filePath)}.` ); outcome = true; } catch (err) { diff --git a/src/ops/cloud/SecretsOps.ts b/src/ops/cloud/SecretsOps.ts index 6792abc25..64a91ef50 100644 --- a/src/ops/cloud/SecretsOps.ts +++ b/src/ops/cloud/SecretsOps.ts @@ -6,6 +6,7 @@ import { } from '@rockcarver/frodo-lib/types/api/cloud/SecretsApi'; import { SecretsExportInterface } from '@rockcarver/frodo-lib/types/ops/cloud/SecretsOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { getFullExportConfig, getIdLocations } from '../../utils/Config'; import { @@ -85,15 +86,15 @@ export async function listSecrets( let fullExport = null; const headers = long ? [ - 'Id'['brightCyan'], - { hAlign: 'right', content: 'Active\nVersion'['brightCyan'] }, - { hAlign: 'right', content: 'Loaded\nVersion'['brightCyan'] }, - 'Status'['brightCyan'], - 'Description'['brightCyan'], - 'Modifier'['brightCyan'], - 'Modified (UTC)'['brightCyan'], + c.cyanBright('Id'), + { hAlign: 'right', content: c.cyanBright('Active\nVersion') }, + { hAlign: 'right', content: c.cyanBright('Loaded\nVersion') }, + c.cyanBright('Status'), + c.cyanBright('Description'), + c.cyanBright('Modifier'), + c.cyanBright('Modified (UTC)'), ] - : ['Id'['brightCyan']]; + : [c.cyanBright('Id')]; if (usage) { try { fullExport = await getFullExportConfig(file); @@ -103,7 +104,7 @@ export async function listSecrets( } //Delete secrets from full export so they aren't mistakenly used for determining usage delete fullExport.global.secret; - headers.push('Used'['brightCyan']); + headers.push(c.cyanBright('Used')); } const table = createTable(headers); for (const secret of secrets) { @@ -122,7 +123,9 @@ export async function listSecrets( secret._id, { hAlign: 'right', content: secret.activeVersion }, { hAlign: 'right', content: secret.loadedVersion }, - secret.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'], + secret.loaded + ? (c.greenBright('loaded') as any) + : (c.redBright('unloaded') as any), wordwrap(secret.description, 40), lastChangedBy, new Date(secret.lastChangeDate).toUTCString(), @@ -132,8 +135,8 @@ export async function listSecrets( const locations = getIdLocations(fullExport, secret._id, true); values.push( locations.length > 0 - ? `${'yes'['brightGreen']} (${locations.length === 1 ? `at` : `${locations.length} uses, including:`} ${locations[0]})` - : 'no'['brightRed'] + ? `${c.greenBright('yes')} (${locations.length === 1 ? `at` : `${locations.length} uses, including:`} ${locations[0]})` + : c.redBright('no') ); } table.push(values); @@ -344,21 +347,21 @@ export async function listSecretVersions( return true; } const table = createTable([ - { hAlign: 'right', content: 'Version'['brightCyan'] }, - 'Status'['brightCyan'], - 'Loaded'['brightCyan'], - 'Created'['brightCyan'], + { hAlign: 'right', content: c.cyanBright('Version') }, + c.cyanBright('Status'), + c.cyanBright('Loaded'), + c.cyanBright('Created'), ]); const statusMap = { - ENABLED: 'active'['brightGreen'], - DISABLED: 'inactive'['brightRed'], - DESTROYED: 'deleted'['brightRed'], + ENABLED: c.greenBright('active'), + DISABLED: c.redBright('inactive'), + DESTROYED: c.redBright('deleted'), }; for (const version of versions) { table.push([ { hAlign: 'right', content: version.version }, statusMap[version.status], - version.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'], + version.loaded ? c.greenBright('loaded') : c.redBright('unloaded'), new Date(version.createDate).toLocaleString(), ]); } @@ -404,19 +407,19 @@ export async function describeSecret( printMessage(secret, 'data'); } else { const table = createKeyValueTable(); - table.push(['Name'['brightCyan'], secret._id]); - table.push(['Active Version'['brightCyan'], secret.activeVersion]); - table.push(['Loaded Version'['brightCyan'], secret.loadedVersion]); + table.push([c.cyanBright('Name'), secret._id]); + table.push([c.cyanBright('Active Version'), secret.activeVersion]); + table.push([c.cyanBright('Loaded Version'), secret.loadedVersion]); table.push([ - 'Status'['brightCyan'], - secret.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'], + c.cyanBright('Status'), + secret.loaded ? c.greenBright('loaded') : c.redBright('unloaded'), ]); table.push([ - 'Description'['brightCyan'], + c.cyanBright('Description'), wordwrap(secret.description, 60), ]); table.push([ - 'Modified'['brightCyan'], + c.cyanBright('Modified'), new Date(secret.lastChangeDate).toLocaleString(), ]); let lastChangedBy = secret.lastChangedBy; @@ -427,16 +430,16 @@ export async function describeSecret( } catch { // ignore } - table.push(['Modifier'['brightCyan'], lastChangedBy]); - table.push(['Modifier UUID'['brightCyan'], secret.lastChangedBy]); - table.push(['Encoding'['brightCyan'], secret.encoding]); + table.push([c.cyanBright('Modifier'), lastChangedBy]); + table.push([c.cyanBright('Modifier UUID'), secret.lastChangedBy]); + table.push([c.cyanBright('Encoding'), secret.encoding]); table.push([ - 'Use In Placeholders'['brightCyan'], + c.cyanBright('Use In Placeholders'), secret.useInPlaceholders, ]); if (usage) { table.push([ - `Usage Locations (${secret.locations.length} total)`['brightCyan'], + c.cyanBright(`Usage Locations (${secret.locations.length} total)`), secret.locations.length > 0 ? secret.locations[0] : '', ]); for (let i = 1; i < secret.locations.length; i++) { @@ -497,7 +500,7 @@ export async function exportSecretToFile( ); stopProgressIndicator( spinnerId, - `Exported ${secretId['brightCyan']} to ${filePath['brightCyan']}.`, + `Exported ${c.cyanBright(secretId)} to ${c.cyanBright(filePath)}.`, 'success' ); debugMessage( diff --git a/src/ops/cloud/VariablesOps.ts b/src/ops/cloud/VariablesOps.ts index f58597e7a..389066a32 100644 --- a/src/ops/cloud/VariablesOps.ts +++ b/src/ops/cloud/VariablesOps.ts @@ -5,6 +5,7 @@ import { } from '@rockcarver/frodo-lib/types/api/cloud/VariablesApi'; import { VariablesExportInterface } from '@rockcarver/frodo-lib/types/ops/cloud/VariablesOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { getFullExportConfig, getIdLocations } from '../../utils/Config'; import { @@ -83,14 +84,14 @@ export async function listVariables( let fullExport = null; const headers = long ? [ - 'Id'['brightCyan'], - 'Value'['brightCyan'], - 'Status'['brightCyan'], - 'Description'['brightCyan'], - 'Modifier'['brightCyan'], - 'Modified (UTC)'['brightCyan'], + c.cyanBright('Id'), + c.cyanBright('Value'), + c.cyanBright('Status'), + c.cyanBright('Description'), + c.cyanBright('Modifier'), + c.cyanBright('Modified (UTC)'), ] - : ['Id'['brightCyan']]; + : [c.cyanBright('Id')]; if (usage) { try { fullExport = await getFullExportConfig(file); @@ -101,7 +102,7 @@ export async function listVariables( } //Delete variables from full export so they aren't mistakenly used for determining usage delete fullExport.global.variable; - headers.push('Used'['brightCyan']); + headers.push(c.cyanBright('Used')); } const table = createTable(headers); for (const variable of variables) { @@ -114,7 +115,7 @@ export async function listVariables( : variable.value, 40 ), - variable.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'], + variable.loaded ? c.greenBright('loaded') : c.redBright('unloaded'), wordwrap(variable.description, 40), state.getUseBearerTokenForAmApis() ? variable.lastChangedBy @@ -126,8 +127,8 @@ export async function listVariables( const locations = getIdLocations(fullExport, variable._id, true); values.push( locations.length > 0 - ? `${'yes'['brightGreen']} (${locations.length === 1 ? `at` : `${locations.length} uses, including:`} ${locations[0]})` - : 'no'['brightRed'] + ? `${c.greenBright('yes')} (${locations.length === 1 ? `at` : `${locations.length} uses, including:`} ${locations[0]})` + : c.redBright('no') ); } table.push(values); @@ -343,9 +344,9 @@ export async function describeVariable( printMessage(variable, 'data'); } else { const table = createKeyValueTable(); - table.push(['Name'['brightCyan'], variable._id]); + table.push([c.cyanBright('Name'), variable._id]); table.push([ - 'Value'['brightCyan'], + c.cyanBright('Value'), wordwrap( variable.valueBase64 ? decodeBase64(variable.valueBase64) @@ -353,17 +354,17 @@ export async function describeVariable( 40 ), ]); - table.push(['Type'['brightCyan'], variable.expressionType]); + table.push([c.cyanBright('Type'), variable.expressionType]); table.push([ - 'Status'['brightCyan'], - variable.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'], + c.cyanBright('Status'), + variable.loaded ? c.greenBright('loaded') : c.redBright('unloaded'), ]); table.push([ - 'Description'['brightCyan'], + c.cyanBright('Description'), wordwrap(variable.description, 60), ]); table.push([ - 'Modified'['brightCyan'], + c.cyanBright('Modified'), new Date(variable.lastChangeDate).toLocaleString(), ]); let modifierName: string; @@ -373,12 +374,12 @@ export async function describeVariable( // ignore } if (modifierName && modifierName !== variable.lastChangedBy) { - table.push(['Modifier'['brightCyan'], modifierName]); + table.push([c.cyanBright('Modifier'), modifierName]); } - table.push(['Modifier UUID'['brightCyan'], variable.lastChangedBy]); + table.push([c.cyanBright('Modifier UUID'), variable.lastChangedBy]); if (usage) { table.push([ - `Usage Locations (${variable.locations.length} total)`['brightCyan'], + c.cyanBright(`Usage Locations (${variable.locations.length} total)`), variable.locations.length > 0 ? variable.locations[0] : '', ]); for (let i = 1; i < variable.locations.length; i++) { @@ -436,13 +437,13 @@ export async function exportVariableToFile( updateProgressIndicator(indicatorId, `Exported variable ${variableId}`); stopProgressIndicator( indicatorId, - `Exported ${variableId['brightCyan']} to ${filePath['brightCyan']}.` + `Exported ${c.cyanBright(variableId)} to ${c.cyanBright(filePath)}.` ); return true; } catch (error) { stopProgressIndicator( indicatorId, - `Error exporting variable ${variableId['brightCyan']} to ${filePath['brightCyan']}`, + `Error exporting variable ${c.cyanBright(variableId)} to ${c.cyanBright(filePath)}`, 'fail' ); printError(error); @@ -496,7 +497,7 @@ export async function exportVariablesToFile( } catch { stopProgressIndicator( spinnerId, - `Error exporting variables to ${getFilePath(file)['brightCyan']}`, + `Error exporting variables to ${c.cyanBright(getFilePath(file))}`, 'fail' ); } diff --git a/src/ops/cloud/iga/IgaWorkflowOps.ts b/src/ops/cloud/iga/IgaWorkflowOps.ts index 29a03ec6f..e62c89d93 100644 --- a/src/ops/cloud/iga/IgaWorkflowOps.ts +++ b/src/ops/cloud/iga/IgaWorkflowOps.ts @@ -11,6 +11,7 @@ import { WorkflowImportOptions, } from '@rockcarver/frodo-lib/types/ops/cloud/iga/IgaWorkflowOps'; import fs from 'fs'; +import c from 'tinyrainbow'; import { extractDataToFile, getExtractedData } from '../../../utils/Config'; import { @@ -68,9 +69,9 @@ export async function listWorkflows(long: boolean = false): Promise { table.push([ `${workflow.id}`, workflow.name, - workflowGroup.draft ? 'true'['brightGreen'] : 'false'['brightRed'], - workflowGroup.published ? 'true'['brightGreen'] : 'false'['brightRed'], - workflow.mutable ? 'true'['brightGreen'] : 'false'['brightRed'], + workflowGroup.draft ? c.greenBright('true') : c.redBright('false'), + workflowGroup.published ? c.greenBright('true') : c.redBright('false'), + workflow.mutable ? c.greenBright('true') : c.redBright('false'), ]); } printMessage(table.toString(), 'data'); @@ -116,19 +117,19 @@ export async function describeWorkflow( 'data' ); const table = createKeyValueTable(); - table.push(['Id'['brightCyan'], workflow.id]); - table.push(['Name'['brightCyan'], workflow.name]); - table.push(['Display Name'['brightCyan'], workflow.displayName]); - table.push(['Description'['brightCyan'], workflow.description]); - if (workflow.type) table.push(['Type'['brightCyan'], workflow.type]); - table.push(['Status'['brightCyan'], workflow.status]); + table.push([c.cyanBright('Id'), workflow.id]); + table.push([c.cyanBright('Name'), workflow.name]); + table.push([c.cyanBright('Display Name'), workflow.displayName]); + table.push([c.cyanBright('Description'), workflow.description]); + if (workflow.type) table.push([c.cyanBright('Type'), workflow.type]); + table.push([c.cyanBright('Status'), workflow.status]); table.push([ - 'Mutable'['brightCyan'], - workflow.mutable ? 'true'['brightGreen'] : 'false'['brightRed'], + c.cyanBright('Mutable'), + workflow.mutable ? c.greenBright('true') : c.redBright('false'), ]); table.push([ - 'ChildType'['brightCyan'], - workflow.childType ? 'true'['brightGreen'] : 'false'['brightRed'], + c.cyanBright('ChildType'), + workflow.childType ? c.greenBright('true') : c.redBright('false'), ]); getTableRowsFromArray( table, @@ -159,10 +160,7 @@ export async function describeWorkflow( 'data' ); for (const eventData of Object.values(workflowExport.event)) { - printMessage( - `- [${eventData.id['brightCyan']}] ${eventData.name}`, - 'data' - ); + printMessage(`- [${eventData.id}] ${eventData.name}`, 'data'); } } // Request Forms @@ -174,10 +172,7 @@ export async function describeWorkflow( 'data' ); for (const formData of Object.values(workflowExport.requestForm)) { - printMessage( - `- [${formData.id['brightCyan']}] ${formData.name}`, - 'data' - ); + printMessage(`- [${formData.id}] ${formData.name}`, 'data'); } } // Request Types @@ -189,10 +184,7 @@ export async function describeWorkflow( 'data' ); for (const typeData of Object.values(workflowExport.requestType)) { - printMessage( - `- [${typeData.id['brightCyan']}] ${typeData.displayName}`, - 'data' - ); + printMessage(`- [${typeData.id}] ${typeData.displayName}`, 'data'); } } return true; diff --git a/src/utils/Console.ts b/src/utils/Console.ts index 0f0b83e50..14903c039 100644 --- a/src/utils/Console.ts +++ b/src/utils/Console.ts @@ -5,12 +5,10 @@ import { ProgressIndicatorType, } from '@rockcarver/frodo-lib/types/utils/Console'; import Table, { Table as TableType } from 'cli-table3'; -import Color from 'colors'; import { stderr as logUpdateStderr } from 'log-update'; import c from 'tinyrainbow'; import { v4 as uuidv4 } from 'uuid'; -Color.enable(); const arcSpinner = { frames: ['◜', '◠', '◝', '◞', '◡', '◟'], }; @@ -35,7 +33,11 @@ function data(message: string | object, newline = true) { } appendTextToFile(message, state.getOutputFile()); } else if (typeof message === 'object') { - console.dir(message, { depth: 10, maxArrayLength: null }); + console.dir(message, { + depth: 10, + maxArrayLength: null, + colors: process.env.NO_COLOR === undefined, + }); } else if (newline) { console.log(message); } else { @@ -59,7 +61,7 @@ function text(message: string | object, newline = true) { } /** - * Output a message in bright cyan to stderr + * Output a message in cyan to stderr * @param {Object} message the message */ function info(message: string | object, newline = true) { @@ -67,9 +69,9 @@ function info(message: string | object, newline = true) { if (typeof message === 'object') { console.dir(message, { depth: 3 }); } else if (newline) { - console.error(message['brightCyan']); + console.error(c.cyanBright(message)); } else { - process.stderr.write(message['brightCyan']); + process.stderr.write(c.cyanBright(message)); } } @@ -82,14 +84,14 @@ function warn(message: string | object, newline = true) { if (typeof message === 'object') { console.dir(message, { depth: 3 }); } else if (newline) { - console.error(message['yellow']); + console.error(c.yellowBright(message)); } else { - process.stderr.write(message['yellow']); + process.stderr.write(c.yellowBright(message)); } } /** - * Output a message in bright red to stderr + * Output a message in red to stderr * @param {Object} message the message */ function error(message: string | object, newline = true) { @@ -97,9 +99,9 @@ function error(message: string | object, newline = true) { if (typeof message === 'object') { console.dir(message, { depth: 3 }); } else if (newline) { - console.error(message['brightRed']); + console.error(c.redBright(message)); } else { - process.stderr.write(message['brightRed']); + process.stderr.write(c.redBright(message)); } } @@ -112,9 +114,9 @@ function debug(message: string | object, newline = true) { if (typeof message === 'object') { console.dir(message, { depth: 6 }); } else if (newline) { - console.error(message['brightMagenta']); + console.error(c.magentaBright(message)); } else { - process.stderr.write(message['brightMagenta']); + process.stderr.write(c.magentaBright(message)); } } @@ -124,7 +126,7 @@ function debug(message: string | object, newline = true) { */ function curlirize(message: string) { if (!message) return; - printMessage(message['brightBlue']); + c.cyanBright(printMessage(message)); } /** @@ -259,14 +261,14 @@ function renderProgressIndicators() { const filledBar = '█'.repeat(filledWidth); const emptyBar = '░'.repeat(emptyWidth); - const bar = c.cyan(`[${filledBar}${emptyBar}]`); + const bar = c.cyanBright(`[${filledBar}${emptyBar}]`); const stats = c.dim(`${percent}% | ${ind.current}/${ind.total}`); const msg = ind.message ? ` ${ind.message}` : ''; lines.push(`${bar} ${stats}${msg}`); } else { const frame = ind.spinner.frames[ind.frame % ind.spinner.frames.length]; - const spinnerIcon = c.cyan(frame); + const spinnerIcon = c.cyanBright(frame); const msg = ind.message ? ` ${ind.message}` : ''; lines.push(`${spinnerIcon}${msg}`); @@ -403,19 +405,19 @@ export function stopProgressIndicator( switch (status) { case 'success': statusIcon = '✔'; - colorFn = c.green; + colorFn = c.greenBright; break; case 'warn': statusIcon = '⚠'; - colorFn = c.yellow; + colorFn = c.yellowBright; break; case 'fail': statusIcon = '✖'; - colorFn = c.red; + colorFn = c.redBright; break; default: statusIcon = '•'; - colorFn = c.white; + colorFn = c.whiteBright; } const finalMsg = message || ind.message; if (finalMsg) { @@ -452,7 +454,7 @@ export function cleanupProgressIndicators() { */ export function createTable(head) { const table = new Table({ - head, + head: head.map((h) => (typeof h === 'string' ? c.cyanBright(h) : h)), chars: { top: '', 'top-mid': '', @@ -468,8 +470,9 @@ export function createTable(head) { 'mid-mid': '', right: '', 'right-mid': '', + middle: c.gray('│'), }, - style: { 'padding-left': 0, 'padding-right': 0, head: ['brightCyan'] }, + style: { 'padding-left': 0, 'padding-right': 0, head: [], border: [] }, }); return table; } @@ -495,8 +498,9 @@ export function createKeyValueTable() { 'mid-mid': '', right: '', 'right-mid': '', + middle: c.gray('│'), }, - style: { 'padding-left': 0, 'padding-right': 0 }, + style: { 'padding-left': 0, 'padding-right': 0, head: [], border: [] }, wordWrap: true, }); return table; @@ -546,14 +550,14 @@ function addRows(object, depth, level, table, keyMap) { if (Object(object[key]) !== object[key]) { if (level === 1) { table.push([ - keyMap[key] ? keyMap[key].brightCyan : key['brightCyan'], + keyMap[key] ? c.cyanBright(keyMap[key]) : c.cyanBright(key), object[key], ]); } else { table.push([ { hAlign: 'right', - content: keyMap[key] ? keyMap[key].gray : key.gray, + content: keyMap[key] ? c.gray(keyMap[key]) : c.gray(key), }, object[key], ]); @@ -568,7 +572,7 @@ function addRows(object, depth, level, table, keyMap) { if (level < 3) indention = `\n${indention}`; table.push([ indention.concat( - keyMap[key] ? keyMap[key].brightCyan : key['brightCyan'] + keyMap[key] ? c.cyanBright(keyMap[key]) : c.cyanBright(key) ), '', ]); @@ -608,8 +612,9 @@ export function createObjectTable(object, keyMap = {}) { 'mid-mid': '', right: '', 'right-mid': '', + middle: c.gray('│'), }, - style: { 'padding-left': 0, 'padding-right': 0, head: ['brightCyan'] }, + style: { 'padding-left': 0, 'padding-right': 0, head: [], border: [] }, }); addRows(object, depth, level + 1, table, keyMap); return table; @@ -626,7 +631,7 @@ export function getTableRowsFromArray( rowName: string, array: string[] ): void { - table.push([rowName['brightCyan'], array.length > 0 ? array[0] : '']); + table.push([c.cyanBright(rowName), array.length > 0 ? array[0] : '']); for (let i = 1; i < array.length; ++i) { table.push(['', array[i]]); } diff --git a/test/client_cli/en/__snapshots__/config-manager-export-iga-workflows.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-export-iga-workflows.test.js.snap new file mode 100644 index 000000000..eb6bc97db --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-export-iga-workflows.test.js.snap @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager pull iga-workflows' should be expected english 1`] = ` +"Usage: frodo config-manager pull iga-workflows [options] [host] [realm] [username] [password] + +[Experimental] Export iga-workflows. + +Arguments: + host AM base URL, e.g.: https://cdk.iam.example.com/am. + To use a connection profile, just specify a unique + substring or alias. + realm Realm. Specify realm as '/' for the root realm or + 'realm' or '/parent/child' otherwise. (default: + "alpha" for Identity Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication + journeys/trees. + password Password. + +Deployment: Cloud-only + +Options: + -i, --include-immutable Include immutable IGA workflows. + -n, --name Workflow name. Only export the workflow with this + name. + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and + usage examples. +" +`; diff --git a/test/client_cli/en/__snapshots__/config-manager-push-restart.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-restart.test.js.snap new file mode 100644 index 000000000..c551d2cf5 --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-restart.test.js.snap @@ -0,0 +1,30 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push restart' should be expected english 1`] = ` +"Usage: frodo config-manager push restart [options] [host] [realm] [username] [password] + +[Experimental] Restart the environment. + +Arguments: + host AM base URL, e.g.: https://cdk.iam.example.com/am. To use a + connection profile, just specify a unique substring or + alias. + realm Realm. Specify realm as '/' for the root realm or 'realm' or + '/parent/child' otherwise. (default: "alpha" for Identity + Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication journeys/trees. + password Password. + +Deployment: Cloud-only + +Options: + -c, --check Only restart if ESVs need loading. + -s, --status Check restart status only. + -w, --wait Wait for restart to complete. + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and usage + examples. +" +`; diff --git a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap index 0859f8741..196e83414 100644 --- a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap @@ -40,6 +40,7 @@ Commands: (Cloud-only): csp [Experimental] Import content security policy. + restart [Experimental] Restart the environment. secret-mappings [Experimental] Import secret mappings. " `; diff --git a/test/client_cli/en/config-manager-export-iga-workflows.test.js b/test/client_cli/en/config-manager-export-iga-workflows.test.js new file mode 100644 index 000000000..3775754b7 --- /dev/null +++ b/test/client_cli/en/config-manager-export-iga-workflows.test.js @@ -0,0 +1,10 @@ +import cp from 'child_process'; +import { promisify } from 'util'; + +const exec = promisify(cp.exec); +const CMD = 'frodo config-manager pull iga-workflows --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager pull iga-workflows' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); diff --git a/test/client_cli/en/config-manager-push-restart.test.js b/test/client_cli/en/config-manager-push-restart.test.js new file mode 100644 index 000000000..bea065651 --- /dev/null +++ b/test/client_cli/en/config-manager-push-restart.test.js @@ -0,0 +1,10 @@ +import cp from 'child_process'; +import { promisify } from 'util'; + +const exec = promisify(cp.exec); +const CMD = 'frodo config-manager push restart --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push restart' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); \ No newline at end of file diff --git a/test/e2e/__snapshots__/config-manager-export-iga-workflows.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-export-iga-workflows.e2e.test.js.snap new file mode 100644 index 000000000..ca544d578 --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-export-iga-workflows.e2e.test.js.snap @@ -0,0 +1,34129 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows --name BasicApplicationGrant -D igaTestDir05": should fail because the non-mutable workflow is not found without -i" 1`] = ` +"Experimental feature in use: 'frodo config-manager pull iga-workflows'. This feature may change without notice. +Error exporting iga-workflows to files +Workflow BasicApplicationGrant not found +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows --name BasicApplicationGrant -D igaTestDir05": should fail because the non-mutable workflow is not found without -i" 2`] = `1`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style" 1`] = `0`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style" 2`] = `""`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style" 3`] = ` +"Experimental feature in use: 'frodo config-manager pull iga-workflows'. This feature may change without notice. +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicApplicationGrant-copy/BasicApplicationGrant-copy.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "BasicApplicationGrant-copy", + "displayName": "BasicApplicationGrant-copy", + "id": "basicApplicationGrantCopy", + "mutable": true, + "name": "BasicApplicationGrant-copy", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 942, + "y": 82, + }, + "startNode": { + "connections": { + "start": "scriptTask-4e9121fe850a", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 683, + "y": 154, + }, + "exclusiveGateway-621c9996676a": { + "x": 454, + "y": 88.015625, + }, + "scriptTask-4e9121fe850a": { + "x": 168, + "y": 140.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicApplicationGrant-copy/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": null, + }, + { + "condition": null, + "outcome": "REJECT", + "step": null, + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicApplicationGrant-copy/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicApplicationGrant-copy/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-621c9996676a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "approvalTask-74cf85c35437", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-621c9996676a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicApplicationGrant-copy/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.js 1`] = ` +"try { +var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +} catch (e) { + logger.error(e.message) +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicApplicationGrant-copy/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-4e9121fe850a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-621c9996676a", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-4e9121fe850a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/BasicEntitlementGrant-copy.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "BasicEntitlementGrant-copy", + "displayName": "BasicEntitlementGrant-copy", + "id": "basicEntitlementGrantCopy", + "mutable": true, + "name": "BasicEntitlementGrant-copy", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2597, + "y": 322, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 722, + "y": 156, + }, + "exclusiveGateway-48e748c42994": { + "x": 1731, + "y": 88.015625, + }, + "exclusiveGateway-67a954f33919": { + "x": 467, + "y": 121.015625, + }, + "exclusiveGateway-89dc2f9576ee": { + "x": 452, + "y": 488.015625, + }, + "exclusiveGateway-ad04bf17ac62": { + "x": 336, + "y": 306.015625, + }, + "inclusiveGateway-3f85f36eeeef": { + "x": 948, + "y": 57.015625, + }, + "inclusiveGateway-f105ed2b352d": { + "x": 2255, + "y": 48.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1972, + "y": 119.015625, + }, + "scriptTask-0b56191887de": { + "x": 1979, + "y": 212.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 1434, + "y": 95.015625, + }, + "scriptTask-55aced130632": { + "x": 686, + "y": 351.015625, + }, + "scriptTask-91769554db51": { + "x": 2561, + "y": 74.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1441, + "y": 268.015625, + }, + "scriptTask-e04f42607ba5": { + "x": 185, + "y": 143.015625, + }, + "scriptTask-e21178ab80f7": { + "x": 716, + "y": 73.015625, + }, + "waitTask-0d53639996da": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1208, + "y": 30.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "entitlementId": request.common.entitlementId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/entitlementRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.warn('Create Removal Request failed to create') + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-91769554db51", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-91769554db51.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Custom Context Gateway - exclusiveGateway-89dc2f9576ee/Custom Context Gateway - exclusiveGateway-89dc2f9576ee.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Custom Context Gateway - exclusiveGateway-89dc2f9576ee/Custom Context Gateway - exclusiveGateway-89dc2f9576ee.json 1`] = ` +{ + "displayName": "Custom Context Gateway", + "name": "exclusiveGateway-89dc2f9576ee", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-55aced130632", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Custom Context Gateway - exclusiveGateway-89dc2f9576ee.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Custom Request Approved - scriptTask-55aced130632/Custom Request Approved - scriptTask-55aced130632.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request type custom auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Custom Request Approved - scriptTask-55aced130632/Custom Request Approved - scriptTask-55aced130632.json 1`] = ` +{ + "displayName": "Custom Request Approved", + "name": "scriptTask-55aced130632", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Custom Request Approved - scriptTask-55aced130632.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + failureReason = "Request Object" + requestObj + ":"; + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason += " Validation failed: Error reading request with id " + requestId + "More detail is content:" + content; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-f105ed2b352d", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-91769554db51", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-f105ed2b352d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-3f85f36eeeef", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-0d53639996da", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-3f85f36eeeef.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-f105ed2b352d", + }, + ], + "script": { + "file": "Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Request Approved - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"/* + * Script Node: Context & Type Check + * Purpose: Reads request context and entitlement type to set routing outcomes. + * Sets: context, skipApproval, entitlementType, entitlementId, userId, failureReason + */ + +logger.info("BasicEntitlementGrant (Custom) - Context & Type Check"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +var entitlementType = null; +var entitlementId = null; +var userId = null; +var failureReason = null; + + // Read request object +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + // --- Context check (admin requests skip approval) --- + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } + // --- User --- + userId = requestObj.request.common.userId; + + // --- Entitlement type routing --- + // The entitlement object on the request exposes a 'type' field. + // Internal/system roles exposed as entitlements should carry type: 'custom'. + if (requestObj.entitlement && requestObj.entitlement.type) { + entitlementType = requestObj.entitlement.type; + entitlementId = requestObj.entitlement.id; + } else { + // Fallback: treat as standard if type is absent + entitlementType = 'standard'; + } + +} catch (e) { + failureReason = 'Context & Type Check failed: ' + e.message; + logger.error(failureReason); +} + +logger.info("Context: " + context + " | EntitlementType: " + entitlementType + " | UserId: " + userId); + +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +execution.setVariable("entitlementType", entitlementType); +execution.setVariable("entitlementId", entitlementId); +execution.setVariable("userId", userId); +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-ad04bf17ac62", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Type Gateway - exclusiveGateway-ad04bf17ac62/Type Gateway - exclusiveGateway-ad04bf17ac62.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Type Gateway - exclusiveGateway-ad04bf17ac62/Type Gateway - exclusiveGateway-ad04bf17ac62.json 1`] = ` +{ + "displayName": "Type Gateway", + "name": "exclusiveGateway-ad04bf17ac62", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "entitlementType != 'custom'", + "outcome": "validationSuccess", + "step": "exclusiveGateway-67a954f33919", + }, + { + "condition": "entitlementType == 'custom'", + "outcome": "validationFailure", + "step": "exclusiveGateway-89dc2f9576ee", + }, + ], + "script": { + "file": "Type Gateway - exclusiveGateway-ad04bf17ac62.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/BasicEntitlementGrant-copy/steps/Wait Task - waitTask-0d53639996da/Wait Task - waitTask-0d53639996da.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-0d53639996da", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/CreateNonEmployee.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "CreateNonEmployee", + "displayName": "CreateNonEmployee", + "id": "createNonEmployee", + "mutable": true, + "name": "CreateNonEmployee", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1694, + "y": 154, + }, + "startNode": { + "connections": { + "start": "scriptTask-ca9504ae90d8", + }, + "id": "startNode", + "x": 12, + "y": 110, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6a2d0e09-a9ac-41ca-af24-8af052c480f2", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "script", + "expirationDate": 1, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 716, + "y": 169, + }, + "exclusiveGateway-abbb089758c8": { + "x": 433, + "y": 89.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 986, + "y": 48.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 988, + "y": 222.015625, + }, + "scriptTask-ca9504ae90d8": { + "x": 136, + "y": 112.015625, + }, + "scriptTask-e8842de66fbb": { + "x": 718, + "y": 43.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6a2d0e09-a9ac-41ca-af24-8af052c480f2", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(1*24*60*60*1000))).toISOString()", + }, + "frequency": 1, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0359a9d77ee2", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.js 1`] = ` +"logger.info("Create User - marking request as auto approved."); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to requester having create user privileges." + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.json 1`] = ` +{ + "displayName": "Auto-Approval", + "name": "scriptTask-e8842de66fbb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "script": { + "file": "Auto-Approval - scriptTask-e8842de66fbb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-abbb089758c8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-e8842de66fbb", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-abbb089758c8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Create User - scriptTask-0359a9d77ee2/Create User - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Creating User"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +} +catch (e) { + failureReason = "Creating User: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var payload = requestObj.request.user.object; + + var comment = {'comment': JSON.stringify(payload)}; + openidm.action('iga/governance/requests/' + requestId, 'POST', comment, queryParams); + } + catch (e) { + failureReason = "Creating user failed: Error during creation of user " + payload.userName + ". Error message: " + e.message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Create User - scriptTask-0359a9d77ee2/Create User - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Create User", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create User - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.js 1`] = ` +"// This permission check script will check that the requester has proper privileges to +// create a user. If so, it will skip any approval process and directly move to create the new user. + +logger.info("Create User - Permission check"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var skipApproval = false; + +try { + // Read the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + if(requester.id.startsWith('managed/user/')){ + // If requester is a normal managed user, check that the user has permissions to create a user + var userId = requester.id.split('/'); + var user = openidm.action('iga/governance/user', 'GET', {}, {'endUserId': userId[2], 'scopePermission': 'createUser', '_queryFilter': \`id+eq+'\` + userId[2] + \`'\`}) + if(user.result.length > 0){ + skipApproval = true; + } + } + else{ + // Tenant admins and system requests + skipApproval = true; + } +} +catch (e) { + logger.info("Request permission check failed: " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.json 1`] = ` +{ + "displayName": "Permission Check", + "name": "scriptTask-ca9504ae90d8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-abbb089758c8", + }, + ], + "script": { + "file": "Permission Check - scriptTask-ca9504ae90d8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Create User - rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateNonEmployee/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateUser - JH/CreateUser - JH.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "CreateUser - JH", + "displayName": "CreateUser - JH", + "id": "createUserJh", + "mutable": true, + "name": "CreateUser - JH", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1694, + "y": 154, + }, + "startNode": { + "connections": { + "start": "scriptTask-ca9504ae90d8", + }, + "id": "startNode", + "x": 12, + "y": 110, + }, + "uiConfig": { + "scriptTask-ca9504ae90d8": { + "x": 136, + "y": 112.015625, + }, + }, + }, + "status": "draft", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateUser - JH/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.js 1`] = ` +"// This permission check script will check that the requester has proper privileges to +// create a user. If so, it will skip any approval process and directly move to create the new user. + +logger.info("Create User - Permission check"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var skipApproval = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + var comment = { 'comment': JSON.stringify(requestObj) } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + logger.info("Request permission check failed: " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/CreateUser - JH/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.json 1`] = ` +{ + "displayName": "Permission Check", + "name": "scriptTask-ca9504ae90d8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Permission Check - scriptTask-ca9504ae90d8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/custom-1-BasicEntitlementGrant.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "custom-1-BasicEntitlementGrant", + "displayName": "custom-1-BasicEntitlementGrant", + "id": "custom1BasicEntitlementGrant", + "mutable": true, + "name": "custom-1-BasicEntitlementGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2597, + "y": 322, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 722, + "y": 156, + }, + "exclusiveGateway-48e748c42994": { + "x": 1731, + "y": 88.015625, + }, + "exclusiveGateway-67a954f33919": { + "x": 467, + "y": 121.015625, + }, + "inclusiveGateway-3f85f36eeeef": { + "x": 948, + "y": 57.015625, + }, + "inclusiveGateway-f105ed2b352d": { + "x": 2255, + "y": 48.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1972, + "y": 119.015625, + }, + "scriptTask-0b56191887de": { + "x": 1979, + "y": 212.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 1434, + "y": 95.015625, + }, + "scriptTask-91769554db51": { + "x": 2561, + "y": 74.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1441, + "y": 268.015625, + }, + "scriptTask-e04f42607ba5": { + "x": 186, + "y": 143.015625, + }, + "scriptTask-e21178ab80f7": { + "x": 716, + "y": 74.015625, + }, + "waitTask-0d53639996da": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1208, + "y": 30.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "entitlementId": request.common.entitlementId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/entitlementRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.warn('Create Removal Request failed to create') + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-91769554db51", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-91769554db51.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Custom Provisioning - scriptTask-0359a9d77ee2/Custom Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var authzRoleId = content.get('authzRoleId'); + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + + + // --- Conditional authzRoles patch for custom/internal role entitlements --- + if (entitlementType === 'custom' && accountAttribute === 'authzRoles') { + try { + openidm.patch( + 'managed/alpha_user/' + request.common.userId, + null, + [{ + "operation": "add", + "field": "/authzRoles/-", + "value": { "_ref": "internal/role/" + authzRoleId } + }] + ); + logger.info("custom-BasicEntitlementGrant - authzRoles patch successful" + + " | userId: " + request.common.userId + + " | entitlementId: " + authzRoleId); + } catch (e) { + failureReason = "Provisioning succeeded but authzRoles patch failed" + + " for user " + request.common.userId + + " and entitlement " + authzRoleId + + ". Error: " + e.message; + logger.error(failureReason); + } + } + + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Custom Provisioning - scriptTask-0359a9d77ee2/Custom Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Custom Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-f105ed2b352d", + }, + ], + "script": { + "file": "Custom Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Custom Request Approved - scriptTask-e21178ab80f7/Custom Request Approved - scriptTask-e21178ab80f7.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +var entitlementType = content.get('entitlementType'); + +try { + var decision = { + "decision": "approved", + } + if(skipApproval && entitlementType == 'custom'){ + decision.comment = "Custom request auto-approved due to request context: " + context; + } + else if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Custom Request Approved - scriptTask-e21178ab80f7/Custom Request Approved - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Custom Request Approved", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Custom Request Approved - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Custom Request Context Check - scriptTask-e04f42607ba5/Custom Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"/* + * Script Node: Context & Type Check + * Purpose: Reads request context and entitlement type to set routing outcomes. + * Sets: context, waits, skipApproval, entitlementType, entitlementId, userId, failureReason, accountAttribute, authzRoleId + */ + +logger.info("custom-BasicEntitlementGrant - Context & Type Check"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +var entitlementType = null; +var entitlementId = null; +var userId = null; +var failureReason = null; +var accountAttribute = null; +var authzRoleId = null; + +// Read request object +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + // --- Context check --- + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + + // --- Wait flags --- + if (requestObj.request.common.startDate) { + enableWait = true; + } + if (requestObj.request.common.endDate) { + enableEndWait = true; + } + + // --- User --- + userId = requestObj.request.common.userId; + + // --- Entitlement ID --- + entitlementId = requestObj.request.common.entitlementId; + + // Entitlement type + if (entitlementId) { + try { + var entitlementObj = openidm.action('iga/governance/entitlement/' + entitlementId, 'GET', {}, {}); + if (entitlementObj + && entitlementObj.glossary + && entitlementObj.glossary.idx + && entitlementObj.glossary.idx['/entitlement'] + && entitlementObj.glossary.idx['/entitlement'].entitlementType) { + + entitlementType = entitlementObj.glossary.idx['/entitlement'].entitlementType; + + } else { + entitlementType = 'standard'; + } + + // --- authzRoleId --- + if (entitlementObj + && entitlementObj.entitlement + && entitlementObj.entitlement._id) { + + authzRoleId = entitlementObj.entitlement._id; + + } + + // --- accountAttribute --- + accountAttribute = (entitlementObj + && entitlementObj.item + && entitlementObj.item.accountAttribute) + ? entitlementObj.item.accountAttribute + : null; + } catch (e) { + logger.warn("Entitlement lookup error: " + e.message); + + entitlementType = 'standard'; + } + } else { + entitlementType = 'standard'; + } + + // --- Log comment to request audit trail --- + try { + var logComment = "Context & Type Check" + + " | userId: " + userId + + " | context: " + context + + " | entitlementId: " + entitlementId + + " | entitlementType: " + entitlementType + + " | skipApproval: " + skipApproval + + " | authzRoleId: " + authzRoleId; + + + openidm.action( + 'iga/governance/requests/' + requestId, + 'POST', + { 'comment': logComment }, + { '_action': 'update' } + ); + } catch (e) { + logger.error("Failed to write log comment: " + e.message); + } + +} catch (e) { + failureReason = 'Context & Type Check failed: ' + e.message; + logger.error(failureReason); +} + +logger.info("Context: " + context + " | EntitlementType: " + entitlementType + " | UserId: " + userId); + +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +execution.setVariable("entitlementType", entitlementType); +execution.setVariable("entitlementId", entitlementId); +execution.setVariable("userId", userId); +execution.setVariable("failureReason", failureReason); +execution.setVariable("accountAttribute", accountAttribute); +execution.setVariable("authzRoleId", authzRoleId); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Custom Request Context Check - scriptTask-e04f42607ba5/Custom Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Custom Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-67a954f33919", + }, + ], + "script": { + "file": "Custom Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-f105ed2b352d", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-91769554db51", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-f105ed2b352d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-3f85f36eeeef", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-0d53639996da", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-3f85f36eeeef.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-1-BasicEntitlementGrant/steps/Wait Task - waitTask-0d53639996da/Wait Task - waitTask-0d53639996da.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-0d53639996da", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/custom-BasicEntitlementGrant.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "custom-BasicEntitlementGrant", + "displayName": "custom-BasicEntitlementGrant", + "id": "customBasicEntitlementGrant", + "mutable": true, + "name": "custom-BasicEntitlementGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2873, + "y": 976, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 184, + "y": 470, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 998, + "y": 810, + }, + "exclusiveGateway-26e6b56a6d6b": { + "x": 736, + "y": 231.03125, + }, + "exclusiveGateway-48e748c42994": { + "x": 2007, + "y": 742.015625, + }, + "exclusiveGateway-526a06894733": { + "x": 571, + "y": 458, + }, + "exclusiveGateway-67a954f33919": { + "x": 743, + "y": 775.015625, + }, + "inclusiveGateway-3f85f36eeeef": { + "x": 1224, + "y": 711.015625, + }, + "inclusiveGateway-f105ed2b352d": { + "x": 2531, + "y": 702.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 2248, + "y": 773.015625, + }, + "scriptTask-0b56191887de": { + "x": 2255, + "y": 866.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 1710, + "y": 749.015625, + }, + "scriptTask-6dc428f459a8": { + "x": 1026, + "y": 152.515625, + }, + "scriptTask-91769554db51": { + "x": 2837, + "y": 728.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1717, + "y": 922.015625, + }, + "scriptTask-e04f42607ba5": { + "x": 300, + "y": 472.015625, + }, + "scriptTask-e21178ab80f7": { + "x": 992, + "y": 728.015625, + }, + "waitTask-0d53639996da": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1484, + "y": 684.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "entitlementId": request.common.entitlementId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/entitlementRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.warn('Create Removal Request failed to create') + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-91769554db51", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-91769554db51.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Custom Auto Approval - scriptTask-6dc428f459a8/Custom Auto Approval - scriptTask-6dc428f459a8.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request type custom auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Custom Auto Approval - scriptTask-6dc428f459a8/Custom Auto Approval - scriptTask-6dc428f459a8.json 1`] = ` +{ + "displayName": "Custom Auto Approval", + "name": "scriptTask-6dc428f459a8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Custom Auto Approval - scriptTask-6dc428f459a8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Custom Context Gateway - exclusiveGateway-26e6b56a6d6b/Custom Context Gateway - exclusiveGateway-26e6b56a6d6b.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Custom Context Gateway - exclusiveGateway-26e6b56a6d6b/Custom Context Gateway - exclusiveGateway-26e6b56a6d6b.json 1`] = ` +{ + "displayName": "Custom Context Gateway", + "name": "exclusiveGateway-26e6b56a6d6b", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-6dc428f459a8", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Custom Context Gateway - exclusiveGateway-26e6b56a6d6b.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-f105ed2b352d", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-91769554db51", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-f105ed2b352d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-3f85f36eeeef", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-0d53639996da", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-3f85f36eeeef.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-f105ed2b352d", + }, + ], + "script": { + "file": "Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Request Approved - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"/* + * Script Node: Context & Type Check + * Purpose: Reads request context and entitlement type to set routing outcomes. + * Sets: context, waits, skipApproval, entitlementType, entitlementId, userId, failureReason, accountAttribute + */ + +logger.info("custom-BasicEntitlementGrant - Context & Type Check"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +var entitlementType = null; +var entitlementId = null; +var userId = null; +var failureReason = null; +var accountAttribute = null; + +// Read request object +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + // Context check (admin requests skip approval) + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + + // Optional Waits + if (requestObj.request.common.startDate) { + enableWait = true; + } + if (requestObj.request.common.endDate) { + enableEndWait = true; + } + + // User + userId = requestObj.request.common.userId; + + // Entitlement ID + entitlementId = requestObj.request.common.entitlementId; + + // Entitlement type + if (entitlementId) { + try { + var entitlementObj = openidm.action('iga/governance/entitlement/' + entitlementId, 'GET', {}, {}); + if (entitlementObj + && entitlementObj.glossary + && entitlementObj.glossary.idx + && entitlementObj.glossary.idx['/entitlement'] + && entitlementObj.glossary.idx['/entitlement'].entitlementType) { + + entitlementType = entitlementObj.glossary.idx['/entitlement'].entitlementType; + + } else { + entitlementType = 'standard'; + } + + // accountAttribute for provisioning node + accountAttribute = (entitlementObj + && entitlementObj.item + && entitlementObj.item.accountAttribute) + ? entitlementObj.item.accountAttribute + : null; + } catch (e) { + logger.warn("Entitlement lookup error: " + e.message); + + entitlementType = 'standard'; + } + } else { + entitlementType = 'standard'; + } + + +} catch (e) { + failureReason = 'Context & Type Check failed: ' + e.message; + logger.error(failureReason); +} + +logger.info("Context: " + context + " | EntitlementType: " + entitlementType + " | UserId: " + userId + " | AuthzRoleId: " + authzRoleId); + +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +execution.setVariable("entitlementType", entitlementType); +execution.setVariable("entitlementId", entitlementId); +execution.setVariable("userId", userId); +execution.setVariable("failureReason", failureReason); +execution.setVariable("accountAttribute", accountAttribute); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-526a06894733", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-526a06894733/Validation Gateway - exclusiveGateway-526a06894733.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-526a06894733/Validation Gateway - exclusiveGateway-526a06894733.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-526a06894733", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "entitlementType == 'custom'", + "outcome": "validationSuccess", + "step": "exclusiveGateway-26e6b56a6d6b", + }, + { + "condition": "entitlementType != 'custom'", + "outcome": "validationFailure", + "step": "exclusiveGateway-67a954f33919", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-526a06894733.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/custom-BasicEntitlementGrant/steps/Wait Task - waitTask-0d53639996da/Wait Task - waitTask-0d53639996da.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-0d53639996da", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/jh-ne-create-test-2.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "jh-ne-create-test-2", + "displayName": "jh-ne-create-test-2", + "id": "jhNeCreateTest2", + "mutable": true, + "name": "jh-ne-create-test-2", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 1463, + "y": 262, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-2131bbe3663d", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 50, + "y": 250, + }, + "uiConfig": { + "approvalTask-6649e6d6f2a3": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6a2d0e09-a9ac-41ca-af24-8af052c480f2", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 606.3999938964844, + "y": 431.6125030517578, + }, + "emailTask-731854fb34db": { + "x": 1119.3999938964844, + "y": 107.61250305175781, + }, + "exclusiveGateway-69f93dd39054": { + "x": 394.3999938964844, + "y": 252.6125030517578, + }, + "scriptTask-2131bbe3663d": { + "x": 156.39999389648438, + "y": 252.6125030517578, + }, + "scriptTask-c174d2210667": { + "x": 814.3999938964844, + "y": 43.61250305175781, + }, + "scriptTask-f2a2d7eee947": { + "x": 821.3999938964844, + "y": 298.6125030517578, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/steps/%22Create%22 User - scriptTask-f2a2d7eee947/%22Create%22 User - scriptTask-f2a2d7eee947.js 1`] = ` +"logger.info("Creating User"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var request = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + request = requestObj.request; + + + + // var payload = { + // "userName": request.custom.userName, + // "givenName": request.custom.givenName, + // "sn": request.custom.sn, + // "mail": request.custom.mail, + // "password": 'DemoP@ssword1' + // }; + + /** Create new user **/ + // var result = openidm.create('managed/alpha_user', null, payload, queryParams); + + // /** Send new user email **/ + // var body = { + // subject: "Welcome " + payload.givenName + " " + payload.sn + "!", + // to: payload.mail, + // body: "Your new user has been created in the system.\\n\\nUsername: " + payload.userName + "\\nPassword: " + payload.password + "\\n\\nLogin to your account here: https://openam-gov-dev-4.forgeblocks.com/am/XUI/?realm=/alpha#/", + // object: {} + // }; + // openidm.action("external/email", "send", body); + } + catch (e) { + failureReason = "Creating user failed: Error during creation of user " + request.custom.userName + ". Error message: " + e.message; + } + + var decision = {'status': 'complete', 'decision': 'approved', "comment": JSON.stringify(request)}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/steps/%22Create%22 User - scriptTask-f2a2d7eee947/%22Create%22 User - scriptTask-f2a2d7eee947.json 1`] = ` +{ + "displayName": ""Create" User", + "name": "scriptTask-f2a2d7eee947", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "emailTask-731854fb34db", + }, + ], + "script": { + "file": "%22Create%22 User - scriptTask-f2a2d7eee947.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/steps/Account Creation Email - emailTask-731854fb34db/Account Creation Email - emailTask-731854fb34db.json 1`] = ` +{ + "displayName": "Account Creation Email", + "emailTask": { + "bcc": "", + "cc": "", + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": null, + }, + { + "condition": null, + "outcome": "FAILED", + "step": null, + }, + ], + "object": { + "cn": "9959348", + "custom_DisplayName": "Jack Hatton", + "custom_LocationName": "remote", + "custom_siteLocation": "remote", + "manager": "test", + }, + "templateName": "staffNe1AccountCreation", + "to": "jhatton@trivir.com", + }, + "name": "emailTask-731854fb34db", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/steps/Approval Task - approvalTask-6649e6d6f2a3/Approval Task - approvalTask-6649e6d6f2a3.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6a2d0e09-a9ac-41ca-af24-8af052c480f2", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-f2a2d7eee947", + }, + { + "condition": null, + "outcome": "REJECT", + "step": null, + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-6649e6d6f2a3", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/steps/Auto Approve Gateway - exclusiveGateway-69f93dd39054/Auto Approve Gateway - exclusiveGateway-69f93dd39054.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/steps/Auto Approve Gateway - exclusiveGateway-69f93dd39054/Auto Approve Gateway - exclusiveGateway-69f93dd39054.json 1`] = ` +{ + "displayName": "Auto Approve Gateway", + "name": "exclusiveGateway-69f93dd39054", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-c174d2210667", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-6649e6d6f2a3", + }, + ], + "script": { + "file": "Auto Approve Gateway - exclusiveGateway-69f93dd39054.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/steps/Mark Approved - scriptTask-c174d2210667/Mark Approved - scriptTask-c174d2210667.js 1`] = ` +"logger.info("Create User - marking request as auto approved."); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var queryParams = { "_action": "update" } + +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to requester having create user privileges." + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/steps/Mark Approved - scriptTask-c174d2210667/Mark Approved - scriptTask-c174d2210667.json 1`] = ` +{ + "displayName": "Mark Approved", + "name": "scriptTask-c174d2210667", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "emailTask-731854fb34db", + }, + ], + "script": { + "file": "Mark Approved - scriptTask-c174d2210667.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/steps/Permissions Check - scriptTask-2131bbe3663d/Permissions Check - scriptTask-2131bbe3663d.js 1`] = ` +"logger.info("Create User - Permission check"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var skipApproval = false; + +try { + // Read the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + if(requester.id.startsWith('managed/user/')){ + // If requester is a normal managed user, check that the user has permissions to create a user + var userId = requester.id.split('/'); + var user = openidm.action('iga/governance/user', 'GET', {}, {'endUserId': userId[2], 'scopePermission': 'createUser', '_queryFilter': \`id+eq+'\` + userId[2] + \`'\`}) + if(user.result.length > 0){ + skipApproval = true; + } + } + else{ + // Tenant admins and system requests + skipApproval = true; + } +} +catch (e) { + logger.info("Request permission check failed: " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/jh-ne-create-test-2/steps/Permissions Check - scriptTask-2131bbe3663d/Permissions Check - scriptTask-2131bbe3663d.json 1`] = ` +{ + "displayName": "Permissions Check", + "name": "scriptTask-2131bbe3663d", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-69f93dd39054", + }, + ], + "script": { + "file": "Permissions Check - scriptTask-2131bbe3663d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/pgh-generate-rap/pgh-generate-rap.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "pgh-generate-rap", + "displayName": "pgh-generate-rap", + "id": "pghGenerateRap", + "mutable": true, + "name": "pgh-generate-rap", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 1156, + "y": 151, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-115d1ab72679", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 70, + "y": 151, + }, + "uiConfig": { + "exclusiveGateway-2d4351f5c77b": { + "x": 451, + "y": 126.5, + }, + "fulfillmentTask-f49f20d19149": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDateType": "duration", + "expirationDateVariable": "", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 683, + "y": 126.5, + }, + "scriptTask-115d1ab72679": { + "x": 208, + "y": 158, + }, + "scriptTask-5a2b73dd9dd2": { + "x": 916, + "y": 80, + }, + "scriptTask-6f260211dc0f": { + "x": 916, + "y": 226, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/pgh-generate-rap/steps/Auto Approve - scriptTask-5a2b73dd9dd2/Auto Approve - scriptTask-5a2b73dd9dd2.js 1`] = ` +"function updateRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action('iga/governance/requests/' + requestId, 'POST', body, { _action: "update" }); +} + +function modifyRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action('iga/governance/requests/' + requestId, 'POST', body, { _action: "modify", phaseName: execution.getVariables().get('phaseName') }); +} + +function commentRequest(message, isFail) { + return updateRequest({ comment: message, failure: isFail }); +} + +function approveRequest() { + updateRequest({ + outcome: 'fulfilled', + status: 'complete', + decision: 'approved' + }); +} + +function main() { + try { + modifyRequest({ + common: { + isDraft: false, + context: { + type: "request" + } + }, + custom: { + idPath: execution.getVariables().get('idPath'), + rap: "" + } + }); + approveRequest(); + } catch (e) { + commentRequest("Failure auto-approving RAP request. Error message: " + e.message, true); + } +} + +main(); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/pgh-generate-rap/steps/Auto Approve - scriptTask-5a2b73dd9dd2/Auto Approve - scriptTask-5a2b73dd9dd2.json 1`] = ` +{ + "displayName": "Auto Approve", + "name": "scriptTask-5a2b73dd9dd2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Auto Approve - scriptTask-5a2b73dd9dd2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/pgh-generate-rap/steps/Auto Reject - scriptTask-6f260211dc0f/Auto Reject - scriptTask-6f260211dc0f.js 1`] = ` +"function updateRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action('iga/governance/requests/' + requestId, 'POST', body, { _action: "update" }); +} + +function modifyRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action('iga/governance/requests/' + requestId, 'POST', body, { _action: "modify", phaseName: execution.getVariables().get('phaseName') }); +} + +function commentRequest(message, isFail) { + return updateRequest({ comment: message, failure: isFail }); +} + +function rejectRequest() { + updateRequest({ + outcome: 'cancelled', + status: 'complete', + decision: 'rejected' + }); +} + +function main() { + try { + modifyRequest({ + common: { + isDraft: false, + context: { + type: "request" + } + }, + custom: { + idPath: execution.getVariables().get('idPath'), + rap: "" + } + }); + rejectRequest(); + } catch (e) { + commentRequest("Failure auto-rejecting RAP request. Error message: " + e.message, true); + } +} + +main(); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/pgh-generate-rap/steps/Auto Reject - scriptTask-6f260211dc0f/Auto Reject - scriptTask-6f260211dc0f.json 1`] = ` +{ + "displayName": "Auto Reject", + "name": "scriptTask-6f260211dc0f", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Auto Reject - scriptTask-6f260211dc0f.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/pgh-generate-rap/steps/Confirm RAP - fulfillmentTask-f49f20d19149/Confirm RAP - fulfillmentTask-f49f20d19149.json 1`] = ` +{ + "displayName": "Confirm RAP", + "fulfillmentTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "approvalMode": "any", + "events": {}, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "scriptTask-5a2b73dd9dd2", + }, + { + "condition": null, + "outcome": "DENY", + "step": "scriptTask-6f260211dc0f", + }, + ], + }, + "name": "fulfillmentTask-f49f20d19149", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/pgh-generate-rap/steps/Generate RAP - scriptTask-115d1ab72679/Generate RAP - scriptTask-115d1ab72679.js 1`] = ` +"function getPublishedWorkflow(workflowId) { + return openidm.action(\`iga/governance/workflow/\${workflowId}/published\`, 'GET', {}, {}); +} + +function getRequestType(requestTypeId) { + return openidm.action(\`iga/governance/requestTypes/\${requestTypeId}\`, 'GET', {}, {}); +} + +function getRequest() { + var requestId = execution.getVariables().get('id'); + return openidm.action(\`iga/governance/requests/\${requestId}\`, 'GET', {}, {}); +} + +function modifyRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action(\`iga/governance/requests/\${requestId}\`, 'POST', body, { _action: "modify", phaseName: execution.getVariables().get('phaseName') }); +} + +function updateRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action(\`iga/governance/requests/\${requestId}\`, 'POST', body, { _action: "update" }); +} + +function commentRequest(message, isFail) { + return updateRequest({ comment: message, failure: !!isFail }); +} + +function main() { + var isSuccessful = false; + try { + var request = getRequest(); + + // Get user ID + var idPath = request.request.custom.idPath; + var userId = idPath.split('/').pop(); + execution.setVariable("idPath", idPath); + + // Get script ID for the phase name + var requestType = getRequestType(request.requestType); + var workflow = getPublishedWorkflow(requestType.workflow.id); + execution.setVariable("phaseName", workflow.staticNodes.startNode.connections.start); + + // Generate RAP + var response = openidm.action('endpoint/helpdesk-rap/generate/' + userId, 'create', {}, {}); + modifyRequest({ + common: { + isDraft: false, + context: { + type: "request" + } + }, + custom: { + idPath: idPath, + rap: response.rap + } + }); + isSuccessful = true; + } catch (e) { + commentRequest("Error generating RAP. Error message: " + e.message, true); + } finally { + execution.setVariable("isSuccessful", isSuccessful); + } +} + +main(); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/pgh-generate-rap/steps/Generate RAP - scriptTask-115d1ab72679/Generate RAP - scriptTask-115d1ab72679.json 1`] = ` +{ + "displayName": "Generate RAP", + "name": "scriptTask-115d1ab72679", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-2d4351f5c77b", + }, + ], + "script": { + "file": "Generate RAP - scriptTask-115d1ab72679.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/pgh-generate-rap/steps/Is Successful - exclusiveGateway-2d4351f5c77b/Is Successful - exclusiveGateway-2d4351f5c77b.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/pgh-generate-rap/steps/Is Successful - exclusiveGateway-2d4351f5c77b/Is Successful - exclusiveGateway-2d4351f5c77b.json 1`] = ` +{ + "displayName": "Is Successful", + "name": "exclusiveGateway-2d4351f5c77b", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "isSuccessful == true", + "outcome": "success", + "step": "fulfillmentTask-f49f20d19149", + }, + { + "condition": "isSuccessful == false", + "outcome": "error", + "step": "scriptTask-6f260211dc0f", + }, + ], + "script": { + "file": "Is Successful - exclusiveGateway-2d4351f5c77b.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/phh-BasicApplicationGrant.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-BasicApplicationGrant", + "displayName": "phh-BasicApplicationGrant", + "id": "phhBasicApplicationGrant", + "mutable": true, + "name": "phh-BasicApplicationGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2822, + "y": 352, + }, + "startNode": { + "connections": { + "start": "scriptTask-4e9121fe850a", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-440960b2744d": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1038.7499923706055, + "y": 469.76562881469727, + }, + "approvalTask-5d1d9c5d8384": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1039.2499923706055, + "y": 334.76562881469727, + }, + "approvalTask-6ad92fcbe998": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1037.2499923706055, + "y": 601.7656288146973, + }, + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 1, + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 682, + "y": 155, + }, + "approvalTask-ffa3a83b9dfd": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1039.9999923706055, + "y": 736.7656288146973, + }, + "exclusiveGateway-5167870154a9": { + "x": 1855, + "y": 84, + }, + "exclusiveGateway-621c9996676a": { + "x": 433, + "y": 117.015625, + }, + "inclusiveGateway-2fbd3e7aa50c": { + "x": 803.3999938964844, + "y": 472.6125030517578, + }, + "inclusiveGateway-7d248125a9bd": { + "x": 2417, + "y": 43.015625, + }, + "inclusiveGateway-a71e67faaad1": { + "x": 1124, + "y": 93.015625, + }, + "scriptTask-0e5b6187ea62": { + "x": 889, + "y": 116.015625, + }, + "scriptTask-14acc58c28dd": { + "x": 2650, + "y": 85.015625, + }, + "scriptTask-3a74557440fb": { + "x": 2144, + "y": 62, + }, + "scriptTask-4e9121fe850a": { + "x": 168, + "y": 140.015625, + }, + "scriptTask-626899b6e99a": { + "x": 1549, + "y": 108, + }, + "scriptTask-744ef6a8b9a2": { + "x": 2151, + "y": 207.015625, + }, + "scriptTask-c444d08a6099": { + "x": 818.3999938964844, + "y": 348.6125030517578, + }, + "scriptTask-c58309b8c470": { + "x": 1554, + "y": 242, + }, + "waitTask-13cf96ebeb37": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + "resumeDateVariable": "startDate", + }, + "x": 1339, + "y": 85.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Application Grant Validation - scriptTask-626899b6e99a/Application Grant Validation - scriptTask-626899b6e99a.js 1`] = ` +"logger.info("Running application grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var app = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check the user does not already have application granted +// Note: this is done at request submission time as well, the following is an example of how to check user's accounts +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + failureReason = "Validation failed: User with id " + requestObj.user.id + " already has effective application " + applicationId; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check effective applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Application Grant Validation - scriptTask-626899b6e99a/Application Grant Validation - scriptTask-626899b6e99a.json 1`] = ` +{ + "displayName": "Application Grant Validation", + "name": "scriptTask-626899b6e99a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-5167870154a9", + }, + ], + "script": { + "file": "Application Grant Validation - scriptTask-626899b6e99a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Application Grant Validation Failure - scriptTask-744ef6a8b9a2/Application Grant Validation Failure - scriptTask-744ef6a8b9a2.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Application Grant Validation Failure - scriptTask-744ef6a8b9a2/Application Grant Validation Failure - scriptTask-744ef6a8b9a2.json 1`] = ` +{ + "displayName": "Application Grant Validation Failure", + "name": "scriptTask-744ef6a8b9a2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Application Grant Validation Failure - scriptTask-744ef6a8b9a2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Approval Task - approvalTask-6ad92fcbe998/Approval Task - approvalTask-6ad92fcbe998.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-6ad92fcbe998", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*1*24*60*60*1000))).toISOString()", + }, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-c444d08a6099", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Approval Task - approvalTask-440960b2744d/Approval Task - approvalTask-440960b2744d.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-440960b2744d", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Approval Task - approvalTask-ffa3a83b9dfd/Approval Task - approvalTask-ffa3a83b9dfd.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-ffa3a83b9dfd", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Check LOB - scriptTask-c444d08a6099/Check LOB - scriptTask-c444d08a6099.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ + +var content = execution.getVariables(); +var requestId = content.get('id'); +var requestObj = null; +var appId = null; +var appGlossary = null; +var lob = null; +try { +requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +appId = requestObj.application.id; +} +catch (e) { +logger.info("Validation failed: Error reading application grant request with id " + requestId); +} +try { +appGlossary = openidm.action('iga/governance/application/' + appId + '/glossary', 'GET', {}, {}); +lob = appGlossary.lineOfBusiness || "default" +execution.setVariable("lob", lob); +} +catch (e) { +logger.info("Could not retrieve glossary with appId " + appId + " from application grant request ID " + requestId); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Check LOB - scriptTask-c444d08a6099/Check LOB - scriptTask-c444d08a6099.json 1`] = ` +{ + "displayName": "Check LOB", + "name": "scriptTask-c444d08a6099", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-2fbd3e7aa50c", + }, + ], + "script": { + "file": "Check LOB - scriptTask-c444d08a6099.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-621c9996676a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-621c9996676a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Create Removal Request - scriptTask-14acc58c28dd/Create Removal Request - scriptTask-14acc58c28dd.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "applicationId": request.common.applicationId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/applicationRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.info("Create Removal Request failed to create request") + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Create Removal Request - scriptTask-14acc58c28dd/Create Removal Request - scriptTask-14acc58c28dd.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-14acc58c28dd", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-14acc58c28dd.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Has End Date - inclusiveGateway-7d248125a9bd/Has End Date - inclusiveGateway-7d248125a9bd.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Has End Date - inclusiveGateway-7d248125a9bd/Has End Date - inclusiveGateway-7d248125a9bd.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-7d248125a9bd", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-14acc58c28dd", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-7d248125a9bd.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Has Start Date - inclusiveGateway-a71e67faaad1/Has Start Date - inclusiveGateway-a71e67faaad1.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Has Start Date - inclusiveGateway-a71e67faaad1/Has Start Date - inclusiveGateway-a71e67faaad1.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-a71e67faaad1", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-13cf96ebeb37", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-626899b6e99a", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-a71e67faaad1.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/LOB - inclusiveGateway-2fbd3e7aa50c/LOB - inclusiveGateway-2fbd3e7aa50c.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/LOB - inclusiveGateway-2fbd3e7aa50c/LOB - inclusiveGateway-2fbd3e7aa50c.json 1`] = ` +{ + "displayName": "LOB", + "name": "inclusiveGateway-2fbd3e7aa50c", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "lob == "sales"", + "outcome": "sales", + "step": "approvalTask-5d1d9c5d8384", + }, + { + "condition": "lob == "finance"", + "outcome": "finance", + "step": "approvalTask-440960b2744d", + }, + { + "condition": "lob == "hr"", + "outcome": "humanResources", + "step": "approvalTask-6ad92fcbe998", + }, + { + "condition": "lob == "default"", + "outcome": "null", + "step": "approvalTask-ffa3a83b9dfd", + }, + ], + "script": { + "file": "LOB - inclusiveGateway-2fbd3e7aa50c.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Provisioning - scriptTask-3a74557440fb/Provisioning - scriptTask-3a74557440fb.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "applicationId": request.common.applicationId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning account to user " + request.common.userId + " for application " + request.common.applicationId + ". Error message: " + message; + } + + var decision = {'status': 'complete'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Provisioning - scriptTask-3a74557440fb/Provisioning - scriptTask-3a74557440fb.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-3a74557440fb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-7d248125a9bd", + }, + ], + "script": { + "file": "Provisioning - scriptTask-3a74557440fb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-c58309b8c470", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-c58309b8c470.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if (skipApproval) { + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-0e5b6187ea62", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-a71e67faaad1", + }, + ], + "script": { + "file": "Request Approved - scriptTask-0e5b6187ea62.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-4e9121fe850a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-621c9996676a", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-4e9121fe850a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Sales Approver Role - approvalTask-5d1d9c5d8384/Sales Approver Role - approvalTask-5d1d9c5d8384.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Sales Approver Role", + "name": "approvalTask-5d1d9c5d8384", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Validation Gateway - exclusiveGateway-5167870154a9/Validation Gateway - exclusiveGateway-5167870154a9.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Validation Gateway - exclusiveGateway-5167870154a9/Validation Gateway - exclusiveGateway-5167870154a9.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-5167870154a9", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationSuccess", + "step": "scriptTask-3a74557440fb", + }, + { + "condition": "failureReason != null", + "outcome": "validationFailure", + "step": "scriptTask-744ef6a8b9a2", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-5167870154a9.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-BasicApplicationGrant/steps/Wait Task - waitTask-13cf96ebeb37/Wait Task - waitTask-13cf96ebeb37.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-13cf96ebeb37", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-626899b6e99a", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/phh-InternalRoleEntitlementGrant.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-InternalRoleEntitlementGrant", + "displayName": "phh-InternalRoleEntitlementGrant", + "id": "phhInternalRoleEntitlementGrant", + "mutable": true, + "name": "phh-InternalRoleEntitlementGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2597, + "y": 322, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 722, + "y": 156, + }, + "exclusiveGateway-48e748c42994": { + "x": 1731, + "y": 88.015625, + }, + "exclusiveGateway-67a954f33919": { + "x": 467, + "y": 121.015625, + }, + "inclusiveGateway-3f85f36eeeef": { + "x": 948, + "y": 57.015625, + }, + "inclusiveGateway-f105ed2b352d": { + "x": 2255, + "y": 48.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1972, + "y": 119.015625, + }, + "scriptTask-0b56191887de": { + "x": 1979, + "y": 212.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 1434, + "y": 95.015625, + }, + "scriptTask-91769554db51": { + "x": 2561, + "y": 74.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1441, + "y": 268.015625, + }, + "scriptTask-e04f42607ba5": { + "x": 186, + "y": 143.015625, + }, + "scriptTask-e21178ab80f7": { + "x": 716, + "y": 74.015625, + }, + "waitTask-0d53639996da": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1208, + "y": 30.015625, + }, + }, + }, + "status": "draft", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "entitlementId": request.common.entitlementId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/entitlementRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.warn('Create Removal Request failed to create') + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-91769554db51", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-91769554db51.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-f105ed2b352d", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-91769554db51", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-f105ed2b352d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-3f85f36eeeef", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-0d53639996da", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-3f85f36eeeef.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-f105ed2b352d", + }, + ], + "script": { + "file": "Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Request Approved - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-67a954f33919", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-InternalRoleEntitlementGrant/steps/Wait Task - waitTask-0d53639996da/Wait Task - waitTask-0d53639996da.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-0d53639996da", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-birthright-roles-requiring-approval/phh-birthright-roles-requiring-approval.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-birthright-roles-requiring-approval", + "displayName": "phh-birthright-roles-requiring-approval", + "id": "phhBirthrightRolesRequiringApproval", + "mutable": true, + "name": "phh-birthright-roles-requiring-approval", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 1303, + "y": 236, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-0e64ff0c1695", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 70, + "y": 151, + }, + "uiConfig": { + "approvalTask-f4e7324654b5": { + "actors": { + "isExpression": true, + "value": "(function() { +var content = execution.getVariables(); +var requestId = content.get('id'); +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var approverId = ''; +if (requestIndex.request.common.blob.after.manager) { approverId = requestIndex.request.common.blob.after.manager.id } +return [{ +"id": "managed/user/" + approverId, +"permissions": { +"approve": true, +"reject": true, +"reassign": true, +"modify": true, +"comment": true +} +}]; +})()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 440, + "y": 126.5, + }, + "scriptTask-0e64ff0c1695": { + "x": 210, + "y": 153, + }, + "scriptTask-792e240778b1": { + "x": 712, + "y": 226, + }, + "scriptTask-ad05a46c2e74": { + "x": 712, + "y": 80, + }, + "scriptTask-aecf833994d2": { + "x": 1032, + "y": 153, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-birthright-roles-requiring-approval/steps/Debug Task - scriptTask-0e64ff0c1695/Debug Task - scriptTask-0e64ff0c1695.js 1`] = ` +"logger.info("Running user update event"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var context = null; +var skipApproval = false; +var userObj = null; +var userId = null; +// Read event user information from request object +try { +var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +logger.error("requestObj "+JSON.stringify(requestObj)); +if (requestObj.request.common.context) { +context = requestObj.request.common.context.type; +if (context == 'admin') { +skipApproval = true; +} +} +userObj = requestObj.request.common.blob.after; +userId = userObj.userId; +} +catch (e) { +failureReason = "Validation failed: Error reading request with id " + requestId; +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-birthright-roles-requiring-approval/steps/Debug Task - scriptTask-0e64ff0c1695/Debug Task - scriptTask-0e64ff0c1695.json 1`] = ` +{ + "displayName": "Debug Task", + "name": "scriptTask-0e64ff0c1695", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "approvalTask-f4e7324654b5", + }, + ], + "script": { + "file": "Debug Task - scriptTask-0e64ff0c1695.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-birthright-roles-requiring-approval/steps/Failure Handler - scriptTask-aecf833994d2/Failure Handler - scriptTask-aecf833994d2.js 1`] = ` +"logger.info("Failure Handler: BirthRight Roles that need Approval "); +var content = execution.getVariables(); +var requestId = content.get('requestId'); +var failureReason = content.get('failureReason'); +// Update event request as final +if (failureReason) { +var decision = {'status': 'complete', 'outcome': 'cancelled', 'decision': 'rejected', 'comment': failureReason, 'failure': true} +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-birthright-roles-requiring-approval/steps/Failure Handler - scriptTask-aecf833994d2/Failure Handler - scriptTask-aecf833994d2.json 1`] = ` +{ + "displayName": "Failure Handler", + "name": "scriptTask-aecf833994d2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Failure Handler - scriptTask-aecf833994d2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-birthright-roles-requiring-approval/steps/Finalize Request on Reject - scriptTask-ad05a46c2e74/Finalize Request on Reject - scriptTask-ad05a46c2e74.js 1`] = ` +"logger.info("Finalize Request:BirthRight Roles that need Approval"); +var content = execution.getVariables(); +var requestId = content.get('requestId'); +var failureState = content.get('failureState'); +if (!failureState) { +try { +// Update event request as final +var decision = {'status': 'complete', 'outcome': 'fulfilled', 'decision': 'rejected'} +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +} +catch (e) { +execution.setVariable("failureState", "Unable to finalize request."); +} +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-birthright-roles-requiring-approval/steps/Finalize Request on Reject - scriptTask-ad05a46c2e74/Finalize Request on Reject - scriptTask-ad05a46c2e74.json 1`] = ` +{ + "displayName": "Finalize Request on Reject", + "name": "scriptTask-ad05a46c2e74", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-aecf833994d2", + }, + ], + "script": { + "file": "Finalize Request on Reject - scriptTask-ad05a46c2e74.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-birthright-roles-requiring-approval/steps/Look Up Roles and Request - scriptTask-792e240778b1/Look Up Roles and Request - scriptTask-792e240778b1.js 1`] = ` +"logger.info("Running user update event"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var userObj = null; +var userId = null; +// +// Read event user information from request object +try { +var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +userObj = requestObj.request.common.blob.after; +userId = userObj.userId; +} +catch (e) { +failureReason = "Validation failed: Error reading request with id " + requestId; +} +///Get Roles from Role Variable +var roleNames = requestObj.request.common.blob.parameters.roleNames.split(','); +logger.error("UpdateRequest with roleNames: " + roleNames); +// Look up roles in catalog +var operand = []; +for (var index in roleNames) { +var role = roleNames[index]; +var roleClean = role.trim(); +operand.push({operator: "EQUALS", operand: { targetName: "role.name", targetValue: roleClean }}) +} +var body = { targetFilter: {operator: "OR", operand: operand}}; +var catalog = openidm.action("iga/governance/catalog/search", "POST", body); +var catalogResults = catalog.result; +// Define request catalogs key +var catalogBody = []; +for (var idx in catalogResults) { +var catalog = catalogResults[idx]; +catalogBody.push({type: "role", id: catalog.id}) +} +// Define request payload +var requestBody = { +priority: "low", +accessModifier: "add", +justification: "Request submitted on user update.", +users: [ userId ], +catalogs: catalogBody, +context: { +type: "NoAdmin" +} +}; +// Create requests +try { +logger.error("DRLCREATING REQUST for "+JSON.stringify(body)); +openidm.action("iga/governance/requests", "POST", requestBody, {_action: "create"}) +} +catch (e) { +failureReason = "Unable to generate requests for roles"; +} +// Update event request as final +var decision = failureReason ? +{'status': 'complete', 'outcome': 'cancelled', 'decision': 'rejected', 'comment': failureReason, 'failure': true} : +{'status': 'complete', 'outcome': 'fulfilled', 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-birthright-roles-requiring-approval/steps/Look Up Roles and Request - scriptTask-792e240778b1/Look Up Roles and Request - scriptTask-792e240778b1.json 1`] = ` +{ + "displayName": "Look Up Roles and Request", + "name": "scriptTask-792e240778b1", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Look Up Roles and Request - scriptTask-792e240778b1.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-birthright-roles-requiring-approval/steps/Manager Approval - approvalTask-f4e7324654b5/Manager Approval - approvalTask-f4e7324654b5.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "(function() { +var content = execution.getVariables(); +var requestId = content.get('id'); +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var approverId = ''; +if (requestIndex.request.common.blob.after.manager) { approverId = requestIndex.request.common.blob.after.manager.id } +return [{ +"id": "managed/user/" + approverId, +"permissions": { +"approve": true, +"reject": true, +"reassign": true, +"modify": true, +"comment": true +} +}]; +})()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-792e240778b1", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-ad05a46c2e74", + }, + ], + }, + "displayName": "Manager Approval", + "name": "approvalTask-f4e7324654b5", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/phh-delegated-user-disable-workflow.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-delegated-user-disable-workflow", + "displayName": "phh-delegated-user-disable-workflow", + "id": "phhDelegatedUserDisableWorkflow", + "mutable": true, + "name": "phh-delegated-user-disable-workflow", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 1563, + "y": 352, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-3d854e98930e", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 50, + "y": 250, + }, + "uiConfig": { + "approvalTask-bebe49db4dac": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "type": "manager", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1177, + "y": 60.61250305175781, + }, + "exclusiveGateway-26e0a9262468": { + "x": 438.3999938964844, + "y": 232.6125030517578, + }, + "exclusiveGateway-d5b7b2e2a80a": { + "x": 931.7999877929688, + "y": 111.61250305175781, + }, + "scriptTask-38eb13f4deca": { + "x": 648.3999938964844, + "y": 343.6125030517578, + }, + "scriptTask-3d854e98930e": { + "x": 175.39999389648438, + "y": 251.6125030517578, + }, + "scriptTask-449aac6b18b8": { + "x": 1149.3999938964844, + "y": 236.6125030517578, + }, + "scriptTask-4f4b87291099": { + "x": 1442.9999694824219, + "y": 101.61250305175781, + }, + "scriptTask-8e24794e9be4": { + "x": 649.3999938964844, + "y": 132.6125030517578, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Auth Check - exclusiveGateway-26e0a9262468/Auth Check - exclusiveGateway-26e0a9262468.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Auth Check - exclusiveGateway-26e0a9262468/Auth Check - exclusiveGateway-26e0a9262468.json 1`] = ` +{ + "displayName": "Auth Check", + "name": "exclusiveGateway-26e0a9262468", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "hasDelegationAuthority == true", + "outcome": "validationSuccess", + "step": "scriptTask-8e24794e9be4", + }, + { + "condition": "hasDelegationAuthority == false", + "outcome": "validationFailure", + "step": "scriptTask-38eb13f4deca", + }, + ], + "script": { + "file": "Auth Check - exclusiveGateway-26e0a9262468.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Auto-Reject - No Authority - scriptTask-38eb13f4deca/Auto-Reject - No Authority - scriptTask-38eb13f4deca.js 1`] = ` +"/* + * Auto-Reject - No Delegation Authority + * Rejects request if user has no direct reports + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); + +console.log("Auto-rejecting request " + requestId + " - no delegation authority"); + +try { + var decision = { + 'decision': 'rejected', + 'status': 'complete', + 'comment': 'Request automatically rejected: You do not have any direct reports in the system. You cannot submit delegation requests without having direct reports assigned to you.\\n\\nPlease contact your administrator if you believe this is an error.' + }; + + var updateParams = { + '_action': 'update' + }; + + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, updateParams); + + console.log("Request " + requestId + " rejected successfully"); + +} catch (e) { + console.log("Error rejecting request: " + e.message); + throw e; +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Auto-Reject - No Authority - scriptTask-38eb13f4deca/Auto-Reject - No Authority - scriptTask-38eb13f4deca.json 1`] = ` +{ + "displayName": "Auto-Reject - No Authority", + "name": "scriptTask-38eb13f4deca", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Auto-Reject - No Authority - scriptTask-38eb13f4deca.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Auto-Reject - Validation Failed - scriptTask-449aac6b18b8/Auto-Reject - Validation Failed - scriptTask-449aac6b18b8.js 1`] = ` +"/* + * Auto-Reject - Validation Failed + * Rejects request with detailed error messages + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); +var validationErrors = content.get('validationErrors') || "Validation failed"; + +console.log("Auto-rejecting request due to validation errors"); + +try { + var decision = { + 'decision': 'rejected', + 'status': 'complete', + 'comment': 'Request automatically rejected due to validation errors:\\n\\n' + validationErrors + '\\n\\nPlease correct the errors and submit a new request.' + }; + + var updateParams = { + '_action': 'update' + }; + + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, updateParams); + + console.log("Request " + requestId + " rejected - validation failed"); + +} catch (e) { + console.log("Error rejecting request: " + e.message); + throw e; +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Auto-Reject - Validation Failed - scriptTask-449aac6b18b8/Auto-Reject - Validation Failed - scriptTask-449aac6b18b8.json 1`] = ` +{ + "displayName": "Auto-Reject - Validation Failed", + "name": "scriptTask-449aac6b18b8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Auto-Reject - Validation Failed - scriptTask-449aac6b18b8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Disable User Account - scriptTask-4f4b87291099/Disable User Account - scriptTask-4f4b87291099.js 1`] = ` +"/* + * Fulfillment - Disable User Account + * Disables the target user's account + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); +var targetUserId = content.get('targetUserId'); +var justification = content.get('justification'); +var actingPrincipalUserName = content.get('actingPrincipalUserName'); + +console.log("=== Fulfillment Start ==="); +console.log("Disabling user ID: " + targetUserId); + +try { + // Read current user state + var targetUser = openidm.read("managed/alpha_user/" + targetUserId); + + if (!targetUser) { + throw new Error("Target user not found: " + targetUserId); + } + + console.log("Current user status: " + (targetUser.accountStatus || "active")); + + // Prepare patch operations to disable the account + var patchOperations = [ + { + "operation": "replace", + "field": "/accountStatus", + "value": "inactive" + } + ]; + + // Add a description/note about the disable action + if (targetUser.description) { + patchOperations.push({ + "operation": "replace", + "field": "/description", + "value": targetUser.description + "\\n[" + new Date().toISOString() + "] Disabled via delegation by " + actingPrincipalUserName + ". Reason: " + justification + }); + } else { + patchOperations.push({ + "operation": "add", + "field": "/description", + "value": "[" + new Date().toISOString() + "] Disabled via delegation by " + actingPrincipalUserName + ". Reason: " + justification + }); + } + + // Execute the patch + var updateResult = openidm.patch("managed/alpha_user/" + targetUserId, null, patchOperations); + + console.log("User " + targetUser.userName + " successfully disabled"); + console.log("Account status set to: inactive"); + + // Set success variables + execution.setVariable("fulfillmentStatus", "completed"); + execution.setVariable("fulfillmentMessage", "User account " + targetUser.userName + " has been successfully disabled"); + + // Update request with completion details + try { + var requestUpdate = { + 'status': 'complete', + 'decision': 'approved' + }; + + openidm.action('iga/governance/requests/' + requestId, 'POST', requestUpdate, {'_action': 'update'}); + } catch (updateError) { + console.log("Could not update request status: " + updateError.message); + } + +} catch (e) { + logger.error("Fulfillment error: " + e.message); + execution.setVariable("fulfillmentStatus", "failed"); + execution.setVariable("fulfillmentMessage", "Error disabling user: " + e.message); + + // Don't throw - let workflow complete but mark as failed + // You might want to send a notification here +} + +console.log("=== Fulfillment Complete ==="); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Disable User Account - scriptTask-4f4b87291099/Disable User Account - scriptTask-4f4b87291099.json 1`] = ` +{ + "displayName": "Disable User Account", + "name": "scriptTask-4f4b87291099", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Disable User Account - scriptTask-4f4b87291099.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Load Delegation Info - scriptTask-3d854e98930e/Load Delegation Info - scriptTask-3d854e98930e.js 1`] = ` +"/* + * Load Delegation Information + * Populates available direct reports for the requester + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); + +console.log("=== Load Delegation Info Start ==="); +console.log("Request ID: " + requestId); + +try { + // Get the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requesterId = requestObj.requester.id; + var requesterIdOnly = requesterId.replace("managed/user/", ""); + + console.log("Requester ID: " + requesterIdOnly); + + // Query users where current user is the manager + var queryParams = { + "_queryFilter": 'manager._id eq "' + requesterIdOnly + '"', + "_fields": "userName,givenName,sn,_id" + }; + + var results = openidm.query("managed/alpha_user", queryParams); + + // Build a formatted list for display + var directReportsList = ""; + var directReportsCount = 0; + + if (results.resultCount > 0) { + directReportsList = "You can act on behalf of the following users:\\n\\n"; + results.result.forEach(function(user) { + directReportsList += "• " + user.userName + " (" + user.givenName + " " + user.sn + ")\\n"; + }); + directReportsCount = results.resultCount; + logger.info("Found " + directReportsCount + " direct reports"); + } else { + directReportsList = "You do not have any direct reports in the system.\\n\\nYou cannot submit delegation requests without direct reports."; + logger.warn("No direct reports found"); + } + + // Store variables for later use + execution.setVariable("directReportsList", directReportsList); + execution.setVariable("directReportsCount", directReportsCount); + execution.setVariable("hasDelegationAuthority", directReportsCount > 0); + + // Update the request to populate the helper field + // This updates the form display for the user + var updatePayload = { + "request": { + "common": { + "blob": { + "form": { + "availableDirectReports": directReportsList + } + } + } + } + }; + + openidm.patch('iga/governance/requests/' + requestId, null, [ + { + "operation": "add", + "field": "/request/common/blob/form/availableDirectReports", + "value": directReportsList + } + ]); + + console.log("Direct reports list populated in form"); + +} catch (e) { + logger.error("Error loading delegation info: " + e.message); + execution.setVariable("hasDelegationAuthority", false); + execution.setVariable("directReportsCount", 0); + execution.setVariable("directReportsList", "Error loading your direct reports. Please contact your administrator."); +} + +console.log("=== Load Delegation Info Complete ==="); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Load Delegation Info - scriptTask-3d854e98930e/Load Delegation Info - scriptTask-3d854e98930e.json 1`] = ` +{ + "displayName": "Load Delegation Info", + "name": "scriptTask-3d854e98930e", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-26e0a9262468", + }, + ], + "script": { + "file": "Load Delegation Info - scriptTask-3d854e98930e.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Manager Approval - approvalTask-bebe49db4dac/Manager Approval - approvalTask-bebe49db4dac.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "doNothing", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-4f4b87291099", + }, + { + "condition": null, + "outcome": "REJECT", + "step": null, + }, + ], + }, + "displayName": "Manager Approval", + "name": "approvalTask-bebe49db4dac", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Validate Delegation Request - scriptTask-8e24794e9be4/Validate Delegation Request - scriptTask-8e24794e9be4.js 1`] = ` +"/* + * Validate Delegation Request + * Validates all user inputs and delegation authority + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); + +console.log("=== Validation Start ==="); + +var validationPassed = false; +var validationErrors = []; +var actingPrincipalObject = null; +var targetUserObject = null; + +try { + // Get request object with form data + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + var requesterId = requestObj.requester.id; + var requesterIdOnly = requesterId.replace("managed/user/", ""); + + // Extract form values + var actingPrincipalUsername = requestObj.request.common.blob.form.actingPrincipalId; + var targetUserUsername = requestObj.request.common.blob.form.targetUserId; + var justification = requestObj.request.common.blob.form.justification; + + console.log("Acting Principal Username: " + actingPrincipalUsername); + console.log("Target User Username: " + targetUserUsername); + + // Validate acting principal + if (!actingPrincipalUsername || actingPrincipalUsername.trim() === "") { + validationErrors.push("Acting Principal username is required"); + } else { + try { + var actingPrincipalQuery = { + "_queryFilter": 'userName eq "' + actingPrincipalUsername.trim() + '"' + }; + var actingPrincipalResults = openidm.query("managed/alpha_user", actingPrincipalQuery); + + if (actingPrincipalResults.resultCount === 0) { + validationErrors.push("Acting Principal user not found: " + actingPrincipalUsername); + } else if (actingPrincipalResults.resultCount > 1) { + validationErrors.push("Multiple users found with username: " + actingPrincipalUsername); + } else { + actingPrincipalObject = actingPrincipalResults.result[0]; + + // Verify requester is manager of acting principal + if (!actingPrincipalObject.manager || !actingPrincipalObject.manager._id) { + validationErrors.push("Acting Principal does not have a manager assigned"); + } else if (actingPrincipalObject.manager._id !== requesterIdOnly) { + validationErrors.push("You are not the manager of " + actingPrincipalUsername + ". You can only act on behalf of your direct reports."); + } else { + console.log("Acting Principal validated: " + actingPrincipalObject.userName); + } + } + } catch (e) { + validationErrors.push("Error validating Acting Principal: " + e.message); + } + } + + // Validate target user + if (!targetUserUsername || targetUserUsername.trim() === "") { + validationErrors.push("Target User username is required"); + } else { + try { + var targetUserQuery = { + "_queryFilter": 'userName eq "' + targetUserUsername.trim() + '"' + }; + var targetUserResults = openidm.query("managed/alpha_user", targetUserQuery); + + if (targetUserResults.resultCount === 0) { + validationErrors.push("Target User not found: " + targetUserUsername); + } else if (targetUserResults.resultCount > 1) { + validationErrors.push("Multiple users found with username: " + targetUserUsername); + } else { + targetUserObject = targetUserResults.result[0]; + + // Verify user type is External + if (targetUserObject.userType !== "External") { + validationErrors.push("Target User must be of type 'External'. User " + targetUserUsername + " is type: " + (targetUserObject.userType || "Unknown")); + } else { + console.log("Target User validated: " + targetUserObject.userName); + } + } + } catch (e) { + validationErrors.push("Error validating Target User: " + e.message); + } + } + + // Validate justification + if (!justification || justification.trim() === "") { + validationErrors.push("Justification is required"); + } else if (justification.trim().length < 10) { + validationErrors.push("Justification must be at least 10 characters"); + } + + // Prevent self-disable via delegation + if (actingPrincipalObject && targetUserObject && actingPrincipalObject._id === targetUserObject._id) { + validationErrors.push("Cannot disable the same user you are acting on behalf of"); + } + + // Check if all validations passed + if (validationErrors.length === 0) { + validationPassed = true; + + // Store user details for display in approval + execution.setVariable("actingPrincipalUserName", actingPrincipalObject.userName); + execution.setVariable("actingPrincipalFullName", actingPrincipalObject.givenName + " " + actingPrincipalObject.sn); + execution.setVariable("actingPrincipalId", actingPrincipalObject._id); + + execution.setVariable("targetUserUserName", targetUserObject.userName); + execution.setVariable("targetUserFullName", targetUserObject.givenName + " " + targetUserObject.sn); + execution.setVariable("targetUserId", targetUserObject._id); + + execution.setVariable("justification", justification); + + console.log("All validations passed"); + } else { + console.log("Validation failed: " + validationErrors.join("; ")); + } + +} catch (e) { + validationPassed = false; + validationErrors.push("System error during validation: " + e.message); + console.log("Validation exception: " + e.message); +} + +// Set workflow variables +execution.setVariable("validationPassed", validationPassed); +execution.setVariable("validationErrors", validationErrors.join("\\n")); + +console.log("=== Validation Complete: " + (validationPassed ? "PASSED" : "FAILED") + " ==="); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Validate Delegation Request - scriptTask-8e24794e9be4/Validate Delegation Request - scriptTask-8e24794e9be4.json 1`] = ` +{ + "displayName": "Validate Delegation Request", + "name": "scriptTask-8e24794e9be4", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-d5b7b2e2a80a", + }, + ], + "script": { + "file": "Validate Delegation Request - scriptTask-8e24794e9be4.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Validation Passed%3F - exclusiveGateway-d5b7b2e2a80a/Validation Passed%3F - exclusiveGateway-d5b7b2e2a80a.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-delegated-user-disable-workflow/steps/Validation Passed%3F - exclusiveGateway-d5b7b2e2a80a/Validation Passed%3F - exclusiveGateway-d5b7b2e2a80a.json 1`] = ` +{ + "displayName": "Validation Passed?", + "name": "exclusiveGateway-d5b7b2e2a80a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "validationPassed == true", + "outcome": "validationSuccess", + "step": "approvalTask-bebe49db4dac", + }, + { + "condition": "validationPassed == false", + "outcome": "validationFailure", + "step": "scriptTask-449aac6b18b8", + }, + ], + "script": { + "file": "Validation Passed%3F - exclusiveGateway-d5b7b2e2a80a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-ne-disable/phh-ne-disable.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-ne-disable", + "displayName": "phh-ne-disable", + "id": "phhNeDisable", + "mutable": true, + "name": "phh-ne-disable", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 601, + "y": 255, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-99fdf317c49b", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 50, + "y": 250, + }, + "uiConfig": { + "scriptTask-99fdf317c49b": { + "x": 270.3999938964844, + "y": 250.6125030517578, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-ne-disable/steps/Load Delegate Sources - scriptTask-99fdf317c49b/Load Delegate Sources - scriptTask-99fdf317c49b.js 1`] = ` +"/* + * Load Delegate Sources + * Queries users the current requester can act on behalf of + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); + +try { + // Get the request to find requester + var requestObj = openidm.read('iga/governance/requests/' + requestId); + var requesterId = requestObj.requester.id; + var requesterIdOnly = requesterId.replace("managed/user/", ""); + + console.log("=== Loading Delegation Options ==="); + console.log("Requester ID: " + requesterIdOnly); + + // Query users where current user is the manager + var queryParams = { + "_queryFilter": 'manager._id eq "' + requesterIdOnly + '"', + "_fields": "userName,givenName,sn,mail,_id" + }; + + var results = openidm.query("managed/alpha_user", queryParams); + console.log("Results: " + results); + + // Build options array + var options = []; + + if (results.resultCount > 0) { + results.result.forEach(function(user) { + options.push({ + "value": user._id, + "label": user.givenName + " " + user.sn + " (" + user.userName + ")" + }); + }); + + logger.info("Found " + options.length + " delegation options"); + } else { + logger.warn("No direct reports found for requester"); + options.push({ + "value": "", + "label": "No direct reports found" + }); + } + + // Store options as JSON string + execution.setVariable("delegationOptions", JSON.stringify(options)); + execution.setVariable("hasDelegationOptions", results.resultCount > 0); + execution.setVariable("delegationOptionsCount", results.resultCount); + +} catch (e) { + logger.error("Error loading delegation options: " + e.message); + execution.setVariable("delegationOptions", "[]"); + execution.setVariable("hasDelegationOptions", false); + execution.setVariable("delegationOptionsCount", 0); +} + +logger.info("=== Delegation Options Loaded ==="); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-ne-disable/steps/Load Delegate Sources - scriptTask-99fdf317c49b/Load Delegate Sources - scriptTask-99fdf317c49b.json 1`] = ` +{ + "displayName": "Load Delegate Sources", + "name": "scriptTask-99fdf317c49b", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Load Delegate Sources - scriptTask-99fdf317c49b.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/phh-new-user-create.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-new-user-create", + "displayName": "phh-new-user-create", + "id": "phhNewUserCreate", + "mutable": true, + "name": "phh-new-user-create", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1348, + "y": 177.5, + }, + "startNode": { + "connections": { + "start": "scriptTask-4e9121fe850a", + }, + "id": "startNode", + "x": 70, + "y": 177.5, + }, + "uiConfig": { + "approvalTask-75cf4247ba1d": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 777, + "y": 226, + }, + "exclusiveGateway-621c9996676a": { + "x": 514, + "y": 153, + }, + "scriptTask-0e5b6187ea62": { + "x": 777, + "y": 80, + }, + "scriptTask-4e9121fe850a": { + "x": 210, + "y": 179.5, + }, + "scriptTask-626899b6e99a": { + "x": 1049, + "y": 97.66666666666667, + }, + "scriptTask-c58309b8c470": { + "x": 1049, + "y": 234.83333333333334, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/Approval Task - approvalTask-75cf4247ba1d/Approval Task - approvalTask-75cf4247ba1d.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-626899b6e99a", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-75cf4247ba1d", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-621c9996676a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-75cf4247ba1d", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-621c9996676a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-c58309b8c470", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-c58309b8c470.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if (skipApproval) { + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-0e5b6187ea62", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-626899b6e99a", + }, + ], + "script": { + "file": "Request Approved - scriptTask-0e5b6187ea62.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-4e9121fe850a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-621c9996676a", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-4e9121fe850a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/User Create Validation - scriptTask-626899b6e99a/User Create Validation - scriptTask-626899b6e99a.js 1`] = ` +"logger.info("[phh] Creating User"); +function generateUsername(givenName, surname) { +const usernamePrefix = (givenName[0] + surname[0]).toLowerCase(); +const data = openidm.query("managed/alpha_user", {'_queryFilter': \`userName sw "\${usernamePrefix}"\`}, ["userName"]); +const usernames = data.result.map(user => user.userName); +let i = 1; +while (i<100000 && usernames.includes(usernamePrefix + String(i).padStart(5, '0'))) { +i++; +} +return usernamePrefix + String(i).padStart(5, '0'); +} +function createUser(custom) { +var startDate = new Date(custom.startDate).toISOString(); +var endDate = new Date(custom.endDate).toISOString(); +var payload = { +"userName": custom.userName, +"givenName": custom.givenName, +"sn": custom.sn, +"mail": custom.mail, +"password": custom.password, +"frIndexedDate5":startDate, +"frIndexedDate4":endDate +}; +return openidm.create('managed/alpha_user', null, payload); +} +function process(requestObj) { +var custom = requestObj.request.custom +custom.userName = generateUsername(custom.givenName, custom.sn); +custom.password = 'Password!234'; +const result = createUser(custom); +return { outcome: "provisioned" }; +} +try { +const requestId = execution.getVariables().get("id"); +const requestObj = openidm.action(\`iga/governance/requests/\${requestId}\`, "GET", {}, {}); +let decision = { status: "complete", "decision": "approved" }; +try { +const result = process(requestObj); +Object.assign(decision, result); +} catch (error) { +Object.assign(decision, { outcome: "unknown", comment: \`Error processing request \${requestId}: \${e.message}\`, failure: true }); +} +openidm.action(\`iga/governance/requests/\${requestId}\`, 'POST', decision, { _action: "update"}); +} catch (e) { +logger.error(\`Error reading request \${requestId}: \${e}\`); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phh-new-user-create/steps/User Create Validation - scriptTask-626899b6e99a/User Create Validation - scriptTask-626899b6e99a.json 1`] = ` +{ + "displayName": "User Create Validation", + "name": "scriptTask-626899b6e99a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "User Create Validation - scriptTask-626899b6e99a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhCustomWorkflow/phhCustomWorkflow.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "phhCustomWorkflow", + "displayName": "phhCustomWorkflow", + "id": "phhCustomWorkflow", + "mutable": true, + "name": "phhCustomWorkflow", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 955, + "y": 174, + }, + "startNode": { + "connections": { + "start": "scriptTask-4e9121fe850a", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 448, + "y": 124, + }, + "scriptTask-0e5b6187ea62": { + "x": 683, + "y": 128.015625, + }, + "scriptTask-4e9121fe850a": { + "x": 168, + "y": 140.015625, + }, + "scriptTask-c58309b8c470": { + "x": 688, + "y": 207, + }, + }, + }, + "status": "draft", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhCustomWorkflow/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhCustomWorkflow/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhCustomWorkflow/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-c58309b8c470", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-c58309b8c470.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhCustomWorkflow/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if (skipApproval) { + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhCustomWorkflow/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-0e5b6187ea62", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Request Approved - scriptTask-0e5b6187ea62.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhCustomWorkflow/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhCustomWorkflow/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-4e9121fe850a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-4e9121fe850a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhFlow/phhFlow.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phhFlow", + "displayName": "phhFlow", + "id": "phhFlow", + "mutable": true, + "name": "phhFlow", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 564, + "y": 312, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-10bf48033687", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 50, + "y": 250, + }, + "uiConfig": { + "approvalTask-bf52ce203a81": { + "actors": { + "isExpression": true, + "value": " +//Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + + + return [{ + "id": "managed/user/" + requestIndex.applicationOwner[0].id, + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})() + + + +( +function(){ +// --- Log comment to request audit trail --- + try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var logComment = "Context Check" + + " | applicationOwner: " + requestObj.applicationOwner[0].id + + " | full dump: " + JSON.stringify(requestObj); + + + openidm.action( + 'iga/governance/requests/' + requestId, + 'POST', + { 'comment': logComment }, + { '_action': 'update' } + ); + } catch (e) { + logger.error("Failed to write log comment: " + e.message); + } + return []; +} +)() +", + }, + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 153.39999389648438, + "y": 268.6125030517578, + }, + "scriptTask-10bf48033687": { + "x": 162.39999389648438, + "y": 140.6125030517578, + }, + "scriptTask-610744f7d369": { + "x": 357.3999938964844, + "y": 370.6125030517578, + }, + "scriptTask-c28119ea007e": { + "x": 360.3999938964844, + "y": 256.6125030517578, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhFlow/steps/Approval Task - approvalTask-bf52ce203a81/Approval Task - approvalTask-bf52ce203a81.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": " +//Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + + + return [{ + "id": "managed/user/" + requestIndex.applicationOwner[0].id, + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})() + + + +( +function(){ +// --- Log comment to request audit trail --- + try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var logComment = "Context Check" + + " | applicationOwner: " + requestObj.applicationOwner[0].id + + " | full dump: " + JSON.stringify(requestObj); + + + openidm.action( + 'iga/governance/requests/' + requestId, + 'POST', + { 'comment': logComment }, + { '_action': 'update' } + ); + } catch (e) { + logger.error("Failed to write log comment: " + e.message); + } + return []; +} +)() +", + }, + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-c28119ea007e", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-610744f7d369", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-bf52ce203a81", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhFlow/steps/Approve - scriptTask-c28119ea007e/Approve - scriptTask-c28119ea007e.js 1`] = ` +"logger.info("Approving request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +logger.info("Execution Content: " + content); +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhFlow/steps/Approve - scriptTask-c28119ea007e/Approve - scriptTask-c28119ea007e.json 1`] = ` +{ + "displayName": "Approve", + "name": "scriptTask-c28119ea007e", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Approve - scriptTask-c28119ea007e.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhFlow/steps/Context Check - scriptTask-10bf48033687/Context Check - scriptTask-10bf48033687.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + } + // --- Log comment to request audit trail --- + try { + var logComment = "Context Check" + + " | full dump: " + JSON.stringify(requestObj); + + + openidm.action( + 'iga/governance/requests/' + requestId, + 'POST', + { 'comment': logComment }, + { '_action': 'update' } + ); + } catch (e) { + logger.error("Failed to write log comment: " + e.message); + } +} +catch (e) { + logger.info("Request Context Check failed "+e.message); +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhFlow/steps/Context Check - scriptTask-10bf48033687/Context Check - scriptTask-10bf48033687.json 1`] = ` +{ + "displayName": "Context Check", + "name": "scriptTask-10bf48033687", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "approvalTask-bf52ce203a81", + }, + ], + "script": { + "file": "Context Check - scriptTask-10bf48033687.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhFlow/steps/Script Task - scriptTask-610744f7d369/Script Task - scriptTask-610744f7d369.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +logger.info("Execution Content: " + content); +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/phhFlow/steps/Script Task - scriptTask-610744f7d369/Script Task - scriptTask-610744f7d369.json 1`] = ` +{ + "displayName": "Script Task", + "name": "scriptTask-610744f7d369", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Script Task - scriptTask-610744f7d369.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test/steps/Wait Task - waitTask-4d9223fb79c5/Wait Task - waitTask-4d9223fb79c5.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-4d9223fb79c5", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": null, + }, + ], + "resumeDate": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(1*30*24*60*60*1000))).toISOString()", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test/test.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "test", + "displayName": "test", + "id": "test", + "mutable": true, + "name": "test", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 500, + "y": 50, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "waitTask-4d9223fb79c5", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 50, + "y": 250, + }, + "uiConfig": { + "waitTask-4d9223fb79c5": { + "events": { + "resumeDateNumber": 1, + "resumeDateTimeSpan": "month(s)", + "resumeDateType": "duration", + }, + "x": 285.3999938964844, + "y": 211.22499084472656, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Approval Task - approvalTask-7e33e73d6763/Custom Approval Task - approvalTask-7e33e73d6763.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate1", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate1", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "content.customExpirationDuration", + }, + "notification": "FrodoTestEmailTemplate1", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate1", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(4*30*24*60*60*1000))).toISOString()", + }, + "frequency": 4, + "notification": "FrodoTestEmailTemplate1", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "fulfillmentTask-7fce35a32915", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "displayName": "Custom Approval Task", + "name": "approvalTask-7e33e73d6763", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Approval Task 2 - approvalTask-363e32acf981/Custom Approval Task 2 - approvalTask-363e32acf981.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "fulfillmentTask-29a71d4ab8ed", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "displayName": "Custom Approval Task 2", + "name": "approvalTask-363e32acf981", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Email Task - emailTask-2068f5d711c8/Custom Email Task - emailTask-2068f5d711c8.json 1`] = ` +{ + "displayName": "Custom Email Task", + "emailTask": { + "bcc": { + "isExpression": true, + "value": "// This is the bcc script +"bcc@email.com";", + }, + "cc": { + "isExpression": true, + "value": "// This is the cc script +"cc@email.com";", + }, + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": "waitTask-b7fc169ca4eb", + }, + { + "condition": null, + "outcome": "FAILED", + "step": "violationTask-50261d9bc712", + }, + ], + "object": { + "hello": "goodbye", + "hi": "hola", + }, + "templateName": "frodoTestEmailTemplateFour", + "to": { + "isExpression": true, + "value": "// This is the to script +"to@email.com";", + }, + }, + "name": "emailTask-2068f5d711c8", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Email Task 2 - emailTask-881f2975e240/Custom Email Task 2 - emailTask-881f2975e240.json 1`] = ` +{ + "displayName": "Custom Email Task 2", + "emailTask": { + "bcc": "bcc@email.com", + "cc": "cc@email.com", + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": "waitTask-72d593301121", + }, + { + "condition": null, + "outcome": "FAILED", + "step": "violationTask-50261d9bc712", + }, + ], + "object": {}, + "templateName": "frodoTestEmailTemplateFour", + "to": "to@email.com", + }, + "name": "emailTask-881f2975e240", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Fulfillment Task - fulfillmentTask-7fce35a32915/Custom Fulfillment Task - fulfillmentTask-7fce35a32915.json 1`] = ` +{ + "displayName": "Custom Fulfillment Task", + "fulfillmentTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate2", + }, + "escalation": { + "actors": [ + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate2", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "FrodoTestEmailTemplate2", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate2", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(2*30*24*60*60*1000))).toISOString()", + }, + "frequency": 2, + "notification": "FrodoTestEmailTemplate2", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "exclusiveGateway-94bc3d35f3b4", + }, + { + "condition": null, + "outcome": "DENY", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "name": "fulfillmentTask-7fce35a32915", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Fulfillment Task 2 - fulfillmentTask-29a71d4ab8ed/Custom Fulfillment Task 2 - fulfillmentTask-29a71d4ab8ed.json 1`] = ` +{ + "displayName": "Custom Fulfillment Task 2", + "fulfillmentTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "content.customExpirationDate", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "emailTask-881f2975e240", + }, + { + "condition": null, + "outcome": "DENY", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "name": "fulfillmentTask-29a71d4ab8ed", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.json 1`] = ` +{ + "displayName": "Custom Inclusive Gateway", + "name": "inclusiveGateway-a6cf9605ce55", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "// This is outcome 1 +outcome === 1", + "outcome": "outcomeOne", + "step": "scriptTask-493f5ea87636", + }, + { + "condition": "// This is outcome 2 +outcome === 2", + "outcome": "outcomeTwo", + "step": "scriptTask-493f5ea87636", + }, + { + "condition": "// This is outcome 3 +outcome === 3", + "outcome": "outcomeThree", + "step": "violationTask-50261d9bc712", + }, + ], + "script": { + "file": "Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Script Task - scriptTask-493f5ea87636/Custom Script Task - scriptTask-493f5ea87636.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Script Task - scriptTask-493f5ea87636/Custom Script Task - scriptTask-493f5ea87636.json 1`] = ` +{ + "displayName": "Custom Script Task", + "name": "scriptTask-493f5ea87636", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "emailTask-2068f5d711c8", + }, + ], + "script": { + "file": "Custom Script Task - scriptTask-493f5ea87636.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.json 1`] = ` +{ + "displayName": "Custom Validation Gateway", + "name": "exclusiveGateway-94bc3d35f3b4", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "// This is a validation success +outcome == true", + "outcome": "validationSuccess", + "step": "inclusiveGateway-a6cf9605ce55", + }, + { + "condition": "// This is a validation failure +outcome == false", + "outcome": "validationFailure", + "step": "violationTask-50261d9bc712", + }, + ], + "script": { + "file": "Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Violation Task - violationTask-50261d9bc712/Custom Violation Task - violationTask-50261d9bc712.json 1`] = ` +{ + "displayName": "Custom Violation Task", + "name": "violationTask-50261d9bc712", + "type": "violationTask", + "violationTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate3", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*7*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate3", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(8*30*24*60*60*1000))).toISOString()", + }, + "notification": "FrodoTestEmailTemplate3", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate3", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "FrodoTestEmailTemplate3", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": null, + }, + { + "condition": null, + "outcome": "ALLOW", + "step": null, + }, + { + "condition": null, + "outcome": "EXPIRATION", + "step": "approvalTask-7e33e73d6763", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Violation Task 2 - violationTask-f8066518b46a/Custom Violation Task 2 - violationTask-f8066518b46a.json 1`] = ` +{ + "displayName": "Custom Violation Task 2", + "name": "violationTask-f8066518b46a", + "type": "violationTask", + "violationTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "approvalMode": "any", + "events": {}, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": null, + }, + { + "condition": null, + "outcome": "ALLOW", + "step": null, + }, + { + "condition": null, + "outcome": "EXPIRATION", + "step": "approvalTask-7e33e73d6763", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Wait Task - waitTask-b7fc169ca4eb/Custom Wait Task - waitTask-b7fc169ca4eb.json 1`] = ` +{ + "displayName": "Custom Wait Task", + "name": "waitTask-b7fc169ca4eb", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "approvalTask-363e32acf981", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*30*24*60*60*1000))).toISOString()", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Wait Task 2 - waitTask-72d593301121/Custom Wait Task 2 - waitTask-72d593301121.json 1`] = ` +{ + "displayName": "Custom Wait Task 2", + "name": "waitTask-72d593301121", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "waitTask-b343cc7df7c9", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/steps/Custom Wait Task 3 - waitTask-b343cc7df7c9/Custom Wait Task 3 - waitTask-b343cc7df7c9.json 1`] = ` +{ + "displayName": "Custom Wait Task 3", + "name": "waitTask-b343cc7df7c9", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "violationTask-f8066518b46a", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "content.get('resumeDate')", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_1/test_workflow_1.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "test_workflow_1", + "displayName": "test_workflow_1", + "id": "testWorkflow1", + "mutable": true, + "name": "test_workflow_1", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 826, + "y": 50, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "approvalTask-7e33e73d6763", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 20, + "y": 42, + }, + "uiConfig": { + "approvalTask-363e32acf981": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + { + "id": { + "isExpression": false, + "value": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + }, + "type": "role", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "type": "manager", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "type": "roleOwner", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 478.3999938964844, + "y": 195.6125030517578, + }, + "approvalTask-7e33e73d6763": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "variable", + "expirationDateVariable": "customExpirationDuration", + "expirationTimeSpan": "hour(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "reminderDate": 4, + "reminderTimeSpan": "month(s)", + }, + "x": 146.39999389648438, + "y": 15.61250305175781, + }, + "emailTask-2068f5d711c8": { + "x": 150.39999389648438, + "y": 648.812502861023, + }, + "emailTask-881f2975e240": { + "x": 478.3999938964844, + "y": 474.41250228881836, + }, + "exclusiveGateway-94bc3d35f3b4": { + "x": 145.39999389648438, + "y": 274.6125030517578, + }, + "fulfillmentTask-29a71d4ab8ed": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "variable", + "expirationDateVariable": "customExpirationDate", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 479.3999938964844, + "y": 334.41250228881836, + }, + "fulfillmentTask-7fce35a32915": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "hour(s)", + "escalationType": "applicationOwner", + "expirationDate": 8, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "month(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "reminderDate": 2, + "reminderTimeSpan": "month(s)", + }, + "x": 145.39999389648438, + "y": 146.6125030517578, + }, + "inclusiveGateway-a6cf9605ce55": { + "x": 147.39999389648438, + "y": 405.6125030517578, + }, + "scriptTask-493f5ea87636": { + "x": 148.39999389648438, + "y": 570.6125030517578, + }, + "violationTask-50261d9bc712": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "week(s)", + "escalationType": "applicationOwner", + "expirationDate": 8, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "month(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "reminderDate": 3, + "reminderTimeSpan": "hour(s)", + }, + "x": 480.3999938964844, + "y": 13.61250305175781, + }, + "violationTask-f8066518b46a": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationType": "applicationOwner", + "expirationDateType": "variable", + "expirationDateVariable": "taskExpirationDate", + "reassignedActors": [], + }, + "x": 788.3999938964844, + "y": 613.4125022888184, + }, + "waitTask-72d593301121": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 476.3999938964844, + "y": 612.4125022888184, + }, + "waitTask-b343cc7df7c9": { + "events": { + "resumeDateNumber": 1, + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "variable", + "resumeDateVariable": "resumeDate", + }, + "x": 476.3999938964844, + "y": 694.4125022888184, + }, + "waitTask-b7fc169ca4eb": { + "events": { + "resumeDateNumber": 5, + "resumeDateTimeSpan": "month(s)", + "resumeDateType": "duration", + }, + "x": 148.39999389648438, + "y": 779.812502861023, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Approval Task - approvalTask-7e33e73d6763/Custom Approval Task - approvalTask-7e33e73d6763.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate1", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate1", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "content.customExpirationDuration", + }, + "notification": "FrodoTestEmailTemplate1", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate1", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(4*30*24*60*60*1000))).toISOString()", + }, + "frequency": 4, + "notification": "FrodoTestEmailTemplate1", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "fulfillmentTask-7fce35a32915", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "displayName": "Custom Approval Task", + "name": "approvalTask-7e33e73d6763", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Approval Task 2 - approvalTask-363e32acf981/Custom Approval Task 2 - approvalTask-363e32acf981.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "fulfillmentTask-29a71d4ab8ed", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "displayName": "Custom Approval Task 2", + "name": "approvalTask-363e32acf981", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Email Task - emailTask-2068f5d711c8/Custom Email Task - emailTask-2068f5d711c8.json 1`] = ` +{ + "displayName": "Custom Email Task", + "emailTask": { + "bcc": { + "isExpression": true, + "value": "// This is the bcc script +"bcc@email.com";", + }, + "cc": { + "isExpression": true, + "value": "// This is the cc script +"cc@email.com";", + }, + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": "waitTask-b7fc169ca4eb", + }, + { + "condition": null, + "outcome": "FAILED", + "step": "violationTask-50261d9bc712", + }, + ], + "object": { + "hello": "goodbye", + "hi": "hola", + }, + "templateName": "frodoTestEmailTemplateFour", + "to": { + "isExpression": true, + "value": "// This is the to script +"to@email.com";", + }, + }, + "name": "emailTask-2068f5d711c8", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Email Task 2 - emailTask-881f2975e240/Custom Email Task 2 - emailTask-881f2975e240.json 1`] = ` +{ + "displayName": "Custom Email Task 2", + "emailTask": { + "bcc": "bcc@email.com", + "cc": "cc@email.com", + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": "waitTask-72d593301121", + }, + { + "condition": null, + "outcome": "FAILED", + "step": "violationTask-50261d9bc712", + }, + ], + "object": {}, + "templateName": "frodoTestEmailTemplateFour", + "to": "to@email.com", + }, + "name": "emailTask-881f2975e240", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Fulfillment Task - fulfillmentTask-7fce35a32915/Custom Fulfillment Task - fulfillmentTask-7fce35a32915.json 1`] = ` +{ + "displayName": "Custom Fulfillment Task", + "fulfillmentTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate2", + }, + "escalation": { + "actors": [ + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate2", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "FrodoTestEmailTemplate2", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate2", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(2*30*24*60*60*1000))).toISOString()", + }, + "frequency": 2, + "notification": "FrodoTestEmailTemplate2", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "exclusiveGateway-94bc3d35f3b4", + }, + { + "condition": null, + "outcome": "DENY", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "name": "fulfillmentTask-7fce35a32915", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Fulfillment Task 2 - fulfillmentTask-29a71d4ab8ed/Custom Fulfillment Task 2 - fulfillmentTask-29a71d4ab8ed.json 1`] = ` +{ + "displayName": "Custom Fulfillment Task 2", + "fulfillmentTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "content.customExpirationDate", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "emailTask-881f2975e240", + }, + { + "condition": null, + "outcome": "DENY", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "name": "fulfillmentTask-29a71d4ab8ed", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.json 1`] = ` +{ + "displayName": "Custom Inclusive Gateway", + "name": "inclusiveGateway-a6cf9605ce55", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "// This is outcome 1 +outcome === 1", + "outcome": "outcomeOne", + "step": "scriptTask-493f5ea87636", + }, + { + "condition": "// This is outcome 2 +outcome === 2", + "outcome": "outcomeTwo", + "step": "scriptTask-493f5ea87636", + }, + { + "condition": "// This is outcome 3 +outcome === 3", + "outcome": "outcomeThree", + "step": "violationTask-50261d9bc712", + }, + ], + "script": { + "file": "Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Script Task - scriptTask-493f5ea87636/Custom Script Task - scriptTask-493f5ea87636.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Script Task - scriptTask-493f5ea87636/Custom Script Task - scriptTask-493f5ea87636.json 1`] = ` +{ + "displayName": "Custom Script Task", + "name": "scriptTask-493f5ea87636", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "emailTask-2068f5d711c8", + }, + ], + "script": { + "file": "Custom Script Task - scriptTask-493f5ea87636.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.json 1`] = ` +{ + "displayName": "Custom Validation Gateway", + "name": "exclusiveGateway-94bc3d35f3b4", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "// This is a validation success +outcome == true", + "outcome": "validationSuccess", + "step": "inclusiveGateway-a6cf9605ce55", + }, + { + "condition": "// This is a validation failure +outcome == false", + "outcome": "validationFailure", + "step": "violationTask-50261d9bc712", + }, + ], + "script": { + "file": "Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Violation Task - violationTask-50261d9bc712/Custom Violation Task - violationTask-50261d9bc712.json 1`] = ` +{ + "displayName": "Custom Violation Task", + "name": "violationTask-50261d9bc712", + "type": "violationTask", + "violationTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate3", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*7*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate3", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(8*30*24*60*60*1000))).toISOString()", + }, + "notification": "FrodoTestEmailTemplate3", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate3", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "FrodoTestEmailTemplate3", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": null, + }, + { + "condition": null, + "outcome": "ALLOW", + "step": null, + }, + { + "condition": null, + "outcome": "EXPIRATION", + "step": "approvalTask-7e33e73d6763", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Violation Task 2 - violationTask-f8066518b46a/Custom Violation Task 2 - violationTask-f8066518b46a.json 1`] = ` +{ + "displayName": "Custom Violation Task 2", + "name": "violationTask-f8066518b46a", + "type": "violationTask", + "violationTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "approvalMode": "any", + "events": {}, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": null, + }, + { + "condition": null, + "outcome": "ALLOW", + "step": null, + }, + { + "condition": null, + "outcome": "EXPIRATION", + "step": "approvalTask-7e33e73d6763", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Wait Task - waitTask-b7fc169ca4eb/Custom Wait Task - waitTask-b7fc169ca4eb.json 1`] = ` +{ + "displayName": "Custom Wait Task", + "name": "waitTask-b7fc169ca4eb", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "approvalTask-363e32acf981", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*30*24*60*60*1000))).toISOString()", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Wait Task 2 - waitTask-72d593301121/Custom Wait Task 2 - waitTask-72d593301121.json 1`] = ` +{ + "displayName": "Custom Wait Task 2", + "name": "waitTask-72d593301121", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "waitTask-b343cc7df7c9", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/steps/Custom Wait Task 3 - waitTask-b343cc7df7c9/Custom Wait Task 3 - waitTask-b343cc7df7c9.json 1`] = ` +{ + "displayName": "Custom Wait Task 3", + "name": "waitTask-b343cc7df7c9", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "violationTask-f8066518b46a", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "content.get('resumeDate')", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/test_workflow_4/test_workflow_4.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "test_workflow_4", + "displayName": "test_workflow_4", + "id": "testWorkflow4", + "mutable": true, + "name": "test_workflow_4", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 826, + "y": 50, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "approvalTask-7e33e73d6763", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 20, + "y": 42, + }, + "uiConfig": { + "approvalTask-363e32acf981": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + { + "id": { + "isExpression": false, + "value": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + }, + "type": "role", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "type": "manager", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "type": "roleOwner", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 478.3999938964844, + "y": 195.6125030517578, + }, + "approvalTask-7e33e73d6763": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "variable", + "expirationDateVariable": "customExpirationDuration", + "expirationTimeSpan": "hour(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "reminderDate": 4, + "reminderTimeSpan": "month(s)", + }, + "x": 146.39999389648438, + "y": 15.61250305175781, + }, + "emailTask-2068f5d711c8": { + "x": 150.39999389648438, + "y": 648.812502861023, + }, + "emailTask-881f2975e240": { + "x": 478.3999938964844, + "y": 474.41250228881836, + }, + "exclusiveGateway-94bc3d35f3b4": { + "x": 145.39999389648438, + "y": 274.6125030517578, + }, + "fulfillmentTask-29a71d4ab8ed": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "variable", + "expirationDateVariable": "customExpirationDate", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 479.3999938964844, + "y": 334.41250228881836, + }, + "fulfillmentTask-7fce35a32915": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "hour(s)", + "escalationType": "applicationOwner", + "expirationDate": 8, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "month(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "reminderDate": 2, + "reminderTimeSpan": "month(s)", + }, + "x": 145.39999389648438, + "y": 146.6125030517578, + }, + "inclusiveGateway-a6cf9605ce55": { + "x": 147.39999389648438, + "y": 405.6125030517578, + }, + "scriptTask-493f5ea87636": { + "x": 148.39999389648438, + "y": 570.6125030517578, + }, + "violationTask-50261d9bc712": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "week(s)", + "escalationType": "applicationOwner", + "expirationDate": 8, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "month(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "reminderDate": 3, + "reminderTimeSpan": "hour(s)", + }, + "x": 480.3999938964844, + "y": 13.61250305175781, + }, + "violationTask-f8066518b46a": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationType": "applicationOwner", + "expirationDateType": "variable", + "expirationDateVariable": "taskExpirationDate", + "reassignedActors": [], + }, + "x": 788.3999938964844, + "y": 613.4125022888184, + }, + "waitTask-72d593301121": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 476.3999938964844, + "y": 612.4125022888184, + }, + "waitTask-b343cc7df7c9": { + "events": { + "resumeDateNumber": 1, + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "variable", + "resumeDateVariable": "resumeDate", + }, + "x": 476.3999938964844, + "y": 694.4125022888184, + }, + "waitTask-b7fc169ca4eb": { + "events": { + "resumeDateNumber": 5, + "resumeDateTimeSpan": "month(s)", + "resumeDateType": "duration", + }, + "x": 148.39999389648438, + "y": 779.812502861023, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Approval Task - approvalTask-63163dc11c1f/Approval Task - approvalTask-63163dc11c1f.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.entitlementOwner[0].id ? "managed/user/" + requestIndex.entitlementOwner[0].id : "managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/034484bf-1448-40b8-bdfa-56990ef0cc30", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [ + { + "id": "managed/user/034484bf-1448-40b8-bdfa-56990ef0cc30", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "frequency": 7, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-5106f7a29d86", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-63163dc11c1f", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Auto Approval - scriptTask-e21178ab80f7/Auto Approval - scriptTask-e21178ab80f7.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ +var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var lineItemId = content.get('lineItemId'); +var queryParams = { + "_action": "update" +} +var lineItemParams = { + "_action": "updateRemediationStatus" +} +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to request context: " + context + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); + + +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Auto Approval - scriptTask-e21178ab80f7/Auto Approval - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Auto Approval", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Auto Approval - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Auto Provisioning - scriptTask-0359a9d77ee2/Auto Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Auto-Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + } + catch (e) { + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + e.message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Auto Provisioning - scriptTask-0359a9d77ee2/Auto Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Auto Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Auto Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-63163dc11c1f", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + e.message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Entitlement Privileged - scriptTask-5106f7a29d86/Entitlement Privileged - scriptTask-5106f7a29d86.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var requestObj = null; +var entId = null; +var entGlossary = null; +var entPriv = null; + +//Check entitlement exists and grab entitlement info +try { + requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + entId = requestObj.assignment.id; +} +catch (e) { + logger.info("Validation failed: Error reading entitlement grant request with id " + requestId); +} +//Check glossary for entitlement exists and grab glossary info +try { + entGlossary = openidm.action('iga/governance/resource/' + entId + '/glossary', 'GET', {}, {}); + // Sets entPriv based on the glossary contents, if present, otherwise defaults to true + entPriv = (entGlossary.hasOwnProperty("isPrivileged")) ? entGlossary.isPrivileged : true; + //Sets entPriv based on glossary contents, if present, otherwise defaults to false + //entPriv = !!entGlossary.isPrivileged; + execution.setVariable("entPriv", entPriv); +} +catch (e) { + logger.info("Could not retrieve glossary with entId " + entId + " from entitlement grant request ID " + requestId); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Entitlement Privileged - scriptTask-5106f7a29d86/Entitlement Privileged - scriptTask-5106f7a29d86.json 1`] = ` +{ + "displayName": "Entitlement Privileged", + "name": "scriptTask-5106f7a29d86", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-bcb05a148971", + }, + ], + "script": { + "file": "Entitlement Privileged - scriptTask-5106f7a29d86.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Inclusive Gateway - inclusiveGateway-bcb05a148971/Inclusive Gateway - inclusiveGateway-bcb05a148971.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Inclusive Gateway - inclusiveGateway-bcb05a148971/Inclusive Gateway - inclusiveGateway-bcb05a148971.json 1`] = ` +{ + "displayName": "Inclusive Gateway", + "name": "inclusiveGateway-bcb05a148971", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "entPriv == true", + "outcome": "Privileged", + "step": "approvalTask-77691047b28d", + }, + { + "condition": "entPriv == false", + "outcome": "NotPrivileged", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Inclusive Gateway - inclusiveGateway-bcb05a148971.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Manager Approval - approvalTask-77691047b28d/Manager Approval - approvalTask-77691047b28d.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.user.manager._refResourceId", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/034484bf-1448-40b8-bdfa-56990ef0cc30", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [ + { + "id": "managed/user/034484bf-1448-40b8-bdfa-56990ef0cc30", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "frequency": 7, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-3eab1948f1ec", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Manager Approval", + "name": "approvalTask-77691047b28d", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +logger.info("Execution Content: " + content); +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ +var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var skipApproval = false; +var lineItemId = false; +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + lineItemId = requestObj.request.common.context.lineItemId; + if (context == 'admin') { + skipApproval = true; + } + } +} +catch (e) { + logger.info("Request Context Check failed "+e.message); +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("lineItemId", lineItemId); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-67a954f33919", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style": igaTestDir01/wfEntitlementExampleIsPrivileged/wfEntitlementExampleIsPrivileged.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "wfEntitlementExampleIsPrivileged", + "displayName": "wfEntitlementExampleIsPrivileged", + "id": "wfEntitlementExampleIsPrivileged", + "mutable": true, + "name": "wfEntitlementExampleIsPrivileged", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2262, + "y": 220, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 70, + "y": 176, + }, + "uiConfig": { + "approvalTask-63163dc11c1f": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.entitlementOwner[0].id ? "managed/user/" + requestIndex.entitlementOwner[0].id : "managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 722, + "y": 265, + }, + "approvalTask-77691047b28d": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.user.manager._refResourceId", + }, + "type": "manager", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1219, + "y": 273, + }, + "exclusiveGateway-48e748c42994": { + "x": 1917, + "y": 104, + }, + "exclusiveGateway-67a954f33919": { + "x": 462, + "y": 155, + }, + "inclusiveGateway-bcb05a148971": { + "x": 1216, + "y": 99, + }, + "scriptTask-0359a9d77ee2": { + "x": 1924, + "y": 258.6666666666667, + }, + "scriptTask-0b56191887de": { + "x": 1907, + "y": 367.33333333333337, + }, + "scriptTask-3eab1948f1ec": { + "x": 1532, + "y": 151.66666666666669, + }, + "scriptTask-5106f7a29d86": { + "x": 940, + "y": 210, + }, + "scriptTask-aec6c36b3a45": { + "x": 1567, + "y": 274.33333333333337, + }, + "scriptTask-e04f42607ba5": { + "x": 181, + "y": 178, + }, + "scriptTask-e21178ab80f7": { + "x": 724, + "y": 101, + }, + }, + }, + "status": "draft", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style" 1`] = `0`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style" 2`] = `""`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style" 3`] = ` +"Experimental feature in use: 'frodo config-manager pull iga-workflows'. This feature may change without notice. +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/BasicApplicationGrant.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "Basic request flow for granting a user an account in an application", + "displayName": "Basic Application Grant", + "id": "BasicApplicationGrant", + "mutable": false, + "name": "BasicApplicationGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2822, + "y": 352, + }, + "startNode": { + "connections": { + "start": "scriptTask-4e9121fe850a", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 682, + "y": 155, + }, + "exclusiveGateway-5167870154a9": { + "x": 1855, + "y": 84, + }, + "exclusiveGateway-621c9996676a": { + "x": 433, + "y": 117.015625, + }, + "inclusiveGateway-7d248125a9bd": { + "x": 2417, + "y": 43.015625, + }, + "inclusiveGateway-a71e67faaad1": { + "x": 1124, + "y": 93.015625, + }, + "scriptTask-0e5b6187ea62": { + "x": 889, + "y": 116.015625, + }, + "scriptTask-14acc58c28dd": { + "x": 2650, + "y": 85.015625, + }, + "scriptTask-3a74557440fb": { + "x": 2144, + "y": 62, + }, + "scriptTask-4e9121fe850a": { + "x": 168, + "y": 140.015625, + }, + "scriptTask-626899b6e99a": { + "x": 1549, + "y": 108, + }, + "scriptTask-744ef6a8b9a2": { + "x": 2151, + "y": 207.015625, + }, + "scriptTask-c58309b8c470": { + "x": 1554, + "y": 242, + }, + "waitTask-13cf96ebeb37": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + "resumeDateVariable": "startDate", + }, + "x": 1339, + "y": 85.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Application Grant Validation - scriptTask-626899b6e99a/Application Grant Validation - scriptTask-626899b6e99a.js 1`] = ` +"logger.info("Running application grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var app = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check the user does not already have application granted +// Note: this is done at request submission time as well, the following is an example of how to check user's accounts +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + failureReason = "Validation failed: User with id " + requestObj.user.id + " already has effective application " + applicationId; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check effective applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Application Grant Validation - scriptTask-626899b6e99a/Application Grant Validation - scriptTask-626899b6e99a.json 1`] = ` +{ + "displayName": "Application Grant Validation", + "name": "scriptTask-626899b6e99a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-5167870154a9", + }, + ], + "script": { + "file": "Application Grant Validation - scriptTask-626899b6e99a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Application Grant Validation Failure - scriptTask-744ef6a8b9a2/Application Grant Validation Failure - scriptTask-744ef6a8b9a2.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Application Grant Validation Failure - scriptTask-744ef6a8b9a2/Application Grant Validation Failure - scriptTask-744ef6a8b9a2.json 1`] = ` +{ + "displayName": "Application Grant Validation Failure", + "name": "scriptTask-744ef6a8b9a2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Application Grant Validation Failure - scriptTask-744ef6a8b9a2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-621c9996676a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-621c9996676a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Create Removal Request - scriptTask-14acc58c28dd/Create Removal Request - scriptTask-14acc58c28dd.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "applicationId": request.common.applicationId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/applicationRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.info("Create Removal Request failed to create request") + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Create Removal Request - scriptTask-14acc58c28dd/Create Removal Request - scriptTask-14acc58c28dd.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-14acc58c28dd", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-14acc58c28dd.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Has End Date - inclusiveGateway-7d248125a9bd/Has End Date - inclusiveGateway-7d248125a9bd.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Has End Date - inclusiveGateway-7d248125a9bd/Has End Date - inclusiveGateway-7d248125a9bd.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-7d248125a9bd", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-14acc58c28dd", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-7d248125a9bd.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Has Start Date - inclusiveGateway-a71e67faaad1/Has Start Date - inclusiveGateway-a71e67faaad1.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Has Start Date - inclusiveGateway-a71e67faaad1/Has Start Date - inclusiveGateway-a71e67faaad1.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-a71e67faaad1", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-13cf96ebeb37", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-626899b6e99a", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-a71e67faaad1.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Provisioning - scriptTask-3a74557440fb/Provisioning - scriptTask-3a74557440fb.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "applicationId": request.common.applicationId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning account to user " + request.common.userId + " for application " + request.common.applicationId + ". Error message: " + message; + } + + var decision = {'status': 'complete'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Provisioning - scriptTask-3a74557440fb/Provisioning - scriptTask-3a74557440fb.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-3a74557440fb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-7d248125a9bd", + }, + ], + "script": { + "file": "Provisioning - scriptTask-3a74557440fb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-c58309b8c470", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-c58309b8c470.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if (skipApproval) { + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-0e5b6187ea62", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-a71e67faaad1", + }, + ], + "script": { + "file": "Request Approved - scriptTask-0e5b6187ea62.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-4e9121fe850a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-621c9996676a", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-4e9121fe850a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Validation Gateway - exclusiveGateway-5167870154a9/Validation Gateway - exclusiveGateway-5167870154a9.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Validation Gateway - exclusiveGateway-5167870154a9/Validation Gateway - exclusiveGateway-5167870154a9.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-5167870154a9", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationSuccess", + "step": "scriptTask-3a74557440fb", + }, + { + "condition": "failureReason != null", + "outcome": "validationFailure", + "step": "scriptTask-744ef6a8b9a2", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-5167870154a9.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant/steps/Wait Task - waitTask-13cf96ebeb37/Wait Task - waitTask-13cf96ebeb37.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-13cf96ebeb37", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-626899b6e99a", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant-copy/BasicApplicationGrant-copy.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "BasicApplicationGrant-copy", + "displayName": "BasicApplicationGrant-copy", + "id": "basicApplicationGrantCopy", + "mutable": true, + "name": "BasicApplicationGrant-copy", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 942, + "y": 82, + }, + "startNode": { + "connections": { + "start": "scriptTask-4e9121fe850a", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 683, + "y": 154, + }, + "exclusiveGateway-621c9996676a": { + "x": 454, + "y": 88.015625, + }, + "scriptTask-4e9121fe850a": { + "x": 168, + "y": 140.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant-copy/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": null, + }, + { + "condition": null, + "outcome": "REJECT", + "step": null, + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant-copy/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant-copy/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-621c9996676a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "approvalTask-74cf85c35437", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-621c9996676a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant-copy/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.js 1`] = ` +"try { +var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +} catch (e) { + logger.error(e.message) +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationGrant-copy/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-4e9121fe850a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-621c9996676a", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-4e9121fe850a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/BasicApplicationRemove.json 1`] = ` +{ + "_rev": 8, + "childType": false, + "description": "Basic request flow for removing a user's account in an application", + "displayName": "Basic Application Remove", + "id": "BasicApplicationRemove", + "mutable": false, + "name": "BasicApplicationRemove", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2087, + "y": 210, + }, + "startNode": { + "connections": { + "start": "scriptTask-b80009644545", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 726, + "y": 162, + }, + "exclusiveGateway-2bf686c17905": { + "x": 457, + "y": 95.015625, + }, + "inclusiveGateway-0c53868eeb2a": { + "x": 1125, + "y": 59.015625, + }, + "scriptTask-626899b6e99a": { + "x": 1713, + "y": 102, + }, + "scriptTask-b80009644545": { + "x": 164, + "y": 108.015625, + }, + "scriptTask-ba009484a101": { + "x": 887, + "y": 68.015625, + }, + "scriptTask-c58309b8c470": { + "x": 1714, + "y": 207, + }, + "waitTask-0431eab1902c": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.endDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1352, + "y": 75.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-ba009484a101", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Context Gateway - exclusiveGateway-2bf686c17905/Context Gateway - exclusiveGateway-2bf686c17905.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Context Gateway - exclusiveGateway-2bf686c17905/Context Gateway - exclusiveGateway-2bf686c17905.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-2bf686c17905", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-ba009484a101", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-2bf686c17905.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Deprovisioning - scriptTask-626899b6e99a/Deprovisioning - scriptTask-626899b6e99a.js 1`] = ` +"logger.info("Deprovisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var context = content.get('context'); +var lineItemId = content.get('lineItemId'); + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +} +catch (e) { + failureReason = "Deprovisioning failed: Error reading request with id " + requestId; +} + +// Create object to update final request progress +var decision = { 'status': 'complete', 'decision': 'approved' }; + +if (!failureReason) { + try { + var request = requestObj.request; + var payload = { + "applicationId": request.common.applicationId, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "remove", + "initiatingUser": requestObj.requester.id + } + + logger.info("Removing account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications', 'POST', payload, queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Deprovisioning failed: Error deprovisioning account to user " + request.common.userId + " for application " + request.common.applicationId + ". Error message: " + message; + } +} + +if (context == 'certification') { + // If application removal request is created via certification, update the corresponding certification item with remediation status. + try { + var remediationStatus = failureReason ? "failed" : "complete" + var comment = failureReason ? "Unable to remove the account successfully, remediation failed." : "Account has been removed from user successfully, remediation complete." + var body = { + "remediationStatus": remediationStatus, + "comment": comment + } + var lineItemParams = { + "_action": "updateRemediationStatus" + } + openidm.action('iga/governance/certification/items/' + lineItemId, 'POST', body, lineItemParams); + } + catch (e) { + failureReason = "Unable to update the certification line item " + lineItemId + " with the final remediation status from this request." + } +} + +// Set additional properties on the request progress update +if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; +} +else { + decision.outcome = 'provisioned'; +} + +// Update final request progress +var queryParams = { '_action': 'update' }; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Deprovisioning - scriptTask-626899b6e99a/Deprovisioning - scriptTask-626899b6e99a.json 1`] = ` +{ + "displayName": "Deprovisioning", + "name": "scriptTask-626899b6e99a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Deprovisioning - scriptTask-626899b6e99a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Has End Date - inclusiveGateway-0c53868eeb2a/Has End Date - inclusiveGateway-0c53868eeb2a.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Has End Date - inclusiveGateway-0c53868eeb2a/Has End Date - inclusiveGateway-0c53868eeb2a.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-0c53868eeb2a", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasEndDate", + "step": "waitTask-0431eab1902c", + }, + { + "condition": "enableWait == false", + "outcome": "noEndDate", + "step": "scriptTask-626899b6e99a", + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-0c53868eeb2a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-c58309b8c470", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-c58309b8c470.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Request Approval - scriptTask-ba009484a101/Request Approval - scriptTask-ba009484a101.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved" + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Request Approval - scriptTask-ba009484a101/Request Approval - scriptTask-ba009484a101.json 1`] = ` +{ + "displayName": "Request Approval", + "name": "scriptTask-ba009484a101", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-0c53868eeb2a", + }, + ], + "script": { + "file": "Request Approval - scriptTask-ba009484a101.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Request Context Check - scriptTask-b80009644545/Request Context Check - scriptTask-b80009644545.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var skipApproval = false; +var lineItemId = null; +var campaignId = null; +var enableWait = false; + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + // Set execution variables from the request context + context = requestObj.request.common.context.type; + if (context == 'admin' || context == 'certification') { + skipApproval = true; + } + if (context == 'certification') { + lineItemId = requestObj.request.common.context.lineItemId; + campaignId = requestObj.request.common.context.campaignId + + // Add a comment on the certification item denoting the request ID + var commentResp = openidm.action('/iga/governance/certification/' + campaignId + '/items/comment', 'POST', { "ids": [lineItemId], "comment": "ID of application removal request: " + requestId }, {}) + } + + } + if (requestObj.request.common.endDate){ + enableWait = true; + } +} +catch (e) { + logger.info("Could not validate request context, normal approval process will be followed.") +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("lineItemId", lineItemId); +execution.setVariable("enableWait", enableWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Request Context Check - scriptTask-b80009644545/Request Context Check - scriptTask-b80009644545.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-b80009644545", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-2bf686c17905", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-b80009644545.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicApplicationRemove/steps/Wait Task - waitTask-0431eab1902c/Wait Task - waitTask-0431eab1902c.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-0431eab1902c", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-626899b6e99a", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.endDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/BasicEntitlementGrant.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "Basic request flow for granting a user an entitlement in an application", + "displayName": "Basic Entitlement Grant", + "id": "BasicEntitlementGrant", + "mutable": false, + "name": "BasicEntitlementGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2597, + "y": 322, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 722, + "y": 156, + }, + "exclusiveGateway-48e748c42994": { + "x": 1731, + "y": 88.015625, + }, + "exclusiveGateway-67a954f33919": { + "x": 467, + "y": 121.015625, + }, + "inclusiveGateway-3f85f36eeeef": { + "x": 948, + "y": 57.015625, + }, + "inclusiveGateway-f105ed2b352d": { + "x": 2255, + "y": 48.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1972, + "y": 119.015625, + }, + "scriptTask-0b56191887de": { + "x": 1979, + "y": 212.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 1434, + "y": 95.015625, + }, + "scriptTask-91769554db51": { + "x": 2561, + "y": 74.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1441, + "y": 268.015625, + }, + "scriptTask-e04f42607ba5": { + "x": 186, + "y": 143.015625, + }, + "scriptTask-e21178ab80f7": { + "x": 716, + "y": 74.015625, + }, + "waitTask-0d53639996da": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1208, + "y": 30.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "entitlementId": request.common.entitlementId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/entitlementRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.warn('Create Removal Request failed to create') + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-91769554db51", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-91769554db51.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-f105ed2b352d", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-91769554db51", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-f105ed2b352d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-3f85f36eeeef", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-0d53639996da", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-3f85f36eeeef.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-f105ed2b352d", + }, + ], + "script": { + "file": "Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Request Approved - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-67a954f33919", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant/steps/Wait Task - waitTask-0d53639996da/Wait Task - waitTask-0d53639996da.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-0d53639996da", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/BasicEntitlementGrant-copy.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "BasicEntitlementGrant-copy", + "displayName": "BasicEntitlementGrant-copy", + "id": "basicEntitlementGrantCopy", + "mutable": true, + "name": "BasicEntitlementGrant-copy", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2597, + "y": 322, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 722, + "y": 156, + }, + "exclusiveGateway-48e748c42994": { + "x": 1731, + "y": 88.015625, + }, + "exclusiveGateway-67a954f33919": { + "x": 467, + "y": 121.015625, + }, + "exclusiveGateway-89dc2f9576ee": { + "x": 452, + "y": 488.015625, + }, + "exclusiveGateway-ad04bf17ac62": { + "x": 336, + "y": 306.015625, + }, + "inclusiveGateway-3f85f36eeeef": { + "x": 948, + "y": 57.015625, + }, + "inclusiveGateway-f105ed2b352d": { + "x": 2255, + "y": 48.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1972, + "y": 119.015625, + }, + "scriptTask-0b56191887de": { + "x": 1979, + "y": 212.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 1434, + "y": 95.015625, + }, + "scriptTask-55aced130632": { + "x": 686, + "y": 351.015625, + }, + "scriptTask-91769554db51": { + "x": 2561, + "y": 74.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1441, + "y": 268.015625, + }, + "scriptTask-e04f42607ba5": { + "x": 185, + "y": 143.015625, + }, + "scriptTask-e21178ab80f7": { + "x": 716, + "y": 73.015625, + }, + "waitTask-0d53639996da": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1208, + "y": 30.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "entitlementId": request.common.entitlementId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/entitlementRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.warn('Create Removal Request failed to create') + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-91769554db51", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-91769554db51.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Custom Context Gateway - exclusiveGateway-89dc2f9576ee/Custom Context Gateway - exclusiveGateway-89dc2f9576ee.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Custom Context Gateway - exclusiveGateway-89dc2f9576ee/Custom Context Gateway - exclusiveGateway-89dc2f9576ee.json 1`] = ` +{ + "displayName": "Custom Context Gateway", + "name": "exclusiveGateway-89dc2f9576ee", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-55aced130632", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Custom Context Gateway - exclusiveGateway-89dc2f9576ee.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Custom Request Approved - scriptTask-55aced130632/Custom Request Approved - scriptTask-55aced130632.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request type custom auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Custom Request Approved - scriptTask-55aced130632/Custom Request Approved - scriptTask-55aced130632.json 1`] = ` +{ + "displayName": "Custom Request Approved", + "name": "scriptTask-55aced130632", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Custom Request Approved - scriptTask-55aced130632.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + failureReason = "Request Object" + requestObj + ":"; + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason += " Validation failed: Error reading request with id " + requestId + "More detail is content:" + content; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-f105ed2b352d", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-91769554db51", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-f105ed2b352d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-3f85f36eeeef", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-0d53639996da", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-3f85f36eeeef.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-f105ed2b352d", + }, + ], + "script": { + "file": "Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Request Approved - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"/* + * Script Node: Context & Type Check + * Purpose: Reads request context and entitlement type to set routing outcomes. + * Sets: context, skipApproval, entitlementType, entitlementId, userId, failureReason + */ + +logger.info("BasicEntitlementGrant (Custom) - Context & Type Check"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +var entitlementType = null; +var entitlementId = null; +var userId = null; +var failureReason = null; + + // Read request object +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + // --- Context check (admin requests skip approval) --- + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } + // --- User --- + userId = requestObj.request.common.userId; + + // --- Entitlement type routing --- + // The entitlement object on the request exposes a 'type' field. + // Internal/system roles exposed as entitlements should carry type: 'custom'. + if (requestObj.entitlement && requestObj.entitlement.type) { + entitlementType = requestObj.entitlement.type; + entitlementId = requestObj.entitlement.id; + } else { + // Fallback: treat as standard if type is absent + entitlementType = 'standard'; + } + +} catch (e) { + failureReason = 'Context & Type Check failed: ' + e.message; + logger.error(failureReason); +} + +logger.info("Context: " + context + " | EntitlementType: " + entitlementType + " | UserId: " + userId); + +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +execution.setVariable("entitlementType", entitlementType); +execution.setVariable("entitlementId", entitlementId); +execution.setVariable("userId", userId); +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-ad04bf17ac62", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Type Gateway - exclusiveGateway-ad04bf17ac62/Type Gateway - exclusiveGateway-ad04bf17ac62.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Type Gateway - exclusiveGateway-ad04bf17ac62/Type Gateway - exclusiveGateway-ad04bf17ac62.json 1`] = ` +{ + "displayName": "Type Gateway", + "name": "exclusiveGateway-ad04bf17ac62", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "entitlementType != 'custom'", + "outcome": "validationSuccess", + "step": "exclusiveGateway-67a954f33919", + }, + { + "condition": "entitlementType == 'custom'", + "outcome": "validationFailure", + "step": "exclusiveGateway-89dc2f9576ee", + }, + ], + "script": { + "file": "Type Gateway - exclusiveGateway-ad04bf17ac62.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementGrant-copy/steps/Wait Task - waitTask-0d53639996da/Wait Task - waitTask-0d53639996da.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-0d53639996da", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/BasicEntitlementRemove.json 1`] = ` +{ + "_rev": 8, + "childType": false, + "description": "Basic request flow for removing an entitlement from a user", + "displayName": "Basic Entitlement Remove", + "id": "BasicEntitlementRemove", + "mutable": false, + "name": "BasicEntitlementRemove", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1883, + "y": 97, + }, + "startNode": { + "connections": { + "start": "scriptTask-ca9504ae90d8", + }, + "id": "startNode", + "x": 12, + "y": 110, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 725, + "y": 59, + }, + "exclusiveGateway-abbb089758c8": { + "x": 433, + "y": 89.015625, + }, + "inclusiveGateway-8803458e3a77": { + "x": 1039, + "y": 54.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1556, + "y": 85.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1561, + "y": 205.015625, + }, + "scriptTask-ca9504ae90d8": { + "x": 136, + "y": 111.015625, + }, + "scriptTask-e8842de66fbb": { + "x": 901, + "y": 243.015625, + }, + "waitTask-b6e654628b18": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.endDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1279, + "y": 94.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-e8842de66fbb", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-abbb089758c8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-e8842de66fbb", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-abbb089758c8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Deprovisioning - scriptTask-0359a9d77ee2/Deprovisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Deprovisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var context = content.get('context'); +var lineItemId = content.get('lineItemId'); + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +} +catch (e) { + failureReason = "Deprovisioning failed: Error reading request with id " + requestId; +} + +// Create object to update final request progress +var decision = { 'status': 'complete', 'decision': 'approved' }; + +if (!failureReason) { + try { + // Remove entitlement grant from user + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "remove", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements', 'POST', payload, queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Deprovisioning failed: Error deprovisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + message; + } +} + +if (context == 'certification') { + // If entitlement removal request is created via certification, update the corresponding certification item with remediation status. + try { + var remediationStatus = failureReason ? "failed" : "complete" + var comment = failureReason ? "Unable to remove the entitlement successfully, remediation failed." : "Entitlement has been removed from user successfully, remediation complete." + var body = { + "remediationStatus": remediationStatus, + "comment": comment + } + var lineItemParams = { + "_action": "updateRemediationStatus" + } + openidm.action('iga/governance/certification/items/' + lineItemId, 'POST', body, lineItemParams); + } + catch (e) { + failureReason = "Unable to update the certification line item " + lineItemId + " with the final remediation status from this request." + } +} + +// Set additional properties on the request progress update +if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; +} +else { + decision.outcome = 'provisioned'; +} + +// Update final request progress +var queryParams = { '_action': 'update' }; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Deprovisioning - scriptTask-0359a9d77ee2/Deprovisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Deprovisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Deprovisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Has End Date - inclusiveGateway-8803458e3a77/Has End Date - inclusiveGateway-8803458e3a77.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Has End Date - inclusiveGateway-8803458e3a77/Has End Date - inclusiveGateway-8803458e3a77.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-8803458e3a77", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasEndDate", + "step": "waitTask-b6e654628b18", + }, + { + "condition": "enableWait == false", + "outcome": "noEndDate", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-8803458e3a77.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Request Approved - scriptTask-e8842de66fbb/Request Approved - scriptTask-e8842de66fbb.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Request Approved - scriptTask-e8842de66fbb/Request Approved - scriptTask-e8842de66fbb.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-e8842de66fbb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-8803458e3a77", + }, + ], + "script": { + "file": "Request Approved - scriptTask-e8842de66fbb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Request Context Check - scriptTask-ca9504ae90d8/Request Context Check - scriptTask-ca9504ae90d8.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var skipApproval = false; +var lineItemId = null; +var campaignId = null; +var enableWait = false; + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + // Set execution variables from the request context + context = requestObj.request.common.context.type; + if (context == 'admin' || context == 'certification') { + skipApproval = true; + } + if (context == 'certification') { + lineItemId = requestObj.request.common.context.lineItemId; + campaignId = requestObj.request.common.context.campaignId + + // Add a comment on the certification item denoting the request ID + var commentResp = openidm.action('/iga/governance/certification/' + campaignId + '/items/comment', 'POST', { "ids": [lineItemId], "comment": "ID of entitlement removal request: " + requestId }, {}) + } + + } + if (requestObj.request.common.endDate){ + enableWait = true; + } +} +catch (e) { + logger.info("Could not validate request context, normal approval process will be followed.") +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("lineItemId", lineItemId); +execution.setVariable("enableWait", enableWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Request Context Check - scriptTask-ca9504ae90d8/Request Context Check - scriptTask-ca9504ae90d8.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-ca9504ae90d8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-abbb089758c8", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-ca9504ae90d8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicEntitlementRemove/steps/Wait Task - waitTask-b6e654628b18/Wait Task - waitTask-b6e654628b18.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-b6e654628b18", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.endDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleCreate/BasicRoleCreate.json 1`] = ` +{ + "_rev": 4, + "childType": false, + "description": "Basic workflow for creating a governance role", + "displayName": "BasicRoleCreate", + "id": "BasicRoleCreate", + "mutable": false, + "name": "BasicRoleCreate", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1170, + "y": 232, + }, + "startNode": { + "connections": { + "start": "scriptTask-3eab1948f1ec", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "exclusiveGateway-05b2e1af4b79": { + "x": 485.6666564941406, + "y": 135.66665649414062, + }, + "scriptTask-0359a9d77ee2": { + "x": 782, + "y": 175.015625, + }, + "scriptTask-0b56191887de": { + "x": 782, + "y": 289.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 216, + "y": 149.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleCreate/steps/Create Role - scriptTask-3eab1948f1ec/Create Role - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info('Running role create request'); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var role = null; +var failureReason = null; +var roleId = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj) { + role = requestObj.request.role; + } else { + failureReason = 'Governance role creation failed: Error reading request with id ' + requestId + ' requestObj: ' + requestObj; + } +} +catch (e) { + failureReason = 'Governance role creation failed: Error reading request with id ' + requestId + ' Error: ' + e.message; +} + +if (role) { + if (!role.object) { + failureReason = 'Governance role creation failed: Request with id: ' + requestId + ' has no role info.'; + } +} else { + failureReason = 'Governance role creation failed: Request with id: ' + requestId + ' has no role object.'; +} + +if (!failureReason) { + try { + var payload = { role: {} }; + payload.role = role.object; + if(role.glossary){ + payload.glossary = role.glossary; + } + payload.updateIdm = true; + var result = openidm.action('iga/governance/role/', 'POST', payload); + roleId = result.role.id + } + catch (e) { + failureReason = 'Governance role creation failed: Error message: ' + e.message; + } +} + +if (failureReason) { + logger.info('Governance role creation failed: ' + failureReason); +} +execution.setVariable('failureReason', failureReason); +execution.setVariable('roleId', roleId); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleCreate/steps/Create Role - scriptTask-3eab1948f1ec/Create Role - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Create Role", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-05b2e1af4b79", + }, + ], + "script": { + "file": "Create Role - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleCreate/steps/Role Create Validation Failure - scriptTask-0b56191887de/Role Create Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'cancelled', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleCreate/steps/Role Create Validation Failure - scriptTask-0b56191887de/Role Create Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Role Create Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Role Create Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleCreate/steps/Update Request - scriptTask-0359a9d77ee2/Update Request - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info('Creating Governance Role'); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var roleId = content.get('roleId'); +var decision = { + 'status': 'complete', + 'decision': 'approved', + 'outcome': 'fulfilled', + 'comment': 'Role ID: ' + roleId +}; + +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info('Request ' + requestId + ' completed.'); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleCreate/steps/Update Request - scriptTask-0359a9d77ee2/Update Request - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Update Request", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Update Request - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleCreate/steps/Validation Gateway - exclusiveGateway-05b2e1af4b79/Validation Gateway - exclusiveGateway-05b2e1af4b79.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleCreate/steps/Validation Gateway - exclusiveGateway-05b2e1af4b79/Validation Gateway - exclusiveGateway-05b2e1af4b79.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-05b2e1af4b79", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "createSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "createFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-05b2e1af4b79.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/BasicRoleDelete.json 1`] = ` +{ + "_rev": 4, + "childType": false, + "description": "Basic workflow for deleting a governance role", + "displayName": "BasicRoleDelete", + "id": "BasicRoleDelete", + "mutable": false, + "name": "BasicRoleDelete", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1806, + "y": 273, + }, + "startNode": { + "connections": { + "start": "scriptTask-3eab1948f1ec", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": { + "isExpression": true, + "value": "(function() { + var content = execution.getVariables(); + return [{ + "id": content.get('roleOwner'), + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "script", + "expirationDate": 1, + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 948, + "y": 198, + }, + "exclusiveGateway-48e748c42994": { + "x": 511, + "y": 126.015625, + }, + "exclusiveGateway-b16f45452faa": { + "x": 753.6666564941406, + "y": 34.666656494140625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1286, + "y": 107.015625, + }, + "scriptTask-0b56191887de": { + "x": 1011, + "y": 529.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 197, + "y": 142.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1195, + "y": 346.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "(function() { + var content = execution.getVariables(); + return [{ + "id": content.get('roleOwner'), + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/b89b1128-52a3-4cac-a04d-56cad0f14203", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*1*24*60*60*1000))).toISOString()", + }, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [ + { + "id": "managed/user/b89b1128-52a3-4cac-a04d-56cad0f14203", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(1*24*60*60*1000))).toISOString()", + }, + "frequency": 1, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "EXPIRATION", + "step": null, + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Auto Approval Gateway - exclusiveGateway-b16f45452faa/Auto Approval Gateway - exclusiveGateway-b16f45452faa.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Auto Approval Gateway - exclusiveGateway-b16f45452faa/Auto Approval Gateway - exclusiveGateway-b16f45452faa.json 1`] = ` +{ + "displayName": "Auto Approval Gateway", + "name": "exclusiveGateway-b16f45452faa", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Auto Approval Gateway - exclusiveGateway-b16f45452faa.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Delete Role - scriptTask-0359a9d77ee2/Delete Role - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info('Deleting Governance Role'); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); +var decision = {}; +var request = null; + +if(!failureReason) { + try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info('requestObj: ' + requestObj); + request = requestObj.request; + } + catch (e) { + failureReason = 'Governance role deletion failed: Error reading request with id ' + requestId; + } + + if(!failureReason) { + try { + openidm.action('iga/governance/role/' + request.role.roleId + '/' + request.role.status, 'DELETE', {}, {}); + } + catch (e) { + failureReason = 'Governance role deletion failed: Error deleting role ' + request.role.roleId + ', status: ' + request.role.status + '. Error message: ' + e.message; + } + + decision = { + 'status': 'complete', + 'decision': 'approved', + 'outcome': 'fulfilled' + }; + } +} + +if(failureReason) { + decision = { + 'status': 'complete', + 'decision': 'approved', + 'outcome': 'cancelled', + 'failure': true, + 'comment': failureReason + }; + logger.info('Delete failed: ' + failureReason); +} + +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info('Request ' + requestId + ' completed.'); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Delete Role - scriptTask-0359a9d77ee2/Delete Role - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Delete Role", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Delete Role - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info('Rejecting request'); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +logger.info('Execution Content: ' + content); + +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Role Delete Validation Failure - scriptTask-0b56191887de/Role Delete Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'cancelled', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Role Delete Validation Failure - scriptTask-0b56191887de/Role Delete Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Role Delete Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Role Delete Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Role Validation and Status Check - scriptTask-3eab1948f1ec/Role Validation and Status Check - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info('Running role delete request validation'); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var skipApproval = false; +var role = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj) { + role = requestObj.request.role; + } else { + failureReason = 'Validation failed: Error reading request with id ' + requestId + ' requestObj: ' + requestObj; + } +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId + ' Error: ' + e.message; +} + +// Validation - Check original role and role owner exists +if (!failureReason) { + try { + var result = openidm.action('iga/governance/role/' + role.roleId + '/' + role.status, 'GET', {}, {}); + if (!result) { + failureReason = 'Validation failed: Cannot find role with id ' + role.roleId + ', status: ' + role.status; + } else { + if (role.status != 'active') { + skipApproval = true; + } else { + try { + execution.setVariable('roleOwner', role.glossary.idx['/role'].roleOwner); + } catch(e) { + failureReason = 'Validation failed: No role owner set for role with id ' + roleId + ', status: draft'; + } + } + } + } + catch (e) { + failureReason = 'Validation failed: Error reading role with id ' + role.roleId + ', status: ' + role.status + '. Error message: ' + e.message; + } +} + +if (failureReason) { + logger.info('Validation failed: ' + failureReason); +} +execution.setVariable('failureReason', failureReason); +execution.setVariable('skipApproval', skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Role Validation and Status Check - scriptTask-3eab1948f1ec/Role Validation and Status Check - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Role Validation and Status Check", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Role Validation and Status Check - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleDelete/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "exclusiveGateway-b16f45452faa", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/BasicRoleGrant.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "Basic request flow for adding a user to a role", + "displayName": "Basic Role Grant", + "id": "BasicRoleGrant", + "mutable": false, + "name": "BasicRoleGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2889, + "y": 467, + }, + "startNode": { + "connections": { + "start": "scriptTask-d76490953517", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-c7867dd2593a": { + "actors": [ + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "type": "roleOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 727, + "y": 144.015625, + }, + "exclusiveGateway-48e748c42994": { + "x": 1694, + "y": 23.015625, + }, + "exclusiveGateway-8cd9decab2e4": { + "x": 453, + "y": 120.015625, + }, + "inclusiveGateway-57e9b96eb570": { + "x": 939, + "y": 39.015625, + }, + "inclusiveGateway-d18d59004c0c": { + "x": 2288, + "y": 68.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1941, + "y": 65.015625, + }, + "scriptTask-0b56191887de": { + "x": 1939, + "y": 149.015625, + }, + "scriptTask-32dada3fc9f9": { + "x": 2551, + "y": 102.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 1428, + "y": 56.015625, + }, + "scriptTask-8506123e6208": { + "x": 721, + "y": 41.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1399, + "y": 325.015625, + }, + "scriptTask-d76490953517": { + "x": 161, + "y": 142.015625, + }, + "waitTask-4e25b1ee7a14": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1165, + "y": 13.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Approval Task - approvalTask-c7867dd2593a/Approval Task - approvalTask-c7867dd2593a.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-8506123e6208", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-c7867dd2593a", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Context Gateway - exclusiveGateway-8cd9decab2e4/Context Gateway - exclusiveGateway-8cd9decab2e4.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Context Gateway - exclusiveGateway-8cd9decab2e4/Context Gateway - exclusiveGateway-8cd9decab2e4.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-8cd9decab2e4", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-8506123e6208", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-c7867dd2593a", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-8cd9decab2e4.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Create Removal Request - scriptTask-32dada3fc9f9/Create Removal Request - scriptTask-32dada3fc9f9.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + + if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "roleId": request.common.roleId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/roleRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.info('Create Removal Request creation failed') + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Create Removal Request - scriptTask-32dada3fc9f9/Create Removal Request - scriptTask-32dada3fc9f9.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-32dada3fc9f9", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-32dada3fc9f9.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Has End Date - inclusiveGateway-d18d59004c0c/Has End Date - inclusiveGateway-d18d59004c0c.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Has End Date - inclusiveGateway-d18d59004c0c/Has End Date - inclusiveGateway-d18d59004c0c.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-d18d59004c0c", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-32dada3fc9f9", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-d18d59004c0c.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Has Start Date - inclusiveGateway-57e9b96eb570/Has Start Date - inclusiveGateway-57e9b96eb570.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Has Start Date - inclusiveGateway-57e9b96eb570/Has Start Date - inclusiveGateway-57e9b96eb570.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-57e9b96eb570", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-4e25b1ee7a14", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-57e9b96eb570.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "roleId": request.common.roleId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/roles' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning role to user " + request.common.userId + " for role " + request.common.roleId + ". Error message: " + message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-d18d59004c0c", + }, + ], + "script": { + "file": "Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Request Approved - scriptTask-8506123e6208/Request Approved - scriptTask-8506123e6208.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved" + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Request Approved - scriptTask-8506123e6208/Request Approved - scriptTask-8506123e6208.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-8506123e6208", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-57e9b96eb570", + }, + ], + "script": { + "file": "Request Approved - scriptTask-8506123e6208.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Request Context Check - scriptTask-d76490953517/Request Context Check - scriptTask-d76490953517.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var skipApproval = false; +var enableWait = false; +var enableEndWait = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if(requestObj.request.common.startDate){ + enableWait = true; + } + if(requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("skipApproval", skipApproval); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Request Context Check - scriptTask-d76490953517/Request Context Check - scriptTask-d76490953517.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-d76490953517", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-8cd9decab2e4", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-d76490953517.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Role Grant Validation - scriptTask-3eab1948f1ec/Role Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running role grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var roleId = null; +var role = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + roleId = requestObj.role.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check role exists +if (!failureReason) { + try { + role = openidm.read('managed/alpha_role/' + roleId); + if (!role) { + failureReason = "Validation failed: Cannot find role with id " + roleId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading role with id " + roleId + ". Error message: " + e.message; + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Role Grant Validation - scriptTask-3eab1948f1ec/Role Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Role Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Role Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Role Grant Validation Failure - scriptTask-0b56191887de/Role Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Role Grant Validation Failure - scriptTask-0b56191887de/Role Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Role Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Role Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleGrant/steps/Wait Until Start Date - waitTask-4e25b1ee7a14/Wait Until Start Date - waitTask-4e25b1ee7a14.json 1`] = ` +{ + "displayName": "Wait Until Start Date", + "name": "waitTask-4e25b1ee7a14", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/BasicRoleModify.json 1`] = ` +{ + "_rev": 4, + "childType": false, + "description": "Basic workflow for modifying a governance role", + "displayName": "BasicRoleModify", + "id": "BasicRoleModify", + "mutable": false, + "name": "BasicRoleModify", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1806, + "y": 273, + }, + "startNode": { + "connections": { + "start": "scriptTask-3eab1948f1ec", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": { + "isExpression": true, + "value": "(function() { + var content = execution.getVariables(); + return [{ + "id": content.get('roleOwner'), + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "script", + "expirationDate": 1, + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 963, + "y": 204, + }, + "exclusiveGateway-48e748c42994": { + "x": 511, + "y": 126.015625, + }, + "exclusiveGateway-b16f45452faa": { + "x": 753.6666564941406, + "y": 31.666656494140625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1328, + "y": 120.015625, + }, + "scriptTask-0b56191887de": { + "x": 1011, + "y": 529.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 193, + "y": 146.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1195, + "y": 346.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "(function() { + var content = execution.getVariables(); + return [{ + "id": content.get('roleOwner'), + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/b89b1128-52a3-4cac-a04d-56cad0f14203", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*1*24*60*60*1000))).toISOString()", + }, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [ + { + "id": "managed/user/b89b1128-52a3-4cac-a04d-56cad0f14203", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(1*24*60*60*1000))).toISOString()", + }, + "frequency": 1, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "EXPIRATION", + "step": null, + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Auto Approval Gateway - exclusiveGateway-b16f45452faa/Auto Approval Gateway - exclusiveGateway-b16f45452faa.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Auto Approval Gateway - exclusiveGateway-b16f45452faa/Auto Approval Gateway - exclusiveGateway-b16f45452faa.json 1`] = ` +{ + "displayName": "Auto Approval Gateway", + "name": "exclusiveGateway-b16f45452faa", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Auto Approval Gateway - exclusiveGateway-b16f45452faa.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Modify Role - scriptTask-0359a9d77ee2/Modify Role - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info('Modifying Governance Role'); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); +var comment = content.get('comment'); +var decision = {}; +var request = null; + +if(!failureReason) { + try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info('requestObj: ' + requestObj); + request = requestObj.request; + } + catch (e) { + failureReason = 'Governance role modification failed: Error reading request with id ' + requestId; + } + + if(!failureReason) { + try { + var payload = {}; + payload.role = request.role.object; + payload.role.status = request.role.status; + if(request.role.glossary){ + payload.glossary = request.role.glossary; + } + var result = openidm.action('iga/governance/role/' + request.role.roleId + '/' + request.role.status, 'PUT', payload); + } + catch (e) { + failureReason = 'Governance role modification failed: Error modifying role ' + request.role.roleId + ', status: ' + request.role.status + '. Error message: ' + e.message; + } + + decision = { + 'status': 'complete', + 'decision': 'approved', + 'outcome': 'fulfilled', + 'comment': comment + }; + } +} + +if(failureReason) { + decision = { + 'status': 'complete', + 'decision': 'approved', + 'outcome': 'cancelled', + 'failure': true, + 'comment': failureReason + }; + logger.info('Modifying failed: ' + failureReason); +} + +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info('Request ' + requestId + ' completed.'); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Modify Role - scriptTask-0359a9d77ee2/Modify Role - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Modify Role", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Modify Role - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info('Rejecting request'); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +logger.info('Execution Content: ' + content); + +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Role Modify Validation Failure - scriptTask-0b56191887de/Role Modify Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'cancelled', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Role Modify Validation Failure - scriptTask-0b56191887de/Role Modify Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Role Modify Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Role Modify Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Role Validation and Status Check - scriptTask-3eab1948f1ec/Role Validation and Status Check - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info('Running role modify request validation'); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var skipApproval = false; +var role = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj) { + role = requestObj.request.role; + } else { + failureReason = 'Validation failed: Error reading request with id ' + requestId + ' requestObj: ' + requestObj; + } +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId + ' Error: ' + e.message; +} + +// Validation - Check original role and role owner exists +if (!failureReason) { + try { + var result = openidm.action('iga/governance/role/' + role.roleId + '/' + role.status, 'GET', {}, {}); + if (!result) { + failureReason = 'Validation failed: Cannot find role with id ' + role.roleId + ', status: ' + role.status; + } else { + if (role.status != 'active') { + skipApproval = true; + } else { + try { + execution.setVariable('roleOwner', role.glossary.idx['/role'].roleOwner); + } catch(e) { + failureReason = 'Validation failed: No role owner set for role with id ' + roleId + ', status: draft'; + } + } + } + } + catch (e) { + failureReason = 'Validation failed: Error reading role with id ' + role.roleId + ', status: ' + role.status + '. Error message: ' + e.message; + } +} + +if (failureReason) { + logger.info('Validation failed: ' + failureReason); +} +execution.setVariable('failureReason', failureReason); +execution.setVariable('skipApproval', skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Role Validation and Status Check - scriptTask-3eab1948f1ec/Role Validation and Status Check - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Role Validation and Status Check", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Role Validation and Status Check - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleModify/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "exclusiveGateway-b16f45452faa", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/BasicRolePublish.json 1`] = ` +{ + "_rev": 4, + "childType": false, + "description": "Basic workflow for publishing a governance role", + "displayName": "BasicRolePublish", + "id": "BasicRolePublish", + "mutable": false, + "name": "BasicRolePublish", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 3022, + "y": 330, + }, + "startNode": { + "connections": { + "start": "scriptTask-3eab1948f1ec", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": { + "isExpression": true, + "value": "(function() { + var content = execution.getVariables(); + return [{ + "id": content.get('roleOwner'), + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "script", + "expirationDate": 1, + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1268, + "y": 104, + }, + "exclusiveGateway-48e748c42994": { + "x": 504, + "y": 119.015625, + }, + "exclusiveGateway-eb351160a59b": { + "x": 2238.999969482422, + "y": 178.66665649414062, + }, + "scriptTask-0359a9d77ee2": { + "x": 1843, + "y": 117.015625, + }, + "scriptTask-0b56191887de": { + "x": 1300, + "y": 422.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 197, + "y": 138.015625, + }, + "scriptTask-7ddf82215dd0": { + "x": 789.6666564941406, + "y": 136.66665649414062, + }, + "scriptTask-a0c9fc54ced2": { + "x": 2487.6666564941406, + "y": 405.6666564941406, + }, + "scriptTask-aec6c36b3a45": { + "x": 1648, + "y": 353.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "(function() { + var content = execution.getVariables(); + return [{ + "id": content.get('roleOwner'), + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/b89b1128-52a3-4cac-a04d-56cad0f14203", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*1*24*60*60*1000))).toISOString()", + }, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [ + { + "id": "managed/user/b89b1128-52a3-4cac-a04d-56cad0f14203", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(1*24*60*60*1000))).toISOString()", + }, + "frequency": 1, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "EXPIRATION", + "step": null, + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Change Role Status Back to Draft For Failures - scriptTask-a0c9fc54ced2/Change Role Status Back to Draft For Failures - scriptTask-a0c9fc54ced2.js 1`] = ` +"// Change role status to back to draft +var content = execution.getVariables(); +var roleId = content.get('roleId'); + +try { + var origRole = openidm.action('iga/governance/role/' + roleId + '/pending', 'GET', {}, {}); + var payload = {role: origRole.role}; + payload.role.status = 'draft'; + var result = openidm.action('iga/governance/role/' + roleId + '/pending', 'PUT', payload); +} +catch (e) { + logger.error('Error setting role status to draft. Error message: ' + e.message); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Change Role Status Back to Draft For Failures - scriptTask-a0c9fc54ced2/Change Role Status Back to Draft For Failures - scriptTask-a0c9fc54ced2.json 1`] = ` +{ + "displayName": "Change Role Status Back to Draft For Failures", + "name": "scriptTask-a0c9fc54ced2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Change Role Status Back to Draft For Failures - scriptTask-a0c9fc54ced2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Change Role Status to Pending - scriptTask-7ddf82215dd0/Change Role Status to Pending - scriptTask-7ddf82215dd0.js 1`] = ` +"// Change role status to pending approval +var content = execution.getVariables(); +var roleId = content.get('roleId'); + +try { + var origRole = openidm.action('iga/governance/role/' + roleId + '/draft', 'GET', {}, {}); + var payload = {role: origRole.role}; + payload.role.status = 'pending'; + var result = openidm.action('iga/governance/role/' + roleId + '/draft', 'PUT', payload); +} +catch (e) { + logger.error('Error setting role status to pending. Error message: ' + e.message); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Change Role Status to Pending - scriptTask-7ddf82215dd0/Change Role Status to Pending - scriptTask-7ddf82215dd0.json 1`] = ` +{ + "displayName": "Change Role Status to Pending", + "name": "scriptTask-7ddf82215dd0", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Change Role Status to Pending - scriptTask-7ddf82215dd0.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Publish Governance Role - scriptTask-0359a9d77ee2/Publish Governance Role - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info('Publishing Governance Role'); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var roleId = content.get('roleId'); +var addAutoRoleMembers = content.get('addAutoRoleMembers'); +var updateIdm = content.get('updateIdm'); +var failureReason = content.get('failureReason'); +var decision = {}; +var request = null; + +if(!failureReason) { + try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info('requestObj: ' + requestObj); + request = requestObj.request; + } + catch (e) { + failureReason = 'Governance role publishing failed: Error reading request with id ' + requestId; + } + + if(!failureReason) { + try { + var govPayload = { + addAutoRoleMembers, + updateIdm + }; + var result = openidm.action('iga/governance/role/' + roleId + '/pending', 'PATCH', govPayload); + } + catch (e) { + failureReason = 'Governance role publishing failed: Error publishing role ' + roleId + '. Error message: ' + e.message; + } + + decision = { + 'status': 'complete', + 'decision': 'approved', + 'outcome': 'fulfilled' + }; + } +} + +if(failureReason) { + decision = { + 'status': 'complete', + 'decision': 'approved', + 'outcome': 'cancelled', + 'failure': true, + 'comment': failureReason + }; + logger.info('Publish failed: ' + failureReason); +} + +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info('Request ' + requestId + ' completed.'); + +execution.setVariable('failureReason', failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Publish Governance Role - scriptTask-0359a9d77ee2/Publish Governance Role - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Publish Governance Role", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-eb351160a59b", + }, + ], + "script": { + "file": "Publish Governance Role - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info('Rejecting request'); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +logger.info('Execution Content: ' + content); + +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-a0c9fc54ced2", + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Role Validation and Status Check - scriptTask-3eab1948f1ec/Role Validation and Status Check - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info('Running governance role publish request validation'); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var roleId = null; +var updateIdm = true; +var addAutoRoleMembers = true; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj) { + roleId = requestObj.request.role.roleId; + addAutoRoleMembers = requestObj.request.role.addAutoRoleMembers ? requestObj.request.role.addAutoRoleMembers: true; + updateIdm = requestObj.request.role.updateIdm ? requestObj.request.role.updateIdm : true; + } else { + failureReason = 'Validation failed: Error reading request with id ' + requestId + ' requestObj: ' + requestObj; + } +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId + ' Error: ' + e.message; +} + +// Validation - Check role and role owner exists +if (!failureReason) { + try { + var role = openidm.action('iga/governance/role/' + roleId + '/draft', 'GET', {}, {}); + if (!role) { + failureReason = 'Validation failed: Cannot find role with id ' + roleId + ', status: draft'; + } else { + try { + execution.setVariable('roleOwner', role.glossary.idx['/role'].roleOwner); + } catch(e) { + failureReason = 'Validation failed: No role owner set for role with id ' + roleId + ', status: draft'; + } + } + } + catch (e) { + failureReason = 'Validation failed: Error reading role with id ' + roleId + ', status: draft' + '. Error message: ' + e.message + 'role: ' + role; + } +} + +if (failureReason) { + logger.info('Validation failed: ' + failureReason); +} +execution.setVariable('failureReason', failureReason); +execution.setVariable('roleId', roleId); +execution.setVariable('updateIdm', updateIdm); +execution.setVariable('addAutoRoleMembers', addAutoRoleMembers); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Role Validation and Status Check - scriptTask-3eab1948f1ec/Role Validation and Status Check - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Role Validation and Status Check", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Role Validation and Status Check - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Validation Failure - scriptTask-0b56191887de/Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'cancelled', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Validation Failure - scriptTask-0b56191887de/Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-7ddf82215dd0", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Validation Gateway - exclusiveGateway-eb351160a59b/Validation Gateway - exclusiveGateway-eb351160a59b.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRolePublish/steps/Validation Gateway - exclusiveGateway-eb351160a59b/Validation Gateway - exclusiveGateway-eb351160a59b.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-eb351160a59b", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationSuccess", + "step": null, + }, + { + "condition": "failureReason != null", + "outcome": "validationFailure", + "step": "scriptTask-a0c9fc54ced2", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-eb351160a59b.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/BasicRoleRemove.json 1`] = ` +{ + "_rev": 8, + "childType": false, + "description": "Basic request flow for removing a user's role membership", + "displayName": "Basic Role Remove", + "id": "BasicRoleRemove", + "mutable": false, + "name": "BasicRoleRemove", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1823, + "y": 205, + }, + "startNode": { + "connections": { + "start": "scriptTask-c99a721d2b93", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "type": "roleOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 694, + "y": 234, + }, + "exclusiveGateway-53007af1f4bf": { + "x": 479, + "y": 57.015625, + }, + "inclusiveGateway-a83e210b90d1": { + "x": 992, + "y": 70.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1498, + "y": 76.015625, + }, + "scriptTask-6dde9c0ec213": { + "x": 785, + "y": 84.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1165, + "y": 285.015625, + }, + "scriptTask-c99a721d2b93": { + "x": 187, + "y": 143.015625, + }, + "waitTask-e65fcbd06a6d": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.endDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1247, + "y": 84.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-6dde9c0ec213", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Context Gateway - exclusiveGateway-53007af1f4bf/Context Gateway - exclusiveGateway-53007af1f4bf.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Context Gateway - exclusiveGateway-53007af1f4bf/Context Gateway - exclusiveGateway-53007af1f4bf.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-53007af1f4bf", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-6dde9c0ec213", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-53007af1f4bf.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Deprovisioning - scriptTask-0359a9d77ee2/Deprovisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Deprovisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var context = content.get('context'); +var lineItemId = content.get('lineItemId'); + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Deprovisioning failed: Error reading request with id " + requestId; +} + +// Create object to update final request progress +var decision = { 'status': 'complete', 'decision': 'approved' }; + +if (!failureReason) { + try { + // Remove role grant from user + var request = requestObj.request; + var payload = { + "roleId": request.common.roleId, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "remove", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/roles', 'POST', payload, queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Deprovisioning failed: Error deprovisioning role to user " + request.common.userId + " for role " + request.common.roleId + ". Error message: " + message; + } +} + +if (context == 'certification') { + // If role removal request is created via certification, update the corresponding certification item with remediation status. + try { + var remediationStatus = failureReason ? "failed" : "complete" + var comment = failureReason ? "Unable to remove the role successfully, remediation failed." : "Role has been removed from user successfully, remediation complete." + var body = { + "remediationStatus": remediationStatus, + "comment": comment + } + var lineItemParams = { + "_action": "updateRemediationStatus" + } + openidm.action('iga/governance/certification/items/' + lineItemId, 'POST', body, lineItemParams); + } + catch (e) { + failureReason = "Unable to update the certification line item " + lineItemId + " with the final remediation status from this request." + } +} + +// Set additional properties on the request progress update +if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; +} +else { + decision.outcome = 'provisioned'; +} + +// Update final request progress +var queryParams = { '_action': 'update' }; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Deprovisioning - scriptTask-0359a9d77ee2/Deprovisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Deprovisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Deprovisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Has End Date - inclusiveGateway-a83e210b90d1/Has End Date - inclusiveGateway-a83e210b90d1.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Has End Date - inclusiveGateway-a83e210b90d1/Has End Date - inclusiveGateway-a83e210b90d1.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-a83e210b90d1", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasEndDate", + "step": "waitTask-e65fcbd06a6d", + }, + { + "condition": "enableWait == false", + "outcome": "noEndDate", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-a83e210b90d1.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Request Approved - scriptTask-6dde9c0ec213/Request Approved - scriptTask-6dde9c0ec213.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Request Approved - scriptTask-6dde9c0ec213/Request Approved - scriptTask-6dde9c0ec213.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-6dde9c0ec213", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-a83e210b90d1", + }, + ], + "script": { + "file": "Request Approved - scriptTask-6dde9c0ec213.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Request Context Check - scriptTask-c99a721d2b93/Request Context Check - scriptTask-c99a721d2b93.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var skipApproval = false; +var lineItemId = null; +var campaignId = null; +var enableWait = false; + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + // Set execution variables from the request context + context = requestObj.request.common.context.type; + if (context == 'admin' || context == 'certification') { + skipApproval = true; + } + if (context == 'certification') { + lineItemId = requestObj.request.common.context.lineItemId; + campaignId = requestObj.request.common.context.campaignId + + // Add a comment on the certification item denoting the request ID + var commentResp = openidm.action('/iga/governance/certification/' + campaignId + '/items/comment', 'POST', { "ids": [lineItemId], "comment": "ID of role removal request: " + requestId }, {}) + } + + } + if (requestObj.request.common.endDate){ + enableWait = true; + } +} +catch (e) { + logger.info("Could not validate request context, normal approval process will be followed.") +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("lineItemId", lineItemId); +execution.setVariable("enableWait", enableWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Request Context Check - scriptTask-c99a721d2b93/Request Context Check - scriptTask-c99a721d2b93.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-c99a721d2b93", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-53007af1f4bf", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-c99a721d2b93.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicRoleRemove/steps/Wait Task - waitTask-e65fcbd06a6d/Wait Task - waitTask-e65fcbd06a6d.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-e65fcbd06a6d", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.endDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicViolationProcess/BasicViolationProcess.json 1`] = ` +{ + "_rev": 5, + "childType": false, + "description": "Basic violation flow for determining how a policy violation is handled", + "displayName": "Basic Violation Process", + "id": "BasicViolationProcess", + "mutable": false, + "name": "BasicViolationProcess", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1380, + "y": 400, + }, + "startNode": { + "connections": { + "start": "violationTask-df7f65b04ec3", + }, + "id": "startNode", + "x": 60, + "y": 140, + }, + "uiConfig": { + "exclusiveGateway-b1e244b742b5": { + "x": 760, + "y": 90, + }, + "scriptTask-313f487929a4": { + "x": 485, + "y": 80, + }, + "scriptTask-690cd5adc1b6": { + "x": 485, + "y": 164, + }, + "scriptTask-6e8507beca08": { + "x": 1040, + "y": 80.5, + }, + "violationTask-df7f65b04ec3": { + "actors": [ + { + "id": { + "isExpression": true, + "value": "violation.policyRule.violationOwner.id", + }, + "type": "violationOwner", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "script", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 230, + "y": 110, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicViolationProcess/steps/Allow Violation - scriptTask-313f487929a4/Allow Violation - scriptTask-313f487929a4.js 1`] = ` +"logger.info("Allowing violation"); +var content = execution.getVariables(); +var violationId = content.get('id'); +var phaseName = content.get('phaseName'); +logger.info("Violation to be allowed: " + violationId + " with phase name " + phaseName); + +var failureReason = null; +try { + var allowResponse = openidm.action('iga/governance/violation/' + violationId + '/allow', 'POST', {}); +logger.info("Violation " + violationId + " was allowed successfully.");} catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Failed allowing violation with id " + violationId + ". Error message: " + message; +} + +if (failureReason) { + var update = { "comment": failureReason }; + try { + openidm.action('iga/governance/violation/' + violationId + '/phases/' + phaseName + '/comment', 'POST', update, {}); + } catch (e) { + openidm.action('iga/governance/violation/' + violationId + '/comment', 'POST', update, {}); + } +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicViolationProcess/steps/Allow Violation - scriptTask-313f487929a4/Allow Violation - scriptTask-313f487929a4.json 1`] = ` +{ + "displayName": "Allow Violation", + "name": "scriptTask-313f487929a4", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Allow Violation - scriptTask-313f487929a4.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicViolationProcess/steps/Remediate Violation - scriptTask-690cd5adc1b6/Remediate Violation - scriptTask-690cd5adc1b6.js 1`] = ` +"logger.info("Remediating violation"); + +var content = execution.getVariables(); +var violationId = content.get('id'); +var remediation = content.get('remediation'); +logger.info("Remediating violation - violationId: " + violationId + ', remediation payload: ' + remediation); + +var remediationContent = null; + +var remediationResponse = openidm.action('iga/governance/violation/' + violationId + '/remediate', 'POST', remediation); +logger.info("Remediating response: " + remediationResponse); + +remediationContent = remediationResponse.decision.remediation; +execution.setVariable("remediation", remediationContent); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicViolationProcess/steps/Remediate Violation - scriptTask-690cd5adc1b6/Remediate Violation - scriptTask-690cd5adc1b6.json 1`] = ` +{ + "displayName": "Remediate Violation", + "name": "scriptTask-690cd5adc1b6", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-b1e244b742b5", + }, + ], + "script": { + "file": "Remediate Violation - scriptTask-690cd5adc1b6.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicViolationProcess/steps/Remediation Validation - exclusiveGateway-b1e244b742b5/Remediation Validation - exclusiveGateway-b1e244b742b5.js 1`] = ` +"logger.info("This is exclusive gateway to validate remediation"); +var content = execution.getVariables(); +var remediationResult = content.get('remediation'); +logger.info("The remediation result is: " + remediationResult); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicViolationProcess/steps/Remediation Validation - exclusiveGateway-b1e244b742b5/Remediation Validation - exclusiveGateway-b1e244b742b5.json 1`] = ` +{ + "displayName": "Remediation Validation", + "name": "exclusiveGateway-b1e244b742b5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "remediation.remediationOptionId == "grantRemoval"", + "outcome": "removeGrants", + "step": "scriptTask-6e8507beca08", + }, + { + "condition": "!remediation || !remediation.remediationOptionId || remediation.remediationOptionId !== "grantRemoval"", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Remediation Validation - exclusiveGateway-b1e244b742b5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicViolationProcess/steps/Remove Grants Auto - scriptTask-6e8507beca08/Remove Grants Auto - scriptTask-6e8507beca08.js 1`] = ` +"logger.info("Removing grants automatically"); + +var content = execution.getVariables(); +var violationId = content.get('id'); +var failureReason = null; +var phaseName = content.get('phaseName'); +var violationObj; + +logger.info("Removing grants for violation " + violationId + " with phase name " + phaseName); + +try { + violationObj = openidm.action('iga/governance/violation/lookup/' + violationId, 'GET', {}, {}); +} +catch (e) { + failureReason = "Removing grants failed: Error reading violation with id " + violationId + ". Error message: " + e.message; +} + +if (!failureReason) { + var remediation = violationObj.decision.remediation; + var failedDeprovisioning = false; + var deprovisionedIds = []; + for(var grant of violationObj.violatingAccess) { + if (!remediation.grantIds.includes(grant.compositeId)) { + continue; + } + + var userId = violationObj.user.id; + logger.info("Removing grant: " + grant.compositeId + ", user: " + userId + ", violation: " + violationId + ", type: " + grant.item.type); + var resourceInfo; + var resourcePath; + if (grant.item.type === 'ResourceGrant' || grant.item.type === 'entitlementGrant') { + resourceInfo = { "resourceKey": "entitlementId", "resourceValue": grant.assignment.id }; + resourcePath = "entitlements"; + } + else if (grant.item.type === 'AccountGrant' || grant.item.type === 'accountGrant') { + var accountId = grant.account.id; + + } + else if (grant.item.type === 'roleMembership') { + resourceInfo = { "resourceKey": "roleId", "resourceValue": grant.role.id }; + resourcePath = "roles"; + } + + try { + var payload = { + "grantType": "request" + }; + payload[resourceInfo.resourceKey] = resourceInfo.resourceValue; + + logger.info('Payload to remove grant: ' + JSON.stringify(payload)); + + var queryParams = { + "_action": "remove" + } + + var result = openidm.action('iga/governance/user/' + userId + '/' + resourcePath , 'POST', payload,queryParams); + execution.setVariables(result); + + logger.info("Grant removed " + grant.compositeId + " successfully, user " + userId + ", violation: " + violationId + ", type: " + grant.item.type + ", resource info: " + JSON.stringify(resourceInfo) + ", result: " + JSON.stringify(result)); + deprovisionedIds.push(grant.compositeId); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = failureReason + ". Removing grants failed: Error deprovisioning " + resourcePath + " to user " + userId + " for " + resourceInfo + ". Error message: " + message + "."; + failedDeprovisioning = true; + } + } + + if (!failedDeprovisioning) { + openidm.action('iga/governance/violation/' + violationId + '/remediation/status/complete', 'POST', {}); + } else { + failureReason = failureReason + ". Grants removed: " + deprovisionedIds; + } +} + +if (failureReason) { + var update = { 'comment': failureReason }; + try { + openidm.action('iga/governance/violation/' + violationId + '/phases/' + phaseName + '/comment', 'POST', update, {}); + } catch (e) { + openidm.action('iga/governance/violation/' + violationId + '/comment', 'POST', update, {}); + } +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicViolationProcess/steps/Remove Grants Auto - scriptTask-6e8507beca08/Remove Grants Auto - scriptTask-6e8507beca08.json 1`] = ` +{ + "displayName": "Remove Grants Auto", + "name": "scriptTask-6e8507beca08", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Remove Grants Auto - scriptTask-6e8507beca08.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/BasicViolationProcess/steps/Start Violation Task - violationTask-df7f65b04ec3/Start Violation Task - violationTask-df7f65b04ec3.json 1`] = ` +{ + "displayName": "Start Violation Task", + "name": "violationTask-df7f65b04ec3", + "type": "violationTask", + "violationTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": "violation.policyRule.violationOwner.id", + }, + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "violationAssigned", + }, + "escalation": { + "actors": [ + { + "id": { + "isExpression": true, + "value": "violation.policyRule.violationOwner.id", + }, + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(8*1*24*60*60*1000))).toISOString()", + }, + "frequency": 8, + "notification": "violationEscalated", + }, + "expiration": { + "action": { + "isExpression": true, + "value": "violation.policyRule.violationLifecycle.expiration.expires ? violation.policyRule.violationLifecycle.expiration.action : null", + }, + "actors": [], + "date": { + "isExpression": true, + "value": "violation.policyRule.violationLifecycle.expiration.expires ? (new Date(new Date().getTime()+(violation.policyRule.violationLifecycle.expiration.duration*24*60*60*1000))).toISOString() : null", + }, + "notification": "violationExpired", + }, + "reassign": { + "notification": "violationReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "violationReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": "scriptTask-690cd5adc1b6", + }, + { + "condition": null, + "outcome": "ALLOW", + "step": "scriptTask-313f487929a4", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/CreateEntitlement.json 1`] = ` +{ + "_rev": 6, + "childType": false, + "description": "Basic request flow for creating a new entitlement", + "displayName": "Create Entitlement", + "id": "CreateEntitlement", + "mutable": false, + "name": "CreateEntitlement", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1357, + "y": 209, + }, + "startNode": { + "connections": { + "start": "scriptTask-c59ee376a37c", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 722, + "y": 156, + }, + "exclusiveGateway-67a954f33919": { + "x": 445, + "y": 120.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1018, + "y": 58.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1014, + "y": 226.015625, + }, + "scriptTask-c59ee376a37c": { + "x": 194, + "y": 143.015625, + }, + "scriptTask-e21178ab80f7": { + "x": 743, + "y": 56.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Auto Approval - scriptTask-e21178ab80f7/Auto Approval - scriptTask-e21178ab80f7.js 1`] = ` +"logger.info("Creating Entitlement - marking request as auto approved."); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to user having create privileges." + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Auto Approval - scriptTask-e21178ab80f7/Auto Approval - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Auto Approval", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "script": { + "file": "Auto Approval - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Create Entitlement - scriptTask-0359a9d77ee2/Create Entitlement - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Create Entitlement - creating entitlement"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create entitlement failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + // Call IGA API for creating entitlement + var payload = requestObj.request.entitlement; + var params = { '_action': 'create', 'initiatingUser': requestObj.requester.id}; + openidm.action('iga/governance/entitlement', 'POST', payload, params); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Create entitlement failed: Error creating " + payload.objectType + " entitlement for application " + payload.applicationId + ". Error message: " + message; + } +} + +// Build the payload to update the request object with the final status, decision, and outcome +var decision = {'status': 'complete', 'decision': 'approved'}; +if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; +} +else { + decision.outcome = 'provisioned'; +} + +// Update request +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Create Entitlement - scriptTask-0359a9d77ee2/Create Entitlement - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Create Entitlement", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Entitlement - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Permission Check - scriptTask-c59ee376a37c/Permission Check - scriptTask-c59ee376a37c.js 1`] = ` +"// This permission check script will check that the requester has proper privileges to +// create an entitlement for the application which they are requesting. If so, it will +// skip any approval process and directly move to create the entitlement. + +logger.info("Creating Entitlement - Permission check"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var skipApproval = false; + +try { + // Read the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + if(requester.id.startsWith('managed/user/')){ + // If requester is a managed user, check that the user has permissions to + // create entitlements for the requested application + var entitlementObj = requestObj.request.entitlement; + var userId = requester.id.split('/') + var entitlement = openidm.action('iga/governance/application/' + entitlementObj.applicationId, 'GET', {}, {'endUserId': userId[2]}) + if (entitlement.permissions.createEntitlement) { + skipApproval = true; + } + } + else { + // Tenant admins and system requests + skipApproval = true; + } +} +catch (e) { + logger.info("Request permission check failed: " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Permission Check - scriptTask-c59ee376a37c/Permission Check - scriptTask-c59ee376a37c.json 1`] = ` +{ + "displayName": "Permission Check", + "name": "scriptTask-c59ee376a37c", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-67a954f33919", + }, + ], + "script": { + "file": "Permission Check - scriptTask-c59ee376a37c.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Permission Gateway - exclusiveGateway-67a954f33919/Permission Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Permission Gateway - exclusiveGateway-67a954f33919/Permission Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Permission Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Permission Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Create entitlement - rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateEntitlement/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/CreateNonEmployee.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "CreateNonEmployee", + "displayName": "CreateNonEmployee", + "id": "createNonEmployee", + "mutable": true, + "name": "CreateNonEmployee", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1694, + "y": 154, + }, + "startNode": { + "connections": { + "start": "scriptTask-ca9504ae90d8", + }, + "id": "startNode", + "x": 12, + "y": 110, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6a2d0e09-a9ac-41ca-af24-8af052c480f2", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "script", + "expirationDate": 1, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 716, + "y": 169, + }, + "exclusiveGateway-abbb089758c8": { + "x": 433, + "y": 89.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 986, + "y": 48.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 988, + "y": 222.015625, + }, + "scriptTask-ca9504ae90d8": { + "x": 136, + "y": 112.015625, + }, + "scriptTask-e8842de66fbb": { + "x": 718, + "y": 43.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6a2d0e09-a9ac-41ca-af24-8af052c480f2", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(1*24*60*60*1000))).toISOString()", + }, + "frequency": 1, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0359a9d77ee2", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.js 1`] = ` +"logger.info("Create User - marking request as auto approved."); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to requester having create user privileges." + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.json 1`] = ` +{ + "displayName": "Auto-Approval", + "name": "scriptTask-e8842de66fbb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "script": { + "file": "Auto-Approval - scriptTask-e8842de66fbb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-abbb089758c8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-e8842de66fbb", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-abbb089758c8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Create User - scriptTask-0359a9d77ee2/Create User - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Creating User"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +} +catch (e) { + failureReason = "Creating User: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var payload = requestObj.request.user.object; + + var comment = {'comment': JSON.stringify(payload)}; + openidm.action('iga/governance/requests/' + requestId, 'POST', comment, queryParams); + } + catch (e) { + failureReason = "Creating user failed: Error during creation of user " + payload.userName + ". Error message: " + e.message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Create User - scriptTask-0359a9d77ee2/Create User - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Create User", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create User - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.js 1`] = ` +"// This permission check script will check that the requester has proper privileges to +// create a user. If so, it will skip any approval process and directly move to create the new user. + +logger.info("Create User - Permission check"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var skipApproval = false; + +try { + // Read the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + if(requester.id.startsWith('managed/user/')){ + // If requester is a normal managed user, check that the user has permissions to create a user + var userId = requester.id.split('/'); + var user = openidm.action('iga/governance/user', 'GET', {}, {'endUserId': userId[2], 'scopePermission': 'createUser', '_queryFilter': \`id+eq+'\` + userId[2] + \`'\`}) + if(user.result.length > 0){ + skipApproval = true; + } + } + else{ + // Tenant admins and system requests + skipApproval = true; + } +} +catch (e) { + logger.info("Request permission check failed: " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.json 1`] = ` +{ + "displayName": "Permission Check", + "name": "scriptTask-ca9504ae90d8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-abbb089758c8", + }, + ], + "script": { + "file": "Permission Check - scriptTask-ca9504ae90d8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Create User - rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateNonEmployee/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser - JH/CreateUser - JH.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "CreateUser - JH", + "displayName": "CreateUser - JH", + "id": "createUserJh", + "mutable": true, + "name": "CreateUser - JH", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1694, + "y": 154, + }, + "startNode": { + "connections": { + "start": "scriptTask-ca9504ae90d8", + }, + "id": "startNode", + "x": 12, + "y": 110, + }, + "uiConfig": { + "scriptTask-ca9504ae90d8": { + "x": 136, + "y": 112.015625, + }, + }, + }, + "status": "draft", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser - JH/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.js 1`] = ` +"// This permission check script will check that the requester has proper privileges to +// create a user. If so, it will skip any approval process and directly move to create the new user. + +logger.info("Create User - Permission check"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var skipApproval = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + var comment = { 'comment': JSON.stringify(requestObj) } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + logger.info("Request permission check failed: " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser - JH/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.json 1`] = ` +{ + "displayName": "Permission Check", + "name": "scriptTask-ca9504ae90d8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Permission Check - scriptTask-ca9504ae90d8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/CreateUser.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "Basic request flow for creating a new user", + "displayName": "Create User", + "id": "CreateUser", + "mutable": false, + "name": "CreateUser", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1694, + "y": 154, + }, + "startNode": { + "connections": { + "start": "scriptTask-ca9504ae90d8", + }, + "id": "startNode", + "x": 12, + "y": 110, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action('iga/commons/config/iga_access_request', 'GET', {}, {}); + return systemSettings.defaultApprover; +})()", + }, + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 732, + "y": 172, + }, + "exclusiveGateway-abbb089758c8": { + "x": 433, + "y": 89.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 928, + "y": 53.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 963, + "y": 223.015625, + }, + "scriptTask-ca9504ae90d8": { + "x": 136, + "y": 112.015625, + }, + "scriptTask-e8842de66fbb": { + "x": 718, + "y": 43.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action('iga/commons/config/iga_access_request', 'GET', {}, {}); + return systemSettings.defaultApprover; +})()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0359a9d77ee2", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.js 1`] = ` +"logger.info("Create User - marking request as auto approved."); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to requester having create user privileges." + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.json 1`] = ` +{ + "displayName": "Auto-Approval", + "name": "scriptTask-e8842de66fbb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "script": { + "file": "Auto-Approval - scriptTask-e8842de66fbb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-abbb089758c8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-e8842de66fbb", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-abbb089758c8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Create User - scriptTask-0359a9d77ee2/Create User - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Creating User"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +} +catch (e) { + failureReason = "Creating User: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var payload = requestObj.request.user.object; + + /** Create new user **/ + var result = openidm.create('managed/alpha_user', null, payload, queryParams); + logger.info("User created with userName " + result.userName + " and _id " + result._id + ".") + + /** Send new user email **/ + var body = { + subject: "Welcome " + payload.givenName + " " + payload.sn + "!", + to: payload.mail, + body: "Your new user has been created.\\n\\nUsername: " + payload.userName, + object: {} + }; + + if(payload.manager && payload.manager._ref){ + logger.info("Getting manager information for " + payload.userName + " create user welcome email.") + try { + var managerResult = openidm.read(payload.manager._ref); + body.cc = managerResult.mail; + } catch (e) { + logger.info("Unable to read manager information for " + payload.userName + " create user welcome email. " + e.message) + } + } + openidm.action("external/email", "send", body); + } + catch (e) { + failureReason = "Creating user failed: Error during creation of user " + payload.userName + ". Error message: " + e.message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Create User - scriptTask-0359a9d77ee2/Create User - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Create User", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create User - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.js 1`] = ` +"// This permission check script will check that the requester has proper privileges to +// create a user. If so, it will skip any approval process and directly move to create the new user. + +logger.info("Create User - Permission check"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var skipApproval = false; + +try { + // Read the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + if(requester.id.startsWith('managed/user/')){ + // If requester is a normal managed user, check that the user has permissions to create a user + var userId = requester.id.split('/'); + var user = openidm.action('iga/governance/user', 'GET', {}, {'endUserId': userId[2], 'scopePermission': 'createUser', '_queryFilter': \`id+eq+'\` + userId[2] + \`'\`}) + if(user.result.length > 0){ + skipApproval = true; + } + } + else{ + // Tenant admins and system requests + skipApproval = true; + } +} +catch (e) { + logger.info("Request permission check failed: " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.json 1`] = ` +{ + "displayName": "Permission Check", + "name": "scriptTask-ca9504ae90d8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-abbb089758c8", + }, + ], + "script": { + "file": "Permission Check - scriptTask-ca9504ae90d8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Create User - rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/CreateUser/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/DeleteUser.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "Basic Request flow to delete a user", + "displayName": "Delete User", + "id": "DeleteUser", + "mutable": false, + "name": "DeleteUser", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1378, + "y": 118, + }, + "startNode": { + "connections": { + "start": "scriptTask-ca9504ae90d8", + }, + "id": "startNode", + "x": 12, + "y": 110, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action('iga/commons/config/iga_access_request', 'GET', {}, {}); + return systemSettings.defaultApprover; +})()", + }, + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 713, + "y": 169, + }, + "exclusiveGateway-abbb089758c8": { + "x": 433, + "y": 89.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 993, + "y": 31.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 994, + "y": 237.015625, + }, + "scriptTask-ca9504ae90d8": { + "x": 135, + "y": 111.015625, + }, + "scriptTask-e8842de66fbb": { + "x": 708, + "y": 26.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action('iga/commons/config/iga_access_request', 'GET', {}, {}); + return systemSettings.defaultApprover; +})()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0359a9d77ee2", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.js 1`] = ` +"logger.info("Delete User - marking request as auto approved."); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to user having delete user privileges." + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.json 1`] = ` +{ + "displayName": "Auto-Approval", + "name": "scriptTask-e8842de66fbb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "script": { + "file": "Auto-Approval - scriptTask-e8842de66fbb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-abbb089758c8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-e8842de66fbb", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-abbb089758c8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Delete User - scriptTask-0359a9d77ee2/Delete User - scriptTask-0359a9d77ee2.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +logger.info("Deleting User - request id " + requestId); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +} +catch (e) { + failureReason = "User Deletion: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + + /** Delete user **/ + var result = openidm.delete('managed/alpha_user/' + request.user.userId, null); + logger.info("Deleted user " + request.user.userId + " for request id " + requestId + ".") + } + catch (e) { + failureReason = "Deleting user failed: Error during deletion of user " + request.user.userId + " for request id " + requestId + ". Error message: " + e.message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Delete User - scriptTask-0359a9d77ee2/Delete User - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Delete User", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Delete User - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.js 1`] = ` +"// This permission check script will check that the requester has proper privileges to +// delete users. If so, it will skip any approval process and directly move to delete the user. + +logger.info("Delete User - Permission check"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var skipApproval = false; + +try { + // Read the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + if(requester.id.startsWith('managed/user/')){ + // If requester is a managed user, check that the user has permissions to + // create entitlements for the requested application + var userId = requestObj.request.user.userId; + var requesterId = requester.id.split('/'); + var user = openidm.action('iga/governance/user', 'GET', {}, {'endUserId': requesterId[2], 'scopePermission': 'deleteUser', '_queryFilter': \`id+eq+'\` + userId + \`'\`}) + if(user.result[0].permissions.deleteUser){ + skipApproval = true; + } + } + else{ + // Tenant admins and system requests + skipApproval = true; + } +} +catch (e) { + logger.info("Request permission check failed: " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.json 1`] = ` +{ + "displayName": "Permission Check", + "name": "scriptTask-ca9504ae90d8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-abbb089758c8", + }, + ], + "script": { + "file": "Permission Check - scriptTask-ca9504ae90d8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Delete User - rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/DeleteUser/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/ModifyEntitlement.json 1`] = ` +{ + "_rev": 6, + "childType": false, + "description": "Basic request flow for modifying an existing entitlement", + "displayName": "Modify Entitlement", + "id": "ModifyEntitlement", + "mutable": false, + "name": "ModifyEntitlement", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1774, + "y": 221, + }, + "startNode": { + "connections": { + "start": "scriptTask-365b50ab00a7", + }, + "id": "startNode", + "x": 12, + "y": 110, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.entitlementOwner[0].id ? "managed/user/" + requestIndex.entitlementOwner[0].id : "managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 1, + }, + "x": 1128, + "y": 260, + }, + "exclusiveGateway-abbb089758c8": { + "x": 847, + "y": 164.015625, + }, + "exclusiveGateway-c82a357d8c38": { + "x": 306, + "y": 87.015625, + }, + "fulfillmentTask-cce84a670745": { + "actors": { + "isExpression": true, + "value": "// Returns the certifier +(function() { + var content = execution.getVariables(); + var certifierId = content.get('certifierId'); + + return [{ + "id": "managed/user/" + certifierId, + "permissions": { + "fulfill": true, + "deny": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})() +", + }, + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 595, + "y": 46.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1413, + "y": 291.015625, + }, + "scriptTask-365b50ab00a7": { + "x": 95, + "y": 106.015625, + }, + "scriptTask-87ad089a5484": { + "x": 591, + "y": 224.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1412, + "y": 118.015625, + }, + "scriptTask-e8842de66fbb": { + "x": 1124, + "y": 169.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0359a9d77ee2", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.js 1`] = ` +"logger.info("Modify Entitlement - marking request as auto approved."); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to user having modify privileges." + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.json 1`] = ` +{ + "displayName": "Auto-Approval", + "name": "scriptTask-e8842de66fbb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "script": { + "file": "Auto-Approval - scriptTask-e8842de66fbb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Certifier Modifications - fulfillmentTask-cce84a670745/Certifier Modifications - fulfillmentTask-cce84a670745.json 1`] = ` +{ + "displayName": "Certifier Modifications", + "fulfillmentTask": { + "actors": { + "isExpression": true, + "value": "// Returns the certifier +(function() { + var content = execution.getVariables(); + var certifierId = content.get('certifierId'); + + return [{ + "id": "managed/user/" + certifierId, + "permissions": { + "fulfill": true, + "deny": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})() +", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "scriptTask-87ad089a5484", + }, + { + "condition": null, + "outcome": "DENY", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "name": "fulfillmentTask-cce84a670745", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Check Certification - exclusiveGateway-c82a357d8c38/Check Certification - exclusiveGateway-c82a357d8c38.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Check Certification - exclusiveGateway-c82a357d8c38/Check Certification - exclusiveGateway-c82a357d8c38.json 1`] = ` +{ + "displayName": "Check Certification", + "name": "exclusiveGateway-c82a357d8c38", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "certification == true", + "outcome": "isCertification", + "step": "fulfillmentTask-cce84a670745", + }, + { + "condition": "certification == false", + "outcome": "isNotCertification", + "step": "scriptTask-87ad089a5484", + }, + ], + "script": { + "file": "Check Certification - exclusiveGateway-c82a357d8c38.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Context Check - scriptTask-365b50ab00a7/Context Check - scriptTask-365b50ab00a7.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var certification = false; +var certifierId = null; +var isCertifierOwnerSame = false; +var entitlementOwnerId = null; +let isTenantAdmin = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'certification') { + certification = true; + if(requestObj && requestObj.entitlementOwner && requestObj.entitlementOwner.length){ + entitlementOwnerId = requestObj.entitlementOwner[0].id + } + const campaignId = requestObj.request.common.context.campaignId; + const lineItemId = requestObj.request.common.context.lineItemId; + + // Add a comment on the certification item denoting the request ID + var commentResp = openidm.action('/iga/governance/certification/' + campaignId + '/items/comment', 'POST', { "ids": [lineItemId], "comment": "ID of modify entitlement request: " + requestId }, {}); + + var lineItemRespObj = openidm.action('/iga/governance/certification/' + campaignId + '/items/' + lineItemId, 'GET', {}, {"isAdmin":true}); + if (lineItemRespObj.result[0]) { + const decisionById = lineItemRespObj.result[0].decision.certification.decisionBy.id; + const primaryReviewerId = lineItemRespObj.result[0].decision.certification.primaryReviewer.id + let isTenantAdmin = false; + + if (decisionById === 'SYSTEM') { + isTenantAdmin = true; + } else { + isTenantAdmin = decisionById.split('/')[1] === 'teammember'; + } + + if (isTenantAdmin) { + certifierId = primaryReviewerId.split('/')[2]; + } else { + certifierId = decisionById.split('/')[2]; + } + isCertifierOwnerSame = entitlementOwnerId === certifierId; + } + } + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} + +execution.setVariable("context", context); +execution.setVariable("certification", certification); +execution.setVariable("certifierId", certifierId); +execution.setVariable("isCertifierOwnerSame", isCertifierOwnerSame); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Context Check - scriptTask-365b50ab00a7/Context Check - scriptTask-365b50ab00a7.json 1`] = ` +{ + "displayName": "Context Check", + "name": "scriptTask-365b50ab00a7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-c82a357d8c38", + }, + ], + "script": { + "file": "Context Check - scriptTask-365b50ab00a7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Modify Entitlement - scriptTask-0359a9d77ee2/Modify Entitlement - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Modify Entitlement - updating entitlement"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var entitlementId = null; + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + entitlementId = requestObj.request.entitlement.entitlementId; + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Modify entitlement failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + // Call IGA API for modifying entitlement + var payload = requestObj.request.entitlement; + var queryParams = { + "_action": "update", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/entitlement/' + entitlementId , 'PUT', payload, queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Modify entitlement failed: Error updating entitlement " + payload.entitlementId + ". Error message: " + message; + } +} + +// Build the payload to update the request object with the final status, decision, and outcome +var decision = {'status': 'complete', 'decision': 'approved'}; +if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; +} +else { + decision.outcome = 'provisioned'; +} + +// Update request +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Modify Entitlement - scriptTask-0359a9d77ee2/Modify Entitlement - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Modify Entitlement", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Modify Entitlement - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Permission Check - scriptTask-87ad089a5484/Permission Check - scriptTask-87ad089a5484.js 1`] = ` +"// This permission check script will check that the requester has proper privileges to +// modify the entitlement for which they are requesting. If so, it will +// skip any approval process and directly move to modify the entitlement. + +logger.info("Modify Entitlement - Permission check"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var isCertifierOwnerSame = String(content.get('isCertifierOwnerSame')) === 'true'; +var skipApproval = true; + +try { + // Read the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + if(requester.id.startsWith('managed/user/')){ + // If requester is a managed user, check that the user has permissions to + // create entitlements for the requested application + var entitlementObj = requestObj.request.entitlement; + var userId = requester.id.split('/'); + var entitlement = openidm.action('iga/governance/entitlement/' + entitlementObj.entitlementId, 'GET', {}, {'endUserId': userId[2]}) + if(!entitlement.permissions.modifyEntitlement || !isCertifierOwnerSame){ + skipApproval = false; + } + } + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'certification' && !isCertifierOwnerSame) { + skipApproval = false; + } + } +} +catch (e) { + logger.info("Request permission check failed: " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Permission Check - scriptTask-87ad089a5484/Permission Check - scriptTask-87ad089a5484.json 1`] = ` +{ + "displayName": "Permission Check", + "name": "scriptTask-87ad089a5484", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-abbb089758c8", + }, + ], + "script": { + "file": "Permission Check - scriptTask-87ad089a5484.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Permission Gateway - exclusiveGateway-abbb089758c8/Permission Gateway - exclusiveGateway-abbb089758c8.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Permission Gateway - exclusiveGateway-abbb089758c8/Permission Gateway - exclusiveGateway-abbb089758c8.json 1`] = ` +{ + "displayName": "Permission Gateway", + "name": "exclusiveGateway-abbb089758c8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-e8842de66fbb", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Permission Gateway - exclusiveGateway-abbb089758c8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Modify entitlement - rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyEntitlement/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/ModifyUser.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "Basic Request flow to modify a user", + "displayName": "Modify User", + "id": "ModifyUser", + "mutable": false, + "name": "ModifyUser", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1223, + "y": 156, + }, + "startNode": { + "connections": { + "start": "scriptTask-ca9504ae90d8", + }, + "id": "startNode", + "x": 12, + "y": 110, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action('iga/commons/config/iga_access_request', 'GET', {}, {}); + return systemSettings.defaultApprover; +})()", + }, + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 691, + "y": 168, + }, + "exclusiveGateway-abbb089758c8": { + "x": 434, + "y": 89.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 946, + "y": 78.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 936, + "y": 242.015625, + }, + "scriptTask-ca9504ae90d8": { + "x": 136, + "y": 111.015625, + }, + "scriptTask-e8842de66fbb": { + "x": 693, + "y": 79.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action('iga/commons/config/iga_access_request', 'GET', {}, {}); + return systemSettings.defaultApprover; +})()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0359a9d77ee2", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +logger.info("Modify Entitlement request id " + requestId + " - marking request as auto approved."); + +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to user having modify privileges." + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + var failureReason = "Failure updating decision on request id " + requestId + ". Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Auto-Approval - scriptTask-e8842de66fbb/Auto-Approval - scriptTask-e8842de66fbb.json 1`] = ` +{ + "displayName": "Auto-Approval", + "name": "scriptTask-e8842de66fbb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-0359a9d77ee2", + }, + ], + "script": { + "file": "Auto-Approval - scriptTask-e8842de66fbb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Context Gateway - exclusiveGateway-abbb089758c8/Context Gateway - exclusiveGateway-abbb089758c8.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-abbb089758c8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-e8842de66fbb", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-abbb089758c8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.js 1`] = ` +"// This permission check script will check that the requester has proper privileges to +// modify the user for which they are requesting. If so, it will +// skip any approval process and directly move to modify the user. + +var content = execution.getVariables(); +var requestId = content.get('id'); +logger.info("Modify User - Permission check - request id " + requestId); +var skipApproval = false; + +try { + // Read the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + if(requester.id.startsWith('managed/user/')){ + // If requester is a managed user, check that the user has permissions to + var userId = requestObj.request.user.userId; + var requesterId = requester.id.split('/'); + var userResponse = openidm.action('iga/governance/user/', 'GET', {}, {'endUserId': requesterId[2], 'scopePermission': 'modifyUser', '_queryFilter': \`id+eq+'\` + userId + \`'\`}) + if(userResponse.result[0].permissions.modifyUser){ + skipApproval = true; + } + } + else{ + // Tenant admins and system requests + skipApproval = true; + } +} +catch (e) { + logger.info("Request permission check failed - request id " + requestId + ": " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Permission Check - scriptTask-ca9504ae90d8/Permission Check - scriptTask-ca9504ae90d8.json 1`] = ` +{ + "displayName": "Permission Check", + "name": "scriptTask-ca9504ae90d8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-abbb089758c8", + }, + ], + "script": { + "file": "Permission Check - scriptTask-ca9504ae90d8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Modify User - rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Update User - scriptTask-0359a9d77ee2/Update User - scriptTask-0359a9d77ee2.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +logger.info("Modify User request id " + requestId + " - modifying user"); + +var failureReason = null; + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +} +catch (e) { + failureReason = "Modify user failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + var modifiedAttributes = requestObj.request.user.object; + var userId = requestObj.request.user.userId; + try { + var payload = []; + + for(var key in modifiedAttributes) { + payload.push({ + "operation": "replace", + "field": "/" + key, + "value": modifiedAttributes[key] + }) + } + + var result = openidm.patch('managed/alpha_user/' + userId , null, payload); + } + catch (e) { + failureReason = "Modify user failed - request id " + requestId + ": Error updating user " + userId + ". Error message: " + e.message; + logger.warn(failureReason); + } +} + +// Build the payload to update the request object with the final status, decision, and outcome +var decision = {'status': 'complete', 'decision': 'approved'}; +if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; +} +else { + decision.outcome = 'provisioned'; +} + +// Update request +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/ModifyUser/steps/Update User - scriptTask-0359a9d77ee2/Update User - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Update User", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Update User - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/custom-1-BasicEntitlementGrant.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "custom-1-BasicEntitlementGrant", + "displayName": "custom-1-BasicEntitlementGrant", + "id": "custom1BasicEntitlementGrant", + "mutable": true, + "name": "custom-1-BasicEntitlementGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2597, + "y": 322, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 722, + "y": 156, + }, + "exclusiveGateway-48e748c42994": { + "x": 1731, + "y": 88.015625, + }, + "exclusiveGateway-67a954f33919": { + "x": 467, + "y": 121.015625, + }, + "inclusiveGateway-3f85f36eeeef": { + "x": 948, + "y": 57.015625, + }, + "inclusiveGateway-f105ed2b352d": { + "x": 2255, + "y": 48.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1972, + "y": 119.015625, + }, + "scriptTask-0b56191887de": { + "x": 1979, + "y": 212.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 1434, + "y": 95.015625, + }, + "scriptTask-91769554db51": { + "x": 2561, + "y": 74.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1441, + "y": 268.015625, + }, + "scriptTask-e04f42607ba5": { + "x": 186, + "y": 143.015625, + }, + "scriptTask-e21178ab80f7": { + "x": 716, + "y": 74.015625, + }, + "waitTask-0d53639996da": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1208, + "y": 30.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "entitlementId": request.common.entitlementId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/entitlementRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.warn('Create Removal Request failed to create') + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-91769554db51", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-91769554db51.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Custom Provisioning - scriptTask-0359a9d77ee2/Custom Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var authzRoleId = content.get('authzRoleId'); + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + + + // --- Conditional authzRoles patch for custom/internal role entitlements --- + if (entitlementType === 'custom' && accountAttribute === 'authzRoles') { + try { + openidm.patch( + 'managed/alpha_user/' + request.common.userId, + null, + [{ + "operation": "add", + "field": "/authzRoles/-", + "value": { "_ref": "internal/role/" + authzRoleId } + }] + ); + logger.info("custom-BasicEntitlementGrant - authzRoles patch successful" + + " | userId: " + request.common.userId + + " | entitlementId: " + authzRoleId); + } catch (e) { + failureReason = "Provisioning succeeded but authzRoles patch failed" + + " for user " + request.common.userId + + " and entitlement " + authzRoleId + + ". Error: " + e.message; + logger.error(failureReason); + } + } + + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Custom Provisioning - scriptTask-0359a9d77ee2/Custom Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Custom Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-f105ed2b352d", + }, + ], + "script": { + "file": "Custom Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Custom Request Approved - scriptTask-e21178ab80f7/Custom Request Approved - scriptTask-e21178ab80f7.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +var entitlementType = content.get('entitlementType'); + +try { + var decision = { + "decision": "approved", + } + if(skipApproval && entitlementType == 'custom'){ + decision.comment = "Custom request auto-approved due to request context: " + context; + } + else if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Custom Request Approved - scriptTask-e21178ab80f7/Custom Request Approved - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Custom Request Approved", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Custom Request Approved - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Custom Request Context Check - scriptTask-e04f42607ba5/Custom Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"/* + * Script Node: Context & Type Check + * Purpose: Reads request context and entitlement type to set routing outcomes. + * Sets: context, waits, skipApproval, entitlementType, entitlementId, userId, failureReason, accountAttribute, authzRoleId + */ + +logger.info("custom-BasicEntitlementGrant - Context & Type Check"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +var entitlementType = null; +var entitlementId = null; +var userId = null; +var failureReason = null; +var accountAttribute = null; +var authzRoleId = null; + +// Read request object +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + // --- Context check --- + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + + // --- Wait flags --- + if (requestObj.request.common.startDate) { + enableWait = true; + } + if (requestObj.request.common.endDate) { + enableEndWait = true; + } + + // --- User --- + userId = requestObj.request.common.userId; + + // --- Entitlement ID --- + entitlementId = requestObj.request.common.entitlementId; + + // Entitlement type + if (entitlementId) { + try { + var entitlementObj = openidm.action('iga/governance/entitlement/' + entitlementId, 'GET', {}, {}); + if (entitlementObj + && entitlementObj.glossary + && entitlementObj.glossary.idx + && entitlementObj.glossary.idx['/entitlement'] + && entitlementObj.glossary.idx['/entitlement'].entitlementType) { + + entitlementType = entitlementObj.glossary.idx['/entitlement'].entitlementType; + + } else { + entitlementType = 'standard'; + } + + // --- authzRoleId --- + if (entitlementObj + && entitlementObj.entitlement + && entitlementObj.entitlement._id) { + + authzRoleId = entitlementObj.entitlement._id; + + } + + // --- accountAttribute --- + accountAttribute = (entitlementObj + && entitlementObj.item + && entitlementObj.item.accountAttribute) + ? entitlementObj.item.accountAttribute + : null; + } catch (e) { + logger.warn("Entitlement lookup error: " + e.message); + + entitlementType = 'standard'; + } + } else { + entitlementType = 'standard'; + } + + // --- Log comment to request audit trail --- + try { + var logComment = "Context & Type Check" + + " | userId: " + userId + + " | context: " + context + + " | entitlementId: " + entitlementId + + " | entitlementType: " + entitlementType + + " | skipApproval: " + skipApproval + + " | authzRoleId: " + authzRoleId; + + + openidm.action( + 'iga/governance/requests/' + requestId, + 'POST', + { 'comment': logComment }, + { '_action': 'update' } + ); + } catch (e) { + logger.error("Failed to write log comment: " + e.message); + } + +} catch (e) { + failureReason = 'Context & Type Check failed: ' + e.message; + logger.error(failureReason); +} + +logger.info("Context: " + context + " | EntitlementType: " + entitlementType + " | UserId: " + userId); + +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +execution.setVariable("entitlementType", entitlementType); +execution.setVariable("entitlementId", entitlementId); +execution.setVariable("userId", userId); +execution.setVariable("failureReason", failureReason); +execution.setVariable("accountAttribute", accountAttribute); +execution.setVariable("authzRoleId", authzRoleId); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Custom Request Context Check - scriptTask-e04f42607ba5/Custom Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Custom Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-67a954f33919", + }, + ], + "script": { + "file": "Custom Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-f105ed2b352d", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-91769554db51", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-f105ed2b352d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-3f85f36eeeef", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-0d53639996da", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-3f85f36eeeef.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-1-BasicEntitlementGrant/steps/Wait Task - waitTask-0d53639996da/Wait Task - waitTask-0d53639996da.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-0d53639996da", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/custom-BasicEntitlementGrant.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "custom-BasicEntitlementGrant", + "displayName": "custom-BasicEntitlementGrant", + "id": "customBasicEntitlementGrant", + "mutable": true, + "name": "custom-BasicEntitlementGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2873, + "y": 976, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 184, + "y": 470, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 998, + "y": 810, + }, + "exclusiveGateway-26e6b56a6d6b": { + "x": 736, + "y": 231.03125, + }, + "exclusiveGateway-48e748c42994": { + "x": 2007, + "y": 742.015625, + }, + "exclusiveGateway-526a06894733": { + "x": 571, + "y": 458, + }, + "exclusiveGateway-67a954f33919": { + "x": 743, + "y": 775.015625, + }, + "inclusiveGateway-3f85f36eeeef": { + "x": 1224, + "y": 711.015625, + }, + "inclusiveGateway-f105ed2b352d": { + "x": 2531, + "y": 702.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 2248, + "y": 773.015625, + }, + "scriptTask-0b56191887de": { + "x": 2255, + "y": 866.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 1710, + "y": 749.015625, + }, + "scriptTask-6dc428f459a8": { + "x": 1026, + "y": 152.515625, + }, + "scriptTask-91769554db51": { + "x": 2837, + "y": 728.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1717, + "y": 922.015625, + }, + "scriptTask-e04f42607ba5": { + "x": 300, + "y": 472.015625, + }, + "scriptTask-e21178ab80f7": { + "x": 992, + "y": 728.015625, + }, + "waitTask-0d53639996da": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1484, + "y": 684.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "entitlementId": request.common.entitlementId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/entitlementRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.warn('Create Removal Request failed to create') + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-91769554db51", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-91769554db51.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Custom Auto Approval - scriptTask-6dc428f459a8/Custom Auto Approval - scriptTask-6dc428f459a8.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request type custom auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Custom Auto Approval - scriptTask-6dc428f459a8/Custom Auto Approval - scriptTask-6dc428f459a8.json 1`] = ` +{ + "displayName": "Custom Auto Approval", + "name": "scriptTask-6dc428f459a8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Custom Auto Approval - scriptTask-6dc428f459a8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Custom Context Gateway - exclusiveGateway-26e6b56a6d6b/Custom Context Gateway - exclusiveGateway-26e6b56a6d6b.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Custom Context Gateway - exclusiveGateway-26e6b56a6d6b/Custom Context Gateway - exclusiveGateway-26e6b56a6d6b.json 1`] = ` +{ + "displayName": "Custom Context Gateway", + "name": "exclusiveGateway-26e6b56a6d6b", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-6dc428f459a8", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Custom Context Gateway - exclusiveGateway-26e6b56a6d6b.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-f105ed2b352d", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-91769554db51", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-f105ed2b352d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-3f85f36eeeef", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-0d53639996da", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-3f85f36eeeef.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-f105ed2b352d", + }, + ], + "script": { + "file": "Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Request Approved - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"/* + * Script Node: Context & Type Check + * Purpose: Reads request context and entitlement type to set routing outcomes. + * Sets: context, waits, skipApproval, entitlementType, entitlementId, userId, failureReason, accountAttribute + */ + +logger.info("custom-BasicEntitlementGrant - Context & Type Check"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +var entitlementType = null; +var entitlementId = null; +var userId = null; +var failureReason = null; +var accountAttribute = null; + +// Read request object +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + // Context check (admin requests skip approval) + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + + // Optional Waits + if (requestObj.request.common.startDate) { + enableWait = true; + } + if (requestObj.request.common.endDate) { + enableEndWait = true; + } + + // User + userId = requestObj.request.common.userId; + + // Entitlement ID + entitlementId = requestObj.request.common.entitlementId; + + // Entitlement type + if (entitlementId) { + try { + var entitlementObj = openidm.action('iga/governance/entitlement/' + entitlementId, 'GET', {}, {}); + if (entitlementObj + && entitlementObj.glossary + && entitlementObj.glossary.idx + && entitlementObj.glossary.idx['/entitlement'] + && entitlementObj.glossary.idx['/entitlement'].entitlementType) { + + entitlementType = entitlementObj.glossary.idx['/entitlement'].entitlementType; + + } else { + entitlementType = 'standard'; + } + + // accountAttribute for provisioning node + accountAttribute = (entitlementObj + && entitlementObj.item + && entitlementObj.item.accountAttribute) + ? entitlementObj.item.accountAttribute + : null; + } catch (e) { + logger.warn("Entitlement lookup error: " + e.message); + + entitlementType = 'standard'; + } + } else { + entitlementType = 'standard'; + } + + +} catch (e) { + failureReason = 'Context & Type Check failed: ' + e.message; + logger.error(failureReason); +} + +logger.info("Context: " + context + " | EntitlementType: " + entitlementType + " | UserId: " + userId + " | AuthzRoleId: " + authzRoleId); + +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +execution.setVariable("entitlementType", entitlementType); +execution.setVariable("entitlementId", entitlementId); +execution.setVariable("userId", userId); +execution.setVariable("failureReason", failureReason); +execution.setVariable("accountAttribute", accountAttribute); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-526a06894733", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-526a06894733/Validation Gateway - exclusiveGateway-526a06894733.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Validation Gateway - exclusiveGateway-526a06894733/Validation Gateway - exclusiveGateway-526a06894733.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-526a06894733", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "entitlementType == 'custom'", + "outcome": "validationSuccess", + "step": "exclusiveGateway-26e6b56a6d6b", + }, + { + "condition": "entitlementType != 'custom'", + "outcome": "validationFailure", + "step": "exclusiveGateway-67a954f33919", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-526a06894733.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/custom-BasicEntitlementGrant/steps/Wait Task - waitTask-0d53639996da/Wait Task - waitTask-0d53639996da.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-0d53639996da", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/extendGrantEndDate.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "Basic Workflow to extend a grant end date", + "displayName": "Basic Grant End date Extension", + "id": "extendGrantEndDate", + "mutable": false, + "name": "extendGrantEndDate", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2087, + "y": 210, + }, + "startNode": { + "connections": { + "start": "scriptTask-b80009644545", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": { + "isExpression": true, + "value": "(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var userId = null; + const grantType = requestIndex.request.common.grantType; + if (grantType == 'roleMembership') { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + userId = requestIndex.roleOwner[0].id; + } + else if (systemSettings && systemSettings.defaultApprover) { + var approver = systemSettings.defaultApprover; + return approver; + } + } else if (grantType == 'entitlementGrant') { + userId = (requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id; + } else if (grantType == 'accountGrant') { + userId = requestIndex.applicationOwner[0].id + } + return [{ + "id": "managed/user/" + userId , + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})()", + }, + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 724, + "y": 277, + }, + "exclusiveGateway-2bf686c17905": { + "x": 457, + "y": 95.015625, + }, + "scriptTask-0c9ab2d8fd7f": { + "x": 1518, + "y": 114.015625, + }, + "scriptTask-b80009644545": { + "x": 164, + "y": 108.015625, + }, + "scriptTask-ba009484a101": { + "x": 1035, + "y": 114.015625, + }, + "scriptTask-c58309b8c470": { + "x": 1320, + "y": 373, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var userId = null; + const grantType = requestIndex.request.common.grantType; + if (grantType == 'roleMembership') { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + userId = requestIndex.roleOwner[0].id; + } + else if (systemSettings && systemSettings.defaultApprover) { + var approver = systemSettings.defaultApprover; + return approver; + } + } else if (grantType == 'entitlementGrant') { + userId = (requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id; + } else if (grantType == 'accountGrant') { + userId = requestIndex.applicationOwner[0].id + } + return [{ + "id": "managed/user/" + userId , + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-ba009484a101", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/Context Gateway - exclusiveGateway-2bf686c17905/Context Gateway - exclusiveGateway-2bf686c17905.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/Context Gateway - exclusiveGateway-2bf686c17905/Context Gateway - exclusiveGateway-2bf686c17905.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-2bf686c17905", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-ba009484a101", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-2bf686c17905.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-c58309b8c470", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-c58309b8c470.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/Request Approval - scriptTask-ba009484a101/Request Approval - scriptTask-ba009484a101.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved" + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/Request Approval - scriptTask-ba009484a101/Request Approval - scriptTask-ba009484a101.json 1`] = ` +{ + "displayName": "Request Approval", + "name": "scriptTask-ba009484a101", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-0c9ab2d8fd7f", + }, + ], + "script": { + "file": "Request Approval - scriptTask-ba009484a101.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/Request Context Check - scriptTask-b80009644545/Request Context Check - scriptTask-b80009644545.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var skipApproval = false; +var lineItemId = null; +var campaignId = null; +var enableWait = false; + +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + // Set execution variables from the request context + context = requestObj.request.common.context.type; + if (context == 'admin' || context == 'certification') { + skipApproval = true; + } + if (context == 'certification') { + lineItemId = requestObj.request.common.context.lineItemId; + campaignId = requestObj.request.common.context.campaignId + + // Add a comment on the certification item denoting the request ID + var commentResp = openidm.action('/iga/governance/certification/' + campaignId + '/items/comment', 'POST', { "ids": [lineItemId], "comment": "ID of application removal request: " + requestId }, {}) + } + + } + if (requestObj.request.common.endDate){ + enableWait = true; + } +} +catch (e) { + logger.info("Could not validate request context, normal approval process will be followed.") +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("lineItemId", lineItemId); +execution.setVariable("enableWait", enableWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/Request Context Check - scriptTask-b80009644545/Request Context Check - scriptTask-b80009644545.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-b80009644545", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-2bf686c17905", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-b80009644545.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/UpdateRevokeRequest - scriptTask-0c9ab2d8fd7f/UpdateRevokeRequest - scriptTask-0c9ab2d8fd7f.js 1`] = ` +"logger.info("Update existing revoke request with new extended end date"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var extendRequest = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (!extendRequest || !extendRequest.request || !extendRequest.request.common) { + throw new Error("Invalid extendRequest structure"); + } + logger.info("extendRequestObj: " + extendRequest); + + var catalogFieldMapper = { + "roleMembership": "roleId", + "accountGrant": "applicationId", + "entitlementGrant": "entitlementId" + } + + var grantType = extendRequest.request.common.grantType; + + if (!catalogFieldMapper[grantType]) { + throw new Error("Unsupported grantType: " + grantType); + } + var body = { + "targetFilter": { + "operand": [{ + "operator": "EQUALS", + "operand": { "targetName": "decision.status", "targetValue": "suspended" } + }, { + "operator": "EQUALS", + "operand": { "targetName": "request.common.userId", "targetValue": extendRequest.request.common.userId } + }, { + "operator": "EQUALS", + "operand": { "targetName": "request.common." + catalogFieldMapper[grantType], "targetValue": extendRequest.request.common.grantId } + }], + "operator": "AND" + } + } + logger.info('suspended request search body'+ JSON.stringify(body)); + var suspendedRequest = openidm.action('iga/governance/requests/search/', 'POST', body, {}); + if (suspendedRequest && suspendedRequest.result && suspendedRequest.result.length > 0) { + var suspendedReq = suspendedRequest.result[0]; + logger.info("found existing suspendedRequest: " + suspendedReq); + + if (!suspendedReq.decision || !suspendedReq.decision.phases || suspendedReq.decision.phases.length === 0) { + throw new Error("No decision phases found for suspended request " + suspendedReq.id); + } + + let queryParams = { + '_action': "changeResumeDate" + } + + let payload = { + "resumeDate": extendRequest.request.common.endDate + } + + var updateResult = openidm.action('iga/governance/requests/' + suspendedReq.id, 'POST', payload, queryParams) + logger.info("Successfully updated existing suspendedRequest: " + updateResult); + } + else { + // create a new revoke request with updated end date + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "userId": extendRequest.request.common.userId, + "endDate": extendRequest.request.common.endDate, + "sourceRequestId": requestId, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + newRequestPayload.common[catalogFieldMapper[grantType]] = extendRequest.request.common.grantId; + logger.info("newRequestPayload" + JSON.stringify(newRequestPayload)); + var queryParam = { + '_action': "publish" + } + const removeEndpoint = { + "roleMembership": "roleRemove", + "accountGrant": "applicationRemove", + "entitlementGrant": "entitlementRemove" + } + + var createResult = openidm.action('iga/governance/requests/'+ removeEndpoint[grantType], 'POST', newRequestPayload, queryParam) + logger.info("Successfully created new revoke request with an end date: " + createResult); + } + + var decision = {'outcome': 'fulfilled', 'status': 'complete'}; + var queryParams = { '_action': 'update'}; + logger.info("before updating workflow extend request" + decision); + var updateRes = openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("after updating workflow extend request" + updateRes); +} +catch (e) { + failureReason = "Update Revoke Request with extended end date failed: Error request with id " + e; + logger.info(failureReason); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/extendGrantEndDate/steps/UpdateRevokeRequest - scriptTask-0c9ab2d8fd7f/UpdateRevokeRequest - scriptTask-0c9ab2d8fd7f.json 1`] = ` +{ + "displayName": "UpdateRevokeRequest", + "name": "scriptTask-0c9ab2d8fd7f", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "UpdateRevokeRequest - scriptTask-0c9ab2d8fd7f.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/jh-ne-create-test-2.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "jh-ne-create-test-2", + "displayName": "jh-ne-create-test-2", + "id": "jhNeCreateTest2", + "mutable": true, + "name": "jh-ne-create-test-2", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 1463, + "y": 262, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-2131bbe3663d", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 50, + "y": 250, + }, + "uiConfig": { + "approvalTask-6649e6d6f2a3": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6a2d0e09-a9ac-41ca-af24-8af052c480f2", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 606.3999938964844, + "y": 431.6125030517578, + }, + "emailTask-731854fb34db": { + "x": 1119.3999938964844, + "y": 107.61250305175781, + }, + "exclusiveGateway-69f93dd39054": { + "x": 394.3999938964844, + "y": 252.6125030517578, + }, + "scriptTask-2131bbe3663d": { + "x": 156.39999389648438, + "y": 252.6125030517578, + }, + "scriptTask-c174d2210667": { + "x": 814.3999938964844, + "y": 43.61250305175781, + }, + "scriptTask-f2a2d7eee947": { + "x": 821.3999938964844, + "y": 298.6125030517578, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/steps/%22Create%22 User - scriptTask-f2a2d7eee947/%22Create%22 User - scriptTask-f2a2d7eee947.js 1`] = ` +"logger.info("Creating User"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var request = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + request = requestObj.request; + + + + // var payload = { + // "userName": request.custom.userName, + // "givenName": request.custom.givenName, + // "sn": request.custom.sn, + // "mail": request.custom.mail, + // "password": 'DemoP@ssword1' + // }; + + /** Create new user **/ + // var result = openidm.create('managed/alpha_user', null, payload, queryParams); + + // /** Send new user email **/ + // var body = { + // subject: "Welcome " + payload.givenName + " " + payload.sn + "!", + // to: payload.mail, + // body: "Your new user has been created in the system.\\n\\nUsername: " + payload.userName + "\\nPassword: " + payload.password + "\\n\\nLogin to your account here: https://openam-gov-dev-4.forgeblocks.com/am/XUI/?realm=/alpha#/", + // object: {} + // }; + // openidm.action("external/email", "send", body); + } + catch (e) { + failureReason = "Creating user failed: Error during creation of user " + request.custom.userName + ". Error message: " + e.message; + } + + var decision = {'status': 'complete', 'decision': 'approved', "comment": JSON.stringify(request)}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/steps/%22Create%22 User - scriptTask-f2a2d7eee947/%22Create%22 User - scriptTask-f2a2d7eee947.json 1`] = ` +{ + "displayName": ""Create" User", + "name": "scriptTask-f2a2d7eee947", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "emailTask-731854fb34db", + }, + ], + "script": { + "file": "%22Create%22 User - scriptTask-f2a2d7eee947.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/steps/Account Creation Email - emailTask-731854fb34db/Account Creation Email - emailTask-731854fb34db.json 1`] = ` +{ + "displayName": "Account Creation Email", + "emailTask": { + "bcc": "", + "cc": "", + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": null, + }, + { + "condition": null, + "outcome": "FAILED", + "step": null, + }, + ], + "object": { + "cn": "9959348", + "custom_DisplayName": "Jack Hatton", + "custom_LocationName": "remote", + "custom_siteLocation": "remote", + "manager": "test", + }, + "templateName": "staffNe1AccountCreation", + "to": "jhatton@trivir.com", + }, + "name": "emailTask-731854fb34db", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/steps/Approval Task - approvalTask-6649e6d6f2a3/Approval Task - approvalTask-6649e6d6f2a3.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6a2d0e09-a9ac-41ca-af24-8af052c480f2", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-f2a2d7eee947", + }, + { + "condition": null, + "outcome": "REJECT", + "step": null, + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-6649e6d6f2a3", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/steps/Auto Approve Gateway - exclusiveGateway-69f93dd39054/Auto Approve Gateway - exclusiveGateway-69f93dd39054.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/steps/Auto Approve Gateway - exclusiveGateway-69f93dd39054/Auto Approve Gateway - exclusiveGateway-69f93dd39054.json 1`] = ` +{ + "displayName": "Auto Approve Gateway", + "name": "exclusiveGateway-69f93dd39054", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApprove", + "step": "scriptTask-c174d2210667", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-6649e6d6f2a3", + }, + ], + "script": { + "file": "Auto Approve Gateway - exclusiveGateway-69f93dd39054.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/steps/Mark Approved - scriptTask-c174d2210667/Mark Approved - scriptTask-c174d2210667.js 1`] = ` +"logger.info("Create User - marking request as auto approved."); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var queryParams = { "_action": "update" } + +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to requester having create user privileges." + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/steps/Mark Approved - scriptTask-c174d2210667/Mark Approved - scriptTask-c174d2210667.json 1`] = ` +{ + "displayName": "Mark Approved", + "name": "scriptTask-c174d2210667", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "emailTask-731854fb34db", + }, + ], + "script": { + "file": "Mark Approved - scriptTask-c174d2210667.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/steps/Permissions Check - scriptTask-2131bbe3663d/Permissions Check - scriptTask-2131bbe3663d.js 1`] = ` +"logger.info("Create User - Permission check"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var skipApproval = false; + +try { + // Read the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requester = requestObj.requester + + if(requester.id.startsWith('managed/user/')){ + // If requester is a normal managed user, check that the user has permissions to create a user + var userId = requester.id.split('/'); + var user = openidm.action('iga/governance/user', 'GET', {}, {'endUserId': userId[2], 'scopePermission': 'createUser', '_queryFilter': \`id+eq+'\` + userId[2] + \`'\`}) + if(user.result.length > 0){ + skipApproval = true; + } + } + else{ + // Tenant admins and system requests + skipApproval = true; + } +} +catch (e) { + logger.info("Request permission check failed: " + e.message); +} + +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/jh-ne-create-test-2/steps/Permissions Check - scriptTask-2131bbe3663d/Permissions Check - scriptTask-2131bbe3663d.json 1`] = ` +{ + "displayName": "Permissions Check", + "name": "scriptTask-2131bbe3663d", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-69f93dd39054", + }, + ], + "script": { + "file": "Permissions Check - scriptTask-2131bbe3663d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/pgh-generate-rap/pgh-generate-rap.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "pgh-generate-rap", + "displayName": "pgh-generate-rap", + "id": "pghGenerateRap", + "mutable": true, + "name": "pgh-generate-rap", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 1156, + "y": 151, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-115d1ab72679", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 70, + "y": 151, + }, + "uiConfig": { + "exclusiveGateway-2d4351f5c77b": { + "x": 451, + "y": 126.5, + }, + "fulfillmentTask-f49f20d19149": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDateType": "duration", + "expirationDateVariable": "", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 683, + "y": 126.5, + }, + "scriptTask-115d1ab72679": { + "x": 208, + "y": 158, + }, + "scriptTask-5a2b73dd9dd2": { + "x": 916, + "y": 80, + }, + "scriptTask-6f260211dc0f": { + "x": 916, + "y": 226, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/pgh-generate-rap/steps/Auto Approve - scriptTask-5a2b73dd9dd2/Auto Approve - scriptTask-5a2b73dd9dd2.js 1`] = ` +"function updateRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action('iga/governance/requests/' + requestId, 'POST', body, { _action: "update" }); +} + +function modifyRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action('iga/governance/requests/' + requestId, 'POST', body, { _action: "modify", phaseName: execution.getVariables().get('phaseName') }); +} + +function commentRequest(message, isFail) { + return updateRequest({ comment: message, failure: isFail }); +} + +function approveRequest() { + updateRequest({ + outcome: 'fulfilled', + status: 'complete', + decision: 'approved' + }); +} + +function main() { + try { + modifyRequest({ + common: { + isDraft: false, + context: { + type: "request" + } + }, + custom: { + idPath: execution.getVariables().get('idPath'), + rap: "" + } + }); + approveRequest(); + } catch (e) { + commentRequest("Failure auto-approving RAP request. Error message: " + e.message, true); + } +} + +main(); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/pgh-generate-rap/steps/Auto Approve - scriptTask-5a2b73dd9dd2/Auto Approve - scriptTask-5a2b73dd9dd2.json 1`] = ` +{ + "displayName": "Auto Approve", + "name": "scriptTask-5a2b73dd9dd2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Auto Approve - scriptTask-5a2b73dd9dd2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/pgh-generate-rap/steps/Auto Reject - scriptTask-6f260211dc0f/Auto Reject - scriptTask-6f260211dc0f.js 1`] = ` +"function updateRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action('iga/governance/requests/' + requestId, 'POST', body, { _action: "update" }); +} + +function modifyRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action('iga/governance/requests/' + requestId, 'POST', body, { _action: "modify", phaseName: execution.getVariables().get('phaseName') }); +} + +function commentRequest(message, isFail) { + return updateRequest({ comment: message, failure: isFail }); +} + +function rejectRequest() { + updateRequest({ + outcome: 'cancelled', + status: 'complete', + decision: 'rejected' + }); +} + +function main() { + try { + modifyRequest({ + common: { + isDraft: false, + context: { + type: "request" + } + }, + custom: { + idPath: execution.getVariables().get('idPath'), + rap: "" + } + }); + rejectRequest(); + } catch (e) { + commentRequest("Failure auto-rejecting RAP request. Error message: " + e.message, true); + } +} + +main(); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/pgh-generate-rap/steps/Auto Reject - scriptTask-6f260211dc0f/Auto Reject - scriptTask-6f260211dc0f.json 1`] = ` +{ + "displayName": "Auto Reject", + "name": "scriptTask-6f260211dc0f", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Auto Reject - scriptTask-6f260211dc0f.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/pgh-generate-rap/steps/Confirm RAP - fulfillmentTask-f49f20d19149/Confirm RAP - fulfillmentTask-f49f20d19149.json 1`] = ` +{ + "displayName": "Confirm RAP", + "fulfillmentTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "approvalMode": "any", + "events": {}, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "scriptTask-5a2b73dd9dd2", + }, + { + "condition": null, + "outcome": "DENY", + "step": "scriptTask-6f260211dc0f", + }, + ], + }, + "name": "fulfillmentTask-f49f20d19149", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/pgh-generate-rap/steps/Generate RAP - scriptTask-115d1ab72679/Generate RAP - scriptTask-115d1ab72679.js 1`] = ` +"function getPublishedWorkflow(workflowId) { + return openidm.action(\`iga/governance/workflow/\${workflowId}/published\`, 'GET', {}, {}); +} + +function getRequestType(requestTypeId) { + return openidm.action(\`iga/governance/requestTypes/\${requestTypeId}\`, 'GET', {}, {}); +} + +function getRequest() { + var requestId = execution.getVariables().get('id'); + return openidm.action(\`iga/governance/requests/\${requestId}\`, 'GET', {}, {}); +} + +function modifyRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action(\`iga/governance/requests/\${requestId}\`, 'POST', body, { _action: "modify", phaseName: execution.getVariables().get('phaseName') }); +} + +function updateRequest(body) { + var requestId = execution.getVariables().get('id'); + return openidm.action(\`iga/governance/requests/\${requestId}\`, 'POST', body, { _action: "update" }); +} + +function commentRequest(message, isFail) { + return updateRequest({ comment: message, failure: !!isFail }); +} + +function main() { + var isSuccessful = false; + try { + var request = getRequest(); + + // Get user ID + var idPath = request.request.custom.idPath; + var userId = idPath.split('/').pop(); + execution.setVariable("idPath", idPath); + + // Get script ID for the phase name + var requestType = getRequestType(request.requestType); + var workflow = getPublishedWorkflow(requestType.workflow.id); + execution.setVariable("phaseName", workflow.staticNodes.startNode.connections.start); + + // Generate RAP + var response = openidm.action('endpoint/helpdesk-rap/generate/' + userId, 'create', {}, {}); + modifyRequest({ + common: { + isDraft: false, + context: { + type: "request" + } + }, + custom: { + idPath: idPath, + rap: response.rap + } + }); + isSuccessful = true; + } catch (e) { + commentRequest("Error generating RAP. Error message: " + e.message, true); + } finally { + execution.setVariable("isSuccessful", isSuccessful); + } +} + +main(); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/pgh-generate-rap/steps/Generate RAP - scriptTask-115d1ab72679/Generate RAP - scriptTask-115d1ab72679.json 1`] = ` +{ + "displayName": "Generate RAP", + "name": "scriptTask-115d1ab72679", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-2d4351f5c77b", + }, + ], + "script": { + "file": "Generate RAP - scriptTask-115d1ab72679.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/pgh-generate-rap/steps/Is Successful - exclusiveGateway-2d4351f5c77b/Is Successful - exclusiveGateway-2d4351f5c77b.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/pgh-generate-rap/steps/Is Successful - exclusiveGateway-2d4351f5c77b/Is Successful - exclusiveGateway-2d4351f5c77b.json 1`] = ` +{ + "displayName": "Is Successful", + "name": "exclusiveGateway-2d4351f5c77b", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "isSuccessful == true", + "outcome": "success", + "step": "fulfillmentTask-f49f20d19149", + }, + { + "condition": "isSuccessful == false", + "outcome": "error", + "step": "scriptTask-6f260211dc0f", + }, + ], + "script": { + "file": "Is Successful - exclusiveGateway-2d4351f5c77b.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/phh-BasicApplicationGrant.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-BasicApplicationGrant", + "displayName": "phh-BasicApplicationGrant", + "id": "phhBasicApplicationGrant", + "mutable": true, + "name": "phh-BasicApplicationGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2822, + "y": 352, + }, + "startNode": { + "connections": { + "start": "scriptTask-4e9121fe850a", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-440960b2744d": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1038.7499923706055, + "y": 469.76562881469727, + }, + "approvalTask-5d1d9c5d8384": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1039.2499923706055, + "y": 334.76562881469727, + }, + "approvalTask-6ad92fcbe998": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1037.2499923706055, + "y": 601.7656288146973, + }, + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 1, + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 682, + "y": 155, + }, + "approvalTask-ffa3a83b9dfd": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1039.9999923706055, + "y": 736.7656288146973, + }, + "exclusiveGateway-5167870154a9": { + "x": 1855, + "y": 84, + }, + "exclusiveGateway-621c9996676a": { + "x": 433, + "y": 117.015625, + }, + "inclusiveGateway-2fbd3e7aa50c": { + "x": 803.3999938964844, + "y": 472.6125030517578, + }, + "inclusiveGateway-7d248125a9bd": { + "x": 2417, + "y": 43.015625, + }, + "inclusiveGateway-a71e67faaad1": { + "x": 1124, + "y": 93.015625, + }, + "scriptTask-0e5b6187ea62": { + "x": 889, + "y": 116.015625, + }, + "scriptTask-14acc58c28dd": { + "x": 2650, + "y": 85.015625, + }, + "scriptTask-3a74557440fb": { + "x": 2144, + "y": 62, + }, + "scriptTask-4e9121fe850a": { + "x": 168, + "y": 140.015625, + }, + "scriptTask-626899b6e99a": { + "x": 1549, + "y": 108, + }, + "scriptTask-744ef6a8b9a2": { + "x": 2151, + "y": 207.015625, + }, + "scriptTask-c444d08a6099": { + "x": 818.3999938964844, + "y": 348.6125030517578, + }, + "scriptTask-c58309b8c470": { + "x": 1554, + "y": 242, + }, + "waitTask-13cf96ebeb37": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + "resumeDateVariable": "startDate", + }, + "x": 1339, + "y": 85.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Application Grant Validation - scriptTask-626899b6e99a/Application Grant Validation - scriptTask-626899b6e99a.js 1`] = ` +"logger.info("Running application grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var app = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check the user does not already have application granted +// Note: this is done at request submission time as well, the following is an example of how to check user's accounts +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + failureReason = "Validation failed: User with id " + requestObj.user.id + " already has effective application " + applicationId; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check effective applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Application Grant Validation - scriptTask-626899b6e99a/Application Grant Validation - scriptTask-626899b6e99a.json 1`] = ` +{ + "displayName": "Application Grant Validation", + "name": "scriptTask-626899b6e99a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-5167870154a9", + }, + ], + "script": { + "file": "Application Grant Validation - scriptTask-626899b6e99a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Application Grant Validation Failure - scriptTask-744ef6a8b9a2/Application Grant Validation Failure - scriptTask-744ef6a8b9a2.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Application Grant Validation Failure - scriptTask-744ef6a8b9a2/Application Grant Validation Failure - scriptTask-744ef6a8b9a2.json 1`] = ` +{ + "displayName": "Application Grant Validation Failure", + "name": "scriptTask-744ef6a8b9a2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Application Grant Validation Failure - scriptTask-744ef6a8b9a2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Approval Task - approvalTask-6ad92fcbe998/Approval Task - approvalTask-6ad92fcbe998.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-6ad92fcbe998", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*1*24*60*60*1000))).toISOString()", + }, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-c444d08a6099", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Approval Task - approvalTask-440960b2744d/Approval Task - approvalTask-440960b2744d.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-440960b2744d", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Approval Task - approvalTask-ffa3a83b9dfd/Approval Task - approvalTask-ffa3a83b9dfd.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-ffa3a83b9dfd", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Check LOB - scriptTask-c444d08a6099/Check LOB - scriptTask-c444d08a6099.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ + +var content = execution.getVariables(); +var requestId = content.get('id'); +var requestObj = null; +var appId = null; +var appGlossary = null; +var lob = null; +try { +requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +appId = requestObj.application.id; +} +catch (e) { +logger.info("Validation failed: Error reading application grant request with id " + requestId); +} +try { +appGlossary = openidm.action('iga/governance/application/' + appId + '/glossary', 'GET', {}, {}); +lob = appGlossary.lineOfBusiness || "default" +execution.setVariable("lob", lob); +} +catch (e) { +logger.info("Could not retrieve glossary with appId " + appId + " from application grant request ID " + requestId); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Check LOB - scriptTask-c444d08a6099/Check LOB - scriptTask-c444d08a6099.json 1`] = ` +{ + "displayName": "Check LOB", + "name": "scriptTask-c444d08a6099", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-2fbd3e7aa50c", + }, + ], + "script": { + "file": "Check LOB - scriptTask-c444d08a6099.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-621c9996676a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-621c9996676a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Create Removal Request - scriptTask-14acc58c28dd/Create Removal Request - scriptTask-14acc58c28dd.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "applicationId": request.common.applicationId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/applicationRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.info("Create Removal Request failed to create request") + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Create Removal Request - scriptTask-14acc58c28dd/Create Removal Request - scriptTask-14acc58c28dd.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-14acc58c28dd", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-14acc58c28dd.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Has End Date - inclusiveGateway-7d248125a9bd/Has End Date - inclusiveGateway-7d248125a9bd.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Has End Date - inclusiveGateway-7d248125a9bd/Has End Date - inclusiveGateway-7d248125a9bd.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-7d248125a9bd", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-14acc58c28dd", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-7d248125a9bd.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Has Start Date - inclusiveGateway-a71e67faaad1/Has Start Date - inclusiveGateway-a71e67faaad1.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Has Start Date - inclusiveGateway-a71e67faaad1/Has Start Date - inclusiveGateway-a71e67faaad1.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-a71e67faaad1", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-13cf96ebeb37", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-626899b6e99a", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-a71e67faaad1.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/LOB - inclusiveGateway-2fbd3e7aa50c/LOB - inclusiveGateway-2fbd3e7aa50c.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/LOB - inclusiveGateway-2fbd3e7aa50c/LOB - inclusiveGateway-2fbd3e7aa50c.json 1`] = ` +{ + "displayName": "LOB", + "name": "inclusiveGateway-2fbd3e7aa50c", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "lob == "sales"", + "outcome": "sales", + "step": "approvalTask-5d1d9c5d8384", + }, + { + "condition": "lob == "finance"", + "outcome": "finance", + "step": "approvalTask-440960b2744d", + }, + { + "condition": "lob == "hr"", + "outcome": "humanResources", + "step": "approvalTask-6ad92fcbe998", + }, + { + "condition": "lob == "default"", + "outcome": "null", + "step": "approvalTask-ffa3a83b9dfd", + }, + ], + "script": { + "file": "LOB - inclusiveGateway-2fbd3e7aa50c.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Provisioning - scriptTask-3a74557440fb/Provisioning - scriptTask-3a74557440fb.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "applicationId": request.common.applicationId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning account to user " + request.common.userId + " for application " + request.common.applicationId + ". Error message: " + message; + } + + var decision = {'status': 'complete'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Provisioning - scriptTask-3a74557440fb/Provisioning - scriptTask-3a74557440fb.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-3a74557440fb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-7d248125a9bd", + }, + ], + "script": { + "file": "Provisioning - scriptTask-3a74557440fb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-c58309b8c470", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-c58309b8c470.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if (skipApproval) { + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-0e5b6187ea62", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-a71e67faaad1", + }, + ], + "script": { + "file": "Request Approved - scriptTask-0e5b6187ea62.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-4e9121fe850a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-621c9996676a", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-4e9121fe850a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Sales Approver Role - approvalTask-5d1d9c5d8384/Sales Approver Role - approvalTask-5d1d9c5d8384.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Sales Approver Role", + "name": "approvalTask-5d1d9c5d8384", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Validation Gateway - exclusiveGateway-5167870154a9/Validation Gateway - exclusiveGateway-5167870154a9.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Validation Gateway - exclusiveGateway-5167870154a9/Validation Gateway - exclusiveGateway-5167870154a9.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-5167870154a9", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationSuccess", + "step": "scriptTask-3a74557440fb", + }, + { + "condition": "failureReason != null", + "outcome": "validationFailure", + "step": "scriptTask-744ef6a8b9a2", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-5167870154a9.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-BasicApplicationGrant/steps/Wait Task - waitTask-13cf96ebeb37/Wait Task - waitTask-13cf96ebeb37.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-13cf96ebeb37", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-626899b6e99a", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/phh-InternalRoleEntitlementGrant.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-InternalRoleEntitlementGrant", + "displayName": "phh-InternalRoleEntitlementGrant", + "id": "phhInternalRoleEntitlementGrant", + "mutable": true, + "name": "phh-InternalRoleEntitlementGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2597, + "y": 322, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 722, + "y": 156, + }, + "exclusiveGateway-48e748c42994": { + "x": 1731, + "y": 88.015625, + }, + "exclusiveGateway-67a954f33919": { + "x": 467, + "y": 121.015625, + }, + "inclusiveGateway-3f85f36eeeef": { + "x": 948, + "y": 57.015625, + }, + "inclusiveGateway-f105ed2b352d": { + "x": 2255, + "y": 48.015625, + }, + "scriptTask-0359a9d77ee2": { + "x": 1972, + "y": 119.015625, + }, + "scriptTask-0b56191887de": { + "x": 1979, + "y": 212.015625, + }, + "scriptTask-3eab1948f1ec": { + "x": 1434, + "y": 95.015625, + }, + "scriptTask-91769554db51": { + "x": 2561, + "y": 74.015625, + }, + "scriptTask-aec6c36b3a45": { + "x": 1441, + "y": 268.015625, + }, + "scriptTask-e04f42607ba5": { + "x": 186, + "y": 143.015625, + }, + "scriptTask-e21178ab80f7": { + "x": 716, + "y": 74.015625, + }, + "waitTask-0d53639996da": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 1208, + "y": 30.015625, + }, + }, + }, + "status": "draft", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "entitlementId": request.common.entitlementId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/entitlementRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.warn('Create Removal Request failed to create') + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Create Removal Request - scriptTask-91769554db51/Create Removal Request - scriptTask-91769554db51.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-91769554db51", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-91769554db51.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Has End Date - inclusiveGateway-f105ed2b352d/Has End Date - inclusiveGateway-f105ed2b352d.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-f105ed2b352d", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-91769554db51", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-f105ed2b352d.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Has Start Date - inclusiveGateway-3f85f36eeeef/Has Start Date - inclusiveGateway-3f85f36eeeef.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-3f85f36eeeef", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-0d53639996da", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-3f85f36eeeef.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Provisioning - scriptTask-0359a9d77ee2/Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-f105ed2b352d", + }, + ], + "script": { + "file": "Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if(skipApproval){ + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Request Approved - scriptTask-e21178ab80f7/Request Approved - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-3f85f36eeeef", + }, + ], + "script": { + "file": "Request Approved - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-67a954f33919", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-InternalRoleEntitlementGrant/steps/Wait Task - waitTask-0d53639996da/Wait Task - waitTask-0d53639996da.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-0d53639996da", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-birthright-roles-requiring-approval/phh-birthright-roles-requiring-approval.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-birthright-roles-requiring-approval", + "displayName": "phh-birthright-roles-requiring-approval", + "id": "phhBirthrightRolesRequiringApproval", + "mutable": true, + "name": "phh-birthright-roles-requiring-approval", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 1303, + "y": 236, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-0e64ff0c1695", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 70, + "y": 151, + }, + "uiConfig": { + "approvalTask-f4e7324654b5": { + "actors": { + "isExpression": true, + "value": "(function() { +var content = execution.getVariables(); +var requestId = content.get('id'); +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var approverId = ''; +if (requestIndex.request.common.blob.after.manager) { approverId = requestIndex.request.common.blob.after.manager.id } +return [{ +"id": "managed/user/" + approverId, +"permissions": { +"approve": true, +"reject": true, +"reassign": true, +"modify": true, +"comment": true +} +}]; +})()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 440, + "y": 126.5, + }, + "scriptTask-0e64ff0c1695": { + "x": 210, + "y": 153, + }, + "scriptTask-792e240778b1": { + "x": 712, + "y": 226, + }, + "scriptTask-ad05a46c2e74": { + "x": 712, + "y": 80, + }, + "scriptTask-aecf833994d2": { + "x": 1032, + "y": 153, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-birthright-roles-requiring-approval/steps/Debug Task - scriptTask-0e64ff0c1695/Debug Task - scriptTask-0e64ff0c1695.js 1`] = ` +"logger.info("Running user update event"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var context = null; +var skipApproval = false; +var userObj = null; +var userId = null; +// Read event user information from request object +try { +var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +logger.error("requestObj "+JSON.stringify(requestObj)); +if (requestObj.request.common.context) { +context = requestObj.request.common.context.type; +if (context == 'admin') { +skipApproval = true; +} +} +userObj = requestObj.request.common.blob.after; +userId = userObj.userId; +} +catch (e) { +failureReason = "Validation failed: Error reading request with id " + requestId; +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-birthright-roles-requiring-approval/steps/Debug Task - scriptTask-0e64ff0c1695/Debug Task - scriptTask-0e64ff0c1695.json 1`] = ` +{ + "displayName": "Debug Task", + "name": "scriptTask-0e64ff0c1695", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "approvalTask-f4e7324654b5", + }, + ], + "script": { + "file": "Debug Task - scriptTask-0e64ff0c1695.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-birthright-roles-requiring-approval/steps/Failure Handler - scriptTask-aecf833994d2/Failure Handler - scriptTask-aecf833994d2.js 1`] = ` +"logger.info("Failure Handler: BirthRight Roles that need Approval "); +var content = execution.getVariables(); +var requestId = content.get('requestId'); +var failureReason = content.get('failureReason'); +// Update event request as final +if (failureReason) { +var decision = {'status': 'complete', 'outcome': 'cancelled', 'decision': 'rejected', 'comment': failureReason, 'failure': true} +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-birthright-roles-requiring-approval/steps/Failure Handler - scriptTask-aecf833994d2/Failure Handler - scriptTask-aecf833994d2.json 1`] = ` +{ + "displayName": "Failure Handler", + "name": "scriptTask-aecf833994d2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Failure Handler - scriptTask-aecf833994d2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-birthright-roles-requiring-approval/steps/Finalize Request on Reject - scriptTask-ad05a46c2e74/Finalize Request on Reject - scriptTask-ad05a46c2e74.js 1`] = ` +"logger.info("Finalize Request:BirthRight Roles that need Approval"); +var content = execution.getVariables(); +var requestId = content.get('requestId'); +var failureState = content.get('failureState'); +if (!failureState) { +try { +// Update event request as final +var decision = {'status': 'complete', 'outcome': 'fulfilled', 'decision': 'rejected'} +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +} +catch (e) { +execution.setVariable("failureState", "Unable to finalize request."); +} +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-birthright-roles-requiring-approval/steps/Finalize Request on Reject - scriptTask-ad05a46c2e74/Finalize Request on Reject - scriptTask-ad05a46c2e74.json 1`] = ` +{ + "displayName": "Finalize Request on Reject", + "name": "scriptTask-ad05a46c2e74", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-aecf833994d2", + }, + ], + "script": { + "file": "Finalize Request on Reject - scriptTask-ad05a46c2e74.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-birthright-roles-requiring-approval/steps/Look Up Roles and Request - scriptTask-792e240778b1/Look Up Roles and Request - scriptTask-792e240778b1.js 1`] = ` +"logger.info("Running user update event"); +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var userObj = null; +var userId = null; +// +// Read event user information from request object +try { +var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +userObj = requestObj.request.common.blob.after; +userId = userObj.userId; +} +catch (e) { +failureReason = "Validation failed: Error reading request with id " + requestId; +} +///Get Roles from Role Variable +var roleNames = requestObj.request.common.blob.parameters.roleNames.split(','); +logger.error("UpdateRequest with roleNames: " + roleNames); +// Look up roles in catalog +var operand = []; +for (var index in roleNames) { +var role = roleNames[index]; +var roleClean = role.trim(); +operand.push({operator: "EQUALS", operand: { targetName: "role.name", targetValue: roleClean }}) +} +var body = { targetFilter: {operator: "OR", operand: operand}}; +var catalog = openidm.action("iga/governance/catalog/search", "POST", body); +var catalogResults = catalog.result; +// Define request catalogs key +var catalogBody = []; +for (var idx in catalogResults) { +var catalog = catalogResults[idx]; +catalogBody.push({type: "role", id: catalog.id}) +} +// Define request payload +var requestBody = { +priority: "low", +accessModifier: "add", +justification: "Request submitted on user update.", +users: [ userId ], +catalogs: catalogBody, +context: { +type: "NoAdmin" +} +}; +// Create requests +try { +logger.error("DRLCREATING REQUST for "+JSON.stringify(body)); +openidm.action("iga/governance/requests", "POST", requestBody, {_action: "create"}) +} +catch (e) { +failureReason = "Unable to generate requests for roles"; +} +// Update event request as final +var decision = failureReason ? +{'status': 'complete', 'outcome': 'cancelled', 'decision': 'rejected', 'comment': failureReason, 'failure': true} : +{'status': 'complete', 'outcome': 'fulfilled', 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +logger.info("Request " + requestId + " completed."); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-birthright-roles-requiring-approval/steps/Look Up Roles and Request - scriptTask-792e240778b1/Look Up Roles and Request - scriptTask-792e240778b1.json 1`] = ` +{ + "displayName": "Look Up Roles and Request", + "name": "scriptTask-792e240778b1", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Look Up Roles and Request - scriptTask-792e240778b1.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-birthright-roles-requiring-approval/steps/Manager Approval - approvalTask-f4e7324654b5/Manager Approval - approvalTask-f4e7324654b5.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "(function() { +var content = execution.getVariables(); +var requestId = content.get('id'); +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var approverId = ''; +if (requestIndex.request.common.blob.after.manager) { approverId = requestIndex.request.common.blob.after.manager.id } +return [{ +"id": "managed/user/" + approverId, +"permissions": { +"approve": true, +"reject": true, +"reassign": true, +"modify": true, +"comment": true +} +}]; +})()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-792e240778b1", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-ad05a46c2e74", + }, + ], + }, + "displayName": "Manager Approval", + "name": "approvalTask-f4e7324654b5", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/phh-delegated-user-disable-workflow.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-delegated-user-disable-workflow", + "displayName": "phh-delegated-user-disable-workflow", + "id": "phhDelegatedUserDisableWorkflow", + "mutable": true, + "name": "phh-delegated-user-disable-workflow", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 1563, + "y": 352, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-3d854e98930e", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 50, + "y": 250, + }, + "uiConfig": { + "approvalTask-bebe49db4dac": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "type": "manager", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1177, + "y": 60.61250305175781, + }, + "exclusiveGateway-26e0a9262468": { + "x": 438.3999938964844, + "y": 232.6125030517578, + }, + "exclusiveGateway-d5b7b2e2a80a": { + "x": 931.7999877929688, + "y": 111.61250305175781, + }, + "scriptTask-38eb13f4deca": { + "x": 648.3999938964844, + "y": 343.6125030517578, + }, + "scriptTask-3d854e98930e": { + "x": 175.39999389648438, + "y": 251.6125030517578, + }, + "scriptTask-449aac6b18b8": { + "x": 1149.3999938964844, + "y": 236.6125030517578, + }, + "scriptTask-4f4b87291099": { + "x": 1442.9999694824219, + "y": 101.61250305175781, + }, + "scriptTask-8e24794e9be4": { + "x": 649.3999938964844, + "y": 132.6125030517578, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Auth Check - exclusiveGateway-26e0a9262468/Auth Check - exclusiveGateway-26e0a9262468.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Auth Check - exclusiveGateway-26e0a9262468/Auth Check - exclusiveGateway-26e0a9262468.json 1`] = ` +{ + "displayName": "Auth Check", + "name": "exclusiveGateway-26e0a9262468", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "hasDelegationAuthority == true", + "outcome": "validationSuccess", + "step": "scriptTask-8e24794e9be4", + }, + { + "condition": "hasDelegationAuthority == false", + "outcome": "validationFailure", + "step": "scriptTask-38eb13f4deca", + }, + ], + "script": { + "file": "Auth Check - exclusiveGateway-26e0a9262468.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Auto-Reject - No Authority - scriptTask-38eb13f4deca/Auto-Reject - No Authority - scriptTask-38eb13f4deca.js 1`] = ` +"/* + * Auto-Reject - No Delegation Authority + * Rejects request if user has no direct reports + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); + +console.log("Auto-rejecting request " + requestId + " - no delegation authority"); + +try { + var decision = { + 'decision': 'rejected', + 'status': 'complete', + 'comment': 'Request automatically rejected: You do not have any direct reports in the system. You cannot submit delegation requests without having direct reports assigned to you.\\n\\nPlease contact your administrator if you believe this is an error.' + }; + + var updateParams = { + '_action': 'update' + }; + + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, updateParams); + + console.log("Request " + requestId + " rejected successfully"); + +} catch (e) { + console.log("Error rejecting request: " + e.message); + throw e; +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Auto-Reject - No Authority - scriptTask-38eb13f4deca/Auto-Reject - No Authority - scriptTask-38eb13f4deca.json 1`] = ` +{ + "displayName": "Auto-Reject - No Authority", + "name": "scriptTask-38eb13f4deca", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Auto-Reject - No Authority - scriptTask-38eb13f4deca.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Auto-Reject - Validation Failed - scriptTask-449aac6b18b8/Auto-Reject - Validation Failed - scriptTask-449aac6b18b8.js 1`] = ` +"/* + * Auto-Reject - Validation Failed + * Rejects request with detailed error messages + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); +var validationErrors = content.get('validationErrors') || "Validation failed"; + +console.log("Auto-rejecting request due to validation errors"); + +try { + var decision = { + 'decision': 'rejected', + 'status': 'complete', + 'comment': 'Request automatically rejected due to validation errors:\\n\\n' + validationErrors + '\\n\\nPlease correct the errors and submit a new request.' + }; + + var updateParams = { + '_action': 'update' + }; + + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, updateParams); + + console.log("Request " + requestId + " rejected - validation failed"); + +} catch (e) { + console.log("Error rejecting request: " + e.message); + throw e; +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Auto-Reject - Validation Failed - scriptTask-449aac6b18b8/Auto-Reject - Validation Failed - scriptTask-449aac6b18b8.json 1`] = ` +{ + "displayName": "Auto-Reject - Validation Failed", + "name": "scriptTask-449aac6b18b8", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Auto-Reject - Validation Failed - scriptTask-449aac6b18b8.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Disable User Account - scriptTask-4f4b87291099/Disable User Account - scriptTask-4f4b87291099.js 1`] = ` +"/* + * Fulfillment - Disable User Account + * Disables the target user's account + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); +var targetUserId = content.get('targetUserId'); +var justification = content.get('justification'); +var actingPrincipalUserName = content.get('actingPrincipalUserName'); + +console.log("=== Fulfillment Start ==="); +console.log("Disabling user ID: " + targetUserId); + +try { + // Read current user state + var targetUser = openidm.read("managed/alpha_user/" + targetUserId); + + if (!targetUser) { + throw new Error("Target user not found: " + targetUserId); + } + + console.log("Current user status: " + (targetUser.accountStatus || "active")); + + // Prepare patch operations to disable the account + var patchOperations = [ + { + "operation": "replace", + "field": "/accountStatus", + "value": "inactive" + } + ]; + + // Add a description/note about the disable action + if (targetUser.description) { + patchOperations.push({ + "operation": "replace", + "field": "/description", + "value": targetUser.description + "\\n[" + new Date().toISOString() + "] Disabled via delegation by " + actingPrincipalUserName + ". Reason: " + justification + }); + } else { + patchOperations.push({ + "operation": "add", + "field": "/description", + "value": "[" + new Date().toISOString() + "] Disabled via delegation by " + actingPrincipalUserName + ". Reason: " + justification + }); + } + + // Execute the patch + var updateResult = openidm.patch("managed/alpha_user/" + targetUserId, null, patchOperations); + + console.log("User " + targetUser.userName + " successfully disabled"); + console.log("Account status set to: inactive"); + + // Set success variables + execution.setVariable("fulfillmentStatus", "completed"); + execution.setVariable("fulfillmentMessage", "User account " + targetUser.userName + " has been successfully disabled"); + + // Update request with completion details + try { + var requestUpdate = { + 'status': 'complete', + 'decision': 'approved' + }; + + openidm.action('iga/governance/requests/' + requestId, 'POST', requestUpdate, {'_action': 'update'}); + } catch (updateError) { + console.log("Could not update request status: " + updateError.message); + } + +} catch (e) { + logger.error("Fulfillment error: " + e.message); + execution.setVariable("fulfillmentStatus", "failed"); + execution.setVariable("fulfillmentMessage", "Error disabling user: " + e.message); + + // Don't throw - let workflow complete but mark as failed + // You might want to send a notification here +} + +console.log("=== Fulfillment Complete ==="); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Disable User Account - scriptTask-4f4b87291099/Disable User Account - scriptTask-4f4b87291099.json 1`] = ` +{ + "displayName": "Disable User Account", + "name": "scriptTask-4f4b87291099", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Disable User Account - scriptTask-4f4b87291099.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Load Delegation Info - scriptTask-3d854e98930e/Load Delegation Info - scriptTask-3d854e98930e.js 1`] = ` +"/* + * Load Delegation Information + * Populates available direct reports for the requester + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); + +console.log("=== Load Delegation Info Start ==="); +console.log("Request ID: " + requestId); + +try { + // Get the request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var requesterId = requestObj.requester.id; + var requesterIdOnly = requesterId.replace("managed/user/", ""); + + console.log("Requester ID: " + requesterIdOnly); + + // Query users where current user is the manager + var queryParams = { + "_queryFilter": 'manager._id eq "' + requesterIdOnly + '"', + "_fields": "userName,givenName,sn,_id" + }; + + var results = openidm.query("managed/alpha_user", queryParams); + + // Build a formatted list for display + var directReportsList = ""; + var directReportsCount = 0; + + if (results.resultCount > 0) { + directReportsList = "You can act on behalf of the following users:\\n\\n"; + results.result.forEach(function(user) { + directReportsList += "• " + user.userName + " (" + user.givenName + " " + user.sn + ")\\n"; + }); + directReportsCount = results.resultCount; + logger.info("Found " + directReportsCount + " direct reports"); + } else { + directReportsList = "You do not have any direct reports in the system.\\n\\nYou cannot submit delegation requests without direct reports."; + logger.warn("No direct reports found"); + } + + // Store variables for later use + execution.setVariable("directReportsList", directReportsList); + execution.setVariable("directReportsCount", directReportsCount); + execution.setVariable("hasDelegationAuthority", directReportsCount > 0); + + // Update the request to populate the helper field + // This updates the form display for the user + var updatePayload = { + "request": { + "common": { + "blob": { + "form": { + "availableDirectReports": directReportsList + } + } + } + } + }; + + openidm.patch('iga/governance/requests/' + requestId, null, [ + { + "operation": "add", + "field": "/request/common/blob/form/availableDirectReports", + "value": directReportsList + } + ]); + + console.log("Direct reports list populated in form"); + +} catch (e) { + logger.error("Error loading delegation info: " + e.message); + execution.setVariable("hasDelegationAuthority", false); + execution.setVariable("directReportsCount", 0); + execution.setVariable("directReportsList", "Error loading your direct reports. Please contact your administrator."); +} + +console.log("=== Load Delegation Info Complete ==="); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Load Delegation Info - scriptTask-3d854e98930e/Load Delegation Info - scriptTask-3d854e98930e.json 1`] = ` +{ + "displayName": "Load Delegation Info", + "name": "scriptTask-3d854e98930e", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-26e0a9262468", + }, + ], + "script": { + "file": "Load Delegation Info - scriptTask-3d854e98930e.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Manager Approval - approvalTask-bebe49db4dac/Manager Approval - approvalTask-bebe49db4dac.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "doNothing", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-4f4b87291099", + }, + { + "condition": null, + "outcome": "REJECT", + "step": null, + }, + ], + }, + "displayName": "Manager Approval", + "name": "approvalTask-bebe49db4dac", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Validate Delegation Request - scriptTask-8e24794e9be4/Validate Delegation Request - scriptTask-8e24794e9be4.js 1`] = ` +"/* + * Validate Delegation Request + * Validates all user inputs and delegation authority + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); + +console.log("=== Validation Start ==="); + +var validationPassed = false; +var validationErrors = []; +var actingPrincipalObject = null; +var targetUserObject = null; + +try { + // Get request object with form data + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + var requesterId = requestObj.requester.id; + var requesterIdOnly = requesterId.replace("managed/user/", ""); + + // Extract form values + var actingPrincipalUsername = requestObj.request.common.blob.form.actingPrincipalId; + var targetUserUsername = requestObj.request.common.blob.form.targetUserId; + var justification = requestObj.request.common.blob.form.justification; + + console.log("Acting Principal Username: " + actingPrincipalUsername); + console.log("Target User Username: " + targetUserUsername); + + // Validate acting principal + if (!actingPrincipalUsername || actingPrincipalUsername.trim() === "") { + validationErrors.push("Acting Principal username is required"); + } else { + try { + var actingPrincipalQuery = { + "_queryFilter": 'userName eq "' + actingPrincipalUsername.trim() + '"' + }; + var actingPrincipalResults = openidm.query("managed/alpha_user", actingPrincipalQuery); + + if (actingPrincipalResults.resultCount === 0) { + validationErrors.push("Acting Principal user not found: " + actingPrincipalUsername); + } else if (actingPrincipalResults.resultCount > 1) { + validationErrors.push("Multiple users found with username: " + actingPrincipalUsername); + } else { + actingPrincipalObject = actingPrincipalResults.result[0]; + + // Verify requester is manager of acting principal + if (!actingPrincipalObject.manager || !actingPrincipalObject.manager._id) { + validationErrors.push("Acting Principal does not have a manager assigned"); + } else if (actingPrincipalObject.manager._id !== requesterIdOnly) { + validationErrors.push("You are not the manager of " + actingPrincipalUsername + ". You can only act on behalf of your direct reports."); + } else { + console.log("Acting Principal validated: " + actingPrincipalObject.userName); + } + } + } catch (e) { + validationErrors.push("Error validating Acting Principal: " + e.message); + } + } + + // Validate target user + if (!targetUserUsername || targetUserUsername.trim() === "") { + validationErrors.push("Target User username is required"); + } else { + try { + var targetUserQuery = { + "_queryFilter": 'userName eq "' + targetUserUsername.trim() + '"' + }; + var targetUserResults = openidm.query("managed/alpha_user", targetUserQuery); + + if (targetUserResults.resultCount === 0) { + validationErrors.push("Target User not found: " + targetUserUsername); + } else if (targetUserResults.resultCount > 1) { + validationErrors.push("Multiple users found with username: " + targetUserUsername); + } else { + targetUserObject = targetUserResults.result[0]; + + // Verify user type is External + if (targetUserObject.userType !== "External") { + validationErrors.push("Target User must be of type 'External'. User " + targetUserUsername + " is type: " + (targetUserObject.userType || "Unknown")); + } else { + console.log("Target User validated: " + targetUserObject.userName); + } + } + } catch (e) { + validationErrors.push("Error validating Target User: " + e.message); + } + } + + // Validate justification + if (!justification || justification.trim() === "") { + validationErrors.push("Justification is required"); + } else if (justification.trim().length < 10) { + validationErrors.push("Justification must be at least 10 characters"); + } + + // Prevent self-disable via delegation + if (actingPrincipalObject && targetUserObject && actingPrincipalObject._id === targetUserObject._id) { + validationErrors.push("Cannot disable the same user you are acting on behalf of"); + } + + // Check if all validations passed + if (validationErrors.length === 0) { + validationPassed = true; + + // Store user details for display in approval + execution.setVariable("actingPrincipalUserName", actingPrincipalObject.userName); + execution.setVariable("actingPrincipalFullName", actingPrincipalObject.givenName + " " + actingPrincipalObject.sn); + execution.setVariable("actingPrincipalId", actingPrincipalObject._id); + + execution.setVariable("targetUserUserName", targetUserObject.userName); + execution.setVariable("targetUserFullName", targetUserObject.givenName + " " + targetUserObject.sn); + execution.setVariable("targetUserId", targetUserObject._id); + + execution.setVariable("justification", justification); + + console.log("All validations passed"); + } else { + console.log("Validation failed: " + validationErrors.join("; ")); + } + +} catch (e) { + validationPassed = false; + validationErrors.push("System error during validation: " + e.message); + console.log("Validation exception: " + e.message); +} + +// Set workflow variables +execution.setVariable("validationPassed", validationPassed); +execution.setVariable("validationErrors", validationErrors.join("\\n")); + +console.log("=== Validation Complete: " + (validationPassed ? "PASSED" : "FAILED") + " ==="); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Validate Delegation Request - scriptTask-8e24794e9be4/Validate Delegation Request - scriptTask-8e24794e9be4.json 1`] = ` +{ + "displayName": "Validate Delegation Request", + "name": "scriptTask-8e24794e9be4", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-d5b7b2e2a80a", + }, + ], + "script": { + "file": "Validate Delegation Request - scriptTask-8e24794e9be4.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Validation Passed%3F - exclusiveGateway-d5b7b2e2a80a/Validation Passed%3F - exclusiveGateway-d5b7b2e2a80a.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-delegated-user-disable-workflow/steps/Validation Passed%3F - exclusiveGateway-d5b7b2e2a80a/Validation Passed%3F - exclusiveGateway-d5b7b2e2a80a.json 1`] = ` +{ + "displayName": "Validation Passed?", + "name": "exclusiveGateway-d5b7b2e2a80a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "validationPassed == true", + "outcome": "validationSuccess", + "step": "approvalTask-bebe49db4dac", + }, + { + "condition": "validationPassed == false", + "outcome": "validationFailure", + "step": "scriptTask-449aac6b18b8", + }, + ], + "script": { + "file": "Validation Passed%3F - exclusiveGateway-d5b7b2e2a80a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-ne-disable/phh-ne-disable.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-ne-disable", + "displayName": "phh-ne-disable", + "id": "phhNeDisable", + "mutable": true, + "name": "phh-ne-disable", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 601, + "y": 255, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-99fdf317c49b", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 50, + "y": 250, + }, + "uiConfig": { + "scriptTask-99fdf317c49b": { + "x": 270.3999938964844, + "y": 250.6125030517578, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-ne-disable/steps/Load Delegate Sources - scriptTask-99fdf317c49b/Load Delegate Sources - scriptTask-99fdf317c49b.js 1`] = ` +"/* + * Load Delegate Sources + * Queries users the current requester can act on behalf of + */ + +var content = execution.getVariables(); +var requestId = content.get('_id'); + +try { + // Get the request to find requester + var requestObj = openidm.read('iga/governance/requests/' + requestId); + var requesterId = requestObj.requester.id; + var requesterIdOnly = requesterId.replace("managed/user/", ""); + + console.log("=== Loading Delegation Options ==="); + console.log("Requester ID: " + requesterIdOnly); + + // Query users where current user is the manager + var queryParams = { + "_queryFilter": 'manager._id eq "' + requesterIdOnly + '"', + "_fields": "userName,givenName,sn,mail,_id" + }; + + var results = openidm.query("managed/alpha_user", queryParams); + console.log("Results: " + results); + + // Build options array + var options = []; + + if (results.resultCount > 0) { + results.result.forEach(function(user) { + options.push({ + "value": user._id, + "label": user.givenName + " " + user.sn + " (" + user.userName + ")" + }); + }); + + logger.info("Found " + options.length + " delegation options"); + } else { + logger.warn("No direct reports found for requester"); + options.push({ + "value": "", + "label": "No direct reports found" + }); + } + + // Store options as JSON string + execution.setVariable("delegationOptions", JSON.stringify(options)); + execution.setVariable("hasDelegationOptions", results.resultCount > 0); + execution.setVariable("delegationOptionsCount", results.resultCount); + +} catch (e) { + logger.error("Error loading delegation options: " + e.message); + execution.setVariable("delegationOptions", "[]"); + execution.setVariable("hasDelegationOptions", false); + execution.setVariable("delegationOptionsCount", 0); +} + +logger.info("=== Delegation Options Loaded ==="); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-ne-disable/steps/Load Delegate Sources - scriptTask-99fdf317c49b/Load Delegate Sources - scriptTask-99fdf317c49b.json 1`] = ` +{ + "displayName": "Load Delegate Sources", + "name": "scriptTask-99fdf317c49b", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Load Delegate Sources - scriptTask-99fdf317c49b.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/phh-new-user-create.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phh-new-user-create", + "displayName": "phh-new-user-create", + "id": "phhNewUserCreate", + "mutable": true, + "name": "phh-new-user-create", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 1348, + "y": 177.5, + }, + "startNode": { + "connections": { + "start": "scriptTask-4e9121fe850a", + }, + "id": "startNode", + "x": 70, + "y": 177.5, + }, + "uiConfig": { + "approvalTask-75cf4247ba1d": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 777, + "y": 226, + }, + "exclusiveGateway-621c9996676a": { + "x": 514, + "y": 153, + }, + "scriptTask-0e5b6187ea62": { + "x": 777, + "y": 80, + }, + "scriptTask-4e9121fe850a": { + "x": 210, + "y": 179.5, + }, + "scriptTask-626899b6e99a": { + "x": 1049, + "y": 97.66666666666667, + }, + "scriptTask-c58309b8c470": { + "x": 1049, + "y": 234.83333333333334, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/Approval Task - approvalTask-75cf4247ba1d/Approval Task - approvalTask-75cf4247ba1d.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/9de92b26-e91e-44b7-ac81-7ae1c6adf9ad", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-626899b6e99a", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-75cf4247ba1d", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-621c9996676a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-75cf4247ba1d", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-621c9996676a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-c58309b8c470", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-c58309b8c470.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if (skipApproval) { + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-0e5b6187ea62", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-626899b6e99a", + }, + ], + "script": { + "file": "Request Approved - scriptTask-0e5b6187ea62.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-4e9121fe850a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-621c9996676a", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-4e9121fe850a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/User Create Validation - scriptTask-626899b6e99a/User Create Validation - scriptTask-626899b6e99a.js 1`] = ` +"logger.info("[phh] Creating User"); +function generateUsername(givenName, surname) { +const usernamePrefix = (givenName[0] + surname[0]).toLowerCase(); +const data = openidm.query("managed/alpha_user", {'_queryFilter': \`userName sw "\${usernamePrefix}"\`}, ["userName"]); +const usernames = data.result.map(user => user.userName); +let i = 1; +while (i<100000 && usernames.includes(usernamePrefix + String(i).padStart(5, '0'))) { +i++; +} +return usernamePrefix + String(i).padStart(5, '0'); +} +function createUser(custom) { +var startDate = new Date(custom.startDate).toISOString(); +var endDate = new Date(custom.endDate).toISOString(); +var payload = { +"userName": custom.userName, +"givenName": custom.givenName, +"sn": custom.sn, +"mail": custom.mail, +"password": custom.password, +"frIndexedDate5":startDate, +"frIndexedDate4":endDate +}; +return openidm.create('managed/alpha_user', null, payload); +} +function process(requestObj) { +var custom = requestObj.request.custom +custom.userName = generateUsername(custom.givenName, custom.sn); +custom.password = 'Password!234'; +const result = createUser(custom); +return { outcome: "provisioned" }; +} +try { +const requestId = execution.getVariables().get("id"); +const requestObj = openidm.action(\`iga/governance/requests/\${requestId}\`, "GET", {}, {}); +let decision = { status: "complete", "decision": "approved" }; +try { +const result = process(requestObj); +Object.assign(decision, result); +} catch (error) { +Object.assign(decision, { outcome: "unknown", comment: \`Error processing request \${requestId}: \${e.message}\`, failure: true }); +} +openidm.action(\`iga/governance/requests/\${requestId}\`, 'POST', decision, { _action: "update"}); +} catch (e) { +logger.error(\`Error reading request \${requestId}: \${e}\`); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phh-new-user-create/steps/User Create Validation - scriptTask-626899b6e99a/User Create Validation - scriptTask-626899b6e99a.json 1`] = ` +{ + "displayName": "User Create Validation", + "name": "scriptTask-626899b6e99a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "User Create Validation - scriptTask-626899b6e99a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhCustomWorkflow/phhCustomWorkflow.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "phhCustomWorkflow", + "displayName": "phhCustomWorkflow", + "id": "phhCustomWorkflow", + "mutable": true, + "name": "phhCustomWorkflow", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 955, + "y": 174, + }, + "startNode": { + "connections": { + "start": "scriptTask-4e9121fe850a", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 448, + "y": 124, + }, + "scriptTask-0e5b6187ea62": { + "x": 683, + "y": 128.015625, + }, + "scriptTask-4e9121fe850a": { + "x": 168, + "y": 140.015625, + }, + "scriptTask-c58309b8c470": { + "x": 688, + "y": 207, + }, + }, + }, + "status": "draft", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhCustomWorkflow/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/6b21c283-d491-4fd9-8322-898c171c7018", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhCustomWorkflow/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhCustomWorkflow/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-c58309b8c470", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-c58309b8c470.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhCustomWorkflow/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if (skipApproval) { + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhCustomWorkflow/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-0e5b6187ea62", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Request Approved - scriptTask-0e5b6187ea62.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhCustomWorkflow/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhCustomWorkflow/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-4e9121fe850a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-4e9121fe850a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhFlow/phhFlow.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "phhFlow", + "displayName": "phhFlow", + "id": "phhFlow", + "mutable": true, + "name": "phhFlow", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 564, + "y": 312, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "scriptTask-10bf48033687", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 50, + "y": 250, + }, + "uiConfig": { + "approvalTask-bf52ce203a81": { + "actors": { + "isExpression": true, + "value": " +//Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + + + return [{ + "id": "managed/user/" + requestIndex.applicationOwner[0].id, + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})() + + + +( +function(){ +// --- Log comment to request audit trail --- + try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var logComment = "Context Check" + + " | applicationOwner: " + requestObj.applicationOwner[0].id + + " | full dump: " + JSON.stringify(requestObj); + + + openidm.action( + 'iga/governance/requests/' + requestId, + 'POST', + { 'comment': logComment }, + { '_action': 'update' } + ); + } catch (e) { + logger.error("Failed to write log comment: " + e.message); + } + return []; +} +)() +", + }, + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 153.39999389648438, + "y": 268.6125030517578, + }, + "scriptTask-10bf48033687": { + "x": 162.39999389648438, + "y": 140.6125030517578, + }, + "scriptTask-610744f7d369": { + "x": 357.3999938964844, + "y": 370.6125030517578, + }, + "scriptTask-c28119ea007e": { + "x": 360.3999938964844, + "y": 256.6125030517578, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhFlow/steps/Approval Task - approvalTask-bf52ce203a81/Approval Task - approvalTask-bf52ce203a81.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": " +//Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + + + + return [{ + "id": "managed/user/" + requestIndex.applicationOwner[0].id, + "permissions": { + "approve": true, + "reject": true, + "reassign": true, + "modify": true, + "comment": true + } + }]; +})() + + + +( +function(){ +// --- Log comment to request audit trail --- + try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + var logComment = "Context Check" + + " | applicationOwner: " + requestObj.applicationOwner[0].id + + " | full dump: " + JSON.stringify(requestObj); + + + openidm.action( + 'iga/governance/requests/' + requestId, + 'POST', + { 'comment': logComment }, + { '_action': 'update' } + ); + } catch (e) { + logger.error("Failed to write log comment: " + e.message); + } + return []; +} +)() +", + }, + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-c28119ea007e", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-610744f7d369", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-bf52ce203a81", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhFlow/steps/Approve - scriptTask-c28119ea007e/Approve - scriptTask-c28119ea007e.js 1`] = ` +"logger.info("Approving request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +logger.info("Execution Content: " + content); +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhFlow/steps/Approve - scriptTask-c28119ea007e/Approve - scriptTask-c28119ea007e.json 1`] = ` +{ + "displayName": "Approve", + "name": "scriptTask-c28119ea007e", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Approve - scriptTask-c28119ea007e.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhFlow/steps/Context Check - scriptTask-10bf48033687/Context Check - scriptTask-10bf48033687.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + } + // --- Log comment to request audit trail --- + try { + var logComment = "Context Check" + + " | full dump: " + JSON.stringify(requestObj); + + + openidm.action( + 'iga/governance/requests/' + requestId, + 'POST', + { 'comment': logComment }, + { '_action': 'update' } + ); + } catch (e) { + logger.error("Failed to write log comment: " + e.message); + } +} +catch (e) { + logger.info("Request Context Check failed "+e.message); +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhFlow/steps/Context Check - scriptTask-10bf48033687/Context Check - scriptTask-10bf48033687.json 1`] = ` +{ + "displayName": "Context Check", + "name": "scriptTask-10bf48033687", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "approvalTask-bf52ce203a81", + }, + ], + "script": { + "file": "Context Check - scriptTask-10bf48033687.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhFlow/steps/Script Task - scriptTask-610744f7d369/Script Task - scriptTask-610744f7d369.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +logger.info("Execution Content: " + content); +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/phhFlow/steps/Script Task - scriptTask-610744f7d369/Script Task - scriptTask-610744f7d369.json 1`] = ` +{ + "displayName": "Script Task", + "name": "scriptTask-610744f7d369", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Script Task - scriptTask-610744f7d369.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test/steps/Wait Task - waitTask-4d9223fb79c5/Wait Task - waitTask-4d9223fb79c5.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-4d9223fb79c5", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": null, + }, + ], + "resumeDate": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(1*30*24*60*60*1000))).toISOString()", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test/test.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "test", + "displayName": "test", + "id": "test", + "mutable": true, + "name": "test", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 500, + "y": 50, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "waitTask-4d9223fb79c5", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 50, + "y": 250, + }, + "uiConfig": { + "waitTask-4d9223fb79c5": { + "events": { + "resumeDateNumber": 1, + "resumeDateTimeSpan": "month(s)", + "resumeDateType": "duration", + }, + "x": 285.3999938964844, + "y": 211.22499084472656, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Approval Task - approvalTask-7e33e73d6763/Custom Approval Task - approvalTask-7e33e73d6763.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate1", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate1", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "content.customExpirationDuration", + }, + "notification": "FrodoTestEmailTemplate1", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate1", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(4*30*24*60*60*1000))).toISOString()", + }, + "frequency": 4, + "notification": "FrodoTestEmailTemplate1", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "fulfillmentTask-7fce35a32915", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "displayName": "Custom Approval Task", + "name": "approvalTask-7e33e73d6763", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Approval Task 2 - approvalTask-363e32acf981/Custom Approval Task 2 - approvalTask-363e32acf981.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "fulfillmentTask-29a71d4ab8ed", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "displayName": "Custom Approval Task 2", + "name": "approvalTask-363e32acf981", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Email Task - emailTask-2068f5d711c8/Custom Email Task - emailTask-2068f5d711c8.json 1`] = ` +{ + "displayName": "Custom Email Task", + "emailTask": { + "bcc": { + "isExpression": true, + "value": "// This is the bcc script +"bcc@email.com";", + }, + "cc": { + "isExpression": true, + "value": "// This is the cc script +"cc@email.com";", + }, + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": "waitTask-b7fc169ca4eb", + }, + { + "condition": null, + "outcome": "FAILED", + "step": "violationTask-50261d9bc712", + }, + ], + "object": { + "hello": "goodbye", + "hi": "hola", + }, + "templateName": "frodoTestEmailTemplateFour", + "to": { + "isExpression": true, + "value": "// This is the to script +"to@email.com";", + }, + }, + "name": "emailTask-2068f5d711c8", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Email Task 2 - emailTask-881f2975e240/Custom Email Task 2 - emailTask-881f2975e240.json 1`] = ` +{ + "displayName": "Custom Email Task 2", + "emailTask": { + "bcc": "bcc@email.com", + "cc": "cc@email.com", + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": "waitTask-72d593301121", + }, + { + "condition": null, + "outcome": "FAILED", + "step": "violationTask-50261d9bc712", + }, + ], + "object": {}, + "templateName": "frodoTestEmailTemplateFour", + "to": "to@email.com", + }, + "name": "emailTask-881f2975e240", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Fulfillment Task - fulfillmentTask-7fce35a32915/Custom Fulfillment Task - fulfillmentTask-7fce35a32915.json 1`] = ` +{ + "displayName": "Custom Fulfillment Task", + "fulfillmentTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate2", + }, + "escalation": { + "actors": [ + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate2", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "FrodoTestEmailTemplate2", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate2", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(2*30*24*60*60*1000))).toISOString()", + }, + "frequency": 2, + "notification": "FrodoTestEmailTemplate2", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "exclusiveGateway-94bc3d35f3b4", + }, + { + "condition": null, + "outcome": "DENY", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "name": "fulfillmentTask-7fce35a32915", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Fulfillment Task 2 - fulfillmentTask-29a71d4ab8ed/Custom Fulfillment Task 2 - fulfillmentTask-29a71d4ab8ed.json 1`] = ` +{ + "displayName": "Custom Fulfillment Task 2", + "fulfillmentTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "content.customExpirationDate", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "emailTask-881f2975e240", + }, + { + "condition": null, + "outcome": "DENY", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "name": "fulfillmentTask-29a71d4ab8ed", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.json 1`] = ` +{ + "displayName": "Custom Inclusive Gateway", + "name": "inclusiveGateway-a6cf9605ce55", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "// This is outcome 1 +outcome === 1", + "outcome": "outcomeOne", + "step": "scriptTask-493f5ea87636", + }, + { + "condition": "// This is outcome 2 +outcome === 2", + "outcome": "outcomeTwo", + "step": "scriptTask-493f5ea87636", + }, + { + "condition": "// This is outcome 3 +outcome === 3", + "outcome": "outcomeThree", + "step": "violationTask-50261d9bc712", + }, + ], + "script": { + "file": "Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Script Task - scriptTask-493f5ea87636/Custom Script Task - scriptTask-493f5ea87636.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Script Task - scriptTask-493f5ea87636/Custom Script Task - scriptTask-493f5ea87636.json 1`] = ` +{ + "displayName": "Custom Script Task", + "name": "scriptTask-493f5ea87636", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "emailTask-2068f5d711c8", + }, + ], + "script": { + "file": "Custom Script Task - scriptTask-493f5ea87636.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.json 1`] = ` +{ + "displayName": "Custom Validation Gateway", + "name": "exclusiveGateway-94bc3d35f3b4", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "// This is a validation success +outcome == true", + "outcome": "validationSuccess", + "step": "inclusiveGateway-a6cf9605ce55", + }, + { + "condition": "// This is a validation failure +outcome == false", + "outcome": "validationFailure", + "step": "violationTask-50261d9bc712", + }, + ], + "script": { + "file": "Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Violation Task - violationTask-50261d9bc712/Custom Violation Task - violationTask-50261d9bc712.json 1`] = ` +{ + "displayName": "Custom Violation Task", + "name": "violationTask-50261d9bc712", + "type": "violationTask", + "violationTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate3", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*7*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate3", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(8*30*24*60*60*1000))).toISOString()", + }, + "notification": "FrodoTestEmailTemplate3", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate3", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "FrodoTestEmailTemplate3", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": null, + }, + { + "condition": null, + "outcome": "ALLOW", + "step": null, + }, + { + "condition": null, + "outcome": "EXPIRATION", + "step": "approvalTask-7e33e73d6763", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Violation Task 2 - violationTask-f8066518b46a/Custom Violation Task 2 - violationTask-f8066518b46a.json 1`] = ` +{ + "displayName": "Custom Violation Task 2", + "name": "violationTask-f8066518b46a", + "type": "violationTask", + "violationTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "approvalMode": "any", + "events": {}, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": null, + }, + { + "condition": null, + "outcome": "ALLOW", + "step": null, + }, + { + "condition": null, + "outcome": "EXPIRATION", + "step": "approvalTask-7e33e73d6763", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Wait Task - waitTask-b7fc169ca4eb/Custom Wait Task - waitTask-b7fc169ca4eb.json 1`] = ` +{ + "displayName": "Custom Wait Task", + "name": "waitTask-b7fc169ca4eb", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "approvalTask-363e32acf981", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*30*24*60*60*1000))).toISOString()", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Wait Task 2 - waitTask-72d593301121/Custom Wait Task 2 - waitTask-72d593301121.json 1`] = ` +{ + "displayName": "Custom Wait Task 2", + "name": "waitTask-72d593301121", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "waitTask-b343cc7df7c9", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/steps/Custom Wait Task 3 - waitTask-b343cc7df7c9/Custom Wait Task 3 - waitTask-b343cc7df7c9.json 1`] = ` +{ + "displayName": "Custom Wait Task 3", + "name": "waitTask-b343cc7df7c9", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "violationTask-f8066518b46a", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "content.get('resumeDate')", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_1/test_workflow_1.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "test_workflow_1", + "displayName": "test_workflow_1", + "id": "testWorkflow1", + "mutable": true, + "name": "test_workflow_1", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 826, + "y": 50, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "approvalTask-7e33e73d6763", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 20, + "y": 42, + }, + "uiConfig": { + "approvalTask-363e32acf981": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + { + "id": { + "isExpression": false, + "value": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + }, + "type": "role", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "type": "manager", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "type": "roleOwner", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 478.3999938964844, + "y": 195.6125030517578, + }, + "approvalTask-7e33e73d6763": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "variable", + "expirationDateVariable": "customExpirationDuration", + "expirationTimeSpan": "hour(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "reminderDate": 4, + "reminderTimeSpan": "month(s)", + }, + "x": 146.39999389648438, + "y": 15.61250305175781, + }, + "emailTask-2068f5d711c8": { + "x": 150.39999389648438, + "y": 648.812502861023, + }, + "emailTask-881f2975e240": { + "x": 478.3999938964844, + "y": 474.41250228881836, + }, + "exclusiveGateway-94bc3d35f3b4": { + "x": 145.39999389648438, + "y": 274.6125030517578, + }, + "fulfillmentTask-29a71d4ab8ed": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "variable", + "expirationDateVariable": "customExpirationDate", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 479.3999938964844, + "y": 334.41250228881836, + }, + "fulfillmentTask-7fce35a32915": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "hour(s)", + "escalationType": "applicationOwner", + "expirationDate": 8, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "month(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "reminderDate": 2, + "reminderTimeSpan": "month(s)", + }, + "x": 145.39999389648438, + "y": 146.6125030517578, + }, + "inclusiveGateway-a6cf9605ce55": { + "x": 147.39999389648438, + "y": 405.6125030517578, + }, + "scriptTask-493f5ea87636": { + "x": 148.39999389648438, + "y": 570.6125030517578, + }, + "violationTask-50261d9bc712": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "week(s)", + "escalationType": "applicationOwner", + "expirationDate": 8, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "month(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "reminderDate": 3, + "reminderTimeSpan": "hour(s)", + }, + "x": 480.3999938964844, + "y": 13.61250305175781, + }, + "violationTask-f8066518b46a": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationType": "applicationOwner", + "expirationDateType": "variable", + "expirationDateVariable": "taskExpirationDate", + "reassignedActors": [], + }, + "x": 788.3999938964844, + "y": 613.4125022888184, + }, + "waitTask-72d593301121": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 476.3999938964844, + "y": 612.4125022888184, + }, + "waitTask-b343cc7df7c9": { + "events": { + "resumeDateNumber": 1, + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "variable", + "resumeDateVariable": "resumeDate", + }, + "x": 476.3999938964844, + "y": 694.4125022888184, + }, + "waitTask-b7fc169ca4eb": { + "events": { + "resumeDateNumber": 5, + "resumeDateTimeSpan": "month(s)", + "resumeDateType": "duration", + }, + "x": 148.39999389648438, + "y": 779.812502861023, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Approval Task - approvalTask-7e33e73d6763/Custom Approval Task - approvalTask-7e33e73d6763.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate1", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate1", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "content.customExpirationDuration", + }, + "notification": "FrodoTestEmailTemplate1", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate1", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(4*30*24*60*60*1000))).toISOString()", + }, + "frequency": 4, + "notification": "FrodoTestEmailTemplate1", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "fulfillmentTask-7fce35a32915", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "displayName": "Custom Approval Task", + "name": "approvalTask-7e33e73d6763", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Approval Task 2 - approvalTask-363e32acf981/Custom Approval Task 2 - approvalTask-363e32acf981.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "fulfillmentTask-29a71d4ab8ed", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "displayName": "Custom Approval Task 2", + "name": "approvalTask-363e32acf981", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Email Task - emailTask-2068f5d711c8/Custom Email Task - emailTask-2068f5d711c8.json 1`] = ` +{ + "displayName": "Custom Email Task", + "emailTask": { + "bcc": { + "isExpression": true, + "value": "// This is the bcc script +"bcc@email.com";", + }, + "cc": { + "isExpression": true, + "value": "// This is the cc script +"cc@email.com";", + }, + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": "waitTask-b7fc169ca4eb", + }, + { + "condition": null, + "outcome": "FAILED", + "step": "violationTask-50261d9bc712", + }, + ], + "object": { + "hello": "goodbye", + "hi": "hola", + }, + "templateName": "frodoTestEmailTemplateFour", + "to": { + "isExpression": true, + "value": "// This is the to script +"to@email.com";", + }, + }, + "name": "emailTask-2068f5d711c8", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Email Task 2 - emailTask-881f2975e240/Custom Email Task 2 - emailTask-881f2975e240.json 1`] = ` +{ + "displayName": "Custom Email Task 2", + "emailTask": { + "bcc": "bcc@email.com", + "cc": "cc@email.com", + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": "waitTask-72d593301121", + }, + { + "condition": null, + "outcome": "FAILED", + "step": "violationTask-50261d9bc712", + }, + ], + "object": {}, + "templateName": "frodoTestEmailTemplateFour", + "to": "to@email.com", + }, + "name": "emailTask-881f2975e240", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Fulfillment Task - fulfillmentTask-7fce35a32915/Custom Fulfillment Task - fulfillmentTask-7fce35a32915.json 1`] = ` +{ + "displayName": "Custom Fulfillment Task", + "fulfillmentTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate2", + }, + "escalation": { + "actors": [ + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate2", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "FrodoTestEmailTemplate2", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate2", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(2*30*24*60*60*1000))).toISOString()", + }, + "frequency": 2, + "notification": "FrodoTestEmailTemplate2", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "exclusiveGateway-94bc3d35f3b4", + }, + { + "condition": null, + "outcome": "DENY", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "name": "fulfillmentTask-7fce35a32915", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Fulfillment Task 2 - fulfillmentTask-29a71d4ab8ed/Custom Fulfillment Task 2 - fulfillmentTask-29a71d4ab8ed.json 1`] = ` +{ + "displayName": "Custom Fulfillment Task 2", + "fulfillmentTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "content.customExpirationDate", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "emailTask-881f2975e240", + }, + { + "condition": null, + "outcome": "DENY", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "name": "fulfillmentTask-29a71d4ab8ed", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.json 1`] = ` +{ + "displayName": "Custom Inclusive Gateway", + "name": "inclusiveGateway-a6cf9605ce55", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "// This is outcome 1 +outcome === 1", + "outcome": "outcomeOne", + "step": "scriptTask-493f5ea87636", + }, + { + "condition": "// This is outcome 2 +outcome === 2", + "outcome": "outcomeTwo", + "step": "scriptTask-493f5ea87636", + }, + { + "condition": "// This is outcome 3 +outcome === 3", + "outcome": "outcomeThree", + "step": "violationTask-50261d9bc712", + }, + ], + "script": { + "file": "Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Script Task - scriptTask-493f5ea87636/Custom Script Task - scriptTask-493f5ea87636.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Script Task - scriptTask-493f5ea87636/Custom Script Task - scriptTask-493f5ea87636.json 1`] = ` +{ + "displayName": "Custom Script Task", + "name": "scriptTask-493f5ea87636", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "emailTask-2068f5d711c8", + }, + ], + "script": { + "file": "Custom Script Task - scriptTask-493f5ea87636.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.json 1`] = ` +{ + "displayName": "Custom Validation Gateway", + "name": "exclusiveGateway-94bc3d35f3b4", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "// This is a validation success +outcome == true", + "outcome": "validationSuccess", + "step": "inclusiveGateway-a6cf9605ce55", + }, + { + "condition": "// This is a validation failure +outcome == false", + "outcome": "validationFailure", + "step": "violationTask-50261d9bc712", + }, + ], + "script": { + "file": "Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Violation Task - violationTask-50261d9bc712/Custom Violation Task - violationTask-50261d9bc712.json 1`] = ` +{ + "displayName": "Custom Violation Task", + "name": "violationTask-50261d9bc712", + "type": "violationTask", + "violationTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate3", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*7*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate3", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(8*30*24*60*60*1000))).toISOString()", + }, + "notification": "FrodoTestEmailTemplate3", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate3", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "FrodoTestEmailTemplate3", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": null, + }, + { + "condition": null, + "outcome": "ALLOW", + "step": null, + }, + { + "condition": null, + "outcome": "EXPIRATION", + "step": "approvalTask-7e33e73d6763", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Violation Task 2 - violationTask-f8066518b46a/Custom Violation Task 2 - violationTask-f8066518b46a.json 1`] = ` +{ + "displayName": "Custom Violation Task 2", + "name": "violationTask-f8066518b46a", + "type": "violationTask", + "violationTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "approvalMode": "any", + "events": {}, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": null, + }, + { + "condition": null, + "outcome": "ALLOW", + "step": null, + }, + { + "condition": null, + "outcome": "EXPIRATION", + "step": "approvalTask-7e33e73d6763", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Wait Task - waitTask-b7fc169ca4eb/Custom Wait Task - waitTask-b7fc169ca4eb.json 1`] = ` +{ + "displayName": "Custom Wait Task", + "name": "waitTask-b7fc169ca4eb", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "approvalTask-363e32acf981", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*30*24*60*60*1000))).toISOString()", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Wait Task 2 - waitTask-72d593301121/Custom Wait Task 2 - waitTask-72d593301121.json 1`] = ` +{ + "displayName": "Custom Wait Task 2", + "name": "waitTask-72d593301121", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "waitTask-b343cc7df7c9", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/steps/Custom Wait Task 3 - waitTask-b343cc7df7c9/Custom Wait Task 3 - waitTask-b343cc7df7c9.json 1`] = ` +{ + "displayName": "Custom Wait Task 3", + "name": "waitTask-b343cc7df7c9", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "violationTask-f8066518b46a", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "content.get('resumeDate')", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/test_workflow_4/test_workflow_4.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "test_workflow_4", + "displayName": "test_workflow_4", + "id": "testWorkflow4", + "mutable": true, + "name": "test_workflow_4", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 826, + "y": 50, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "approvalTask-7e33e73d6763", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 20, + "y": 42, + }, + "uiConfig": { + "approvalTask-363e32acf981": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + { + "id": { + "isExpression": false, + "value": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + }, + "type": "role", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "type": "manager", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "type": "roleOwner", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 478.3999938964844, + "y": 195.6125030517578, + }, + "approvalTask-7e33e73d6763": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "variable", + "expirationDateVariable": "customExpirationDuration", + "expirationTimeSpan": "hour(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "reminderDate": 4, + "reminderTimeSpan": "month(s)", + }, + "x": 146.39999389648438, + "y": 15.61250305175781, + }, + "emailTask-2068f5d711c8": { + "x": 150.39999389648438, + "y": 648.812502861023, + }, + "emailTask-881f2975e240": { + "x": 478.3999938964844, + "y": 474.41250228881836, + }, + "exclusiveGateway-94bc3d35f3b4": { + "x": 145.39999389648438, + "y": 274.6125030517578, + }, + "fulfillmentTask-29a71d4ab8ed": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "variable", + "expirationDateVariable": "customExpirationDate", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 479.3999938964844, + "y": 334.41250228881836, + }, + "fulfillmentTask-7fce35a32915": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "hour(s)", + "escalationType": "applicationOwner", + "expirationDate": 8, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "month(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "reminderDate": 2, + "reminderTimeSpan": "month(s)", + }, + "x": 145.39999389648438, + "y": 146.6125030517578, + }, + "inclusiveGateway-a6cf9605ce55": { + "x": 147.39999389648438, + "y": 405.6125030517578, + }, + "scriptTask-493f5ea87636": { + "x": 148.39999389648438, + "y": 570.6125030517578, + }, + "violationTask-50261d9bc712": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "week(s)", + "escalationType": "applicationOwner", + "expirationDate": 8, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "month(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "reminderDate": 3, + "reminderTimeSpan": "hour(s)", + }, + "x": 480.3999938964844, + "y": 13.61250305175781, + }, + "violationTask-f8066518b46a": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationType": "applicationOwner", + "expirationDateType": "variable", + "expirationDateVariable": "taskExpirationDate", + "reassignedActors": [], + }, + "x": 788.3999938964844, + "y": 613.4125022888184, + }, + "waitTask-72d593301121": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 476.3999938964844, + "y": 612.4125022888184, + }, + "waitTask-b343cc7df7c9": { + "events": { + "resumeDateNumber": 1, + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "variable", + "resumeDateVariable": "resumeDate", + }, + "x": 476.3999938964844, + "y": 694.4125022888184, + }, + "waitTask-b7fc169ca4eb": { + "events": { + "resumeDateNumber": 5, + "resumeDateTimeSpan": "month(s)", + "resumeDateType": "duration", + }, + "x": 148.39999389648438, + "y": 779.812502861023, + }, + }, + }, + "status": "published", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Approval Task - approvalTask-63163dc11c1f/Approval Task - approvalTask-63163dc11c1f.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.entitlementOwner[0].id ? "managed/user/" + requestIndex.entitlementOwner[0].id : "managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/034484bf-1448-40b8-bdfa-56990ef0cc30", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [ + { + "id": "managed/user/034484bf-1448-40b8-bdfa-56990ef0cc30", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "frequency": 7, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-5106f7a29d86", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-63163dc11c1f", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Auto Approval - scriptTask-e21178ab80f7/Auto Approval - scriptTask-e21178ab80f7.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ +var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var lineItemId = content.get('lineItemId'); +var queryParams = { + "_action": "update" +} +var lineItemParams = { + "_action": "updateRemediationStatus" +} +try { + var decision = { + "decision": "approved", + "comment": "Request auto-approved due to request context: " + context + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = {'comment': failureReason, 'failure': true}; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); + + +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Auto Approval - scriptTask-e21178ab80f7/Auto Approval - scriptTask-e21178ab80f7.json 1`] = ` +{ + "displayName": "Auto Approval", + "name": "scriptTask-e21178ab80f7", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Auto Approval - scriptTask-e21178ab80f7.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Auto Provisioning - scriptTask-0359a9d77ee2/Auto Provisioning - scriptTask-0359a9d77ee2.js 1`] = ` +"logger.info("Auto-Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "entitlementId": request.common.entitlementId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + var result = openidm.action('iga/governance/user/' + request.common.userId + '/entitlements' , 'POST', payload,queryParams); + } + catch (e) { + failureReason = "Provisioning failed: Error provisioning entitlement to user " + request.common.userId + " for entitlement " + request.common.entitlementId + ". Error message: " + e.message; + } + + var decision = {'status': 'complete', 'decision': 'approved'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Auto Provisioning - scriptTask-0359a9d77ee2/Auto Provisioning - scriptTask-0359a9d77ee2.json 1`] = ` +{ + "displayName": "Auto Provisioning", + "name": "scriptTask-0359a9d77ee2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Auto Provisioning - scriptTask-0359a9d77ee2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Context Gateway - exclusiveGateway-67a954f33919/Context Gateway - exclusiveGateway-67a954f33919.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-67a954f33919", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-e21178ab80f7", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-63163dc11c1f", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-67a954f33919.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.js 1`] = ` +"logger.info("Running entitlement grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var assignmentId = null; +var app = null; +var assignment = null; +var existingAccount = false; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; + assignmentId = requestObj.assignment.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check entitlement exists +if (!failureReason) { + try { + assignment = openidm.read('managed/alpha_assignment/' + assignmentId); + if (!assignment) { + failureReason = "Validation failed: Cannot find assignment with id " + assignmentId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading assignment with id " + assignmentId + ". Error message: " + e.message; + } +} + +// Validation 3 - Check the user has application granted +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + existingAccount = true; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check existing applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +// Validation 4 - If account does not exist, provision it +if (!failureReason) { + if (!existingAccount) { + try { + var request = requestObj.request; + var payload = { + "applicationId": applicationId, + "startDate": request.common.startDate, + "endDate": request.common.endDate, + "auditContext": {}, + "grantType": "request" + }; + var queryParams = { + "_action": "add" + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + failureReason = "Validation failed: Error provisioning new account to user " + request.common.userId + " for application " + applicationId + ". Error message: " + e.message; + } + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Entitlement Grant Validation - scriptTask-3eab1948f1ec/Entitlement Grant Validation - scriptTask-3eab1948f1ec.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation", + "name": "scriptTask-3eab1948f1ec", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-48e748c42994", + }, + ], + "script": { + "file": "Entitlement Grant Validation - scriptTask-3eab1948f1ec.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Entitlement Grant Validation Failure - scriptTask-0b56191887de/Entitlement Grant Validation Failure - scriptTask-0b56191887de.json 1`] = ` +{ + "displayName": "Entitlement Grant Validation Failure", + "name": "scriptTask-0b56191887de", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Entitlement Grant Validation Failure - scriptTask-0b56191887de.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Entitlement Privileged - scriptTask-5106f7a29d86/Entitlement Privileged - scriptTask-5106f7a29d86.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var requestObj = null; +var entId = null; +var entGlossary = null; +var entPriv = null; + +//Check entitlement exists and grab entitlement info +try { + requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + entId = requestObj.assignment.id; +} +catch (e) { + logger.info("Validation failed: Error reading entitlement grant request with id " + requestId); +} +//Check glossary for entitlement exists and grab glossary info +try { + entGlossary = openidm.action('iga/governance/resource/' + entId + '/glossary', 'GET', {}, {}); + // Sets entPriv based on the glossary contents, if present, otherwise defaults to true + entPriv = (entGlossary.hasOwnProperty("isPrivileged")) ? entGlossary.isPrivileged : true; + //Sets entPriv based on glossary contents, if present, otherwise defaults to false + //entPriv = !!entGlossary.isPrivileged; + execution.setVariable("entPriv", entPriv); +} +catch (e) { + logger.info("Could not retrieve glossary with entId " + entId + " from entitlement grant request ID " + requestId); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Entitlement Privileged - scriptTask-5106f7a29d86/Entitlement Privileged - scriptTask-5106f7a29d86.json 1`] = ` +{ + "displayName": "Entitlement Privileged", + "name": "scriptTask-5106f7a29d86", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-bcb05a148971", + }, + ], + "script": { + "file": "Entitlement Privileged - scriptTask-5106f7a29d86.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Inclusive Gateway - inclusiveGateway-bcb05a148971/Inclusive Gateway - inclusiveGateway-bcb05a148971.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Inclusive Gateway - inclusiveGateway-bcb05a148971/Inclusive Gateway - inclusiveGateway-bcb05a148971.json 1`] = ` +{ + "displayName": "Inclusive Gateway", + "name": "inclusiveGateway-bcb05a148971", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "entPriv == true", + "outcome": "Privileged", + "step": "approvalTask-77691047b28d", + }, + { + "condition": "entPriv == false", + "outcome": "NotPrivileged", + "step": "scriptTask-3eab1948f1ec", + }, + ], + "script": { + "file": "Inclusive Gateway - inclusiveGateway-bcb05a148971.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Manager Approval - approvalTask-77691047b28d/Manager Approval - approvalTask-77691047b28d.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.user.manager._refResourceId", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/034484bf-1448-40b8-bdfa-56990ef0cc30", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "notification": "requestEscalated", + }, + "expiration": { + "action": "reject", + "actors": [ + { + "id": "managed/user/034484bf-1448-40b8-bdfa-56990ef0cc30", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "frequency": 7, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-3eab1948f1ec", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-aec6c36b3a45", + }, + ], + }, + "displayName": "Manager Approval", + "name": "approvalTask-77691047b28d", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +logger.info("Execution Content: " + content); +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Reject Request - scriptTask-aec6c36b3a45/Reject Request - scriptTask-aec6c36b3a45.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-aec6c36b3a45", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-aec6c36b3a45.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ +var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var skipApproval = false; +var lineItemId = false; +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + lineItemId = requestObj.request.common.context.lineItemId; + if (context == 'admin') { + skipApproval = true; + } + } +} +catch (e) { + logger.info("Request Context Check failed "+e.message); +} + +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("lineItemId", lineItemId); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Request Context Check - scriptTask-e04f42607ba5/Request Context Check - scriptTask-e04f42607ba5.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-e04f42607ba5", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-67a954f33919", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-e04f42607ba5.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/steps/Validation Gateway - exclusiveGateway-48e748c42994/Validation Gateway - exclusiveGateway-48e748c42994.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-48e748c42994", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationFlowSuccess", + "step": "scriptTask-0359a9d77ee2", + }, + { + "condition": "failureReason != null", + "outcome": "validationFlowFailure", + "step": "scriptTask-0b56191887de", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-48e748c42994.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style": igaTestDir03/wfEntitlementExampleIsPrivileged/wfEntitlementExampleIsPrivileged.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "wfEntitlementExampleIsPrivileged", + "displayName": "wfEntitlementExampleIsPrivileged", + "id": "wfEntitlementExampleIsPrivileged", + "mutable": true, + "name": "wfEntitlementExampleIsPrivileged", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2262, + "y": 220, + }, + "startNode": { + "connections": { + "start": "scriptTask-e04f42607ba5", + }, + "id": "startNode", + "x": 70, + "y": 176, + }, + "uiConfig": { + "approvalTask-63163dc11c1f": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.entitlementOwner[0].id ? "managed/user/" + requestIndex.entitlementOwner[0].id : "managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "entitlementOwner", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 722, + "y": 265, + }, + "approvalTask-77691047b28d": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.user.manager._refResourceId", + }, + "type": "manager", + }, + ], + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 1219, + "y": 273, + }, + "exclusiveGateway-48e748c42994": { + "x": 1917, + "y": 104, + }, + "exclusiveGateway-67a954f33919": { + "x": 462, + "y": 155, + }, + "inclusiveGateway-bcb05a148971": { + "x": 1216, + "y": 99, + }, + "scriptTask-0359a9d77ee2": { + "x": 1924, + "y": 258.6666666666667, + }, + "scriptTask-0b56191887de": { + "x": 1907, + "y": 367.33333333333337, + }, + "scriptTask-3eab1948f1ec": { + "x": 1532, + "y": 151.66666666666669, + }, + "scriptTask-5106f7a29d86": { + "x": 940, + "y": 210, + }, + "scriptTask-aec6c36b3a45": { + "x": 1567, + "y": 274.33333333333337, + }, + "scriptTask-e04f42607ba5": { + "x": 181, + "y": 178, + }, + "scriptTask-e21178ab80f7": { + "x": 724, + "y": 101, + }, + }, + }, + "status": "draft", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set" 1`] = `0`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set" 2`] = `""`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set" 3`] = ` +"Experimental feature in use: 'frodo config-manager pull iga-workflows'. This feature may change without notice. +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/BasicApplicationGrant.json 1`] = ` +{ + "_rev": 7, + "childType": false, + "description": "Basic request flow for granting a user an account in an application", + "displayName": "Basic Application Grant", + "id": "BasicApplicationGrant", + "mutable": false, + "name": "BasicApplicationGrant", + "staticNodes": { + "endNode": { + "connections": null, + "id": "endNode", + "x": 2822, + "y": 352, + }, + "startNode": { + "connections": { + "start": "scriptTask-4e9121fe850a", + }, + "id": "startNode", + "x": 70, + "y": 140, + }, + "uiConfig": { + "approvalTask-74cf85c35437": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + ], + "events": { + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reminderDate": 3, + "reminderTimeSpan": "day(s)", + }, + "x": 682, + "y": 155, + }, + "exclusiveGateway-5167870154a9": { + "x": 1855, + "y": 84, + }, + "exclusiveGateway-621c9996676a": { + "x": 433, + "y": 117.015625, + }, + "inclusiveGateway-7d248125a9bd": { + "x": 2417, + "y": 43.015625, + }, + "inclusiveGateway-a71e67faaad1": { + "x": 1124, + "y": 93.015625, + }, + "scriptTask-0e5b6187ea62": { + "x": 889, + "y": 116.015625, + }, + "scriptTask-14acc58c28dd": { + "x": 2650, + "y": 85.015625, + }, + "scriptTask-3a74557440fb": { + "x": 2144, + "y": 62, + }, + "scriptTask-4e9121fe850a": { + "x": 168, + "y": 140.015625, + }, + "scriptTask-626899b6e99a": { + "x": 1549, + "y": 108, + }, + "scriptTask-744ef6a8b9a2": { + "x": 2151, + "y": 207.015625, + }, + "scriptTask-c58309b8c470": { + "x": 1554, + "y": 242, + }, + "waitTask-13cf96ebeb37": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + "resumeDateVariable": "startDate", + }, + "x": 1339, + "y": 85.015625, + }, + }, + }, + "status": "published", + "type": "provisioning", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Application Grant Validation - scriptTask-626899b6e99a/Application Grant Validation - scriptTask-626899b6e99a.js 1`] = ` +"logger.info("Running application grant request validation"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; +var applicationId = null; +var app = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = "Validation failed: Error reading request with id " + requestId; +} + +// Validation 1 - Check application exists +if (!failureReason) { + try { + app = openidm.read('managed/alpha_application/' + applicationId); + if (!app) { + failureReason = "Validation failed: Cannot find application with id " + applicationId; + } + } + catch (e) { + failureReason = "Validation failed: Error reading application with id " + applicationId + ". Error message: " + e.message; + } +} + +// Validation 2 - Check the user does not already have application granted +// Note: this is done at request submission time as well, the following is an example of how to check user's accounts +if (!failureReason) { + try { + var user = openidm.read('managed/alpha_user/' + requestObj.user.id, null, [ 'effectiveApplications' ]); + user.effectiveApplications.forEach(effectiveApp => { + if (effectiveApp._id === applicationId) { + failureReason = "Validation failed: User with id " + requestObj.user.id + " already has effective application " + applicationId; + } + }) + } + catch (e) { + failureReason = "Validation failed: Unable to check effective applications of user with id " + requestObj.user.id + ". Error message: " + e.message; + } +} + +if (failureReason) { + logger.info("Validation failed: " + failureReason); +} +execution.setVariable("failureReason", failureReason); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Application Grant Validation - scriptTask-626899b6e99a/Application Grant Validation - scriptTask-626899b6e99a.json 1`] = ` +{ + "displayName": "Application Grant Validation", + "name": "scriptTask-626899b6e99a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-5167870154a9", + }, + ], + "script": { + "file": "Application Grant Validation - scriptTask-626899b6e99a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Application Grant Validation Failure - scriptTask-744ef6a8b9a2/Application Grant Validation Failure - scriptTask-744ef6a8b9a2.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = content.get('failureReason'); + +var decision = {'outcome': 'not provisioned', 'status': 'complete', 'comment': failureReason, 'failure': true, 'decision': 'approved'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Application Grant Validation Failure - scriptTask-744ef6a8b9a2/Application Grant Validation Failure - scriptTask-744ef6a8b9a2.json 1`] = ` +{ + "displayName": "Application Grant Validation Failure", + "name": "scriptTask-744ef6a8b9a2", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Application Grant Validation Failure - scriptTask-744ef6a8b9a2.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Approval Task - approvalTask-74cf85c35437/Approval Task - approvalTask-74cf85c35437.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "assignment": { + "notification": "requestAssigned", + }, + "expiration": { + "action": "reject", + "actors": [], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "requestExpired", + }, + "reassign": { + "notification": "requestReassigned", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*1*24*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "requestReminder", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "scriptTask-c58309b8c470", + }, + ], + }, + "displayName": "Approval Task", + "name": "approvalTask-74cf85c35437", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Context Gateway - exclusiveGateway-621c9996676a/Context Gateway - exclusiveGateway-621c9996676a.json 1`] = ` +{ + "displayName": "Context Gateway", + "name": "exclusiveGateway-621c9996676a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "skipApproval == true", + "outcome": "AutoApproval", + "step": "scriptTask-0e5b6187ea62", + }, + { + "condition": "skipApproval == false", + "outcome": "Approval", + "step": "approvalTask-74cf85c35437", + }, + ], + "script": { + "file": "Context Gateway - exclusiveGateway-621c9996676a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Create Removal Request - scriptTask-14acc58c28dd/Create Removal Request - scriptTask-14acc58c28dd.js 1`] = ` +"logger.info("Create Removal Request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Create Removal Request failed: Error reading request with id " + requestId; +} + +if(!failureReason){ + try{ + var request = requestObj.request; + var newRequestPayload = { + "common":{ + "context": { + "type": "admin" + }, + "applicationId": request.common.applicationId, + "userId": request.common.userId, + "endDate": request.common.endDate, + "justification": "Request submitted automatically to remove access granted by request: " + requestId + } + }; + var queryParam = { + '_action': "publish" + } + openidm.action('iga/governance/requests/applicationRemove', 'POST', newRequestPayload, queryParam) + }catch(e){ + logger.info("Create Removal Request failed to create request") + } + } +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Create Removal Request - scriptTask-14acc58c28dd/Create Removal Request - scriptTask-14acc58c28dd.json 1`] = ` +{ + "displayName": "Create Removal Request", + "name": "scriptTask-14acc58c28dd", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Create Removal Request - scriptTask-14acc58c28dd.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Has End Date - inclusiveGateway-7d248125a9bd/Has End Date - inclusiveGateway-7d248125a9bd.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Has End Date - inclusiveGateway-7d248125a9bd/Has End Date - inclusiveGateway-7d248125a9bd.json 1`] = ` +{ + "displayName": "Has End Date", + "name": "inclusiveGateway-7d248125a9bd", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableEndWait == true", + "outcome": "hasEndDate", + "step": "scriptTask-14acc58c28dd", + }, + { + "condition": "enableEndWait == false", + "outcome": "noEndDate", + "step": null, + }, + ], + "script": { + "file": "Has End Date - inclusiveGateway-7d248125a9bd.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Has Start Date - inclusiveGateway-a71e67faaad1/Has Start Date - inclusiveGateway-a71e67faaad1.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Has Start Date - inclusiveGateway-a71e67faaad1/Has Start Date - inclusiveGateway-a71e67faaad1.json 1`] = ` +{ + "displayName": "Has Start Date", + "name": "inclusiveGateway-a71e67faaad1", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "enableWait == true", + "outcome": "hasStartDate", + "step": "waitTask-13cf96ebeb37", + }, + { + "condition": "enableWait == false", + "outcome": "noStartDate", + "step": "scriptTask-626899b6e99a", + }, + ], + "script": { + "file": "Has Start Date - inclusiveGateway-a71e67faaad1.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Provisioning - scriptTask-3a74557440fb/Provisioning - scriptTask-3a74557440fb.js 1`] = ` +"logger.info("Provisioning"); + +var content = execution.getVariables(); +var requestId = content.get('id'); +var failureReason = null; + +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + logger.info("requestObj: " + requestObj); +} +catch (e) { + failureReason = "Provisioning failed: Error reading request with id " + requestId; +} + +if(!failureReason) { + try { + var request = requestObj.request; + var payload = { + "applicationId": request.common.applicationId, + "auditContext": {}, + "grantType": "request", + "requestId": requestObj.id, + }; + var queryParams = { + "_action": "add", + "initiatingUser": requestObj.requester.id + } + + logger.info("Creating account: " + payload); + var result = openidm.action('iga/governance/user/' + request.common.userId + '/applications' , 'POST', payload,queryParams); + } + catch (e) { + var err = e.javaException; + err = JSON.parse(err.detail); + var message = err && err.body ? err.body.response : e.message; + failureReason = "Provisioning failed: Error provisioning account to user " + request.common.userId + " for application " + request.common.applicationId + ". Error message: " + message; + } + + var decision = {'status': 'complete'}; + if (failureReason) { + decision.outcome = 'not provisioned'; + decision.comment = failureReason; + decision.failure = true; + execution.setVariable('enableEndWait', false); + } + else { + decision.outcome = 'provisioned'; + } + + var queryParams = { '_action': 'update'}; + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + logger.info("Request " + requestId + " completed."); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Provisioning - scriptTask-3a74557440fb/Provisioning - scriptTask-3a74557440fb.json 1`] = ` +{ + "displayName": "Provisioning", + "name": "scriptTask-3a74557440fb", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-7d248125a9bd", + }, + ], + "script": { + "file": "Provisioning - scriptTask-3a74557440fb.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.js 1`] = ` +"logger.info("Rejecting request"); + +var content = execution.getVariables(); +var requestId = content.get('id'); + +// Complete request as rejected +var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); +var decision = {'outcome': 'denied', 'status': 'complete', 'decision': 'rejected'}; +var queryParams = { '_action': 'update'}; +openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Reject Request - scriptTask-c58309b8c470/Reject Request - scriptTask-c58309b8c470.json 1`] = ` +{ + "displayName": "Reject Request", + "name": "scriptTask-c58309b8c470", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": null, + }, + ], + "script": { + "file": "Reject Request - scriptTask-c58309b8c470.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = content.get('context'); +var skipApproval = content.get('skipApproval'); +var queryParams = { + "_action": "update" +} +try { + var decision = { + "decision": "approved", + } + if (skipApproval) { + decision.comment = "Request auto-approved due to request context: " + context; + } + openidm.action('iga/governance/requests/' + requestId, 'POST', decision, queryParams); + +} +catch (e) { + var failureReason = "Failure updating decision on request. Error message: " + e.message; + var update = { 'comment': failureReason, 'failure': true }; + openidm.action('iga/governance/requests/' + requestId, 'POST', update, queryParams); +} +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Request Approved - scriptTask-0e5b6187ea62/Request Approved - scriptTask-0e5b6187ea62.json 1`] = ` +{ + "displayName": "Request Approved", + "name": "scriptTask-0e5b6187ea62", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "inclusiveGateway-a71e67faaad1", + }, + ], + "script": { + "file": "Request Approved - scriptTask-0e5b6187ea62.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.js 1`] = ` +"var content = execution.getVariables(); +var requestId = content.get('id'); +var context = null; +var enableWait = false; +var enableEndWait = false; +var skipApproval = false; +try { + // Read request object + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + if (requestObj.request.common.context) { + context = requestObj.request.common.context.type; + if (context == 'admin') { + skipApproval = true; + } + } + if (requestObj.request.common.startDate){ + enableWait = true; + } + if (requestObj.request.common.endDate){ + enableEndWait = true; + } +} +catch (e) { + logger.info("Request Context Check failed " + e.message); +} +logger.info("Context: " + context); +execution.setVariable("context", context); +execution.setVariable("enableWait", enableWait); +execution.setVariable("enableEndWait", enableEndWait); +execution.setVariable("skipApproval", skipApproval); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Request Context Check - scriptTask-4e9121fe850a/Request Context Check - scriptTask-4e9121fe850a.json 1`] = ` +{ + "displayName": "Request Context Check", + "name": "scriptTask-4e9121fe850a", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "exclusiveGateway-621c9996676a", + }, + ], + "script": { + "file": "Request Context Check - scriptTask-4e9121fe850a.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Validation Gateway - exclusiveGateway-5167870154a9/Validation Gateway - exclusiveGateway-5167870154a9.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Validation Gateway - exclusiveGateway-5167870154a9/Validation Gateway - exclusiveGateway-5167870154a9.json 1`] = ` +{ + "displayName": "Validation Gateway", + "name": "exclusiveGateway-5167870154a9", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "failureReason == null", + "outcome": "validationSuccess", + "step": "scriptTask-3a74557440fb", + }, + { + "condition": "failureReason != null", + "outcome": "validationFailure", + "step": "scriptTask-744ef6a8b9a2", + }, + ], + "script": { + "file": "Validation Gateway - exclusiveGateway-5167870154a9.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set": igaTestDir04/BasicApplicationGrant/steps/Wait Task - waitTask-13cf96ebeb37/Wait Task - waitTask-13cf96ebeb37.json 1`] = ` +{ + "displayName": "Wait Task", + "name": "waitTask-13cf96ebeb37", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "scriptTask-626899b6e99a", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style" 1`] = `0`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style" 2`] = `""`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style" 3`] = ` +"Experimental feature in use: 'frodo config-manager pull iga-workflows'. This feature may change without notice. +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Approval Task - approvalTask-7e33e73d6763/Custom Approval Task - approvalTask-7e33e73d6763.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate1", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate1", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "content.customExpirationDuration", + }, + "notification": "FrodoTestEmailTemplate1", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate1", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(4*30*24*60*60*1000))).toISOString()", + }, + "frequency": 4, + "notification": "FrodoTestEmailTemplate1", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "fulfillmentTask-7fce35a32915", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "displayName": "Custom Approval Task", + "name": "approvalTask-7e33e73d6763", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Approval Task 2 - approvalTask-363e32acf981/Custom Approval Task 2 - approvalTask-363e32acf981.json 1`] = ` +{ + "approvalMode": "any", + "approvalTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "APPROVE", + "step": "fulfillmentTask-29a71d4ab8ed", + }, + { + "condition": null, + "outcome": "REJECT", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "displayName": "Custom Approval Task 2", + "name": "approvalTask-363e32acf981", + "type": "approvalTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Email Task - emailTask-2068f5d711c8/Custom Email Task - emailTask-2068f5d711c8.json 1`] = ` +{ + "displayName": "Custom Email Task", + "emailTask": { + "bcc": { + "isExpression": true, + "value": "// This is the bcc script +"bcc@email.com";", + }, + "cc": { + "isExpression": true, + "value": "// This is the cc script +"cc@email.com";", + }, + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": "waitTask-b7fc169ca4eb", + }, + { + "condition": null, + "outcome": "FAILED", + "step": "violationTask-50261d9bc712", + }, + ], + "object": { + "hello": "goodbye", + "hi": "hola", + }, + "templateName": "frodoTestEmailTemplateFour", + "to": { + "isExpression": true, + "value": "// This is the to script +"to@email.com";", + }, + }, + "name": "emailTask-2068f5d711c8", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Email Task 2 - emailTask-881f2975e240/Custom Email Task 2 - emailTask-881f2975e240.json 1`] = ` +{ + "displayName": "Custom Email Task 2", + "emailTask": { + "bcc": "bcc@email.com", + "cc": "cc@email.com", + "nextStep": [ + { + "condition": null, + "outcome": "SUCCESS", + "step": "waitTask-72d593301121", + }, + { + "condition": null, + "outcome": "FAILED", + "step": "violationTask-50261d9bc712", + }, + ], + "object": {}, + "templateName": "frodoTestEmailTemplateFour", + "to": "to@email.com", + }, + "name": "emailTask-881f2975e240", + "type": "emailTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Fulfillment Task - fulfillmentTask-7fce35a32915/Custom Fulfillment Task - fulfillmentTask-7fce35a32915.json 1`] = ` +{ + "displayName": "Custom Fulfillment Task", + "fulfillmentTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate2", + }, + "escalation": { + "actors": [ + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate2", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(7*24*60*60*1000))).toISOString()", + }, + "notification": "FrodoTestEmailTemplate2", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate2", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(2*30*24*60*60*1000))).toISOString()", + }, + "frequency": 2, + "notification": "FrodoTestEmailTemplate2", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "exclusiveGateway-94bc3d35f3b4", + }, + { + "condition": null, + "outcome": "DENY", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "name": "fulfillmentTask-7fce35a32915", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Fulfillment Task 2 - fulfillmentTask-29a71d4ab8ed/Custom Fulfillment Task 2 - fulfillmentTask-29a71d4ab8ed.json 1`] = ` +{ + "displayName": "Custom Fulfillment Task 2", + "fulfillmentTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "approvalMode": "any", + "events": { + "expiration": { + "date": { + "value": "content.customExpirationDate", + }, + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "FULFILL", + "step": "emailTask-881f2975e240", + }, + { + "condition": null, + "outcome": "DENY", + "step": "violationTask-50261d9bc712", + }, + ], + }, + "name": "fulfillmentTask-29a71d4ab8ed", + "type": "fulfillmentTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.js 1`] = ` +"logger.info("This is inclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55/Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.json 1`] = ` +{ + "displayName": "Custom Inclusive Gateway", + "name": "inclusiveGateway-a6cf9605ce55", + "scriptTask": { + "gatewayType": "inclusive", + "language": "javascript", + "nextStep": [ + { + "condition": "// This is outcome 1 +outcome === 1", + "outcome": "outcomeOne", + "step": "scriptTask-493f5ea87636", + }, + { + "condition": "// This is outcome 2 +outcome === 2", + "outcome": "outcomeTwo", + "step": "scriptTask-493f5ea87636", + }, + { + "condition": "// This is outcome 3 +outcome === 3", + "outcome": "outcomeThree", + "step": "violationTask-50261d9bc712", + }, + ], + "script": { + "file": "Custom Inclusive Gateway - inclusiveGateway-a6cf9605ce55.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Script Task - scriptTask-493f5ea87636/Custom Script Task - scriptTask-493f5ea87636.js 1`] = ` +"/* +Script nodes are used to invoke APIs or execute business logic. +You can invoke governance APIs or IDM APIs. +See https://backstage.forgerock.com/docs/idcloud/latest/identity-governance/administration/workflow-configure.html for more details. + +Script nodes should return a single value and should have the +logic enclosed in a try-catch block. + +Example: +try { + var requestObj = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + applicationId = requestObj.application.id; +} +catch (e) { + failureReason = 'Validation failed: Error reading request with id ' + requestId; +} +*/ +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Script Task - scriptTask-493f5ea87636/Custom Script Task - scriptTask-493f5ea87636.json 1`] = ` +{ + "displayName": "Custom Script Task", + "name": "scriptTask-493f5ea87636", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "true", + "outcome": "done", + "step": "emailTask-2068f5d711c8", + }, + ], + "script": { + "file": "Custom Script Task - scriptTask-493f5ea87636.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.js 1`] = ` +"logger.info("This is exclusive gateway"); +" +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4/Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.json 1`] = ` +{ + "displayName": "Custom Validation Gateway", + "name": "exclusiveGateway-94bc3d35f3b4", + "scriptTask": { + "language": "javascript", + "nextStep": [ + { + "condition": "// This is a validation success +outcome == true", + "outcome": "validationSuccess", + "step": "inclusiveGateway-a6cf9605ce55", + }, + { + "condition": "// This is a validation failure +outcome == false", + "outcome": "validationFailure", + "step": "violationTask-50261d9bc712", + }, + ], + "script": { + "file": "Custom Validation Gateway - exclusiveGateway-94bc3d35f3b4.js", + }, + }, + "type": "scriptTask", +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Violation Task - violationTask-50261d9bc712/Custom Violation Task - violationTask-50261d9bc712.json 1`] = ` +{ + "displayName": "Custom Violation Task", + "name": "violationTask-50261d9bc712", + "type": "violationTask", + "violationTask": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "approvalMode": "any", + "events": { + "assignment": { + "notification": "FrodoTestEmailTemplate3", + }, + "escalation": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*7*24*60*60*1000))).toISOString()", + }, + "frequency": 5, + "notification": "FrodoTestEmailTemplate3", + }, + "expiration": { + "action": "reassign", + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(8*30*24*60*60*1000))).toISOString()", + }, + "notification": "FrodoTestEmailTemplate3", + }, + "reassign": { + "notification": "FrodoTestEmailTemplate3", + }, + "reminder": { + "date": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(3*60*60*1000))).toISOString()", + }, + "frequency": 3, + "notification": "FrodoTestEmailTemplate3", + }, + }, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": null, + }, + { + "condition": null, + "outcome": "ALLOW", + "step": null, + }, + { + "condition": null, + "outcome": "EXPIRATION", + "step": "approvalTask-7e33e73d6763", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Violation Task 2 - violationTask-f8066518b46a/Custom Violation Task 2 - violationTask-f8066518b46a.json 1`] = ` +{ + "displayName": "Custom Violation Task 2", + "name": "violationTask-f8066518b46a", + "type": "violationTask", + "violationTask": { + "actors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "approvalMode": "any", + "events": {}, + "nextStep": [ + { + "condition": null, + "outcome": "REMEDIATE", + "step": null, + }, + { + "condition": null, + "outcome": "ALLOW", + "step": null, + }, + { + "condition": null, + "outcome": "EXPIRATION", + "step": "approvalTask-7e33e73d6763", + }, + ], + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Wait Task - waitTask-b7fc169ca4eb/Custom Wait Task - waitTask-b7fc169ca4eb.json 1`] = ` +{ + "displayName": "Custom Wait Task", + "name": "waitTask-b7fc169ca4eb", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "approvalTask-363e32acf981", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "(new Date(new Date().getTime()+(5*30*24*60*60*1000))).toISOString()", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Wait Task 2 - waitTask-72d593301121/Custom Wait Task 2 - waitTask-72d593301121.json 1`] = ` +{ + "displayName": "Custom Wait Task 2", + "name": "waitTask-72d593301121", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "waitTask-b343cc7df7c9", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "requestIndex.request.common.startDate", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/steps/Custom Wait Task 3 - waitTask-b343cc7df7c9/Custom Wait Task 3 - waitTask-b343cc7df7c9.json 1`] = ` +{ + "displayName": "Custom Wait Task 3", + "name": "waitTask-b343cc7df7c9", + "type": "waitTask", + "waitTask": { + "events": null, + "nextStep": [ + { + "condition": "true", + "outcome": "COMPLETE", + "step": "violationTask-f8066518b46a", + }, + ], + "resumeDate": { + "isExpression": true, + "value": "content.get('resumeDate')", + }, + }, +} +`; + +exports[`frodo config-manager pull "frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style": igaTestDir02/test_workflow_4/test_workflow_4.json 1`] = ` +{ + "_rev": 0, + "childType": false, + "description": "test_workflow_4", + "displayName": "test_workflow_4", + "id": "testWorkflow4", + "mutable": true, + "name": "test_workflow_4", + "staticNodes": { + "endNode": { + "_outcomes": [], + "connections": {}, + "displayDetails": { + "icon": "checkmark", + "value": "Success", + "variant": "success", + }, + "displayType": "SingleInput", + "hasError": false, + "id": "endNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "End", + "nodeType": "SingleInput", + "schema": null, + "template": null, + "x": 826, + "y": 50, + }, + "startNode": { + "_outcomes": [ + { + "displayName": "start", + "id": "start", + }, + ], + "connections": { + "start": "approvalTask-7e33e73d6763", + }, + "displayDetails": { + "icon": "play_arrow", + "value": "Start", + "variant": "info", + }, + "displayType": "IconOutcomeNode", + "hasError": false, + "id": "startNode", + "isDeleteable": false, + "isDroppable": false, + "isEditable": false, + "isHovered": false, + "name": "Start", + "nodeType": "IconOutcomeNode", + "schema": null, + "template": null, + "x": 20, + "y": 42, + }, + "uiConfig": { + "approvalTask-363e32acf981": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + { + "id": { + "isExpression": false, + "value": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + }, + "type": "role", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "type": "applicationOwner", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "type": "manager", + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "type": "entitlementOwner", + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "type": "roleOwner", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 478.3999938964844, + "y": 195.6125030517578, + }, + "approvalTask-7e33e73d6763": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "day(s)", + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "variable", + "expirationDateVariable": "customExpirationDuration", + "expirationTimeSpan": "hour(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": "managed/role/be68f831-a8f3-42da-93df-84bbc66427f6", + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.applicationOwner[0].id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + requestIndex.manager.id", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": ""managed/user/" + ((requestIndex.entitlementOwner && requestIndex.entitlementOwner.length > 0) ? requestIndex.entitlementOwner[0].id : requestIndex.applicationOwner[0].id)", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + { + "id": { + "isExpression": true, + "value": "(function() { + var systemSettings = openidm.action("iga/commons/config/iga_access_request", "GET", {}, {}); + var approver = null; + if (requestIndex.roleOwner && requestIndex.roleOwner[0]) { + approver = "managed/user/" + requestIndex.roleOwner[0].id; + } else if (systemSettings && systemSettings.defaultApprover) { + approver = systemSettings.defaultApprover; + } + return approver; +})()", + }, + "permissions": { + "approve": true, + "comment": true, + "modify": true, + "reassign": true, + "reject": true, + }, + }, + ], + "reminderDate": 4, + "reminderTimeSpan": "month(s)", + }, + "x": 146.39999389648438, + "y": 15.61250305175781, + }, + "emailTask-2068f5d711c8": { + "x": 150.39999389648438, + "y": 648.812502861023, + }, + "emailTask-881f2975e240": { + "x": 478.3999938964844, + "y": 474.41250228881836, + }, + "exclusiveGateway-94bc3d35f3b4": { + "x": 145.39999389648438, + "y": 274.6125030517578, + }, + "fulfillmentTask-29a71d4ab8ed": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationDate": 1, + "escalationType": "applicationOwner", + "expirationDate": 7, + "expirationDateType": "variable", + "expirationDateVariable": "customExpirationDate", + "expirationTimeSpan": "day(s)", + "reassignedActors": [], + "reminderDate": 1, + }, + "x": 479.3999938964844, + "y": 334.41250228881836, + }, + "fulfillmentTask-7fce35a32915": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "hour(s)", + "escalationType": "applicationOwner", + "expirationDate": 8, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "month(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "comment": true, + "deny": true, + "fulfill": true, + "modify": true, + "reassign": true, + }, + }, + ], + "reminderDate": 2, + "reminderTimeSpan": "month(s)", + }, + "x": 145.39999389648438, + "y": 146.6125030517578, + }, + "inclusiveGateway-a6cf9605ce55": { + "x": 147.39999389648438, + "y": 405.6125030517578, + }, + "scriptTask-493f5ea87636": { + "x": 148.39999389648438, + "y": 570.6125030517578, + }, + "violationTask-50261d9bc712": { + "actors": { + "isExpression": true, + "value": "/** +Define custom script which returns an array of actors in the following format +(function() { + var content = execution.getVariables(); + var requestId = content.get('id'); + var requestIndex = openidm.action('iga/governance/requests/' + requestId, 'GET', {}, {}); + return [{ + id: "managed/user/" + requestIndex.applicationOwner[0].id, + permissions: { + approve: true, + reject: true, + reassign: true, + modify: true, + comment: true + } + }]; +})() +**/ +( +function(){ + return []; +} +)()", + }, + "events": { + "escalationDate": 5, + "escalationTimeSpan": "week(s)", + "escalationType": "applicationOwner", + "expirationDate": 8, + "expirationDateType": "duration", + "expirationDateVariable": "", + "expirationTimeSpan": "month(s)", + "reassignedActors": [ + { + "id": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + "permissions": { + "allow": true, + "comment": true, + "exception": true, + "reassign": true, + "remediate": true, + }, + }, + ], + "reminderDate": 3, + "reminderTimeSpan": "hour(s)", + }, + "x": 480.3999938964844, + "y": 13.61250305175781, + }, + "violationTask-f8066518b46a": { + "actors": [ + { + "id": { + "isExpression": false, + "value": "managed/user/0f325c99-6965-4f45-b1e4-f9db1fa4dcf6", + }, + "type": "user", + }, + ], + "events": { + "escalationType": "applicationOwner", + "expirationDateType": "variable", + "expirationDateVariable": "taskExpirationDate", + "reassignedActors": [], + }, + "x": 788.3999938964844, + "y": 613.4125022888184, + }, + "waitTask-72d593301121": { + "events": { + "resumeDateNumber": 1, + "resumeDateRequestProperty": "request.common.startDate", + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "requestProp", + }, + "x": 476.3999938964844, + "y": 612.4125022888184, + }, + "waitTask-b343cc7df7c9": { + "events": { + "resumeDateNumber": 1, + "resumeDateTimeSpan": "day(s)", + "resumeDateType": "variable", + "resumeDateVariable": "resumeDate", + }, + "x": 476.3999938964844, + "y": 694.4125022888184, + }, + "waitTask-b7fc169ca4eb": { + "events": { + "resumeDateNumber": 5, + "resumeDateTimeSpan": "month(s)", + "resumeDateType": "duration", + }, + "x": 148.39999389648438, + "y": 779.812502861023, + }, + }, + }, + "status": "published", +} +`; diff --git a/test/e2e/__snapshots__/config-manager-export-test.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-export-test.e2e.test.js.snap index 693f1b494..92ea26947 100644 --- a/test/e2e/__snapshots__/config-manager-export-test.e2e.test.js.snap +++ b/test/e2e/__snapshots__/config-manager-export-test.e2e.test.js.snap @@ -3,7 +3,7 @@ exports[`frodo config-manager pulls "frodo config-manager pull test": should receive access tokens" 1`] = `""`; exports[`frodo config-manager pulls "frodo config-manager pull test": should receive access tokens" 2`] = ` -"Experimental feature in use: 'frodo config-manager pull test'. This feature may change without notice. +"Experimental feature in use: 'frodo config-manager pull test'. This feature may change without notice. Authenticated successfully " `; diff --git a/test/e2e/__snapshots__/config-manager-push-restart.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-restart.e2e.test.js.snap new file mode 100644 index 000000000..bb43a2334 --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-restart.e2e.test.js.snap @@ -0,0 +1,33 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`frodo config-manager push restart "frodo config-manager push restart -c": should check for updates and then apply them to the cloud tenant" 1`] = `""`; + +exports[`frodo config-manager push restart "frodo config-manager push restart -c": should check for updates and then apply them to the cloud tenant" 2`] = ` +"Experimental feature in use: 'frodo config-manager push restart'. This feature may change without notice. +✔ No updates need to be applied +All ESVs loaded - not restarting +" +`; + +exports[`frodo config-manager push restart "frodo config-manager push restart -s": should check for updates to apply to the cloud tenant" 1`] = `""`; + +exports[`frodo config-manager push restart "frodo config-manager push restart -s": should check for updates to apply to the cloud tenant" 2`] = ` +"Experimental feature in use: 'frodo config-manager push restart'. This feature may change without notice. +ready +" +`; + +exports[`frodo config-manager push restart "frodo config-manager push restart -w": should restart the cloud tenant and wait until restart is complete to exit command." 1`] = `""`; + +exports[`frodo config-manager push restart "frodo config-manager push restart -w": should restart the cloud tenant and wait until restart is complete to exit command." 2`] = ` +"Experimental feature in use: 'frodo config-manager push restart'. This feature may change without notice. +" +`; + +exports[`frodo config-manager push restart "frodo config-manager push restart": should restart the cloud tenant" 1`] = `""`; + +exports[`frodo config-manager push restart "frodo config-manager push restart": should restart the cloud tenant" 2`] = ` +"Experimental feature in use: 'frodo config-manager push restart'. This feature may change without notice. +✔ Updates are being applied. Changes may take up to 10 minutes to propagate, during which time you will not be able to make further updates. +" +`; diff --git a/test/e2e/__snapshots__/journey-describe.e2e.test.js.snap b/test/e2e/__snapshots__/journey-describe.e2e.test.js.snap index 9232160e7..5672fda06 100644 --- a/test/e2e/__snapshots__/journey-describe.e2e.test.js.snap +++ b/test/e2e/__snapshots__/journey-describe.e2e.test.js.snap @@ -831,651 +831,6 @@ Update password using active session exports[`frodo journey describe "frodo journey describe --output-file test2.json": should describe all journeys and write output to test2.json file 1`] = `""`; exports[`frodo journey describe "frodo journey describe --output-file test2.json": should describe all journeys and write output to test2.json file 2`] = ` -"[Agent] - -CAUTION: PingAM Agent and PingGateway profiles require an Agent journey. Don't change this configuration. - -Categories/Tags -Authentication - -Node Types (5): -- 1 [ZeroPageLoginNode] -- 1 [AgentDataStoreDecisionNode] -- 1 [PageNode] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] - -Nodes (5): -- [51e2cd24-cf1f-4313-8af0-35ea9e04d2fe] ZeroPageLoginNode - Zero Page Login Collector -- [6736a00a-fc65-438e-b4ea-23f66b4a8739] AgentDataStoreDecisionNode - Agent Data Store Decision -- [cbd1f1af-eb0a-4274-a762-adacf04c7080] PageNode - Page Node -- [2eaad2f9-5c4b-405f-bf3f-1e99bdc0d018] ValidatedUsernameNode - Platform Username -- [6072842f-5f7c-4b62-8ae2-4f18a5701ba4] ValidatedPasswordNode - Platform Password -[ForgottenUsername] - -Forgotten Username Tree - -Categories/Tags -Username Reset - -Inner Tree Dependencies (1): -- ForgottenUsername - - Login - - ProgressiveProfile - -Node Types (5): -- 1 [PageNode] -- 1 [InnerTreeEvaluatorNode] -- 1 [IdentifyExistingUserNode] -- 1 [EmailSuspendNode] -- 1 [AttributeCollectorNode] - -Nodes (5): -- [5e2a7c95-94af-4b23-8724-deb13853726a] PageNode - Page Node -- [b93ce36e-1976-4610-b24f-8d6760b5463b] InnerTreeEvaluatorNode - Inner Tree Evaluator -- [bf9ea8d5-9802-4f26-9664-a21840faac23] IdentifyExistingUserNode - Identify Existing User -- [d9a79f01-2ce3-4be2-a28a-975f35c3c8ca] EmailSuspendNode - Email Suspend Node -- [9f1e8d94-4922-481b-9e14-212b66548900] AttributeCollectorNode - Attribute Collector - -Email Templates (1): -- [forgottenUsername] - Account Information - username -[FrodoTest] - -Frodo test journey utilizing a variety of nodes and dependencies to test support for complex journeys. - -Categories/Tags -Frodo, Prototype - -Node Types (9): -- 2 [PageNode] -- 1 [product-Saml2Node] -- 1 [EmailTemplateNode] -- 1 [SocialProviderHandlerNode] -- 1 [ScriptedDecisionNode] -- 1 [IdentityStoreDecisionNode] -- 1 [ValidatedUsernameNode] -- 2 [ValidatedPasswordNode] -- 2 [SelectIdPNode] - -Nodes (12): -- [278bf084-9eea-46fe-8ce9-2600dde3b046] PageNode - Login Page -- [64157fca-bd5b-4405-a4c8-64ffd98a5461] product-Saml2Node - SAML2 Authentication -- [731c5810-020b-45c8-a7fc-3c21903ae2b3] PageNode - Login Page -- [bf153f37-83dd-4f39-aa0c-74135430242e] EmailTemplateNode - Email Template Node -- [d5cc2d52-6ce4-452d-85ea-3a5b50218b67] SocialProviderHandlerNode - Social Login -- [e2c39477-847a-4df2-9c5d-b449a752638b] ScriptedDecisionNode - Check Username -- [fc7e47cd-c679-4211-8e05-a36654f23c67] IdentityStoreDecisionNode - Validate Creds -- [7a351800-fb7e-4145-903c-388554747556] ValidatedUsernameNode - Username -- [804e6a68-1720-442b-926a-007e90f02782] ValidatedPasswordNode - Password -- [228a44d5-fd78-4278-8999-fdd470ea7ebf] SelectIdPNode - Select IDP -- [dd16c8d4-baca-4ae0-bcd8-fb98b9040524] ValidatedPasswordNode - Password -- [038f9b2a-36b2-489b-9e03-386c9a62ea21] SelectIdPNode - Select IDP - -Themes (1): -- [63e19668-909f-479e-83d7-be7a01cd8187] NoAccess (FrodoTest, AA-FrodoTest) - -Scripts (9): -- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User -- [739bdc48-fd24-4c52-b353-88706d75558a] AUTHENTICATION_TREE_DECISION_NODE - Check Username -- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization -- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) -- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization -- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization -- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization -- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) -- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization - -Email Templates (1): -- [welcome] Welcome - Your account has been created - -Social Identity Providers (8): -- [google] googleConfig -- [github] oauth2Config -- [facebook] oauth2Config -- [apple-stoyan] appleConfig -- [apple_web] appleConfig -- [okta-trial-5735851] oidcConfig -- [adfs] oidcConfig -- [azure] microsoftConfig - -SAML2 Entity Providers (2): -- [iSPAzure] (hosted SP) -- [urn:federation:MicrosoftOnline] (remote SP) - -SAML2 Circles Of Trust (2): -- [2f04818d-561e-4f8a-82e8-af2426112138] -- [AzureCOT] -[FrodoTestJourney13] - -Frodo test journey using v2.0 nodes - -Categories/Tags -Frodo, Prototype - -Node Types (4): -- 1 [DataStoreDecisionNode] -- 1 [PageNode] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] - -Nodes (4): -- [bdca20b7-ada8-4906-8b3a-e59c313f6491] DataStoreDecisionNode - Validate Credentials -- [c847e93b-afa3-4d20-9a15-f75404ec353c] PageNode - Login Page -- [64dceffc-2db4-468b-96d1-491824e037a2] ValidatedUsernameNode - Username -- [e4c5071f-acc8-47c9-b097-5c4144170742] ValidatedPasswordNode - Password -[j00] - -Node Types (1): -- 6 [ScriptedDecisionNode] - -Nodes (6): -- [01d3785f-7fb4-44a7-9458-72c380a9818f] ScriptedDecisionNode - shared -- [39b48197-f4be-42b9-800a-866587b4b9b5] ScriptedDecisionNode - level -- [3c1e8d61-0c48-44ba-86dc-52e9555b6aeb] ScriptedDecisionNode - level -- [513a2ab4-f0b8-4f94-b840-6fe14796cc84] ScriptedDecisionNode - mode -- [ba503a1e-633e-4d0d-ba18-c9a9b1105b5b] ScriptedDecisionNode - debug -- [d17ffaa1-2c61-4abd-9bb1-2559160d0a5c] ScriptedDecisionNode - shared - -Scripts (4): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [3cb43516-ae69-433a-8787-501d45db14e9] AUTHENTICATION_TREE_DECISION_NODE - debug -[j01] - -Inner Tree Dependencies (1): -- j01 - - j00 - -Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] - -Nodes (6): -- [6674b4ac-dd89-4e13-9440-6f81194e3a22] ScriptedDecisionNode - shared -- [89ce5d57-82fa-4d58-8d15-0329f7dbd7e7] ScriptedDecisionNode - shared -- [bb1e96af-f316-4eb0-b1c6-36b3f1af9e35] InnerTreeEvaluatorNode - nest -- [bdfbe97c-1ff4-4162-85bc-47f6f14b2c66] ScriptedDecisionNode - level -- [e92d5139-b8a6-43dc-9b13-95ba1d0dc53c] ScriptedDecisionNode - level -- [f129f0df-b49e-453b-97fb-db508e3893ce] ScriptedDecisionNode - mode - -Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j02] - -Inner Tree Dependencies (1): -- j02 - - j01 - - j00 - -Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] - -Nodes (6): -- [2dbd2d37-c659-48cf-8357-c9fc1166e3a7] ScriptedDecisionNode - level -- [4416aff7-3ebd-47e6-9831-c2f6bbe3ae24] ScriptedDecisionNode - level -- [56899fef-92a1-4f2a-ade3-973c81eb3af1] InnerTreeEvaluatorNode - nest -- [59b06306-a886-443d-92df-7a27a60c394e] ScriptedDecisionNode - mode -- [cbb3d506-b267-4b99-9edd-363e90aac997] ScriptedDecisionNode - shared -- [e0983ead-4918-48f6-858d-9aff0f03759c] ScriptedDecisionNode - shared - -Scripts (3): -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -[j03] - -Inner Tree Dependencies (1): -- j03 - - j02 - - j01 - - j00 - -Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] - -Nodes (6): -- [35a4f94b-c895-46b9-bc0a-93cf59233759] ScriptedDecisionNode - level -- [3a92300d-6d64-451d-8156-30cb51781026] ScriptedDecisionNode - level -- [6f9de973-9ed4-41f5-b43d-4036041e2b96] ScriptedDecisionNode - shared -- [bcb8c535-5ecd-4d3d-b970-26816de96bf2] InnerTreeEvaluatorNode - nest -- [e0cfbd13-6f1e-4924-9d2d-0f7c23507172] ScriptedDecisionNode - mode -- [fae7424e-13c9-45bd-b3a2-045773671a3f] ScriptedDecisionNode - shared - -Scripts (3): -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j04] - -Inner Tree Dependencies (1): -- j04 - - j03 - - j02 - - j01 - - j00 - -Node Types (2): -- 1 [InnerTreeEvaluatorNode] -- 5 [ScriptedDecisionNode] - -Nodes (6): -- [00e75aa0-2f9b-4895-9257-d515286fd64b] InnerTreeEvaluatorNode - nest -- [040b6c89-313b-4664-92e0-6732017384b8] ScriptedDecisionNode - mode -- [69ae8ec1-de43-44ac-98e5-733db80ac176] ScriptedDecisionNode - level -- [9603ef52-30f0-4ddc-b3c0-28dac83c7bdb] ScriptedDecisionNode - shared -- [d10104e9-1f8d-4da6-a110-28d879d13959] ScriptedDecisionNode - level -- [f5c317ce-fabd-4a10-9907-c71cea037844] ScriptedDecisionNode - shared - -Scripts (3): -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -[j05] - -Inner Tree Dependencies (1): -- j05 - - j04 - - j03 - - j02 - - j01 - - j00 - -Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] - -Nodes (6): -- [11f1c31c-50a9-4717-8213-420f6932481f] ScriptedDecisionNode - shared -- [3c106772-ace7-4808-8f3a-9840de8f67f0] ScriptedDecisionNode - level -- [622179cb-98f1-484a-820d-9a0df6e45e95] ScriptedDecisionNode - mode -- [a0782616-84b7-4bf5-87ed-a01fb3018563] ScriptedDecisionNode - shared -- [e90ae257-c279-46e0-9b43-5ecd89784d77] ScriptedDecisionNode - level -- [f17ecb7c-abc3-4523-9943-4cbdd90305cb] InnerTreeEvaluatorNode - nest - -Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j06] - -Inner Tree Dependencies (1): -- j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 - -Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] - -Nodes (6): -- [1d59caff-243c-45bd-b7d0-6dcc563989c5] ScriptedDecisionNode - shared -- [2de08e9e-bf7b-4fa1-8265-59a8e4a3f7c3] ScriptedDecisionNode - level -- [409c251f-c23b-411d-9009-d3b3d26d1b90] InnerTreeEvaluatorNode - nest -- [44b8651c-7c1e-41f1-b9a6-2e441b0ce05a] ScriptedDecisionNode - mode -- [da878771-421c-463f-aad7-4d5f2ad5e59a] ScriptedDecisionNode - shared -- [fe8f27df-8a27-4d88-9196-834ce398b2b7] ScriptedDecisionNode - level - -Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j07] - -Inner Tree Dependencies (1): -- j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 - -Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] - -Nodes (6): -- [13b12fe6-cf53-46a4-a83d-0a3c1fda814f] ScriptedDecisionNode - mode -- [ac6ee166-73c0-4f73-b8db-4fe8ff6a25c0] ScriptedDecisionNode - shared -- [d90dd9f8-8b12-4e90-abaf-228ecc0174a7] ScriptedDecisionNode - level -- [d9a06d3a-7e3f-4244-9a32-63ffa0d26e00] ScriptedDecisionNode - shared -- [e62d7a4d-2012-4a2a-a6ef-d6a0e0d552d9] InnerTreeEvaluatorNode - nest -- [f2fe740c-cd75-460a-8baa-fe4b52ecc947] ScriptedDecisionNode - level - -Scripts (3): -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -[j08] - -Inner Tree Dependencies (1): -- j08 - - j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 - -Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] - -Nodes (6): -- [042b600b-71cb-45a8-93ae-a6f57b16a6e5] ScriptedDecisionNode - shared -- [66026170-5088-4fcd-a6c8-ed89d7a5c79d] InnerTreeEvaluatorNode - nest -- [8096649e-973e-4209-88ce-e1d87ae2bb96] ScriptedDecisionNode - level -- [87ced99b-bfa5-40d4-ba07-c8fc31f6cc6d] ScriptedDecisionNode - level -- [948e21f4-c512-450a-9d42-e0d629217834] ScriptedDecisionNode - shared -- [d429b2b5-b215-46a5-b239-4994df65cb8b] ScriptedDecisionNode - mode - -Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j09] - -Inner Tree Dependencies (1): -- j09 - - j08 - - j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 - -Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] - -Nodes (6): -- [251f35c3-1a32-4520-be10-1f4af9600935] ScriptedDecisionNode - mode -- [56b82371-0c61-4dc3-8d06-c1158415b8f9] ScriptedDecisionNode - level -- [6df24fdd-0b6c-4def-bf42-77af998f28b8] InnerTreeEvaluatorNode - nest -- [8c5e9cb5-471b-4dd6-b150-ecaaeda98195] ScriptedDecisionNode - shared -- [bb294e05-6b6b-4478-b46f-b8d9e7711c66] ScriptedDecisionNode - level -- [f57cf53c-b4c6-48f7-84e8-91f535a2e8f8] ScriptedDecisionNode - shared - -Scripts (3): -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -[j10] - -Inner Tree Dependencies (1): -- j10 - - j09 - - j08 - - j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 - -Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] - -Nodes (6): -- [300feda0-3248-49a9-b60f-01df802b2229] ScriptedDecisionNode - level -- [40afb384-e9b6-4dcb-acde-04de109474c8] ScriptedDecisionNode - shared -- [8d7d64ee-da20-461f-a2ca-206b7479dd67] ScriptedDecisionNode - level -- [97ef9d96-99e7-4d2d-b6c6-4177b5397ead] ScriptedDecisionNode - shared -- [c7fcf7ae-1ab5-474b-b5b0-272e10468fbd] InnerTreeEvaluatorNode - nest -- [c91d626e-1156-41bd-b1fb-d292f640fba6] ScriptedDecisionNode - mode - -Scripts (3): -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[Login] - -Platform Login Tree - -Categories/Tags -Authentication - -Inner Tree Dependencies (1): -- Login - - ProgressiveProfile - -Node Types (8): -- 1 [RetryLimitDecisionNode] -- 1 [InnerTreeEvaluatorNode] -- 1 [AccountLockoutNode] -- 1 [IdentityStoreDecisionNode] -- 1 [PageNode] -- 1 [IncrementLoginCountNode] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] - -Nodes (8): -- [2119f332-0f69-4088-a7a1-6582bf0f2001] RetryLimitDecisionNode - Retry Limit Decision -- [33b24514-3e50-4180-8f08-ab6f4e51b07e] InnerTreeEvaluatorNode - Inner Tree Evaluator -- [51e8c4c1-3509-4635-90e6-d2cc31c4a6a5] AccountLockoutNode - Account Lockout -- [7f0c2aee-8c74-4d02-82a6-9d4ed9d11708] IdentityStoreDecisionNode - Identity Store Decision -- [a12bc72f-ad97-4f1e-a789-a1fa3dd566c8] PageNode - Page Node -- [bba3e0d8-8525-4e82-bf48-ac17f7988917] IncrementLoginCountNode - Increment Login Count -- [7354982f-57b6-4b04-9ddc-f1dd1e1e07d0] ValidatedUsernameNode - Platform Username -- [0c80c39b-4813-4e67-b4fb-5a0bba85f994] ValidatedPasswordNode - Platform Password -[OrphanedTest] - -Test orphaned nodes - -Node Types (1): -- 1 [IdentityStoreDecisionNode] - -Nodes (1): -- [343e745f-923a-43c4-8675-649a490fd0a3] IdentityStoreDecisionNode - Identity Store Decision -[P1P-Test] - -PingOne Protect Login Risk - -Categories/Tags -Helper, P1 Protect - -Node Types (8): -- 7 [PageNode] -- 2 [product-PingOneProtectResultNode] -- 1 [product-PingOneProtectInitializeNode] -- 1 [product-PingOneProtectEvaluationNode] -- 1 [IdentityStoreDecisionNode] -- 6 [designer-4b76e2122a0541498f380072cd115683] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] - -Nodes (20): -- [00a4835b-6e99-4938-9bb8-50d5569a68d4] PageNode - Low -- [084c3d2d-7d47-4f2e-81d1-57961d496939] PageNode - High -- [167b87dd-a97c-4e3b-82ba-581090fd7863] product-PingOneProtectResultNode - SUCCESS -- [37f190ea-fa18-4d44-941b-4e5ac325f394] PageNode - Medium -- [4fdf4255-0236-4527-ae6d-d10d2c0ee8d5] PageNode - Login Page -- [6632fe0f-6395-4cc1-88d8-c9ca4a9061b6] product-PingOneProtectInitializeNode - Initialize Signals SDK -- [8120e613-dee8-42b4-9668-71b8a25c1c92] PageNode - P1P Failure -- [a0059e3b-de04-4f0f-a5ed-49525d1da576] PageNode - P1P Client Error -- [df827cfc-6e2d-4b9f-a8b1-d92c2910eb07] product-PingOneProtectEvaluationNode - P1P Risk Decision -- [e5f7bd1f-8dbb-4fb2-ae54-1e09047e8ece] product-PingOneProtectResultNode - FAILED -- [ef1929b1-255e-446e-a597-7d7a3c4bf63f] IdentityStoreDecisionNode - Identity Store Decision -- [f1cb199e-9e9a-4761-bacf-bc717ca6c540] PageNode - Exceeds Score Threshold -- [843dd22b-a890-461b-9a16-33d8bd871396] designer-4b76e2122a0541498f380072cd115683 - Debug -- [2c8f0d12-c373-4a25-9a30-b3184888d163] designer-4b76e2122a0541498f380072cd115683 - Debug -- [8835fe59-3988-4121-8b15-ad16a7049d7a] designer-4b76e2122a0541498f380072cd115683 - Debug -- [f74e82e2-72ab-4a1a-9188-655622794a37] ValidatedUsernameNode - Username -- [6a428d9f-a221-44f6-a5c6-c6981f90f9fc] ValidatedPasswordNode - Password -- [52ab689c-491b-4117-b729-ff590b5d1f61] designer-4b76e2122a0541498f380072cd115683 - Debug -- [c1804982-10dc-4668-bd53-909107cc4039] designer-4b76e2122a0541498f380072cd115683 - Debug -- [de8fa10c-f4cc-44b7-b675-cdc75dcc600f] designer-4b76e2122a0541498f380072cd115683 - Debug -[PrestonTest] - -Test journey with a script that no longer exists, to fix a journey export issue. -[ProgressiveProfile] - -Prompt for missing preferences on 3rd login - -Categories/Tags -Progressive Profile - -Node Types (5): -- 1 [PatchObjectNode] -- 1 [LoginCountDecisionNode] -- 1 [QueryFilterDecisionNode] -- 1 [PageNode] -- 1 [AttributeCollectorNode] - -Nodes (5): -- [423a959a-a1b9-498a-b0f7-596b6b6e775a] PatchObjectNode - Patch Object -- [8afdaec3-275e-4301-bb53-34f03e6a4b29] LoginCountDecisionNode - Login Count Decision -- [a1f45b44-5bf7-4c57-aa3f-75c619c7db8e] QueryFilterDecisionNode - Query Filter Decision -- [a5aecad8-854a-4ed5-b719-ff6c90e858c0] PageNode - Page Node -- [0a042e10-b22e-4e02-86c4-65e26e775f7a] AttributeCollectorNode - Attribute Collector -[RadioChoice] - -Node Types (2): -- 1 [PageNode] -- 1 [ChoiceCollectorNode] - -Nodes (2): -- [5d6cd20e-5074-43de-8832-fddd95fb078e] PageNode - Page Node -- [a566e474-99f3-46e4-9e70-682402bfaa84] ChoiceCollectorNode - Choice Collector -[Registration] - -Platform Registration Tree - -Categories/Tags -Registration - -Node Types (9): -- 1 [PageNode] -- 1 [EmailSuspendNode] -- 1 [IncrementLoginCountNode] -- 1 [CreateObjectNode] -- 1 [ValidatedUsernameNode] -- 1 [AttributeCollectorNode] -- 1 [ValidatedPasswordNode] -- 1 [KbaCreateNode] -- 1 [AcceptTermsAndConditionsNode] - -Nodes (9): -- [0c091c49-f3af-48fb-ac6f-07fba0499dd6] PageNode - Page Node -- [466f8b54-07fb-4e31-a11d-a6842618cc37] EmailSuspendNode - Email Suspend Node -- [97a15eb2-a015-4b6d-81a0-be78c3aa1a3b] IncrementLoginCountNode - Increment Login Count -- [ad5dcbb3-7335-49b7-b3e7-7d850bb88237] CreateObjectNode - Create Object -- [7fcaf48e-a754-4959-858b-05b2933b825f] ValidatedUsernameNode - Platform Username -- [d3ce2036-1523-4ce8-b1a2-895a2a036667] AttributeCollectorNode - Attribute Collector -- [3d8709a1-f09f-4d1f-8094-2850e472c1db] ValidatedPasswordNode - Platform Password -- [120c69d3-90b4-4ad4-b7af-380e8b119340] KbaCreateNode - KBA Definition -- [b4a0e915-c15d-4b83-9c9d-18347d645976] AcceptTermsAndConditionsNode - Accept Terms and Conditions - -Email Templates (1): -- [registration] - Register new account -[ResetPassword] - -Reset Password Tree - -Categories/Tags -Password Reset - -Node Types (6): -- 1 [EmailSuspendNode] -- 1 [IdentifyExistingUserNode] -- 1 [PatchObjectNode] -- 2 [PageNode] -- 1 [AttributeCollectorNode] -- 1 [ValidatedPasswordNode] - -Nodes (7): -- [06c97be5-7fdd-4739-aea1-ecc7fe082865] EmailSuspendNode - Email Suspend Node -- [21b8ddf3-0203-4ae1-ab05-51cf3a3a707a] IdentifyExistingUserNode - Identify Existing User -- [989f0bf8-a328-4217-b82b-5275d79ca8bd] PatchObjectNode - Patch Object -- [cc3e1ed2-25f1-47bf-83c6-17084f8b2b2b] PageNode - Page Node -- [e4c752f9-c625-48c9-9644-a58802fa9e9c] PageNode - Page Node -- [276afa7c-a680-4cf4-a5f6-d6c78191f5c9] AttributeCollectorNode - Attribute Collector -- [009c19c8-9572-47bb-adb2-1f092c559a43] ValidatedPasswordNode - Platform Password - -Email Templates (1): -- [resetPassword] - Reset your password -[SocialProviderHandler] - -Node Types (2): -- 1 [SocialProviderHandlerNode] -- 1 [SocialProviderHandlerNodeV2] - -Nodes (2): -- [3af612be-340e-4dc9-80fb-62319a187b74] SocialProviderHandlerNode - Legacy Social Provider Handler Node -- [e15c8efe-b7a7-42bf-845e-861a9419af32] SocialProviderHandlerNodeV2 - Social Provider Handler Node - -Scripts (9): -- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User -- [ed685f9f-5909-4726-86e8-22bd38b47663] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Identity -- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization -- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) -- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization -- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization -- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization -- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) -- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization - -Social Identity Providers (8): -- [google] googleConfig -- [github] oauth2Config -- [facebook] oauth2Config -- [apple-stoyan] appleConfig -- [apple_web] appleConfig -- [okta-trial-5735851] oidcConfig -- [adfs] oidcConfig -- [azure] microsoftConfig -[test] -[UpdatePassword] - -Update password using active session - -Categories/Tags -Password Reset - -Node Types (7): -- 1 [AttributePresentDecisionNode] -- 2 [PageNode] -- 1 [PatchObjectNode] -- 1 [DataStoreDecisionNode] -- 1 [EmailSuspendNode] -- 1 [SessionDataNode] -- 2 [ValidatedPasswordNode] - -Nodes (9): -- [0f0904e6-1da3-4cdb-9abf-0d2545016fab] AttributePresentDecisionNode - Attribute Present Decision -- [20237b34-26cb-4a0b-958f-abb422290d42] PageNode - Page Node -- [3990ce1f-cce6-435b-ae1c-f138e89411c1] PatchObjectNode - Patch Object -- [7d1deabe-cd98-49c8-943f-ca12305775f3] DataStoreDecisionNode - Data Store Decision -- [a3d97b53-e38a-4b24-aed0-a021050eb744] EmailSuspendNode - Email Suspend Node -- [d018fcd1-4e22-4160-8c41-63bee51c9cb3] PageNode - Page Node -- [d1b79744-493a-44fe-bc26-7d324a8caa4e] SessionDataNode - Get Session Data -- [fe2962fc-4db3-4066-8624-553649afc438] ValidatedPasswordNode - Platform Password -- [21a99653-a7a7-47ee-b650-f493a84bba09] ValidatedPasswordNode - Platform Password - -Email Templates (1): -- [updatePassword] - Update your password -" -`; - -exports[`frodo journey describe "frodo journey describe --override-version 4.2.0": should describe all journeys and override version to 4.2.0 1`] = ` "[Agent] CAUTION: PingAM Agent and PingGateway profiles require an Agent journey. Don't change this configuration. @@ -2120,10 +1475,8 @@ Email Templates (1): " `; -exports[`frodo journey describe "frodo journey describe -F test1.json": should describe all journeys and write output to test1.json file 1`] = `""`; - -exports[`frodo journey describe "frodo journey describe -F test1.json": should describe all journeys and write output to test1.json file 2`] = ` -"[Agent] +exports[`frodo journey describe "frodo journey describe --override-version 4.2.0": should describe all journeys and override version to 4.2.0 1`] = ` +"[Agent] CAUTION: PingAM Agent and PingGateway profiles require an Agent journey. Don't change this configuration. @@ -2131,19 +1484,19 @@ Categories/Tags Authentication Node Types (5): -- 1 [ZeroPageLoginNode] -- 1 [AgentDataStoreDecisionNode] -- 1 [PageNode] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] +- 1 [ZeroPageLoginNode] +- 1 [AgentDataStoreDecisionNode] +- 1 [PageNode] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] Nodes (5): -- [51e2cd24-cf1f-4313-8af0-35ea9e04d2fe] ZeroPageLoginNode - Zero Page Login Collector -- [6736a00a-fc65-438e-b4ea-23f66b4a8739] AgentDataStoreDecisionNode - Agent Data Store Decision -- [cbd1f1af-eb0a-4274-a762-adacf04c7080] PageNode - Page Node -- [2eaad2f9-5c4b-405f-bf3f-1e99bdc0d018] ValidatedUsernameNode - Platform Username -- [6072842f-5f7c-4b62-8ae2-4f18a5701ba4] ValidatedPasswordNode - Platform Password -[ForgottenUsername] +- [51e2cd24-cf1f-4313-8af0-35ea9e04d2fe] ZeroPageLoginNode - Zero Page Login Collector +- [6736a00a-fc65-438e-b4ea-23f66b4a8739] AgentDataStoreDecisionNode - Agent Data Store Decision +- [cbd1f1af-eb0a-4274-a762-adacf04c7080] PageNode - Page Node +- [2eaad2f9-5c4b-405f-bf3f-1e99bdc0d018] ValidatedUsernameNode - Platform Username +- [6072842f-5f7c-4b62-8ae2-4f18a5701ba4] ValidatedPasswordNode - Platform Password +[ForgottenUsername] Forgotten Username Tree @@ -2151,27 +1504,27 @@ Categories/Tags Username Reset Inner Tree Dependencies (1): -- ForgottenUsername - - Login - - ProgressiveProfile +- ForgottenUsername + - Login + - ProgressiveProfile Node Types (5): -- 1 [PageNode] -- 1 [InnerTreeEvaluatorNode] -- 1 [IdentifyExistingUserNode] -- 1 [EmailSuspendNode] -- 1 [AttributeCollectorNode] +- 1 [PageNode] +- 1 [InnerTreeEvaluatorNode] +- 1 [IdentifyExistingUserNode] +- 1 [EmailSuspendNode] +- 1 [AttributeCollectorNode] Nodes (5): -- [5e2a7c95-94af-4b23-8724-deb13853726a] PageNode - Page Node -- [b93ce36e-1976-4610-b24f-8d6760b5463b] InnerTreeEvaluatorNode - Inner Tree Evaluator -- [bf9ea8d5-9802-4f26-9664-a21840faac23] IdentifyExistingUserNode - Identify Existing User -- [d9a79f01-2ce3-4be2-a28a-975f35c3c8ca] EmailSuspendNode - Email Suspend Node -- [9f1e8d94-4922-481b-9e14-212b66548900] AttributeCollectorNode - Attribute Collector +- [5e2a7c95-94af-4b23-8724-deb13853726a] PageNode - Page Node +- [b93ce36e-1976-4610-b24f-8d6760b5463b] InnerTreeEvaluatorNode - Inner Tree Evaluator +- [bf9ea8d5-9802-4f26-9664-a21840faac23] IdentifyExistingUserNode - Identify Existing User +- [d9a79f01-2ce3-4be2-a28a-975f35c3c8ca] EmailSuspendNode - Email Suspend Node +- [9f1e8d94-4922-481b-9e14-212b66548900] AttributeCollectorNode - Attribute Collector Email Templates (1): -- [forgottenUsername] - Account Information - username -[FrodoTest] +- [forgottenUsername] - Account Information - username +[FrodoTest] Frodo test journey utilizing a variety of nodes and dependencies to test support for complex journeys. @@ -2179,65 +1532,65 @@ Categories/Tags Frodo, Prototype Node Types (9): -- 2 [PageNode] -- 1 [product-Saml2Node] -- 1 [EmailTemplateNode] -- 1 [SocialProviderHandlerNode] -- 1 [ScriptedDecisionNode] -- 1 [IdentityStoreDecisionNode] -- 1 [ValidatedUsernameNode] -- 2 [ValidatedPasswordNode] -- 2 [SelectIdPNode] - +- 2 [PageNode] +- 1 [product-Saml2Node] +- 1 [EmailTemplateNode] +- 1 [SocialProviderHandlerNode] +- 1 [ScriptedDecisionNode] +- 1 [IdentityStoreDecisionNode] +- 1 [ValidatedUsernameNode] +- 2 [ValidatedPasswordNode] +- 2 [SelectIdPNode] + Nodes (12): -- [278bf084-9eea-46fe-8ce9-2600dde3b046] PageNode - Login Page -- [64157fca-bd5b-4405-a4c8-64ffd98a5461] product-Saml2Node - SAML2 Authentication -- [731c5810-020b-45c8-a7fc-3c21903ae2b3] PageNode - Login Page -- [bf153f37-83dd-4f39-aa0c-74135430242e] EmailTemplateNode - Email Template Node -- [d5cc2d52-6ce4-452d-85ea-3a5b50218b67] SocialProviderHandlerNode - Social Login -- [e2c39477-847a-4df2-9c5d-b449a752638b] ScriptedDecisionNode - Check Username -- [fc7e47cd-c679-4211-8e05-a36654f23c67] IdentityStoreDecisionNode - Validate Creds -- [7a351800-fb7e-4145-903c-388554747556] ValidatedUsernameNode - Username -- [804e6a68-1720-442b-926a-007e90f02782] ValidatedPasswordNode - Password -- [228a44d5-fd78-4278-8999-fdd470ea7ebf] SelectIdPNode - Select IDP -- [dd16c8d4-baca-4ae0-bcd8-fb98b9040524] ValidatedPasswordNode - Password -- [038f9b2a-36b2-489b-9e03-386c9a62ea21] SelectIdPNode - Select IDP +- [278bf084-9eea-46fe-8ce9-2600dde3b046] PageNode - Login Page +- [64157fca-bd5b-4405-a4c8-64ffd98a5461] product-Saml2Node - SAML2 Authentication +- [731c5810-020b-45c8-a7fc-3c21903ae2b3] PageNode - Login Page +- [bf153f37-83dd-4f39-aa0c-74135430242e] EmailTemplateNode - Email Template Node +- [d5cc2d52-6ce4-452d-85ea-3a5b50218b67] SocialProviderHandlerNode - Social Login +- [e2c39477-847a-4df2-9c5d-b449a752638b] ScriptedDecisionNode - Check Username +- [fc7e47cd-c679-4211-8e05-a36654f23c67] IdentityStoreDecisionNode - Validate Creds +- [7a351800-fb7e-4145-903c-388554747556] ValidatedUsernameNode - Username +- [804e6a68-1720-442b-926a-007e90f02782] ValidatedPasswordNode - Password +- [228a44d5-fd78-4278-8999-fdd470ea7ebf] SelectIdPNode - Select IDP +- [dd16c8d4-baca-4ae0-bcd8-fb98b9040524] ValidatedPasswordNode - Password +- [038f9b2a-36b2-489b-9e03-386c9a62ea21] SelectIdPNode - Select IDP Themes (1): -- [63e19668-909f-479e-83d7-be7a01cd8187] NoAccess (FrodoTest, AA-FrodoTest) +- [63e19668-909f-479e-83d7-be7a01cd8187] NoAccess (FrodoTest, AA-FrodoTest) Scripts (9): -- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User -- [739bdc48-fd24-4c52-b353-88706d75558a] AUTHENTICATION_TREE_DECISION_NODE - Check Username -- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization -- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) -- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization -- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization -- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization -- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) -- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization +- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User +- [739bdc48-fd24-4c52-b353-88706d75558a] AUTHENTICATION_TREE_DECISION_NODE - Check Username +- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization +- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) +- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization +- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization +- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization +- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) +- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization Email Templates (1): -- [welcome] Welcome - Your account has been created +- [welcome] Welcome - Your account has been created Social Identity Providers (8): -- [google] googleConfig -- [github] oauth2Config -- [facebook] oauth2Config -- [apple-stoyan] appleConfig -- [apple_web] appleConfig -- [okta-trial-5735851] oidcConfig -- [adfs] oidcConfig -- [azure] microsoftConfig +- [google] googleConfig +- [github] oauth2Config +- [facebook] oauth2Config +- [apple-stoyan] appleConfig +- [apple_web] appleConfig +- [okta-trial-5735851] oidcConfig +- [adfs] oidcConfig +- [azure] microsoftConfig SAML2 Entity Providers (2): -- [iSPAzure] (hosted SP) -- [urn:federation:MicrosoftOnline] (remote SP) +- [iSPAzure] (hosted SP) +- [urn:federation:MicrosoftOnline] (remote SP) SAML2 Circles Of Trust (2): -- [2f04818d-561e-4f8a-82e8-af2426112138] -- [AzureCOT] -[FrodoTestJourney13] +- [2f04818d-561e-4f8a-82e8-af2426112138] +- [AzureCOT] +[FrodoTestJourney13] Frodo test journey using v2.0 nodes @@ -2245,300 +1598,300 @@ Categories/Tags Frodo, Prototype Node Types (4): -- 1 [DataStoreDecisionNode] -- 1 [PageNode] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] +- 1 [DataStoreDecisionNode] +- 1 [PageNode] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] Nodes (4): -- [bdca20b7-ada8-4906-8b3a-e59c313f6491] DataStoreDecisionNode - Validate Credentials -- [c847e93b-afa3-4d20-9a15-f75404ec353c] PageNode - Login Page -- [64dceffc-2db4-468b-96d1-491824e037a2] ValidatedUsernameNode - Username -- [e4c5071f-acc8-47c9-b097-5c4144170742] ValidatedPasswordNode - Password -[j00] +- [bdca20b7-ada8-4906-8b3a-e59c313f6491] DataStoreDecisionNode - Validate Credentials +- [c847e93b-afa3-4d20-9a15-f75404ec353c] PageNode - Login Page +- [64dceffc-2db4-468b-96d1-491824e037a2] ValidatedUsernameNode - Username +- [e4c5071f-acc8-47c9-b097-5c4144170742] ValidatedPasswordNode - Password +[j00] Node Types (1): -- 6 [ScriptedDecisionNode] +- 6 [ScriptedDecisionNode] Nodes (6): -- [01d3785f-7fb4-44a7-9458-72c380a9818f] ScriptedDecisionNode - shared -- [39b48197-f4be-42b9-800a-866587b4b9b5] ScriptedDecisionNode - level -- [3c1e8d61-0c48-44ba-86dc-52e9555b6aeb] ScriptedDecisionNode - level -- [513a2ab4-f0b8-4f94-b840-6fe14796cc84] ScriptedDecisionNode - mode -- [ba503a1e-633e-4d0d-ba18-c9a9b1105b5b] ScriptedDecisionNode - debug -- [d17ffaa1-2c61-4abd-9bb1-2559160d0a5c] ScriptedDecisionNode - shared +- [01d3785f-7fb4-44a7-9458-72c380a9818f] ScriptedDecisionNode - shared +- [39b48197-f4be-42b9-800a-866587b4b9b5] ScriptedDecisionNode - level +- [3c1e8d61-0c48-44ba-86dc-52e9555b6aeb] ScriptedDecisionNode - level +- [513a2ab4-f0b8-4f94-b840-6fe14796cc84] ScriptedDecisionNode - mode +- [ba503a1e-633e-4d0d-ba18-c9a9b1105b5b] ScriptedDecisionNode - debug +- [d17ffaa1-2c61-4abd-9bb1-2559160d0a5c] ScriptedDecisionNode - shared Scripts (4): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [3cb43516-ae69-433a-8787-501d45db14e9] AUTHENTICATION_TREE_DECISION_NODE - debug -[j01] +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [3cb43516-ae69-433a-8787-501d45db14e9] AUTHENTICATION_TREE_DECISION_NODE - debug +[j01] Inner Tree Dependencies (1): -- j01 - - j00 +- j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [6674b4ac-dd89-4e13-9440-6f81194e3a22] ScriptedDecisionNode - shared -- [89ce5d57-82fa-4d58-8d15-0329f7dbd7e7] ScriptedDecisionNode - shared -- [bb1e96af-f316-4eb0-b1c6-36b3f1af9e35] InnerTreeEvaluatorNode - nest -- [bdfbe97c-1ff4-4162-85bc-47f6f14b2c66] ScriptedDecisionNode - level -- [e92d5139-b8a6-43dc-9b13-95ba1d0dc53c] ScriptedDecisionNode - level -- [f129f0df-b49e-453b-97fb-db508e3893ce] ScriptedDecisionNode - mode +- [6674b4ac-dd89-4e13-9440-6f81194e3a22] ScriptedDecisionNode - shared +- [89ce5d57-82fa-4d58-8d15-0329f7dbd7e7] ScriptedDecisionNode - shared +- [bb1e96af-f316-4eb0-b1c6-36b3f1af9e35] InnerTreeEvaluatorNode - nest +- [bdfbe97c-1ff4-4162-85bc-47f6f14b2c66] ScriptedDecisionNode - level +- [e92d5139-b8a6-43dc-9b13-95ba1d0dc53c] ScriptedDecisionNode - level +- [f129f0df-b49e-453b-97fb-db508e3893ce] ScriptedDecisionNode - mode Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j02] +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j02] Inner Tree Dependencies (1): -- j02 - - j01 - - j00 +- j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [2dbd2d37-c659-48cf-8357-c9fc1166e3a7] ScriptedDecisionNode - level -- [4416aff7-3ebd-47e6-9831-c2f6bbe3ae24] ScriptedDecisionNode - level -- [56899fef-92a1-4f2a-ade3-973c81eb3af1] InnerTreeEvaluatorNode - nest -- [59b06306-a886-443d-92df-7a27a60c394e] ScriptedDecisionNode - mode -- [cbb3d506-b267-4b99-9edd-363e90aac997] ScriptedDecisionNode - shared -- [e0983ead-4918-48f6-858d-9aff0f03759c] ScriptedDecisionNode - shared +- [2dbd2d37-c659-48cf-8357-c9fc1166e3a7] ScriptedDecisionNode - level +- [4416aff7-3ebd-47e6-9831-c2f6bbe3ae24] ScriptedDecisionNode - level +- [56899fef-92a1-4f2a-ade3-973c81eb3af1] InnerTreeEvaluatorNode - nest +- [59b06306-a886-443d-92df-7a27a60c394e] ScriptedDecisionNode - mode +- [cbb3d506-b267-4b99-9edd-363e90aac997] ScriptedDecisionNode - shared +- [e0983ead-4918-48f6-858d-9aff0f03759c] ScriptedDecisionNode - shared Scripts (3): -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -[j03] +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +[j03] Inner Tree Dependencies (1): -- j03 - - j02 - - j01 - - j00 +- j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [35a4f94b-c895-46b9-bc0a-93cf59233759] ScriptedDecisionNode - level -- [3a92300d-6d64-451d-8156-30cb51781026] ScriptedDecisionNode - level -- [6f9de973-9ed4-41f5-b43d-4036041e2b96] ScriptedDecisionNode - shared -- [bcb8c535-5ecd-4d3d-b970-26816de96bf2] InnerTreeEvaluatorNode - nest -- [e0cfbd13-6f1e-4924-9d2d-0f7c23507172] ScriptedDecisionNode - mode -- [fae7424e-13c9-45bd-b3a2-045773671a3f] ScriptedDecisionNode - shared +- [35a4f94b-c895-46b9-bc0a-93cf59233759] ScriptedDecisionNode - level +- [3a92300d-6d64-451d-8156-30cb51781026] ScriptedDecisionNode - level +- [6f9de973-9ed4-41f5-b43d-4036041e2b96] ScriptedDecisionNode - shared +- [bcb8c535-5ecd-4d3d-b970-26816de96bf2] InnerTreeEvaluatorNode - nest +- [e0cfbd13-6f1e-4924-9d2d-0f7c23507172] ScriptedDecisionNode - mode +- [fae7424e-13c9-45bd-b3a2-045773671a3f] ScriptedDecisionNode - shared Scripts (3): -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j04] +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j04] Inner Tree Dependencies (1): -- j04 - - j03 - - j02 - - j01 - - j00 +- j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 1 [InnerTreeEvaluatorNode] -- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] Nodes (6): -- [00e75aa0-2f9b-4895-9257-d515286fd64b] InnerTreeEvaluatorNode - nest -- [040b6c89-313b-4664-92e0-6732017384b8] ScriptedDecisionNode - mode -- [69ae8ec1-de43-44ac-98e5-733db80ac176] ScriptedDecisionNode - level -- [9603ef52-30f0-4ddc-b3c0-28dac83c7bdb] ScriptedDecisionNode - shared -- [d10104e9-1f8d-4da6-a110-28d879d13959] ScriptedDecisionNode - level -- [f5c317ce-fabd-4a10-9907-c71cea037844] ScriptedDecisionNode - shared +- [00e75aa0-2f9b-4895-9257-d515286fd64b] InnerTreeEvaluatorNode - nest +- [040b6c89-313b-4664-92e0-6732017384b8] ScriptedDecisionNode - mode +- [69ae8ec1-de43-44ac-98e5-733db80ac176] ScriptedDecisionNode - level +- [9603ef52-30f0-4ddc-b3c0-28dac83c7bdb] ScriptedDecisionNode - shared +- [d10104e9-1f8d-4da6-a110-28d879d13959] ScriptedDecisionNode - level +- [f5c317ce-fabd-4a10-9907-c71cea037844] ScriptedDecisionNode - shared Scripts (3): -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -[j05] +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +[j05] Inner Tree Dependencies (1): -- j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [11f1c31c-50a9-4717-8213-420f6932481f] ScriptedDecisionNode - shared -- [3c106772-ace7-4808-8f3a-9840de8f67f0] ScriptedDecisionNode - level -- [622179cb-98f1-484a-820d-9a0df6e45e95] ScriptedDecisionNode - mode -- [a0782616-84b7-4bf5-87ed-a01fb3018563] ScriptedDecisionNode - shared -- [e90ae257-c279-46e0-9b43-5ecd89784d77] ScriptedDecisionNode - level -- [f17ecb7c-abc3-4523-9943-4cbdd90305cb] InnerTreeEvaluatorNode - nest +- [11f1c31c-50a9-4717-8213-420f6932481f] ScriptedDecisionNode - shared +- [3c106772-ace7-4808-8f3a-9840de8f67f0] ScriptedDecisionNode - level +- [622179cb-98f1-484a-820d-9a0df6e45e95] ScriptedDecisionNode - mode +- [a0782616-84b7-4bf5-87ed-a01fb3018563] ScriptedDecisionNode - shared +- [e90ae257-c279-46e0-9b43-5ecd89784d77] ScriptedDecisionNode - level +- [f17ecb7c-abc3-4523-9943-4cbdd90305cb] InnerTreeEvaluatorNode - nest Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j06] +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j06] Inner Tree Dependencies (1): -- j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [1d59caff-243c-45bd-b7d0-6dcc563989c5] ScriptedDecisionNode - shared -- [2de08e9e-bf7b-4fa1-8265-59a8e4a3f7c3] ScriptedDecisionNode - level -- [409c251f-c23b-411d-9009-d3b3d26d1b90] InnerTreeEvaluatorNode - nest -- [44b8651c-7c1e-41f1-b9a6-2e441b0ce05a] ScriptedDecisionNode - mode -- [da878771-421c-463f-aad7-4d5f2ad5e59a] ScriptedDecisionNode - shared -- [fe8f27df-8a27-4d88-9196-834ce398b2b7] ScriptedDecisionNode - level +- [1d59caff-243c-45bd-b7d0-6dcc563989c5] ScriptedDecisionNode - shared +- [2de08e9e-bf7b-4fa1-8265-59a8e4a3f7c3] ScriptedDecisionNode - level +- [409c251f-c23b-411d-9009-d3b3d26d1b90] InnerTreeEvaluatorNode - nest +- [44b8651c-7c1e-41f1-b9a6-2e441b0ce05a] ScriptedDecisionNode - mode +- [da878771-421c-463f-aad7-4d5f2ad5e59a] ScriptedDecisionNode - shared +- [fe8f27df-8a27-4d88-9196-834ce398b2b7] ScriptedDecisionNode - level Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j07] +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j07] Inner Tree Dependencies (1): -- j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [13b12fe6-cf53-46a4-a83d-0a3c1fda814f] ScriptedDecisionNode - mode -- [ac6ee166-73c0-4f73-b8db-4fe8ff6a25c0] ScriptedDecisionNode - shared -- [d90dd9f8-8b12-4e90-abaf-228ecc0174a7] ScriptedDecisionNode - level -- [d9a06d3a-7e3f-4244-9a32-63ffa0d26e00] ScriptedDecisionNode - shared -- [e62d7a4d-2012-4a2a-a6ef-d6a0e0d552d9] InnerTreeEvaluatorNode - nest -- [f2fe740c-cd75-460a-8baa-fe4b52ecc947] ScriptedDecisionNode - level +- [13b12fe6-cf53-46a4-a83d-0a3c1fda814f] ScriptedDecisionNode - mode +- [ac6ee166-73c0-4f73-b8db-4fe8ff6a25c0] ScriptedDecisionNode - shared +- [d90dd9f8-8b12-4e90-abaf-228ecc0174a7] ScriptedDecisionNode - level +- [d9a06d3a-7e3f-4244-9a32-63ffa0d26e00] ScriptedDecisionNode - shared +- [e62d7a4d-2012-4a2a-a6ef-d6a0e0d552d9] InnerTreeEvaluatorNode - nest +- [f2fe740c-cd75-460a-8baa-fe4b52ecc947] ScriptedDecisionNode - level Scripts (3): -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -[j08] +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +[j08] Inner Tree Dependencies (1): -- j08 - - j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j08 + - j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [042b600b-71cb-45a8-93ae-a6f57b16a6e5] ScriptedDecisionNode - shared -- [66026170-5088-4fcd-a6c8-ed89d7a5c79d] InnerTreeEvaluatorNode - nest -- [8096649e-973e-4209-88ce-e1d87ae2bb96] ScriptedDecisionNode - level -- [87ced99b-bfa5-40d4-ba07-c8fc31f6cc6d] ScriptedDecisionNode - level -- [948e21f4-c512-450a-9d42-e0d629217834] ScriptedDecisionNode - shared -- [d429b2b5-b215-46a5-b239-4994df65cb8b] ScriptedDecisionNode - mode +- [042b600b-71cb-45a8-93ae-a6f57b16a6e5] ScriptedDecisionNode - shared +- [66026170-5088-4fcd-a6c8-ed89d7a5c79d] InnerTreeEvaluatorNode - nest +- [8096649e-973e-4209-88ce-e1d87ae2bb96] ScriptedDecisionNode - level +- [87ced99b-bfa5-40d4-ba07-c8fc31f6cc6d] ScriptedDecisionNode - level +- [948e21f4-c512-450a-9d42-e0d629217834] ScriptedDecisionNode - shared +- [d429b2b5-b215-46a5-b239-4994df65cb8b] ScriptedDecisionNode - mode Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j09] +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j09] Inner Tree Dependencies (1): -- j09 - - j08 - - j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j09 + - j08 + - j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [251f35c3-1a32-4520-be10-1f4af9600935] ScriptedDecisionNode - mode -- [56b82371-0c61-4dc3-8d06-c1158415b8f9] ScriptedDecisionNode - level -- [6df24fdd-0b6c-4def-bf42-77af998f28b8] InnerTreeEvaluatorNode - nest -- [8c5e9cb5-471b-4dd6-b150-ecaaeda98195] ScriptedDecisionNode - shared -- [bb294e05-6b6b-4478-b46f-b8d9e7711c66] ScriptedDecisionNode - level -- [f57cf53c-b4c6-48f7-84e8-91f535a2e8f8] ScriptedDecisionNode - shared +- [251f35c3-1a32-4520-be10-1f4af9600935] ScriptedDecisionNode - mode +- [56b82371-0c61-4dc3-8d06-c1158415b8f9] ScriptedDecisionNode - level +- [6df24fdd-0b6c-4def-bf42-77af998f28b8] InnerTreeEvaluatorNode - nest +- [8c5e9cb5-471b-4dd6-b150-ecaaeda98195] ScriptedDecisionNode - shared +- [bb294e05-6b6b-4478-b46f-b8d9e7711c66] ScriptedDecisionNode - level +- [f57cf53c-b4c6-48f7-84e8-91f535a2e8f8] ScriptedDecisionNode - shared Scripts (3): -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -[j10] +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +[j10] Inner Tree Dependencies (1): -- j10 - - j09 - - j08 - - j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j10 + - j09 + - j08 + - j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [300feda0-3248-49a9-b60f-01df802b2229] ScriptedDecisionNode - level -- [40afb384-e9b6-4dcb-acde-04de109474c8] ScriptedDecisionNode - shared -- [8d7d64ee-da20-461f-a2ca-206b7479dd67] ScriptedDecisionNode - level -- [97ef9d96-99e7-4d2d-b6c6-4177b5397ead] ScriptedDecisionNode - shared -- [c7fcf7ae-1ab5-474b-b5b0-272e10468fbd] InnerTreeEvaluatorNode - nest -- [c91d626e-1156-41bd-b1fb-d292f640fba6] ScriptedDecisionNode - mode +- [300feda0-3248-49a9-b60f-01df802b2229] ScriptedDecisionNode - level +- [40afb384-e9b6-4dcb-acde-04de109474c8] ScriptedDecisionNode - shared +- [8d7d64ee-da20-461f-a2ca-206b7479dd67] ScriptedDecisionNode - level +- [97ef9d96-99e7-4d2d-b6c6-4177b5397ead] ScriptedDecisionNode - shared +- [c7fcf7ae-1ab5-474b-b5b0-272e10468fbd] InnerTreeEvaluatorNode - nest +- [c91d626e-1156-41bd-b1fb-d292f640fba6] ScriptedDecisionNode - mode Scripts (3): -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[Login] +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[Login] Platform Login Tree @@ -2546,38 +1899,685 @@ Categories/Tags Authentication Inner Tree Dependencies (1): -- Login - - ProgressiveProfile +- Login + - ProgressiveProfile Node Types (8): -- 1 [RetryLimitDecisionNode] -- 1 [InnerTreeEvaluatorNode] -- 1 [AccountLockoutNode] -- 1 [IdentityStoreDecisionNode] -- 1 [PageNode] -- 1 [IncrementLoginCountNode] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] - -Nodes (8): -- [2119f332-0f69-4088-a7a1-6582bf0f2001] RetryLimitDecisionNode - Retry Limit Decision -- [33b24514-3e50-4180-8f08-ab6f4e51b07e] InnerTreeEvaluatorNode - Inner Tree Evaluator -- [51e8c4c1-3509-4635-90e6-d2cc31c4a6a5] AccountLockoutNode - Account Lockout -- [7f0c2aee-8c74-4d02-82a6-9d4ed9d11708] IdentityStoreDecisionNode - Identity Store Decision -- [a12bc72f-ad97-4f1e-a789-a1fa3dd566c8] PageNode - Page Node -- [bba3e0d8-8525-4e82-bf48-ac17f7988917] IncrementLoginCountNode - Increment Login Count -- [7354982f-57b6-4b04-9ddc-f1dd1e1e07d0] ValidatedUsernameNode - Platform Username -- [0c80c39b-4813-4e67-b4fb-5a0bba85f994] ValidatedPasswordNode - Platform Password -[OrphanedTest] +- 1 [RetryLimitDecisionNode] +- 1 [InnerTreeEvaluatorNode] +- 1 [AccountLockoutNode] +- 1 [IdentityStoreDecisionNode] +- 1 [PageNode] +- 1 [IncrementLoginCountNode] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] + +Nodes (8): +- [2119f332-0f69-4088-a7a1-6582bf0f2001] RetryLimitDecisionNode - Retry Limit Decision +- [33b24514-3e50-4180-8f08-ab6f4e51b07e] InnerTreeEvaluatorNode - Inner Tree Evaluator +- [51e8c4c1-3509-4635-90e6-d2cc31c4a6a5] AccountLockoutNode - Account Lockout +- [7f0c2aee-8c74-4d02-82a6-9d4ed9d11708] IdentityStoreDecisionNode - Identity Store Decision +- [a12bc72f-ad97-4f1e-a789-a1fa3dd566c8] PageNode - Page Node +- [bba3e0d8-8525-4e82-bf48-ac17f7988917] IncrementLoginCountNode - Increment Login Count +- [7354982f-57b6-4b04-9ddc-f1dd1e1e07d0] ValidatedUsernameNode - Platform Username +- [0c80c39b-4813-4e67-b4fb-5a0bba85f994] ValidatedPasswordNode - Platform Password +[OrphanedTest] + +Test orphaned nodes + +Node Types (1): +- 1 [IdentityStoreDecisionNode] + +Nodes (1): +- [343e745f-923a-43c4-8675-649a490fd0a3] IdentityStoreDecisionNode - Identity Store Decision +[P1P-Test] + +PingOne Protect Login Risk + +Categories/Tags +Helper, P1 Protect + +Node Types (8): +- 7 [PageNode] +- 2 [product-PingOneProtectResultNode] +- 1 [product-PingOneProtectInitializeNode] +- 1 [product-PingOneProtectEvaluationNode] +- 1 [IdentityStoreDecisionNode] +- 6 [designer-4b76e2122a0541498f380072cd115683] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] + +Nodes (20): +- [00a4835b-6e99-4938-9bb8-50d5569a68d4] PageNode - Low +- [084c3d2d-7d47-4f2e-81d1-57961d496939] PageNode - High +- [167b87dd-a97c-4e3b-82ba-581090fd7863] product-PingOneProtectResultNode - SUCCESS +- [37f190ea-fa18-4d44-941b-4e5ac325f394] PageNode - Medium +- [4fdf4255-0236-4527-ae6d-d10d2c0ee8d5] PageNode - Login Page +- [6632fe0f-6395-4cc1-88d8-c9ca4a9061b6] product-PingOneProtectInitializeNode - Initialize Signals SDK +- [8120e613-dee8-42b4-9668-71b8a25c1c92] PageNode - P1P Failure +- [a0059e3b-de04-4f0f-a5ed-49525d1da576] PageNode - P1P Client Error +- [df827cfc-6e2d-4b9f-a8b1-d92c2910eb07] product-PingOneProtectEvaluationNode - P1P Risk Decision +- [e5f7bd1f-8dbb-4fb2-ae54-1e09047e8ece] product-PingOneProtectResultNode - FAILED +- [ef1929b1-255e-446e-a597-7d7a3c4bf63f] IdentityStoreDecisionNode - Identity Store Decision +- [f1cb199e-9e9a-4761-bacf-bc717ca6c540] PageNode - Exceeds Score Threshold +- [843dd22b-a890-461b-9a16-33d8bd871396] designer-4b76e2122a0541498f380072cd115683 - Debug +- [2c8f0d12-c373-4a25-9a30-b3184888d163] designer-4b76e2122a0541498f380072cd115683 - Debug +- [8835fe59-3988-4121-8b15-ad16a7049d7a] designer-4b76e2122a0541498f380072cd115683 - Debug +- [f74e82e2-72ab-4a1a-9188-655622794a37] ValidatedUsernameNode - Username +- [6a428d9f-a221-44f6-a5c6-c6981f90f9fc] ValidatedPasswordNode - Password +- [52ab689c-491b-4117-b729-ff590b5d1f61] designer-4b76e2122a0541498f380072cd115683 - Debug +- [c1804982-10dc-4668-bd53-909107cc4039] designer-4b76e2122a0541498f380072cd115683 - Debug +- [de8fa10c-f4cc-44b7-b675-cdc75dcc600f] designer-4b76e2122a0541498f380072cd115683 - Debug +[PrestonTest] + +Test journey with a script that no longer exists, to fix a journey export issue. +[ProgressiveProfile] + +Prompt for missing preferences on 3rd login + +Categories/Tags +Progressive Profile + +Node Types (5): +- 1 [PatchObjectNode] +- 1 [LoginCountDecisionNode] +- 1 [QueryFilterDecisionNode] +- 1 [PageNode] +- 1 [AttributeCollectorNode] + +Nodes (5): +- [423a959a-a1b9-498a-b0f7-596b6b6e775a] PatchObjectNode - Patch Object +- [8afdaec3-275e-4301-bb53-34f03e6a4b29] LoginCountDecisionNode - Login Count Decision +- [a1f45b44-5bf7-4c57-aa3f-75c619c7db8e] QueryFilterDecisionNode - Query Filter Decision +- [a5aecad8-854a-4ed5-b719-ff6c90e858c0] PageNode - Page Node +- [0a042e10-b22e-4e02-86c4-65e26e775f7a] AttributeCollectorNode - Attribute Collector +[RadioChoice] + +Node Types (2): +- 1 [PageNode] +- 1 [ChoiceCollectorNode] + +Nodes (2): +- [5d6cd20e-5074-43de-8832-fddd95fb078e] PageNode - Page Node +- [a566e474-99f3-46e4-9e70-682402bfaa84] ChoiceCollectorNode - Choice Collector +[Registration] + +Platform Registration Tree + +Categories/Tags +Registration + +Node Types (9): +- 1 [PageNode] +- 1 [EmailSuspendNode] +- 1 [IncrementLoginCountNode] +- 1 [CreateObjectNode] +- 1 [ValidatedUsernameNode] +- 1 [AttributeCollectorNode] +- 1 [ValidatedPasswordNode] +- 1 [KbaCreateNode] +- 1 [AcceptTermsAndConditionsNode] + +Nodes (9): +- [0c091c49-f3af-48fb-ac6f-07fba0499dd6] PageNode - Page Node +- [466f8b54-07fb-4e31-a11d-a6842618cc37] EmailSuspendNode - Email Suspend Node +- [97a15eb2-a015-4b6d-81a0-be78c3aa1a3b] IncrementLoginCountNode - Increment Login Count +- [ad5dcbb3-7335-49b7-b3e7-7d850bb88237] CreateObjectNode - Create Object +- [7fcaf48e-a754-4959-858b-05b2933b825f] ValidatedUsernameNode - Platform Username +- [d3ce2036-1523-4ce8-b1a2-895a2a036667] AttributeCollectorNode - Attribute Collector +- [3d8709a1-f09f-4d1f-8094-2850e472c1db] ValidatedPasswordNode - Platform Password +- [120c69d3-90b4-4ad4-b7af-380e8b119340] KbaCreateNode - KBA Definition +- [b4a0e915-c15d-4b83-9c9d-18347d645976] AcceptTermsAndConditionsNode - Accept Terms and Conditions + +Email Templates (1): +- [registration] - Register new account +[ResetPassword] + +Reset Password Tree + +Categories/Tags +Password Reset + +Node Types (6): +- 1 [EmailSuspendNode] +- 1 [IdentifyExistingUserNode] +- 1 [PatchObjectNode] +- 2 [PageNode] +- 1 [AttributeCollectorNode] +- 1 [ValidatedPasswordNode] + +Nodes (7): +- [06c97be5-7fdd-4739-aea1-ecc7fe082865] EmailSuspendNode - Email Suspend Node +- [21b8ddf3-0203-4ae1-ab05-51cf3a3a707a] IdentifyExistingUserNode - Identify Existing User +- [989f0bf8-a328-4217-b82b-5275d79ca8bd] PatchObjectNode - Patch Object +- [cc3e1ed2-25f1-47bf-83c6-17084f8b2b2b] PageNode - Page Node +- [e4c752f9-c625-48c9-9644-a58802fa9e9c] PageNode - Page Node +- [276afa7c-a680-4cf4-a5f6-d6c78191f5c9] AttributeCollectorNode - Attribute Collector +- [009c19c8-9572-47bb-adb2-1f092c559a43] ValidatedPasswordNode - Platform Password + +Email Templates (1): +- [resetPassword] - Reset your password +[SocialProviderHandler] + +Node Types (2): +- 1 [SocialProviderHandlerNode] +- 1 [SocialProviderHandlerNodeV2] + +Nodes (2): +- [3af612be-340e-4dc9-80fb-62319a187b74] SocialProviderHandlerNode - Legacy Social Provider Handler Node +- [e15c8efe-b7a7-42bf-845e-861a9419af32] SocialProviderHandlerNodeV2 - Social Provider Handler Node + +Scripts (9): +- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User +- [ed685f9f-5909-4726-86e8-22bd38b47663] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Identity +- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization +- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) +- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization +- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization +- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization +- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) +- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization + +Social Identity Providers (8): +- [google] googleConfig +- [github] oauth2Config +- [facebook] oauth2Config +- [apple-stoyan] appleConfig +- [apple_web] appleConfig +- [okta-trial-5735851] oidcConfig +- [adfs] oidcConfig +- [azure] microsoftConfig +[test] +[UpdatePassword] + +Update password using active session + +Categories/Tags +Password Reset + +Node Types (7): +- 1 [AttributePresentDecisionNode] +- 2 [PageNode] +- 1 [PatchObjectNode] +- 1 [DataStoreDecisionNode] +- 1 [EmailSuspendNode] +- 1 [SessionDataNode] +- 2 [ValidatedPasswordNode] + +Nodes (9): +- [0f0904e6-1da3-4cdb-9abf-0d2545016fab] AttributePresentDecisionNode - Attribute Present Decision +- [20237b34-26cb-4a0b-958f-abb422290d42] PageNode - Page Node +- [3990ce1f-cce6-435b-ae1c-f138e89411c1] PatchObjectNode - Patch Object +- [7d1deabe-cd98-49c8-943f-ca12305775f3] DataStoreDecisionNode - Data Store Decision +- [a3d97b53-e38a-4b24-aed0-a021050eb744] EmailSuspendNode - Email Suspend Node +- [d018fcd1-4e22-4160-8c41-63bee51c9cb3] PageNode - Page Node +- [d1b79744-493a-44fe-bc26-7d324a8caa4e] SessionDataNode - Get Session Data +- [fe2962fc-4db3-4066-8624-553649afc438] ValidatedPasswordNode - Platform Password +- [21a99653-a7a7-47ee-b650-f493a84bba09] ValidatedPasswordNode - Platform Password + +Email Templates (1): +- [updatePassword] - Update your password +" +`; + +exports[`frodo journey describe "frodo journey describe -F test1.json": should describe all journeys and write output to test1.json file 1`] = `""`; + +exports[`frodo journey describe "frodo journey describe -F test1.json": should describe all journeys and write output to test1.json file 2`] = ` +"[Agent] + +CAUTION: PingAM Agent and PingGateway profiles require an Agent journey. Don't change this configuration. + +Categories/Tags +Authentication + +Node Types (5): +- 1 [ZeroPageLoginNode] +- 1 [AgentDataStoreDecisionNode] +- 1 [PageNode] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] + +Nodes (5): +- [51e2cd24-cf1f-4313-8af0-35ea9e04d2fe] ZeroPageLoginNode - Zero Page Login Collector +- [6736a00a-fc65-438e-b4ea-23f66b4a8739] AgentDataStoreDecisionNode - Agent Data Store Decision +- [cbd1f1af-eb0a-4274-a762-adacf04c7080] PageNode - Page Node +- [2eaad2f9-5c4b-405f-bf3f-1e99bdc0d018] ValidatedUsernameNode - Platform Username +- [6072842f-5f7c-4b62-8ae2-4f18a5701ba4] ValidatedPasswordNode - Platform Password +[ForgottenUsername] + +Forgotten Username Tree + +Categories/Tags +Username Reset + +Inner Tree Dependencies (1): +- ForgottenUsername + - Login + - ProgressiveProfile + +Node Types (5): +- 1 [PageNode] +- 1 [InnerTreeEvaluatorNode] +- 1 [IdentifyExistingUserNode] +- 1 [EmailSuspendNode] +- 1 [AttributeCollectorNode] + +Nodes (5): +- [5e2a7c95-94af-4b23-8724-deb13853726a] PageNode - Page Node +- [b93ce36e-1976-4610-b24f-8d6760b5463b] InnerTreeEvaluatorNode - Inner Tree Evaluator +- [bf9ea8d5-9802-4f26-9664-a21840faac23] IdentifyExistingUserNode - Identify Existing User +- [d9a79f01-2ce3-4be2-a28a-975f35c3c8ca] EmailSuspendNode - Email Suspend Node +- [9f1e8d94-4922-481b-9e14-212b66548900] AttributeCollectorNode - Attribute Collector + +Email Templates (1): +- [forgottenUsername] - Account Information - username +[FrodoTest] + +Frodo test journey utilizing a variety of nodes and dependencies to test support for complex journeys. + +Categories/Tags +Frodo, Prototype + +Node Types (9): +- 2 [PageNode] +- 1 [product-Saml2Node] +- 1 [EmailTemplateNode] +- 1 [SocialProviderHandlerNode] +- 1 [ScriptedDecisionNode] +- 1 [IdentityStoreDecisionNode] +- 1 [ValidatedUsernameNode] +- 2 [ValidatedPasswordNode] +- 2 [SelectIdPNode] + +Nodes (12): +- [278bf084-9eea-46fe-8ce9-2600dde3b046] PageNode - Login Page +- [64157fca-bd5b-4405-a4c8-64ffd98a5461] product-Saml2Node - SAML2 Authentication +- [731c5810-020b-45c8-a7fc-3c21903ae2b3] PageNode - Login Page +- [bf153f37-83dd-4f39-aa0c-74135430242e] EmailTemplateNode - Email Template Node +- [d5cc2d52-6ce4-452d-85ea-3a5b50218b67] SocialProviderHandlerNode - Social Login +- [e2c39477-847a-4df2-9c5d-b449a752638b] ScriptedDecisionNode - Check Username +- [fc7e47cd-c679-4211-8e05-a36654f23c67] IdentityStoreDecisionNode - Validate Creds +- [7a351800-fb7e-4145-903c-388554747556] ValidatedUsernameNode - Username +- [804e6a68-1720-442b-926a-007e90f02782] ValidatedPasswordNode - Password +- [228a44d5-fd78-4278-8999-fdd470ea7ebf] SelectIdPNode - Select IDP +- [dd16c8d4-baca-4ae0-bcd8-fb98b9040524] ValidatedPasswordNode - Password +- [038f9b2a-36b2-489b-9e03-386c9a62ea21] SelectIdPNode - Select IDP + +Themes (1): +- [63e19668-909f-479e-83d7-be7a01cd8187] NoAccess (FrodoTest, AA-FrodoTest) + +Scripts (9): +- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User +- [739bdc48-fd24-4c52-b353-88706d75558a] AUTHENTICATION_TREE_DECISION_NODE - Check Username +- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization +- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) +- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization +- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization +- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization +- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) +- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization + +Email Templates (1): +- [welcome] Welcome - Your account has been created + +Social Identity Providers (8): +- [google] googleConfig +- [github] oauth2Config +- [facebook] oauth2Config +- [apple-stoyan] appleConfig +- [apple_web] appleConfig +- [okta-trial-5735851] oidcConfig +- [adfs] oidcConfig +- [azure] microsoftConfig + +SAML2 Entity Providers (2): +- [iSPAzure] (hosted SP) +- [urn:federation:MicrosoftOnline] (remote SP) + +SAML2 Circles Of Trust (2): +- [2f04818d-561e-4f8a-82e8-af2426112138] +- [AzureCOT] +[FrodoTestJourney13] + +Frodo test journey using v2.0 nodes + +Categories/Tags +Frodo, Prototype + +Node Types (4): +- 1 [DataStoreDecisionNode] +- 1 [PageNode] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] + +Nodes (4): +- [bdca20b7-ada8-4906-8b3a-e59c313f6491] DataStoreDecisionNode - Validate Credentials +- [c847e93b-afa3-4d20-9a15-f75404ec353c] PageNode - Login Page +- [64dceffc-2db4-468b-96d1-491824e037a2] ValidatedUsernameNode - Username +- [e4c5071f-acc8-47c9-b097-5c4144170742] ValidatedPasswordNode - Password +[j00] + +Node Types (1): +- 6 [ScriptedDecisionNode] + +Nodes (6): +- [01d3785f-7fb4-44a7-9458-72c380a9818f] ScriptedDecisionNode - shared +- [39b48197-f4be-42b9-800a-866587b4b9b5] ScriptedDecisionNode - level +- [3c1e8d61-0c48-44ba-86dc-52e9555b6aeb] ScriptedDecisionNode - level +- [513a2ab4-f0b8-4f94-b840-6fe14796cc84] ScriptedDecisionNode - mode +- [ba503a1e-633e-4d0d-ba18-c9a9b1105b5b] ScriptedDecisionNode - debug +- [d17ffaa1-2c61-4abd-9bb1-2559160d0a5c] ScriptedDecisionNode - shared + +Scripts (4): +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [3cb43516-ae69-433a-8787-501d45db14e9] AUTHENTICATION_TREE_DECISION_NODE - debug +[j01] + +Inner Tree Dependencies (1): +- j01 + - j00 + +Node Types (2): +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] + +Nodes (6): +- [6674b4ac-dd89-4e13-9440-6f81194e3a22] ScriptedDecisionNode - shared +- [89ce5d57-82fa-4d58-8d15-0329f7dbd7e7] ScriptedDecisionNode - shared +- [bb1e96af-f316-4eb0-b1c6-36b3f1af9e35] InnerTreeEvaluatorNode - nest +- [bdfbe97c-1ff4-4162-85bc-47f6f14b2c66] ScriptedDecisionNode - level +- [e92d5139-b8a6-43dc-9b13-95ba1d0dc53c] ScriptedDecisionNode - level +- [f129f0df-b49e-453b-97fb-db508e3893ce] ScriptedDecisionNode - mode + +Scripts (3): +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j02] + +Inner Tree Dependencies (1): +- j02 + - j01 + - j00 + +Node Types (2): +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] + +Nodes (6): +- [2dbd2d37-c659-48cf-8357-c9fc1166e3a7] ScriptedDecisionNode - level +- [4416aff7-3ebd-47e6-9831-c2f6bbe3ae24] ScriptedDecisionNode - level +- [56899fef-92a1-4f2a-ade3-973c81eb3af1] InnerTreeEvaluatorNode - nest +- [59b06306-a886-443d-92df-7a27a60c394e] ScriptedDecisionNode - mode +- [cbb3d506-b267-4b99-9edd-363e90aac997] ScriptedDecisionNode - shared +- [e0983ead-4918-48f6-858d-9aff0f03759c] ScriptedDecisionNode - shared + +Scripts (3): +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +[j03] + +Inner Tree Dependencies (1): +- j03 + - j02 + - j01 + - j00 + +Node Types (2): +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] + +Nodes (6): +- [35a4f94b-c895-46b9-bc0a-93cf59233759] ScriptedDecisionNode - level +- [3a92300d-6d64-451d-8156-30cb51781026] ScriptedDecisionNode - level +- [6f9de973-9ed4-41f5-b43d-4036041e2b96] ScriptedDecisionNode - shared +- [bcb8c535-5ecd-4d3d-b970-26816de96bf2] InnerTreeEvaluatorNode - nest +- [e0cfbd13-6f1e-4924-9d2d-0f7c23507172] ScriptedDecisionNode - mode +- [fae7424e-13c9-45bd-b3a2-045773671a3f] ScriptedDecisionNode - shared + +Scripts (3): +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j04] + +Inner Tree Dependencies (1): +- j04 + - j03 + - j02 + - j01 + - j00 + +Node Types (2): +- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] + +Nodes (6): +- [00e75aa0-2f9b-4895-9257-d515286fd64b] InnerTreeEvaluatorNode - nest +- [040b6c89-313b-4664-92e0-6732017384b8] ScriptedDecisionNode - mode +- [69ae8ec1-de43-44ac-98e5-733db80ac176] ScriptedDecisionNode - level +- [9603ef52-30f0-4ddc-b3c0-28dac83c7bdb] ScriptedDecisionNode - shared +- [d10104e9-1f8d-4da6-a110-28d879d13959] ScriptedDecisionNode - level +- [f5c317ce-fabd-4a10-9907-c71cea037844] ScriptedDecisionNode - shared + +Scripts (3): +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +[j05] + +Inner Tree Dependencies (1): +- j05 + - j04 + - j03 + - j02 + - j01 + - j00 + +Node Types (2): +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] + +Nodes (6): +- [11f1c31c-50a9-4717-8213-420f6932481f] ScriptedDecisionNode - shared +- [3c106772-ace7-4808-8f3a-9840de8f67f0] ScriptedDecisionNode - level +- [622179cb-98f1-484a-820d-9a0df6e45e95] ScriptedDecisionNode - mode +- [a0782616-84b7-4bf5-87ed-a01fb3018563] ScriptedDecisionNode - shared +- [e90ae257-c279-46e0-9b43-5ecd89784d77] ScriptedDecisionNode - level +- [f17ecb7c-abc3-4523-9943-4cbdd90305cb] InnerTreeEvaluatorNode - nest + +Scripts (3): +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j06] + +Inner Tree Dependencies (1): +- j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 + +Node Types (2): +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] + +Nodes (6): +- [1d59caff-243c-45bd-b7d0-6dcc563989c5] ScriptedDecisionNode - shared +- [2de08e9e-bf7b-4fa1-8265-59a8e4a3f7c3] ScriptedDecisionNode - level +- [409c251f-c23b-411d-9009-d3b3d26d1b90] InnerTreeEvaluatorNode - nest +- [44b8651c-7c1e-41f1-b9a6-2e441b0ce05a] ScriptedDecisionNode - mode +- [da878771-421c-463f-aad7-4d5f2ad5e59a] ScriptedDecisionNode - shared +- [fe8f27df-8a27-4d88-9196-834ce398b2b7] ScriptedDecisionNode - level + +Scripts (3): +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j07] + +Inner Tree Dependencies (1): +- j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 + +Node Types (2): +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] + +Nodes (6): +- [13b12fe6-cf53-46a4-a83d-0a3c1fda814f] ScriptedDecisionNode - mode +- [ac6ee166-73c0-4f73-b8db-4fe8ff6a25c0] ScriptedDecisionNode - shared +- [d90dd9f8-8b12-4e90-abaf-228ecc0174a7] ScriptedDecisionNode - level +- [d9a06d3a-7e3f-4244-9a32-63ffa0d26e00] ScriptedDecisionNode - shared +- [e62d7a4d-2012-4a2a-a6ef-d6a0e0d552d9] InnerTreeEvaluatorNode - nest +- [f2fe740c-cd75-460a-8baa-fe4b52ecc947] ScriptedDecisionNode - level + +Scripts (3): +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +[j08] + +Inner Tree Dependencies (1): +- j08 + - j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 + +Node Types (2): +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] + +Nodes (6): +- [042b600b-71cb-45a8-93ae-a6f57b16a6e5] ScriptedDecisionNode - shared +- [66026170-5088-4fcd-a6c8-ed89d7a5c79d] InnerTreeEvaluatorNode - nest +- [8096649e-973e-4209-88ce-e1d87ae2bb96] ScriptedDecisionNode - level +- [87ced99b-bfa5-40d4-ba07-c8fc31f6cc6d] ScriptedDecisionNode - level +- [948e21f4-c512-450a-9d42-e0d629217834] ScriptedDecisionNode - shared +- [d429b2b5-b215-46a5-b239-4994df65cb8b] ScriptedDecisionNode - mode + +Scripts (3): +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j09] + +Inner Tree Dependencies (1): +- j09 + - j08 + - j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 + +Node Types (2): +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] + +Nodes (6): +- [251f35c3-1a32-4520-be10-1f4af9600935] ScriptedDecisionNode - mode +- [56b82371-0c61-4dc3-8d06-c1158415b8f9] ScriptedDecisionNode - level +- [6df24fdd-0b6c-4def-bf42-77af998f28b8] InnerTreeEvaluatorNode - nest +- [8c5e9cb5-471b-4dd6-b150-ecaaeda98195] ScriptedDecisionNode - shared +- [bb294e05-6b6b-4478-b46f-b8d9e7711c66] ScriptedDecisionNode - level +- [f57cf53c-b4c6-48f7-84e8-91f535a2e8f8] ScriptedDecisionNode - shared + +Scripts (3): +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +[j10] + +Inner Tree Dependencies (1): +- j10 + - j09 + - j08 + - j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 + +Node Types (2): +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] + +Nodes (6): +- [300feda0-3248-49a9-b60f-01df802b2229] ScriptedDecisionNode - level +- [40afb384-e9b6-4dcb-acde-04de109474c8] ScriptedDecisionNode - shared +- [8d7d64ee-da20-461f-a2ca-206b7479dd67] ScriptedDecisionNode - level +- [97ef9d96-99e7-4d2d-b6c6-4177b5397ead] ScriptedDecisionNode - shared +- [c7fcf7ae-1ab5-474b-b5b0-272e10468fbd] InnerTreeEvaluatorNode - nest +- [c91d626e-1156-41bd-b1fb-d292f640fba6] ScriptedDecisionNode - mode + +Scripts (3): +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[Login] + +Platform Login Tree + +Categories/Tags +Authentication + +Inner Tree Dependencies (1): +- Login + - ProgressiveProfile + +Node Types (8): +- 1 [RetryLimitDecisionNode] +- 1 [InnerTreeEvaluatorNode] +- 1 [AccountLockoutNode] +- 1 [IdentityStoreDecisionNode] +- 1 [PageNode] +- 1 [IncrementLoginCountNode] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] + +Nodes (8): +- [2119f332-0f69-4088-a7a1-6582bf0f2001] RetryLimitDecisionNode - Retry Limit Decision +- [33b24514-3e50-4180-8f08-ab6f4e51b07e] InnerTreeEvaluatorNode - Inner Tree Evaluator +- [51e8c4c1-3509-4635-90e6-d2cc31c4a6a5] AccountLockoutNode - Account Lockout +- [7f0c2aee-8c74-4d02-82a6-9d4ed9d11708] IdentityStoreDecisionNode - Identity Store Decision +- [a12bc72f-ad97-4f1e-a789-a1fa3dd566c8] PageNode - Page Node +- [bba3e0d8-8525-4e82-bf48-ac17f7988917] IncrementLoginCountNode - Increment Login Count +- [7354982f-57b6-4b04-9ddc-f1dd1e1e07d0] ValidatedUsernameNode - Platform Username +- [0c80c39b-4813-4e67-b4fb-5a0bba85f994] ValidatedPasswordNode - Platform Password +[OrphanedTest] Test orphaned nodes Node Types (1): -- 1 [IdentityStoreDecisionNode] +- 1 [IdentityStoreDecisionNode] Nodes (1): -- [343e745f-923a-43c4-8675-649a490fd0a3] IdentityStoreDecisionNode - Identity Store Decision -[P1P-Test] +- [343e745f-923a-43c4-8675-649a490fd0a3] IdentityStoreDecisionNode - Identity Store Decision +[P1P-Test] PingOne Protect Login Risk @@ -2585,40 +2585,40 @@ Categories/Tags Helper, P1 Protect Node Types (8): -- 7 [PageNode] -- 2 [product-PingOneProtectResultNode] -- 1 [product-PingOneProtectInitializeNode] -- 1 [product-PingOneProtectEvaluationNode] -- 1 [IdentityStoreDecisionNode] -- 6 [designer-4b76e2122a0541498f380072cd115683] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] +- 7 [PageNode] +- 2 [product-PingOneProtectResultNode] +- 1 [product-PingOneProtectInitializeNode] +- 1 [product-PingOneProtectEvaluationNode] +- 1 [IdentityStoreDecisionNode] +- 6 [designer-4b76e2122a0541498f380072cd115683] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] Nodes (20): -- [00a4835b-6e99-4938-9bb8-50d5569a68d4] PageNode - Low -- [084c3d2d-7d47-4f2e-81d1-57961d496939] PageNode - High -- [167b87dd-a97c-4e3b-82ba-581090fd7863] product-PingOneProtectResultNode - SUCCESS -- [37f190ea-fa18-4d44-941b-4e5ac325f394] PageNode - Medium -- [4fdf4255-0236-4527-ae6d-d10d2c0ee8d5] PageNode - Login Page -- [6632fe0f-6395-4cc1-88d8-c9ca4a9061b6] product-PingOneProtectInitializeNode - Initialize Signals SDK -- [8120e613-dee8-42b4-9668-71b8a25c1c92] PageNode - P1P Failure -- [a0059e3b-de04-4f0f-a5ed-49525d1da576] PageNode - P1P Client Error -- [df827cfc-6e2d-4b9f-a8b1-d92c2910eb07] product-PingOneProtectEvaluationNode - P1P Risk Decision -- [e5f7bd1f-8dbb-4fb2-ae54-1e09047e8ece] product-PingOneProtectResultNode - FAILED -- [ef1929b1-255e-446e-a597-7d7a3c4bf63f] IdentityStoreDecisionNode - Identity Store Decision -- [f1cb199e-9e9a-4761-bacf-bc717ca6c540] PageNode - Exceeds Score Threshold -- [843dd22b-a890-461b-9a16-33d8bd871396] designer-4b76e2122a0541498f380072cd115683 - Debug -- [2c8f0d12-c373-4a25-9a30-b3184888d163] designer-4b76e2122a0541498f380072cd115683 - Debug -- [8835fe59-3988-4121-8b15-ad16a7049d7a] designer-4b76e2122a0541498f380072cd115683 - Debug -- [f74e82e2-72ab-4a1a-9188-655622794a37] ValidatedUsernameNode - Username -- [6a428d9f-a221-44f6-a5c6-c6981f90f9fc] ValidatedPasswordNode - Password -- [52ab689c-491b-4117-b729-ff590b5d1f61] designer-4b76e2122a0541498f380072cd115683 - Debug -- [c1804982-10dc-4668-bd53-909107cc4039] designer-4b76e2122a0541498f380072cd115683 - Debug -- [de8fa10c-f4cc-44b7-b675-cdc75dcc600f] designer-4b76e2122a0541498f380072cd115683 - Debug -[PrestonTest] +- [00a4835b-6e99-4938-9bb8-50d5569a68d4] PageNode - Low +- [084c3d2d-7d47-4f2e-81d1-57961d496939] PageNode - High +- [167b87dd-a97c-4e3b-82ba-581090fd7863] product-PingOneProtectResultNode - SUCCESS +- [37f190ea-fa18-4d44-941b-4e5ac325f394] PageNode - Medium +- [4fdf4255-0236-4527-ae6d-d10d2c0ee8d5] PageNode - Login Page +- [6632fe0f-6395-4cc1-88d8-c9ca4a9061b6] product-PingOneProtectInitializeNode - Initialize Signals SDK +- [8120e613-dee8-42b4-9668-71b8a25c1c92] PageNode - P1P Failure +- [a0059e3b-de04-4f0f-a5ed-49525d1da576] PageNode - P1P Client Error +- [df827cfc-6e2d-4b9f-a8b1-d92c2910eb07] product-PingOneProtectEvaluationNode - P1P Risk Decision +- [e5f7bd1f-8dbb-4fb2-ae54-1e09047e8ece] product-PingOneProtectResultNode - FAILED +- [ef1929b1-255e-446e-a597-7d7a3c4bf63f] IdentityStoreDecisionNode - Identity Store Decision +- [f1cb199e-9e9a-4761-bacf-bc717ca6c540] PageNode - Exceeds Score Threshold +- [843dd22b-a890-461b-9a16-33d8bd871396] designer-4b76e2122a0541498f380072cd115683 - Debug +- [2c8f0d12-c373-4a25-9a30-b3184888d163] designer-4b76e2122a0541498f380072cd115683 - Debug +- [8835fe59-3988-4121-8b15-ad16a7049d7a] designer-4b76e2122a0541498f380072cd115683 - Debug +- [f74e82e2-72ab-4a1a-9188-655622794a37] ValidatedUsernameNode - Username +- [6a428d9f-a221-44f6-a5c6-c6981f90f9fc] ValidatedPasswordNode - Password +- [52ab689c-491b-4117-b729-ff590b5d1f61] designer-4b76e2122a0541498f380072cd115683 - Debug +- [c1804982-10dc-4668-bd53-909107cc4039] designer-4b76e2122a0541498f380072cd115683 - Debug +- [de8fa10c-f4cc-44b7-b675-cdc75dcc600f] designer-4b76e2122a0541498f380072cd115683 - Debug +[PrestonTest] Test journey with a script that no longer exists, to fix a journey export issue. -[ProgressiveProfile] +[ProgressiveProfile] Prompt for missing preferences on 3rd login @@ -2626,28 +2626,28 @@ Categories/Tags Progressive Profile Node Types (5): -- 1 [PatchObjectNode] -- 1 [LoginCountDecisionNode] -- 1 [QueryFilterDecisionNode] -- 1 [PageNode] -- 1 [AttributeCollectorNode] +- 1 [PatchObjectNode] +- 1 [LoginCountDecisionNode] +- 1 [QueryFilterDecisionNode] +- 1 [PageNode] +- 1 [AttributeCollectorNode] Nodes (5): -- [423a959a-a1b9-498a-b0f7-596b6b6e775a] PatchObjectNode - Patch Object -- [8afdaec3-275e-4301-bb53-34f03e6a4b29] LoginCountDecisionNode - Login Count Decision -- [a1f45b44-5bf7-4c57-aa3f-75c619c7db8e] QueryFilterDecisionNode - Query Filter Decision -- [a5aecad8-854a-4ed5-b719-ff6c90e858c0] PageNode - Page Node -- [0a042e10-b22e-4e02-86c4-65e26e775f7a] AttributeCollectorNode - Attribute Collector -[RadioChoice] +- [423a959a-a1b9-498a-b0f7-596b6b6e775a] PatchObjectNode - Patch Object +- [8afdaec3-275e-4301-bb53-34f03e6a4b29] LoginCountDecisionNode - Login Count Decision +- [a1f45b44-5bf7-4c57-aa3f-75c619c7db8e] QueryFilterDecisionNode - Query Filter Decision +- [a5aecad8-854a-4ed5-b719-ff6c90e858c0] PageNode - Page Node +- [0a042e10-b22e-4e02-86c4-65e26e775f7a] AttributeCollectorNode - Attribute Collector +[RadioChoice] Node Types (2): -- 1 [PageNode] -- 1 [ChoiceCollectorNode] +- 1 [PageNode] +- 1 [ChoiceCollectorNode] Nodes (2): -- [5d6cd20e-5074-43de-8832-fddd95fb078e] PageNode - Page Node -- [a566e474-99f3-46e4-9e70-682402bfaa84] ChoiceCollectorNode - Choice Collector -[Registration] +- [5d6cd20e-5074-43de-8832-fddd95fb078e] PageNode - Page Node +- [a566e474-99f3-46e4-9e70-682402bfaa84] ChoiceCollectorNode - Choice Collector +[Registration] Platform Registration Tree @@ -2655,30 +2655,30 @@ Categories/Tags Registration Node Types (9): -- 1 [PageNode] -- 1 [EmailSuspendNode] -- 1 [IncrementLoginCountNode] -- 1 [CreateObjectNode] -- 1 [ValidatedUsernameNode] -- 1 [AttributeCollectorNode] -- 1 [ValidatedPasswordNode] -- 1 [KbaCreateNode] -- 1 [AcceptTermsAndConditionsNode] +- 1 [PageNode] +- 1 [EmailSuspendNode] +- 1 [IncrementLoginCountNode] +- 1 [CreateObjectNode] +- 1 [ValidatedUsernameNode] +- 1 [AttributeCollectorNode] +- 1 [ValidatedPasswordNode] +- 1 [KbaCreateNode] +- 1 [AcceptTermsAndConditionsNode] Nodes (9): -- [0c091c49-f3af-48fb-ac6f-07fba0499dd6] PageNode - Page Node -- [466f8b54-07fb-4e31-a11d-a6842618cc37] EmailSuspendNode - Email Suspend Node -- [97a15eb2-a015-4b6d-81a0-be78c3aa1a3b] IncrementLoginCountNode - Increment Login Count -- [ad5dcbb3-7335-49b7-b3e7-7d850bb88237] CreateObjectNode - Create Object -- [7fcaf48e-a754-4959-858b-05b2933b825f] ValidatedUsernameNode - Platform Username -- [d3ce2036-1523-4ce8-b1a2-895a2a036667] AttributeCollectorNode - Attribute Collector -- [3d8709a1-f09f-4d1f-8094-2850e472c1db] ValidatedPasswordNode - Platform Password -- [120c69d3-90b4-4ad4-b7af-380e8b119340] KbaCreateNode - KBA Definition -- [b4a0e915-c15d-4b83-9c9d-18347d645976] AcceptTermsAndConditionsNode - Accept Terms and Conditions +- [0c091c49-f3af-48fb-ac6f-07fba0499dd6] PageNode - Page Node +- [466f8b54-07fb-4e31-a11d-a6842618cc37] EmailSuspendNode - Email Suspend Node +- [97a15eb2-a015-4b6d-81a0-be78c3aa1a3b] IncrementLoginCountNode - Increment Login Count +- [ad5dcbb3-7335-49b7-b3e7-7d850bb88237] CreateObjectNode - Create Object +- [7fcaf48e-a754-4959-858b-05b2933b825f] ValidatedUsernameNode - Platform Username +- [d3ce2036-1523-4ce8-b1a2-895a2a036667] AttributeCollectorNode - Attribute Collector +- [3d8709a1-f09f-4d1f-8094-2850e472c1db] ValidatedPasswordNode - Platform Password +- [120c69d3-90b4-4ad4-b7af-380e8b119340] KbaCreateNode - KBA Definition +- [b4a0e915-c15d-4b83-9c9d-18347d645976] AcceptTermsAndConditionsNode - Accept Terms and Conditions Email Templates (1): -- [registration] - Register new account -[ResetPassword] +- [registration] - Register new account +[ResetPassword] Reset Password Tree @@ -2686,56 +2686,56 @@ Categories/Tags Password Reset Node Types (6): -- 1 [EmailSuspendNode] -- 1 [IdentifyExistingUserNode] -- 1 [PatchObjectNode] -- 2 [PageNode] -- 1 [AttributeCollectorNode] -- 1 [ValidatedPasswordNode] +- 1 [EmailSuspendNode] +- 1 [IdentifyExistingUserNode] +- 1 [PatchObjectNode] +- 2 [PageNode] +- 1 [AttributeCollectorNode] +- 1 [ValidatedPasswordNode] Nodes (7): -- [06c97be5-7fdd-4739-aea1-ecc7fe082865] EmailSuspendNode - Email Suspend Node -- [21b8ddf3-0203-4ae1-ab05-51cf3a3a707a] IdentifyExistingUserNode - Identify Existing User -- [989f0bf8-a328-4217-b82b-5275d79ca8bd] PatchObjectNode - Patch Object -- [cc3e1ed2-25f1-47bf-83c6-17084f8b2b2b] PageNode - Page Node -- [e4c752f9-c625-48c9-9644-a58802fa9e9c] PageNode - Page Node -- [276afa7c-a680-4cf4-a5f6-d6c78191f5c9] AttributeCollectorNode - Attribute Collector -- [009c19c8-9572-47bb-adb2-1f092c559a43] ValidatedPasswordNode - Platform Password +- [06c97be5-7fdd-4739-aea1-ecc7fe082865] EmailSuspendNode - Email Suspend Node +- [21b8ddf3-0203-4ae1-ab05-51cf3a3a707a] IdentifyExistingUserNode - Identify Existing User +- [989f0bf8-a328-4217-b82b-5275d79ca8bd] PatchObjectNode - Patch Object +- [cc3e1ed2-25f1-47bf-83c6-17084f8b2b2b] PageNode - Page Node +- [e4c752f9-c625-48c9-9644-a58802fa9e9c] PageNode - Page Node +- [276afa7c-a680-4cf4-a5f6-d6c78191f5c9] AttributeCollectorNode - Attribute Collector +- [009c19c8-9572-47bb-adb2-1f092c559a43] ValidatedPasswordNode - Platform Password Email Templates (1): -- [resetPassword] - Reset your password -[SocialProviderHandler] +- [resetPassword] - Reset your password +[SocialProviderHandler] Node Types (2): -- 1 [SocialProviderHandlerNode] -- 1 [SocialProviderHandlerNodeV2] +- 1 [SocialProviderHandlerNode] +- 1 [SocialProviderHandlerNodeV2] Nodes (2): -- [3af612be-340e-4dc9-80fb-62319a187b74] SocialProviderHandlerNode - Legacy Social Provider Handler Node -- [e15c8efe-b7a7-42bf-845e-861a9419af32] SocialProviderHandlerNodeV2 - Social Provider Handler Node +- [3af612be-340e-4dc9-80fb-62319a187b74] SocialProviderHandlerNode - Legacy Social Provider Handler Node +- [e15c8efe-b7a7-42bf-845e-861a9419af32] SocialProviderHandlerNodeV2 - Social Provider Handler Node Scripts (9): -- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User -- [ed685f9f-5909-4726-86e8-22bd38b47663] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Identity -- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization -- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) -- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization -- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization -- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization -- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) -- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization +- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User +- [ed685f9f-5909-4726-86e8-22bd38b47663] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Identity +- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization +- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) +- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization +- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization +- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization +- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) +- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization Social Identity Providers (8): -- [google] googleConfig -- [github] oauth2Config -- [facebook] oauth2Config -- [apple-stoyan] appleConfig -- [apple_web] appleConfig -- [okta-trial-5735851] oidcConfig -- [adfs] oidcConfig -- [azure] microsoftConfig -[test] -[UpdatePassword] +- [google] googleConfig +- [github] oauth2Config +- [facebook] oauth2Config +- [apple-stoyan] appleConfig +- [apple_web] appleConfig +- [okta-trial-5735851] oidcConfig +- [adfs] oidcConfig +- [azure] microsoftConfig +[test] +[UpdatePassword] Update password using active session @@ -2743,27 +2743,27 @@ Categories/Tags Password Reset Node Types (7): -- 1 [AttributePresentDecisionNode] -- 2 [PageNode] -- 1 [PatchObjectNode] -- 1 [DataStoreDecisionNode] -- 1 [EmailSuspendNode] -- 1 [SessionDataNode] -- 2 [ValidatedPasswordNode] +- 1 [AttributePresentDecisionNode] +- 2 [PageNode] +- 1 [PatchObjectNode] +- 1 [DataStoreDecisionNode] +- 1 [EmailSuspendNode] +- 1 [SessionDataNode] +- 2 [ValidatedPasswordNode] Nodes (9): -- [0f0904e6-1da3-4cdb-9abf-0d2545016fab] AttributePresentDecisionNode - Attribute Present Decision -- [20237b34-26cb-4a0b-958f-abb422290d42] PageNode - Page Node -- [3990ce1f-cce6-435b-ae1c-f138e89411c1] PatchObjectNode - Patch Object -- [7d1deabe-cd98-49c8-943f-ca12305775f3] DataStoreDecisionNode - Data Store Decision -- [a3d97b53-e38a-4b24-aed0-a021050eb744] EmailSuspendNode - Email Suspend Node -- [d018fcd1-4e22-4160-8c41-63bee51c9cb3] PageNode - Page Node -- [d1b79744-493a-44fe-bc26-7d324a8caa4e] SessionDataNode - Get Session Data -- [fe2962fc-4db3-4066-8624-553649afc438] ValidatedPasswordNode - Platform Password -- [21a99653-a7a7-47ee-b650-f493a84bba09] ValidatedPasswordNode - Platform Password +- [0f0904e6-1da3-4cdb-9abf-0d2545016fab] AttributePresentDecisionNode - Attribute Present Decision +- [20237b34-26cb-4a0b-958f-abb422290d42] PageNode - Page Node +- [3990ce1f-cce6-435b-ae1c-f138e89411c1] PatchObjectNode - Patch Object +- [7d1deabe-cd98-49c8-943f-ca12305775f3] DataStoreDecisionNode - Data Store Decision +- [a3d97b53-e38a-4b24-aed0-a021050eb744] EmailSuspendNode - Email Suspend Node +- [d018fcd1-4e22-4160-8c41-63bee51c9cb3] PageNode - Page Node +- [d1b79744-493a-44fe-bc26-7d324a8caa4e] SessionDataNode - Get Session Data +- [fe2962fc-4db3-4066-8624-553649afc438] ValidatedPasswordNode - Platform Password +- [21a99653-a7a7-47ee-b650-f493a84bba09] ValidatedPasswordNode - Platform Password Email Templates (1): -- [updatePassword] - Update your password +- [updatePassword] - Update your password " `; @@ -2810,7 +2810,7 @@ Update password using active session exports[`frodo journey describe "frodo journey describe -F test4.json -o 4.2.0": should describe all journeys and write output to test4.json file and override version to 4.2.0 1`] = `""`; exports[`frodo journey describe "frodo journey describe -F test4.json -o 4.2.0": should describe all journeys and write output to test4.json file and override version to 4.2.0 2`] = ` -"[Agent] +"[Agent] CAUTION: PingAM Agent and PingGateway profiles require an Agent journey. Don't change this configuration. @@ -2818,19 +2818,19 @@ Categories/Tags Authentication Node Types (5): -- 1 [ZeroPageLoginNode] -- 1 [AgentDataStoreDecisionNode] -- 1 [PageNode] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] +- 1 [ZeroPageLoginNode] +- 1 [AgentDataStoreDecisionNode] +- 1 [PageNode] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] Nodes (5): -- [51e2cd24-cf1f-4313-8af0-35ea9e04d2fe] ZeroPageLoginNode - Zero Page Login Collector -- [6736a00a-fc65-438e-b4ea-23f66b4a8739] AgentDataStoreDecisionNode - Agent Data Store Decision -- [cbd1f1af-eb0a-4274-a762-adacf04c7080] PageNode - Page Node -- [2eaad2f9-5c4b-405f-bf3f-1e99bdc0d018] ValidatedUsernameNode - Platform Username -- [6072842f-5f7c-4b62-8ae2-4f18a5701ba4] ValidatedPasswordNode - Platform Password -[ForgottenUsername] +- [51e2cd24-cf1f-4313-8af0-35ea9e04d2fe] ZeroPageLoginNode - Zero Page Login Collector +- [6736a00a-fc65-438e-b4ea-23f66b4a8739] AgentDataStoreDecisionNode - Agent Data Store Decision +- [cbd1f1af-eb0a-4274-a762-adacf04c7080] PageNode - Page Node +- [2eaad2f9-5c4b-405f-bf3f-1e99bdc0d018] ValidatedUsernameNode - Platform Username +- [6072842f-5f7c-4b62-8ae2-4f18a5701ba4] ValidatedPasswordNode - Platform Password +[ForgottenUsername] Forgotten Username Tree @@ -2838,27 +2838,27 @@ Categories/Tags Username Reset Inner Tree Dependencies (1): -- ForgottenUsername - - Login - - ProgressiveProfile +- ForgottenUsername + - Login + - ProgressiveProfile Node Types (5): -- 1 [PageNode] -- 1 [InnerTreeEvaluatorNode] -- 1 [IdentifyExistingUserNode] -- 1 [EmailSuspendNode] -- 1 [AttributeCollectorNode] +- 1 [PageNode] +- 1 [InnerTreeEvaluatorNode] +- 1 [IdentifyExistingUserNode] +- 1 [EmailSuspendNode] +- 1 [AttributeCollectorNode] Nodes (5): -- [5e2a7c95-94af-4b23-8724-deb13853726a] PageNode - Page Node -- [b93ce36e-1976-4610-b24f-8d6760b5463b] InnerTreeEvaluatorNode - Inner Tree Evaluator -- [bf9ea8d5-9802-4f26-9664-a21840faac23] IdentifyExistingUserNode - Identify Existing User -- [d9a79f01-2ce3-4be2-a28a-975f35c3c8ca] EmailSuspendNode - Email Suspend Node -- [9f1e8d94-4922-481b-9e14-212b66548900] AttributeCollectorNode - Attribute Collector +- [5e2a7c95-94af-4b23-8724-deb13853726a] PageNode - Page Node +- [b93ce36e-1976-4610-b24f-8d6760b5463b] InnerTreeEvaluatorNode - Inner Tree Evaluator +- [bf9ea8d5-9802-4f26-9664-a21840faac23] IdentifyExistingUserNode - Identify Existing User +- [d9a79f01-2ce3-4be2-a28a-975f35c3c8ca] EmailSuspendNode - Email Suspend Node +- [9f1e8d94-4922-481b-9e14-212b66548900] AttributeCollectorNode - Attribute Collector Email Templates (1): -- [forgottenUsername] - Account Information - username -[FrodoTest] +- [forgottenUsername] - Account Information - username +[FrodoTest] Frodo test journey utilizing a variety of nodes and dependencies to test support for complex journeys. @@ -2866,65 +2866,65 @@ Categories/Tags Frodo, Prototype Node Types (9): -- 2 [PageNode] -- 1 [product-Saml2Node] -- 1 [EmailTemplateNode] -- 1 [SocialProviderHandlerNode] -- 1 [ScriptedDecisionNode] -- 1 [IdentityStoreDecisionNode] -- 1 [ValidatedUsernameNode] -- 2 [ValidatedPasswordNode] -- 2 [SelectIdPNode] +- 2 [PageNode] +- 1 [product-Saml2Node] +- 1 [EmailTemplateNode] +- 1 [SocialProviderHandlerNode] +- 1 [ScriptedDecisionNode] +- 1 [IdentityStoreDecisionNode] +- 1 [ValidatedUsernameNode] +- 2 [ValidatedPasswordNode] +- 2 [SelectIdPNode] Nodes (12): -- [278bf084-9eea-46fe-8ce9-2600dde3b046] PageNode - Login Page -- [64157fca-bd5b-4405-a4c8-64ffd98a5461] product-Saml2Node - SAML2 Authentication -- [731c5810-020b-45c8-a7fc-3c21903ae2b3] PageNode - Login Page -- [bf153f37-83dd-4f39-aa0c-74135430242e] EmailTemplateNode - Email Template Node -- [d5cc2d52-6ce4-452d-85ea-3a5b50218b67] SocialProviderHandlerNode - Social Login -- [e2c39477-847a-4df2-9c5d-b449a752638b] ScriptedDecisionNode - Check Username -- [fc7e47cd-c679-4211-8e05-a36654f23c67] IdentityStoreDecisionNode - Validate Creds -- [7a351800-fb7e-4145-903c-388554747556] ValidatedUsernameNode - Username -- [804e6a68-1720-442b-926a-007e90f02782] ValidatedPasswordNode - Password -- [228a44d5-fd78-4278-8999-fdd470ea7ebf] SelectIdPNode - Select IDP -- [dd16c8d4-baca-4ae0-bcd8-fb98b9040524] ValidatedPasswordNode - Password -- [038f9b2a-36b2-489b-9e03-386c9a62ea21] SelectIdPNode - Select IDP +- [278bf084-9eea-46fe-8ce9-2600dde3b046] PageNode - Login Page +- [64157fca-bd5b-4405-a4c8-64ffd98a5461] product-Saml2Node - SAML2 Authentication +- [731c5810-020b-45c8-a7fc-3c21903ae2b3] PageNode - Login Page +- [bf153f37-83dd-4f39-aa0c-74135430242e] EmailTemplateNode - Email Template Node +- [d5cc2d52-6ce4-452d-85ea-3a5b50218b67] SocialProviderHandlerNode - Social Login +- [e2c39477-847a-4df2-9c5d-b449a752638b] ScriptedDecisionNode - Check Username +- [fc7e47cd-c679-4211-8e05-a36654f23c67] IdentityStoreDecisionNode - Validate Creds +- [7a351800-fb7e-4145-903c-388554747556] ValidatedUsernameNode - Username +- [804e6a68-1720-442b-926a-007e90f02782] ValidatedPasswordNode - Password +- [228a44d5-fd78-4278-8999-fdd470ea7ebf] SelectIdPNode - Select IDP +- [dd16c8d4-baca-4ae0-bcd8-fb98b9040524] ValidatedPasswordNode - Password +- [038f9b2a-36b2-489b-9e03-386c9a62ea21] SelectIdPNode - Select IDP Themes (1): -- [63e19668-909f-479e-83d7-be7a01cd8187] NoAccess (FrodoTest, AA-FrodoTest) +- [63e19668-909f-479e-83d7-be7a01cd8187] NoAccess (FrodoTest, AA-FrodoTest) Scripts (9): -- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User -- [739bdc48-fd24-4c52-b353-88706d75558a] AUTHENTICATION_TREE_DECISION_NODE - Check Username -- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization -- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) -- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization -- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization -- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization -- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) -- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization +- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User +- [739bdc48-fd24-4c52-b353-88706d75558a] AUTHENTICATION_TREE_DECISION_NODE - Check Username +- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization +- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) +- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization +- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization +- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization +- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) +- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization Email Templates (1): -- [welcome] Welcome - Your account has been created +- [welcome] Welcome - Your account has been created Social Identity Providers (8): -- [google] googleConfig -- [github] oauth2Config -- [facebook] oauth2Config -- [apple-stoyan] appleConfig -- [apple_web] appleConfig -- [okta-trial-5735851] oidcConfig -- [adfs] oidcConfig -- [azure] microsoftConfig +- [google] googleConfig +- [github] oauth2Config +- [facebook] oauth2Config +- [apple-stoyan] appleConfig +- [apple_web] appleConfig +- [okta-trial-5735851] oidcConfig +- [adfs] oidcConfig +- [azure] microsoftConfig SAML2 Entity Providers (2): -- [iSPAzure] (hosted SP) -- [urn:federation:MicrosoftOnline] (remote SP) +- [iSPAzure] (hosted SP) +- [urn:federation:MicrosoftOnline] (remote SP) SAML2 Circles Of Trust (2): -- [2f04818d-561e-4f8a-82e8-af2426112138] -- [AzureCOT] -[FrodoTestJourney13] +- [2f04818d-561e-4f8a-82e8-af2426112138] +- [AzureCOT] +[FrodoTestJourney13] Frodo test journey using v2.0 nodes @@ -2932,300 +2932,300 @@ Categories/Tags Frodo, Prototype Node Types (4): -- 1 [DataStoreDecisionNode] -- 1 [PageNode] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] +- 1 [DataStoreDecisionNode] +- 1 [PageNode] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] Nodes (4): -- [bdca20b7-ada8-4906-8b3a-e59c313f6491] DataStoreDecisionNode - Validate Credentials -- [c847e93b-afa3-4d20-9a15-f75404ec353c] PageNode - Login Page -- [64dceffc-2db4-468b-96d1-491824e037a2] ValidatedUsernameNode - Username -- [e4c5071f-acc8-47c9-b097-5c4144170742] ValidatedPasswordNode - Password -[j00] +- [bdca20b7-ada8-4906-8b3a-e59c313f6491] DataStoreDecisionNode - Validate Credentials +- [c847e93b-afa3-4d20-9a15-f75404ec353c] PageNode - Login Page +- [64dceffc-2db4-468b-96d1-491824e037a2] ValidatedUsernameNode - Username +- [e4c5071f-acc8-47c9-b097-5c4144170742] ValidatedPasswordNode - Password +[j00] Node Types (1): -- 6 [ScriptedDecisionNode] +- 6 [ScriptedDecisionNode] Nodes (6): -- [01d3785f-7fb4-44a7-9458-72c380a9818f] ScriptedDecisionNode - shared -- [39b48197-f4be-42b9-800a-866587b4b9b5] ScriptedDecisionNode - level -- [3c1e8d61-0c48-44ba-86dc-52e9555b6aeb] ScriptedDecisionNode - level -- [513a2ab4-f0b8-4f94-b840-6fe14796cc84] ScriptedDecisionNode - mode -- [ba503a1e-633e-4d0d-ba18-c9a9b1105b5b] ScriptedDecisionNode - debug -- [d17ffaa1-2c61-4abd-9bb1-2559160d0a5c] ScriptedDecisionNode - shared +- [01d3785f-7fb4-44a7-9458-72c380a9818f] ScriptedDecisionNode - shared +- [39b48197-f4be-42b9-800a-866587b4b9b5] ScriptedDecisionNode - level +- [3c1e8d61-0c48-44ba-86dc-52e9555b6aeb] ScriptedDecisionNode - level +- [513a2ab4-f0b8-4f94-b840-6fe14796cc84] ScriptedDecisionNode - mode +- [ba503a1e-633e-4d0d-ba18-c9a9b1105b5b] ScriptedDecisionNode - debug +- [d17ffaa1-2c61-4abd-9bb1-2559160d0a5c] ScriptedDecisionNode - shared Scripts (4): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [3cb43516-ae69-433a-8787-501d45db14e9] AUTHENTICATION_TREE_DECISION_NODE - debug -[j01] +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [3cb43516-ae69-433a-8787-501d45db14e9] AUTHENTICATION_TREE_DECISION_NODE - debug +[j01] Inner Tree Dependencies (1): -- j01 - - j00 +- j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [6674b4ac-dd89-4e13-9440-6f81194e3a22] ScriptedDecisionNode - shared -- [89ce5d57-82fa-4d58-8d15-0329f7dbd7e7] ScriptedDecisionNode - shared -- [bb1e96af-f316-4eb0-b1c6-36b3f1af9e35] InnerTreeEvaluatorNode - nest -- [bdfbe97c-1ff4-4162-85bc-47f6f14b2c66] ScriptedDecisionNode - level -- [e92d5139-b8a6-43dc-9b13-95ba1d0dc53c] ScriptedDecisionNode - level -- [f129f0df-b49e-453b-97fb-db508e3893ce] ScriptedDecisionNode - mode +- [6674b4ac-dd89-4e13-9440-6f81194e3a22] ScriptedDecisionNode - shared +- [89ce5d57-82fa-4d58-8d15-0329f7dbd7e7] ScriptedDecisionNode - shared +- [bb1e96af-f316-4eb0-b1c6-36b3f1af9e35] InnerTreeEvaluatorNode - nest +- [bdfbe97c-1ff4-4162-85bc-47f6f14b2c66] ScriptedDecisionNode - level +- [e92d5139-b8a6-43dc-9b13-95ba1d0dc53c] ScriptedDecisionNode - level +- [f129f0df-b49e-453b-97fb-db508e3893ce] ScriptedDecisionNode - mode Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j02] +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j02] Inner Tree Dependencies (1): -- j02 - - j01 - - j00 +- j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [2dbd2d37-c659-48cf-8357-c9fc1166e3a7] ScriptedDecisionNode - level -- [4416aff7-3ebd-47e6-9831-c2f6bbe3ae24] ScriptedDecisionNode - level -- [56899fef-92a1-4f2a-ade3-973c81eb3af1] InnerTreeEvaluatorNode - nest -- [59b06306-a886-443d-92df-7a27a60c394e] ScriptedDecisionNode - mode -- [cbb3d506-b267-4b99-9edd-363e90aac997] ScriptedDecisionNode - shared -- [e0983ead-4918-48f6-858d-9aff0f03759c] ScriptedDecisionNode - shared +- [2dbd2d37-c659-48cf-8357-c9fc1166e3a7] ScriptedDecisionNode - level +- [4416aff7-3ebd-47e6-9831-c2f6bbe3ae24] ScriptedDecisionNode - level +- [56899fef-92a1-4f2a-ade3-973c81eb3af1] InnerTreeEvaluatorNode - nest +- [59b06306-a886-443d-92df-7a27a60c394e] ScriptedDecisionNode - mode +- [cbb3d506-b267-4b99-9edd-363e90aac997] ScriptedDecisionNode - shared +- [e0983ead-4918-48f6-858d-9aff0f03759c] ScriptedDecisionNode - shared Scripts (3): -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -[j03] +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +[j03] Inner Tree Dependencies (1): -- j03 - - j02 - - j01 - - j00 +- j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [35a4f94b-c895-46b9-bc0a-93cf59233759] ScriptedDecisionNode - level -- [3a92300d-6d64-451d-8156-30cb51781026] ScriptedDecisionNode - level -- [6f9de973-9ed4-41f5-b43d-4036041e2b96] ScriptedDecisionNode - shared -- [bcb8c535-5ecd-4d3d-b970-26816de96bf2] InnerTreeEvaluatorNode - nest -- [e0cfbd13-6f1e-4924-9d2d-0f7c23507172] ScriptedDecisionNode - mode -- [fae7424e-13c9-45bd-b3a2-045773671a3f] ScriptedDecisionNode - shared +- [35a4f94b-c895-46b9-bc0a-93cf59233759] ScriptedDecisionNode - level +- [3a92300d-6d64-451d-8156-30cb51781026] ScriptedDecisionNode - level +- [6f9de973-9ed4-41f5-b43d-4036041e2b96] ScriptedDecisionNode - shared +- [bcb8c535-5ecd-4d3d-b970-26816de96bf2] InnerTreeEvaluatorNode - nest +- [e0cfbd13-6f1e-4924-9d2d-0f7c23507172] ScriptedDecisionNode - mode +- [fae7424e-13c9-45bd-b3a2-045773671a3f] ScriptedDecisionNode - shared Scripts (3): -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j04] +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j04] Inner Tree Dependencies (1): -- j04 - - j03 - - j02 - - j01 - - j00 +- j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 1 [InnerTreeEvaluatorNode] -- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] Nodes (6): -- [00e75aa0-2f9b-4895-9257-d515286fd64b] InnerTreeEvaluatorNode - nest -- [040b6c89-313b-4664-92e0-6732017384b8] ScriptedDecisionNode - mode -- [69ae8ec1-de43-44ac-98e5-733db80ac176] ScriptedDecisionNode - level -- [9603ef52-30f0-4ddc-b3c0-28dac83c7bdb] ScriptedDecisionNode - shared -- [d10104e9-1f8d-4da6-a110-28d879d13959] ScriptedDecisionNode - level -- [f5c317ce-fabd-4a10-9907-c71cea037844] ScriptedDecisionNode - shared +- [00e75aa0-2f9b-4895-9257-d515286fd64b] InnerTreeEvaluatorNode - nest +- [040b6c89-313b-4664-92e0-6732017384b8] ScriptedDecisionNode - mode +- [69ae8ec1-de43-44ac-98e5-733db80ac176] ScriptedDecisionNode - level +- [9603ef52-30f0-4ddc-b3c0-28dac83c7bdb] ScriptedDecisionNode - shared +- [d10104e9-1f8d-4da6-a110-28d879d13959] ScriptedDecisionNode - level +- [f5c317ce-fabd-4a10-9907-c71cea037844] ScriptedDecisionNode - shared Scripts (3): -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -[j05] +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +[j05] Inner Tree Dependencies (1): -- j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [11f1c31c-50a9-4717-8213-420f6932481f] ScriptedDecisionNode - shared -- [3c106772-ace7-4808-8f3a-9840de8f67f0] ScriptedDecisionNode - level -- [622179cb-98f1-484a-820d-9a0df6e45e95] ScriptedDecisionNode - mode -- [a0782616-84b7-4bf5-87ed-a01fb3018563] ScriptedDecisionNode - shared -- [e90ae257-c279-46e0-9b43-5ecd89784d77] ScriptedDecisionNode - level -- [f17ecb7c-abc3-4523-9943-4cbdd90305cb] InnerTreeEvaluatorNode - nest +- [11f1c31c-50a9-4717-8213-420f6932481f] ScriptedDecisionNode - shared +- [3c106772-ace7-4808-8f3a-9840de8f67f0] ScriptedDecisionNode - level +- [622179cb-98f1-484a-820d-9a0df6e45e95] ScriptedDecisionNode - mode +- [a0782616-84b7-4bf5-87ed-a01fb3018563] ScriptedDecisionNode - shared +- [e90ae257-c279-46e0-9b43-5ecd89784d77] ScriptedDecisionNode - level +- [f17ecb7c-abc3-4523-9943-4cbdd90305cb] InnerTreeEvaluatorNode - nest Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j06] +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j06] Inner Tree Dependencies (1): -- j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [1d59caff-243c-45bd-b7d0-6dcc563989c5] ScriptedDecisionNode - shared -- [2de08e9e-bf7b-4fa1-8265-59a8e4a3f7c3] ScriptedDecisionNode - level -- [409c251f-c23b-411d-9009-d3b3d26d1b90] InnerTreeEvaluatorNode - nest -- [44b8651c-7c1e-41f1-b9a6-2e441b0ce05a] ScriptedDecisionNode - mode -- [da878771-421c-463f-aad7-4d5f2ad5e59a] ScriptedDecisionNode - shared -- [fe8f27df-8a27-4d88-9196-834ce398b2b7] ScriptedDecisionNode - level +- [1d59caff-243c-45bd-b7d0-6dcc563989c5] ScriptedDecisionNode - shared +- [2de08e9e-bf7b-4fa1-8265-59a8e4a3f7c3] ScriptedDecisionNode - level +- [409c251f-c23b-411d-9009-d3b3d26d1b90] InnerTreeEvaluatorNode - nest +- [44b8651c-7c1e-41f1-b9a6-2e441b0ce05a] ScriptedDecisionNode - mode +- [da878771-421c-463f-aad7-4d5f2ad5e59a] ScriptedDecisionNode - shared +- [fe8f27df-8a27-4d88-9196-834ce398b2b7] ScriptedDecisionNode - level Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j07] +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j07] Inner Tree Dependencies (1): -- j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [13b12fe6-cf53-46a4-a83d-0a3c1fda814f] ScriptedDecisionNode - mode -- [ac6ee166-73c0-4f73-b8db-4fe8ff6a25c0] ScriptedDecisionNode - shared -- [d90dd9f8-8b12-4e90-abaf-228ecc0174a7] ScriptedDecisionNode - level -- [d9a06d3a-7e3f-4244-9a32-63ffa0d26e00] ScriptedDecisionNode - shared -- [e62d7a4d-2012-4a2a-a6ef-d6a0e0d552d9] InnerTreeEvaluatorNode - nest -- [f2fe740c-cd75-460a-8baa-fe4b52ecc947] ScriptedDecisionNode - level +- [13b12fe6-cf53-46a4-a83d-0a3c1fda814f] ScriptedDecisionNode - mode +- [ac6ee166-73c0-4f73-b8db-4fe8ff6a25c0] ScriptedDecisionNode - shared +- [d90dd9f8-8b12-4e90-abaf-228ecc0174a7] ScriptedDecisionNode - level +- [d9a06d3a-7e3f-4244-9a32-63ffa0d26e00] ScriptedDecisionNode - shared +- [e62d7a4d-2012-4a2a-a6ef-d6a0e0d552d9] InnerTreeEvaluatorNode - nest +- [f2fe740c-cd75-460a-8baa-fe4b52ecc947] ScriptedDecisionNode - level Scripts (3): -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -[j08] +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +[j08] Inner Tree Dependencies (1): -- j08 - - j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j08 + - j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [042b600b-71cb-45a8-93ae-a6f57b16a6e5] ScriptedDecisionNode - shared -- [66026170-5088-4fcd-a6c8-ed89d7a5c79d] InnerTreeEvaluatorNode - nest -- [8096649e-973e-4209-88ce-e1d87ae2bb96] ScriptedDecisionNode - level -- [87ced99b-bfa5-40d4-ba07-c8fc31f6cc6d] ScriptedDecisionNode - level -- [948e21f4-c512-450a-9d42-e0d629217834] ScriptedDecisionNode - shared -- [d429b2b5-b215-46a5-b239-4994df65cb8b] ScriptedDecisionNode - mode +- [042b600b-71cb-45a8-93ae-a6f57b16a6e5] ScriptedDecisionNode - shared +- [66026170-5088-4fcd-a6c8-ed89d7a5c79d] InnerTreeEvaluatorNode - nest +- [8096649e-973e-4209-88ce-e1d87ae2bb96] ScriptedDecisionNode - level +- [87ced99b-bfa5-40d4-ba07-c8fc31f6cc6d] ScriptedDecisionNode - level +- [948e21f4-c512-450a-9d42-e0d629217834] ScriptedDecisionNode - shared +- [d429b2b5-b215-46a5-b239-4994df65cb8b] ScriptedDecisionNode - mode Scripts (3): -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[j09] +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[j09] Inner Tree Dependencies (1): -- j09 - - j08 - - j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j09 + - j08 + - j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [251f35c3-1a32-4520-be10-1f4af9600935] ScriptedDecisionNode - mode -- [56b82371-0c61-4dc3-8d06-c1158415b8f9] ScriptedDecisionNode - level -- [6df24fdd-0b6c-4def-bf42-77af998f28b8] InnerTreeEvaluatorNode - nest -- [8c5e9cb5-471b-4dd6-b150-ecaaeda98195] ScriptedDecisionNode - shared -- [bb294e05-6b6b-4478-b46f-b8d9e7711c66] ScriptedDecisionNode - level -- [f57cf53c-b4c6-48f7-84e8-91f535a2e8f8] ScriptedDecisionNode - shared +- [251f35c3-1a32-4520-be10-1f4af9600935] ScriptedDecisionNode - mode +- [56b82371-0c61-4dc3-8d06-c1158415b8f9] ScriptedDecisionNode - level +- [6df24fdd-0b6c-4def-bf42-77af998f28b8] InnerTreeEvaluatorNode - nest +- [8c5e9cb5-471b-4dd6-b150-ecaaeda98195] ScriptedDecisionNode - shared +- [bb294e05-6b6b-4478-b46f-b8d9e7711c66] ScriptedDecisionNode - level +- [f57cf53c-b4c6-48f7-84e8-91f535a2e8f8] ScriptedDecisionNode - shared Scripts (3): -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -[j10] +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +[j10] Inner Tree Dependencies (1): -- j10 - - j09 - - j08 - - j07 - - j06 - - j05 - - j04 - - j03 - - j02 - - j01 - - j00 +- j10 + - j09 + - j08 + - j07 + - j06 + - j05 + - j04 + - j03 + - j02 + - j01 + - j00 Node Types (2): -- 5 [ScriptedDecisionNode] -- 1 [InnerTreeEvaluatorNode] +- 5 [ScriptedDecisionNode] +- 1 [InnerTreeEvaluatorNode] Nodes (6): -- [300feda0-3248-49a9-b60f-01df802b2229] ScriptedDecisionNode - level -- [40afb384-e9b6-4dcb-acde-04de109474c8] ScriptedDecisionNode - shared -- [8d7d64ee-da20-461f-a2ca-206b7479dd67] ScriptedDecisionNode - level -- [97ef9d96-99e7-4d2d-b6c6-4177b5397ead] ScriptedDecisionNode - shared -- [c7fcf7ae-1ab5-474b-b5b0-272e10468fbd] InnerTreeEvaluatorNode - nest -- [c91d626e-1156-41bd-b1fb-d292f640fba6] ScriptedDecisionNode - mode +- [300feda0-3248-49a9-b60f-01df802b2229] ScriptedDecisionNode - level +- [40afb384-e9b6-4dcb-acde-04de109474c8] ScriptedDecisionNode - shared +- [8d7d64ee-da20-461f-a2ca-206b7479dd67] ScriptedDecisionNode - level +- [97ef9d96-99e7-4d2d-b6c6-4177b5397ead] ScriptedDecisionNode - shared +- [c7fcf7ae-1ab5-474b-b5b0-272e10468fbd] InnerTreeEvaluatorNode - nest +- [c91d626e-1156-41bd-b1fb-d292f640fba6] ScriptedDecisionNode - mode Scripts (3): -- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level -- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared -- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode -[Login] +- [41c24257-d7fc-4654-8b46-c2666dc5b56d] AUTHENTICATION_TREE_DECISION_NODE - level +- [1b52a7e0-4019-40fa-958a-15a49870e901] AUTHENTICATION_TREE_DECISION_NODE - shared +- [5bbdaeff-ddee-44b9-b608-8d413d7d65a6] AUTHENTICATION_TREE_DECISION_NODE - mode +[Login] Platform Login Tree @@ -3233,38 +3233,38 @@ Categories/Tags Authentication Inner Tree Dependencies (1): -- Login - - ProgressiveProfile +- Login + - ProgressiveProfile Node Types (8): -- 1 [RetryLimitDecisionNode] -- 1 [InnerTreeEvaluatorNode] -- 1 [AccountLockoutNode] -- 1 [IdentityStoreDecisionNode] -- 1 [PageNode] -- 1 [IncrementLoginCountNode] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] +- 1 [RetryLimitDecisionNode] +- 1 [InnerTreeEvaluatorNode] +- 1 [AccountLockoutNode] +- 1 [IdentityStoreDecisionNode] +- 1 [PageNode] +- 1 [IncrementLoginCountNode] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] Nodes (8): -- [2119f332-0f69-4088-a7a1-6582bf0f2001] RetryLimitDecisionNode - Retry Limit Decision -- [33b24514-3e50-4180-8f08-ab6f4e51b07e] InnerTreeEvaluatorNode - Inner Tree Evaluator -- [51e8c4c1-3509-4635-90e6-d2cc31c4a6a5] AccountLockoutNode - Account Lockout -- [7f0c2aee-8c74-4d02-82a6-9d4ed9d11708] IdentityStoreDecisionNode - Identity Store Decision -- [a12bc72f-ad97-4f1e-a789-a1fa3dd566c8] PageNode - Page Node -- [bba3e0d8-8525-4e82-bf48-ac17f7988917] IncrementLoginCountNode - Increment Login Count -- [7354982f-57b6-4b04-9ddc-f1dd1e1e07d0] ValidatedUsernameNode - Platform Username -- [0c80c39b-4813-4e67-b4fb-5a0bba85f994] ValidatedPasswordNode - Platform Password -[OrphanedTest] +- [2119f332-0f69-4088-a7a1-6582bf0f2001] RetryLimitDecisionNode - Retry Limit Decision +- [33b24514-3e50-4180-8f08-ab6f4e51b07e] InnerTreeEvaluatorNode - Inner Tree Evaluator +- [51e8c4c1-3509-4635-90e6-d2cc31c4a6a5] AccountLockoutNode - Account Lockout +- [7f0c2aee-8c74-4d02-82a6-9d4ed9d11708] IdentityStoreDecisionNode - Identity Store Decision +- [a12bc72f-ad97-4f1e-a789-a1fa3dd566c8] PageNode - Page Node +- [bba3e0d8-8525-4e82-bf48-ac17f7988917] IncrementLoginCountNode - Increment Login Count +- [7354982f-57b6-4b04-9ddc-f1dd1e1e07d0] ValidatedUsernameNode - Platform Username +- [0c80c39b-4813-4e67-b4fb-5a0bba85f994] ValidatedPasswordNode - Platform Password +[OrphanedTest] Test orphaned nodes Node Types (1): -- 1 [IdentityStoreDecisionNode] +- 1 [IdentityStoreDecisionNode] Nodes (1): -- [343e745f-923a-43c4-8675-649a490fd0a3] IdentityStoreDecisionNode - Identity Store Decision -[P1P-Test] +- [343e745f-923a-43c4-8675-649a490fd0a3] IdentityStoreDecisionNode - Identity Store Decision +[P1P-Test] PingOne Protect Login Risk @@ -3272,40 +3272,40 @@ Categories/Tags Helper, P1 Protect Node Types (8): -- 7 [PageNode] -- 2 [product-PingOneProtectResultNode] -- 1 [product-PingOneProtectInitializeNode] -- 1 [product-PingOneProtectEvaluationNode] -- 1 [IdentityStoreDecisionNode] -- 6 [designer-4b76e2122a0541498f380072cd115683] -- 1 [ValidatedUsernameNode] -- 1 [ValidatedPasswordNode] +- 7 [PageNode] +- 2 [product-PingOneProtectResultNode] +- 1 [product-PingOneProtectInitializeNode] +- 1 [product-PingOneProtectEvaluationNode] +- 1 [IdentityStoreDecisionNode] +- 6 [designer-4b76e2122a0541498f380072cd115683] +- 1 [ValidatedUsernameNode] +- 1 [ValidatedPasswordNode] Nodes (20): -- [00a4835b-6e99-4938-9bb8-50d5569a68d4] PageNode - Low -- [084c3d2d-7d47-4f2e-81d1-57961d496939] PageNode - High -- [167b87dd-a97c-4e3b-82ba-581090fd7863] product-PingOneProtectResultNode - SUCCESS -- [37f190ea-fa18-4d44-941b-4e5ac325f394] PageNode - Medium -- [4fdf4255-0236-4527-ae6d-d10d2c0ee8d5] PageNode - Login Page -- [6632fe0f-6395-4cc1-88d8-c9ca4a9061b6] product-PingOneProtectInitializeNode - Initialize Signals SDK -- [8120e613-dee8-42b4-9668-71b8a25c1c92] PageNode - P1P Failure -- [a0059e3b-de04-4f0f-a5ed-49525d1da576] PageNode - P1P Client Error -- [df827cfc-6e2d-4b9f-a8b1-d92c2910eb07] product-PingOneProtectEvaluationNode - P1P Risk Decision -- [e5f7bd1f-8dbb-4fb2-ae54-1e09047e8ece] product-PingOneProtectResultNode - FAILED -- [ef1929b1-255e-446e-a597-7d7a3c4bf63f] IdentityStoreDecisionNode - Identity Store Decision -- [f1cb199e-9e9a-4761-bacf-bc717ca6c540] PageNode - Exceeds Score Threshold -- [843dd22b-a890-461b-9a16-33d8bd871396] designer-4b76e2122a0541498f380072cd115683 - Debug -- [2c8f0d12-c373-4a25-9a30-b3184888d163] designer-4b76e2122a0541498f380072cd115683 - Debug -- [8835fe59-3988-4121-8b15-ad16a7049d7a] designer-4b76e2122a0541498f380072cd115683 - Debug -- [f74e82e2-72ab-4a1a-9188-655622794a37] ValidatedUsernameNode - Username -- [6a428d9f-a221-44f6-a5c6-c6981f90f9fc] ValidatedPasswordNode - Password -- [52ab689c-491b-4117-b729-ff590b5d1f61] designer-4b76e2122a0541498f380072cd115683 - Debug -- [c1804982-10dc-4668-bd53-909107cc4039] designer-4b76e2122a0541498f380072cd115683 - Debug -- [de8fa10c-f4cc-44b7-b675-cdc75dcc600f] designer-4b76e2122a0541498f380072cd115683 - Debug -[PrestonTest] +- [00a4835b-6e99-4938-9bb8-50d5569a68d4] PageNode - Low +- [084c3d2d-7d47-4f2e-81d1-57961d496939] PageNode - High +- [167b87dd-a97c-4e3b-82ba-581090fd7863] product-PingOneProtectResultNode - SUCCESS +- [37f190ea-fa18-4d44-941b-4e5ac325f394] PageNode - Medium +- [4fdf4255-0236-4527-ae6d-d10d2c0ee8d5] PageNode - Login Page +- [6632fe0f-6395-4cc1-88d8-c9ca4a9061b6] product-PingOneProtectInitializeNode - Initialize Signals SDK +- [8120e613-dee8-42b4-9668-71b8a25c1c92] PageNode - P1P Failure +- [a0059e3b-de04-4f0f-a5ed-49525d1da576] PageNode - P1P Client Error +- [df827cfc-6e2d-4b9f-a8b1-d92c2910eb07] product-PingOneProtectEvaluationNode - P1P Risk Decision +- [e5f7bd1f-8dbb-4fb2-ae54-1e09047e8ece] product-PingOneProtectResultNode - FAILED +- [ef1929b1-255e-446e-a597-7d7a3c4bf63f] IdentityStoreDecisionNode - Identity Store Decision +- [f1cb199e-9e9a-4761-bacf-bc717ca6c540] PageNode - Exceeds Score Threshold +- [843dd22b-a890-461b-9a16-33d8bd871396] designer-4b76e2122a0541498f380072cd115683 - Debug +- [2c8f0d12-c373-4a25-9a30-b3184888d163] designer-4b76e2122a0541498f380072cd115683 - Debug +- [8835fe59-3988-4121-8b15-ad16a7049d7a] designer-4b76e2122a0541498f380072cd115683 - Debug +- [f74e82e2-72ab-4a1a-9188-655622794a37] ValidatedUsernameNode - Username +- [6a428d9f-a221-44f6-a5c6-c6981f90f9fc] ValidatedPasswordNode - Password +- [52ab689c-491b-4117-b729-ff590b5d1f61] designer-4b76e2122a0541498f380072cd115683 - Debug +- [c1804982-10dc-4668-bd53-909107cc4039] designer-4b76e2122a0541498f380072cd115683 - Debug +- [de8fa10c-f4cc-44b7-b675-cdc75dcc600f] designer-4b76e2122a0541498f380072cd115683 - Debug +[PrestonTest] Test journey with a script that no longer exists, to fix a journey export issue. -[ProgressiveProfile] +[ProgressiveProfile] Prompt for missing preferences on 3rd login @@ -3313,28 +3313,28 @@ Categories/Tags Progressive Profile Node Types (5): -- 1 [PatchObjectNode] -- 1 [LoginCountDecisionNode] -- 1 [QueryFilterDecisionNode] -- 1 [PageNode] -- 1 [AttributeCollectorNode] +- 1 [PatchObjectNode] +- 1 [LoginCountDecisionNode] +- 1 [QueryFilterDecisionNode] +- 1 [PageNode] +- 1 [AttributeCollectorNode] Nodes (5): -- [423a959a-a1b9-498a-b0f7-596b6b6e775a] PatchObjectNode - Patch Object -- [8afdaec3-275e-4301-bb53-34f03e6a4b29] LoginCountDecisionNode - Login Count Decision -- [a1f45b44-5bf7-4c57-aa3f-75c619c7db8e] QueryFilterDecisionNode - Query Filter Decision -- [a5aecad8-854a-4ed5-b719-ff6c90e858c0] PageNode - Page Node -- [0a042e10-b22e-4e02-86c4-65e26e775f7a] AttributeCollectorNode - Attribute Collector -[RadioChoice] +- [423a959a-a1b9-498a-b0f7-596b6b6e775a] PatchObjectNode - Patch Object +- [8afdaec3-275e-4301-bb53-34f03e6a4b29] LoginCountDecisionNode - Login Count Decision +- [a1f45b44-5bf7-4c57-aa3f-75c619c7db8e] QueryFilterDecisionNode - Query Filter Decision +- [a5aecad8-854a-4ed5-b719-ff6c90e858c0] PageNode - Page Node +- [0a042e10-b22e-4e02-86c4-65e26e775f7a] AttributeCollectorNode - Attribute Collector +[RadioChoice] Node Types (2): -- 1 [PageNode] -- 1 [ChoiceCollectorNode] +- 1 [PageNode] +- 1 [ChoiceCollectorNode] Nodes (2): -- [5d6cd20e-5074-43de-8832-fddd95fb078e] PageNode - Page Node -- [a566e474-99f3-46e4-9e70-682402bfaa84] ChoiceCollectorNode - Choice Collector -[Registration] +- [5d6cd20e-5074-43de-8832-fddd95fb078e] PageNode - Page Node +- [a566e474-99f3-46e4-9e70-682402bfaa84] ChoiceCollectorNode - Choice Collector +[Registration] Platform Registration Tree @@ -3342,30 +3342,30 @@ Categories/Tags Registration Node Types (9): -- 1 [PageNode] -- 1 [EmailSuspendNode] -- 1 [IncrementLoginCountNode] -- 1 [CreateObjectNode] -- 1 [ValidatedUsernameNode] -- 1 [AttributeCollectorNode] -- 1 [ValidatedPasswordNode] -- 1 [KbaCreateNode] -- 1 [AcceptTermsAndConditionsNode] +- 1 [PageNode] +- 1 [EmailSuspendNode] +- 1 [IncrementLoginCountNode] +- 1 [CreateObjectNode] +- 1 [ValidatedUsernameNode] +- 1 [AttributeCollectorNode] +- 1 [ValidatedPasswordNode] +- 1 [KbaCreateNode] +- 1 [AcceptTermsAndConditionsNode] Nodes (9): -- [0c091c49-f3af-48fb-ac6f-07fba0499dd6] PageNode - Page Node -- [466f8b54-07fb-4e31-a11d-a6842618cc37] EmailSuspendNode - Email Suspend Node -- [97a15eb2-a015-4b6d-81a0-be78c3aa1a3b] IncrementLoginCountNode - Increment Login Count -- [ad5dcbb3-7335-49b7-b3e7-7d850bb88237] CreateObjectNode - Create Object -- [7fcaf48e-a754-4959-858b-05b2933b825f] ValidatedUsernameNode - Platform Username -- [d3ce2036-1523-4ce8-b1a2-895a2a036667] AttributeCollectorNode - Attribute Collector -- [3d8709a1-f09f-4d1f-8094-2850e472c1db] ValidatedPasswordNode - Platform Password -- [120c69d3-90b4-4ad4-b7af-380e8b119340] KbaCreateNode - KBA Definition -- [b4a0e915-c15d-4b83-9c9d-18347d645976] AcceptTermsAndConditionsNode - Accept Terms and Conditions +- [0c091c49-f3af-48fb-ac6f-07fba0499dd6] PageNode - Page Node +- [466f8b54-07fb-4e31-a11d-a6842618cc37] EmailSuspendNode - Email Suspend Node +- [97a15eb2-a015-4b6d-81a0-be78c3aa1a3b] IncrementLoginCountNode - Increment Login Count +- [ad5dcbb3-7335-49b7-b3e7-7d850bb88237] CreateObjectNode - Create Object +- [7fcaf48e-a754-4959-858b-05b2933b825f] ValidatedUsernameNode - Platform Username +- [d3ce2036-1523-4ce8-b1a2-895a2a036667] AttributeCollectorNode - Attribute Collector +- [3d8709a1-f09f-4d1f-8094-2850e472c1db] ValidatedPasswordNode - Platform Password +- [120c69d3-90b4-4ad4-b7af-380e8b119340] KbaCreateNode - KBA Definition +- [b4a0e915-c15d-4b83-9c9d-18347d645976] AcceptTermsAndConditionsNode - Accept Terms and Conditions Email Templates (1): -- [registration] - Register new account -[ResetPassword] +- [registration] - Register new account +[ResetPassword] Reset Password Tree @@ -3373,56 +3373,56 @@ Categories/Tags Password Reset Node Types (6): -- 1 [EmailSuspendNode] -- 1 [IdentifyExistingUserNode] -- 1 [PatchObjectNode] -- 2 [PageNode] -- 1 [AttributeCollectorNode] -- 1 [ValidatedPasswordNode] +- 1 [EmailSuspendNode] +- 1 [IdentifyExistingUserNode] +- 1 [PatchObjectNode] +- 2 [PageNode] +- 1 [AttributeCollectorNode] +- 1 [ValidatedPasswordNode] Nodes (7): -- [06c97be5-7fdd-4739-aea1-ecc7fe082865] EmailSuspendNode - Email Suspend Node -- [21b8ddf3-0203-4ae1-ab05-51cf3a3a707a] IdentifyExistingUserNode - Identify Existing User -- [989f0bf8-a328-4217-b82b-5275d79ca8bd] PatchObjectNode - Patch Object -- [cc3e1ed2-25f1-47bf-83c6-17084f8b2b2b] PageNode - Page Node -- [e4c752f9-c625-48c9-9644-a58802fa9e9c] PageNode - Page Node -- [276afa7c-a680-4cf4-a5f6-d6c78191f5c9] AttributeCollectorNode - Attribute Collector -- [009c19c8-9572-47bb-adb2-1f092c559a43] ValidatedPasswordNode - Platform Password +- [06c97be5-7fdd-4739-aea1-ecc7fe082865] EmailSuspendNode - Email Suspend Node +- [21b8ddf3-0203-4ae1-ab05-51cf3a3a707a] IdentifyExistingUserNode - Identify Existing User +- [989f0bf8-a328-4217-b82b-5275d79ca8bd] PatchObjectNode - Patch Object +- [cc3e1ed2-25f1-47bf-83c6-17084f8b2b2b] PageNode - Page Node +- [e4c752f9-c625-48c9-9644-a58802fa9e9c] PageNode - Page Node +- [276afa7c-a680-4cf4-a5f6-d6c78191f5c9] AttributeCollectorNode - Attribute Collector +- [009c19c8-9572-47bb-adb2-1f092c559a43] ValidatedPasswordNode - Platform Password Email Templates (1): -- [resetPassword] - Reset your password -[SocialProviderHandler] +- [resetPassword] - Reset your password +[SocialProviderHandler] Node Types (2): -- 1 [SocialProviderHandlerNode] -- 1 [SocialProviderHandlerNodeV2] +- 1 [SocialProviderHandlerNode] +- 1 [SocialProviderHandlerNodeV2] Nodes (2): -- [3af612be-340e-4dc9-80fb-62319a187b74] SocialProviderHandlerNode - Legacy Social Provider Handler Node -- [e15c8efe-b7a7-42bf-845e-861a9419af32] SocialProviderHandlerNodeV2 - Social Provider Handler Node +- [3af612be-340e-4dc9-80fb-62319a187b74] SocialProviderHandlerNode - Legacy Social Provider Handler Node +- [e15c8efe-b7a7-42bf-845e-861a9419af32] SocialProviderHandlerNodeV2 - Social Provider Handler Node Scripts (9): -- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User -- [ed685f9f-5909-4726-86e8-22bd38b47663] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Identity -- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization -- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) -- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization -- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization -- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization -- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) -- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization +- [58c824ae-84ed-4724-82cd-db128fc3f6c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Managed User +- [ed685f9f-5909-4726-86e8-22bd38b47663] SOCIAL_IDP_PROFILE_TRANSFORMATION - Normalized Profile to Identity +- [58d29080-4563-480b-89bb-1e7719776a21] SOCIAL_IDP_PROFILE_TRANSFORMATION - Google Profile Normalization +- [23143919-6b78-40c3-b25e-beca19b229e0] SOCIAL_IDP_PROFILE_TRANSFORMATION - GitHub Profile Normalization (VS) +- [bae1d54a-e97d-4997-aa5d-c027f21af82c] SOCIAL_IDP_PROFILE_TRANSFORMATION - Facebook Profile Normalization +- [484e6246-dbc6-4288-97e6-54e55431402e] SOCIAL_IDP_PROFILE_TRANSFORMATION - Apple Profile Normalization +- [6325cf19-a49b-471e-8d26-7e4df76df0e2] SOCIAL_IDP_PROFILE_TRANSFORMATION - Okta Profile Normalization +- [dbe0bf9a-72aa-49d5-8483-9db147985a47] SOCIAL_IDP_PROFILE_TRANSFORMATION - ADFS Profile Normalization (JS) +- [73cecbfc-dad0-4395-be6a-6858ee3a80e5] SOCIAL_IDP_PROFILE_TRANSFORMATION - Microsoft Profile Normalization Social Identity Providers (8): -- [google] googleConfig -- [github] oauth2Config -- [facebook] oauth2Config -- [apple-stoyan] appleConfig -- [apple_web] appleConfig -- [okta-trial-5735851] oidcConfig -- [adfs] oidcConfig -- [azure] microsoftConfig -[test] -[UpdatePassword] +- [google] googleConfig +- [github] oauth2Config +- [facebook] oauth2Config +- [apple-stoyan] appleConfig +- [apple_web] appleConfig +- [okta-trial-5735851] oidcConfig +- [adfs] oidcConfig +- [azure] microsoftConfig +[test] +[UpdatePassword] Update password using active session @@ -3430,27 +3430,27 @@ Categories/Tags Password Reset Node Types (7): -- 1 [AttributePresentDecisionNode] -- 2 [PageNode] -- 1 [PatchObjectNode] -- 1 [DataStoreDecisionNode] -- 1 [EmailSuspendNode] -- 1 [SessionDataNode] -- 2 [ValidatedPasswordNode] +- 1 [AttributePresentDecisionNode] +- 2 [PageNode] +- 1 [PatchObjectNode] +- 1 [DataStoreDecisionNode] +- 1 [EmailSuspendNode] +- 1 [SessionDataNode] +- 2 [ValidatedPasswordNode] Nodes (9): -- [0f0904e6-1da3-4cdb-9abf-0d2545016fab] AttributePresentDecisionNode - Attribute Present Decision -- [20237b34-26cb-4a0b-958f-abb422290d42] PageNode - Page Node -- [3990ce1f-cce6-435b-ae1c-f138e89411c1] PatchObjectNode - Patch Object -- [7d1deabe-cd98-49c8-943f-ca12305775f3] DataStoreDecisionNode - Data Store Decision -- [a3d97b53-e38a-4b24-aed0-a021050eb744] EmailSuspendNode - Email Suspend Node -- [d018fcd1-4e22-4160-8c41-63bee51c9cb3] PageNode - Page Node -- [d1b79744-493a-44fe-bc26-7d324a8caa4e] SessionDataNode - Get Session Data -- [fe2962fc-4db3-4066-8624-553649afc438] ValidatedPasswordNode - Platform Password -- [21a99653-a7a7-47ee-b650-f493a84bba09] ValidatedPasswordNode - Platform Password +- [0f0904e6-1da3-4cdb-9abf-0d2545016fab] AttributePresentDecisionNode - Attribute Present Decision +- [20237b34-26cb-4a0b-958f-abb422290d42] PageNode - Page Node +- [3990ce1f-cce6-435b-ae1c-f138e89411c1] PatchObjectNode - Patch Object +- [7d1deabe-cd98-49c8-943f-ca12305775f3] DataStoreDecisionNode - Data Store Decision +- [a3d97b53-e38a-4b24-aed0-a021050eb744] EmailSuspendNode - Email Suspend Node +- [d018fcd1-4e22-4160-8c41-63bee51c9cb3] PageNode - Page Node +- [d1b79744-493a-44fe-bc26-7d324a8caa4e] SessionDataNode - Get Session Data +- [fe2962fc-4db3-4066-8624-553649afc438] ValidatedPasswordNode - Platform Password +- [21a99653-a7a7-47ee-b650-f493a84bba09] ValidatedPasswordNode - Platform Password Email Templates (1): -- [updatePassword] - Update your password +- [updatePassword] - Update your password " `; diff --git a/test/e2e/admin-list-oauth2-clients-with-admin-privileges.e2e.test.js b/test/e2e/admin-list-oauth2-clients-with-admin-privileges.e2e.test.js index fc391ebc4..d92132840 100644 --- a/test/e2e/admin-list-oauth2-clients-with-admin-privileges.e2e.test.js +++ b/test/e2e/admin-list-oauth2-clients-with-admin-privileges.e2e.test.js @@ -51,7 +51,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -63,6 +63,6 @@ describe('frodo admin list-oauth2-clients-with-admin-privileges', () => { test('"frodo admin list-oauth2-clients-with-admin-privileges": should list the ids of the oauth2 clients with admin privileges.', async () => { const CMD = `frodo admin list-oauth2-clients-with-admin-privileges`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/admin-list-oauth2-clients-with-custom-privileges.e2e.test.js b/test/e2e/admin-list-oauth2-clients-with-custom-privileges.e2e.test.js index 8b35c5f22..9d7ff738c 100644 --- a/test/e2e/admin-list-oauth2-clients-with-custom-privileges.e2e.test.js +++ b/test/e2e/admin-list-oauth2-clients-with-custom-privileges.e2e.test.js @@ -51,7 +51,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -63,6 +63,6 @@ describe('frodo admin list-oauth2-clients-with-custom-privileges', () => { test('"frodo admin list-oauth2-clients-with-custom-privileges": should list the ids of the oauth2 clients with custom privileges.', async () => { const CMD = `frodo admin list-oauth2-clients-with-custom-privileges`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/agent-ai-delete.e2e.test.js b/test/e2e/agent-ai-delete.e2e.test.js index 91343e728..e88046b5d 100644 --- a/test/e2e/agent-ai-delete.e2e.test.js +++ b/test/e2e/agent-ai-delete.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc import cp from 'child_process'; import { promisify } from 'util'; -import { clearFixture, getEnv, removeAnsiEscapeCodes, stageFixture } from './utils/TestUtils'; +import { clearFixture, getEnv, stageFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -87,7 +87,7 @@ describe('frodo agent ai delete', () => { test('"frodo agent ai delete frodo-dev -i testAgent": should delete AI agent testAgent', async () => { const { stdout } = await exec(deleteAgent, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent ai delete frodo-dev --agent-id does-not-exist": should fail deleting does-not-exist', async () => { @@ -95,12 +95,12 @@ describe('frodo agent ai delete', () => { await exec(deleteNonExistantAgent, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test('"frodo agent ai delete frodo-dev -a": should delete all AI agents', async () => { const { stdout } = await exec(deleteAllAgents, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/agent-ai-describe.e2e.test.js b/test/e2e/agent-ai-describe.e2e.test.js index a45dc7394..d301de48a 100644 --- a/test/e2e/agent-ai-describe.e2e.test.js +++ b/test/e2e/agent-ai-describe.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-volker-dev.forgeblo import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -74,13 +74,13 @@ describe('frodo agent ai describe', () => { test('"frodo agent ai describe -i banking-assistant": should describe AI agent in table format', async () => { const CMD = 'frodo agent ai describe -i banking-assistant'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent ai describe -i banking-assistant --json": should describe AI agent in JSON format', async () => { const CMD = 'frodo agent ai describe -i banking-assistant --json'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent ai describe -i does-not-exist": should fail for non-existing AI agent', async () => { @@ -89,7 +89,7 @@ describe('frodo agent ai describe', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); }); diff --git a/test/e2e/agent-ai-import.e2e.test.js b/test/e2e/agent-ai-import.e2e.test.js index 317982212..f5f6cf268 100644 --- a/test/e2e/agent-ai-import.e2e.test.js +++ b/test/e2e/agent-ai-import.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -83,18 +83,18 @@ describe('frodo agent ai import', () => { test(`"frodo agent ai import -i testAgent -f ${allAlphaAIAgentsExport}": should import testAgent from file`, async () => { const CMD = `frodo agent ai import -i testAgent -f ${allAlphaAIAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent ai import -f ${allAlphaAIAgentsExport}": should import first AI agent from file`, async () => { const CMD = `frodo agent ai import -f ${allAlphaAIAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent ai import -af ${allAlphaAIAgentsExport}": should import all AI agents from file`, async () => { const CMD = `frodo agent ai import -af ${allAlphaAIAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/agent-ai-list.e2e.test.js b/test/e2e/agent-ai-list.e2e.test.js index bfd782184..565af3e6c 100644 --- a/test/e2e/agent-ai-list.e2e.test.js +++ b/test/e2e/agent-ai-list.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -74,18 +74,18 @@ describe('frodo agent ai list', () => { test('"frodo agent ai list": should list the ids of AI agents', async () => { const CMD = 'frodo agent ai list'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent ai list -l": should list ids and statuses of AI agents', async () => { const CMD = 'frodo agent ai list -l'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent ai list --long": should list ids and statuses of AI agents', async () => { const CMD = 'frodo agent ai list --long'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/agent-describe.e2e.test.js b/test/e2e/agent-describe.e2e.test.js index e19b8aa18..2a9aa7c07 100644 --- a/test/e2e/agent-describe.e2e.test.js +++ b/test/e2e/agent-describe.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -66,18 +66,18 @@ describe('frodo agent describe', () => { test('"frodo agent describe": should describe all agents in table format', async () => { const CMD = 'frodo agent describe'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent describe --json": should describe all agents in JSON format', async () => { const CMD = 'frodo agent describe --json'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent describe -i banking-assistant --json": should describe one agent by ID in JSON format', async () => { const CMD = 'frodo agent describe -i banking-assistant --json'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/agent-export.e2e.test.js b/test/e2e/agent-export.e2e.test.js index 9c5e3f229..dc9e577a2 100644 --- a/test/e2e/agent-export.e2e.test.js +++ b/test/e2e/agent-export.e2e.test.js @@ -62,7 +62,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=http://openam-frodo-dev.classic.co */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, testExport, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, testExport, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c, classic_connection as cc } from './utils/TestConfig'; const exec = promisify(cp.exec); diff --git a/test/e2e/agent-gateway-delete.e2e.test.js b/test/e2e/agent-gateway-delete.e2e.test.js index 08eb3fa54..7ab9b8013 100644 --- a/test/e2e/agent-gateway-delete.e2e.test.js +++ b/test/e2e/agent-gateway-delete.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { clearFixture, getEnv, removeAnsiEscapeCodes, stageFixture } from './utils/TestUtils'; +import { clearFixture, getEnv, stageFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -88,9 +88,9 @@ describe('frodo agent gateway delete', () => { const CMD = deleteAgent; try { const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); @@ -100,20 +100,20 @@ describe('frodo agent gateway delete', () => { await exec(CMD, env); fail("Command should've failed") } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test('"frodo agent gateway delete -a": should delete all agent gateways', async () => { const CMD = deleteAllAgents; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent gateway delete --all": should do nothing when no agent gateways can be deleted', async () => { const CMD = 'frodo agent gateway delete --all'; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/agent-gateway-describe.e2e.test.js b/test/e2e/agent-gateway-describe.e2e.test.js index 4147cebef..6ca0779a6 100644 --- a/test/e2e/agent-gateway-describe.e2e.test.js +++ b/test/e2e/agent-gateway-describe.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -73,12 +73,12 @@ describe('frodo agent gateway describe', () => { test('"frodo agent gateway describe -i frodo-test-ig-agent": should describe gateway agent in table format', async () => { const CMD = 'frodo agent gateway describe -i frodo-test-ig-agent'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent gateway describe -i frodo-test-ig-agent --json": should describe gateway agent in JSON format', async () => { const CMD = 'frodo agent gateway describe -i frodo-test-ig-agent --json'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/agent-gateway-import.e2e.test.js b/test/e2e/agent-gateway-import.e2e.test.js index 31bdaf54b..8fd41abae 100644 --- a/test/e2e/agent-gateway-import.e2e.test.js +++ b/test/e2e/agent-gateway-import.e2e.test.js @@ -61,7 +61,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -86,67 +86,67 @@ describe('frodo agent gateway import', () => { test(`"frodo agent gateway import -i frodo-test-ig-agent -f ${allAlphaGatewayAgentsExport}": should import the agent with the id "frodo-test-ig-agent" from the file "${allAlphaGatewayAgentsExport}"`, async () => { const CMD = `frodo agent gateway import -i frodo-test-ig-agent -f ${allAlphaGatewayAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent gateway import --agent-id frodo-test-ig-agent --file ${allAlphaGatewayAgentsExport}": should import the agent with the id "frodo-test-ig-agent" from the file "${allAlphaGatewayAgentsExport}"`, async () => { const CMD = `frodo agent gateway import --agent-id frodo-test-ig-agent --file ${allAlphaGatewayAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent gateway import -i frodo-test-ig-agent -f ${allAlphaGatewayAgentsFileName} -D ${allDirectory}": should import the agent with the id "frodo-test-ig-agent" from the file "${allAlphaGatewayAgentsExport}"`, async () => { const CMD = `frodo agent gateway import -i frodo-test-ig-agent -f ${allAlphaGatewayAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent gateway import -f ${allAlphaGatewayAgentsExport}": should import the first agent from the file "${allAlphaGatewayAgentsExport}"`, async () => { const CMD = `frodo agent gateway import -f ${allAlphaGatewayAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent gateway import --file ${allAlphaGatewayAgentsExport}": should import the first agent from the file "${allAlphaGatewayAgentsExport}"`, async () => { const CMD = `frodo agent gateway import --file ${allAlphaGatewayAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent gateway import -f ${allAlphaGatewayAgentsFileName} -D ${allDirectory}": should import the first agent from the file "${allAlphaGatewayAgentsExport}"`, async () => { const CMD = `frodo agent gateway import -f ${allAlphaGatewayAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent gateway import -af ${allAlphaGatewayAgentsExport}": should import all agents from the file "${allAlphaGatewayAgentsExport}"`, async () => { const CMD = `frodo agent gateway import -af ${allAlphaGatewayAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent gateway import --all --file ${allAlphaGatewayAgentsExport}": should import all agents from the file "${allAlphaGatewayAgentsExport}"`, async () => { const CMD = `frodo agent gateway import --all --file ${allAlphaGatewayAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent gateway import -af ${allAlphaGatewayAgentsFileName} -D ${allDirectory}": should import all agents from the file "${allAlphaGatewayAgentsExport}"`, async () => { const CMD = `frodo agent gateway import -af ${allAlphaGatewayAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent gateway import -AD ${allSeparateGatewayAgentsDirectory}": should import all agents from the ${allSeparateGatewayAgentsDirectory} directory"`, async () => { const CMD = `frodo agent gateway import -AD ${allSeparateGatewayAgentsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent gateway import --all-separate --directory ${allSeparateGatewayAgentsDirectory}": should import all agents from the ${allSeparateGatewayAgentsDirectory} directory"`, async () => { const CMD = `frodo agent gateway import --all-separate --directory ${allSeparateGatewayAgentsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/agent-gateway-list.e2e.test.js b/test/e2e/agent-gateway-list.e2e.test.js index 46b97998d..5cd1ba7f4 100644 --- a/test/e2e/agent-gateway-list.e2e.test.js +++ b/test/e2e/agent-gateway-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -73,18 +73,18 @@ describe('frodo agent gateway list', () => { test('"frodo agent gateway list": should list the ids of the gateway agents', async () => { const CMD = `frodo agent gateway list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent gateway list -l": should list the ids and statuses of the gateway agents', async () => { const CMD = `frodo agent gateway list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent gateway list --long": should list the ids and statuses of the gateway agents', async () => { const CMD = `frodo agent gateway list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/agent-import.e2e.test.js b/test/e2e/agent-import.e2e.test.js index b5c9f8ea9..879272a07 100644 --- a/test/e2e/agent-import.e2e.test.js +++ b/test/e2e/agent-import.e2e.test.js @@ -67,7 +67,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=http://openam-frodo-dev.classic.co */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c, classic_connection as cc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -91,67 +91,67 @@ describe('frodo agent import', () => { test(`"frodo agent import -i frodo-test-ig-agent -f ${allAlphaAgentsExport}": should import the agent with the id "frodo-test-ig-agent" from the file "${allAlphaAgentsExport}"`, async () => { const CMD = `frodo agent import -i frodo-test-ig-agent -f ${allAlphaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import --agent-id frodo-test-ig-agent --file ${allAlphaAgentsExport}": should import the agent with the id "frodo-test-ig-agent" from the file "${allAlphaAgentsExport}"`, async () => { const CMD = `frodo agent import --agent-id frodo-test-ig-agent --file ${allAlphaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import -i frodo-test-ig-agent -f ${allAlphaAgentsFileName} -D ${allDirectory}": should import the agent with the id "frodo-test-ig-agent" from the file "${allAlphaAgentsExport}"`, async () => { const CMD = `frodo agent import -i frodo-test-ig-agent -f ${allAlphaAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import -f ${allAlphaAgentsExport}": should import the first agent from the file "${allAlphaAgentsExport}"`, async () => { const CMD = `frodo agent import -f ${allAlphaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import --file ${allAlphaAgentsExport}": should import the first agent from the file "${allAlphaAgentsExport}"`, async () => { const CMD = `frodo agent import --file ${allAlphaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import -f ${allAlphaAgentsFileName} -D ${allDirectory}": should import the first agent from the file "${allAlphaAgentsExport}"`, async () => { const CMD = `frodo agent import -f ${allAlphaAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import -af ${allAlphaAgentsExport}": should import all agents from the file "${allAlphaAgentsExport}"`, async () => { const CMD = `frodo agent import -af ${allAlphaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import --all --file ${allAlphaAgentsExport}": should import all agents from the file "${allAlphaAgentsExport}"`, async () => { const CMD = `frodo agent import --all --file ${allAlphaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import -af ${allAlphaAgentsFileName} -D ${allDirectory}": should import all agents from the file "${allAlphaAgentsExport}"`, async () => { const CMD = `frodo agent import -af ${allAlphaAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import -AD ${allSeparateAgentsDirectory}": should import all agents from the ${allSeparateAgentsDirectory} directory"`, async () => { const CMD = `frodo agent import -AD ${allSeparateAgentsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import --all-separate --directory ${allSeparateAgentsDirectory}": should import all agents from the ${allSeparateAgentsDirectory} directory"`, async () => { const CMD = `frodo agent import --all-separate --directory ${allSeparateAgentsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); @@ -159,25 +159,25 @@ describe('frodo agent import', () => { test(`"frodo agent import -i AgentService -gf ${allGlobalAgentsExport} -m classic": should import the global agent with the id "AgentService" from the file "${allGlobalAgentsExport}"`, async () => { const CMD = `frodo agent import -i AgentService -gf ${allGlobalAgentsExport} -m classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import -gf ${allGlobalAgentsExport} -m classic": should import the first global agent from the file "${allGlobalAgentsExport}"`, async () => { const CMD = `frodo agent import -gf ${allGlobalAgentsExport} -m classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import -gaf ${allGlobalAgentsExport} -m classic": should import all global agents from the file "${allGlobalAgentsExport}"`, async () => { const CMD = `frodo agent import -gaf ${allGlobalAgentsExport} -m classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo agent import --global -AD ${allSeparateGlobalAgentsDirectory} --type classic": should import all global agents from the ${allSeparateGlobalAgentsDirectory} directory"`, async () => { const CMD = `frodo agent import --global -AD ${allSeparateGlobalAgentsDirectory} --type classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/agent-java-delete.e2e.test.js b/test/e2e/agent-java-delete.e2e.test.js index 8a271079e..b1774a160 100644 --- a/test/e2e/agent-java-delete.e2e.test.js +++ b/test/e2e/agent-java-delete.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { clearFixture, getEnv, removeAnsiEscapeCodes, stageFixture } from './utils/TestUtils'; +import { clearFixture, getEnv, stageFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -87,7 +87,7 @@ describe('frodo agent java delete', () => { test('"frodo agent java delete -i frodo-test-java-agent": should delete the java agent with id \'frodo-test-java-agent\'', async () => { const CMD = deleteAgent; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent java delete --agent-id frodo-test-java-agent": should display error when the java agent with id \'frodo-test-java-agent\' cannot be deleted since it does not exist', async () => { @@ -96,20 +96,20 @@ describe('frodo agent java delete', () => { await exec(CMD, env); fail("Command should've failed") } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test('"frodo agent java delete -a": should delete all java agents', async () => { const CMD = deleteAllAgents; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent java delete --all": should do nothing when no java agent can be deleted since none exist', async () => { const CMD = 'frodo agent java delete --all'; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/agent-java-describe.e2e.test.js b/test/e2e/agent-java-describe.e2e.test.js index 5799cb643..8090e8b04 100644 --- a/test/e2e/agent-java-describe.e2e.test.js +++ b/test/e2e/agent-java-describe.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -73,12 +73,12 @@ describe('frodo agent java describe', () => { test('"frodo agent java describe -i frodo-test-java-agent": should describe java agent in table format', async () => { const CMD = 'frodo agent java describe -i frodo-test-java-agent'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent java describe -i frodo-test-java-agent --json": should describe java agent in JSON format', async () => { const CMD = 'frodo agent java describe -i frodo-test-java-agent --json'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/agent-java-import.e2e.test.js b/test/e2e/agent-java-import.e2e.test.js index ca4fc4d27..4d8afac96 100644 --- a/test/e2e/agent-java-import.e2e.test.js +++ b/test/e2e/agent-java-import.e2e.test.js @@ -61,7 +61,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -86,67 +86,67 @@ describe('frodo agent java import', () => { test(`"frodo agent java import -i frodo-test-java-agent -f ${allAlphaJavaAgentsExport}": should import the agent with the id "frodo-test-java-agent" from the file "${allAlphaJavaAgentsExport}"`, async () => { const CMD = `frodo agent java import -i frodo-test-java-agent -f ${allAlphaJavaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent java import --agent-id frodo-test-java-agent --file ${allAlphaJavaAgentsExport}": should import the agent with the id "frodo-test-java-agent" from the file "${allAlphaJavaAgentsExport}"`, async () => { const CMD = `frodo agent java import --agent-id frodo-test-java-agent --file ${allAlphaJavaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent java import -i frodo-test-java-agent -f ${allAlphaJavaAgentsFileName} -D ${allDirectory}": should import the agent with the id "frodo-test-java-agent" from the file "${allAlphaJavaAgentsExport}"`, async () => { const CMD = `frodo agent java import -i frodo-test-java-agent -f ${allAlphaJavaAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent java import -f ${allAlphaJavaAgentsExport}": should import the first agent from the file "${allAlphaJavaAgentsExport}"`, async () => { const CMD = `frodo agent java import -f ${allAlphaJavaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent java import --file ${allAlphaJavaAgentsExport}": should import the first agent from the file "${allAlphaJavaAgentsExport}"`, async () => { const CMD = `frodo agent java import --file ${allAlphaJavaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent java import -f ${allAlphaJavaAgentsFileName} -D ${allDirectory}": should import the first agent from the file "${allAlphaJavaAgentsExport}"`, async () => { const CMD = `frodo agent java import -f ${allAlphaJavaAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent java import -af ${allAlphaJavaAgentsExport}": should import all agents from the file "${allAlphaJavaAgentsExport}"`, async () => { const CMD = `frodo agent java import -af ${allAlphaJavaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent java import --all --file ${allAlphaJavaAgentsExport}": should import all agents from the file "${allAlphaJavaAgentsExport}"`, async () => { const CMD = `frodo agent java import --all --file ${allAlphaJavaAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent java import -af ${allAlphaJavaAgentsFileName} -D ${allDirectory}": should import all agents from the file "${allAlphaJavaAgentsExport}"`, async () => { const CMD = `frodo agent java import -af ${allAlphaJavaAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent java import -AD ${allSeparateJavaAgentsDirectory}": should import all agents from the ${allSeparateJavaAgentsDirectory} directory"`, async () => { const CMD = `frodo agent java import -AD ${allSeparateJavaAgentsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent java import --all-separate --directory ${allSeparateJavaAgentsDirectory}": should import all agents from the ${allSeparateJavaAgentsDirectory} directory"`, async () => { const CMD = `frodo agent java import --all-separate --directory ${allSeparateJavaAgentsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/agent-java-list.e2e.test.js b/test/e2e/agent-java-list.e2e.test.js index 3f752d081..8b10e3f2c 100644 --- a/test/e2e/agent-java-list.e2e.test.js +++ b/test/e2e/agent-java-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -73,18 +73,18 @@ describe('frodo agent java list', () => { test('"frodo agent java list": should list the ids of the java agents', async () => { const CMD = `frodo agent java list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent java list -l": should list the ids and statuses of the java agents', async () => { const CMD = `frodo agent java list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent java list --long": should list the ids and statuses of the java agents', async () => { const CMD = `frodo agent java list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/agent-list.e2e.test.js b/test/e2e/agent-list.e2e.test.js index 21fb4cfa0..0a4e7c2f7 100644 --- a/test/e2e/agent-list.e2e.test.js +++ b/test/e2e/agent-list.e2e.test.js @@ -55,7 +55,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=http://openam-frodo-dev.classic.co */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c, classic_connection as cc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -71,13 +71,13 @@ describe('frodo agent list', () => { test('"frodo agent list": should list the ids of the agents', async () => { const CMD = `frodo agent list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent list -l": should list the ids, statuses, and types of the agents', async () => { const CMD = `frodo agent list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); @@ -85,13 +85,13 @@ describe('frodo agent list', () => { test('"frodo agent list -gm classic": should list the ids of the global agents', async () => { const CMD = `frodo agent list -gm classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent list --global --long --type classic": should list the ids and statuses of the global agents', async () => { const CMD = `frodo agent list --global --long --type classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); }); diff --git a/test/e2e/agent-web-delete.e2e.test.js b/test/e2e/agent-web-delete.e2e.test.js index 3e6318b31..092ca0b09 100644 --- a/test/e2e/agent-web-delete.e2e.test.js +++ b/test/e2e/agent-web-delete.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { clearFixture, getEnv, removeAnsiEscapeCodes, stageFixture } from './utils/TestUtils'; +import { clearFixture, getEnv, stageFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -87,7 +87,7 @@ describe('frodo agent web delete', () => { test('"frodo agent web delete -i frodo-test-web-agent": should delete the web agent with id \'frodo-test-web-agent\'', async () => { const CMD = deleteAgent; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent web delete --agent-id frodo-test-web-agent": should display error when the web agent with id \'frodo-test-web-agent\' cannot be deleted since it does not exist', async () => { @@ -96,20 +96,20 @@ describe('frodo agent web delete', () => { await exec(CMD, env); fail("Command should've failed") } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test('"frodo agent web delete -a": should delete all web agents', async () => { const CMD = deleteAllAgents; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent web delete --all": should do nothing when no web agent can be deleted', async () => { const CMD = 'frodo agent web delete --all'; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/agent-web-describe.e2e.test.js b/test/e2e/agent-web-describe.e2e.test.js index 6c78d4761..29a07d5d4 100644 --- a/test/e2e/agent-web-describe.e2e.test.js +++ b/test/e2e/agent-web-describe.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -73,12 +73,12 @@ describe('frodo agent web describe', () => { test('"frodo agent web describe -i frodo-test-web-agent": should describe web agent in table format', async () => { const CMD = 'frodo agent web describe -i frodo-test-web-agent'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo agent web describe -i frodo-test-web-agent --json": should describe web agent in JSON format', async () => { const CMD = 'frodo agent web describe -i frodo-test-web-agent --json'; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/agent-web-import.e2e.test.js b/test/e2e/agent-web-import.e2e.test.js index 634fcc40e..666186916 100644 --- a/test/e2e/agent-web-import.e2e.test.js +++ b/test/e2e/agent-web-import.e2e.test.js @@ -61,7 +61,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -87,66 +87,66 @@ describe('frodo agent web import', () => { test(`"frodo agent web import -i frodo-test-web-agent -f ${allAlphaWebAgentsExport}": should import the agent with the id "frodo-test-web-agent" from the file "${allAlphaWebAgentsExport}"`, async () => { const CMD = `frodo agent web import -i frodo-test-web-agent -f ${allAlphaWebAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent web import --agent-id frodo-test-web-agent --file ${allAlphaWebAgentsExport}": should import the agent with the id "frodo-test-web-agent" from the file "${allAlphaWebAgentsExport}"`, async () => { const CMD = `frodo agent web import --agent-id frodo-test-web-agent --file ${allAlphaWebAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent web import -i frodo-test-web-agent -f ${allAlphaWebAgentsFileName} -D ${allDirectory}": should import the agent with the id "frodo-test-web-agent" from the file "${allAlphaWebAgentsExport}"`, async () => { const CMD = `frodo agent web import -i frodo-test-web-agent -f ${allAlphaWebAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent web import -f ${allAlphaWebAgentsExport}": should import the first agent from the file "${allAlphaWebAgentsExport}"`, async () => { const CMD = `frodo agent web import -f ${allAlphaWebAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent web import --file ${allAlphaWebAgentsExport}": should import the first agent from the file "${allAlphaWebAgentsExport}"`, async () => { const CMD = `frodo agent web import --file ${allAlphaWebAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent web import -f ${allAlphaWebAgentsFileName} -D ${allDirectory}": should import the first agent from the file "${allAlphaWebAgentsExport}"`, async () => { const CMD = `frodo agent web import -f ${allAlphaWebAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent web import -af ${allAlphaWebAgentsExport}": should import all agents from the file "${allAlphaWebAgentsExport}"`, async () => { const CMD = `frodo agent web import -af ${allAlphaWebAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent web import --all --file ${allAlphaWebAgentsExport}": should import all agents from the file "${allAlphaWebAgentsExport}"`, async () => { const CMD = `frodo agent web import --all --file ${allAlphaWebAgentsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent web import -af ${allAlphaWebAgentsFileName} -D ${allDirectory}": should import all agents from the file "${allAlphaWebAgentsExport}"`, async () => { const CMD = `frodo agent web import -af ${allAlphaWebAgentsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent web import -AD ${allSeparateWebAgentsDirectory}": should import all agents from the ${allSeparateWebAgentsDirectory} directory"`, async () => { const CMD = `frodo agent web import -AD ${allSeparateWebAgentsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo agent web import --all-separate --directory ${allSeparateWebAgentsDirectory}": should import all agents from the ${allSeparateWebAgentsDirectory} directory"`, async () => { const CMD = `frodo agent web import --all-separate --directory ${allSeparateWebAgentsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/agent-web-list.e2e.test.js b/test/e2e/agent-web-list.e2e.test.js index 0fb124b13..0c293c901 100644 --- a/test/e2e/agent-web-list.e2e.test.js +++ b/test/e2e/agent-web-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, stageFixture, clearFixture } from './utils/TestUtils'; +import { getEnv, stageFixture, clearFixture } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -73,18 +73,18 @@ describe('frodo agent web list', () => { test('"frodo agent web list": should list the ids of the web agents', async () => { const CMD = `frodo agent web list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent web list -l": should list the ids and statuses of the web agents', async () => { const CMD = `frodo agent web list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo agent web list --long": should list the ids and statuses of the web agents', async () => { const CMD = `frodo agent web list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/app-import.e2e.test.js b/test/e2e/app-import.e2e.test.js index 4186161de..85be7c6e2 100644 --- a/test/e2e/app-import.e2e.test.js +++ b/test/e2e/app-import.e2e.test.js @@ -68,7 +68,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c, forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -91,61 +91,61 @@ describe('frodo app import', () => { test(`"frodo app import --no-deps -i e124e6f6-e25a-4180-a6c3-ff8b782a422c -f ${allAlphaApplicationsExport}": should import the application with the id "e124e6f6-e25a-4180-a6c3-ff8b782a422c" from the file "${allAlphaApplicationsExport}" with no dependencies`, async () => { const CMD = `frodo app import --no-deps -i e124e6f6-e25a-4180-a6c3-ff8b782a422c -f ${allAlphaApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --app-id e124e6f6-e25a-4180-a6c3-ff8b782a422c --file ${allAlphaApplicationsExport}": should import the application with the id "e124e6f6-e25a-4180-a6c3-ff8b782a422c" from the file "${allAlphaApplicationsExport}"`, async () => { const CMD = `frodo app import --app-id e124e6f6-e25a-4180-a6c3-ff8b782a422c --file ${allAlphaApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --no-deps -n testLDAP -f ${allAlphaApplicationsExport}": should import the application with the name "testLDAP" from the file "${allAlphaApplicationsExport}" with no dependencies`, async () => { const CMD = `frodo app import --no-deps -n testLDAP -f ${allAlphaApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --app-name testLDAP --file ${allAlphaApplicationsExport}": should import the application with the name "testLDAP" from the file "${allAlphaApplicationsExport}"`, async () => { const CMD = `frodo app import --app-name testLDAP --file ${allAlphaApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --no-deps -f ${allAlphaApplicationsExport}": should import the first application from the file "${allAlphaApplicationsExport}" with no dependencies`, async () => { const CMD = `frodo app import --no-deps -f ${allAlphaApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --file ${allAlphaApplicationsExport}": should import the first application from the file "${allAlphaApplicationsExport}"`, async () => { const CMD = `frodo app import --file ${allAlphaApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --no-deps -af ${allAlphaApplicationsExport}": should import all applications from the file "${allAlphaApplicationsExport}" with no dependencies`, async () => { const CMD = `frodo app import --no-deps -af ${allAlphaApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --all --file ${allAlphaApplicationsExport}": should import all applications from the file "${allAlphaApplicationsExport}"`, async () => { const CMD = `frodo app import --all --file ${allAlphaApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --no-deps -AD ${allSeparateApplicationsDirectory}": should import all applications from the directory "${allSeparateApplicationsDirectory}" with no dependencies`, async () => { const CMD = `frodo app import --no-deps -AD ${allSeparateApplicationsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --all-separate --directory ${allSeparateApplicationsDirectory}": should import all applications from the directory "${allSeparateApplicationsDirectory}"`, async () => { const CMD = `frodo app import --all-separate --directory ${allSeparateApplicationsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); @@ -158,7 +158,7 @@ describe('frodo app import', () => { FRODO_TEST_NAME: 'rootNoPrefix', } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --all --file ${forgeopsRootApplicationsExport} --use-realm-prefix-on-managed-objects --type forgeops": should import the 'application' apps into forgeops"`, async () => { @@ -169,7 +169,7 @@ describe('frodo app import', () => { FRODO_TEST_NAME: 'rootPrefix', } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import -af ${forgeopsRootApplicationsExport} -m forgeops": should import the 'application' apps into forgeops"`, async () => { @@ -181,7 +181,7 @@ describe('frodo app import', () => { FRODO_TEST_NAME: 'alphaNoPrefix', } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --all --file ${forgeopsAlphaApplicationsExport} --use-realm-prefix-on-managed-objects --type forgeops": should import the 'alpha_application' apps into forgeops"`, async () => { @@ -193,7 +193,7 @@ describe('frodo app import', () => { FRODO_TEST_NAME: 'alphaPrefix', } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import -af ${forgeopsRootApplicationsExport} -m forgeops": should import the 'application' apps into forgeops"`, async () => { @@ -205,7 +205,7 @@ describe('frodo app import', () => { FRODO_TEST_NAME: 'alphaBravoNoPrefix', } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo app import --all --file ${forgeopsBravoApplicationsExport} --use-realm-prefix-on-managed-objects --type forgeops": should import the 'bravo_application' apps into forgeops"`, async () => { @@ -217,7 +217,7 @@ describe('frodo app import', () => { FRODO_TEST_NAME: 'alphaBravoPrefix', } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); }); diff --git a/test/e2e/app-list.e2e.test.js b/test/e2e/app-list.e2e.test.js index 5f21fddec..6f84837c6 100644 --- a/test/e2e/app-list.e2e.test.js +++ b/test/e2e/app-list.e2e.test.js @@ -60,7 +60,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c, forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -73,13 +73,13 @@ describe('frodo app list', () => { test('"frodo app list": should list the ids of the apps', async () => { const CMD = `frodo app list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo app list -l": should list the ids, statuses, client types, grant types, scopes, and redirect URIs of the apps', async () => { const CMD = `frodo app list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo app list -lm forgeops": should list the ids, statuses, client types, grant types, scopes, and redirect URIs of "application" managed objects', async () => { @@ -90,7 +90,7 @@ describe('frodo app list', () => { FRODO_TEST_NAME: 'rootNoPrefix', } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo app list --long --use-realm-prefix-on-managed-objects --type forgeops": should list the ids, statuses, client types, grant types, scopes, and redirect URIs of "application" managed objects', async () => { @@ -101,7 +101,7 @@ describe('frodo app list', () => { FRODO_TEST_NAME: 'rootPrefix' } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo app list -lm forgeops": should list the ids, statuses, client types, grant types, scopes, and redirect URIs of "application" managed objects', async () => { @@ -113,7 +113,7 @@ describe('frodo app list', () => { FRODO_TEST_NAME: 'alphaNoPrefix' } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo app list --long --use-realm-prefix-on-managed-objects --type forgeops": should list the ids, statuses, client types, grant types, scopes, and redirect URIs of "alpha_application" managed objects', async () => { @@ -125,7 +125,7 @@ describe('frodo app list', () => { FRODO_TEST_NAME: 'alphaPrefix' } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo app list -lm forgeops": should list the ids, statuses, client types, grant types, scopes, and redirect URIs of "application" managed objects', async () => { @@ -137,7 +137,7 @@ describe('frodo app list', () => { FRODO_TEST_NAME: 'alphaBravoNoPrefix' } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo app list --long --use-realm-prefix-on-managed-objects --type forgeops": should list the ids, statuses, client types, grant types, scopes, and redirect URIs of "bravo_application" managed objects', async () => { @@ -149,6 +149,6 @@ describe('frodo app list', () => { FRODO_TEST_NAME: 'alphaBravoPrefix' } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/authn-describe.e2e.test.js b/test/e2e/authn-describe.e2e.test.js index 71c59155a..7bec5e918 100644 --- a/test/e2e/authn-describe.e2e.test.js +++ b/test/e2e/authn-describe.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=http://openam-frodo-dev.classic.com:8080/am frodo authn describe -gm classic FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=http://openam-frodo-dev.classic.com:8080/am frodo authn describe --global --json --type classic */ -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c, classic_connection as cc } from './utils/TestConfig'; import { promisify } from "util"; import cp from "child_process"; @@ -71,24 +71,24 @@ describe('frodo authn describe', () => { test('"frodo authn describe": should describe authentication settings', async () => { const CMD = `frodo authn describe`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authn describe --json": should describe authentication settings in json format', async () => { const CMD = `frodo authn describe --json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authn describe -gm classic": should describe global authentication settings', async () => { const CMD = `frodo authn describe -gm classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authn describe --global --json --type classic": should describe global authentication settings in json format', async () => { const CMD = `frodo authn describe --global --json --type classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/authn-import.e2e.test.js b/test/e2e/authn-import.e2e.test.js index d37f4372c..db79883ab 100644 --- a/test/e2e/authn-import.e2e.test.js +++ b/test/e2e/authn-import.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=http://openam-frodo-dev.classic.com:8080/am frodo authn import -gf global.authentication.settings.json -D test/e2e/exports/all-separate/classic/global/authentication -m classic FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=http://openam-frodo-dev.classic.com:8080/am frodo authn import --global --file test/e2e/exports/all-separate/classic/global/authentication/global.authentication.settings.json --type classic */ -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c, classic_connection as cc } from './utils/TestConfig'; import { promisify } from "util"; import cp from "child_process"; @@ -76,24 +76,24 @@ describe('frodo authn import', () => { test(`"frodo authn import -f ${authnSettingsDirectory}/${realmAuthnSettingsName}": should import authentication settings from the file ${realmAuthnSettingsName}`, async () => { const CMD = `frodo authn import -f ${authnSettingsDirectory}/${realmAuthnSettingsName}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authn import --file ${realmAuthnSettingsName} --directory ${authnSettingsDirectory}": should import authentication settings from the file ${realmAuthnSettingsName} in the directory ${authnSettingsDirectory}`, async () => { const CMD = `frodo authn import --file ${realmAuthnSettingsName} --directory ${authnSettingsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authn import -gf ${globalAuthnSettingsName} -D ${globalAuthnSettingsDirectory} -m classic": should import global authentication settings from the file ${globalAuthnSettingsName} in the directory ${globalAuthnSettingsDirectory}`, async () => { const CMD = `frodo authn import -gf ${globalAuthnSettingsName} -D ${globalAuthnSettingsDirectory} -m classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authn import --global --file ${globalAuthnSettingsDirectory}/${globalAuthnSettingsName} --type classic": should import global authentication settings from the file ${globalAuthnSettingsName}`, async () => { const CMD = `frodo authn import --global --file ${globalAuthnSettingsDirectory}/${globalAuthnSettingsName} --type classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/authz-policy-delete.e2e.test.js b/test/e2e/authz-policy-delete.e2e.test.js index 30b475f9a..f5c537df6 100644 --- a/test/e2e/authz-policy-delete.e2e.test.js +++ b/test/e2e/authz-policy-delete.e2e.test.js @@ -55,7 +55,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,7 +68,7 @@ describe('frodo authz policy delete', () => { test('"frodo authz policy delete -i \'Test Policy\'": should delete the policies with id \'Test Policy\'', async () => { const CMD = `frodo authz policy delete -i 'Test Policy'`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz policy delete --policy-id \'Test Policy\'": should display error when the policies with id \'Test Policy\' cannot be deleted since it does not exist', async () => { @@ -77,26 +77,26 @@ describe('frodo authz policy delete', () => { await exec(CMD, env); fail("Command should've failed") } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test('"frodo authz policy delete -a": should delete all policies', async () => { const CMD = `frodo authz policy delete -a`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz policy delete --all --set-id test-policy-set": should delete all policies in the test-policy-set set', async () => { const CMD = `frodo authz policy delete --all --set-id test-policy-set`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz policy delete --all": should do nothing when no policies can be deleted', async () => { const CMD = `frodo authz policy delete --all`; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/authz-policy-describe.e2e.test.js b/test/e2e/authz-policy-describe.e2e.test.js index 59bb2c923..63efd8c0f 100644 --- a/test/e2e/authz-policy-describe.e2e.test.js +++ b/test/e2e/authz-policy-describe.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo authz policy describe', () => { test('"frodo authz policy describe -i "Test Policy"": should describe the "Test Policy" policy', async () => { const CMD = `frodo authz policy describe -i "Test Policy"`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz policy describe --policy-id "Test Policy"": should describe the "Test Policy" policy', async () => { const CMD = `frodo authz policy describe --policy-id "Test Policy"`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz policy describe -i "Test Policy" --json": should describe the "Test Policy" policy in json', async () => { const CMD = `frodo authz policy describe -i "Test Policy" --json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/authz-policy-import.e2e.test.js b/test/e2e/authz-policy-import.e2e.test.js index f78e93024..d5da899e3 100644 --- a/test/e2e/authz-policy-import.e2e.test.js +++ b/test/e2e/authz-policy-import.e2e.test.js @@ -63,7 +63,7 @@ import cp from 'child_process'; import { promisify } from 'util'; import { getEnv, - removeAnsiEscapeCodes, + } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; @@ -81,55 +81,55 @@ describe('frodo authz policy import', () => { test(`"frodo authz policy import -i 'Test Policy' -f ${allAlphaPoliciesExport}": should import the policy with the id "Test Policy" from the file "${allAlphaPoliciesExport}"`, async () => { const CMD = `frodo authz policy import -i 'Test Policy' -f ${allAlphaPoliciesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz policy import --policy-id 'Test Policy' --file ${allAlphaPoliciesExport} --set-id test-policy-set --no-deps --prereqs": should import the policy with the id "Test Policy" from the file "${allAlphaPoliciesExport}" with no dependencies`, async () => { const CMD = `frodo authz policy import --policy-id 'Test Policy' --file ${allAlphaPoliciesExport} --set-id test-policy-set --no-deps --prereqs`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz policy import -i 'Test Policy' -f ${allAlphaPoliciesFileName} -D ${allDirectory}": should import the policy with the id "Test Policy" from the file "${allAlphaPoliciesExport}"`, async () => { const CMD = `frodo authz policy import -i 'Test Policy' -f ${allAlphaPoliciesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz policy import -f ${allAlphaPoliciesExport}": should import the first policy from the file "${allAlphaPoliciesExport}"`, async () => { const CMD = `frodo authz policy import -f ${allAlphaPoliciesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz policy import --file ${allAlphaPoliciesExport} --set-id test-policy-set --no-deps --prereqs": should import the first policy from the file "${allAlphaPoliciesExport}" with no dependencies`, async () => { const CMD = `frodo authz policy import --file ${allAlphaPoliciesExport} --set-id test-policy-set --no-deps --prereqs`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz policy import -f ${allAlphaPoliciesFileName} -D ${allDirectory}": should import the first policy from the file "${allAlphaPoliciesExport}"`, async () => { const CMD = `frodo authz policy import -f ${allAlphaPoliciesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz policy import -af ${allAlphaPoliciesExport}": should import all policies from the file "${allAlphaPoliciesExport}"`, async () => { const CMD = `frodo authz policy import -af ${allAlphaPoliciesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz policy import --all --file ${allAlphaPoliciesExport} --set-id test-policy-set --no-deps --prereqs": should import all policies from the file "${allAlphaPoliciesExport}" with no dependencies`, async () => { const CMD = `frodo authz policy import --all --file ${allAlphaPoliciesExport} --set-id test-policy-set --no-deps --prereqs`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz policy import -af ${allAlphaPoliciesFileName} -D ${allDirectory}": should import all policies from the file "${allAlphaPoliciesExport}"`, async () => { const CMD = `frodo authz policy import -af ${allAlphaPoliciesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz policy import -AD ${allSeparatePoliciesSetsDirectory}": should fail when dependency definitions are not included in the separate export files`, async () => { @@ -138,7 +138,7 @@ describe('frodo authz policy import', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); @@ -148,7 +148,7 @@ describe('frodo authz policy import', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); diff --git a/test/e2e/authz-policy-list.e2e.test.js b/test/e2e/authz-policy-list.e2e.test.js index 58cd2ced9..7c8e91170 100644 --- a/test/e2e/authz-policy-list.e2e.test.js +++ b/test/e2e/authz-policy-list.e2e.test.js @@ -57,7 +57,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -69,36 +69,36 @@ describe('frodo authz policy list', () => { test('"frodo authz policy list": should list the ids of the authz policies', async () => { const CMD = `frodo authz policy list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz policy list -l": should list the ids, descriptions, and statuses of the authz policies', async () => { const CMD = `frodo authz policy list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz policy list --long": should list the ids, descriptions, and statuses of the authz policies', async () => { const CMD = `frodo authz policy list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz policy list --set-id test-policy-set": should list the ids of the authz policies in the test-policy-set set', async () => { const CMD = `frodo authz policy list --set-id test-policy-set`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz policy list -l --set-id test-policy-set": should list the ids, descriptions, and statuses of the authz policies in the test-policy-set set', async () => { const CMD = `frodo authz policy list -l --set-id test-policy-set`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz policy list --long --set-id test-policy-set": should list the ids, descriptions, and statuses of the authz policies in the test-policy-set set', async () => { const CMD = `frodo authz policy list --long --set-id test-policy-set`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/authz-set-delete.e2e.test.js b/test/e2e/authz-set-delete.e2e.test.js index c0c427147..aed6bf4da 100644 --- a/test/e2e/authz-set-delete.e2e.test.js +++ b/test/e2e/authz-set-delete.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -66,7 +66,7 @@ describe('frodo authz set delete', () => { test('"frodo authz set delete -i test-policy-set": should delete the policy set with id \'test-policy-set\'', async () => { const CMD = `frodo authz set delete -i test-policy-set`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz set delete --set-id test-policy-set": should display error when the policy set with id \'test-policy-set\' cannot be deleted since it does not exist', async () => { @@ -75,19 +75,19 @@ describe('frodo authz set delete', () => { const { stderr } = await exec(CMD, env); fail(`Command expected to fail: ${CMD}`); } catch (error) { - expect(removeAnsiEscapeCodes(error.stderr)).toMatchSnapshot(); + expect(error.stderr).toMatchSnapshot(); } }); test('"frodo authz set delete -a": should delete all policy sets', async () => { const CMD = `frodo authz set delete -a`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz set delete --all": should do nothing when no policy sets can be deleted', async () => { const CMD = `frodo authz set delete --all`; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/authz-set-describe.e2e.test.js b/test/e2e/authz-set-describe.e2e.test.js index 323aa4c9a..bb2dd6f22 100644 --- a/test/e2e/authz-set-describe.e2e.test.js +++ b/test/e2e/authz-set-describe.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo authz set describe', () => { test('"frodo authz set describe -i test-policy-set": should describe the test-policy-set set', async () => { const CMD = `frodo authz set describe -i test-policy-set`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz set describe --set-id test-policy-set": should describe the test-policy-set set', async () => { const CMD = `frodo authz set describe --set-id test-policy-set`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz set describe -i test-policy-set --json": should describe the test-policy-set set in json', async () => { const CMD = `frodo authz set describe -i test-policy-set --json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/authz-set-import.e2e.test.js b/test/e2e/authz-set-import.e2e.test.js index b025edd1e..ff6b31319 100644 --- a/test/e2e/authz-set-import.e2e.test.js +++ b/test/e2e/authz-set-import.e2e.test.js @@ -61,7 +61,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -78,61 +78,61 @@ describe('frodo authz set import', () => { test(`"frodo authz set import -i 'test-policy-set' -f ${allAlphaPolicySetsExport}": should import the policy set with the id "test-policy-set" from the file "${allAlphaPolicySetsExport}"`, async () => { const CMD = `frodo authz set import -i 'test-policy-set' -f ${allAlphaPolicySetsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz set import --set-id 'test-policy-set' --file ${allAlphaPolicySetsExport} --no-deps --prereqs": should import the policy set with the id "test-policy-set" from the file "${allAlphaPolicySetsExport}" with no dependencies`, async () => { const CMD = `frodo authz set import --set-id 'test-policy-set' --file ${allAlphaPolicySetsExport} --no-deps --prereqs`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz set import -i 'test-policy-set' -f ${allAlphaPolicySetsFileName} -D ${allDirectory}": should import the policy set with the id "test-policy-set" from the file "${allAlphaPolicySetsExport}"`, async () => { const CMD = `frodo authz set import -i 'test-policy-set' -f ${allAlphaPolicySetsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz set import -f ${allAlphaPolicySetsExport}": should import the first policy set from the file "${allAlphaPolicySetsExport}"`, async () => { const CMD = `frodo authz set import -f ${allAlphaPolicySetsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz set import --file ${allAlphaPolicySetsExport} --no-deps --prereqs": should import the first policy set from the file "${allAlphaPolicySetsExport}" with no dependencies`, async () => { const CMD = `frodo authz set import --file ${allAlphaPolicySetsExport} --no-deps --prereqs`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz set import -f ${allAlphaPolicySetsFileName} -D ${allDirectory}": should import the first policy set from the file "${allAlphaPolicySetsExport}"`, async () => { const CMD = `frodo authz set import -f ${allAlphaPolicySetsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz set import -af ${allAlphaPolicySetsExport}": should import all policy sets from the file "${allAlphaPolicySetsExport}"`, async () => { const CMD = `frodo authz set import -af ${allAlphaPolicySetsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz set import --all --file ${allAlphaPolicySetsExport} --no-deps --prereqs": should import all policy sets from the file "${allAlphaPolicySetsExport}" with no dependencies`, async () => { const CMD = `frodo authz set import --all --file ${allAlphaPolicySetsExport} --no-deps --prereqs`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz set import -af ${allAlphaPolicySetsFileName} -D ${allDirectory}": should import all policy sets from the file "${allAlphaPolicySetsExport}"`, async () => { const CMD = `frodo authz set import -af ${allAlphaPolicySetsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz set import -AD ${allSeparatePolicySetsDirectory}": should import all policy sets from the ${allSeparatePolicySetsDirectory} directory"`, async () => { const CMD = `frodo authz set import -AD ${allSeparatePolicySetsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz set import --all-separate --no-deps --prereqs --directory ${allSeparatePolicySetsDirectory}": should fail when prerequisite resource type definitions are not included in the separate export files`, async () => { @@ -141,7 +141,7 @@ describe('frodo authz set import', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); diff --git a/test/e2e/authz-set-list.e2e.test.js b/test/e2e/authz-set-list.e2e.test.js index a777377f2..8a2452911 100644 --- a/test/e2e/authz-set-list.e2e.test.js +++ b/test/e2e/authz-set-list.e2e.test.js @@ -51,7 +51,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -63,6 +63,6 @@ describe('frodo authz set list', () => { test('"frodo authz set list": should list the names of the authz sets', async () => { const CMD = `frodo authz set list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/authz-type-delete.e2e.test.js b/test/e2e/authz-type-delete.e2e.test.js index d2d9d9656..2f7d1761a 100644 --- a/test/e2e/authz-type-delete.e2e.test.js +++ b/test/e2e/authz-type-delete.e2e.test.js @@ -56,7 +56,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,7 +68,7 @@ describe('frodo authz type delete', () => { test('"frodo authz type delete -n FrodoTestResourceType13": should delete the resource type with name FrodoTestResourceType13', async () => { const CMD = `frodo authz type delete -n FrodoTestResourceType13`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz type delete --type-name FrodoTestResourceType13": should display error when the resource type with name FrodoTestResourceType13 cannot be deleted since it does not exist', async () => { @@ -78,14 +78,14 @@ describe('frodo authz type delete', () => { await exec(CMD, env); fail(`Command expected to fail: ${CMD}`); } catch (error) { - expect(removeAnsiEscapeCodes(error.stderr)).toMatchSnapshot(); + expect(error.stderr).toMatchSnapshot(); } }); test('"frodo authz type delete -i 0aa5ed25-0c62-4ff5-9a42-3bda8c5cbb76": should delete the resource type with id 0aa5ed25-0c62-4ff5-9a42-3bda8c5cbb76', async () => { const CMD = `frodo authz type delete -i 0aa5ed25-0c62-4ff5-9a42-3bda8c5cbb76`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz type delete --type-id 0aa5ed25-0c62-4ff5-9a42-3bda8c5cbb76": should display error when the resource type with id 0aa5ed25-0c62-4ff5-9a42-3bda8c5cbb76 cannot be deleted since it does not exist', async () => { @@ -95,7 +95,7 @@ describe('frodo authz type delete', () => { await exec(CMD, env); fail(`Command expected to fail: ${CMD}`); } catch (error) { - expect(removeAnsiEscapeCodes(error.stderr)).toMatchSnapshot(); + expect(error.stderr).toMatchSnapshot(); } }); @@ -103,13 +103,13 @@ describe('frodo authz type delete', () => { test.skip('"frodo authz type delete -a": should delete all resource types', async () => { const CMD = `frodo authz type delete -a`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); //TODO: Generate mock for this test (skip for meantime) test.skip('"frodo authz type delete --all": should do nothing when no resource types can be deleted', async () => { const CMD = `frodo authz type delete --all`; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/authz-type-describe.e2e.test.js b/test/e2e/authz-type-describe.e2e.test.js index 32e183e57..70104fbd8 100644 --- a/test/e2e/authz-type-describe.e2e.test.js +++ b/test/e2e/authz-type-describe.e2e.test.js @@ -56,7 +56,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,36 +68,36 @@ describe('frodo authz type describe', () => { test('"frodo authz type describe -i 76656a38-5f8e-401b-83aa-4ccb74ce88d2": should describe the 76656a38-5f8e-401b-83aa-4ccb74ce88d2 resource type', async () => { const CMD = `frodo authz type describe -i 76656a38-5f8e-401b-83aa-4ccb74ce88d2`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz type describe --type-id 76656a38-5f8e-401b-83aa-4ccb74ce88d2": should describe the 76656a38-5f8e-401b-83aa-4ccb74ce88d2 resource type', async () => { const CMD = `frodo authz type describe --type-id 76656a38-5f8e-401b-83aa-4ccb74ce88d2`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz type describe -i 76656a38-5f8e-401b-83aa-4ccb74ce88d2 --json": should describe the 76656a38-5f8e-401b-83aa-4ccb74ce88d2 resource type in json', async () => { const CMD = `frodo authz type describe -i 76656a38-5f8e-401b-83aa-4ccb74ce88d2 --json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz type describe -n URL": should describe the URL resource type', async () => { const CMD = `frodo authz type describe -n URL`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz type describe --type-name URL": should describe the URL resource type', async () => { const CMD = `frodo authz type describe --type-name URL`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz type describe -n URL --json": should describe the URL resource type in json', async () => { const CMD = `frodo authz type describe -n URL --json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/authz-type-import.e2e.test.js b/test/e2e/authz-type-import.e2e.test.js index bf73e505d..e5c4a38d3 100644 --- a/test/e2e/authz-type-import.e2e.test.js +++ b/test/e2e/authz-type-import.e2e.test.js @@ -64,7 +64,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -82,86 +82,86 @@ describe('frodo authz type import', () => { test(`"frodo authz type import -n URL -f ${allAlphaResourceTypesExport}": should import the resource type with the name "URL" from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import -n URL -f ${allAlphaResourceTypesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import --type-name URL --file ${allAlphaResourceTypesExport}": should import the resource with the name "URL" from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import --type-name URL --file ${allAlphaResourceTypesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import -n URL -f ${allAlphaResourceTypesFileName} -D ${allDirectory}": should import the resource type with the name "URL" from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import -n URL -f ${allAlphaResourceTypesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import -i 76656a38-5f8e-401b-83aa-4ccb74ce88d2 -f ${allAlphaResourceTypesExport}": should import the resource type with the id "76656a38-5f8e-401b-83aa-4ccb74ce88d2" from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import -i 76656a38-5f8e-401b-83aa-4ccb74ce88d2 -f ${allAlphaResourceTypesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import --type-id 76656a38-5f8e-401b-83aa-4ccb74ce88d2 --file ${allAlphaResourceTypesExport}": should import the resource type with the id "76656a38-5f8e-401b-83aa-4ccb74ce88d2" from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import --type-id 76656a38-5f8e-401b-83aa-4ccb74ce88d2 --file ${allAlphaResourceTypesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import -i 76656a38-5f8e-401b-83aa-4ccb74ce88d2 -f ${allAlphaResourceTypesFileName} -D ${allDirectory}": should import the resource type with the id "76656a38-5f8e-401b-83aa-4ccb74ce88d2" from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import -i 76656a38-5f8e-401b-83aa-4ccb74ce88d2 -f ${allAlphaResourceTypesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import -f ${allAlphaResourceTypesExport}": should import the first resource type from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import -f ${allAlphaResourceTypesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import --file ${allAlphaResourceTypesExport}": should import the first resource type from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import --file ${allAlphaResourceTypesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import -f ${allAlphaResourceTypesFileName} -D ${allDirectory}": should import the first resource type from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import -f ${allAlphaResourceTypesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import -af ${allAlphaResourceTypesExport}": should import all resource types from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import -af ${allAlphaResourceTypesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import --all --file ${allAlphaResourceTypesExport}": should import all resource types from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import --all --file ${allAlphaResourceTypesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import -af ${allAlphaResourceTypesFileName} -D ${allDirectory}": should import all resource types from the file "${allAlphaResourceTypesExport}"`, async () => { const CMD = `frodo authz type import -af ${allAlphaResourceTypesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import -AD ${allSeparateResourceTypesDirectory}": should import all resource types from the ${allSeparateResourceTypesDirectory} directory"`, async () => { const CMD = `frodo authz type import -AD ${allSeparateResourceTypesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo authz type import --all-separate --directory ${allSeparateResourceTypesDirectory}": should import all resource types from the ${allSeparateResourceTypesDirectory} directory"`, async () => { const CMD = `frodo authz type import --all-separate --directory ${allSeparateResourceTypesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/authz-type-list.e2e.test.js b/test/e2e/authz-type-list.e2e.test.js index 64ff64b56..38128a766 100644 --- a/test/e2e/authz-type-list.e2e.test.js +++ b/test/e2e/authz-type-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo authz type list', () => { test('"frodo authz type list": should list the names of the authz types', async () => { const CMD = `frodo authz type list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz type list -l": should list the names, descriptions, and uuids of the authz types', async () => { const CMD = `frodo authz type list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo authz type list --long": should list the names, descriptions, and uuids of the authz types', async () => { const CMD = `frodo authz type list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/config-manager-export-iga-workflows.e2e.test.js b/test/e2e/config-manager-export-iga-workflows.e2e.test.js new file mode 100644 index 000000000..6964d65af --- /dev/null +++ b/test/e2e/config-manager-export-iga-workflows.e2e.test.js @@ -0,0 +1,90 @@ +/** + * Follow this process to write e2e tests for the CLI project: + * + * 1. Test if all the necessary mocks for your tests already exist. + * In mock mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=1 frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * If your command completes without errors and with the expected results, + * all the required mocks already exist and you are good to write your + * test and skip to step #4. + * + * If, however, your command fails and you see errors like the one below, + * you know you need to record the mock responses first: + * + * [Polly] [adapter:node-http] Recording for the following request is not found and `recordIfMissing` is `false`. + * + * 2. Record mock responses for your exact command. + * In mock record mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=record frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * Wait until you see all the Polly instances (mock recording adapters) have + * shutdown before you try to run step #1 again. + * Messages like these indicate mock recording adapters shutting down: + * + * Polly instance 'conn/4' stopping in 3s... + * Polly instance 'conn/4' stopping in 2s... + * Polly instance 'conn/save/3' stopping in 3s... + * Polly instance 'conn/4' stopping in 1s... + * Polly instance 'conn/save/3' stopping in 2s... + * Polly instance 'conn/4' stopped. + * Polly instance 'conn/save/3' stopping in 1s... + * Polly instance 'conn/save/3' stopped. + * + * 3. Validate your freshly recorded mock responses are complete and working. + * Re-run the exact command you want to test in mock mode (see step #1). + * + * 4. Write your test. + * Make sure to use the exact command including number of arguments and params. + * + * 5. Commit both your test and your new recordings to the repository. + * Your tests are likely going to reside outside the frodo-lib project but + * the recordings must be committed to the frodo-lib project. + */ + +/* +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-trivir-fairfax.forgeblocks.com/am frodo config-manager pull iga-workflows -D igaTestDir01 +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-trivir-fairfax.forgeblocks.com/am frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02 +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-trivir-fairfax.forgeblocks.com/am frodo config-manager pull iga-workflows -i -D igaTestDir03 +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-trivir-fairfax.forgeblocks.com/am frodo config-manager pull iga-workflows -i -n testWorkflow9 -D igaTestDir04 +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-trivir-fairfax.forgeblocks.com/am frodo config-manager pull iga-workflows --name testWorkflow1 -D igaTestDir05 +*/ + + +import { getEnv, testExport, testFail } from './utils/TestUtils'; +import { iga_connection as ic } from './utils/TestConfig'; + +process.env['FRODO_MOCK'] = '1'; +const env = getEnv(ic); + +describe('frodo config-manager pull ', () => { + test('"frodo config-manager pull iga-workflows -D igaTestDir01": should export the iga workflows in fr-config-manager style"', async () => { + const dirName = 'igaTestDir01'; + const CMD = `frodo config-manager pull iga-workflows -D ${dirName}`; + await testExport(CMD, env, undefined, undefined, dirName, false, true); + }); + test('"frodo config-manager pull iga-workflows -n test_workflow_4 -D igaTestDir02": should export a single iga workflow by name: test_workflow_4 in fr-config-manager style"', async () => { + const dirName = 'igaTestDir02'; + const CMD = `frodo config-manager pull iga-workflows -n test_workflow_4 -D ${dirName}`; + await testExport(CMD, env, undefined, undefined, dirName, false, true); + }); + test('"frodo config-manager pull iga-workflows -i -D igaTestDir03": should export all worfklows including immutable ones in fr-config-manager style"', async () => { + const dirName = 'igaTestDir03'; + const CMD = `frodo config-manager pull iga-workflows -i -D ${dirName}`; + await testExport(CMD, env, undefined, undefined, dirName, false, true); + }); + test('"frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D igaTestDir04": should export a non-mutable workflow when -i is set"', async () => { + const dirName = 'igaTestDir04'; + const CMD = `frodo config-manager pull iga-workflows -i -n BasicApplicationGrant -D ${dirName}`; + await testExport(CMD, env, undefined, undefined, dirName, false, true); + }); + test('"frodo config-manager pull iga-workflows --name BasicApplicationGrant -D igaTestDir05": should fail because the non-mutable workflow is not found without -i"', async () => { + const dirName = 'igaTestDir05'; + const CMD = `frodo config-manager pull iga-workflows --name BasicApplicationGrant -D ${dirName}`; + await testFail(CMD, env, undefined, undefined, dirName, false, true); + }); +}); \ No newline at end of file diff --git a/test/e2e/config-manager-push-access-config.e2e.test.js b/test/e2e/config-manager-push-access-config.e2e.test.js index 70758578f..6f555c7c0 100644 --- a/test/e2e/config-manager-push-access-config.e2e.test.js +++ b/test/e2e/config-manager-push-access-config.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,7 +67,7 @@ describe('frodo config-manager push access-config', () => { test(`"frodo config-manager push access-config -D ${allDirectory} -m forgeops": should import the access config into forgeops"`, async () => { const CMD = `frodo config-manager push access-config -D ${allDirectory} -m forgeops`; const { stdout, stderr } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); }); }); diff --git a/test/e2e/config-manager-push-audit.e2e.test.js b/test/e2e/config-manager-push-audit.e2e.test.js index 7f93541e9..7a92585bf 100644 --- a/test/e2e/config-manager-push-audit.e2e.test.js +++ b/test/e2e/config-manager-push-audit.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,6 +67,6 @@ describe('frodo config-manager push audit', () => { test(`"frodo config-manager push audit -D ${allDirectory} -m forgeops": should import the audit into forgeops"`, async () => { const CMD = `frodo config-manager push audit -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-authentication.e2e.test.js b/test/e2e/config-manager-push-authentication.e2e.test.js index 8cfa00bbe..1410ca818 100644 --- a/test/e2e/config-manager-push-authentication.e2e.test.js +++ b/test/e2e/config-manager-push-authentication.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,11 +68,11 @@ describe('frodo config-manager pulls authentication', () => { test(`"frodo config-manager push authentication -D ${allDirectory} -m forgeops": should import the authentication into forgeops"`, async () => { const CMD = `frodo config-manager push authentication -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo config-manager push authentication -r alpha -D ${allDirectory} -m forgeops": should import an authentication config by realm into forgeops"`, async () => { const CMD = `frodo config-manager push authentication -r alpha -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/config-manager-push-connector-definitions.e2e.test.js b/test/e2e/config-manager-push-connector-definitions.e2e.test.js index 93f7ed20f..39c0d7ff4 100644 --- a/test/e2e/config-manager-push-connector-definitions.e2e.test.js +++ b/test/e2e/config-manager-push-connector-definitions.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,13 +68,13 @@ describe('frodo config-manager push connector-definitions', () => { test(`"frodo config-manager push connector-definitions -D ${allDirectory} -m forgeops": should import the connector definitions into forgeops"`, async () => { const CMD = `frodo config-manager push connector-definitions -D ${allDirectory} -m forgeops`; const { stdout, stderr } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); }); test(`"frodo config-manager push connector-definitions -n csv -D ${allDirectory} -m forgeops": should import the csv connector definition into forgeops"`, async () => { const CMD = `frodo config-manager push connector-definitions -n csv -D ${allDirectory} -m forgeops`; const { stdout, stderr } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-connector-mappings.e2e.test.js b/test/e2e/config-manager-push-connector-mappings.e2e.test.js index edbf6c37e..bd85f3aec 100644 --- a/test/e2e/config-manager-push-connector-mappings.e2e.test.js +++ b/test/e2e/config-manager-push-connector-mappings.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -70,13 +70,13 @@ describe('frodo config-manager push connector mappings', () => { test(`"frodo config-manager push connector-mappings -D ${allDirectory} -m forgeops ": should import the connector mappings into forgeops"`, async () => { const CMD = `frodo config-manager push connector-mappings -D ${allDirectory} -m forgeops `; const { stdout, stderr } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); }); test(`"frodo config-manager push connector-mappings -n UserToUserJavascriptSync -D ${allDirectory} -m forgeops ": should import a specific connector mapping by name into forgeops"`, async () => { const CMD = `frodo config-manager push connector-mappings -n UserToUserJavascriptSync -D ${allDirectory} -m forgeops `; const { stdout, stderr } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-cookie-domains.e2e.test.js b/test/e2e/config-manager-push-cookie-domains.e2e.test.js index ae0eaef15..c58961845 100644 --- a/test/e2e/config-manager-push-cookie-domains.e2e.test.js +++ b/test/e2e/config-manager-push-cookie-domains.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,7 +67,7 @@ describe('frodo config-manager push cookie-domains', () => { test(`"frodo config-manager push cookie-domains -D ${allDirectory} ": should import the cookie-domains into cloud"`, async () => { const CMD = `frodo config-manager push cookie-domains -D ${allDirectory}`; const { stdout, stderr } = await exec(CMD, cloudEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-email-provider.e2e.test.js b/test/e2e/config-manager-push-email-provider.e2e.test.js index a414809ff..951e2815b 100644 --- a/test/e2e/config-manager-push-email-provider.e2e.test.js +++ b/test/e2e/config-manager-push-email-provider.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,6 +67,6 @@ describe('frodo config-manager push email-provider', () => { test(`"frodo config-manager push email-provider -D ${allDirectory} -m forgeops": should import the locales into forgeops"`, async () => { const CMD = `frodo config-manager push email-provider -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-email-templates.e2e.test.js b/test/e2e/config-manager-push-email-templates.e2e.test.js index 408d85412..809e9a3a2 100644 --- a/test/e2e/config-manager-push-email-templates.e2e.test.js +++ b/test/e2e/config-manager-push-email-templates.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,11 +68,11 @@ describe('frodo config-manager push email-templates', () => { test(`"frodo config-manager push email-templates -D ${allDirectory} -m forgeops": should import the email-templates into forgeops"`, async () => { const CMD = `frodo config-manager push email-templates -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo config-manager push email-templates -n forgottenUsername -D ${allDirectory} -m forgeops": should import a specific email-template by name into forgeops"`, async () => { const CMD = `frodo config-manager push email-templates -n forgottenUsername -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-endpoints.e2e.test.js b/test/e2e/config-manager-push-endpoints.e2e.test.js index 1b9abaff7..de7262127 100644 --- a/test/e2e/config-manager-push-endpoints.e2e.test.js +++ b/test/e2e/config-manager-push-endpoints.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,11 +68,11 @@ describe('frodo config-manager push endpoints', () => { test(`"frodo config-manager push endpoints -D ${allDirectory} -m forgeops": should import the endpoints into forgeops"`, async () => { const CMD = `frodo config-manager push endpoints -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo config-manager push endpoints -n groovy -D ${allDirectory} -m forgeops": should import a specific endpoint by name into forgeops"`, async () => { const CMD = `frodo config-manager push endpoints -n groovy -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-internal-roles.e2e.test.js b/test/e2e/config-manager-push-internal-roles.e2e.test.js index 8fc25313b..8a03f39bd 100644 --- a/test/e2e/config-manager-push-internal-roles.e2e.test.js +++ b/test/e2e/config-manager-push-internal-roles.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,11 +68,11 @@ describe('frodo config-manager push internal-roles', () => { test(`"frodo config-manager push internal-roles -D ${allDirectory} -m forgeops": should import the internal roles into forgeops"`, async () => { const CMD = `frodo config-manager push internal-roles -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo config-manager push internal-roles -n test-internal-role -D ${allDirectory} -m forgeops": should import a specific internal role by name into forgeops"`, async () => { const CMD = `frodo config-manager push internal-roles -n test-internal-role -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-kba.e2e.test.js b/test/e2e/config-manager-push-kba.e2e.test.js index c98c98b83..6d977bf1f 100644 --- a/test/e2e/config-manager-push-kba.e2e.test.js +++ b/test/e2e/config-manager-push-kba.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,7 +67,7 @@ describe('frodo config-manager push kba', () => { test(`"frodo config-manager push kba -D ${allDirectory}-m forgeops": should import KBA into forgeops"`, async () => { const CMD = `frodo config-manager push kba -D ${allDirectory} -m forgeops`; const { stdout, stderr } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-locales.e2e.test.js b/test/e2e/config-manager-push-locales.e2e.test.js index 1ab2cebcd..55ec0f50a 100644 --- a/test/e2e/config-manager-push-locales.e2e.test.js +++ b/test/e2e/config-manager-push-locales.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,10 +67,10 @@ const allDirectory = "test/e2e/exports/fr-config-manager/forgeops"; test(`"frodo config-manager push locales -D ${allDirectory} -m forgeops": should import the locales into forgeops"`, async () => { const CMD = `frodo config-manager push locales -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo config-manager push locales -n fr -D ${allDirectory} -m forgeops": should import a specific locale by name into forgeops"`, async () => { const CMD = `frodo config-manager push locales -n fr -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-managed-objects.e2e.test.js b/test/e2e/config-manager-push-managed-objects.e2e.test.js index e4b7c11ec..71aa73ede 100644 --- a/test/e2e/config-manager-push-managed-objects.e2e.test.js +++ b/test/e2e/config-manager-push-managed-objects.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,12 +68,12 @@ describe('frodo config-manager push managed-objects', () => { test(`"frodo config-manager push managed-objects -D ${allDirectory} -m forgeops": should import the managed-objects into forgeops"`, async () => { const CMD = `frodo config-manager push managed-objects -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo config-manager push managed-objects -n testObject -D ${allDirectory} -m forgeops": should import a specific managed-object by name into forgeops"`, async () => { const CMD = `frodo config-manager push managed-objects -n testObject -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-org-privileges.e2e.test.js b/test/e2e/config-manager-push-org-privileges.e2e.test.js index fa730f2a3..998a03151 100644 --- a/test/e2e/config-manager-push-org-privileges.e2e.test.js +++ b/test/e2e/config-manager-push-org-privileges.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,12 +68,12 @@ describe('frodo config-manager push org-privileges', () => { test(`"frodo config-manager push org-privileges -D ${allDirectory} -m forgeops": should import the org-privileges into forgeops"`, async () => { const CMD = `frodo config-manager push org-privileges -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo config-manager push org-privileges -n alphaOrgPrivileges -D ${allDirectory} -m forgeops": should import a specific org-privilege by name into forgeops"`, async () => { const CMD = `frodo config-manager push org-privileges -n alphaOrgPrivileges -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-password-policy.e2e.test.js b/test/e2e/config-manager-push-password-policy.e2e.test.js index f81c9da68..d7d20393f 100644 --- a/test/e2e/config-manager-push-password-policy.e2e.test.js +++ b/test/e2e/config-manager-push-password-policy.e2e.test.js @@ -58,7 +58,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc, connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -75,13 +75,13 @@ describe('frodo config-manager push password-policy', () => { test(`"frodo config-manager push password-policy -D ${cloudAllDirectory} -m cloud": should import the password policy into AIC"`, async () => { const CMD = `frodo config-manager push password-policy -D ${cloudAllDirectory} -m cloud`; const { stdout } = await exec(CMD, cloudEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo config-manager push password-policy -r alpha -D ${cloudAllDirectory} -m cloud": should import a specific password policy by name into AIC"`, async () => { const CMD = `frodo config-manager push password-policy -r alpha -D ${cloudAllDirectory} -m cloud`; const { stdout } = await exec(CMD, cloudEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); @@ -89,13 +89,13 @@ describe('frodo config-manager push password-policy', () => { test(`"frodo config-manager push password-policy -D ${forgeopsAllDirectory} -m forgeops": should import the password policy into forgeops"`, async () => { const CMD = `frodo config-manager push password-policy -D ${forgeopsAllDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo config-manager push password-policy -r alpha -D ${forgeopsAllDirectory} -m forgeops": should import a specific password policy by name into forgeops"`, async () => { const CMD = `frodo config-manager push password-policy -r alpha -D ${forgeopsAllDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); }); diff --git a/test/e2e/config-manager-push-restart.e2e.test.js b/test/e2e/config-manager-push-restart.e2e.test.js new file mode 100644 index 000000000..4e65a189d --- /dev/null +++ b/test/e2e/config-manager-push-restart.e2e.test.js @@ -0,0 +1,81 @@ +/** + * Follow this process to write e2e tests for the CLI project: + * + * 1. Test if all the necessary mocks for your tests already exist. + * In mock mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=1 frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * If your command completes without errors and with the expected results, + * all the required mocks already exist and you are good to write your + * test and skip to step #4. + * + * If, however, your command fails and you see errors like the one below, + * you know you need to record the mock responses first: + * + * [Polly] [adapter:node-http] Recording for the following request is not found and `recordIfMissing` is `false`. + * + * 2. Record mock responses for your exact command. + * In mock record mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=record frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * Wait until you see all the Polly instances (mock recording adapters) have + * shutdown before you try to run step #1 again. + * Messages like these indicate mock recording adapters shutting down: + * + * Polly instance 'conn/4' stopping in 3s... + * Polly instance 'conn/4' stopping in 2s... + * Polly instance 'conn/save/3' stopping in 3s... + * Polly instance 'conn/4' stopping in 1s... + * Polly instance 'conn/save/3' stopping in 2s... + * Polly instance 'conn/4' stopped. + * Polly instance 'conn/save/3' stopping in 1s... + * Polly instance 'conn/save/3' stopped. + * + * 3. Validate your freshly recorded mock responses are complete and working. + * Re-run the exact command you want to test in mock mode (see step #1). + * + * 4. Write your test. + * Make sure to use the exact command including number of arguments and params. + * + * 5. Commit both your test and your new recordings to the repository. + * Your tests are likely going to reside outside the frodo-lib project but + * the recordings must be committed to the frodo-lib project. + */ + +/* +// Cloud +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push restart +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push restart -s +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push restart -c +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push restart -w +*/ + + +import { getEnv, testSuccess } from './utils/TestUtils'; +import { connection as c } from './utils/TestConfig'; + +process.env['FRODO_MOCK'] = '1'; +const cloudEnv = getEnv(c); + +describe('frodo config-manager push restart', () => { + test(`"frodo config-manager push restart": should restart the cloud tenant"`, async () => { + const CMD = `frodo config-manager push restart`; + await testSuccess(CMD, cloudEnv) + }); + test(`"frodo config-manager push restart -s": should check for updates to apply to the cloud tenant"`, async () => { + const CMD = `frodo config-manager push restart -s`; + await testSuccess(CMD, cloudEnv) + }); + test(`"frodo config-manager push restart -c": should check for updates and then apply them to the cloud tenant"`, async () => { + const CMD = `frodo config-manager push restart -c`; + await testSuccess(CMD, cloudEnv) + }); + test(`"frodo config-manager push restart -w": should restart the cloud tenant and wait until restart is complete to exit command."`, async () => { + const CMD = `frodo config-manager push restart -w`; + await testSuccess(CMD, cloudEnv, 5000); + }); +}); \ No newline at end of file diff --git a/test/e2e/config-manager-push-schedules.e2e.test.js b/test/e2e/config-manager-push-schedules.e2e.test.js index 2599bde6c..9a466e130 100644 --- a/test/e2e/config-manager-push-schedules.e2e.test.js +++ b/test/e2e/config-manager-push-schedules.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,11 +68,11 @@ describe('frodo config-manager push schedules', () => { test(`"frodo config-manager push schedules -D ${allDirectory} -m forgeops": should import the schedules into forgeops"`, async () => { const CMD = `frodo config-manager push schedules -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo config-manager push schedules -n taskscan_activate -D ${allDirectory} -m forgeops": should import a specific schedule by name into forgeops"`, async () => { const CMD = `frodo config-manager push schedules -n taskscan_activate -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-service-objects.e2e.test.js b/test/e2e/config-manager-push-service-objects.e2e.test.js index d934b21ce..1a5c4d0f2 100644 --- a/test/e2e/config-manager-push-service-objects.e2e.test.js +++ b/test/e2e/config-manager-push-service-objects.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,6 +67,6 @@ describe('frodo config-manager push service-objects', () => { test(`"frodo config-manager push service-objects -D ${allDirectory} -m forgeops": should import the service objects into forgeops"`, async () => { const CMD = `frodo config-manager push service-objects -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-terms-and-conditions.e2e.test.js b/test/e2e/config-manager-push-terms-and-conditions.e2e.test.js index 1a86a0ffb..e6a34a43e 100644 --- a/test/e2e/config-manager-push-terms-and-conditions.e2e.test.js +++ b/test/e2e/config-manager-push-terms-and-conditions.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -66,5 +66,5 @@ const allDirectory = "test/e2e/exports/fr-config-manager/forgeops"; test(`"frodo config-manager push terms-and-conditions -D ${allDirectory} -m forgeops": should import the terms and conditions into forgeops"`, async () => { const CMD = `frodo config-manager push terms-and-conditions -D ${allDirectory} -m forgeops`; const { stdout } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-themes.e2e.test.js b/test/e2e/config-manager-push-themes.e2e.test.js index c728e2470..46aeee165 100644 --- a/test/e2e/config-manager-push-themes.e2e.test.js +++ b/test/e2e/config-manager-push-themes.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -71,5 +71,5 @@ test(`"frodo config-manager push themes -D ${allDirectory} -m forgeops": should FRODO_REALM: 'alpha' } }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); \ No newline at end of file diff --git a/test/e2e/config-manager-push-ui-config.e2e.test.js b/test/e2e/config-manager-push-ui-config.e2e.test.js index cd72c208d..031bea57c 100644 --- a/test/e2e/config-manager-push-ui-config.e2e.test.js +++ b/test/e2e/config-manager-push-ui-config.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { forgeops_connection as fc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,7 +67,7 @@ describe('frodo config-manager push ui-config', () => { test(`"frodo config-manager push ui-config -D ${allDirectory}-m forgeops": should import ui-config into forgeops"`, async () => { const CMD = `frodo config-manager push ui-config -D ${allDirectory} -m forgeops`; const { stdout, stderr } = await exec(CMD, forgeopsEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); }); }); diff --git a/test/e2e/conn-alias-add.e2e.test.js b/test/e2e/conn-alias-add.e2e.test.js index 518b727b0..18ca7ec23 100644 --- a/test/e2e/conn-alias-add.e2e.test.js +++ b/test/e2e/conn-alias-add.e2e.test.js @@ -48,7 +48,7 @@ import cp from 'child_process'; import { promisify } from 'util'; import path from 'path'; -import { getEnv, removeAnsiEscapeCodes, testif } from './utils/TestUtils'; +import { getEnv, testif } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; import { readFileSync, rmSync, writeFileSync } from 'fs'; @@ -81,8 +81,8 @@ describe('frodo conn alias add', () => { async () => { const CMD = `frodo conn alias add ${alias} ${c.host}`; const { stdout, stderr } = await exec(CMD, { ...env, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); } ); testif(process.env['FRODO_MASTER_KEY'] || process.env['FRODO_MASTER_KEY_PATH'])( @@ -100,8 +100,8 @@ describe('frodo conn alias add', () => { await exec(CMD, { ...env, cwd: process.cwd() }); throw new Error('Expected command to fail'); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(e.stdout)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); + expect(e.stdout).toMatchSnapshot(); } expect.assertions(2); } diff --git a/test/e2e/conn-alias-delete.e2e.test.js b/test/e2e/conn-alias-delete.e2e.test.js index 5d42d41e4..3b44bec0d 100644 --- a/test/e2e/conn-alias-delete.e2e.test.js +++ b/test/e2e/conn-alias-delete.e2e.test.js @@ -48,7 +48,7 @@ import cp from 'child_process'; import { promisify } from 'util'; import path from 'path'; -import { getEnv, removeAnsiEscapeCodes, testif } from './utils/TestUtils'; +import { getEnv, testif } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; import { readFileSync, rmSync, writeFileSync } from 'fs'; @@ -88,8 +88,8 @@ describe('frodo conn alias delete', () => { async () => { const CMD = `frodo conn alias delete ${c.host}`; const { stdout, stderr } = await exec(CMD, { ...env, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); } ); testif(process.env['FRODO_MASTER_KEY'] || process.env['FRODO_MASTER_KEY_PATH'])( @@ -105,8 +105,8 @@ describe('frodo conn alias delete', () => { await exec(CMD, { ...env, cwd: process.cwd() }); throw new Error('Expected command to fail'); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(e.stdout)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); + expect(e.stdout).toMatchSnapshot(); } expect.assertions(2); } diff --git a/test/e2e/conn-delete.e2e.test.js b/test/e2e/conn-delete.e2e.test.js index 8deb36d89..f76a59efc 100644 --- a/test/e2e/conn-delete.e2e.test.js +++ b/test/e2e/conn-delete.e2e.test.js @@ -48,7 +48,7 @@ import cp from 'child_process'; import { promisify } from 'util'; import path from 'path'; -import { getEnv, removeAnsiEscapeCodes, testif } from './utils/TestUtils'; +import { getEnv, testif } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; import { readFileSync, rmSync, writeFileSync } from 'fs'; @@ -81,7 +81,7 @@ describe('frodo conn delete', () => { async () => { const CMD = `frodo conn delete ${c.host}`; const { stderr } = await exec(CMD, { ...env, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); } ); }); diff --git a/test/e2e/conn-describe.e2e.test.js b/test/e2e/conn-describe.e2e.test.js index 4b3acbbd2..e3dc9b689 100644 --- a/test/e2e/conn-describe.e2e.test.js +++ b/test/e2e/conn-describe.e2e.test.js @@ -59,7 +59,7 @@ import cp from 'child_process'; import { promisify } from 'util'; import path from 'path'; import fs from 'fs'; -import { getEnv, removeAnsiEscapeCodes, testif } from './utils/TestUtils'; +import { getEnv, testif } from './utils/TestUtils'; import { connection as c, amster_connection as cc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -94,7 +94,7 @@ describe('frodo conn describe', () => { async () => { const CMD = `frodo conn describe ${c.host}`; const { stdout } = await exec(CMD, { ...cloudEnv, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); } ); @@ -104,7 +104,7 @@ describe('frodo conn describe', () => { const CMD = `frodo conn describe --show-secrets ${c.host}`; const { stdout } = await exec(CMD, { ...cloudEnv, cwd: process.cwd() }); //Don't test with snapshot, otherwise the snapshot would contain secrets. Instead, just check to make sure "[present]" doesn't exist anywhere. - expect(removeAnsiEscapeCodes(stdout).includes("[present]")).toBeFalsy(); + expect(stdout.includes("[present]")).toBeFalsy(); } ); }); @@ -115,7 +115,7 @@ describe('frodo conn describe', () => { async () => { const CMD = `frodo conn describe ${cc.host}`; const { stdout } = await exec(CMD, { ...classicEnv, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); } ); @@ -125,7 +125,7 @@ describe('frodo conn describe', () => { const CMD = `frodo conn describe --show-secrets ${cc.host}`; const { stdout } = await exec(CMD, { ...classicEnv, cwd: process.cwd() }); //Don't test with snapshot, otherwise the snapshot would contain secrets. Instead, just check to make sure "[present]" doesn't exist anywhere. - expect(removeAnsiEscapeCodes(stdout).includes("[present]")).toBeFalsy(); + expect(stdout.includes("[present]")).toBeFalsy(); } ); }); diff --git a/test/e2e/conn-list.e2e.test.js b/test/e2e/conn-list.e2e.test.js index c71224e28..4c13cc82c 100644 --- a/test/e2e/conn-list.e2e.test.js +++ b/test/e2e/conn-list.e2e.test.js @@ -57,7 +57,7 @@ FRODO_CONNECTION_PROFILES_PATH=~/temp/frodo/Connections.json FRODO_MOCK=record F import cp from 'child_process'; import { promisify } from 'util'; import path from 'path'; -import { getEnv, removeAnsiEscapeCodes, testif } from './utils/TestUtils'; +import { getEnv, testif } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -82,7 +82,7 @@ describe('frodo conn list', () => { async () => { const CMD = `frodo conn list`; const { stdout } = await exec(CMD, { ...env, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); } ); @@ -91,7 +91,7 @@ describe('frodo conn list', () => { async () => { const CMD = `frodo conn list -l`; const { stdout } = await exec(CMD, { ...env, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); } ); @@ -100,7 +100,7 @@ describe('frodo conn list', () => { async () => { const CMD = `frodo conn list --long`; const { stdout } = await exec(CMD, { ...env, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); } ); }); diff --git a/test/e2e/conn-save.e2e.test.js b/test/e2e/conn-save.e2e.test.js index 9ea0d1964..d7e063aee 100644 --- a/test/e2e/conn-save.e2e.test.js +++ b/test/e2e/conn-save.e2e.test.js @@ -48,7 +48,7 @@ import cp from 'child_process'; import { promisify } from 'util'; import path from 'path'; -import { getEnv, removeAnsiEscapeCodes, testif } from './utils/TestUtils'; +import { getEnv, testif } from './utils/TestUtils'; import { connection as c, amster_connection as cc } from './utils/TestConfig'; import { writeFileSync, rmSync } from 'fs'; @@ -89,7 +89,7 @@ describe('frodo conn save', () => { async () => { const CMD = `frodo conn save --no-validate ${c.host} ${c.user} ${c.pass}`; const { stderr } = await exec(CMD, { ...env, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); } ); @@ -98,7 +98,7 @@ describe('frodo conn save', () => { async () => { const CMD = `frodo conn save --no-validate --sa-id ${c.saId} --sa-jwk-file ${jwkFile} ${c.host}`; const { stderr } = await exec(CMD, { ...env, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); } ); @@ -107,7 +107,7 @@ describe('frodo conn save', () => { async () => { const CMD = `frodo conn save --no-validate ${cc.host} ${cc.user} ${cc.pass}`; const { stderr } = await exec(CMD, { ...classicEnv, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); } ); @@ -116,7 +116,7 @@ describe('frodo conn save', () => { async () => { const CMD = `frodo conn save --no-validate --private-key ${pkFile} --authentication-service ${cc.authService} ${cc.host}`; const { stderr } = await exec(CMD, { ...classicEnv, cwd: process.cwd() }); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); } ); }); diff --git a/test/e2e/dcc-session-abort.e2e.test.js b/test/e2e/dcc-session-abort.e2e.test.js index 188768979..b54ade6f9 100644 --- a/test/e2e/dcc-session-abort.e2e.test.js +++ b/test/e2e/dcc-session-abort.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_MOCK_HOSTS="https://openam-mtc-feb16-st */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -66,12 +66,12 @@ describe('frodo dcc session abort', () => { test('"frodo dcc session abort": should abort the current direct configuration session', async () => { const CMD = `frodo dcc session abort`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo dcc session abort --json": should abort the current direct configuration session in JSON format', async () => { const CMD = `frodo dcc session abort --json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/dcc-session-apply.e2e.test.js b/test/e2e/dcc-session-apply.e2e.test.js index 3a1b22938..65b2c205a 100644 --- a/test/e2e/dcc-session-apply.e2e.test.js +++ b/test/e2e/dcc-session-apply.e2e.test.js @@ -55,7 +55,7 @@ FRODO_HOST=https://openam-mtc-feb16-stg.forgeblocks.com/am frodo dcc session abo */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,12 +67,12 @@ describe('frodo dcc session apply', () => { test('"frodo dcc session apply": should apply the configuration and end the current direct configuration session', async () => { const CMD = `frodo dcc session apply`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo dcc session apply --json": should apply the configuration and end the current direct configuration session in JSON format', async () => { const CMD = `frodo dcc session apply --json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/dcc-session-init.e2e.test.js b/test/e2e/dcc-session-init.e2e.test.js index 43cc754fc..3798ffa15 100644 --- a/test/e2e/dcc-session-init.e2e.test.js +++ b/test/e2e/dcc-session-init.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_MOCK_HOSTS="https://openam-mtc-feb16-st */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -66,12 +66,12 @@ describe('frodo dcc session init', () => { test('"frodo dcc session init": should initialize a new direct configuration session', async () => { const CMD = `frodo dcc session init`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo dcc session init --json": should initialize a new direct configuration session in JSON format', async () => { const CMD = `frodo dcc session init --json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/dcc-session-state.e2e.test.js b/test/e2e/dcc-session-state.e2e.test.js index e47548dec..02d5c2230 100644 --- a/test/e2e/dcc-session-state.e2e.test.js +++ b/test/e2e/dcc-session-state.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_MOCK_HOSTS="https://openam-mtc-feb16-st */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -66,12 +66,12 @@ describe('frodo dcc session state', () => { test('"frodo dcc session state": should return the current state of the direct configuration session', async () => { const CMD = `frodo dcc session state`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo dcc session state --json": should return the current state of the direct configuration session in JSON format', async () => { const CMD = `frodo dcc session state --json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); }); diff --git a/test/e2e/email-template-import.e2e.test.js b/test/e2e/email-template-import.e2e.test.js index 0d13d7fb4..986c3679c 100644 --- a/test/e2e/email-template-import.e2e.test.js +++ b/test/e2e/email-template-import.e2e.test.js @@ -59,7 +59,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -79,54 +79,54 @@ describe('frodo email template import', () => { test(`"frodo email template import --raw -i welcome -f ${emailTemplateWelcomeRawFileName} -D ${allSeparateEmailTemplatesRawDirectory}": should import the email template with the id "welcome" from the file "${emailTemplateWelcomeRawExport}"`, async () => { const CMD = `frodo email template import --raw -i welcome -f ${emailTemplateWelcomeRawFileName} -D ${allSeparateEmailTemplatesRawDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo email template import --template-id welcome --file ${allAlphaEmailTemplatesExport}": should import the email template with the id "welcome" from the file "${allAlphaEmailTemplatesExport}"`, async () => { const CMD = `frodo email template import --template-id welcome --file ${allAlphaEmailTemplatesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo email template import --raw -f ${emailTemplateWelcomeRawFileName} -D ${allSeparateEmailTemplatesRawDirectory}": should import the first email template from the file "${emailTemplateWelcomeRawExport}"`, async () => { const CMD = `frodo email template import --raw -f ${emailTemplateWelcomeRawFileName} -D ${allSeparateEmailTemplatesRawDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo email template import --file ${allAlphaEmailTemplatesExport}": should import the first email template from the file "${allAlphaEmailTemplatesExport}"`, async () => { const CMD = `frodo email template import --file ${allAlphaEmailTemplatesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo email template import -af ${allAlphaEmailTemplatesExport}": should import all email templates from the file "${allAlphaEmailTemplatesExport}"`, async () => { const CMD = `frodo email template import -af ${allAlphaEmailTemplatesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo email template import --all --file ${allAlphaEmailTemplatesExport}": should import all email templates from the file "${allAlphaEmailTemplatesExport}"`, async () => { const CMD = `frodo email template import --all --file ${allAlphaEmailTemplatesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo email template import -af ${allAlphaEmailTemplatesFileName} -D ${allDirectory}": should import all email templates from the file "${allAlphaEmailTemplatesExport}"`, async () => { const CMD = `frodo email template import -af ${allAlphaEmailTemplatesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo email template import --raw -AD ${allSeparateEmailTemplatesRawDirectory}": should import all email templates from the ${allSeparateEmailTemplatesRawDirectory} directory"`, async () => { const CMD = `frodo email template import --raw -AD ${allSeparateEmailTemplatesRawDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo email template import --all-separate --directory ${allSeparateEmailTemplatesDirectory}": should import all email templates from the ${allSeparateEmailTemplatesDirectory} directory"`, async () => { const CMD = `frodo email template import --all-separate --directory ${allSeparateEmailTemplatesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/email-template-list.e2e.test.js b/test/e2e/email-template-list.e2e.test.js index 2925e335b..8d3715dea 100644 --- a/test/e2e/email-template-list.e2e.test.js +++ b/test/e2e/email-template-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo email template list', () => { test('"frodo email template list": should list the ids of the email templates', async () => { const CMD = `frodo email template list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo email template list -l": should list the ids, names, statuses, locales, senders (from), and subjects of the email templates', async () => { const CMD = `frodo email template list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo email template list --long": should list the ids, names, statuses, locales, senders (from), and subjects of the email templates', async () => { const CMD = `frodo email template list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-secret-create.e2e.test.js b/test/e2e/esv-secret-create.e2e.test.js index fb7bd89f7..a5b951ba4 100644 --- a/test/e2e/esv-secret-create.e2e.test.js +++ b/test/e2e/esv-secret-create.e2e.test.js @@ -59,7 +59,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -71,49 +71,49 @@ describe('frodo esv secret create', () => { test('"frodo esv secret create -i esv-test-secret-pi-generic --value "3.141592653589793238462643383279502884" --description "This is a test secret containing the value pi."": should create an esv secret with the value of pi generically encoded.', async () => { const CMD = `frodo esv secret create -i esv-test-secret-pi-generic --value "3.141592653589793238462643383279502884" --description "This is a test secret containing the value pi."`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret create --secret-id esv-test-secret-pi-generic2 --value "3.141592653589793238462643383279502884" --description "This is a test secret containing the value pi." --encoding generic --no-use-in-placeholders": should create an esv secret with the value of pi base64hmac encoded that cannot be used in placeholders', async () => { const CMD = `frodo esv secret create --secret-id esv-test-secret-pi-generic2 --value "3.141592653589793238462643383279502884" --description "This is a test secret containing the value pi." --encoding generic --no-use-in-placeholders`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret create -i esv-test-secret-value-pem --value "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNQnNDQVFBQ0FVMENBUWNDQVNzQ0FRY0NBUXNDQVFFQ0FRTUNBUUk9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0t" --encoding pem --description "This is a test secret from pem encoded string."": should create an esv secret with pem encoded string', async () => { const CMD = `frodo esv secret create -i esv-test-secret-value-pem --value "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNQnNDQVFBQ0FVMENBUWNDQVNzQ0FRY0NBUXNDQVFFQ0FRTUNBUUk9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0t" --encoding pem --description "This is a test secret from pem encoded string."`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret create -i esv-test-secret-cert-pem --file test/e2e/test-data/esv/key-pair-base64.pem --description "This is a test secret from a pem encoded cert file." --encoding pem": should create an esv secret with a pem encoded cert file', async () => { const CMD = `frodo esv secret create -i esv-test-secret-cert-pem --file test/e2e/test-data/esv/key-pair-base64.pem --description "This is a test secret from a pem encoded cert file." --encoding pem`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret create -i esv-test-secret-cert-pem-raw --file test/e2e/test-data/esv/key-pair.pem --encoding pem --description "This is a test secret from a pem encoded cert file (raw)."": should create an esv secret with a pem encoded cert file', async () => { const CMD = `frodo esv secret create -i esv-test-secret-cert-pem-raw --file test/e2e/test-data/esv/key-pair.pem --encoding pem --description "This is a test secret from a pem encoded cert file (raw)."`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret create -i esv-test-secret-value-base64hmac --value "d2t0UU05Snp2a1Bsb2JmYVdlaUlkODFXcWllR1JpZWY4ekl4R0pud1laZz0=" --description "This is a test secret from base64 encoded hmac key." --encoding base64hmac": should create an esv secret with hmac key string', async () => { const CMD = `frodo esv secret create -i esv-test-secret-value-base64hmac --value "d2t0UU05Snp2a1Bsb2JmYVdlaUlkODFXcWllR1JpZWY4ekl4R0pud1laZz0=" --description "This is a test secret from base64 encoded hmac key." --encoding base64hmac`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret create -i esv-test-secret-file-base64hmac --file test/e2e/test-data/esv/hmac-key-base64.txt --description "This is a test secret from base64 encoded hmac key file." --encoding base64hmac": should create an esv secret with base64hmac encoded file', async () => { const CMD = `frodo esv secret create -i esv-test-secret-file-base64hmac --file test/e2e/test-data/esv/hmac-key-base64.txt --description "This is a test secret from base64 encoded hmac key file." --encoding base64hmac`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret create -i esv-test-secret-file-base64hmac-raw --file test/e2e/test-data/esv/hmac-key.txt --encoding base64hmac --description "This is a test secret from base64 encoded hmac key file (raw)."": should create an esv secret with base64hmac encoded file', async () => { const CMD = `frodo esv secret create -i esv-test-secret-file-base64hmac-raw --file test/e2e/test-data/esv/hmac-key.txt --encoding base64hmac --description "This is a test secret from base64 encoded hmac key file (raw)."`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret create -i esv-test-secret-pi-unknown --value "3.141592653589793238462643383279502884" --description "This is a test secret containing the value pi." --encoding unknown": should display an error when creating an esv secret with unknown encoding', async () => { @@ -122,7 +122,7 @@ describe('frodo esv secret create', () => { await exec(CMD, env); fail("Command should've failed") } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); }); diff --git a/test/e2e/esv-secret-delete.e2e.test.js b/test/e2e/esv-secret-delete.e2e.test.js index 880e6e135..040c10aa4 100644 --- a/test/e2e/esv-secret-delete.e2e.test.js +++ b/test/e2e/esv-secret-delete.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,7 +67,7 @@ describe('frodo esv secret delete', () => { test('"frodo esv secret delete -i esv-test-secret-pi-generic": should delete the secret with id \'esv-test-secret-pi-generic\'', async () => { const CMD = `frodo esv secret delete -i esv-test-secret-pi-generic`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret delete --secret-id esv-test-secret-pi-generic": should display error when the secret with id \'esv-test-secret-pi-generic\' cannot be deleted since it does not exist', async () => { @@ -76,7 +76,7 @@ describe('frodo esv secret delete', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); @@ -84,14 +84,14 @@ describe('frodo esv secret delete', () => { test.skip('"frodo esv secret delete -a": should delete all secrets', async () => { const CMD = `frodo esv secret delete -a`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); //TODO: Generate mock for this test (skip for meantime) test.skip('"frodo esv secret delete --all": should do nothing when no secrets can be deleted', async () => { const CMD = `frodo esv secret delete --all`; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-secret-describe.e2e.test.js b/test/e2e/esv-secret-describe.e2e.test.js index fb362f541..c15df38a5 100644 --- a/test/e2e/esv-secret-describe.e2e.test.js +++ b/test/e2e/esv-secret-describe.e2e.test.js @@ -56,7 +56,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -71,7 +71,7 @@ describe('frodo esv secret describe', () => { test(`"frodo esv secret describe -i esv-test-secret": should describe the esv secret "esv-test-secret"`, async () => { const CMD = `frodo esv secret describe -i esv-test-secret`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret describe -ui esv-test-secret": should describe the esv secret "esv-test-secret" with usage`, async () => { @@ -80,32 +80,32 @@ describe('frodo esv secret describe', () => { await exec(CMD, env); fail("Command should've failed") } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(e.stdout)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); + expect(e.stdout).toMatchSnapshot(); } }); test(`"frodo esv secret describe -ui esv-test-secret -f ${allConfigFile}": should describe the esv secret "esv-test-secret" with usage from file ${allConfigFile}`, async () => { const CMD = `frodo esv secret describe -ui esv-test-secret -f ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret describe -ui esv-test-secret -D ${allConfigDirectory}": should describe the esv secret "esv-test-secret" with usage from directory ${allConfigDirectory}`, async () => { const CMD = `frodo esv secret describe -ui esv-test-secret -D ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret describe --json --usage --secret-id esv-test-secret --file ${allConfigFile}": should describe the esv secret "esv-test-secret" with usage from file ${allConfigFile} and json output`, async () => { const CMD = `frodo esv secret describe --json --usage --secret-id esv-test-secret --file ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret describe --json --usage --secret-id esv-test-secret --directory ${allConfigDirectory}": should describe the esv secret "esv-test-secret" with usage from directory ${allConfigDirectory} and json output`, async () => { const CMD = `frodo esv secret describe --json --usage --secret-id esv-test-secret --directory ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-secret-import.e2e.test.js b/test/e2e/esv-secret-import.e2e.test.js index f61f4b07a..e52d5b811 100644 --- a/test/e2e/esv-secret-import.e2e.test.js +++ b/test/e2e/esv-secret-import.e2e.test.js @@ -62,7 +62,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -79,72 +79,72 @@ describe('frodo esv secret import', () => { test(`"frodo esv secret import -i esv-test-secret -f ${allSecretsExport}" Import secret "esv-test-secret" from "${allSecretsExport}".`, async () => { const CMD = `frodo esv secret import -i esv-test-secret -f ${allSecretsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import --secret-id esv-test-secret --file ${allSecretsExport}" Import secret "esv-test-secret" from "${allSecretsFileName}".`, async () => { const CMD = `frodo esv secret import --secret-id esv-test-secret --file ${allSecretsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import -i esv-test-secret -f ${allSecretsFileName} -D ${allDirectory}" Import secret "esv-test-secret" from "${allSecretsFileName}" in directory "${allDirectory}".`, async () => { const CMD = `frodo esv secret import -i esv-test-secret -f ${allSecretsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import -i esv-test-secret -f ${allSecretsExport} --include-active-values" Import secret "esv-test-secret" and secret value from "${allSecretsExport}".`, async () => { const CMD = `frodo esv secret import -i esv-test-secret -f ${allSecretsExport} --include-active-values`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import -f ${allSecretsExport}" Import first secret from "${allSecretsExport}".`, async () => { const CMD = `frodo esv secret import -f ${allSecretsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import -f ${allSecretsFileName} -D ${allDirectory}" Import first secret from "${allSecretsFileName}" in directory "${allDirectory}"`, async () => { const CMD = `frodo esv secret import -f ${allSecretsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import -a --file ${allSecretsExport}" Import all secrets from "${allSecretsExport}".`, async () => { const CMD = `frodo esv secret import -a --file ${allSecretsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import -a -f ${allSecretsFileName} -D ${allDirectory}" Import all secrets from "${allSecretsFileName}" in directory "${allSeparateSecretsDirectory}".`, async () => { const CMD = `frodo esv secret import -a -f ${allSecretsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import -a -f ${allSecretsExport} --include-active-values" Import all secrets and secret values from "${allSecretsExport}".`, async () => { const CMD = `frodo esv secret import -a -f ${allSecretsExport} --include-active-values`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import -AD ${allSeparateSecretsDirectory}" Import all secrets in directory "${allSeparateSecretsDirectory}".`, async () => { const CMD = `frodo esv secret import -AD ${allSeparateSecretsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import -AD ${allSeparateSecretsDirectory} --include-active-values" Import all secrets and secret values in directory "${allSeparateSecretsDirectory}".`, async () => { const CMD = `frodo esv secret import -AD ${allSeparateSecretsDirectory} --include-active-values`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret import -f esv-test-secret.secret.json --directory ${allSeparateSecretsDirectory}" Import first secret from "esv-test-secret.secret.json" in directory "${allSeparateSecretsDirectory}".`, async () => { const CMD = `frodo esv secret import -f esv-test-secret.secret.json --directory ${allSeparateSecretsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-secret-list.e2e.test.js b/test/e2e/esv-secret-list.e2e.test.js index 1cb729167..637b4fe4e 100644 --- a/test/e2e/esv-secret-list.e2e.test.js +++ b/test/e2e/esv-secret-list.e2e.test.js @@ -58,7 +58,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -73,48 +73,48 @@ describe('frodo esv secret list', () => { test('"frodo esv secret list": should list the ids of the esv secrets', async () => { const CMD = `frodo esv secret list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret list -l": should list the ids, active/loaded versions, statuses, descriptions, modifiers, and modified times of the esv secrets', async () => { const CMD = `frodo esv secret list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret list -u": should list the usage of the esv secrets', async () => { const CMD = `frodo esv secret list -u`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo esv secret list -lu": should list the ids, active/loaded versions, statuses, descriptions, modifiers, modified times, and usage of the esv secrets', async () => { const CMD = `frodo esv secret list -lu`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo esv secret list -uf ${allConfigFile}": should list the usage of the esv secrets in the ${allConfigFile} file`, async () => { const CMD = `frodo esv secret list -uf ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret list --usage --long --file ${allConfigFile}": should list the ids, active/loaded versions, statuses, descriptions, modifiers, modified times, and usage of the esv secrets in the ${allConfigFile} file`, async () => { const CMD = `frodo esv secret list --usage --long --file ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret list -uD ${allConfigDirectory}": should list the usage of the esv secrets in the ${allConfigDirectory} directory`, async () => { const CMD = `frodo esv secret list -uD ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv secret list --usage --long --directory ${allConfigDirectory}": should list the ids, active/loaded versions, statuses, descriptions, modifiers, modified times, and usage of the esv secrets in the ${allConfigDirectory} directory`, async () => { const CMD = `frodo esv secret list --usage --long --directory ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-secret-set.e2e.test.js b/test/e2e/esv-secret-set.e2e.test.js index 3c2cff0cd..39c3b13d0 100644 --- a/test/e2e/esv-secret-set.e2e.test.js +++ b/test/e2e/esv-secret-set.e2e.test.js @@ -51,7 +51,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -63,6 +63,6 @@ describe('frodo esv secret set', () => { test('"frodo esv secret set -i esv-test-secret-pi-generic --description "Test secret containing value of pi"": should update the "esv-test-secret-pi-generic" secret\'s description.', async () => { const CMD = `frodo esv secret set -i esv-test-secret-pi-generic --description "Test secret containing value of pi"`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-secret-version-activate.e2e.test.js b/test/e2e/esv-secret-version-activate.e2e.test.js index 2492ab993..b44060fcc 100644 --- a/test/e2e/esv-secret-version-activate.e2e.test.js +++ b/test/e2e/esv-secret-version-activate.e2e.test.js @@ -52,7 +52,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -64,12 +64,12 @@ describe('frodo esv secret version activate', () => { test('"frodo esv secret version activate -i esv-test-secret-pi-generic -v 1": should activate version 1 of the secret "esv-test-secret-pi-generic"', async () => { const CMD = `frodo esv secret version activate -i esv-test-secret-pi-generic -v 1`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret version activate --secret-id esv-test-secret-pi-generic --version 2": should do nothing special when activating version 2 of the secret "esv-test-secret-pi-generic", which is the latest and already activated version', async () => { const CMD = `frodo esv secret version activate --secret-id esv-test-secret-pi-generic --version 2`; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-secret-version-create.e2e.test.js b/test/e2e/esv-secret-version-create.e2e.test.js index 3ce0c7f39..2bbbdfb42 100644 --- a/test/e2e/esv-secret-version-create.e2e.test.js +++ b/test/e2e/esv-secret-version-create.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,16 +65,16 @@ describe('frodo esv secret version create', () => { test('"frodo esv secret version create -i esv-test-secret-pi-generic --value "3.1"": should create a new version of the "esv-test-var-pi-generic" secret', async () => { const CMD = `frodo esv secret version create -i esv-test-secret-pi-generic --value "3.1"`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret version create -i esv-test-secret-cert-pem-raw --file test/e2e/test-data/esv/key-pair.pem": should create a new version of the "esv-test-secret-cert-pem-raw" secret', async () => { const CMD = `frodo esv secret version create -i esv-test-secret-cert-pem-raw --file test/e2e/test-data/esv/key-pair.pem`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret version create --file test/e2e/test-data/esv/hmac-key.txt -i esv-test-secret-file-base64hmac-raw": should create a new version of the "esv-test-secret-file-base64hmac-raw" secret', async () => { const CMD = `frodo esv secret version create --file test/e2e/test-data/esv/hmac-key.txt -i esv-test-secret-file-base64hmac-raw`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-secret-version-deactivate.e2e.test.js b/test/e2e/esv-secret-version-deactivate.e2e.test.js index 84538a546..a1ad205f6 100644 --- a/test/e2e/esv-secret-version-deactivate.e2e.test.js +++ b/test/e2e/esv-secret-version-deactivate.e2e.test.js @@ -52,7 +52,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -64,7 +64,7 @@ describe('frodo esv secret version deactivate', () => { test('"frodo esv secret version deactivate -i esv-test-secret-pi-generic -v 1": should deactivate version 1 of the secret "esv-test-secret-pi-generic"', async () => { const CMD = `frodo esv secret version deactivate -i esv-test-secret-pi-generic -v 1`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret version deactivate --secret-id esv-test-secret-pi-generic --version 2": should display an error when activating version 2 of the secret "esv-test-secret-pi-generic", which is the latest and already activated version', async () => { @@ -73,7 +73,7 @@ describe('frodo esv secret version deactivate', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); }); diff --git a/test/e2e/esv-secret-version-delete.e2e.test.js b/test/e2e/esv-secret-version-delete.e2e.test.js index 6a383b219..780c01611 100644 --- a/test/e2e/esv-secret-version-delete.e2e.test.js +++ b/test/e2e/esv-secret-version-delete.e2e.test.js @@ -52,7 +52,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -64,7 +64,7 @@ describe('frodo esv secret version delete', () => { test('"frodo esv secret version delete -i esv-test-secret-pi-generic -v 2": should delete version 2 of the "esv-test-var-pi-generic" secret', async () => { const CMD = `frodo esv secret version delete -i esv-test-secret-pi-generic -v 2`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret version delete --secret-id esv-test-secret-pi-generic --version 4": should display error when deleting non-existent version 4 of the "esv-test-var-pi-generic" secret', async () => { @@ -73,7 +73,7 @@ describe('frodo esv secret version delete', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); }); diff --git a/test/e2e/esv-secret-version-list.e2e.test.js b/test/e2e/esv-secret-version-list.e2e.test.js index 18af08937..f54feae6e 100644 --- a/test/e2e/esv-secret-version-list.e2e.test.js +++ b/test/e2e/esv-secret-version-list.e2e.test.js @@ -52,7 +52,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -64,12 +64,12 @@ describe('frodo esv secret version list', () => { test('"frodo esv secret version list -i esv-test-secret": should list the versions of the esv secret "esv-test-secret"', async () => { const CMD = `frodo esv secret version list -i esv-test-secret`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv secret version list --secret-id": should list the versions of the esv secret "esv-test-secret"', async () => { const CMD = `frodo esv secret version list --secret-id esv-test-secret`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-variable-create.e2e.test.js b/test/e2e/esv-variable-create.e2e.test.js index a6447845e..0fff83933 100644 --- a/test/e2e/esv-variable-create.e2e.test.js +++ b/test/e2e/esv-variable-create.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,13 +65,13 @@ describe('frodo esv variable create', () => { test('"frodo esv variable create -i esv-test-var-pi --value "3.1415926" --description "This is another test variable." --variable-type number": should create an esv variable of type number with the value of pi.', async () => { const CMD = `frodo esv variable create -i esv-test-var-pi --value "3.1415926" --description "This is another test variable." --variable-type number`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv variable create --variable-id esv-test-var-pi-string --value "3.1415926" --variable-type string --description "This is another test variable."": should create an esv variable of type string with the value of pi.', async () => { const CMD = `frodo esv variable create --variable-id esv-test-var-pi-string --value "3.1415926" --variable-type string --description "This is another test variable."`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv variable create --variable-id esv-test-var-pi-unknown --value "3.1415926" --description "This is another test variable." --variable-type unknown": should display an error when trying to create an esv variable of unknown type', async () => { @@ -80,7 +80,7 @@ describe('frodo esv variable create', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); }); diff --git a/test/e2e/esv-variable-delete.e2e.test.js b/test/e2e/esv-variable-delete.e2e.test.js index 6e059f395..f57819210 100644 --- a/test/e2e/esv-variable-delete.e2e.test.js +++ b/test/e2e/esv-variable-delete.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,7 +67,7 @@ describe('frodo esv variable delete', () => { test('"frodo esv variable delete -i esv-test-var-pi": should delete the variable with id \'esv-test-var-pi\'', async () => { const CMD = `frodo esv variable delete -i esv-test-var-pi`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv variable delete --variable-id esv-test-var-pi": should display error when the variable with id \'esv-test-var-pi\' cannot be deleted since it does not exist', async () => { @@ -76,7 +76,7 @@ describe('frodo esv variable delete', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); @@ -84,14 +84,14 @@ describe('frodo esv variable delete', () => { test.skip('"frodo esv variable delete -a": should delete all variables', async () => { const CMD = `frodo esv variable delete -a`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); //TODO: Generate mock for this test (skip for meantime) test.skip('"frodo esv variable delete --all": should do nothing when no variables can be deleted', async () => { const CMD = `frodo esv variable delete --all`; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-variable-describe.e2e.test.js b/test/e2e/esv-variable-describe.e2e.test.js index bb1afbc21..94e9b5825 100644 --- a/test/e2e/esv-variable-describe.e2e.test.js +++ b/test/e2e/esv-variable-describe.e2e.test.js @@ -56,7 +56,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -71,36 +71,36 @@ describe('frodo esv variable describe', () => { test(`"frodo esv variable describe -i esv-neo-age": should describe the esv variable "esv-neo-age"`, async () => { const CMD = `frodo esv variable describe -i esv-neo-age`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable describe -ui esv-test-var-pi": should describe the esv variable "esv-test-var-pi" with usage`, async () => { const CMD = `frodo esv variable describe -ui esv-test-var-pi`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo esv variable describe -ui esv-test-var-pi -f ${allConfigFile}": should describe the esv variable "esv-test-var-pi" with usage from file ${allConfigFile}`, async () => { const CMD = `frodo esv variable describe -ui esv-test-var-pi -f ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable describe -ui esv-test-var-pi -D ${allConfigDirectory}": should describe the esv variable "esv-test-var-pi" with usage from directory ${allConfigDirectory}`, async () => { const CMD = `frodo esv variable describe -ui esv-test-var-pi -D ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable describe --json --usage --variable-id esv-test-var-pi --file ${allConfigFile}": should describe the esv variable "esv-test-var-pi" with usage from file ${allConfigFile} and json output`, async () => { const CMD = `frodo esv variable describe --json --usage --variable-id esv-test-var-pi --file ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable describe --json --usage --variable-id esv-test-var-pi --directory ${allConfigDirectory}": should describe the esv variable "esv-test-var-pi" with usage from directory ${allConfigDirectory} and json output`, async () => { const CMD = `frodo esv variable describe --json --usage --variable-id esv-test-var-pi --directory ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-variable-import.e2e.test.js b/test/e2e/esv-variable-import.e2e.test.js index 19f737a1c..38cf1ba31 100644 --- a/test/e2e/esv-variable-import.e2e.test.js +++ b/test/e2e/esv-variable-import.e2e.test.js @@ -59,7 +59,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -76,54 +76,54 @@ describe('frodo esv variable import', () => { test(`"frodo esv variable import -i esv-test-var -f ${allVariablesExport}" Import variable "esv-test-var" from "${allVariablesExport}".`, async () => { const CMD = `frodo esv variable import -i esv-test-var -f ${allVariablesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable import --variable-id esv-test-var --file ${allVariablesExport}" Import variable "esv-test-var" from "${allVariablesFileName}".`, async () => { const CMD = `frodo esv variable import --variable-id esv-test-var --file ${allVariablesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable import -i esv-test-var -f ${allVariablesFileName} -D ${allDirectory}" Import variable "esv-test-var" from "${allVariablesFileName}" in directory "${allDirectory}".`, async () => { const CMD = `frodo esv variable import -i esv-test-var -f ${allVariablesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable import -f ${allVariablesExport}" Import first variable from "${allVariablesExport}".`, async () => { const CMD = `frodo esv variable import -f ${allVariablesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable import -f ${allVariablesFileName} -D ${allDirectory}" Import first variable from "${allVariablesFileName}" in directory "${allDirectory}"`, async () => { const CMD = `frodo esv variable import -f ${allVariablesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable import -a --file ${allVariablesExport}" Import all variables from "${allVariablesExport}".`, async () => { const CMD = `frodo esv variable import -a --file ${allVariablesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable import -a -f ${allVariablesFileName} -D ${allDirectory}" Import all variables from "${allVariablesFileName}" in directory "${allSeparateVariablesDirectory}".`, async () => { const CMD = `frodo esv variable import -a -f ${allVariablesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable import -AD ${allSeparateVariablesDirectory}" Import all variables in directory "${allSeparateVariablesDirectory}".`, async () => { const CMD = `frodo esv variable import -AD ${allSeparateVariablesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable import -f esv-test-var.variable.json --directory ${allSeparateVariablesDirectory}" Import first variable from "esv-test-var.variable.json" in directory "${allSeparateVariablesDirectory}".`, async () => { const CMD = `frodo esv variable import -f esv-test-var.variable.json --directory ${allSeparateVariablesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-variable-list.e2e.test.js b/test/e2e/esv-variable-list.e2e.test.js index d78914ad5..0dda4e4e3 100644 --- a/test/e2e/esv-variable-list.e2e.test.js +++ b/test/e2e/esv-variable-list.e2e.test.js @@ -58,7 +58,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -73,48 +73,48 @@ describe('frodo esv variable list', () => { test('"frodo esv variable list": should list the ids of the esv variables', async () => { const CMD = `frodo esv variable list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv variable list -l": should list the ids, values, statuses, descriptions, modifiers, and modified times of the esv variables', async () => { const CMD = `frodo esv variable list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv variable list -u": should list the usage of the esv variables', async () => { const CMD = `frodo esv variable list -u`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test('"frodo esv variable list -lu": should list the ids, values, statuses, descriptions, modifiers, usage, and modified times of the esv variables', async () => { const CMD = `frodo esv variable list -lu`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo esv variable list -uf ${allConfigFile}": should list the usage of the esv variables in the ${allConfigFile} file`, async () => { const CMD = `frodo esv variable list -uf ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable list --usage --long --file ${allConfigFile}": should list the ids, values, statuses, descriptions, modifiers, usage, and modified times of the esv variables in the ${allConfigFile} file`, async () => { const CMD = `frodo esv variable list --usage --long --file ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable list -uD ${allConfigDirectory}": should list the usage of the esv variables in the ${allConfigDirectory} directory`, async () => { const CMD = `frodo esv variable list -uD ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo esv variable list --usage --long --directory ${allConfigDirectory}": should list the ids, values, statuses, descriptions, modifiers, usage, and modified times of the esv variables in the ${allConfigDirectory} directory`, async () => { const CMD = `frodo esv variable list --usage --long --directory ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/esv-variable-set.e2e.test.js b/test/e2e/esv-variable-set.e2e.test.js index a247edb4a..e7a328f23 100644 --- a/test/e2e/esv-variable-set.e2e.test.js +++ b/test/e2e/esv-variable-set.e2e.test.js @@ -52,7 +52,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -64,12 +64,12 @@ describe('frodo esv variable set', () => { test('"frodo esv variable set -i esv-test-var-pi-string --description "This is a pi test variable."": should update the "esv-test-var-pi-string" variable\'s description.', async () => { const CMD = `frodo esv variable set -i esv-test-var-pi-string --description "This is a pi test variable."`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo esv variable set --variable-id esv-test-var-pi-string --description "This is a test variable of pi." --value "3.14"": should update the "esv-test-var-pi-string" variable', async () => { const CMD = `frodo esv variable set --variable-id esv-test-var-pi-string --description "This is a test variable of pi." --value "3.14"`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/idm-count.e2e.test.js b/test/e2e/idm-count.e2e.test.js index 003b4326c..b4d010ac0 100644 --- a/test/e2e/idm-count.e2e.test.js +++ b/test/e2e/idm-count.e2e.test.js @@ -52,7 +52,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -64,12 +64,12 @@ describe('frodo idm count', () => { test('"frodo idm count -o alpha_user": should count all alpha_users', async () => { const CMD = `frodo idm count -o alpha_user`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo idm count --managed-object alpha_user": should count all alpha_users', async () => { const CMD = `frodo idm count --managed-object alpha_user`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/idm-delete.e2e.test.js b/test/e2e/idm-delete.e2e.test.js index 733ccc08c..cf922c511 100644 --- a/test/e2e/idm-delete.e2e.test.js +++ b/test/e2e/idm-delete.e2e.test.js @@ -51,7 +51,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -63,6 +63,6 @@ describe('frodo idm delete -i "emailTemplate/deleteTemplate"', () => { test('"frodo idm delete -i emailTemplate/deleteTemplate": should delete idm config with entityId emailTemplate/deleteTemplate', async () => { const CMD = `frodo idm delete -i emailTemplate/deleteTemplate`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/idm-import.e2e.test.js b/test/e2e/idm-import.e2e.test.js index ebcf73ace..edf93b3f2 100644 --- a/test/e2e/idm-import.e2e.test.js +++ b/test/e2e/idm-import.e2e.test.js @@ -67,7 +67,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, testSuccess } from './utils/TestUtils'; +import { getEnv, testSuccess } from './utils/TestUtils'; import { connection as c , forgeops_connection as fc} from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -94,31 +94,31 @@ describe('frodo idm import', () => { test(`"frodo idm import -i script -D ${idmExportDirectory}": should import the idm config with name 'script' from the directory ${idmExportDirectory}"`, async () => { const CMD = `frodo idm import -i script -D ${idmExportDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idm import -f ${idmScriptConfigExport}": should import the idm config from the file named '${idmScriptConfigExport}'"`, async () => { const CMD = `frodo idm import -f ${idmScriptConfigExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idm import --entity-id script --file ${idmScriptConfigExport}": should import the idm config with name 'script' from the file named '${idmScriptConfigExport}'"`, async () => { const CMD = `frodo idm import --entity-id script --file ${idmScriptConfigExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idm import -i script -e ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}": should import the idm config with name 'script' from the file named '${idmScriptConfigExport}'"`, async () => { const CMD = `frodo idm import -i script -e ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idm import -af ${allIdmExport} -e ${testEnvFile} -E ${testEntitiesFile}": Should import all configs from the file '${allIdmExport}' according to the env and entity files"`, async () => { const CMD = `frodo idm import -af ${allIdmExport} -e ${testEnvFile} -E ${testEntitiesFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idm import --all --file ${allIdmExportFileName} -D ${allIdmExportDirectory}": Should import all configs from the file '${allIdmExportFileName}' in directory '${allIdmExportDirectory}'"`, async () => { @@ -127,7 +127,7 @@ describe('frodo idm import', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); @@ -137,14 +137,14 @@ describe('frodo idm import', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test(`"frodo idm import --all-separate --directory ${idmExportDirectory} --env-file ${testEnvFile} --entities-file ${testEntitiesFile}": Should import all configs from the directory '${idmExportDirectory}' according to the env and entity files"`, async () => { const CMD = `frodo idm import --all-separate --directory ${idmExportDirectory} --env-file ${testEnvFile} --entities-file ${testEntitiesFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); // Forgeops Tests diff --git a/test/e2e/idm-list.e2e.test.js b/test/e2e/idm-list.e2e.test.js index 21bca7bd6..41a5175f7 100644 --- a/test/e2e/idm-list.e2e.test.js +++ b/test/e2e/idm-list.e2e.test.js @@ -51,7 +51,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -63,6 +63,6 @@ describe('frodo idm list', () => { test('"frodo idm list": should list the ids of the idm config entities', async () => { const CMD = `frodo idm list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/idm-schema-object-import.e2e.test.js b/test/e2e/idm-schema-object-import.e2e.test.js index b2316794e..b370d59e5 100644 --- a/test/e2e/idm-schema-object-import.e2e.test.js +++ b/test/e2e/idm-schema-object-import.e2e.test.js @@ -58,7 +58,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes, testSuccess } from './utils/TestUtils'; +import { getEnv, testSuccess } from './utils/TestUtils'; import { connection as c , forgeops_connection as fc} from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -81,19 +81,19 @@ describe('frodo idm import', () => { test(`"frodo idm schema object import -D ${managedObjectsExportDirectory}": should import the managed objects from the directory ${managedObjectsExportDirectory}`, async () => { const CMD = `frodo idm schema object import -D ${managedObjectsExportDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idm schema object import -i -f ${managedObjectsExportDirectory}/${alphaUserFile}": should import just the alpha user managed object ${managedObjectsExportDirectory}/${alphaUserFile}`, async () => { const CMD = `frodo idm schema object import -i -f ${managedObjectsExportDirectory}/${alphaUserFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idm schema object import -f ${allManagedPath}": should import all managed objects from a single file ${allManagedPath}`, async () => { const CMD = `frodo idm schema object import -f ${allManagedPath}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); // Forgeops Tests diff --git a/test/e2e/idp-delete.e2e.test.js b/test/e2e/idp-delete.e2e.test.js index 6c15e678f..22f92e747 100644 --- a/test/e2e/idp-delete.e2e.test.js +++ b/test/e2e/idp-delete.e2e.test.js @@ -51,7 +51,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -63,6 +63,6 @@ describe('"frodo idp delete -i insta"', () => { test('"frodo idp delete -i insta": should delete idp config with Id insta', async () => { const CMD = `frodo idp delete -i insta`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/idp-import.e2e.test.js b/test/e2e/idp-import.e2e.test.js index 4cefa5b60..ce0512042 100644 --- a/test/e2e/idp-import.e2e.test.js +++ b/test/e2e/idp-import.e2e.test.js @@ -61,7 +61,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -78,67 +78,67 @@ describe('frodo idp import', () => { test(`"frodo idp import -i google -f ${allAlphaProvidersExport}": should import the idp with the id "google" from the file "${allAlphaProvidersExport}"`, async () => { const CMD = `frodo idp import -i google -f ${allAlphaProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idp import --no-deps --idp-id google --file ${allAlphaProvidersExport}": should import the idp with the id "google" from the file "${allAlphaProvidersExport}"`, async () => { const CMD = `frodo idp import --no-deps --idp-id google --file ${allAlphaProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idp import -i google -f ${allAlphaProvidersFileName} -D ${allDirectory}": should import the idp with the id "google" from the file "${allAlphaProvidersExport}"`, async () => { const CMD = `frodo idp import -i google -f ${allAlphaProvidersFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idp import -f ${allAlphaProvidersExport}": should import the first idp from the file "${allAlphaProvidersExport}"`, async () => { const CMD = `frodo idp import -f ${allAlphaProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idp import --no-deps --file ${allAlphaProvidersExport}": should import the first idp from the file "${allAlphaProvidersExport}"`, async () => { const CMD = `frodo idp import --no-deps --file ${allAlphaProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idp import -f ${allAlphaProvidersFileName} -D ${allDirectory}": should import the first idp from the file "${allAlphaProvidersExport}"`, async () => { const CMD = `frodo idp import -f ${allAlphaProvidersFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idp import -af ${allAlphaProvidersExport}": should import all idps from the file "${allAlphaProvidersExport}"`, async () => { const CMD = `frodo idp import -af ${allAlphaProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idp import --all --no-deps --file ${allAlphaProvidersExport}": should import all idps from the file "${allAlphaProvidersExport}"`, async () => { const CMD = `frodo idp import --all --no-deps --file ${allAlphaProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idp import -af ${allAlphaProvidersFileName} -D ${allDirectory}": should import all idps from the file "${allAlphaProvidersExport}"`, async () => { const CMD = `frodo idp import -af ${allAlphaProvidersFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idp import -AD ${allSeparateProvidersDirectory}": should import all idps from the ${allSeparateProvidersDirectory} directory"`, async () => { const CMD = `frodo idp import -AD ${allSeparateProvidersDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo idp import --all-separate --no-deps --directory ${allSeparateProvidersDirectory}": should import all idps from the ${allSeparateProvidersDirectory} directory"`, async () => { const CMD = `frodo idp import --all-separate --no-deps --directory ${allSeparateProvidersDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/idp-list.e2e.test.js b/test/e2e/idp-list.e2e.test.js index 38de5ffd1..d162119d5 100644 --- a/test/e2e/idp-list.e2e.test.js +++ b/test/e2e/idp-list.e2e.test.js @@ -51,7 +51,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -63,6 +63,6 @@ describe('frodo idp list', () => { test('"frodo idp list": should list the ids of the idps', async () => { const CMD = `frodo idp list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/info.e2e.test.js b/test/e2e/info.e2e.test.js index 7e76b3d7e..412113369 100644 --- a/test/e2e/info.e2e.test.js +++ b/test/e2e/info.e2e.test.js @@ -67,7 +67,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import {getEnv, removeAnsiEscapeCodes} from './utils/TestUtils'; +import {getEnv} from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; import { rmSync, writeFileSync } from 'fs'; @@ -91,28 +91,28 @@ describe('frodo info', () => { const CMD = `frodo info ${c.host} ${c.user} ${c.pass}`; const env = getEnv({ ...c, saId: undefined, saJwk: undefined }); const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); test(`frodo info --json`, async () => { const CMD = `frodo info ${c.host} ${c.user} ${c.pass} --json`; const env = getEnv({ ...c, saId: undefined, saJwk: undefined }); const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`frodo info --scriptFriendly`, async () => { const CMD = `frodo info ${c.host} ${c.user} ${c.pass} --scriptFriendly`; const env = getEnv({ ...c, saId: undefined, saJwk: undefined }); const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`frodo info -s`, async () => { const CMD = `frodo info ${c.host} ${c.user} ${c.pass} -s`; const env = getEnv({ ...c, saId: undefined, saJwk: undefined }); const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); @@ -121,28 +121,28 @@ describe('frodo info', () => { const CMD = `frodo info ${c.host} --sa-id ${c.saId} --sa-jwk-file ${jwkFile}`; const env = getEnv({ ...c, user: undefined, pass: undefined }); const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); test(`frodo info --sa-id --sa-jwk-file --json`, async () => { const CMD = `frodo info ${c.host} --sa-id ${c.saId} --sa-jwk-file ${jwkFile} --json`; const env = getEnv({ ...c, user: undefined, pass: undefined }); const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`frodo info --sa-id --sa-jwk-file --scriptFriendly`, async () => { const CMD = `frodo info ${c.host} --sa-id ${c.saId} --sa-jwk-file ${jwkFile} --scriptFriendly`; const env = getEnv({ ...c, user: undefined, pass: undefined }); const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`frodo info --sa-id --sa-jwk-file -s`, async () => { const CMD = `frodo info ${c.host} --sa-id ${c.saId} --sa-jwk-file ${jwkFile} -s`; const env = getEnv({ ...c, user: undefined, pass: undefined }); const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); @@ -154,7 +154,7 @@ describe('frodo info', () => { env.env.FRODO_SA_ID = c.saId; env.env.FRODO_SA_JWK = c.saJwk; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); test(`frodo info --json`, async () => { @@ -164,7 +164,7 @@ describe('frodo info', () => { env.env.FRODO_SA_ID = c.saId; env.env.FRODO_SA_JWK = c.saJwk; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`frodo info --scriptFriendly`, async () => { @@ -174,7 +174,7 @@ describe('frodo info', () => { env.env.FRODO_SA_ID = c.saId; env.env.FRODO_SA_JWK = c.saJwk; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`frodo info -s`, async () => { @@ -184,7 +184,7 @@ describe('frodo info', () => { env.env.FRODO_SA_ID = c.saId; env.env.FRODO_SA_JWK = c.saJwk; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); }); diff --git a/test/e2e/journey-describe.e2e.test.js b/test/e2e/journey-describe.e2e.test.js index 3b6ae5e68..5c8557209 100644 --- a/test/e2e/journey-describe.e2e.test.js +++ b/test/e2e/journey-describe.e2e.test.js @@ -66,7 +66,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; import fs from "fs"; @@ -79,79 +79,79 @@ describe('frodo journey describe', () => { test('"frodo journey describe": should describe all journeys', async () => { const CMD = `frodo journey describe`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe --markdown": should describe all journeys in markdown', async () => { const CMD = `frodo journey describe --markdown`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe -o 4.2.0": should describe all journeys and override version to 4.2.0', async () => { const CMD = `frodo journey describe -o 4.2.0`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe --override-version 4.2.0": should describe all journeys and override version to 4.2.0', async () => { const CMD = `frodo journey describe --override-version 4.2.0`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe -i j00": should describe the j00 journey', async () => { const CMD = `frodo journey describe -i j00`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe --journey-id j00": should describe the j00 journey', async () => { const CMD = `frodo journey describe --journey-id j00`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe -i j00 --markdown": should describe the j00 journey in markdown', async () => { const CMD = `frodo journey describe -i j00 --markdown`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe -i j00 -o 4.2.0": should describe the j00 journey and override version to 4.2.0', async () => { const CMD = `frodo journey describe -i j00 -o 4.2.0`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe -f test/e2e/exports/all/allAlphaJourneys.journey.json": should describe all journeys from file', async () => { const CMD = `frodo journey describe -f test/e2e/exports/all/allAlphaJourneys.journey.json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe --file test/e2e/exports/all/allAlphaJourneys.journey.json": should describe all journeys from file', async () => { const CMD = `frodo journey describe --file test/e2e/exports/all/allAlphaJourneys.journey.json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe -f test/e2e/exports/all/allAlphaJourneys.journey.json --markdown": should describe all journeys from file in markdown', async () => { const CMD = `frodo journey describe -f test/e2e/exports/all/allAlphaJourneys.journey.json --markdown`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe -f test/e2e/exports/all/allAlphaJourneys.journey.json -o 4.2.0": should describe all journeys from file and override version to 4.2.0', async () => { const CMD = `frodo journey describe -f test/e2e/exports/all/allAlphaJourneys.journey.json -o 4.2.0`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey describe -F test1.json": should describe all journeys and write output to test1.json file', async () => { const CMD = `frodo journey describe -F test1.json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() const data = fs.readFileSync("test1.json", 'utf8'); expect(data).toMatchSnapshot(); fs.unlinkSync("test1.json"); @@ -160,7 +160,7 @@ describe('frodo journey describe', () => { test('"frodo journey describe --output-file test2.json": should describe all journeys and write output to test2.json file', async () => { const CMD = `frodo journey describe --output-file test2.json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() const data = fs.readFileSync("test2.json", 'utf8'); expect(data).toMatchSnapshot(); fs.unlinkSync("test2.json"); @@ -169,7 +169,7 @@ describe('frodo journey describe', () => { test('"frodo journey describe -F test3.json --markdown": should describe all journeys and write output to test3.json file in markdown', async () => { const CMD = `frodo journey describe -F test3.json --markdown`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() const data = fs.readFileSync("test3.json", 'utf8'); expect(data).toMatchSnapshot(); fs.unlinkSync("test3.json"); @@ -178,7 +178,7 @@ describe('frodo journey describe', () => { test('"frodo journey describe -F test4.json -o 4.2.0": should describe all journeys and write output to test4.json file and override version to 4.2.0', async () => { const CMD = `frodo journey describe -F test4.json -o 4.2.0`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() const data = fs.readFileSync("test4.json", 'utf8'); expect(data).toMatchSnapshot(); fs.unlinkSync("test4.json"); diff --git a/test/e2e/journey-disable.e2e.test.js b/test/e2e/journey-disable.e2e.test.js index d11e6109f..b85735c9f 100644 --- a/test/e2e/journey-disable.e2e.test.js +++ b/test/e2e/journey-disable.e2e.test.js @@ -52,7 +52,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -64,12 +64,12 @@ describe('frodo journey disable', () => { test('"frodo journey disable -i j10": should disable the journey with id "j10"', async () => { const CMD = `frodo journey disable -i j10`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey disable --journey-id j10": should do nothing special when disabling the journey with id "j10" when it is already disabled', async () => { const CMD = `frodo journey disable --journey-id j10`; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/journey-enable.e2e.test.js b/test/e2e/journey-enable.e2e.test.js index 045256671..dcb6b1085 100644 --- a/test/e2e/journey-enable.e2e.test.js +++ b/test/e2e/journey-enable.e2e.test.js @@ -52,7 +52,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -64,12 +64,12 @@ describe('frodo journey enable', () => { test('"frodo journey enable -i j10": should enable the journey with id "j10"', async () => { const CMD = `frodo journey enable -i j10`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey enable --journey-id j10": should do nothing special when enabling the journey with id "j10" when it is already enabled', async () => { const CMD = `frodo journey enable --journey-id j10`; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/journey-import.e2e.test.js b/test/e2e/journey-import.e2e.test.js index e1076e4a5..62c2be15f 100644 --- a/test/e2e/journey-import.e2e.test.js +++ b/test/e2e/journey-import.e2e.test.js @@ -67,7 +67,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -85,98 +85,98 @@ describe('frodo journey import', () => { test(`"frodo journey import -f ${allSeparateJourneysDirectory}/FrodoTest.journey.json": should import the journey in file "${allSeparateJourneysDirectory}/FrodoTest.journey.json"`, async () => { const CMD = `frodo journey import -f ${allSeparateJourneysDirectory}/FrodoTest.journey.json`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import --verbose -f ${allSeparateJourneysDirectory}/FrodoTest.journey.json": should import the journey in file "${allSeparateJourneysDirectory}/FrodoTest.journey.json"`, async () => { const CMD = `frodo journey import --verbose -f ${allSeparateJourneysDirectory}/FrodoTest.journey.json`; const { stdout, stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() + expect(stderr).toMatchSnapshot() }); test.skip(`"frodo journey import -i j00 -f ${allAlphaJourneysExport} --re-uuid": should import the journey with the id "j00" from the file "${allAlphaJourneysExport}" with new uuids`, async () => { const CMD = `frodo journey import -i j00 -f ${allAlphaJourneysExport} --re-uuid`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import --journey-id j00 -f ${allAlphaJourneysExport} --no-deps": should import the journey with the id "j00" from the file "${allAlphaJourneysExport}" with no deps`, async () => { const CMD = `frodo journey import --journey-id j00 -f ${allAlphaJourneysExport} --no-deps`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import -i j00 -f ${allAlphaJourneysFileName} -D ${allDirectory}": should import the journey with the id "j00" from the file "${allAlphaJourneysExport}"`, async () => { const CMD = `frodo journey import -i j00 -f ${allAlphaJourneysFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import --file ${allAlphaJourneysExport}": should import the first journey from the file "${allAlphaJourneysExport}"`, async () => { const CMD = `frodo journey import --file ${allAlphaJourneysExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test.skip(`"frodo journey import -f ${allAlphaJourneysExport} --re-uuid": should import the first journey from the file "${allAlphaJourneysExport}" with new uuids`, async () => { const CMD = `frodo journey import -f ${allAlphaJourneysExport} --re-uuid`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import --file ${allAlphaJourneysExport} --no-deps": should import the first journey from the file"${allAlphaJourneysExport}" with no deps`, async () => { const CMD = `frodo journey import --file ${allAlphaJourneysExport} --no-deps`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import -f ${allAlphaJourneysFileName} -D ${allDirectory}": should import the first journey from the file "${allAlphaJourneysExport}"`, async () => { const CMD = `frodo journey import -f ${allAlphaJourneysFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import -af ${allAlphaJourneysExport}": should import all journeys from the file "${allAlphaJourneysExport}"`, async () => { const CMD = `frodo journey import -af ${allAlphaJourneysExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test.skip(`"frodo journey import -af ${allAlphaJourneysExport} --re-uuid": should import all journeys from the file "${allAlphaJourneysExport}" with new uuids`, async () => { const CMD = `frodo journey import -af ${allAlphaJourneysExport} --re-uuid`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import --all --file ${allAlphaJourneysExport} --no-deps": should import all journeys from the file"${allAlphaJourneysExport}" with no deps`, async () => { const CMD = `frodo journey import --all --file ${allAlphaJourneysExport} --no-deps`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import -af ${allAlphaJourneysFileName} -D ${allDirectory}": should import all journeys from the file "${allAlphaJourneysExport}"`, async () => { const CMD = `frodo journey import -af ${allAlphaJourneysFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import -AD ${allSeparateJourneysDirectory}": should import all journeys from the ${allSeparateJourneysDirectory} directory"`, async () => { const CMD = `frodo journey import -AD ${allSeparateJourneysDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test.skip(`"frodo journey import -AD ${allSeparateJourneysDirectory} --re-uuid": should import all journeys from the ${allSeparateJourneysDirectory} directory with new uuids`, async () => { const CMD = `frodo journey import -AD ${allSeparateJourneysDirectory} --re-uuid`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import --all-separate --no-deps --directory ${allSeparateJourneysDirectory}": should import all journeys from the ${allSeparateJourneysDirectory} directory with no deps`, async () => { const CMD = `frodo journey import --all-separate --no-deps --directory ${allSeparateJourneysDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo journey import --all-separate --no-deps --directory ${allSeparateLegacyJourneysDirectory}": should not fail with null/undefined object conversion when reading legacy single-tree files`, async () => { @@ -184,9 +184,9 @@ describe('frodo journey import', () => { let output = ''; try { const { stdout, stderr } = await exec(CMD, env); - output = removeAnsiEscapeCodes(`${stdout}\n${stderr}`); + output = `${stdout}\n${stderr}`; } catch (error) { - output = removeAnsiEscapeCodes(`${error.stdout || ''}\n${error.stderr || ''}`); + output = `${error.stdout || ''}\n${error.stderr || ''}`; } expect(output).not.toContain('Cannot convert undefined or null to object'); expect(output).toContain('Importing all journeys from separate files in current directory...'); diff --git a/test/e2e/journey-list.e2e.test.js b/test/e2e/journey-list.e2e.test.js index 081af9b73..483b885ff 100644 --- a/test/e2e/journey-list.e2e.test.js +++ b/test/e2e/journey-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo journey list', () => { test('"frodo journey list": should list the names of the default journeys', async () => { const CMD = `frodo journey list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey list -l": should list the names, status, and tags of the default journeys', async () => { const CMD = `frodo journey list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo journey list --long": should list the names, status, and tags of the default journeys', async () => { const CMD = `frodo journey list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/log-list.e2e.test.js b/test/e2e/log-list.e2e.test.js index ae13cf90a..e3be53e50 100644 --- a/test/e2e/log-list.e2e.test.js +++ b/test/e2e/log-list.e2e.test.js @@ -51,7 +51,6 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { removeAnsiEscapeCodes, testif } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -69,6 +68,6 @@ describe('frodo log list', () => { test('"frodo log list": should list the names of the logs sources', async () => { const CMD = `frodo log list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/mapping-delete.e2e.test.js b/test/e2e/mapping-delete.e2e.test.js index 5ea8fbb14..a5c5f912b 100644 --- a/test/e2e/mapping-delete.e2e.test.js +++ b/test/e2e/mapping-delete.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,25 +67,25 @@ describe('frodo mapping delete', () => { test('"frodo mapping delete -i sync/managedAlpha_user_managedBravo_user": should delete the mapping with id \'sync/managedAlpha_user_managedBravo_user\'', async () => { const CMD = `frodo mapping delete -i sync/managedAlpha_user_managedBravo_user`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo mapping delete --mapping-id mapping/managedBravo_user_managedBravo_user0": should delete the mapping with id \'mapping/managedBravo_user_managedBravo_user0\'', async () => { const CMD = `frodo mapping delete --mapping-id mapping/managedBravo_user_managedBravo_user0`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo mapping delete -a": should delete all mappings', async () => { const CMD = `frodo mapping delete -a`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo mapping delete --all": should do nothing when no mappings can be deleted', async () => { const CMD = `frodo mapping delete --all`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/mapping-import.e2e.test.js b/test/e2e/mapping-import.e2e.test.js index f62b8c0bf..96c0bb996 100644 --- a/test/e2e/mapping-import.e2e.test.js +++ b/test/e2e/mapping-import.e2e.test.js @@ -58,7 +58,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -76,48 +76,48 @@ describe('frodo mapping import', () => { test(`"frodo mapping import -i sync/managedAlpha_application_managedBravo_application -f ${allMappingsExport}": should import the mapping with the id "sync/managedAlpha_application_managedBravo_application" from the file "${allMappingsExport}"`, async () => { const CMD = `frodo mapping import -i sync/managedAlpha_application_managedBravo_application -f ${allMappingsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo mapping import --no-deps --mapping-id mapping/managedBravo_group_managedBravo_group --file ${allMappingsFileName} -D ${allDirectory}": should import the mapping with the id "mapping/managedBravo_group_managedBravo_group" from the file "${allMappingsExport}"`, async () => { const CMD = `frodo mapping import --no-deps --mapping-id mapping/managedBravo_group_managedBravo_group --file ${allMappingsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo mapping import -f ${allMappingsExport}": should import the first mapping from the file "${allMappingsExport}"`, async () => { const CMD = `frodo mapping import -f ${allMappingsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo mapping import --no-deps --file ${allMappingsFileName} --directory ${allDirectory}": should import the first mapping from the file "${allMappingsExport}"`, async () => { const CMD = `frodo mapping import --no-deps --file ${allMappingsFileName} --directory ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo mapping import -af ${allMappingsExport}": should import all mappings from the file "${allMappingsExport}"`, async () => { const CMD = `frodo mapping import -af ${allMappingsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo mapping import --all --no-deps --file ${allMappingsFileName} --directory ${allDirectory}": should import all mappings from the file "${allMappingsExport}"`, async () => { const CMD = `frodo mapping import --all --no-deps --file ${allMappingsFileName} --directory ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo mapping import -AD ${allSeparateMappingsDirectory}": should import all mappings from the ${allSeparateMappingsDirectory} directory"`, async () => { const CMD = `frodo mapping import -AD ${allSeparateMappingsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo mapping import --all-separate --no-deps --directory ${allSeparateMappingsDirectory}": should import all mappings from the ${allSeparateMappingsDirectory} directory"`, async () => { const CMD = `frodo mapping import --all-separate --no-deps --directory ${allSeparateMappingsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/mapping-list.e2e.test.js b/test/e2e/mapping-list.e2e.test.js index ca2c79842..6dbc893b3 100644 --- a/test/e2e/mapping-list.e2e.test.js +++ b/test/e2e/mapping-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo mapping list', () => { test('"frodo mapping list": should list the ids of the mappings', async () => { const CMD = `frodo mapping list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo mapping list -l": should list the ids, display names, sources/targets, and other info of the mappings', async () => { const CMD = `frodo mapping list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo mapping list --long": should list the ids, display names, sources/targets, and other info of the mappings', async () => { const CMD = `frodo mapping list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/mapping-rename.e2e.test.js b/test/e2e/mapping-rename.e2e.test.js index 994499cb1..9bdef4bd4 100644 --- a/test/e2e/mapping-rename.e2e.test.js +++ b/test/e2e/mapping-rename.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -66,24 +66,24 @@ describe('frodo mapping rename', () => { test(`"frodo mapping rename -i sync/managedAlpha_application_managedBravo_application": should rename the mapping with id sync/managedAlpha_application_managedBravo_application to new"`, async () => { const CMD = `frodo mapping rename -i sync/managedAlpha_application_managedBravo_application`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo mapping rename --legacy --mapping-id mapping/managedBravo_group_managedBravo_group": should rename the mapping with id mapping/managedBravo_group_managedBravo_group to legacy"`, async () => { const CMD = `frodo mapping rename --legacy --mapping-id mapping/managedBravo_group_managedBravo_group`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo mapping rename --all": should rename all mappings to new"`, async () => { const CMD = `frodo mapping rename --all`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo mapping rename -al": should rename all mappings to legacy"`, async () => { const CMD = `frodo mapping rename -al`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/am_1076162899/recording.har new file mode 100644 index 000000000..40b1703b0 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-c3d6bcc9-bd16-4b6e-bd06-cf07ad9157c3" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 398, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 614, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 614, + "text": "{\"_id\":\"*\",\"_rev\":\"959929574\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"311468432e97f1f\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"959929574\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "614" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:37:09 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-c3d6bcc9-bd16-4b6e-bd06-cf07ad9157c3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 786, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:37:09.790Z", + "time": 173, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 173 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-c3d6bcc9-bd16-4b6e-bd06-cf07ad9157c3" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1649, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 275, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 275, + "text": "{\"_id\":\"version\",\"_rev\":\"1171477248\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 304c60a9fe7797e1045c631600098d4465b73e4d (2026-April-15 10:21)\",\"revision\":\"304c60a9fe7797e1045c631600098d4465b73e4d\",\"date\":\"2026-April-15 10:21\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1171477248\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "275" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:37:10 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-c3d6bcc9-bd16-4b6e-bd06-cf07ad9157c3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 787, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:37:10.138Z", + "time": 130, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 130 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/environment_1072573434/recording.har new file mode 100644 index 000000000..cb9ba23f2 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/environment_1072573434/recording.har @@ -0,0 +1,125 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1600, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1975, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1975, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:autoaccess:*\",\"description\":\"All Auto Access APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"},{\"scope\":\"fr:iga:*\",\"description\":\"All Identity Governance APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1975" + }, + { + "name": "etag", + "value": "W/\"7b7-tIBWy/EinSCKaoNz4aU2iqiTmFc\"" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:37:10 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "5cf0c28b-4664-4e91-99bc-f08c6a1559b5" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 413, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:37:10.276Z", + "time": 111, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 111 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/iga_2664973160/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/iga_2664973160/recording.har new file mode 100644 index 000000000..f8a314040 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/iga_2664973160/recording.har @@ -0,0 +1,147 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_D/iga", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9b0f7c98306d050a71eae02b6b20605a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1593, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryString", + "value": "" + }, + { + "name": "_pageSize", + "value": "10000" + }, + { + "name": "_pagedResultsOffset", + "value": "0" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" + }, + "response": { + "bodySize": 44022, + "content": { + "encoding": "base64", + "mimeType": "application/json; charset=utf-8", + "size": 44022, + "text": "[\"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\"]" + }, + "cookies": [], + "headers": [ + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "etag", + "value": "W/\"73466-89WIrAJ89vsGCvxkwFrnozkKmHM\"" + }, + { + "name": "vary", + "value": "Accept-Encoding" + }, + { + "name": "content-encoding", + "value": "br" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:37:11 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "6dd459fc-2f1d-4011-a86b-8f4f067507aa" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + }, + { + "name": "transfer-encoding", + "value": "chunked" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:37:10.524Z", + "time": 1030, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 1030 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/oauth2_393036114/recording.har new file mode 100644 index 000000000..fd1f9a21f --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1140, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-c3d6bcc9-bd16-4b6e-bd06-cf07ad9157c3" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1140" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 453, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idm:* fr:iga:*" + }, + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1315, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1315, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idm:* fr:iga:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1315" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:37:10 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-c3d6bcc9-bd16-4b6e-bd06-cf07ad9157c3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 561, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:37:09.980Z", + "time": 152, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 152 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/openidm_3290118515/recording.har new file mode 100644 index 000000000..28ce5809e --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_D_2157136892/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-c3d6bcc9-bd16-4b6e-bd06-cf07ad9157c3" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1661, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/openidm/managed/svcacct/6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f?_fields=%2A" + }, + "response": { + "bodySize": 1035, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1035, + "text": "{\"_id\":\"6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f\",\"_rev\":\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\",\"accountStatus\":\"active\",\"name\":\"frodo-dsevy\",\"description\":null,\"scopes\":[\"fr:am:*\",\"fr:idm:*\",\"fr:iga:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"6HXYr7B1lk8cUVwkHu7mcx2_bhbGr3iISQje39G4W-1nJsC6KfPoCYxaAPeYRI7IqUyrgSmX3WvDybYjtLW1uGtKJ8YEoYaVfNUdcKjKhVMe0kVaf5CQIUgdfIYN_jt4KCL4MBP45Tzs4SQFI4FzujonNhl5cgRuPd8N21ziYnF11iKUKpNsKCSc1OzTYAeE2NM6fnP737gCs4FlJUY_v0qAkmBjqoLHIWxm_1GCJ3UBjcnzmUdCM4Akjftn45Oq_z0N_ZaANSS1twK53PL_hfKiNFWsBn2rJ-tmh4e5r-sx2nBseRHwH0AKtJklMw9lFHufQ9KNG73xZ-WaWtaxc55P3JnYl6kFaiuNDaSTvL3I4b1uKLeT4pUdr4In51bDd7P0gUSKe9LVTfafr50WkxaJ_e07SU1rFi7j41wjd4P7yCY5hBK_ZPvZsTT_6i1-gpBRBJFfpbcZxlhFF3PUf6p4M_Bzkwt4kdyoPErs7D3fXEpIqIHpeStD2G4RbdI-_MqYvJinc5ZXsGnWC44ZHwZj0QhweS7Zsp9ZA--nNTWz5zYwVjraOe5Jv9pBfY9a-DGy4QqKO23sAcZjjjQGf9H-YX-krCLHOjsjVfyMY3xiQPVZJUVMK-ocWqOT7dwvpMGJ8yG57j1OjAB8ZJvqlDduDY9w6fhdI6wVZ5FYwZ8\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:37:10 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1035" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-c3d6bcc9-bd16-4b6e-bd06-cf07ad9157c3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:37:10.192Z", + "time": 218, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 218 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-c3d6bcc9-bd16-4b6e-bd06-cf07ad9157c3" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1661, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/openidm/managed/svcacct/6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f?_fields=%2A" + }, + "response": { + "bodySize": 1035, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1035, + "text": "{\"_id\":\"6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f\",\"_rev\":\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\",\"accountStatus\":\"active\",\"name\":\"frodo-dsevy\",\"description\":null,\"scopes\":[\"fr:am:*\",\"fr:idm:*\",\"fr:iga:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"6HXYr7B1lk8cUVwkHu7mcx2_bhbGr3iISQje39G4W-1nJsC6KfPoCYxaAPeYRI7IqUyrgSmX3WvDybYjtLW1uGtKJ8YEoYaVfNUdcKjKhVMe0kVaf5CQIUgdfIYN_jt4KCL4MBP45Tzs4SQFI4FzujonNhl5cgRuPd8N21ziYnF11iKUKpNsKCSc1OzTYAeE2NM6fnP737gCs4FlJUY_v0qAkmBjqoLHIWxm_1GCJ3UBjcnzmUdCM4Akjftn45Oq_z0N_ZaANSS1twK53PL_hfKiNFWsBn2rJ-tmh4e5r-sx2nBseRHwH0AKtJklMw9lFHufQ9KNG73xZ-WaWtaxc55P3JnYl6kFaiuNDaSTvL3I4b1uKLeT4pUdr4In51bDd7P0gUSKe9LVTfafr50WkxaJ_e07SU1rFi7j41wjd4P7yCY5hBK_ZPvZsTT_6i1-gpBRBJFfpbcZxlhFF3PUf6p4M_Bzkwt4kdyoPErs7D3fXEpIqIHpeStD2G4RbdI-_MqYvJinc5ZXsGnWC44ZHwZj0QhweS7Zsp9ZA--nNTWz5zYwVjraOe5Jv9pBfY9a-DGy4QqKO23sAcZjjjQGf9H-YX-krCLHOjsjVfyMY3xiQPVZJUVMK-ocWqOT7dwvpMGJ8yG57j1OjAB8ZJvqlDduDY9w6fhdI6wVZ5FYwZ8\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:37:10 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1035" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-c3d6bcc9-bd16-4b6e-bd06-cf07ad9157c3" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 683, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:37:10.393Z", + "time": 121, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 121 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/am_1076162899/recording.har new file mode 100644 index 000000000..22e44d05f --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_i_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-3414094a-1b22-4e32-8d7b-86d96ab8cc90" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 398, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 614, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 614, + "text": "{\"_id\":\"*\",\"_rev\":\"959929574\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"311468432e97f1f\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"959929574\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "614" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:46:16 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-3414094a-1b22-4e32-8d7b-86d96ab8cc90" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 786, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:46:16.599Z", + "time": 160, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 160 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-3414094a-1b22-4e32-8d7b-86d96ab8cc90" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1649, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 275, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 275, + "text": "{\"_id\":\"version\",\"_rev\":\"1171477248\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 304c60a9fe7797e1045c631600098d4465b73e4d (2026-April-15 10:21)\",\"revision\":\"304c60a9fe7797e1045c631600098d4465b73e4d\",\"date\":\"2026-April-15 10:21\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1171477248\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "275" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:46:17 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-3414094a-1b22-4e32-8d7b-86d96ab8cc90" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 787, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:46:16.927Z", + "time": 112, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 112 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/environment_1072573434/recording.har new file mode 100644 index 000000000..a328b03a5 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/environment_1072573434/recording.har @@ -0,0 +1,125 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_i_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1600, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1975, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1975, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:autoaccess:*\",\"description\":\"All Auto Access APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"},{\"scope\":\"fr:iga:*\",\"description\":\"All Identity Governance APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1975" + }, + { + "name": "etag", + "value": "W/\"7b7-tIBWy/EinSCKaoNz4aU2iqiTmFc\"" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:46:17 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "64c481c6-9342-4dcf-866f-d0a1648f305b" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 413, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:46:17.045Z", + "time": 102, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 102 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/iga_2664973160/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/iga_2664973160/recording.har new file mode 100644 index 000000000..1e49fdbb4 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/iga_2664973160/recording.har @@ -0,0 +1,147 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_i_D/iga", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9b0f7c98306d050a71eae02b6b20605a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1593, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryString", + "value": "" + }, + { + "name": "_pageSize", + "value": "10000" + }, + { + "name": "_pagedResultsOffset", + "value": "0" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" + }, + "response": { + "bodySize": 44027, + "content": { + "encoding": "base64", + "mimeType": "application/json; charset=utf-8", + "size": 44027, + "text": "[\"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\"]" + }, + "cookies": [], + "headers": [ + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "etag", + "value": "W/\"73466-89WIrAJ89vsGCvxkwFrnozkKmHM\"" + }, + { + "name": "vary", + "value": "Accept-Encoding" + }, + { + "name": "content-encoding", + "value": "br" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:46:17 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "f84710cf-4448-4c6e-9c2b-af785d6bec9a" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + }, + { + "name": "transfer-encoding", + "value": "chunked" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:46:17.257Z", + "time": 575, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 575 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/oauth2_393036114/recording.har new file mode 100644 index 000000000..1c67ce9e5 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_i_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1140, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-3414094a-1b22-4e32-8d7b-86d96ab8cc90" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1140" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 453, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idm:* fr:iga:*" + }, + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1315, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1315, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idm:* fr:iga:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1315" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:46:16 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-3414094a-1b22-4e32-8d7b-86d96ab8cc90" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 561, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:46:16.774Z", + "time": 142, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 142 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/openidm_3290118515/recording.har new file mode 100644 index 000000000..54458ce68 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_D_3629472760/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_i_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-3414094a-1b22-4e32-8d7b-86d96ab8cc90" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1661, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/openidm/managed/svcacct/6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f?_fields=%2A" + }, + "response": { + "bodySize": 1035, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1035, + "text": "{\"_id\":\"6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f\",\"_rev\":\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\",\"accountStatus\":\"active\",\"name\":\"frodo-dsevy\",\"description\":null,\"scopes\":[\"fr:am:*\",\"fr:idm:*\",\"fr:iga:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"6HXYr7B1lk8cUVwkHu7mcx2_bhbGr3iISQje39G4W-1nJsC6KfPoCYxaAPeYRI7IqUyrgSmX3WvDybYjtLW1uGtKJ8YEoYaVfNUdcKjKhVMe0kVaf5CQIUgdfIYN_jt4KCL4MBP45Tzs4SQFI4FzujonNhl5cgRuPd8N21ziYnF11iKUKpNsKCSc1OzTYAeE2NM6fnP737gCs4FlJUY_v0qAkmBjqoLHIWxm_1GCJ3UBjcnzmUdCM4Akjftn45Oq_z0N_ZaANSS1twK53PL_hfKiNFWsBn2rJ-tmh4e5r-sx2nBseRHwH0AKtJklMw9lFHufQ9KNG73xZ-WaWtaxc55P3JnYl6kFaiuNDaSTvL3I4b1uKLeT4pUdr4In51bDd7P0gUSKe9LVTfafr50WkxaJ_e07SU1rFi7j41wjd4P7yCY5hBK_ZPvZsTT_6i1-gpBRBJFfpbcZxlhFF3PUf6p4M_Bzkwt4kdyoPErs7D3fXEpIqIHpeStD2G4RbdI-_MqYvJinc5ZXsGnWC44ZHwZj0QhweS7Zsp9ZA--nNTWz5zYwVjraOe5Jv9pBfY9a-DGy4QqKO23sAcZjjjQGf9H-YX-krCLHOjsjVfyMY3xiQPVZJUVMK-ocWqOT7dwvpMGJ8yG57j1OjAB8ZJvqlDduDY9w6fhdI6wVZ5FYwZ8\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:46:17 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1035" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-3414094a-1b22-4e32-8d7b-86d96ab8cc90" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 683, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:46:16.977Z", + "time": 194, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 194 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-3414094a-1b22-4e32-8d7b-86d96ab8cc90" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1661, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/openidm/managed/svcacct/6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f?_fields=%2A" + }, + "response": { + "bodySize": 1035, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1035, + "text": "{\"_id\":\"6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f\",\"_rev\":\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\",\"accountStatus\":\"active\",\"name\":\"frodo-dsevy\",\"description\":null,\"scopes\":[\"fr:am:*\",\"fr:idm:*\",\"fr:iga:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"6HXYr7B1lk8cUVwkHu7mcx2_bhbGr3iISQje39G4W-1nJsC6KfPoCYxaAPeYRI7IqUyrgSmX3WvDybYjtLW1uGtKJ8YEoYaVfNUdcKjKhVMe0kVaf5CQIUgdfIYN_jt4KCL4MBP45Tzs4SQFI4FzujonNhl5cgRuPd8N21ziYnF11iKUKpNsKCSc1OzTYAeE2NM6fnP737gCs4FlJUY_v0qAkmBjqoLHIWxm_1GCJ3UBjcnzmUdCM4Akjftn45Oq_z0N_ZaANSS1twK53PL_hfKiNFWsBn2rJ-tmh4e5r-sx2nBseRHwH0AKtJklMw9lFHufQ9KNG73xZ-WaWtaxc55P3JnYl6kFaiuNDaSTvL3I4b1uKLeT4pUdr4In51bDd7P0gUSKe9LVTfafr50WkxaJ_e07SU1rFi7j41wjd4P7yCY5hBK_ZPvZsTT_6i1-gpBRBJFfpbcZxlhFF3PUf6p4M_Bzkwt4kdyoPErs7D3fXEpIqIHpeStD2G4RbdI-_MqYvJinc5ZXsGnWC44ZHwZj0QhweS7Zsp9ZA--nNTWz5zYwVjraOe5Jv9pBfY9a-DGy4QqKO23sAcZjjjQGf9H-YX-krCLHOjsjVfyMY3xiQPVZJUVMK-ocWqOT7dwvpMGJ8yG57j1OjAB8ZJvqlDduDY9w6fhdI6wVZ5FYwZ8\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:46:17 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1035" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-3414094a-1b22-4e32-8d7b-86d96ab8cc90" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 683, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:46:17.153Z", + "time": 97, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 97 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/am_1076162899/recording.har new file mode 100644 index 000000000..a046e1dab --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_i_n_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6a3406e1-0703-4996-ba9a-f2b28a633a14" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 398, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 613, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 613, + "text": "{\"_id\":\"*\",\"_rev\":\"959929600\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"311468432e97f1f\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"959929600\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "613" + }, + { + "name": "date", + "value": "Mon, 20 Jul 2026 16:31:59 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6a3406e1-0703-4996-ba9a-f2b28a633a14" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 786, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T16:31:59.129Z", + "time": 152, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 152 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6a3406e1-0703-4996-ba9a-f2b28a633a14" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1926, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 273, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 273, + "text": "{\"_id\":\"version\",\"_rev\":\"-354681370\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 1f76d1d7a157446e8b4f9efa57f73fc2903e106a (2026-July-13 20:55)\",\"revision\":\"1f76d1d7a157446e8b4f9efa57f73fc2903e106a\",\"date\":\"2026-July-13 20:55\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-354681370\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "273" + }, + { + "name": "date", + "value": "Mon, 20 Jul 2026 16:31:59 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6a3406e1-0703-4996-ba9a-f2b28a633a14" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 787, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T16:31:59.472Z", + "time": 121, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 121 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/environment_1072573434/recording.har new file mode 100644 index 000000000..3f41e4a79 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/environment_1072573434/recording.har @@ -0,0 +1,125 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_i_n_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1877, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1910, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1910, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"},{\"scope\":\"fr:iga:*\",\"description\":\"All Identity Governance APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1910" + }, + { + "name": "etag", + "value": "W/\"776-b2xCO2Gdrqb/5HdcH8WdC8M9zoM\"" + }, + { + "name": "date", + "value": "Mon, 20 Jul 2026 16:31:59 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "f7b24261-4ee7-4dd2-b095-9468bf283f71" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T16:31:59.602Z", + "time": 114, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 114 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/iga_2664973160/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/iga_2664973160/recording.har new file mode 100644 index 000000000..c62c3edf4 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/iga_2664973160/recording.har @@ -0,0 +1,147 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_i_n_D/iga", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9b0f7c98306d050a71eae02b6b20605a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1870, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryString", + "value": "" + }, + { + "name": "_pageSize", + "value": "10000" + }, + { + "name": "_pagedResultsOffset", + "value": "0" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" + }, + "response": { + "bodySize": 40341, + "content": { + "encoding": "base64", + "mimeType": "application/json; charset=utf-8", + "size": 40341, + "text": "[\"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\"]" + }, + "cookies": [], + "headers": [ + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "etag", + "value": "W/\"b618e-qA55W9GZWBCwIS6PqPWJCeig5n0\"" + }, + { + "name": "vary", + "value": "Accept-Encoding" + }, + { + "name": "content-encoding", + "value": "br" + }, + { + "name": "date", + "value": "Mon, 20 Jul 2026 16:32:00 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "b57124bb-5381-4576-a509-d30c4ed62422" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + }, + { + "name": "transfer-encoding", + "value": "chunked" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T16:31:59.834Z", + "time": 972, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 972 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/oauth2_393036114/recording.har new file mode 100644 index 000000000..665c42704 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_i_n_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1328, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6a3406e1-0703-4996-ba9a-f2b28a633a14" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1328" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 453, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:idc:esv:* fr:idc:content-security-policy:* fr:iga:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1780, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1780, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:idc:esv:* fr:idc:content-security-policy:* fr:iga:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1780" + }, + { + "name": "date", + "value": "Mon, 20 Jul 2026 16:31:59 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6a3406e1-0703-4996-ba9a-f2b28a633a14" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 561, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T16:31:59.299Z", + "time": 166, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 166 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/openidm_3290118515/recording.har new file mode 100644 index 000000000..67adf4b2f --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_i_n_D_2975178029/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_i_n_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6a3406e1-0703-4996-ba9a-f2b28a633a14" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1938, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/openidm/managed/svcacct/10d76629-78da-4265-868b-9a0cb68ebdb4?_fields=%2A" + }, + "response": { + "bodySize": 1382, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1382, + "text": "{\"_id\":\"10d76629-78da-4265-868b-9a0cb68ebdb4\",\"_rev\":\"86842101-a5a1-4dfd-ad6b-276156428ce8-5845\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1777919406717\",\"description\":\"dsevy@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idm:*\",\"fr:iga:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"hshlr1hlp8bXdLNDrh3rESiHNsMS68c4XtbZX9i_Seg\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"owg6VJta_1o9VqyQk4Xs2kA_BDcyWEN1WMERqaJIFCbtecz_IMBp2G5m76dawbB9QvUsFvMqfJ2OGbaCcfC2o5lkxEu4nxdKLKYZ4-JTGsbPN6j-f9yr0LCjFMPd1BRxKQ98euSu5UZ0_gy9QN-eS4zB5zJsb8E7Y7FXsxG6vgd8dCqCSPjJeSmZhnQEeqJeysGlA5jMzQUP9Lvgm2aZp5wz7DXzF9lvsqRjm49H9wlERjy4KDmjlp5Rr3lz8ZXGgsaIdp18hUrPFKJP5qxkICfnbxdyK858A5puUypj1OAqrOtAnwjk5lMPOYzBWjWV72RPnOY3-6KAHo8uFXK3EH8AN8ErHxhpo-soV0e7-Z7gEnmt0rliY3j_-2AHA0Q5G1k52cGQ-dARGzgAQacpdnQv_pT0k83DGZPrpR6PqBRkyiJBD_PTvySZohxFgjpJfJmkYec7Pg40xri_LN1ozkLRBdQwL2zaQFYtq_VZC20a8Y7NpqpoLcvFIB9W2NS03qTokvId7gdSgdcVmpOo4n7OZZCouD6cyWyJ6Nj9uaxz-mw4Mdzhpd8cclSV_gXeWMBBoW3dZ7zzkEFMWHBT2x9S8JAZor_aaGJ2MXOoNoHRg-q9shNhQ3h7U14MXfL7I9R4ixClZMOpxILa0VT0Vzm-h685xkXwa28WLSw21QU\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Mon, 20 Jul 2026 16:31:59 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"86842101-a5a1-4dfd-ad6b-276156428ce8-5845\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1382" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6a3406e1-0703-4996-ba9a-f2b28a633a14" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T16:31:59.516Z", + "time": 168, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 168 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6a3406e1-0703-4996-ba9a-f2b28a633a14" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1938, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/openidm/managed/svcacct/10d76629-78da-4265-868b-9a0cb68ebdb4?_fields=%2A" + }, + "response": { + "bodySize": 1382, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1382, + "text": "{\"_id\":\"10d76629-78da-4265-868b-9a0cb68ebdb4\",\"_rev\":\"86842101-a5a1-4dfd-ad6b-276156428ce8-5845\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1777919406717\",\"description\":\"dsevy@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idm:*\",\"fr:iga:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"hshlr1hlp8bXdLNDrh3rESiHNsMS68c4XtbZX9i_Seg\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"owg6VJta_1o9VqyQk4Xs2kA_BDcyWEN1WMERqaJIFCbtecz_IMBp2G5m76dawbB9QvUsFvMqfJ2OGbaCcfC2o5lkxEu4nxdKLKYZ4-JTGsbPN6j-f9yr0LCjFMPd1BRxKQ98euSu5UZ0_gy9QN-eS4zB5zJsb8E7Y7FXsxG6vgd8dCqCSPjJeSmZhnQEeqJeysGlA5jMzQUP9Lvgm2aZp5wz7DXzF9lvsqRjm49H9wlERjy4KDmjlp5Rr3lz8ZXGgsaIdp18hUrPFKJP5qxkICfnbxdyK858A5puUypj1OAqrOtAnwjk5lMPOYzBWjWV72RPnOY3-6KAHo8uFXK3EH8AN8ErHxhpo-soV0e7-Z7gEnmt0rliY3j_-2AHA0Q5G1k52cGQ-dARGzgAQacpdnQv_pT0k83DGZPrpR6PqBRkyiJBD_PTvySZohxFgjpJfJmkYec7Pg40xri_LN1ozkLRBdQwL2zaQFYtq_VZC20a8Y7NpqpoLcvFIB9W2NS03qTokvId7gdSgdcVmpOo4n7OZZCouD6cyWyJ6Nj9uaxz-mw4Mdzhpd8cclSV_gXeWMBBoW3dZ7zzkEFMWHBT2x9S8JAZor_aaGJ2MXOoNoHRg-q9shNhQ3h7U14MXfL7I9R4ixClZMOpxILa0VT0Vzm-h685xkXwa28WLSw21QU\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Mon, 20 Jul 2026 16:31:59 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"86842101-a5a1-4dfd-ad6b-276156428ce8-5845\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1382" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6a3406e1-0703-4996-ba9a-f2b28a633a14" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T16:31:59.724Z", + "time": 104, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 104 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/am_1076162899/recording.har new file mode 100644 index 000000000..ee30cc79b --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_n_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1b1998fd-6986-42a2-8719-7e9c82c0b6eb" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 398, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 614, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 614, + "text": "{\"_id\":\"*\",\"_rev\":\"959929574\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"311468432e97f1f\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"959929574\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "614" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:45:30 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1b1998fd-6986-42a2-8719-7e9c82c0b6eb" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 786, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:45:30.410Z", + "time": 170, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 170 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1b1998fd-6986-42a2-8719-7e9c82c0b6eb" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1649, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 275, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 275, + "text": "{\"_id\":\"version\",\"_rev\":\"1171477248\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 304c60a9fe7797e1045c631600098d4465b73e4d (2026-April-15 10:21)\",\"revision\":\"304c60a9fe7797e1045c631600098d4465b73e4d\",\"date\":\"2026-April-15 10:21\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1171477248\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "275" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:45:30 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1b1998fd-6986-42a2-8719-7e9c82c0b6eb" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 787, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:45:30.741Z", + "time": 122, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 122 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/environment_1072573434/recording.har new file mode 100644 index 000000000..4727b3f43 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/environment_1072573434/recording.har @@ -0,0 +1,125 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_n_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1600, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1975, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1975, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:autoaccess:*\",\"description\":\"All Auto Access APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"},{\"scope\":\"fr:iga:*\",\"description\":\"All Identity Governance APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1975" + }, + { + "name": "etag", + "value": "W/\"7b7-tIBWy/EinSCKaoNz4aU2iqiTmFc\"" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:45:30 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "d698b643-188a-4648-9513-dd74c2891e6f" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 413, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:45:30.868Z", + "time": 114, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 114 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/iga_2664973160/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/iga_2664973160/recording.har new file mode 100644 index 000000000..d0fb271e2 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/iga_2664973160/recording.har @@ -0,0 +1,147 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_n_D/iga", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9b0f7c98306d050a71eae02b6b20605a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1593, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryString", + "value": "" + }, + { + "name": "_pageSize", + "value": "10000" + }, + { + "name": "_pagedResultsOffset", + "value": "0" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" + }, + "response": { + "bodySize": 44033, + "content": { + "encoding": "base64", + "mimeType": "application/json; charset=utf-8", + "size": 44033, + "text": "[\"W2U0Rx3RdFbbQ0B14OD6h2nZjuv5/r98Z/8/mu7UOyvCQZZVH31KXJ8+BJy0+yZAG+gfYqVLqi27glzlrpIAH6K13mj8xsP3//uWlrm8iYwLEsXKNMshZ3e5si5UpiC75p2jql8VdHUj6AYQAAQDG9gAnOW99933/q9fBo3qJqZhOAcgx2DINSBnLSW/xsv5UEpyLsAB5UyQKAr//9VNdjfAGa51mawNcqUBnZLcLuJaDNEDXra2SSqxygb+GPPpd3NnuhERntYtR1bfy50xBEGaZPcxNP/v2rfb/tkMR4wiIgLaZahWfWv27xNj2AZJCLHyGBrWdM4/V5xEweAIrzEmVtufC3CzNTlQ719j/Wf/vtbKExAxSd/spjdymaz/ZJDq4Y0YTSrSqGDalR3M0F+SwD+Vn72yw4U7HElMrNojqcjHYKN5+6TPZTjzVXBemP/36TAYZx87HA9IKrI0/NcSjLPGbklMFjPv3R3+c+tUHzAm3zw+k6qISRjwECgjxOXPPvhP9LPq71R4mhei7cqs5ZngxWNxHvoquFPhCb5KZAGJd31V1Rux+DrcDnjITTHB4qsnlR37PiZuHFoH4ZE3N5vr31YEzU2kWuIeUPt7HRmlRamaMu0KMsVpfdKb1S+ri7vHvxWFbd7yvOFKZGR6xHf9q9PUfF32SGKi2sH5UPhH3sgVzl5FKlKTq0T9k+rFGNAvagKncHLicTn5a62txtcES/UP/fWLRQ/v30MgZiNfCv+GdAY/hX8JD+ljYjRUqaoZLDLkVz0jMTFh9XrwGEJeXWvwI04xaR/3BFK95UIfg3wFMfH4HdthzwMqBLNNYC0m6+sPjhvPnqHUnzg9xgSf0Q6vEBeDnPVGGt9RUpFM6Z2HuwI1maC5YhQbfPjz9/PeWI2eQq3HpEvm75Ztj6TiMdFqQFK95dAwLu3Agyee8IS/yacn/AP9wMSHPP2Qpx9omqaz2SwZ3Pr2+nbwxm5PZmSaYoKvB+NpOfJGzmsAVEFGTxNj/0Kr14PxqGvjPnj8mrF43nqaWsaRKeYZsmled46qoVKUHcX2JhlcD5jhI+A31RtdtIGBiIZ+Fol3eJnHC5DBj0heLtPOYqMPfP7P6bMa8EUd56LEQpStYFKKps9cfiepyFTDgMM/elKR3m236BNjO3dSk81orbFbaA==\",\"kyuwpYpK7Qg=\",\"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\",\"wWCYQTYu++lOdPYjdCgR0Ei9Bz6cU23nFJBDPw==\",\"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\"]" + }, + "cookies": [], + "headers": [ + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "etag", + "value": "W/\"73466-89WIrAJ89vsGCvxkwFrnozkKmHM\"" + }, + { + "name": "vary", + "value": "Accept-Encoding" + }, + { + "name": "content-encoding", + "value": "br" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:45:32 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "3fb53413-2739-4ba5-8b5e-261db6fbe362" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + }, + { + "name": "transfer-encoding", + "value": "chunked" + } + ], + "headersSize": 485, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:45:31.097Z", + "time": 976, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 976 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/oauth2_393036114/recording.har new file mode 100644 index 000000000..f6302d81a --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_n_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1140, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1b1998fd-6986-42a2-8719-7e9c82c0b6eb" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1140" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 453, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idm:* fr:iga:*" + }, + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1315, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1315, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idm:* fr:iga:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1315" + }, + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:45:30 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1b1998fd-6986-42a2-8719-7e9c82c0b6eb" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 561, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:45:30.601Z", + "time": 133, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 133 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/openidm_3290118515/recording.har new file mode 100644 index 000000000..3b0ebf34c --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_n_D_3738999489/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_n_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1b1998fd-6986-42a2-8719-7e9c82c0b6eb" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1661, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/openidm/managed/svcacct/6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f?_fields=%2A" + }, + "response": { + "bodySize": 1035, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1035, + "text": "{\"_id\":\"6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f\",\"_rev\":\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\",\"accountStatus\":\"active\",\"name\":\"frodo-dsevy\",\"description\":null,\"scopes\":[\"fr:am:*\",\"fr:idm:*\",\"fr:iga:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"6HXYr7B1lk8cUVwkHu7mcx2_bhbGr3iISQje39G4W-1nJsC6KfPoCYxaAPeYRI7IqUyrgSmX3WvDybYjtLW1uGtKJ8YEoYaVfNUdcKjKhVMe0kVaf5CQIUgdfIYN_jt4KCL4MBP45Tzs4SQFI4FzujonNhl5cgRuPd8N21ziYnF11iKUKpNsKCSc1OzTYAeE2NM6fnP737gCs4FlJUY_v0qAkmBjqoLHIWxm_1GCJ3UBjcnzmUdCM4Akjftn45Oq_z0N_ZaANSS1twK53PL_hfKiNFWsBn2rJ-tmh4e5r-sx2nBseRHwH0AKtJklMw9lFHufQ9KNG73xZ-WaWtaxc55P3JnYl6kFaiuNDaSTvL3I4b1uKLeT4pUdr4In51bDd7P0gUSKe9LVTfafr50WkxaJ_e07SU1rFi7j41wjd4P7yCY5hBK_ZPvZsTT_6i1-gpBRBJFfpbcZxlhFF3PUf6p4M_Bzkwt4kdyoPErs7D3fXEpIqIHpeStD2G4RbdI-_MqYvJinc5ZXsGnWC44ZHwZj0QhweS7Zsp9ZA--nNTWz5zYwVjraOe5Jv9pBfY9a-DGy4QqKO23sAcZjjjQGf9H-YX-krCLHOjsjVfyMY3xiQPVZJUVMK-ocWqOT7dwvpMGJ8yG57j1OjAB8ZJvqlDduDY9w6fhdI6wVZ5FYwZ8\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:45:30 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1035" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1b1998fd-6986-42a2-8719-7e9c82c0b6eb" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:45:30.783Z", + "time": 185, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 185 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1b1998fd-6986-42a2-8719-7e9c82c0b6eb" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1661, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/openidm/managed/svcacct/6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f?_fields=%2A" + }, + "response": { + "bodySize": 1035, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1035, + "text": "{\"_id\":\"6b65c0a2-3ecd-4d7b-a52a-8c0a5c326f3f\",\"_rev\":\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\",\"accountStatus\":\"active\",\"name\":\"frodo-dsevy\",\"description\":null,\"scopes\":[\"fr:am:*\",\"fr:idm:*\",\"fr:iga:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"e\\\":\\\"AQAB\\\",\\\"kty\\\":\\\"RSA\\\",\\\"n\\\":\\\"6HXYr7B1lk8cUVwkHu7mcx2_bhbGr3iISQje39G4W-1nJsC6KfPoCYxaAPeYRI7IqUyrgSmX3WvDybYjtLW1uGtKJ8YEoYaVfNUdcKjKhVMe0kVaf5CQIUgdfIYN_jt4KCL4MBP45Tzs4SQFI4FzujonNhl5cgRuPd8N21ziYnF11iKUKpNsKCSc1OzTYAeE2NM6fnP737gCs4FlJUY_v0qAkmBjqoLHIWxm_1GCJ3UBjcnzmUdCM4Akjftn45Oq_z0N_ZaANSS1twK53PL_hfKiNFWsBn2rJ-tmh4e5r-sx2nBseRHwH0AKtJklMw9lFHufQ9KNG73xZ-WaWtaxc55P3JnYl6kFaiuNDaSTvL3I4b1uKLeT4pUdr4In51bDd7P0gUSKe9LVTfafr50WkxaJ_e07SU1rFi7j41wjd4P7yCY5hBK_ZPvZsTT_6i1-gpBRBJFfpbcZxlhFF3PUf6p4M_Bzkwt4kdyoPErs7D3fXEpIqIHpeStD2G4RbdI-_MqYvJinc5ZXsGnWC44ZHwZj0QhweS7Zsp9ZA--nNTWz5zYwVjraOe5Jv9pBfY9a-DGy4QqKO23sAcZjjjQGf9H-YX-krCLHOjsjVfyMY3xiQPVZJUVMK-ocWqOT7dwvpMGJ8yG57j1OjAB8ZJvqlDduDY9w6fhdI6wVZ5FYwZ8\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Tue, 28 Apr 2026 19:45:31 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"58ad10bd-a1f8-4e41-95b6-b6d4365502cf-28632\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1035" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-1b1998fd-6986-42a2-8719-7e9c82c0b6eb" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 683, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-28T19:45:30.995Z", + "time": 97, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 97 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/am_1076162899/recording.har new file mode 100644 index 000000000..e4081b4d9 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_name_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7ded58f3-aa63-4e49-91a1-b94666e82452" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 398, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 613, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 613, + "text": "{\"_id\":\"*\",\"_rev\":\"959929600\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"311468432e97f1f\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"959929600\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "613" + }, + { + "name": "date", + "value": "Mon, 20 Jul 2026 15:57:20 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7ded58f3-aa63-4e49-91a1-b94666e82452" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 761, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T15:57:20.417Z", + "time": 156, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 156 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7ded58f3-aa63-4e49-91a1-b94666e82452" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1926, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 273, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 273, + "text": "{\"_id\":\"version\",\"_rev\":\"-354681370\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 1f76d1d7a157446e8b4f9efa57f73fc2903e106a (2026-July-13 20:55)\",\"revision\":\"1f76d1d7a157446e8b4f9efa57f73fc2903e106a\",\"date\":\"2026-July-13 20:55\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-354681370\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "273" + }, + { + "name": "date", + "value": "Mon, 20 Jul 2026 15:57:20 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7ded58f3-aa63-4e49-91a1-b94666e82452" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 762, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T15:57:20.753Z", + "time": 132, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 132 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/environment_1072573434/recording.har new file mode 100644 index 000000000..beb41d72e --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/environment_1072573434/recording.har @@ -0,0 +1,125 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_name_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1877, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1910, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1910, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"},{\"scope\":\"fr:iga:*\",\"description\":\"All Identity Governance APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1910" + }, + { + "name": "etag", + "value": "W/\"776-b2xCO2Gdrqb/5HdcH8WdC8M9zoM\"" + }, + { + "name": "date", + "value": "Mon, 20 Jul 2026 15:57:20 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "8842ab58-48c6-42aa-814c-8c7ca0108738" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T15:57:20.891Z", + "time": 112, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 112 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/iga_2664973160/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/iga_2664973160/recording.har new file mode 100644 index 000000000..c104071f0 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/iga_2664973160/recording.har @@ -0,0 +1,147 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_name_D/iga", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9b0f7c98306d050a71eae02b6b20605a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1870, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_queryString", + "value": "" + }, + { + "name": "_pageSize", + "value": "10000" + }, + { + "name": "_pagedResultsOffset", + "value": "0" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" + }, + "response": { + "bodySize": 40348, + "content": { + "encoding": "base64", + "mimeType": "application/json; charset=utf-8", + "size": 40348, + "text": "[\"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\"]" + }, + "cookies": [], + "headers": [ + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "etag", + "value": "W/\"b618e-qA55W9GZWBCwIS6PqPWJCeig5n0\"" + }, + { + "name": "vary", + "value": "Accept-Encoding" + }, + { + "name": "content-encoding", + "value": "br" + }, + { + "name": "date", + "value": "Mon, 20 Jul 2026 15:57:23 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "5b869f37-bcda-428d-9350-29c727bd43c6" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + }, + { + "name": "transfer-encoding", + "value": "chunked" + } + ], + "headersSize": 460, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T15:57:21.120Z", + "time": 2283, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 2283 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/oauth2_393036114/recording.har new file mode 100644 index 000000000..0398fa249 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_name_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1328, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7ded58f3-aa63-4e49-91a1-b94666e82452" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1328" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 453, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:idc:esv:* fr:idc:content-security-policy:* fr:iga:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-trivir-fairfax.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1780, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1780, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:idc:esv:* fr:idc:content-security-policy:* fr:iga:* fr:idc:certificate:* fr:idm:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1780" + }, + { + "name": "date", + "value": "Mon, 20 Jul 2026 15:57:20 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7ded58f3-aa63-4e49-91a1-b94666e82452" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 536, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T15:57:20.587Z", + "time": 159, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 159 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/openidm_3290118515/recording.har new file mode 100644 index 000000000..d78188df5 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/pull_2167214206/iga-workflows_1855750639/0_name_D_939994592/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/pull/iga-workflows/0_name_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7ded58f3-aa63-4e49-91a1-b94666e82452" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1938, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/openidm/managed/svcacct/10d76629-78da-4265-868b-9a0cb68ebdb4?_fields=%2A" + }, + "response": { + "bodySize": 1382, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1382, + "text": "{\"_id\":\"10d76629-78da-4265-868b-9a0cb68ebdb4\",\"_rev\":\"86842101-a5a1-4dfd-ad6b-276156428ce8-5845\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1777919406717\",\"description\":\"dsevy@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idm:*\",\"fr:iga:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"hshlr1hlp8bXdLNDrh3rESiHNsMS68c4XtbZX9i_Seg\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"owg6VJta_1o9VqyQk4Xs2kA_BDcyWEN1WMERqaJIFCbtecz_IMBp2G5m76dawbB9QvUsFvMqfJ2OGbaCcfC2o5lkxEu4nxdKLKYZ4-JTGsbPN6j-f9yr0LCjFMPd1BRxKQ98euSu5UZ0_gy9QN-eS4zB5zJsb8E7Y7FXsxG6vgd8dCqCSPjJeSmZhnQEeqJeysGlA5jMzQUP9Lvgm2aZp5wz7DXzF9lvsqRjm49H9wlERjy4KDmjlp5Rr3lz8ZXGgsaIdp18hUrPFKJP5qxkICfnbxdyK858A5puUypj1OAqrOtAnwjk5lMPOYzBWjWV72RPnOY3-6KAHo8uFXK3EH8AN8ErHxhpo-soV0e7-Z7gEnmt0rliY3j_-2AHA0Q5G1k52cGQ-dARGzgAQacpdnQv_pT0k83DGZPrpR6PqBRkyiJBD_PTvySZohxFgjpJfJmkYec7Pg40xri_LN1ozkLRBdQwL2zaQFYtq_VZC20a8Y7NpqpoLcvFIB9W2NS03qTokvId7gdSgdcVmpOo4n7OZZCouD6cyWyJ6Nj9uaxz-mw4Mdzhpd8cclSV_gXeWMBBoW3dZ7zzkEFMWHBT2x9S8JAZor_aaGJ2MXOoNoHRg-q9shNhQ3h7U14MXfL7I9R4ixClZMOpxILa0VT0Vzm-h685xkXwa28WLSw21QU\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Mon, 20 Jul 2026 15:57:20 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"86842101-a5a1-4dfd-ad6b-276156428ce8-5845\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1382" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7ded58f3-aa63-4e49-91a1-b94666e82452" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 657, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T15:57:20.804Z", + "time": 187, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 187 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-39" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7ded58f3-aa63-4e49-91a1-b94666e82452" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1938, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-trivir-fairfax.forgeblocks.com/openidm/managed/svcacct/10d76629-78da-4265-868b-9a0cb68ebdb4?_fields=%2A" + }, + "response": { + "bodySize": 1382, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1382, + "text": "{\"_id\":\"10d76629-78da-4265-868b-9a0cb68ebdb4\",\"_rev\":\"86842101-a5a1-4dfd-ad6b-276156428ce8-5845\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1777919406717\",\"description\":\"dsevy@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idm:*\",\"fr:iga:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"hshlr1hlp8bXdLNDrh3rESiHNsMS68c4XtbZX9i_Seg\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"owg6VJta_1o9VqyQk4Xs2kA_BDcyWEN1WMERqaJIFCbtecz_IMBp2G5m76dawbB9QvUsFvMqfJ2OGbaCcfC2o5lkxEu4nxdKLKYZ4-JTGsbPN6j-f9yr0LCjFMPd1BRxKQ98euSu5UZ0_gy9QN-eS4zB5zJsb8E7Y7FXsxG6vgd8dCqCSPjJeSmZhnQEeqJeysGlA5jMzQUP9Lvgm2aZp5wz7DXzF9lvsqRjm49H9wlERjy4KDmjlp5Rr3lz8ZXGgsaIdp18hUrPFKJP5qxkICfnbxdyK858A5puUypj1OAqrOtAnwjk5lMPOYzBWjWV72RPnOY3-6KAHo8uFXK3EH8AN8ErHxhpo-soV0e7-Z7gEnmt0rliY3j_-2AHA0Q5G1k52cGQ-dARGzgAQacpdnQv_pT0k83DGZPrpR6PqBRkyiJBD_PTvySZohxFgjpJfJmkYec7Pg40xri_LN1ozkLRBdQwL2zaQFYtq_VZC20a8Y7NpqpoLcvFIB9W2NS03qTokvId7gdSgdcVmpOo4n7OZZCouD6cyWyJ6Nj9uaxz-mw4Mdzhpd8cclSV_gXeWMBBoW3dZ7zzkEFMWHBT2x9S8JAZor_aaGJ2MXOoNoHRg-q9shNhQ3h7U14MXfL7I9R4ixClZMOpxILa0VT0Vzm-h685xkXwa28WLSw21QU\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Mon, 20 Jul 2026 15:57:21 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"86842101-a5a1-4dfd-ad6b-276156428ce8-5845\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1382" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7ded58f3-aa63-4e49-91a1-b94666e82452" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 657, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-20T15:57:21.009Z", + "time": 105, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 105 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/am_1076162899/recording.har new file mode 100644 index 000000000..9ebb16c41 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:09:55.545Z", + "time": 130, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 130 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1913, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 272, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 272, + "text": "{\"_id\":\"version\",\"_rev\":\"652844272\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build b740131a0f78378edca640cebb2de303d53d7226 (2026-July-13 13:43)\",\"revision\":\"b740131a0f78378edca640cebb2de303d53d7226\",\"date\":\"2026-July-13 13:43\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "272" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1174, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:09:55.950Z", + "time": 85, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 85 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/environment_1072573434/recording.har new file mode 100644 index 000000000..4a03dae23 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/environment_1072573434/recording.har @@ -0,0 +1,447 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1864, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:09:56.048Z", + "time": 75, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 75 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1848, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 26, + "content": { + "mimeType": "application/json", + "size": 26, + "text": "{\"restartStatus\":\"ready\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "26" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:09:56.210Z", + "time": 256, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 256 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1848, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 26, + "content": { + "mimeType": "application/json", + "size": 26, + "text": "{\"restartStatus\":\"ready\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "26" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:09:56.477Z", + "time": 257, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 257 + } + }, + { + "_id": "3b77ccc66e1a72d4eb051085c282ed9f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 4, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "4" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1884, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [] + }, + "queryString": [ + { + "name": "_action", + "value": "restart" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup?_action=restart" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:09:56.743Z", + "time": 118, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 118 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/oauth2_393036114/recording.har new file mode 100644 index 000000000..d94d1260f --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/oauth2_393036114/recording.har @@ -0,0 +1,278 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1432, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1432" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idc:analytics:* fr:idc:direct-configuration:session:* fr:autoaccess:* fr:idc:certificate:* fr:idc:content-security-policy:* fr:idc:cookie-domain:* fr:idc:custom-domain:* fr:idc:dataset:* fr:idc:esv:* fr:idm:* fr:iga:* fr:idc:promotion:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:proxy-connect:* fr:idc:ws:admin" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 188, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 188, + "text": "{\"error_description\":\"Unsupported scope for service account: fr:idc:ws:admin,fr:idc:proxy-connect:*,fr:autoaccess:*,fr:iga:*,fr:idc:direct-configuration:session:*\",\"error\":\"invalid_scope\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "188" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 950, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 400, + "statusText": "Bad Request" + }, + "startedDateTime": "2026-07-21T19:09:55.698Z", + "time": 87, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 87 + } + }, + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 1330, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1330" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idc:analytics:* fr:idc:certificate:* fr:idc:content-security-policy:* fr:idc:cookie-domain:* fr:idc:custom-domain:* fr:idc:dataset:* fr:idc:esv:* fr:idm:* fr:idc:promotion:* fr:idc:release:* fr:idc:sso-cookie:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1788, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1788, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:idc:content-security-policy:* fr:idc:esv:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1788" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 951, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:09:55.791Z", + "time": 137, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 137 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/openidm_3290118515/recording.har new file mode 100644 index 000000000..3790a451f --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_890022063/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7a1178d1-471a-4877-9480-87708b48ebda" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1971, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/810dd2f4-874b-4aad-9e0a-f8a57789f182?_fields=%2A" + }, + "response": { + "bodySize": 1408, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1408, + "text": "{\"_id\":\"810dd2f4-874b-4aad-9e0a-f8a57789f182\",\"_rev\":\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1773261131370\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:autoaccess:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:ws:admin\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"GIyq6foAjk7VGtM7NyJQZMEUxtAgSe02sjjgp4ey4go\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"rBa78YjWw5-Hkd2rP8uuY2fikjMf9FVeP2AUabFL2qqgVCJxs035yKQDlMAYAFnKaSUXME0vXhZKNkP5ZsWdYAl_sS-0o8HBO4AQk8dXSB--NnkPd0S-6c-sb01oy5tet1WFiKI8dfhzH9KZ65oy3ouzaSsnTjIpFQNMVaq1qQE3m2gPnmwMoRQZdP_hClkXMTtkdRapTL_cdxw7tYGGwpjFz2IJRX-fjFpE79NZdQ_dUaeWOm3tnoHAHjh01IrFu7qlT0o5Bf7-gDvoXU3eYAy5D9LcZAeXr8DiEqK-2aBltV43JSk-Z119DQhRUOFOVMlfbZzHYcWlMgPHBnneleAzChhaDnTxd3NGfqF329wfxQHUaGdj7-eVlXEEYIxmzVwFOiEK0ogEtyvkrlYqQiarxSGt1teNShBpb2QtKL4UPLh7ufxe6K961QuL-FmCkKbjGFxYY0PTegeIsf3rYTNKJRpADC9rGPDF67c5yuMbbBZU9G_GRq5Lj8yS5vG94oCM7PGmKzxxavS7neBu0BH6cqn_u6kuvbfcLtmszo7JqMnY6SqPIp0PU1wfizkjeXKG0s_6rtqQ57pH5IpZTUYwCrtkqcOLEColrUwort43MY12P-ELDuq-IaZFRxJWn8A9dqplVJzOQViUfHHtTVu5W2KiumLSXsxWUsQTb8E\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 22 Apr 2026 16:44:49 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1408" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7a1178d1-471a-4877-9480-87708b48ebda" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T16:44:49.820Z", + "time": 191, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 191 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7a1178d1-471a-4877-9480-87708b48ebda" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1971, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/810dd2f4-874b-4aad-9e0a-f8a57789f182?_fields=%2A" + }, + "response": { + "bodySize": 1408, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1408, + "text": "{\"_id\":\"810dd2f4-874b-4aad-9e0a-f8a57789f182\",\"_rev\":\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1773261131370\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:autoaccess:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:ws:admin\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"GIyq6foAjk7VGtM7NyJQZMEUxtAgSe02sjjgp4ey4go\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"rBa78YjWw5-Hkd2rP8uuY2fikjMf9FVeP2AUabFL2qqgVCJxs035yKQDlMAYAFnKaSUXME0vXhZKNkP5ZsWdYAl_sS-0o8HBO4AQk8dXSB--NnkPd0S-6c-sb01oy5tet1WFiKI8dfhzH9KZ65oy3ouzaSsnTjIpFQNMVaq1qQE3m2gPnmwMoRQZdP_hClkXMTtkdRapTL_cdxw7tYGGwpjFz2IJRX-fjFpE79NZdQ_dUaeWOm3tnoHAHjh01IrFu7qlT0o5Bf7-gDvoXU3eYAy5D9LcZAeXr8DiEqK-2aBltV43JSk-Z119DQhRUOFOVMlfbZzHYcWlMgPHBnneleAzChhaDnTxd3NGfqF329wfxQHUaGdj7-eVlXEEYIxmzVwFOiEK0ogEtyvkrlYqQiarxSGt1teNShBpb2QtKL4UPLh7ufxe6K961QuL-FmCkKbjGFxYY0PTegeIsf3rYTNKJRpADC9rGPDF67c5yuMbbBZU9G_GRq5Lj8yS5vG94oCM7PGmKzxxavS7neBu0BH6cqn_u6kuvbfcLtmszo7JqMnY6SqPIp0PU1wfizkjeXKG0s_6rtqQ57pH5IpZTUYwCrtkqcOLEColrUwort43MY12P-ELDuq-IaZFRxJWn8A9dqplVJzOQViUfHHtTVu5W2KiumLSXsxWUsQTb8E\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 22 Apr 2026 16:44:50 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1408" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-7a1178d1-471a-4877-9480-87708b48ebda" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T16:44:50.014Z", + "time": 70, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 70 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/am_1076162899/recording.har new file mode 100644 index 000000000..298255e92 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_c/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:19:31.975Z", + "time": 283, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 283 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1913, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 272, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 272, + "text": "{\"_id\":\"version\",\"_rev\":\"652844272\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build b740131a0f78378edca640cebb2de303d53d7226 (2026-July-13 13:43)\",\"revision\":\"b740131a0f78378edca640cebb2de303d53d7226\",\"date\":\"2026-July-13 13:43\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "272" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1174, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:19:33.013Z", + "time": 102, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 102 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/environment_1072573434/recording.har new file mode 100644 index 000000000..922bce547 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/environment_1072573434/recording.har @@ -0,0 +1,434 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_c/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1864, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:19:33.124Z", + "time": 89, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 89 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1848, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 26, + "content": { + "mimeType": "application/json", + "size": 26, + "text": "{\"restartStatus\":\"ready\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "26" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:19:33.307Z", + "time": 217, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 217 + } + }, + { + "_id": "a24d647eb74a9e69a6b0bd9ed23dc6ce", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1848, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/secrets" + }, + "response": { + "bodySize": 1168, + "content": { + "mimeType": "application/json", + "size": 1168, + "text": "{\"pagedResultsCookie\":null,\"remainingPagedResults\":-1,\"result\":[{\"_id\":\"esv-test-secret\",\"activeVersion\":\"1\",\"description\":\"Test Secret\",\"encoding\":\"generic\",\"lastChangeDate\":\"2026-07-08T17:51:06.765897Z\",\"lastChangedBy\":\"volker.scheuber@pingidentity.com\",\"loaded\":true,\"loadedVersion\":\"1\",\"useInPlaceholders\":true},{\"_id\":\"esv-test-secret-2\",\"activeVersion\":\"1\",\"description\":\"Test Secret Two\",\"encoding\":\"generic\",\"lastChangeDate\":\"2026-07-08T17:51:36.657796Z\",\"lastChangedBy\":\"volker.scheuber@pingidentity.com\",\"loaded\":true,\"loadedVersion\":\"1\",\"useInPlaceholders\":true},{\"_id\":\"esv-test-secret-3\",\"activeVersion\":\"1\",\"description\":\"Test Secret Three\",\"encoding\":\"generic\",\"lastChangeDate\":\"2026-07-08T17:52:02.874153Z\",\"lastChangedBy\":\"volker.scheuber@pingidentity.com\",\"loaded\":true,\"loadedVersion\":\"1\",\"useInPlaceholders\":true},{\"_id\":\"esv-test-secret-4\",\"activeVersion\":\"3\",\"description\":\"Testing secret using versioning\",\"encoding\":\"generic\",\"lastChangeDate\":\"2026-07-14T21:44:38.423338Z\",\"lastChangedBy\":\"phales@trivir.com\",\"loaded\":true,\"loadedVersion\":\"3\",\"useInPlaceholders\":false}],\"resultCount\":4,\"totalPagedResults\":-1,\"totalPagedResultsPolicy\":\"NONE\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "1168" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 301, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:19:33.559Z", + "time": 177, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 177 + } + }, + { + "_id": "3e8d5f28d2136edf1b00c2f955eaa5fa", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables" + }, + "response": { + "bodySize": 3440, + "content": { + "mimeType": "application/json", + "size": 3440, + "text": "{\"pagedResultsCookie\":null,\"remainingPagedResults\":-1,\"result\":[{\"_id\":\"esv-blue-piller\",\"description\":\"Zion membership criteria.\",\"expressionType\":\"bool\",\"lastChangeDate\":\"2026-07-07T13:42:37.661166Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"ZmFsc2U=\"},{\"_id\":\"esv-ipv4-cidr-access-rules\",\"description\":\"IPv4 CIDR access rules: { \\\"allow\\\": [ \\\"address/mask\\\" ] }\",\"expressionType\":\"object\",\"lastChangeDate\":\"2026-07-07T13:42:38.713806Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"eyAiYWxsb3ciOiBbICIxNDUuMTE4LjAuMC8xNiIsICIxMzIuMzUuMC4wLzE2IiwgIjEwMS4yMjYuMC4wLzE2IiwgIjk5LjcyLjI4LjE4Mi8zMiIgXSB9\"},{\"_id\":\"esv-nebuchadnezzar-crew\",\"description\":\"The crew of the Nebuchadnezzar hovercraft.\",\"expressionType\":\"array\",\"lastChangeDate\":\"2026-07-07T13:42:39.854348Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"WyJNb3JwaGV1cyIsIlRyaW5pdHkiLCJMaW5rIiwiVGFuayIsIkRvemVyIiwiQXBvYyIsIkN5cGhlciIsIk1vdXNlIiwiTmVvIiwiU3dpdGNoIl0=\"},{\"_id\":\"esv-nebuchadnezzar-crew-structure\",\"description\":\"The structure of the crew of the Nebuchadnezzar hovercraft.\",\"expressionType\":\"object\",\"lastChangeDate\":\"2026-07-07T13:42:41.078083Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"eyJDYXB0YWluIjoiTW9ycGhldXMiLCJGaXJzdE1hdGUiOiJUcmluaXR5IiwiT3BlcmF0b3IiOlsiTGluayIsIlRhbmsiXSwiTWVkaWMiOiJEb3plciIsIkNyZXdtZW4iOlsiQXBvYyIsIkN5cGhlciIsIk1vdXNlIiwiTmVvIiwiU3dpdGNoIl19\"},{\"_id\":\"esv-neo-age\",\"description\":\"Neo's age in the matrix.\",\"expressionType\":\"int\",\"lastChangeDate\":\"2026-07-07T13:42:42.257146Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"Mjg=\"},{\"_id\":\"esv-number\",\"description\":\"test number\",\"expressionType\":\"number\",\"lastChangeDate\":\"2026-07-07T13:42:43.468173Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"MS4xMzQ=\"},{\"_id\":\"esv-test\",\"description\":\"list\",\"expressionType\":\"list\",\"lastChangeDate\":\"2026-07-07T13:44:22.110436Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"YSxiLGMsZA==\"},{\"_id\":\"esv-test-var\",\"description\":\"this is a test description\",\"expressionType\":\"string\",\"lastChangeDate\":\"2026-07-07T13:41:48.0824Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"dGhpcyBpcyBhIHRlc3QgdmFyaWFibGU=\"},{\"_id\":\"esv-test-var-pi\",\"description\":\"This is another test variable.\",\"expressionType\":\"number\",\"lastChangeDate\":\"2026-07-07T13:42:44.956161Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"My4xNDE1OTI2\"},{\"_id\":\"esv-test-var-pi-string\",\"description\":\"This is another test variable.\",\"expressionType\":\"string\",\"lastChangeDate\":\"2026-07-07T13:42:45.876811Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"My4xNDE1OTI2\"},{\"_id\":\"esv-test-variable-light\",\"description\":\"Test variable containing the speed of light in meters per second (as an int).\",\"expressionType\":\"int\",\"lastChangeDate\":\"2026-07-07T13:42:47.202434Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"Mjk5NzkyNDU4\"},{\"_id\":\"esv-trinity-phone\",\"description\":\"In the opening of The Matrix (1999), the phone number Trinity is calling from is traced to (312)-555-0690\",\"expressionType\":\"string\",\"lastChangeDate\":\"2026-07-07T13:42:48.36266Z\",\"lastChangedBy\":\"Frodo-SA-1782747461119\",\"loaded\":true,\"valueBase64\":\"KDMxMiktNTU1LTA2OTA=\"}],\"resultCount\":12,\"totalPagedResults\":-1,\"totalPagedResultsPolicy\":\"NONE\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + }, + { + "name": "transfer-encoding", + "value": "chunked" + } + ], + "headersSize": 307, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:19:33.742Z", + "time": 412, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 412 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/oauth2_393036114/recording.har new file mode 100644 index 000000000..75400d50e --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_c/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1330, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1330" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:idc:content-security-policy:* fr:idc:esv:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1788, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1788, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:idc:content-security-policy:* fr:idc:esv:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1788" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 951, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:19:32.307Z", + "time": 693, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 693 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/openidm_3290118515/recording.har new file mode 100644 index 000000000..6e3b6b1fd --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_c_2677243081/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_c/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1925, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1372, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1372, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"b5c14c39-701a-42c1-971f-8a6278172dd4-4762\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1372" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:19:33.052Z", + "time": 176, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 176 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1925, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1372, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1372, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"b5c14c39-701a-42c1-971f-8a6278172dd4-4762\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1372" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 657, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:19:33.221Z", + "time": 73, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 73 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/am_1076162899/recording.har new file mode 100644 index 000000000..ff905ef0f --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_s/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b8b857ee-4642-4ac7-834f-bab71e2840da" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 615, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 615, + "text": "{\"_id\":\"*\",\"_rev\":\"1955877839\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"allowedWithoutReferer\":true,\"refererWhitelist\":[]},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1955877839\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "615" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 16:48:26 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b8b857ee-4642-4ac7-834f-bab71e2840da" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 787, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T16:48:26.041Z", + "time": 198, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 198 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b8b857ee-4642-4ac7-834f-bab71e2840da" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1959, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 275, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 275, + "text": "{\"_id\":\"version\",\"_rev\":\"1171477248\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 304c60a9fe7797e1045c631600098d4465b73e4d (2026-April-15 10:21)\",\"revision\":\"304c60a9fe7797e1045c631600098d4465b73e4d\",\"date\":\"2026-April-15 10:21\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1171477248\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "275" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 16:48:26 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b8b857ee-4642-4ac7-834f-bab71e2840da" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 787, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T16:48:26.728Z", + "time": 114, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 114 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/environment_1072573434/recording.har new file mode 100644 index 000000000..79c33a363 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/environment_1072573434/recording.har @@ -0,0 +1,228 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_s/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1910, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1975, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1975, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:autoaccess:*\",\"description\":\"All Auto Access APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:ws:admin\",\"description\":\"All PingFederate APIs\"},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1975" + }, + { + "name": "etag", + "value": "W/\"7b7-9oeZSONSS8Sn+SSr15TXAygvvcE\"" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 16:48:26 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "ee0ca2aa-4eb5-405e-a2c0-e6be064491cf" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 413, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T16:48:26.850Z", + "time": 94, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 94 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1894, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 26, + "content": { + "mimeType": "application/json", + "size": 26, + "text": "{\"restartStatus\":\"ready\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 16:48:27 GMT" + }, + { + "name": "content-length", + "value": "26" + }, + { + "name": "x-forgerock-transactionid", + "value": "25b736dc-d2a2-44fe-828f-8b21bd077c75" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 324, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T16:48:27.053Z", + "time": 269, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 269 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/oauth2_393036114/recording.har new file mode 100644 index 000000000..89758242a --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_s/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1362, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b8b857ee-4642-4ac7-834f-bab71e2840da" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1362" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 443, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:idc:ws:admin fr:am:* fr:autoaccess:* fr:idc:esv:* fr:idc:analytics:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1863, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1863, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:ws:admin fr:am:* fr:autoaccess:* fr:idc:esv:* fr:idc:analytics:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1863" + }, + { + "name": "date", + "value": "Wed, 22 Apr 2026 16:48:26 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b8b857ee-4642-4ac7-834f-bab71e2840da" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 561, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T16:48:26.271Z", + "time": 444, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 444 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/openidm_3290118515/recording.har new file mode 100644 index 000000000..e2a455104 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_s_2408801177/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_s/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b8b857ee-4642-4ac7-834f-bab71e2840da" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1971, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/810dd2f4-874b-4aad-9e0a-f8a57789f182?_fields=%2A" + }, + "response": { + "bodySize": 1408, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1408, + "text": "{\"_id\":\"810dd2f4-874b-4aad-9e0a-f8a57789f182\",\"_rev\":\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1773261131370\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:autoaccess:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:ws:admin\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"GIyq6foAjk7VGtM7NyJQZMEUxtAgSe02sjjgp4ey4go\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"rBa78YjWw5-Hkd2rP8uuY2fikjMf9FVeP2AUabFL2qqgVCJxs035yKQDlMAYAFnKaSUXME0vXhZKNkP5ZsWdYAl_sS-0o8HBO4AQk8dXSB--NnkPd0S-6c-sb01oy5tet1WFiKI8dfhzH9KZ65oy3ouzaSsnTjIpFQNMVaq1qQE3m2gPnmwMoRQZdP_hClkXMTtkdRapTL_cdxw7tYGGwpjFz2IJRX-fjFpE79NZdQ_dUaeWOm3tnoHAHjh01IrFu7qlT0o5Bf7-gDvoXU3eYAy5D9LcZAeXr8DiEqK-2aBltV43JSk-Z119DQhRUOFOVMlfbZzHYcWlMgPHBnneleAzChhaDnTxd3NGfqF329wfxQHUaGdj7-eVlXEEYIxmzVwFOiEK0ogEtyvkrlYqQiarxSGt1teNShBpb2QtKL4UPLh7ufxe6K961QuL-FmCkKbjGFxYY0PTegeIsf3rYTNKJRpADC9rGPDF67c5yuMbbBZU9G_GRq5Lj8yS5vG94oCM7PGmKzxxavS7neBu0BH6cqn_u6kuvbfcLtmszo7JqMnY6SqPIp0PU1wfizkjeXKG0s_6rtqQ57pH5IpZTUYwCrtkqcOLEColrUwort43MY12P-ELDuq-IaZFRxJWn8A9dqplVJzOQViUfHHtTVu5W2KiumLSXsxWUsQTb8E\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 22 Apr 2026 16:48:26 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1408" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b8b857ee-4642-4ac7-834f-bab71e2840da" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 657, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T16:48:26.765Z", + "time": 201, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 201 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b8b857ee-4642-4ac7-834f-bab71e2840da" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1971, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/810dd2f4-874b-4aad-9e0a-f8a57789f182?_fields=%2A" + }, + "response": { + "bodySize": 1408, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1408, + "text": "{\"_id\":\"810dd2f4-874b-4aad-9e0a-f8a57789f182\",\"_rev\":\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1773261131370\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:autoaccess:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:ws:admin\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"GIyq6foAjk7VGtM7NyJQZMEUxtAgSe02sjjgp4ey4go\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"rBa78YjWw5-Hkd2rP8uuY2fikjMf9FVeP2AUabFL2qqgVCJxs035yKQDlMAYAFnKaSUXME0vXhZKNkP5ZsWdYAl_sS-0o8HBO4AQk8dXSB--NnkPd0S-6c-sb01oy5tet1WFiKI8dfhzH9KZ65oy3ouzaSsnTjIpFQNMVaq1qQE3m2gPnmwMoRQZdP_hClkXMTtkdRapTL_cdxw7tYGGwpjFz2IJRX-fjFpE79NZdQ_dUaeWOm3tnoHAHjh01IrFu7qlT0o5Bf7-gDvoXU3eYAy5D9LcZAeXr8DiEqK-2aBltV43JSk-Z119DQhRUOFOVMlfbZzHYcWlMgPHBnneleAzChhaDnTxd3NGfqF329wfxQHUaGdj7-eVlXEEYIxmzVwFOiEK0ogEtyvkrlYqQiarxSGt1teNShBpb2QtKL4UPLh7ufxe6K961QuL-FmCkKbjGFxYY0PTegeIsf3rYTNKJRpADC9rGPDF67c5yuMbbBZU9G_GRq5Lj8yS5vG94oCM7PGmKzxxavS7neBu0BH6cqn_u6kuvbfcLtmszo7JqMnY6SqPIp0PU1wfizkjeXKG0s_6rtqQ57pH5IpZTUYwCrtkqcOLEColrUwort43MY12P-ELDuq-IaZFRxJWn8A9dqplVJzOQViUfHHtTVu5W2KiumLSXsxWUsQTb8E\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 22 Apr 2026 16:48:27 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1408" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b8b857ee-4642-4ac7-834f-bab71e2840da" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + } + ], + "headersSize": 682, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-22T16:48:26.964Z", + "time": 82, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 82 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/am_1076162899/recording.har new file mode 100644 index 000000000..1fe2f6c32 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_w/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 387, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:21.384Z", + "time": 345, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 345 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1915, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 272, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 272, + "text": "{\"_id\":\"version\",\"_rev\":\"652844272\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build b740131a0f78378edca640cebb2de303d53d7226 (2026-July-13 13:43)\",\"revision\":\"b740131a0f78378edca640cebb2de303d53d7226\",\"date\":\"2026-July-13 13:43\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "272" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1174, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:22.528Z", + "time": 116, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 116 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/environment_1072573434/recording.har new file mode 100644 index 000000000..ef384be9f --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/environment_1072573434/recording.har @@ -0,0 +1,2507 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_w/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1866, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:22.651Z", + "time": 89, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 89 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 26, + "content": { + "mimeType": "application/json", + "size": 26, + "text": "{\"restartStatus\":\"ready\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "26" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:22.838Z", + "time": 271, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 271 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 26, + "content": { + "mimeType": "application/json", + "size": 26, + "text": "{\"restartStatus\":\"ready\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "26" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:23.140Z", + "time": 210, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 210 + } + }, + { + "_id": "3b77ccc66e1a72d4eb051085c282ed9f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 4, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "4" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1886, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [] + }, + "queryString": [ + { + "name": "_action", + "value": "restart" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup?_action=restart" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:23.359Z", + "time": 166, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 166 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 2, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:28.532Z", + "time": 299, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 299 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 3, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:33.855Z", + "time": 439, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 439 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 4, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:39.302Z", + "time": 281, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 281 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 5, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:44.589Z", + "time": 245, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 245 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 6, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:49.840Z", + "time": 252, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 252 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 7, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:55.099Z", + "time": 382, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 382 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 8, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:00.487Z", + "time": 321, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 321 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 9, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:05.822Z", + "time": 448, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 448 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 10, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:11.282Z", + "time": 386, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 386 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 11, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:16.673Z", + "time": 283, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 283 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 12, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:21.964Z", + "time": 348, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 348 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 13, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:27.320Z", + "time": 527, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 527 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 14, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 324, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:32.853Z", + "time": 366, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 366 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 15, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:38.230Z", + "time": 296, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 296 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 16, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:43.534Z", + "time": 358, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 358 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 17, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:48.907Z", + "time": 308, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 308 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 18, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:54.222Z", + "time": 352, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 352 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 19, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 324, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:34:59.582Z", + "time": 316, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 316 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 20, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 31, + "content": { + "mimeType": "application/json", + "size": 31, + "text": "{\"restartStatus\":\"restarting\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "31" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 299, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:35:04.918Z", + "time": 411, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 411 + } + }, + { + "_id": "b5680c863538492bb4fa6020d2e8e068", + "_order": 21, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1850, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/startup" + }, + "response": { + "bodySize": 26, + "content": { + "mimeType": "application/json", + "size": 26, + "text": "{\"restartStatus\":\"ready\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "26" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 324, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:35:10.340Z", + "time": 350, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 350 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/oauth2_393036114/recording.har new file mode 100644 index 000000000..09dc28ad2 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_w/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1330, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1330" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 442, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:idc:content-security-policy:* fr:idc:esv:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1788, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1788, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:am:* fr:idc:content-security-policy:* fr:idc:esv:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:analytics:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":898}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1788" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 951, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:21.771Z", + "time": 747, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 747 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/openidm_3290118515/recording.har new file mode 100644 index 000000000..643b2c52e --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/restart_4271641068/0_w_2475911653/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/restart/0_w/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1927, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1372, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1372, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"b5c14c39-701a-42c1-971f-8a6278172dd4-4762\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1372" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 657, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:22.580Z", + "time": 195, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 195 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1927, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1372, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1372, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"b5c14c39-701a-42c1-971f-8a6278172dd4-4762\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1372" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 657, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-07-21T19:33:22.753Z", + "time": 79, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 79 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_Fdp_all_3922772158/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_Fdp_all_3922772158/iga_2664973160/recording.har index b69886673..0bf8ac9fc 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_Fdp_all_3922772158/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_Fdp_all_3922772158/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40346, diff --git a/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_draft-only_a_3257702152/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_draft-only_a_3257702152/iga_2664973160/recording.har index 291355707..1651f0b99 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_draft-only_a_3257702152/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_draft-only_a_3257702152/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40359, diff --git a/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_published-only_Fa_2734441361/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_published-only_Fa_2734441361/iga_2664973160/recording.har index 1d6aa0bbc..87cfeed5e 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_published-only_Fa_2734441361/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-delete_3752417468/0_published-only_Fa_2734441361/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 38355, diff --git a/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_NAD_1312604927/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_NAD_1312604927/iga_2664973160/recording.har index 9777cad21..5093d5239 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_NAD_1312604927/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_NAD_1312604927/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40532, diff --git a/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_all-separate_use-string-arrays_read-only_no-coords_no-deps_no-extract_D_78854915/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_all-separate_use-string-arrays_read-only_no-coords_no-deps_no-extract_D_78854915/iga_2664973160/recording.har index f1ef37c76..8eff238ee 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_all-separate_use-string-arrays_read-only_no-coords_no-deps_no-extract_D_78854915/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_all-separate_use-string-arrays_read-only_no-coords_no-deps_no-extract_D_78854915/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40525, diff --git a/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_all_R_no-coords_no-deps_use-string-arrays_file_1619363988/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_all_R_no-coords_no-deps_use-string-arrays_file_1619363988/iga_2664973160/recording.har index 86cbae83e..84e758a6e 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_all_R_no-coords_no-deps_use-string-arrays_file_1619363988/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_all_R_no-coords_no-deps_use-string-arrays_file_1619363988/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 32720, diff --git a/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_no-metadata_a_directory_3627220595/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_no-metadata_a_directory_3627220595/iga_2664973160/recording.har index 8de38c957..30087f8f3 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_no-metadata_a_directory_3627220595/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-export_3902289005/0_no-metadata_a_directory_3627220595/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40532, diff --git a/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_AD_3050885125/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_AD_3050885125/iga_2664973160/recording.har index aced8445a..d5d6d1bc6 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_AD_3050885125/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_AD_3050885125/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -269,7 +269,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 1, "cache": {}, "request": { @@ -315,10 +315,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41173, @@ -402,7 +402,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 2, "cache": {}, "request": { @@ -448,10 +448,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41180, @@ -663,7 +663,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 3, "cache": {}, "request": { @@ -709,10 +709,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41173, @@ -796,7 +796,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 4, "cache": {}, "request": { @@ -842,10 +842,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41173, @@ -1057,7 +1057,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 5, "cache": {}, "request": { @@ -1103,10 +1103,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41178, @@ -1190,7 +1190,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 6, "cache": {}, "request": { @@ -1236,10 +1236,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41170, @@ -1451,7 +1451,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 7, "cache": {}, "request": { @@ -1497,10 +1497,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41169, @@ -1584,7 +1584,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 8, "cache": {}, "request": { @@ -1630,10 +1630,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41174, @@ -1845,7 +1845,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 9, "cache": {}, "request": { @@ -1891,10 +1891,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41170, @@ -1978,7 +1978,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 10, "cache": {}, "request": { @@ -2024,10 +2024,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -2239,7 +2239,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 11, "cache": {}, "request": { @@ -2285,10 +2285,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41180, @@ -2372,7 +2372,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 12, "cache": {}, "request": { @@ -2418,10 +2418,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -2633,7 +2633,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 13, "cache": {}, "request": { @@ -2679,10 +2679,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -2766,7 +2766,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 14, "cache": {}, "request": { @@ -2812,10 +2812,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41174, @@ -3027,7 +3027,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 15, "cache": {}, "request": { @@ -3073,10 +3073,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41180, @@ -3160,7 +3160,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 16, "cache": {}, "request": { @@ -3206,10 +3206,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41182, @@ -3421,7 +3421,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 17, "cache": {}, "request": { @@ -3467,10 +3467,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41170, @@ -3554,7 +3554,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 18, "cache": {}, "request": { @@ -3600,10 +3600,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -3815,7 +3815,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 19, "cache": {}, "request": { @@ -3861,10 +3861,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41174, @@ -3948,7 +3948,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 20, "cache": {}, "request": { @@ -3994,10 +3994,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -4209,7 +4209,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 21, "cache": {}, "request": { @@ -4255,10 +4255,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41180, @@ -4342,7 +4342,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 22, "cache": {}, "request": { @@ -4388,10 +4388,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41179, @@ -4603,7 +4603,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 23, "cache": {}, "request": { @@ -4649,10 +4649,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41183, @@ -4736,7 +4736,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 24, "cache": {}, "request": { @@ -4782,10 +4782,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41173, @@ -4997,7 +4997,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 25, "cache": {}, "request": { @@ -5043,10 +5043,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41190, @@ -5130,7 +5130,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 26, "cache": {}, "request": { @@ -5176,10 +5176,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41167, @@ -5391,7 +5391,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 27, "cache": {}, "request": { @@ -5437,10 +5437,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41173, @@ -5524,7 +5524,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 28, "cache": {}, "request": { @@ -5570,10 +5570,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -5785,7 +5785,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 29, "cache": {}, "request": { @@ -5831,10 +5831,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41179, @@ -5918,7 +5918,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 30, "cache": {}, "request": { @@ -5964,10 +5964,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41174, @@ -6179,7 +6179,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 31, "cache": {}, "request": { @@ -6225,10 +6225,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41172, @@ -6312,7 +6312,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 32, "cache": {}, "request": { @@ -6358,10 +6358,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -6707,7 +6707,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 33, "cache": {}, "request": { @@ -6753,10 +6753,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -6840,7 +6840,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 34, "cache": {}, "request": { @@ -6886,10 +6886,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41172, @@ -7101,7 +7101,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 35, "cache": {}, "request": { @@ -7147,10 +7147,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -7234,7 +7234,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 36, "cache": {}, "request": { @@ -7280,10 +7280,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41174, @@ -7758,7 +7758,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 37, "cache": {}, "request": { @@ -7804,10 +7804,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41172, @@ -7891,7 +7891,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 38, "cache": {}, "request": { @@ -7937,10 +7937,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41176, @@ -8281,7 +8281,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 39, "cache": {}, "request": { @@ -8327,10 +8327,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41170, @@ -8414,7 +8414,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 40, "cache": {}, "request": { @@ -8460,10 +8460,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41168, @@ -8809,7 +8809,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 41, "cache": {}, "request": { @@ -8855,10 +8855,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -8942,7 +8942,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 42, "cache": {}, "request": { @@ -8988,10 +8988,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41174, @@ -9337,7 +9337,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 43, "cache": {}, "request": { @@ -9383,10 +9383,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -9470,7 +9470,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 44, "cache": {}, "request": { @@ -9516,10 +9516,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41183, @@ -9860,7 +9860,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 45, "cache": {}, "request": { @@ -9906,10 +9906,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41168, @@ -9993,7 +9993,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 46, "cache": {}, "request": { @@ -10039,10 +10039,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41175, @@ -10388,7 +10388,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 47, "cache": {}, "request": { @@ -10434,10 +10434,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41169, @@ -10521,7 +10521,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 48, "cache": {}, "request": { @@ -10567,10 +10567,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41181, @@ -11045,7 +11045,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 49, "cache": {}, "request": { @@ -11091,10 +11091,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -11178,7 +11178,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 50, "cache": {}, "request": { @@ -11224,10 +11224,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -11573,7 +11573,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 51, "cache": {}, "request": { @@ -11619,10 +11619,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -11706,7 +11706,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 52, "cache": {}, "request": { @@ -11752,10 +11752,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41173, @@ -12230,7 +12230,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 53, "cache": {}, "request": { @@ -12276,10 +12276,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41168, @@ -12363,7 +12363,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 54, "cache": {}, "request": { @@ -12409,10 +12409,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41168, @@ -12887,7 +12887,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 55, "cache": {}, "request": { @@ -12933,10 +12933,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41169, @@ -13020,7 +13020,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 56, "cache": {}, "request": { @@ -13066,10 +13066,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41176, @@ -13410,7 +13410,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 57, "cache": {}, "request": { @@ -13456,10 +13456,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41176, @@ -13543,7 +13543,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 58, "cache": {}, "request": { @@ -13589,10 +13589,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41176, @@ -13938,7 +13938,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 59, "cache": {}, "request": { @@ -13984,10 +13984,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41174, @@ -14071,7 +14071,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 60, "cache": {}, "request": { @@ -14117,10 +14117,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41172, @@ -14595,7 +14595,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 61, "cache": {}, "request": { @@ -14641,10 +14641,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, @@ -14728,7 +14728,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 62, "cache": {}, "request": { @@ -14774,10 +14774,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41174, @@ -15252,7 +15252,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 63, "cache": {}, "request": { @@ -15298,10 +15298,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41178, @@ -15385,7 +15385,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 64, "cache": {}, "request": { @@ -15431,10 +15431,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41172, @@ -15780,7 +15780,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 65, "cache": {}, "request": { @@ -15826,10 +15826,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41174, @@ -15913,7 +15913,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 66, "cache": {}, "request": { @@ -15959,10 +15959,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41183, @@ -16303,7 +16303,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 67, "cache": {}, "request": { @@ -16349,10 +16349,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41180, diff --git a/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_all-separate_directory_no-deps_4078456844/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_all-separate_directory_no-deps_4078456844/iga_2664973160/recording.har index 06d425055..edc2e803f 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_all-separate_directory_no-deps_4078456844/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_all-separate_directory_no-deps_4078456844/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40349, @@ -269,7 +269,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 1, "cache": {}, "request": { @@ -315,10 +315,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40346, @@ -402,7 +402,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 2, "cache": {}, "request": { @@ -448,10 +448,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40346, @@ -663,7 +663,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 3, "cache": {}, "request": { @@ -709,10 +709,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40345, @@ -796,7 +796,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 4, "cache": {}, "request": { @@ -842,10 +842,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40352, @@ -1057,7 +1057,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 5, "cache": {}, "request": { @@ -1103,10 +1103,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40349, @@ -1190,7 +1190,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 6, "cache": {}, "request": { @@ -1236,10 +1236,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40348, @@ -1451,7 +1451,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 7, "cache": {}, "request": { @@ -1497,10 +1497,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40341, @@ -1584,7 +1584,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 8, "cache": {}, "request": { @@ -1630,10 +1630,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40345, @@ -1845,7 +1845,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 9, "cache": {}, "request": { @@ -1891,10 +1891,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40349, @@ -1978,7 +1978,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 10, "cache": {}, "request": { @@ -2024,10 +2024,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40345, @@ -2239,7 +2239,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 11, "cache": {}, "request": { @@ -2285,10 +2285,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40349, @@ -2372,7 +2372,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 12, "cache": {}, "request": { @@ -2418,10 +2418,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40346, @@ -2633,7 +2633,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 13, "cache": {}, "request": { @@ -2679,10 +2679,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40345, @@ -2766,7 +2766,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 14, "cache": {}, "request": { @@ -2812,10 +2812,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40345, @@ -3027,7 +3027,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 15, "cache": {}, "request": { @@ -3073,10 +3073,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40349, @@ -3160,7 +3160,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 16, "cache": {}, "request": { @@ -3206,10 +3206,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40345, @@ -3421,7 +3421,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 17, "cache": {}, "request": { @@ -3467,10 +3467,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40342, @@ -3554,7 +3554,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 18, "cache": {}, "request": { @@ -3600,10 +3600,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40345, @@ -3815,7 +3815,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 19, "cache": {}, "request": { @@ -3861,10 +3861,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40349, @@ -3948,7 +3948,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 20, "cache": {}, "request": { @@ -3994,10 +3994,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40348, @@ -4209,7 +4209,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 21, "cache": {}, "request": { @@ -4255,10 +4255,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40344, @@ -4342,7 +4342,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 22, "cache": {}, "request": { @@ -4388,10 +4388,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40346, @@ -4603,7 +4603,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 23, "cache": {}, "request": { @@ -4649,10 +4649,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40351, @@ -4736,7 +4736,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 24, "cache": {}, "request": { @@ -4782,10 +4782,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40348, @@ -4997,7 +4997,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 25, "cache": {}, "request": { @@ -5043,10 +5043,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40355, @@ -5130,7 +5130,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 26, "cache": {}, "request": { @@ -5176,10 +5176,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40342, @@ -5391,7 +5391,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 27, "cache": {}, "request": { @@ -5437,10 +5437,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40345, @@ -5524,7 +5524,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 28, "cache": {}, "request": { @@ -5570,10 +5570,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40342, @@ -5785,7 +5785,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 29, "cache": {}, "request": { @@ -5831,10 +5831,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40349, @@ -5918,7 +5918,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 30, "cache": {}, "request": { @@ -5964,10 +5964,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40348, @@ -6179,7 +6179,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 31, "cache": {}, "request": { @@ -6225,10 +6225,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40346, @@ -6312,7 +6312,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 32, "cache": {}, "request": { @@ -6358,10 +6358,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40349, @@ -6707,7 +6707,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 33, "cache": {}, "request": { @@ -6753,10 +6753,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40508, @@ -6840,7 +6840,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 34, "cache": {}, "request": { @@ -6886,10 +6886,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40509, @@ -7101,7 +7101,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 35, "cache": {}, "request": { @@ -7147,10 +7147,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40511, @@ -7234,7 +7234,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 36, "cache": {}, "request": { @@ -7280,10 +7280,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40506, @@ -7758,7 +7758,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 37, "cache": {}, "request": { @@ -7804,10 +7804,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40901, @@ -7891,7 +7891,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 38, "cache": {}, "request": { @@ -7937,10 +7937,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40912, @@ -8281,7 +8281,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 39, "cache": {}, "request": { @@ -8327,10 +8327,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41127, @@ -8414,7 +8414,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 40, "cache": {}, "request": { @@ -8460,10 +8460,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41121, @@ -8809,7 +8809,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 41, "cache": {}, "request": { @@ -8855,10 +8855,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41097, @@ -8942,7 +8942,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 42, "cache": {}, "request": { @@ -8988,10 +8988,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41101, @@ -9337,7 +9337,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 43, "cache": {}, "request": { @@ -9383,10 +9383,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41109, @@ -9470,7 +9470,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 44, "cache": {}, "request": { @@ -9516,10 +9516,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41121, @@ -9860,7 +9860,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 45, "cache": {}, "request": { @@ -9906,10 +9906,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41249, @@ -9993,7 +9993,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 46, "cache": {}, "request": { @@ -10039,10 +10039,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41245, @@ -10388,7 +10388,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 47, "cache": {}, "request": { @@ -10434,10 +10434,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41256, @@ -10521,7 +10521,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 48, "cache": {}, "request": { @@ -10567,10 +10567,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41253, @@ -11045,7 +11045,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 49, "cache": {}, "request": { @@ -11091,10 +11091,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41040, @@ -11178,7 +11178,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 50, "cache": {}, "request": { @@ -11224,10 +11224,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41040, @@ -11573,7 +11573,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 51, "cache": {}, "request": { @@ -11619,10 +11619,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41036, @@ -11706,7 +11706,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 52, "cache": {}, "request": { @@ -11752,10 +11752,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41025, @@ -12230,7 +12230,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 53, "cache": {}, "request": { @@ -12276,10 +12276,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41092, @@ -12363,7 +12363,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 54, "cache": {}, "request": { @@ -12409,10 +12409,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41091, @@ -12887,7 +12887,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 55, "cache": {}, "request": { @@ -12933,10 +12933,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41381, @@ -13020,7 +13020,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 56, "cache": {}, "request": { @@ -13066,10 +13066,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41383, @@ -13410,7 +13410,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 57, "cache": {}, "request": { @@ -13456,10 +13456,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41587, @@ -13543,7 +13543,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 58, "cache": {}, "request": { @@ -13589,10 +13589,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41584, @@ -13938,7 +13938,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 59, "cache": {}, "request": { @@ -13984,10 +13984,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41502, @@ -14071,7 +14071,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 60, "cache": {}, "request": { @@ -14117,10 +14117,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41501, @@ -14595,7 +14595,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 61, "cache": {}, "request": { @@ -14641,10 +14641,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41144, @@ -14728,7 +14728,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 62, "cache": {}, "request": { @@ -14774,10 +14774,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41141, @@ -15252,7 +15252,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 63, "cache": {}, "request": { @@ -15298,10 +15298,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41158, @@ -15385,7 +15385,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 64, "cache": {}, "request": { @@ -15431,10 +15431,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41156, @@ -15780,7 +15780,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 65, "cache": {}, "request": { @@ -15826,10 +15826,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41029, @@ -15913,7 +15913,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 66, "cache": {}, "request": { @@ -15959,10 +15959,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41034, @@ -16303,7 +16303,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 67, "cache": {}, "request": { @@ -16349,10 +16349,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 41177, diff --git a/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_all_file_no-deps_655449289/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_all_file_no-deps_655449289/iga_2664973160/recording.har index 119ac524b..f40c75143 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_all_file_no-deps_655449289/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-import_3803419662/0_all_file_no-deps_655449289/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40348, @@ -3301,7 +3301,7 @@ } }, { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 1, "cache": {}, "request": { @@ -3347,10 +3347,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 40348, diff --git a/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_890022063/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_890022063/iga_2664973160/recording.har index a43e337b3..a71f74175 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_890022063/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_890022063/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 32073, diff --git a/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_l_2828241652/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_l_2828241652/iga_2664973160/recording.har index 2cd5058bf..580af40c8 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_l_2828241652/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_l_2828241652/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 32073, diff --git a/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_long_276218670/iga_2664973160/recording.har b/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_long_276218670/iga_2664973160/recording.har index 0dc817c1a..5609d9fc6 100644 --- a/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_long_276218670/iga_2664973160/recording.har +++ b/test/e2e/mocks/iga_2664973160/workflow-list_1584170279/0_long_276218670/iga_2664973160/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "f64029142a38862fb58bc7ec0e44e61d", + "_id": "9b0f7c98306d050a71eae02b6b20605a", "_order": 0, "cache": {}, "request": { @@ -54,10 +54,10 @@ }, { "name": "_pagedResultsOffset", - "value": "1" + "value": "0" } ], - "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=1" + "url": "https://openam-trivir-fairfax.forgeblocks.com/iga/governance/workflow?_queryString=&_pageSize=10000&_pagedResultsOffset=0" }, "response": { "bodySize": 32066, diff --git a/test/e2e/node-delete.e2e.test.js b/test/e2e/node-delete.e2e.test.js index 486a0f248..5ca8e442f 100644 --- a/test/e2e/node-delete.e2e.test.js +++ b/test/e2e/node-delete.e2e.test.js @@ -56,7 +56,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,7 +68,7 @@ describe('frodo node delete', () => { test("\"frodo node delete -n 'Generate JWT'\": should delete the custom node named 'Generate JWT'", async () => { const CMD = `frodo node delete -n 'Generate JWT'`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test("\"frodo node delete --node-name 'Unknown'\": should display error when the custom node named 'Unknown' cannot be deleted since it doesn't exist", async () => { @@ -77,14 +77,14 @@ describe('frodo node delete', () => { await exec(CMD, env); throw new Error("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test('"frodo node delete -i e5ad0110c8ee4dafaae983003cd05d4a": should delete the custom node with service name \'e5ad0110c8ee4dafaae983003cd05d4a\'', async () => { const CMD = `frodo node delete -i e5ad0110c8ee4dafaae983003cd05d4a`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo node delete --node-id c605506774a848f7877b4d17a453bd39-1": should display error when the custom node with id \'c605506774a848f7877b4d17a453bd39-1\' cannot be deleted since it is being used', async () => { @@ -93,7 +93,7 @@ describe('frodo node delete', () => { await exec(CMD, env); throw new Error("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); @@ -103,7 +103,7 @@ describe('frodo node delete', () => { await exec(CMD, env); throw new Error("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); @@ -113,7 +113,7 @@ describe('frodo node delete', () => { await exec(CMD, env); throw new Error("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); }); diff --git a/test/e2e/node-describe.e2e.test.js b/test/e2e/node-describe.e2e.test.js index 2976efac3..9c5b10c33 100644 --- a/test/e2e/node-describe.e2e.test.js +++ b/test/e2e/node-describe.e2e.test.js @@ -55,7 +55,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,13 +67,13 @@ describe('frodo node describe', () => { test(`"frodo node describe -i c605506774a848f7877b4d17a453bd39": should describe the custom node with service name "c605506774a848f7877b4d17a453bd39"`, async () => { const CMD = `frodo node describe -i c605506774a848f7877b4d17a453bd39`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node describe -n 'Display Callback'": should describe the custom node with display name "Display Callback"`, async () => { const CMD = `frodo node describe -n 'Display Callback'`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node describe --node-name 'Unknown'": should fail to describe the non-existent custom node with name "Unknown"`, async () => { @@ -82,19 +82,19 @@ describe('frodo node describe', () => { await exec(CMD, env); fail("Command should've failed") } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test(`"frodo node describe --json --node-id c605506774a848f7877b4d17a453bd39-1": should describe the custom node with id "c605506774a848f7877b4d17a453bd39-1" with json output`, async () => { const CMD = `frodo node describe --json --node-id c605506774a848f7877b4d17a453bd39-1`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node describe --json --node-name 'Display Callback'": should describe the custom node with name "Display Callback" with json output`, async () => { const CMD = `frodo node describe --json --node-name 'Display Callback'`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/node-import.e2e.test.js b/test/e2e/node-import.e2e.test.js index c60bd81ff..55b34f3a2 100644 --- a/test/e2e/node-import.e2e.test.js +++ b/test/e2e/node-import.e2e.test.js @@ -59,7 +59,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -76,54 +76,54 @@ describe('frodo node import', () => { test(`"frodo node import -i c605506774a848f7877b4d17a453bd39 -f ${allNodesExport}": should import the custom node with the service name "c605506774a848f7877b4d17a453bd39" from the file "${allNodesExport}"`, async () => { const CMD = `frodo node import -i c605506774a848f7877b4d17a453bd39 -f ${allNodesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node import --node-id c605506774a848f7877b4d17a453bd39-1 --file ${allNodesFileName} --directory ${allDirectory}": should import the custom node with the id "c605506774a848f7877b4d17a453bd39-1" from the file "${allNodesExport}"`, async () => { const CMD = `frodo node import --node-id c605506774a848f7877b4d17a453bd39-1 --file ${allNodesFileName} --directory ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node import -n 'Display Callback' -f ${allNodesFileName} -D ${allDirectory}": should import the custom node named "Display Callback" from the file ${allNodesExport}`, async () => { const CMD = `frodo node import -n 'Display Callback' -f ${allNodesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node import --node-name 'Display Callback' --file ${allNodesExport}": should import the custom node named "Display Callback" from the file "${allNodesExport}"`, async () => { const CMD = `frodo node import --node-name 'Display Callback' --file ${allNodesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node import -f ${allNodesExport}": should import the first custom node from the file "${allNodesExport}"`, async () => { const CMD = `frodo node import -f ${allNodesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node import -af ${allNodesFileName} -D ${allDirectory}": should import all custom nodes from the file "${allNodesExport}"`, async () => { const CMD = `frodo node import -af ${allNodesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node import --all --file ${allNodesExport}": should import all custom nodes from the file "${allNodesExport}"`, async () => { const CMD = `frodo node import --all --file ${allNodesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node import -AD ${allSeparateNodesDirectory}": should import all custom nodes from the ${allSeparateNodesDirectory} directory"`, async () => { const CMD = `frodo node import -AD ${allSeparateNodesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo node import --all-separate --directory ${allSeparateNodesDirectory}": should import all custom nodes from the ${allSeparateNodesDirectory} directory"`, async () => { const CMD = `frodo node import --all-separate --directory ${allSeparateNodesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/node-list.e2e.test.js b/test/e2e/node-list.e2e.test.js index c514eefa5..8acc850dd 100644 --- a/test/e2e/node-list.e2e.test.js +++ b/test/e2e/node-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo node list', () => { test('"frodo node list": should list the names of the custom nodes', async () => { const CMD = `frodo node list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo node list -l": should list the ids, names, descriptions, and usages of the custom nodes.', async () => { const CMD = `frodo node list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo node list --long": should list the ids, names, descriptions, and usages of the custom nodes.', async () => { const CMD = `frodo node list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/oauth-client-delete.e2e.test.js b/test/e2e/oauth-client-delete.e2e.test.js index e64f76538..b7ca31330 100644 --- a/test/e2e/oauth-client-delete.e2e.test.js +++ b/test/e2e/oauth-client-delete.e2e.test.js @@ -51,7 +51,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes} from './utils/TestUtils'; +import { getEnv} from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,6 +65,6 @@ describe('frodo oauth client delete -i testapp', () => { test('"frodo oauth client delete -i testapp": should delete the oauth client with oauth client id "testapp"', async () => { const CMD = `frodo oauth client delete -i testapp`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/oauth-client-import.e2e.test.js b/test/e2e/oauth-client-import.e2e.test.js index 3f58fbad3..ffdf597eb 100644 --- a/test/e2e/oauth-client-import.e2e.test.js +++ b/test/e2e/oauth-client-import.e2e.test.js @@ -62,7 +62,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -79,73 +79,73 @@ describe('frodo oauth client import', () => { test(`"frodo oauth client import --no-deps -i test2 -f ${allAlphaOauthApplicationsExport}": should import the oauth client with the id "test2" from the file "${allAlphaOauthApplicationsExport}"`, async () => { const CMD = `frodo oauth client import --no-deps -i test2 -f ${allAlphaOauthApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo oauth client import --app-id test2 --file ${allAlphaOauthApplicationsExport}": should import the oauth client with the id "test2" from the file "${allAlphaOauthApplicationsExport}"`, async () => { const CMD = `frodo oauth client import --app-id test2 --file ${allAlphaOauthApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo oauth client import -i test2 -f ${allAlphaOauthApplicationsFileName} -D ${allDirectory}": should import the oauth client with the id "test2" from the file "${allAlphaOauthApplicationsExport}"`, async () => { const CMD = `frodo oauth client import -i test2 -f ${allAlphaOauthApplicationsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo oauth client import --no-deps -f ${allAlphaOauthApplicationsExport}": should import the first oauth client from the file "${allAlphaOauthApplicationsExport}"`, async () => { const CMD = `frodo oauth client import --no-deps -f ${allAlphaOauthApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo oauth client import --file ${allAlphaOauthApplicationsExport}": should import the first oauth client from the file "${allAlphaOauthApplicationsExport}"`, async () => { const CMD = `frodo oauth client import --file ${allAlphaOauthApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo oauth client import -f ${allAlphaOauthApplicationsFileName} -D ${allDirectory}": should import the first oauth client from the file "${allAlphaOauthApplicationsExport}"`, async () => { const CMD = `frodo oauth client import -f ${allAlphaOauthApplicationsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo oauth client import --no-deps -af ${allAlphaOauthApplicationsExport}": should import all oauth clients from the file "${allAlphaOauthApplicationsExport}"`, async () => { const CMD = `frodo oauth client import --no-deps -af ${allAlphaOauthApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo oauth client import --all --file ${allAlphaOauthApplicationsExport}": should import all oauth clients from the file "${allAlphaOauthApplicationsExport}"`, async () => { const CMD = `frodo oauth client import --all --file ${allAlphaOauthApplicationsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo oauth client import -af ${allAlphaOauthApplicationsFileName} -D ${allDirectory}": should import all oauth clients from the file "${allAlphaOauthApplicationsExport}"`, async () => { const CMD = `frodo oauth client import -af ${allAlphaOauthApplicationsFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo oauth client import --no-deps -AD ${allSeparateOauthApplicationsDirectory}": should import all oauth clients from the ${allSeparateOauthApplicationsDirectory} directory"`, async () => { const CMD = `frodo oauth client import --no-deps -AD ${allSeparateOauthApplicationsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo oauth client import --all-separate --directory ${allSeparateOauthApplicationsDirectory}": should import all oauth clients from the ${allSeparateOauthApplicationsDirectory} directory"`, async () => { const CMD = `frodo oauth client import --all-separate --directory ${allSeparateOauthApplicationsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"Regression rockcarver/frodo-lib#393: frodo oauth client import -f 'testclient.oauth2.app.json' -D ${allSeparateOauthApplicationsDirectory}": should import the first oauth client from the file "testclient.oauth2.app.json"`, async () => { const CMD = `frodo oauth client import -f testclient.oauth2.app.json --directory ${allSeparateOauthApplicationsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/oauth-client-list.e2e.test.js b/test/e2e/oauth-client-list.e2e.test.js index aaabfcad4..8e74ef68a 100644 --- a/test/e2e/oauth-client-list.e2e.test.js +++ b/test/e2e/oauth-client-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo oauth client list', () => { test('"frodo oauth client list": should list the ids of the oauth clients', async () => { const CMD = `frodo oauth client list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo oauth client list -l": should list the ids, statuses, client types, grant types, scopes, and redirect URIs of the oauth clients', async () => { const CMD = `frodo oauth client list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo oauth client list --long": should list the ids, statuses, client types, grant types, scopes, and redirect URIs of the oauth clients', async () => { const CMD = `frodo oauth client list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/realm-describe.e2e.test.js b/test/e2e/realm-describe.e2e.test.js index fba1391d0..28569f300 100644 --- a/test/e2e/realm-describe.e2e.test.js +++ b/test/e2e/realm-describe.e2e.test.js @@ -51,7 +51,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -63,6 +63,6 @@ describe('frodo realm describe', () => { test('"frodo realm describe": should describe the current realm', async () => { const CMD = `frodo realm describe`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/realm-import.e2e.test.js b/test/e2e/realm-import.e2e.test.js index eaa600d95..919317e30 100644 --- a/test/e2e/realm-import.e2e.test.js +++ b/test/e2e/realm-import.e2e.test.js @@ -70,7 +70,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=http://openam-frodo-dev.classic.co */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c, classic_connection as cc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -94,109 +94,109 @@ describe('frodo realm import', () => { /*test(`"frodo realm import -i L2JyYXZv -f ${allAlphaRealmsExport}": should import the realm with the id "L2JyYXZv" from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import -i L2JyYXZv -f ${allAlphaRealmsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import --realm-id L2JyYXZv --file ${allAlphaRealmsExport}": should import the realm with the id "L2JyYXZv" from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import --realm-id L2JyYXZv --file ${allAlphaRealmsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import -n bravo -f ${allAlphaRealmsExport}": should import the realm with the name "bravo" from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import -n bravo -f ${allAlphaRealmsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import --realm-name bravo --file ${allAlphaRealmsExport}": should import the realm with the name "bravo" from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import --realm-name bravo --file ${allAlphaRealmsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import -f ${allAlphaRealmsExport}": should import the first realm from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import -f ${allAlphaRealmsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import -af ${allAlphaRealmsExport}": should import all realms from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import -af ${allAlphaRealmsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import --all --file ${allAlphaRealmsExport}": should import all realms from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import --all --file ${allAlphaRealmsExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import -AD ${allSeparateRealmsDirectory}": should import all realms from the ${allSeparateRealmsDirectory} directory"`, async () => { const CMD = `frodo realm import -AD ${allSeparateRealmsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import --all-separate --directory ${allSeparateRealmsDirectory}": should import all realms from the ${allSeparateRealmsDirectory} directory"`, async () => { const CMD = `frodo realm import --all-separate --directory ${allSeparateRealmsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() });*/ test(`"frodo realm import -i L2JyYXZv -f ${allAlphaRealmsExport} -m classic": should import the realm with the id "L2JyYXZv" from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import -i L2JyYXZv -f ${allAlphaRealmsExport} -m classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import --realm-id L2JyYXZv --file ${allAlphaRealmsExport} --type classic": should import the realm with the id "L2JyYXZv" from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import --realm-id L2JyYXZv --file ${allAlphaRealmsExport} --type classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import -n bravo -f ${allAlphaRealmsExport} -m classic": should import the realm with the name "bravo" from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import -n bravo -f ${allAlphaRealmsExport} -m classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import --realm-name bravo --file ${allAlphaRealmsExport} --type classic": should import the realm with the name "bravo" from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import --realm-name bravo --file ${allAlphaRealmsExport} --type classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import -f ${allAlphaRealmsExport} -m classic": should import the first realm from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import -f ${allAlphaRealmsExport} -m classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import -af ${allAlphaRealmsExport} -m classic": should import all realms from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import -af ${allAlphaRealmsExport} -m classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import --all --file ${allAlphaRealmsExport} --type classic": should import all realms from the file "${allAlphaRealmsExport}"`, async () => { const CMD = `frodo realm import --all --file ${allAlphaRealmsExport} --type classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import -AD ${allSeparateClassicRealmsDirectory} -m classic": should import all realms from the ${allSeparateClassicRealmsDirectory} directory"`, async () => { const CMD = `frodo realm import -AD ${allSeparateClassicRealmsDirectory} -m classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo realm import --all-separate --directory ${allSeparateClassicRealmsDirectory} --type classic": should import all realms from the ${allSeparateClassicRealmsDirectory} directory"`, async () => { const CMD = `frodo realm import --all-separate --directory ${allSeparateClassicRealmsDirectory} --type classic`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/realm-list.e2e.test.js b/test/e2e/realm-list.e2e.test.js index a7b72b967..5c3dc54ba 100644 --- a/test/e2e/realm-list.e2e.test.js +++ b/test/e2e/realm-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo realm list', () => { test('"frodo realm list": should list the names of the realms', async () => { const CMD = `frodo realm list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo realm list -l": should list the names, statuses, custom domains, and parents of the realms', async () => { const CMD = `frodo realm list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo realm list --long": should list the names, statuses, custom domains, and parents of the realms', async () => { const CMD = `frodo realm list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/role-import.e2e.test.js b/test/e2e/role-import.e2e.test.js index d6de14ba1..5534b3f21 100644 --- a/test/e2e/role-import.e2e.test.js +++ b/test/e2e/role-import.e2e.test.js @@ -60,7 +60,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -77,54 +77,54 @@ describe('frodo role import', () => { test(`"frodo role import -i ccb11ba1-333b-4197-95db-89bb08a2ab56 -f ${allRolesExport}": should import the role with the id "ccb11ba1-333b-4197-95db-89bb08a2ab56" from the file "${allRolesExport}"`, async () => { const CMD = `frodo role import -i ccb11ba1-333b-4197-95db-89bb08a2ab56 -f ${allRolesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo role import --role-id ccb11ba1-333b-4197-95db-89bb08a2ab56 --file ${allRolesExport}": should import the role with the id "ccb11ba1-333b-4197-95db-89bb08a2ab56" from the file "${allRolesExport}"`, async () => { const CMD = `frodo role import --role-id ccb11ba1-333b-4197-95db-89bb08a2ab56 --file ${allRolesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo role import -n test-internal-role -f ${allRolesExport}": should import the role with the name "test-internal-role" from the file "${allRolesExport}"`, async () => { const CMD = `frodo role import -n test-internal-role -f ${allRolesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo role import --role-name test-internal-role --file ${allRolesExport}": should import the role with the name "test-internal-role" from the file "${allRolesExport}"`, async () => { const CMD = `frodo role import --role-name test-internal-role --file ${allRolesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo role import -f ${allRolesExport}": should import the first role from the file "${allRolesExport}"`, async () => { const CMD = `frodo role import -f ${allRolesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo role import -af ${allRolesExport}": should import all roles from the file "${allRolesExport}"`, async () => { const CMD = `frodo role import -af ${allRolesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo role import --all --file ${allRolesExport}": should import all roles from the file "${allRolesExport}"`, async () => { const CMD = `frodo role import --all --file ${allRolesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo role import -AD ${allSeparateRolesDirectory}": should import all roles from the ${allSeparateRolesDirectory} directory"`, async () => { const CMD = `frodo role import -AD ${allSeparateRolesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo role import --all-separate --directory ${allSeparateRolesDirectory}": should import all roles from the ${allSeparateRolesDirectory} directory"`, async () => { const CMD = `frodo role import --all-separate --directory ${allSeparateRolesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/role-list.e2e.test.js b/test/e2e/role-list.e2e.test.js index 4121f8fa4..714b055a3 100644 --- a/test/e2e/role-list.e2e.test.js +++ b/test/e2e/role-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo role list', () => { test('"frodo role list": should list the names of the internal roles', async () => { const CMD = `frodo role list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo role list -l": should list the ids, names, descriptions, and conditions of the internal roles', async () => { const CMD = `frodo role list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo role list --long": should list the ids, names, descriptions, and conditions of the internal roles', async () => { const CMD = `frodo role list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/saml-cot-import.e2e.test.js b/test/e2e/saml-cot-import.e2e.test.js index 38891ed41..38fe7dc5c 100644 --- a/test/e2e/saml-cot-import.e2e.test.js +++ b/test/e2e/saml-cot-import.e2e.test.js @@ -61,7 +61,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -78,67 +78,67 @@ describe('frodo saml cot import', () => { test(`"frodo saml cot import -i AzureCOT -f ${allAlphaCirclesOfTrustExport}": should import the saml circle of trust with the id "AzureCOT" from the file "${allAlphaCirclesOfTrustExport}"`, async () => { const CMD = `frodo saml cot import -i AzureCOT -f ${allAlphaCirclesOfTrustExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml cot import --cot-id AzureCOT --file ${allAlphaCirclesOfTrustExport}": should import the saml circle of trust with the id "AzureCOT" from the file "${allAlphaCirclesOfTrustExport}"`, async () => { const CMD = `frodo saml cot import --cot-id AzureCOT --file ${allAlphaCirclesOfTrustExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml cot import -i AzureCOT -f ${allAlphaCirclesOfTrustFileName} -D ${allDirectory}": should import the saml circle of trust with the id "AzureCOT" from the file "${allAlphaCirclesOfTrustExport}"`, async () => { const CMD = `frodo saml cot import -i AzureCOT -f ${allAlphaCirclesOfTrustFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml cot import -f ${allAlphaCirclesOfTrustExport}": should import the first saml circle of trust from the file "${allAlphaCirclesOfTrustExport}"`, async () => { const CMD = `frodo saml cot import -f ${allAlphaCirclesOfTrustExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml cot import --file ${allAlphaCirclesOfTrustExport}": should import the first saml cot from the file "${allAlphaCirclesOfTrustExport}"`, async () => { const CMD = `frodo saml cot import --file ${allAlphaCirclesOfTrustExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml cot import -f ${allAlphaCirclesOfTrustFileName} -D ${allDirectory}": should import the first saml circle of trust from the file "${allAlphaCirclesOfTrustExport}"`, async () => { const CMD = `frodo saml cot import -f ${allAlphaCirclesOfTrustFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml cot import -af ${allAlphaCirclesOfTrustExport}": should import all saml circle of trusts from the file "${allAlphaCirclesOfTrustExport}"`, async () => { const CMD = `frodo saml cot import -af ${allAlphaCirclesOfTrustExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml cot import --all --file ${allAlphaCirclesOfTrustExport}": should import all saml circle of trusts from the file "${allAlphaCirclesOfTrustExport}"`, async () => { const CMD = `frodo saml cot import --all --file ${allAlphaCirclesOfTrustExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml cot import -af ${allAlphaCirclesOfTrustFileName} -D ${allDirectory}": should import all saml circle of trusts from the file "${allAlphaCirclesOfTrustExport}"`, async () => { const CMD = `frodo saml cot import -af ${allAlphaCirclesOfTrustFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml cot import -AD ${allSeparateCircleOfTrustsDirectory}": should import all saml circle of trusts from the ${allSeparateCircleOfTrustsDirectory} directory"`, async () => { const CMD = `frodo saml cot import -AD ${allSeparateCircleOfTrustsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml cot import --all-separate --directory ${allSeparateCircleOfTrustsDirectory}": should import all saml circle of trusts from the ${allSeparateCircleOfTrustsDirectory} directory"`, async () => { const CMD = `frodo saml cot import --all-separate --directory ${allSeparateCircleOfTrustsDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/saml-cot-list.e2e.test.js b/test/e2e/saml-cot-list.e2e.test.js index 4c04f4dec..58ac4f392 100644 --- a/test/e2e/saml-cot-list.e2e.test.js +++ b/test/e2e/saml-cot-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo saml cot list', () => { test('"frodo saml cot list": should list the names of the circles of trust', async () => { const CMD = `frodo saml cot list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo saml cot list -l": should list the names, descriptions, status, and trusted providers of the circles of trust', async () => { const CMD = `frodo saml cot list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo saml cot list --long": should list the names, descriptions, status, and trusted providers of the circles of trust', async () => { const CMD = `frodo saml cot list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/saml-describe.e2e.test.js b/test/e2e/saml-describe.e2e.test.js index 8e1eecfc9..c6e405def 100644 --- a/test/e2e/saml-describe.e2e.test.js +++ b/test/e2e/saml-describe.e2e.test.js @@ -52,7 +52,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -64,12 +64,12 @@ describe('frodo saml describe', () => { test('"frodo saml describe -i iSPAzure": should describe the iSPAzure saml provider', async () => { const CMD = `frodo saml describe -i iSPAzure`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo saml describe --entity-id iSPAzure": should describe the iSPAzure saml provider', async () => { const CMD = `frodo saml describe --entity-id iSPAzure`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/saml-import.e2e.test.js b/test/e2e/saml-import.e2e.test.js index 77727ad35..0bcb94afd 100644 --- a/test/e2e/saml-import.e2e.test.js +++ b/test/e2e/saml-import.e2e.test.js @@ -61,7 +61,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -78,66 +78,66 @@ describe('frodo saml import', () => { test(`"frodo saml import -i iSPAzure -f ${allAlphaSamlProvidersExport}": should import the saml provider with the id "iSPAzure" from the file "${allAlphaSamlProvidersExport}"`, async () => { const CMD = `frodo saml import -i iSPAzure -f ${allAlphaSamlProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml import --no-deps --entity-id iSPAzure --file ${allAlphaSamlProvidersExport}": should import the saml provider with the id "iSPAzure" from the file "${allAlphaSamlProvidersExport}"`, async () => { const CMD = `frodo saml import --no-deps --entity-id iSPAzure --file ${allAlphaSamlProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml import -i iSPAzure -f ${allAlphaSamlProvidersFileName} -D ${allDirectory}": should import the saml provider with the id "iSPAzure" from the file "${allAlphaSamlProvidersExport}"`, async () => { const CMD = `frodo saml import -i iSPAzure -f ${allAlphaSamlProvidersFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml import -f ${allAlphaSamlProvidersExport}": should import the first saml provider from the file "${allAlphaSamlProvidersExport}"`, async () => { const CMD = `frodo saml import -f ${allAlphaSamlProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml import --no-deps --file ${allAlphaSamlProvidersExport}": should import the first saml from the file "${allAlphaSamlProvidersExport}"`, async () => { const CMD = `frodo saml import --no-deps --file ${allAlphaSamlProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml import -f ${allAlphaSamlProvidersExport}": should import the first saml provider from the file "${allAlphaSamlProvidersExport}"`, async () => { const CMD = `frodo saml import -f ${allAlphaSamlProvidersFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml import -af ${allAlphaSamlProvidersExport}": should import all saml providers from the file "${allAlphaSamlProvidersExport}"`, async () => { const CMD = `frodo saml import -af ${allAlphaSamlProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml import --all --no-deps --file ${allAlphaSamlProvidersExport}": should import all saml providers from the file "${allAlphaSamlProvidersExport}"`, async () => { const CMD = `frodo saml import --all --no-deps --file ${allAlphaSamlProvidersExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml import -af ${allAlphaSamlProvidersExport}": should import all saml providers from the file "${allAlphaSamlProvidersExport}"`, async () => { const CMD = `frodo saml import -af ${allAlphaSamlProvidersFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml import -AD ${allSeparateSamlProvidersDirectory}": should import all saml providers from the '${allSeparateSamlProvidersDirectory}' directory"`, async () => { const CMD = `frodo saml import -AD ${allSeparateSamlProvidersDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo saml import --all-separate --no-deps --directory ${allSeparateSamlProvidersDirectory}": should import all saml providers from the '${allSeparateSamlProvidersDirectory}' directory"`, async () => { const CMD = `frodo saml import --all-separate --no-deps --directory ${allSeparateSamlProvidersDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/saml-list.e2e.test.js b/test/e2e/saml-list.e2e.test.js index 6d88644d9..535c11e3e 100644 --- a/test/e2e/saml-list.e2e.test.js +++ b/test/e2e/saml-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo saml list', () => { test('"frodo saml list": should list the ids of the saml entity providers', async () => { const CMD = `frodo saml list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo saml list -l": should list the ids, locations, and roles of the saml entity providers', async () => { const CMD = `frodo saml list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo saml list --long": should list the ids, locations, and roles of the saml entity providers', async () => { const CMD = `frodo saml list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/script-delete.e2e.test.js b/test/e2e/script-delete.e2e.test.js index 9a8b2be6d..db2f49a0c 100644 --- a/test/e2e/script-delete.e2e.test.js +++ b/test/e2e/script-delete.e2e.test.js @@ -56,7 +56,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,7 +68,7 @@ describe('frodo script delete', () => { test("\"frodo script delete -n 'hashdeviceProfile'\": should delete the script named 'hashdeviceProfile'", async () => { const CMD = `frodo script delete -n 'hashdeviceProfile'`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test("\"frodo script delete --script-name 'hashdeviceProfile'\": should display error when the script named 'hashdeviceProfile' cannot be deleted since it does not exist", async () => { @@ -77,14 +77,14 @@ describe('frodo script delete', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test('"frodo script delete -i e15a13ee-9168-40cf-934f-656a5f568a6a": should delete the script with id \'e15a13ee-9168-40cf-934f-656a5f568a6a\'', async () => { const CMD = `frodo script delete -i e15a13ee-9168-40cf-934f-656a5f568a6a`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo script delete --script-id e15a13ee-9168-40cf-934f-656a5f568a6a": should display error when the script with id \'e15a13ee-9168-40cf-934f-656a5f568a6a\' cannot be deleted since it does not exist', async () => { @@ -93,7 +93,7 @@ describe('frodo script delete', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); @@ -101,13 +101,13 @@ describe('frodo script delete', () => { test.skip('"frodo script delete -a": should delete all scripts', async () => { const CMD = `frodo script delete -a`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); //TODO: Generate mock for this test (skip for meantime) test.skip('"frodo script delete --all": should do nothing when no scripts can be deleted', async () => { const CMD = `frodo script delete --all`; const { stderr } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot() }); }); diff --git a/test/e2e/script-describe.e2e.test.js b/test/e2e/script-describe.e2e.test.js index 7e1021f48..1dfdc7e1f 100644 --- a/test/e2e/script-describe.e2e.test.js +++ b/test/e2e/script-describe.e2e.test.js @@ -56,7 +56,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -71,7 +71,7 @@ describe('frodo script describe', () => { test(`"frodo script describe -i 1b52a7e0-4019-40fa-958a-15a49870e901": should describe the script with id "1b52a7e0-4019-40fa-958a-15a49870e901"`, async () => { const CMD = `frodo script describe -i 1b52a7e0-4019-40fa-958a-15a49870e901`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo script describe -un shared": should describe the script with name "shared" with usage`, async () => { @@ -86,31 +86,31 @@ describe('frodo script describe', () => { stdout = e?.stdout ?? ''; stderr = e?.stderr ?? ''; } - expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stderr).toMatchSnapshot(); + expect(stdout).toMatchSnapshot(); }); test(`"frodo script describe -un shared -f ${allConfigFile}": should describe the script with name "shared" with usage from file ${allConfigFile}`, async () => { const CMD = `frodo script describe -un shared -f ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo script describe -un shared -D ${allConfigDirectory}": should describe the script with name "shared" with usage from directory ${allConfigDirectory}`, async () => { const CMD = `frodo script describe -un shared -D ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo script describe --json --usage --script-id 1b52a7e0-4019-40fa-958a-15a49870e901 --file ${allConfigFile}": should describe the script with id "1b52a7e0-4019-40fa-958a-15a49870e901" with usage from file ${allConfigFile} and json output`, async () => { const CMD = `frodo script describe --json --usage --script-id 1b52a7e0-4019-40fa-958a-15a49870e901 --file ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo script describe --json --usage --script-name shared --directory ${allConfigDirectory}": should describe the script with name "shared" with usage from directory ${allConfigDirectory} and json output`, async () => { const CMD = `frodo script describe --json --usage --script-name shared --directory ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/script-list.e2e.test.js b/test/e2e/script-list.e2e.test.js index d8df2c9ea..69afd4dbd 100644 --- a/test/e2e/script-list.e2e.test.js +++ b/test/e2e/script-list.e2e.test.js @@ -58,7 +58,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -73,13 +73,13 @@ describe('frodo script list', () => { test('"frodo script list": should list the names of the scripts', async () => { const CMD = `frodo script list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo script list -l": should list the names, uuids, languages, contexts, and descriptions of the scripts', async () => { const CMD = `frodo script list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo script list -u": should list the usage of the scripts', async () => { @@ -88,8 +88,8 @@ describe('frodo script list', () => { await exec(CMD, env); fail("Command should've failed") } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(e.stdout)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); + expect(e.stdout).toMatchSnapshot(); } }); @@ -99,32 +99,32 @@ describe('frodo script list', () => { await exec(CMD, env); fail("Command should've failed") } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); - expect(removeAnsiEscapeCodes(e.stdout)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); + expect(e.stdout).toMatchSnapshot(); } }); test(`"frodo script list -uf ${allConfigFile}": should list the usage of the scripts in the ${allConfigFile} file`, async () => { const CMD = `frodo script list -uf ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo script list --usage --long --file ${allConfigFile}": should list the usage of the scripts in the ${allConfigFile} file`, async () => { const CMD = `frodo script list --usage --long --file ${allConfigFile}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo script list -uD ${allConfigDirectory}": should list the usage of the scripts in the ${allConfigDirectory} directory`, async () => { const CMD = `frodo script list -uD ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo script list --usage --long --directory ${allConfigDirectory}": should list the usage of the scripts in the ${allConfigDirectory} directory`, async () => { const CMD = `frodo script list --usage --long --directory ${allConfigDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/server-import.e2e.test.js b/test/e2e/server-import.e2e.test.js index edec792b1..797898a11 100644 --- a/test/e2e/server-import.e2e.test.js +++ b/test/e2e/server-import.e2e.test.js @@ -59,7 +59,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=http://openam-frodo-dev.classic.co */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { classic_connection as cc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -79,55 +79,55 @@ describe('frodo server import', () => { test(`"frodo server import -di 01 -f ${allServersExport}": should import the server with the id "01" from the file "${allServersExport}"`, async () => { const CMD = `frodo server import -di 01 -f ${allServersExport}`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo server import --server-id 01 --file ${allServersExport}": should import the server with the id "01" from the file "${allServersExport}"`, async () => { const CMD = `frodo server import --server-id 01 --file ${allServersExport}`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo server import -u 8081 -f ${allServersExport}": should import the server with the url containing "8081" from the file "${allServersExport}"`, async () => { const CMD = `frodo server import -u 8081 -f ${allServersExport}`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo server import --default --server-url http://localhost:8081/am --file ${allServersExport}": should import the server with the url "http://localhost:8081/am" from the file "${allServersExport}"`, async () => { const CMD = `frodo server import --default --server-url http://localhost:8081/am --file ${allServersExport}`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo server import -f ${allServersExport}": should import the first server from the file "${allServersExport}"`, async () => { const CMD = `frodo server import -f ${allServersExport}`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo server import -daf ${allServersExport}": should import all servers from the file "${allServersExport}"`, async () => { const CMD = `frodo server import -daf ${allServersExport}`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo server import --all --file ${allServersExport}": should import all servers from the file "${allServersExport}"`, async () => { const CMD = `frodo server import --all --file ${allServersExport}`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo server import -dAD ${allSeparateServersDirectory}": should import all servers from the ${allSeparateServersDirectory} directory"`, async () => { const CMD = `frodo server import -dAD ${allSeparateServersDirectory}`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo server import --all-separate --directory ${allSeparateServersDirectory}": should import all servers from the ${allSeparateServersDirectory} directory"`, async () => { const CMD = `frodo server import --all-separate --directory ${allSeparateServersDirectory}`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/server-list.e2e.test.js b/test/e2e/server-list.e2e.test.js index dbe2db177..1b98e066b 100644 --- a/test/e2e/server-list.e2e.test.js +++ b/test/e2e/server-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=http://openam-frodo-dev.classic.co */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { classic_connection as cc } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -67,18 +67,18 @@ describe('frodo server list', () => { test('"frodo server list": should list the urls of the servers', async () => { const CMD = `frodo server list`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo server list -l": should list the ids, urls, and site names of the servers', async () => { const CMD = `frodo server list -l`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo server list --long": should list the ids, urls, and site names of the servers', async () => { const CMD = `frodo server list --long`; const { stdout } = await exec(CMD, classicEnv); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/service-import.e2e.test.js b/test/e2e/service-import.e2e.test.js index eebf9414a..a92bd4702 100644 --- a/test/e2e/service-import.e2e.test.js +++ b/test/e2e/service-import.e2e.test.js @@ -66,7 +66,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -86,19 +86,19 @@ describe('frodo service import', () => { test(`"frodo service import -i SocialIdentityProviders -f ${allAlphaServicesExport}": should import the service with the id "SocialIdentityProviders" from the file "${allAlphaServicesExport}"`, async () => { const CMD = `frodo service import -i SocialIdentityProviders -f ${allAlphaServicesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import -Cri baseurl -f ${allAlphaServicesExport}": should import the service with the id "baseurl" from the file "${allAlphaServicesExport}", and clean the old one`, async () => { const CMD = `frodo service import -Cri baseurl -f ${allAlphaServicesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import --service-id dashboard --global --file ${allGlobalServicesExport}": should import the global service with the id "CorsService" from the file "${allGlobalServicesExport}"`, async () => { const CMD = `frodo service import --service-id dashboard --global --file ${allGlobalServicesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import --clean -g --service-id dashboard --file ${allGlobalServicesExport}": should fail because global singleton services cannot be deleted (--clean option).`, async () => { @@ -107,26 +107,26 @@ describe('frodo service import', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test(`"frodo service import -f ${allAlphaServicesExport}": should import the first service from the file "${allAlphaServicesExport}"`, async () => { const CMD = `frodo service import -f ${allAlphaServicesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import -Crf ${allAlphaServicesExport}": should import the first service from the file "${allAlphaServicesExport}", and clean the old one`, async () => { const CMD = `frodo service import -Crf ${allAlphaServicesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import --global --file ${allGlobalServicesExport}": should import the first global service from the file "${allGlobalServicesExport}"`, async () => { const CMD = `frodo service import --global --file ${allGlobalServicesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import --clean --global --file ${allGlobalServicesExport}": should fail because global singleton services cannot be deleted (--clean option).`, async () => { @@ -135,26 +135,26 @@ describe('frodo service import', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test(`"frodo service import -af ${allAlphaServicesExport}": should import all services from the file "${allAlphaServicesExport}"`, async () => { const CMD = `frodo service import -af ${allAlphaServicesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import --current-realm -Caf ${allAlphaServicesExport}": should import all services from the file "${allAlphaServicesExport}", and clean the old ones`, async () => { const CMD = `frodo service import --current-realm -Caf ${allAlphaServicesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import --all --global --file ${allGlobalServicesExport}": should import all global services from the file "${allGlobalServicesExport}"`, async () => { const CMD = `frodo service import --all --global --file ${allGlobalServicesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import --clean --global --all --file ${allGlobalServicesExport}": should fail because global singleton services cannot be deleted (--clean option).`, async () => { @@ -163,31 +163,31 @@ describe('frodo service import', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test(`"frodo service import -AD ${allSeparateAlphaServicesDirectory}": should import all services from the directory "${allSeparateAlphaServicesDirectory}"`, async () => { const CMD = `frodo service import -AD ${allSeparateAlphaServicesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import -ACrD ${allSeparateAlphaServicesDirectory}": should import all services from the directory "${allSeparateAlphaServicesDirectory}", and clean the old ones`, async () => { const CMD = `frodo service import -ACrD ${allSeparateAlphaServicesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import --global --all-separate --directory ${allSeparateGlobalServicesDirectory}": should import all global services from the directory "${allSeparateGlobalServicesDirectory}"`, async () => { const CMD = `frodo service import --global --all-separate --directory ${allSeparateGlobalServicesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo service import --clean --global --all-separate --directory ${allSeparateGlobalServicesDirectory}": should import all global services from the directory "${allSeparateGlobalServicesDirectory}", and clean the old ones`, async () => { const CMD = `frodo service import --clean --global --all-separate --directory ${allSeparateGlobalServicesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/service-list.e2e.test.js b/test/e2e/service-list.e2e.test.js index a26eb9b77..28b51389f 100644 --- a/test/e2e/service-list.e2e.test.js +++ b/test/e2e/service-list.e2e.test.js @@ -54,7 +54,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -66,24 +66,24 @@ describe('frodo service list', () => { test('"frodo service list": should list the ids of the services', async () => { const CMD = `frodo service list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo service list -l": should list the ids and names of the services', async () => { const CMD = `frodo service list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo service list -g": should list the ids of the global services', async () => { const CMD = `frodo service list -g`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo service list --long --global": should list the ids and names of the global services', async () => { const CMD = `frodo service list --long --global`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/theme-delete.e2e.test.js b/test/e2e/theme-delete.e2e.test.js index 74f5d9f5c..493a68441 100644 --- a/test/e2e/theme-delete.e2e.test.js +++ b/test/e2e/theme-delete.e2e.test.js @@ -56,7 +56,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -68,7 +68,7 @@ describe('frodo theme delete', () => { test("\"frodo theme delete -n 'Starter Theme'\": should delete the theme named 'Starter Theme'", async () => { const CMD = `frodo theme delete -n 'Starter Theme'`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test("\"frodo theme delete --theme-name 'Does Not Exist'\": should display error when the theme named 'Does Not Exist' cannot be deleted since it does not exist", async () => { @@ -77,14 +77,14 @@ describe('frodo theme delete', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test('"frodo theme delete -i 9e6bf50d-85aa-4d70-a340-439d8bc7bc14": should delete the theme with id \'9e6bf50d-85aa-4d70-a340-439d8bc7bc14\'', async () => { const CMD = `frodo theme delete -i 9e6bf50d-85aa-4d70-a340-439d8bc7bc14`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo theme delete --theme-id 4eeb434c-1f56-4173-8da3-b49214bedeb6": should display error when the theme with id \'4eeb434c-1f56-4173-8da3-b49214bedeb6\' cannot be deleted since it does not exist', async () => { @@ -93,13 +93,13 @@ describe('frodo theme delete', () => { await exec(CMD, env); fail("Command should've failed"); } catch (e) { - expect(removeAnsiEscapeCodes(e.stderr)).toMatchSnapshot(); + expect(e.stderr).toMatchSnapshot(); } }); test('"frodo theme delete -a": should delete all themes', async () => { const CMD = `frodo theme delete -a`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/theme-import.e2e.test.js b/test/e2e/theme-import.e2e.test.js index ace5bd762..8422eaf81 100644 --- a/test/e2e/theme-import.e2e.test.js +++ b/test/e2e/theme-import.e2e.test.js @@ -64,7 +64,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -81,85 +81,85 @@ describe('frodo theme import', () => { test(`"frodo theme import -n \'Starter Theme\' -f ${allAlphaThemesExport}": should import the theme with the name "Starter Theme" from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import -n 'Starter Theme' -f ${allAlphaThemesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import --theme-name \'Starter Theme\' --file ${allAlphaThemesExport}": should import the theme with the name "Starter Theme" from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import --theme-name 'Starter Theme' --file ${allAlphaThemesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import -n \'Starter Theme\' -f ${allAlphaThemesFileName} -D ${allDirectory}": should import the theme with the name "Starter Theme" from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import -n 'Starter Theme' -f ${allAlphaThemesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import -i 86ce2f64-586d-44fe-8593-b12a85aac68d -f ${allAlphaThemesExport}": should import the theme with the id "86ce2f64-586d-44fe-8593-b12a85aac68d" from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import -i 86ce2f64-586d-44fe-8593-b12a85aac68d -f ${allAlphaThemesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import --theme-id 86ce2f64-586d-44fe-8593-b12a85aac68d --file ${allAlphaThemesExport}": should import the theme with the id "86ce2f64-586d-44fe-8593-b12a85aac68d" from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import --theme-id 86ce2f64-586d-44fe-8593-b12a85aac68d --file ${allAlphaThemesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import -i 86ce2f64-586d-44fe-8593-b12a85aac68d -f ${allAlphaThemesFileName} -D ${allDirectory}": should import the theme with the id "86ce2f64-586d-44fe-8593-b12a85aac68d" from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import -i 86ce2f64-586d-44fe-8593-b12a85aac68d -f ${allAlphaThemesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import -f ${allAlphaThemesExport}": should import the first theme from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import -f ${allAlphaThemesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import --file ${allAlphaThemesExport}": should import the first theme from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import --file ${allAlphaThemesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import -f ${allAlphaThemesFileName} -D ${allDirectory}": should import the first theme from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import -f ${allAlphaThemesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import -af ${allAlphaThemesExport}": should import all themes from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import -af ${allAlphaThemesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import --all --file ${allAlphaThemesExport}": should import all themes from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import --all --file ${allAlphaThemesExport}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import -af ${allAlphaThemesFileName} -D ${allDirectory}": should import all themes from the file "${allAlphaThemesExport}"`, async () => { const CMD = `frodo theme import -af ${allAlphaThemesFileName} -D ${allDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import -AD ${allSeparateThemesDirectory}": should import all themes from the '${allSeparateThemesDirectory}' directory"`, async () => { const CMD = `frodo theme import -AD ${allSeparateThemesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test(`"frodo theme import --all-separate --directory ${allSeparateThemesDirectory}": should import all themes from the '${allSeparateThemesDirectory}' directory"`, async () => { const CMD = `frodo theme import --all-separate --directory ${allSeparateThemesDirectory}`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/theme-list.e2e.test.js b/test/e2e/theme-list.e2e.test.js index a6947e5ce..e89fc667e 100644 --- a/test/e2e/theme-list.e2e.test.js +++ b/test/e2e/theme-list.e2e.test.js @@ -53,7 +53,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgebloc */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { getEnv } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -65,18 +65,18 @@ describe('frodo theme list', () => { test('"frodo theme list": should list the names of the themes', async () => { const CMD = `frodo theme list`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo theme list -l": should list the names, ids, and default status of the themes', async () => { const CMD = `frodo theme list -l`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); test('"frodo theme list --long": should list the names, ids, and default status of the themes', async () => { const CMD = `frodo theme list --long`; const { stdout } = await exec(CMD, env); - expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(stdout).toMatchSnapshot() }); }); diff --git a/test/e2e/utils/TestUtils.js b/test/e2e/utils/TestUtils.js index d81612778..c93317ae0 100644 --- a/test/e2e/utils/TestUtils.js +++ b/test/e2e/utils/TestUtils.js @@ -7,19 +7,6 @@ import tmp from 'tmp' const exec = promisify(cp.exec); const fspromise = fs.promises -const ansiEscapeCodes = - // eslint-disable-next-line no-control-regex - /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; - -/** - * Remove ANSI escape codes - * @param {string} text Text containing ANSI escape codes - * @returns {string} Text without ANSI escape codes - */ -export function removeAnsiEscapeCodes(text) { - return text ? text.replace(ansiEscapeCodes, '') : text; -} - /** * Mask random ForgeRock transaction IDs that make snapshots non-deterministic. * @param {string} text @@ -66,7 +53,7 @@ export function normalizeStackPaths(text) { */ export function normalizeSnapshotText(text) { return normalizeStackPaths( - maskUserAgentVersions(maskTransactionIds(removeAnsiEscapeCodes(text))) + maskUserAgentVersions(maskTransactionIds(text)) ); } @@ -477,13 +464,42 @@ export function getRecordingEnv(profileName = 'default', mockConnection = undefi * Method that runs a command and verifies that the command succeeds when run * @param {string} command The command to run * @param {{env: Record}} env The environment variables + * @param {number | undefined} runningTimeout Optional timeout that, when specified, will expect a command to run for the specified amount of milliseconds before terminating early. + * This is used when we need to verify a command is running as intended, but we don't want to wait for it to fully finish. * @returns {Promise} */ export async function testSuccess( command, env, + runningTimeout ) { - const { stdout, stderr } = await exec(command, env); + let stdout = ''; + let stderr = ''; + const proc = runningTimeout ? cp.exec(command, env) : await exec(command, env); + if (runningTimeout) { + let finished = false; + proc.stdout?.on('data', chunk => { + stdout += chunk; + }); + proc.stderr?.on('data', chunk => { + stderr += chunk; + }); + proc.on('exit', () => { + finished = true; + }); + // Wait for timeout + await new Promise(resolve => setTimeout(resolve, runningTimeout)); + // Assert that command is still running + expect(finished).toBe(false); + // Kill running command + proc.kill(); + proc.stdout?.destroy(); + proc.stderr?.destroy(); + await new Promise(resolve => proc.once('close', resolve)); + } else { + stdout = proc.stdout; + stderr = proc.stderr; + } assertNoPollyReplayError(stdout, command); assertNoPollyReplayError(stderr, command); expect(normalizeSnapshotText(stdout)).toMatchSnapshot(); diff --git a/test/utils/ShellPty.js b/test/utils/ShellPty.js index 40f2e88f6..0d31c6cfc 100644 --- a/test/utils/ShellPty.js +++ b/test/utils/ShellPty.js @@ -12,10 +12,6 @@ const distAppPath = path.join(repoRoot, 'dist', 'app.cjs'); const driverPath = path.join(repoRoot, 'test', 'utils', 'shell_pty_driver.py'); const buildLockPath = path.join(repoRoot, '.shell-pty-build.lock'); -const ansiEscapeCodes = - // eslint-disable-next-line no-control-regex - /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; - function sleepSync(ms) { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); } @@ -64,16 +60,6 @@ export function removeShellTestHome(homeDir) { fs.rmSync(homeDir, { recursive: true, force: true }); } -export function removeAnsiEscapeCodes(text) { - return text ? text.replace(ansiEscapeCodes, '') : text; -} - -export function normalizeTerminalOutput(text) { - return removeAnsiEscapeCodes(text) - .replace(/\r/g, '') - .replace(/\u0008/g, ''); -} - export function runShellScenario({ actions, homeDir, env = {}, args = ['shell'] }) { ensureCliBuilt(); @@ -87,7 +73,6 @@ export function runShellScenario({ actions, homeDir, env = {}, args = ['shell'] FRODO_TEST: '1', FRODO_NO_CACHE: 'true', TERM: 'xterm-256color', - FORCE_COLOR: '1', }, actions, };