diff --git a/package-lock.json b/package-lock.json index 279d4e9..234db77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,6 +55,7 @@ "eslint-plugin-cypress": "^6.1.0", "eslint-plugin-vue": "^10.8.0", "jsdom": "^28.1.0", + "msw": "^2.12.14", "postcss": "^8.5.8", "prettier": "^3.8.1", "sass": "^1.97.3", @@ -1129,6 +1130,122 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/core/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/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1281,6 +1398,24 @@ "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" }, + "node_modules/@mswjs/interceptors": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", + "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -1288,6 +1423,31 @@ "dev": true, "license": "MIT" }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, "node_modules/@parcel/watcher": { "version": "2.5.6", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", @@ -2504,6 +2664,13 @@ "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", "dev": true }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/tmp": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", @@ -3554,6 +3721,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "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/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3642,6 +3834,20 @@ "dev": true, "license": "ISC" }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/copy-anything": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", @@ -4247,6 +4453,16 @@ "@esbuild/win32-x64": "0.27.3" } }, + "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-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4902,6 +5118,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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", @@ -5016,6 +5242,16 @@ "lodash": "^4.17.15" } }, + "node_modules/graphql": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.1.tgz", + "integrity": "sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5091,6 +5327,13 @@ "node": ">= 0.4" } }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/hookable": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", @@ -5312,6 +5555,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -6322,12 +6572,67 @@ "dev": true, "license": "MIT" }, + "node_modules/msw": { + "version": "2.12.14", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.14.tgz", + "integrity": "sha512-4KXa4nVBIBjbDbd7vfQNuQ25eFxug0aropCQFoI0JdOBuJWamkT1yLVIWReFI8SiTRc+H1hKzaNk+cLk2N9rtQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.41.2", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.10.1", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/muggle-string": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "license": "MIT" }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -6472,6 +6777,13 @@ "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", "dev": true }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6579,6 +6891,13 @@ "dev": true, "license": "ISC" }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -6928,6 +7247,16 @@ "throttleit": "^1.0.0" } }, + "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", @@ -6951,6 +7280,13 @@ "node": ">=8" } }, + "node_modules/rettime": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.10.1.tgz", + "integrity": "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==", + "dev": true, + "license": "MIT" + }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -7382,6 +7718,16 @@ "node": ">=10.17.0" } }, + "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/std-env": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", @@ -7398,6 +7744,13 @@ "duplexer": "~0.1.1" } }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -7547,6 +7900,19 @@ "url": "https://www.buymeacoffee.com/systeminfo" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tailwindcss": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", @@ -7820,6 +8186,22 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", + "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typedoc": { "version": "0.28.17", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", @@ -7953,6 +8335,16 @@ "url": "https://github.com/sponsors/sxzz" } }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -8528,6 +8920,16 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "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/yaml": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", @@ -8543,6 +8945,35 @@ "url": "https://github.com/sponsors/eemeli" } }, + "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/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/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -8573,6 +9004,19 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -9139,6 +9583,70 @@ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true }, + "@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true + }, + "@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "requires": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + } + }, + "@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "requires": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "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, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true + }, + "@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "requires": {} + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -9246,12 +9754,48 @@ "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" }, + "@mswjs/interceptors": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", + "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", + "dev": true, + "requires": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + } + }, "@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", "dev": true }, + "@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true + }, + "@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "requires": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true + }, "@parcel/watcher": { "version": "2.5.6", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", @@ -9912,6 +10456,12 @@ "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", "dev": true }, + "@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true + }, "@types/tmp": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", @@ -10645,6 +11195,23 @@ "string-width": "^4.2.0" } }, + "cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true + }, + "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, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -10716,6 +11283,12 @@ } } }, + "cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true + }, "copy-anything": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", @@ -11179,6 +11752,12 @@ "@esbuild/win32-x64": "0.27.3" } }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -11601,6 +12180,12 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, + "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 + }, "get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -11681,6 +12266,12 @@ "lodash": "^4.17.15" } }, + "graphql": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.1.tgz", + "integrity": "sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11726,6 +12317,12 @@ "function-bind": "^1.1.2" } }, + "headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true + }, "hookable": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", @@ -11860,6 +12457,12 @@ "is-path-inside": "^3.0.2" } }, + "is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -12490,11 +13093,43 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "msw": { + "version": "2.12.14", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.14.tgz", + "integrity": "sha512-4KXa4nVBIBjbDbd7vfQNuQ25eFxug0aropCQFoI0JdOBuJWamkT1yLVIWReFI8SiTRc+H1hKzaNk+cLk2N9rtQ==", + "dev": true, + "requires": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.41.2", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.10.1", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + } + }, "muggle-string": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" }, + "mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true + }, "nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -12590,6 +13225,12 @@ "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", "dev": true }, + "outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -12662,6 +13303,12 @@ } } }, + "path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true + }, "pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -12876,6 +13523,12 @@ "throttleit": "^1.0.0" } }, + "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 + }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -12892,6 +13545,12 @@ "signal-exit": "^3.0.2" } }, + "rettime": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.10.1.tgz", + "integrity": "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==", + "dev": true + }, "rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -13182,6 +13841,12 @@ } } }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true + }, "std-env": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", @@ -13197,6 +13862,12 @@ "duplexer": "~0.1.1" } }, + "strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -13286,6 +13957,12 @@ "integrity": "sha512-vX0eeI7oGIr79NLiJRWnK8SyxDjyiNOEanaQnHRNyb5ep8QcpD8QMDvrukdrxV4pV4AKjwUDfaypXnWHMC/65A==", "dev": true }, + "tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true + }, "tailwindcss": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", @@ -13472,6 +14149,15 @@ "prelude-ls": "^1.2.1" } }, + "type-fest": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", + "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", + "dev": true, + "requires": { + "tagged-tag": "^1.0.0" + } + }, "typedoc": { "version": "0.28.17", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", @@ -13559,6 +14245,12 @@ "picomatch": "^4.0.3" } }, + "until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true + }, "untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -13881,11 +14573,38 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, "yaml": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==" }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "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" + } + }, + "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 + }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -13907,6 +14626,12 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true } } } diff --git a/package.json b/package.json index 4809aba..811502d 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "eslint-plugin-cypress": "^6.1.0", "eslint-plugin-vue": "^10.8.0", "jsdom": "^28.1.0", + "msw": "^2.12.14", "postcss": "^8.5.8", "prettier": "^3.8.1", "sass": "^1.97.3", diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js new file mode 100644 index 0000000..b17fcd6 --- /dev/null +++ b/public/mockServiceWorker.js @@ -0,0 +1,349 @@ +/* eslint-disable */ +/* tslint:disable */ + +/** + * Mock Service Worker. + * @see https://github.com/mswjs/msw + * - Please do NOT modify this file. + */ + +const PACKAGE_VERSION = '2.12.14' +const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82' +const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') +const activeClientIds = new Set() + +addEventListener('install', function () { + self.skipWaiting() +}) + +addEventListener('activate', function (event) { + event.waitUntil(self.clients.claim()) +}) + +addEventListener('message', async function (event) { + const clientId = Reflect.get(event.source || {}, 'id') + + if (!clientId || !self.clients) { + return + } + + const client = await self.clients.get(clientId) + + if (!client) { + return + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + switch (event.data) { + case 'KEEPALIVE_REQUEST': { + sendToClient(client, { + type: 'KEEPALIVE_RESPONSE', + }) + break + } + + case 'INTEGRITY_CHECK_REQUEST': { + sendToClient(client, { + type: 'INTEGRITY_CHECK_RESPONSE', + payload: { + packageVersion: PACKAGE_VERSION, + checksum: INTEGRITY_CHECKSUM, + }, + }) + break + } + + case 'MOCK_ACTIVATE': { + activeClientIds.add(clientId) + + sendToClient(client, { + type: 'MOCKING_ENABLED', + payload: { + client: { + id: client.id, + frameType: client.frameType, + }, + }, + }) + break + } + + case 'CLIENT_CLOSED': { + activeClientIds.delete(clientId) + + const remainingClients = allClients.filter((client) => { + return client.id !== clientId + }) + + // Unregister itself when there are no more clients + if (remainingClients.length === 0) { + self.registration.unregister() + } + + break + } + } +}) + +addEventListener('fetch', function (event) { + const requestInterceptedAt = Date.now() + + // Bypass navigation requests. + if (event.request.mode === 'navigate') { + return + } + + // Opening the DevTools triggers the "only-if-cached" request + // that cannot be handled by the worker. Bypass such requests. + if ( + event.request.cache === 'only-if-cached' && + event.request.mode !== 'same-origin' + ) { + return + } + + // Bypass all requests when there are no active clients. + // Prevents the self-unregistered worked from handling requests + // after it's been terminated (still remains active until the next reload). + if (activeClientIds.size === 0) { + return + } + + const requestId = crypto.randomUUID() + event.respondWith(handleRequest(event, requestId, requestInterceptedAt)) +}) + +/** + * @param {FetchEvent} event + * @param {string} requestId + * @param {number} requestInterceptedAt + */ +async function handleRequest(event, requestId, requestInterceptedAt) { + const client = await resolveMainClient(event) + const requestCloneForEvents = event.request.clone() + const response = await getResponse( + event, + client, + requestId, + requestInterceptedAt, + ) + + // Send back the response clone for the "response:*" life-cycle events. + // Ensure MSW is active and ready to handle the message, otherwise + // this message will pend indefinitely. + if (client && activeClientIds.has(client.id)) { + const serializedRequest = await serializeRequest(requestCloneForEvents) + + // Clone the response so both the client and the library could consume it. + const responseClone = response.clone() + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + isMockedResponse: IS_MOCKED_RESPONSE in response, + request: { + id: requestId, + ...serializedRequest, + }, + response: { + type: responseClone.type, + status: responseClone.status, + statusText: responseClone.statusText, + headers: Object.fromEntries(responseClone.headers.entries()), + body: responseClone.body, + }, + }, + }, + responseClone.body ? [serializedRequest.body, responseClone.body] : [], + ) + } + + return response +} + +/** + * Resolve the main client for the given event. + * Client that issues a request doesn't necessarily equal the client + * that registered the worker. It's with the latter the worker should + * communicate with during the response resolving phase. + * @param {FetchEvent} event + * @returns {Promise} + */ +async function resolveMainClient(event) { + const client = await self.clients.get(event.clientId) + + if (activeClientIds.has(event.clientId)) { + return client + } + + if (client?.frameType === 'top-level') { + return client + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + return allClients + .filter((client) => { + // Get only those clients that are currently visible. + return client.visibilityState === 'visible' + }) + .find((client) => { + // Find the client ID that's recorded in the + // set of clients that have registered the worker. + return activeClientIds.has(client.id) + }) +} + +/** + * @param {FetchEvent} event + * @param {Client | undefined} client + * @param {string} requestId + * @param {number} requestInterceptedAt + * @returns {Promise} + */ +async function getResponse(event, client, requestId, requestInterceptedAt) { + // Clone the request because it might've been already used + // (i.e. its body has been read and sent to the client). + const requestClone = event.request.clone() + + function passthrough() { + // Cast the request headers to a new Headers instance + // so the headers can be manipulated with. + const headers = new Headers(requestClone.headers) + + // Remove the "accept" header value that marked this request as passthrough. + // This prevents request alteration and also keeps it compliant with the + // user-defined CORS policies. + const acceptHeader = headers.get('accept') + if (acceptHeader) { + const values = acceptHeader.split(',').map((value) => value.trim()) + const filteredValues = values.filter( + (value) => value !== 'msw/passthrough', + ) + + if (filteredValues.length > 0) { + headers.set('accept', filteredValues.join(', ')) + } else { + headers.delete('accept') + } + } + + return fetch(requestClone, { headers }) + } + + // Bypass mocking when the client is not active. + if (!client) { + return passthrough() + } + + // Bypass initial page load requests (i.e. static assets). + // The absence of the immediate/parent client in the map of the active clients + // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet + // and is not ready to handle requests. + if (!activeClientIds.has(client.id)) { + return passthrough() + } + + // Notify the client that a request has been intercepted. + const serializedRequest = await serializeRequest(event.request) + const clientMessage = await sendToClient( + client, + { + type: 'REQUEST', + payload: { + id: requestId, + interceptedAt: requestInterceptedAt, + ...serializedRequest, + }, + }, + [serializedRequest.body], + ) + + switch (clientMessage.type) { + case 'MOCK_RESPONSE': { + return respondWithMock(clientMessage.data) + } + + case 'PASSTHROUGH': { + return passthrough() + } + } + + return passthrough() +} + +/** + * @param {Client} client + * @param {any} message + * @param {Array} transferrables + * @returns {Promise} + */ +function sendToClient(client, message, transferrables = []) { + return new Promise((resolve, reject) => { + const channel = new MessageChannel() + + channel.port1.onmessage = (event) => { + if (event.data && event.data.error) { + return reject(event.data.error) + } + + resolve(event.data) + } + + client.postMessage(message, [ + channel.port2, + ...transferrables.filter(Boolean), + ]) + }) +} + +/** + * @param {Response} response + * @returns {Response} + */ +function respondWithMock(response) { + // Setting response status code to 0 is a no-op. + // However, when responding with a "Response.error()", the produced Response + // instance will have status code set to 0. Since it's not possible to create + // a Response instance with status code 0, handle that use-case separately. + if (response.status === 0) { + return Response.error() + } + + const mockedResponse = new Response(response.body, response) + + Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { + value: true, + enumerable: true, + }) + + return mockedResponse +} + +/** + * @param {Request} request + */ +async function serializeRequest(request) { + return { + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: await request.arrayBuffer(), + keepalive: request.keepalive, + } +} diff --git a/src/mocks/browser.js b/src/mocks/browser.js new file mode 100644 index 0000000..753bc36 --- /dev/null +++ b/src/mocks/browser.js @@ -0,0 +1,8 @@ +/** + * MSW worker for browser (Cypress E2E). + * @module mocks/browser + */ +import { setupWorker } from "msw/browser"; +import { handlers } from "./handlers/index.js"; + +export const worker = setupWorker(...handlers); diff --git a/src/mocks/fixtures/compare.json b/src/mocks/fixtures/compare.json new file mode 100644 index 0000000..7a4592f --- /dev/null +++ b/src/mocks/fixtures/compare.json @@ -0,0 +1,92 @@ +{ + "time": { + "avg_cycle_time": { + "primary": [ + { "date": "2022-01-15", "value": 500000 }, + { "date": "2022-06-15", "value": 600000 }, + { "date": "2022-12-15", "value": 550000 } + ], + "secondary": [ + { "date": "2022-01-15", "value": 480000 }, + { "date": "2022-06-15", "value": 520000 }, + { "date": "2022-12-15", "value": 510000 } + ] + }, + "avg_cycle_efficiency": { + "primary": [ + { "label": "File A", "value": 0.75 } + ], + "secondary": [ + { "label": "File B", "value": 0.68 } + ] + }, + "avg_process_time": { + "primary": [ + { "date": "2022-01-15", "value": 300000 }, + { "date": "2022-06-15", "value": 350000 }, + { "date": "2022-12-15", "value": 320000 } + ], + "secondary": [ + { "date": "2022-01-15", "value": 280000 }, + { "date": "2022-06-15", "value": 310000 }, + { "date": "2022-12-15", "value": 290000 } + ] + }, + "avg_process_time_by_task": { + "primary": [ + { "label": ["Activity", "A"], "value": 120000 }, + { "label": ["Activity", "B"], "value": 80000 } + ], + "secondary": [ + { "label": ["Activity", "A"], "value": 110000 }, + { "label": ["Activity", "B"], "value": 95000 } + ] + }, + "avg_waiting_time": { + "primary": [ + { "date": "2022-01-15", "value": 200000 }, + { "date": "2022-06-15", "value": 250000 }, + { "date": "2022-12-15", "value": 230000 } + ], + "secondary": [ + { "date": "2022-01-15", "value": 200000 }, + { "date": "2022-06-15", "value": 210000 }, + { "date": "2022-12-15", "value": 220000 } + ] + }, + "avg_waiting_time_by_edge": { + "primary": [ + { "label": ["A", "B"], "value": 150000 }, + { "label": ["B", "C"], "value": 100000 } + ], + "secondary": [ + { "label": ["A", "B"], "value": 140000 }, + { "label": ["B", "C"], "value": 110000 } + ] + } + }, + "freq": { + "cases": { + "primary": [ + { "count": 100 }, + { "count": 120 }, + { "count": 110 } + ], + "secondary": [ + { "count": 95 }, + { "count": 105 }, + { "count": 100 } + ] + }, + "cases_by_task": { + "primary": [ + { "label": ["Activity", "A"], "value": 200 }, + { "label": ["Activity", "B"], "value": 150 } + ], + "secondary": [ + { "label": ["Activity", "A"], "value": 180 }, + { "label": ["Activity", "B"], "value": 160 } + ] + } + } +} diff --git a/src/mocks/fixtures/discover.json b/src/mocks/fixtures/discover.json new file mode 100644 index 0000000..ead8249 --- /dev/null +++ b/src/mocks/fixtures/discover.json @@ -0,0 +1,2113 @@ +{ + "process_map": { + "vertices": [ + { + "id": 1, + "type": "event", + "event_type": "start" + }, + { + "id": 2, + "type": "activity", + "activity_type": "task", + "label": "a", + "freq": { + "total": 187, + "rel_freq": 0.10048361096184846, + "average": 0.7420634920634921, + "median": 1.0, + "max": 4, + "min": 0, + "cases": 184 + }, + "duration": { + "total": 24524580.0, + "rel_duration": 0.09710585158598249, + "average": 131147.486631, + "median": 129480.0, + "max": 259080.0, + "min": 480.0 + } + }, + { + "id": 3, + "type": "activity", + "activity_type": "task", + "label": "b", + "freq": { + "total": 34, + "rel_freq": 0.018269747447608814, + "average": 0.1349206349206349, + "median": 0.0, + "max": 3, + "min": 0, + "cases": 32 + }, + "duration": { + "total": 4645320.0, + "rel_duration": 0.018393291729742006, + "average": 136627.058824, + "median": 144840.0, + "max": 252660.0, + "min": 3300.0 + } + }, + { + "id": 4, + "type": "activity", + "activity_type": "task", + "label": "c", + "freq": { + "total": 48, + "rel_freq": 0.025792584631918324, + "average": 0.19047619047619047, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 48 + }, + "duration": { + "total": 6396540.0, + "rel_duration": 0.0253273028081949, + "average": 133261.25, + "median": 147270.0, + "max": 255360.0, + "min": 5700.0 + } + }, + { + "id": 5, + "type": "activity", + "activity_type": "task", + "label": "d", + "freq": { + "total": 241, + "rel_freq": 0.12950026867275657, + "average": 0.9563492063492064, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 241 + }, + "duration": { + "total": 31980000.0, + "rel_duration": 0.12662582330542338, + "average": 132697.095436, + "median": 133860.0, + "max": 259080.0, + "min": 420.0 + } + }, + { + "id": 6, + "type": "activity", + "activity_type": "task", + "label": "f", + "freq": { + "total": 249, + "rel_freq": 0.1337990327780763, + "average": 0.9880952380952381, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 249 + }, + "duration": { + "total": 31666620.0, + "rel_duration": 0.1253849852657907, + "average": 127175.180723, + "median": 122040.0, + "max": 258360.0, + "min": 1380.0 + } + }, + { + "id": 7, + "type": "activity", + "activity_type": "task", + "label": "g", + "freq": { + "total": 253, + "rel_freq": 0.13594841483073616, + "average": 1.003968253968254, + "median": 1.0, + "max": 4, + "min": 0, + "cases": 250 + }, + "duration": { + "total": 32289840.0, + "rel_duration": 0.12785264460288906, + "average": 127627.826087, + "median": 121620.0, + "max": 256980.0, + "min": 720.0 + } + }, + { + "id": 8, + "type": "activity", + "activity_type": "task", + "label": "i", + "freq": { + "total": 185, + "rel_freq": 0.09940891993551854, + "average": 0.7341269841269841, + "median": 1.0, + "max": 6, + "min": 0, + "cases": 175 + }, + "duration": { + "total": 23233920.0, + "rel_duration": 0.09199544242064861, + "average": 125588.756757, + "median": 123480.0, + "max": 258540.0, + "min": 1020.0 + } + }, + { + "id": 9, + "type": "activity", + "activity_type": "task", + "label": "h", + "freq": { + "total": 163, + "rel_freq": 0.08758731864588931, + "average": 0.6468253968253969, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 163 + }, + "duration": { + "total": 20890680.0, + "rel_duration": 0.082717309393688, + "average": 128163.680982, + "median": 125280.0, + "max": 258660.0, + "min": 3480.0 + } + }, + { + "id": 10, + "type": "activity", + "activity_type": "task", + "label": "k", + "freq": { + "total": 48, + "rel_freq": 0.025792584631918324, + "average": 0.19047619047619047, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 48 + }, + "duration": { + "total": 6842100.0, + "rel_duration": 0.027091511746029934, + "average": 142543.75, + "median": 149160.0, + "max": 254400.0, + "min": 9540.0 + } + }, + { + "id": 11, + "type": "activity", + "activity_type": "task", + "label": "e", + "freq": { + "total": 249, + "rel_freq": 0.1337990327780763, + "average": 0.9880952380952381, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 249 + }, + "duration": { + "total": 30986280.0, + "rel_duration": 0.12269115747881096, + "average": 124442.891566, + "median": 118740.0, + "max": 258660.0, + "min": 720.0 + } + }, + { + "id": 12, + "type": "activity", + "activity_type": "task", + "label": "j", + "freq": { + "total": 22, + "rel_freq": 0.011821601289629231, + "average": 0.0873015873015873, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 22 + }, + "duration": { + "total": 2228400.0, + "rel_duration": 0.008823420408186537, + "average": 101290.909091, + "median": 72420.0, + "max": 241860.0, + "min": 13980.0 + } + }, + { + "id": 13, + "type": "activity", + "activity_type": "task", + "label": "l", + "freq": { + "total": 182, + "rel_freq": 0.09779688339602365, + "average": 0.7222222222222222, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 182 + }, + "duration": { + "total": 25128900.0, + "rel_duration": 0.09949867577422307, + "average": 138070.879121, + "median": 139770.0, + "max": 258360.0, + "min": 2460.0 + } + }, + { + "id": 14, + "type": "event", + "event_type": "end" + } + ], + "edges": [ + { + "head": 2, + "tail": 1, + "freq": { + "total": 175, + "rel_freq": 0.10876320696084525, + "average": 0.6944444444444444, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 175 + }, + "duration": null + }, + { + "head": 3, + "tail": 1, + "freq": { + "total": 32, + "rel_freq": 0.019888129272840272, + "average": 0.12698412698412698, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 32 + }, + "duration": null + }, + { + "head": 4, + "tail": 1, + "freq": { + "total": 45, + "rel_freq": 0.027967681789931635, + "average": 0.17857142857142858, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 45 + }, + "duration": null + }, + { + "head": 2, + "tail": 2, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 6420.0, + "rel_duration": 2.542019342153903e-05, + "average": 6420.0, + "median": 6420.0, + "max": 6420.0, + "min": 6420.0 + } + }, + { + "head": 5, + "tail": 2, + "freq": { + "total": 170, + "rel_freq": 0.10565568676196395, + "average": 0.6746031746031746, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 170 + }, + "duration": { + "total": 1276080.0, + "rel_duration": 0.00505267919335787, + "average": 7506.352941, + "median": 7440.0, + "max": 14340.0, + "min": 300.0 + } + }, + { + "head": 6, + "tail": 2, + "freq": { + "total": 5, + "rel_freq": 0.003107520198881293, + "average": 0.01984126984126984, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 5 + }, + "duration": { + "total": 29700.0, + "rel_duration": 0.00011759809106226, + "average": 5940.0, + "median": 4920.0, + "max": 10500.0, + "min": 1380.0 + } + }, + { + "head": 7, + "tail": 2, + "freq": { + "total": 8, + "rel_freq": 0.004972032318210068, + "average": 0.031746031746031744, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 8 + }, + "duration": { + "total": 41400.0, + "rel_duration": 0.00016392461178375636, + "average": 5175.0, + "median": 4230.0, + "max": 14340.0, + "min": 720.0 + } + }, + { + "head": 8, + "tail": 2, + "freq": { + "total": 3, + "rel_freq": 0.0018645121193287756, + "average": 0.011904761904761904, + "median": 0.0, + "max": 3, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 18780.0, + "rel_duration": 7.436000505553005e-05, + "average": 6260.0, + "median": 5700.0, + "max": 7620.0, + "min": 5460.0 + } + }, + { + "head": 2, + "tail": 3, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 6840.0, + "rel_duration": 2.708319672949018e-05, + "average": 6840.0, + "median": 6840.0, + "max": 6840.0, + "min": 6840.0 + } + }, + { + "head": 3, + "tail": 3, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 3540.0, + "rel_duration": 1.4016742167016848e-05, + "average": 3540.0, + "median": 3540.0, + "max": 3540.0, + "min": 3540.0 + } + }, + { + "head": 7, + "tail": 3, + "freq": { + "total": 22, + "rel_freq": 0.013673088875077687, + "average": 0.0873015873015873, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 22 + }, + "duration": { + "total": 160020.0, + "rel_duration": 0.0006336042603293886, + "average": 7273.636364, + "median": 7320.0, + "max": 14160.0, + "min": 240.0 + } + }, + { + "head": 8, + "tail": 3, + "freq": { + "total": 10, + "rel_freq": 0.006215040397762586, + "average": 0.03968253968253968, + "median": 0.0, + "max": 2, + "min": 0, + "cases": 9 + }, + "duration": { + "total": 62880.0, + "rel_duration": 0.00024897535239040095, + "average": 6288.0, + "median": 4350.0, + "max": 13560.0, + "min": 1380.0 + } + }, + { + "head": 7, + "tail": 4, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 11460.0, + "rel_duration": 4.5376233116952846e-05, + "average": 11460.0, + "median": 11460.0, + "max": 11460.0, + "min": 11460.0 + } + }, + { + "head": 9, + "tail": 4, + "freq": { + "total": 46, + "rel_freq": 0.028589185829707892, + "average": 0.18253968253968253, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 46 + }, + "duration": { + "total": 313800.0, + "rel_duration": 0.001242501042940646, + "average": 6821.73913, + "median": 6870.0, + "max": 14340.0, + "min": 300.0 + } + }, + { + "head": 10, + "tail": 4, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 13500.0, + "rel_duration": 5.3453677755572725e-05, + "average": 13500.0, + "median": 13500.0, + "max": 13500.0, + "min": 13500.0 + } + }, + { + "head": 4, + "tail": 5, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 11760.0, + "rel_duration": 4.656409262263224e-05, + "average": 11760.0, + "median": 11760.0, + "max": 11760.0, + "min": 11760.0 + } + }, + { + "head": 7, + "tail": 5, + "freq": { + "total": 3, + "rel_freq": 0.0018645121193287756, + "average": 0.011904761904761904, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 3 + }, + "duration": { + "total": 24240.0, + "rel_duration": 9.597904805889502e-05, + "average": 8080.0, + "median": 8280.0, + "max": 11160.0, + "min": 4800.0 + } + }, + { + "head": 8, + "tail": 5, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 3600.0, + "rel_duration": 1.4254314068152727e-05, + "average": 3600.0, + "median": 3600.0, + "max": 3600.0, + "min": 3600.0 + } + }, + { + "head": 11, + "tail": 5, + "freq": { + "total": 236, + "rel_freq": 0.14667495338719702, + "average": 0.9365079365079365, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 236 + }, + "duration": { + "total": 1691340.0, + "rel_duration": 0.0066969143211192865, + "average": 7166.694915, + "median": 7620.0, + "max": 14280.0, + "min": 240.0 + } + }, + { + "head": 5, + "tail": 6, + "freq": { + "total": 2, + "rel_freq": 0.001243008079552517, + "average": 0.007936507936507936, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 2 + }, + "duration": { + "total": 20280.0, + "rel_duration": 8.029930258392703e-05, + "average": 10140.0, + "median": 10140.0, + "max": 12060.0, + "min": 8220.0 + } + }, + { + "head": 7, + "tail": 6, + "freq": { + "total": 214, + "rel_freq": 0.13300186451211932, + "average": 0.8492063492063492, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 214 + }, + "duration": { + "total": 1494420.0, + "rel_duration": 0.005917203341591333, + "average": 6983.271028, + "median": 6870.0, + "max": 14400.0, + "min": 120.0 + } + }, + { + "head": 11, + "tail": 6, + "freq": { + "total": 3, + "rel_freq": 0.0018645121193287756, + "average": 0.011904761904761904, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 3 + }, + "duration": { + "total": 11820.0, + "rel_duration": 4.680166452376812e-05, + "average": 3940.0, + "median": 3780.0, + "max": 7860.0, + "min": 180.0 + } + }, + { + "head": 12, + "tail": 6, + "freq": { + "total": 22, + "rel_freq": 0.013673088875077687, + "average": 0.0873015873015873, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 22 + }, + "duration": { + "total": 179760.0, + "rel_duration": 0.0007117654158030929, + "average": 8170.909091, + "median": 8310.0, + "max": 14040.0, + "min": 120.0 + } + }, + { + "head": 13, + "tail": 6, + "freq": { + "total": 8, + "rel_freq": 0.004972032318210068, + "average": 0.031746031746031744, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 8 + }, + "duration": { + "total": 53340.0, + "rel_duration": 0.00021120142010979623, + "average": 6667.5, + "median": 7290.0, + "max": 11700.0, + "min": 2040.0 + } + }, + { + "head": 4, + "tail": 7, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 2400.0, + "rel_duration": 9.502876045435152e-06, + "average": 2400.0, + "median": 2400.0, + "max": 2400.0, + "min": 2400.0 + } + }, + { + "head": 6, + "tail": 7, + "freq": { + "total": 8, + "rel_freq": 0.004972032318210068, + "average": 0.031746031746031744, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 8 + }, + "duration": { + "total": 42420.0, + "rel_duration": 0.0001679633341030663, + "average": 5302.5, + "median": 4620.0, + "max": 12120.0, + "min": 1800.0 + } + }, + { + "head": 7, + "tail": 7, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 11400.0, + "rel_duration": 4.513866121581697e-05, + "average": 11400.0, + "median": 11400.0, + "max": 11400.0, + "min": 11400.0 + } + }, + { + "head": 8, + "tail": 7, + "freq": { + "total": 4, + "rel_freq": 0.002486016159105034, + "average": 0.015873015873015872, + "median": 0.0, + "max": 3, + "min": 0, + "cases": 2 + }, + "duration": { + "total": 28560.0, + "rel_duration": 0.0001130842249406783, + "average": 7140.0, + "median": 5970.0, + "max": 11880.0, + "min": 4740.0 + } + }, + { + "head": 9, + "tail": 7, + "freq": { + "total": 117, + "rel_freq": 0.07271597265382225, + "average": 0.4642857142857143, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 117 + }, + "duration": { + "total": 888360.0, + "rel_duration": 0.0035174895682178213, + "average": 7592.820513, + "median": 7440.0, + "max": 14340.0, + "min": 540.0 + } + }, + { + "head": 10, + "tail": 7, + "freq": { + "total": 45, + "rel_freq": 0.027967681789931635, + "average": 0.17857142857142858, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 45 + }, + "duration": { + "total": 365220.0, + "rel_duration": 0.001446100162214094, + "average": 8116.0, + "median": 7980.0, + "max": 13980.0, + "min": 1320.0 + } + }, + { + "head": 11, + "tail": 7, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 11880.0, + "rel_duration": 4.7039236424903995e-05, + "average": 11880.0, + "median": 11880.0, + "max": 11880.0, + "min": 11880.0 + } + }, + { + "head": 13, + "tail": 7, + "freq": { + "total": 76, + "rel_freq": 0.04723430702299565, + "average": 0.30158730158730157, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 76 + }, + "duration": { + "total": 566760.0, + "rel_duration": 0.002244104178129511, + "average": 7457.368421, + "median": 7560.0, + "max": 14400.0, + "min": 360.0 + } + }, + { + "head": 2, + "tail": 8, + "freq": { + "total": 2, + "rel_freq": 0.001243008079552517, + "average": 0.007936507936507936, + "median": 0.0, + "max": 2, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 17820.0, + "rel_duration": 7.0558854637356e-05, + "average": 8910.0, + "median": 8910.0, + "max": 11760.0, + "min": 6060.0 + } + }, + { + "head": 3, + "tail": 8, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 5880.0, + "rel_duration": 2.328204631131612e-05, + "average": 5880.0, + "median": 5880.0, + "max": 5880.0, + "min": 5880.0 + } + }, + { + "head": 4, + "tail": 8, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 5460.0, + "rel_duration": 2.161904300336497e-05, + "average": 5460.0, + "median": 5460.0, + "max": 5460.0, + "min": 5460.0 + } + }, + { + "head": 5, + "tail": 8, + "freq": { + "total": 67, + "rel_freq": 0.041640770665009326, + "average": 0.26587301587301587, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 67 + }, + "duration": { + "total": 516600.0, + "rel_duration": 0.0020454940687799164, + "average": 7710.447761, + "median": 7680.0, + "max": 14280.0, + "min": 240.0 + } + }, + { + "head": 7, + "tail": 8, + "freq": { + "total": 3, + "rel_freq": 0.0018645121193287756, + "average": 0.011904761904761904, + "median": 0.0, + "max": 2, + "min": 0, + "cases": 2 + }, + "duration": { + "total": 25920.0, + "rel_duration": 0.00010263106129069963, + "average": 8640.0, + "median": 6360.0, + "max": 13920.0, + "min": 5640.0 + } + }, + { + "head": 8, + "tail": 8, + "freq": { + "total": 5, + "rel_freq": 0.003107520198881293, + "average": 0.01984126984126984, + "median": 0.0, + "max": 3, + "min": 0, + "cases": 3 + }, + "duration": { + "total": 31620.0, + "rel_duration": 0.0001252003918986081, + "average": 6324.0, + "median": 6900.0, + "max": 9900.0, + "min": 660.0 + } + }, + { + "head": 10, + "tail": 8, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 3240.0, + "rel_duration": 1.2828882661337454e-05, + "average": 3240.0, + "median": 3240.0, + "max": 3240.0, + "min": 3240.0 + } + }, + { + "head": 11, + "tail": 8, + "freq": { + "total": 9, + "rel_freq": 0.005593536357986327, + "average": 0.03571428571428571, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 9 + }, + "duration": { + "total": 82380.0, + "rel_duration": 0.0003261862202595616, + "average": 9153.333333, + "median": 9720.0, + "max": 13920.0, + "min": 3060.0 + } + }, + { + "head": 13, + "tail": 8, + "freq": { + "total": 96, + "rel_freq": 0.05966438781852082, + "average": 0.38095238095238093, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 96 + }, + "duration": { + "total": 690120.0, + "rel_duration": 0.0027325520068648777, + "average": 7188.75, + "median": 7350.0, + "max": 14220.0, + "min": 120.0 + } + }, + { + "head": 8, + "tail": 9, + "freq": { + "total": 162, + "rel_freq": 0.10068365444375388, + "average": 0.6428571428571429, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 162 + }, + "duration": { + "total": 1180800.0, + "rel_duration": 0.004675415014354094, + "average": 7288.888889, + "median": 7470.0, + "max": 14280.0, + "min": 240.0 + } + }, + { + "head": 13, + "tail": 9, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 6960.0, + "rel_duration": 2.7558340531761937e-05, + "average": 6960.0, + "median": 6960.0, + "max": 6960.0, + "min": 6960.0 + } + }, + { + "head": 14, + "tail": 10, + "freq": { + "total": 48, + "rel_freq": 0.02983219390926041, + "average": 0.19047619047619047, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 48 + }, + "duration": null + }, + { + "head": 2, + "tail": 11, + "freq": { + "total": 8, + "rel_freq": 0.004972032318210068, + "average": 0.031746031746031744, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 8 + }, + "duration": { + "total": 58080.0, + "rel_duration": 0.00022996960029953066, + "average": 7260.0, + "median": 5550.0, + "max": 14220.0, + "min": 2340.0 + } + }, + { + "head": 5, + "tail": 11, + "freq": { + "total": 2, + "rel_freq": 0.001243008079552517, + "average": 0.007936507936507936, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 2 + }, + "duration": { + "total": 13560.0, + "rel_duration": 5.36912496567086e-05, + "average": 6780.0, + "median": 6780.0, + "max": 8220.0, + "min": 5340.0 + } + }, + { + "head": 6, + "tail": 11, + "freq": { + "total": 236, + "rel_freq": 0.14667495338719702, + "average": 0.9365079365079365, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 236 + }, + "duration": { + "total": 1720080.0, + "rel_duration": 0.006810711261763373, + "average": 7288.474576, + "median": 7230.0, + "max": 14340.0, + "min": 120.0 + } + }, + { + "head": 7, + "tail": 11, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 14040.0, + "rel_duration": 5.559182486579563e-05, + "average": 14040.0, + "median": 14040.0, + "max": 14040.0, + "min": 14040.0 + } + }, + { + "head": 10, + "tail": 11, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 13620.0, + "rel_duration": 5.392882155784448e-05, + "average": 13620.0, + "median": 13620.0, + "max": 13620.0, + "min": 13620.0 + } + }, + { + "head": 13, + "tail": 11, + "freq": { + "total": 1, + "rel_freq": 0.0006215040397762585, + "average": 0.003968253968253968, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 1 + }, + "duration": { + "total": 3780.0, + "rel_duration": 1.4967029771560362e-05, + "average": 3780.0, + "median": 3780.0, + "max": 3780.0, + "min": 3780.0 + } + }, + { + "head": 14, + "tail": 12, + "freq": { + "total": 22, + "rel_freq": 0.013673088875077687, + "average": 0.0873015873015873, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 22 + }, + "duration": null + }, + { + "head": 14, + "tail": 13, + "freq": { + "total": 182, + "rel_freq": 0.11311373523927906, + "average": 0.7222222222222222, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 182 + }, + "duration": null + } + ] + }, + "bpmn": { + "vertices": [ + { + "id": 1, + "type": "event", + "event_type": "start" + }, + { + "id": 2, + "type": "gateway", + "gateway_type": "exclusive" + }, + { + "id": 3, + "type": "activity", + "activity_type": "task", + "label": "a", + "freq": { + "total": 187, + "rel_freq": 0.10048361096184846, + "average": 0.7420634920634921, + "median": 1.0, + "max": 4, + "min": 0, + "cases": 184 + }, + "duration": { + "total": 24524580.0, + "rel_duration": 0.09710585158598249, + "average": 131147.486631, + "median": 129480.0, + "max": 259080.0, + "min": 480.0 + } + }, + { + "id": 4, + "type": "activity", + "activity_type": "task", + "label": "b", + "freq": { + "total": 34, + "rel_freq": 0.018269747447608814, + "average": 0.1349206349206349, + "median": 0.0, + "max": 3, + "min": 0, + "cases": 32 + }, + "duration": { + "total": 4645320.0, + "rel_duration": 0.018393291729742006, + "average": 136627.058824, + "median": 144840.0, + "max": 252660.0, + "min": 3300.0 + } + }, + { + "id": 5, + "type": "activity", + "activity_type": "task", + "label": "c", + "freq": { + "total": 48, + "rel_freq": 0.025792584631918324, + "average": 0.19047619047619047, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 48 + }, + "duration": { + "total": 6396540.0, + "rel_duration": 0.0253273028081949, + "average": 133261.25, + "median": 147270.0, + "max": 255360.0, + "min": 5700.0 + } + }, + { + "id": 6, + "type": "activity", + "activity_type": "task", + "label": "d", + "freq": { + "total": 241, + "rel_freq": 0.12950026867275657, + "average": 0.9563492063492064, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 241 + }, + "duration": { + "total": 31980000.0, + "rel_duration": 0.12662582330542338, + "average": 132697.095436, + "median": 133860.0, + "max": 259080.0, + "min": 420.0 + } + }, + { + "id": 7, + "type": "gateway", + "gateway_type": "exclusive" + }, + { + "id": 8, + "type": "gateway", + "gateway_type": "exclusive" + }, + { + "id": 9, + "type": "activity", + "activity_type": "task", + "label": "e", + "freq": { + "total": 249, + "rel_freq": 0.1337990327780763, + "average": 0.9880952380952381, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 249 + }, + "duration": { + "total": 30986280.0, + "rel_duration": 0.12269115747881096, + "average": 124442.891566, + "median": 118740.0, + "max": 258660.0, + "min": 720.0 + } + }, + { + "id": 10, + "type": "activity", + "activity_type": "task", + "label": "g", + "freq": { + "total": 253, + "rel_freq": 0.13594841483073616, + "average": 1.003968253968254, + "median": 1.0, + "max": 4, + "min": 0, + "cases": 250 + }, + "duration": { + "total": 32289840.0, + "rel_duration": 0.12785264460288906, + "average": 127627.826087, + "median": 121620.0, + "max": 256980.0, + "min": 720.0 + } + }, + { + "id": 11, + "type": "activity", + "activity_type": "task", + "label": "h", + "freq": { + "total": 163, + "rel_freq": 0.08758731864588931, + "average": 0.6468253968253969, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 163 + }, + "duration": { + "total": 20890680.0, + "rel_duration": 0.082717309393688, + "average": 128163.680982, + "median": 125280.0, + "max": 258660.0, + "min": 3480.0 + } + }, + { + "id": 12, + "type": "activity", + "activity_type": "task", + "label": "f", + "freq": { + "total": 249, + "rel_freq": 0.1337990327780763, + "average": 0.9880952380952381, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 249 + }, + "duration": { + "total": 31666620.0, + "rel_duration": 0.1253849852657907, + "average": 127175.180723, + "median": 122040.0, + "max": 258360.0, + "min": 1380.0 + } + }, + { + "id": 13, + "type": "gateway", + "gateway_type": "exclusive" + }, + { + "id": 14, + "type": "activity", + "activity_type": "task", + "label": "i", + "freq": { + "total": 185, + "rel_freq": 0.09940891993551854, + "average": 0.7341269841269841, + "median": 1.0, + "max": 6, + "min": 0, + "cases": 175 + }, + "duration": { + "total": 23233920.0, + "rel_duration": 0.09199544242064861, + "average": 125588.756757, + "median": 123480.0, + "max": 258540.0, + "min": 1020.0 + } + }, + { + "id": 15, + "type": "gateway", + "gateway_type": "exclusive" + }, + { + "id": 16, + "type": "activity", + "activity_type": "task", + "label": "k", + "freq": { + "total": 48, + "rel_freq": 0.025792584631918324, + "average": 0.19047619047619047, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 48 + }, + "duration": { + "total": 6842100.0, + "rel_duration": 0.027091511746029934, + "average": 142543.75, + "median": 149160.0, + "max": 254400.0, + "min": 9540.0 + } + }, + { + "id": 17, + "type": "activity", + "activity_type": "task", + "label": "l", + "freq": { + "total": 182, + "rel_freq": 0.09779688339602365, + "average": 0.7222222222222222, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 182 + }, + "duration": { + "total": 25128900.0, + "rel_duration": 0.09949867577422307, + "average": 138070.879121, + "median": 139770.0, + "max": 258360.0, + "min": 2460.0 + } + }, + { + "id": 18, + "type": "activity", + "activity_type": "task", + "label": "j", + "freq": { + "total": 22, + "rel_freq": 0.011821601289629231, + "average": 0.0873015873015873, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 22 + }, + "duration": { + "total": 2228400.0, + "rel_duration": 0.008823420408186537, + "average": 101290.909091, + "median": 72420.0, + "max": 241860.0, + "min": 13980.0 + } + }, + { + "id": 19, + "type": "event", + "event_type": "end" + } + ], + "edges": [ + { + "head": 2, + "tail": 1, + "freq": { + "total": 252, + "rel_freq": 0.15661901802361716, + "average": 1.0, + "median": 1.0, + "max": 1, + "min": 1, + "cases": 252 + }, + "duration": null + }, + { + "head": 3, + "tail": 2, + "freq": { + "total": 175, + "rel_freq": 0.10876320696084525, + "average": 0.6944444444444444, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 175 + }, + "duration": null + }, + { + "head": 4, + "tail": 2, + "freq": { + "total": 32, + "rel_freq": 0.019888129272840272, + "average": 0.12698412698412698, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 32 + }, + "duration": null + }, + { + "head": 5, + "tail": 2, + "freq": { + "total": 45, + "rel_freq": 0.027967681789931635, + "average": 0.17857142857142858, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 45 + }, + "duration": null + }, + { + "head": 6, + "tail": 3, + "freq": { + "total": 170, + "rel_freq": 0.10565568676196395, + "average": 0.6746031746031746, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 170 + }, + "duration": { + "total": 1276080.0, + "rel_duration": 0.00505267919335787, + "average": 7506.352941, + "median": 7440.0, + "max": 14340.0, + "min": 300.0 + } + }, + { + "head": 7, + "tail": 4, + "freq": { + "total": 22, + "rel_freq": 0.013673088875077687, + "average": 0.0873015873015873, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 22 + }, + "duration": null + }, + { + "head": 8, + "tail": 5, + "freq": { + "total": 46, + "rel_freq": 0.028589185829707892, + "average": 0.18253968253968253, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 46 + }, + "duration": null + }, + { + "head": 9, + "tail": 6, + "freq": { + "total": 236, + "rel_freq": 0.14667495338719702, + "average": 0.9365079365079365, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 236 + }, + "duration": { + "total": 1691340.0, + "rel_duration": 0.0066969143211192865, + "average": 7166.694915, + "median": 7620.0, + "max": 14280.0, + "min": 240.0 + } + }, + { + "head": 10, + "tail": 7, + "freq": { + "total": 236, + "rel_freq": 0.14667495338719702, + "average": 0.9365079365079365, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 236 + }, + "duration": null + }, + { + "head": 11, + "tail": 8, + "freq": { + "total": 163, + "rel_freq": 0.10130515848353014, + "average": 0.6468253968253969, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 163 + }, + "duration": null + }, + { + "head": 12, + "tail": 9, + "freq": { + "total": 236, + "rel_freq": 0.14667495338719702, + "average": 0.9365079365079365, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 236 + }, + "duration": { + "total": 1720080.0, + "rel_duration": 0.006810711261763373, + "average": 7288.474576, + "median": 7230.0, + "max": 14340.0, + "min": 120.0 + } + }, + { + "head": 13, + "tail": 10, + "freq": { + "total": 162, + "rel_freq": 0.10068365444375388, + "average": 0.6428571428571429, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 162 + }, + "duration": null + }, + { + "head": 14, + "tail": 11, + "freq": { + "total": 162, + "rel_freq": 0.10068365444375388, + "average": 0.6428571428571429, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 162 + }, + "duration": { + "total": 1180800.0, + "rel_duration": 0.004675415014354094, + "average": 7288.888889, + "median": 7470.0, + "max": 14280.0, + "min": 240.0 + } + }, + { + "head": 15, + "tail": 12, + "freq": { + "total": 236, + "rel_freq": 0.14667495338719702, + "average": 0.9365079365079365, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 236 + }, + "duration": null + }, + { + "head": 8, + "tail": 13, + "freq": { + "total": 117, + "rel_freq": 0.07271597265382225, + "average": 0.4642857142857143, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 117 + }, + "duration": null + }, + { + "head": 16, + "tail": 13, + "freq": { + "total": 45, + "rel_freq": 0.027967681789931635, + "average": 0.17857142857142858, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 45 + }, + "duration": null + }, + { + "head": 17, + "tail": 14, + "freq": { + "total": 96, + "rel_freq": 0.05966438781852082, + "average": 0.38095238095238093, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 96 + }, + "duration": { + "total": 690120.0, + "rel_duration": 0.0027325520068648777, + "average": 7188.75, + "median": 7350.0, + "max": 14220.0, + "min": 120.0 + } + }, + { + "head": 7, + "tail": 15, + "freq": { + "total": 214, + "rel_freq": 0.13300186451211932, + "average": 0.8492063492063492, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 214 + }, + "duration": null + }, + { + "head": 18, + "tail": 15, + "freq": { + "total": 22, + "rel_freq": 0.013673088875077687, + "average": 0.0873015873015873, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 22 + }, + "duration": null + }, + { + "head": 19, + "tail": 16, + "freq": { + "total": 48, + "rel_freq": 0.02983219390926041, + "average": 0.19047619047619047, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 48 + }, + "duration": null + }, + { + "head": 19, + "tail": 17, + "freq": { + "total": 182, + "rel_freq": 0.11311373523927906, + "average": 0.7222222222222222, + "median": 1.0, + "max": 1, + "min": 0, + "cases": 182 + }, + "duration": null + }, + { + "head": 19, + "tail": 18, + "freq": { + "total": 22, + "rel_freq": 0.013673088875077687, + "average": 0.0873015873015873, + "median": 0.0, + "max": 1, + "min": 0, + "cases": 22 + }, + "duration": null + } + ] + }, + "stats": { + "cases": { + "count": 252, + "total": 252, + "ratio": 1.0 + }, + "traces": { + "count": 12, + "total": 12, + "ratio": 1.0 + }, + "task_instances": { + "count": 1861, + "total": 1861, + "ratio": 1.0 + }, + "tasks": { + "count": 12, + "total": 12, + "ratio": 1.0 + }, + "started_at": "2022-01-03T00:56:00", + "completed_at": "2022-12-31T01:32:00", + "case_duration": { + "min": 363840.0, + "max": 2233740.0, + "average": 1002202.8571428572, + "median": 994350.0 + } + }, + "insights": { + "most_freq_tasks": [ + "i" + ], + "most_freq_in": [ + "i" + ], + "most_freq_out": [ + "i" + ], + "most_time_tasks": [ + "g" + ], + "most_time_edges": [ + [ + "e", + "f" + ] + ], + "self_loops": [ + "b", + "i", + "a", + "g" + ], + "short_loops": [ + [ + "b", + "i" + ], + [ + "a", + "i" + ], + [ + "g", + "i" + ] + ], + "shortest_traces": [ + [ + "a", + "f", + "d", + "g", + "l" + ] + ], + "longest_traces": [ + [ + "a", + "f", + "e", + "d", + "c", + "g", + "g", + "i", + "g", + "i", + "g", + "i", + "i", + "l" + ] + ], + "most_freq_traces": [ + [ + "a", + "d", + "e", + "f", + "g", + "h", + "i", + "l" + ] + ] + } +} diff --git a/src/mocks/fixtures/files.json b/src/mocks/fixtures/files.json new file mode 100644 index 0000000..c27c8d2 --- /dev/null +++ b/src/mocks/fixtures/files.json @@ -0,0 +1,42 @@ +[ + { + "type": "log", + "id": 1, + "name": "sample-process.xes", + "parent": null, + "owner": { "username": "testadmin", "name": "Test Admin" }, + "updated_at": "2025-06-10T14:30:00Z", + "accessed_at": "2025-06-12T09:00:00Z", + "is_deleted": false + }, + { + "type": "filter", + "id": 10, + "name": "filtered-sample", + "parent": { "type": "log", "id": 1, "name": "sample-process.xes" }, + "owner": { "username": "testadmin", "name": "Test Admin" }, + "updated_at": "2025-06-11T08:00:00Z", + "accessed_at": "2025-06-12T10:00:00Z", + "is_deleted": false + }, + { + "type": "log", + "id": 2, + "name": "production-log.csv", + "parent": null, + "owner": { "username": "user1", "name": "Alice Wang" }, + "updated_at": "2025-06-09T16:00:00Z", + "accessed_at": null, + "is_deleted": false + }, + { + "type": "log-check", + "id": 100, + "name": "conformance-check-1", + "parent": { "type": "log", "id": 1, "name": "sample-process.xes" }, + "owner": { "username": "testadmin", "name": "Test Admin" }, + "updated_at": "2025-06-11T12:00:00Z", + "accessed_at": null, + "is_deleted": false + } +] diff --git a/src/mocks/fixtures/filter-params.json b/src/mocks/fixtures/filter-params.json new file mode 100644 index 0000000..e544244 --- /dev/null +++ b/src/mocks/fixtures/filter-params.json @@ -0,0 +1,249 @@ +{ + "tasks": [ + { + "label": "a", + "occurrences": 187, + "occurrence_ratio": 0.10048361096184846, + "cases": 184, + "case_ratio": 0.7301587301587301 + }, + { + "label": "d", + "occurrences": 241, + "occurrence_ratio": 0.12950026867275657, + "cases": 241, + "case_ratio": 0.9563492063492064 + }, + { + "label": "e", + "occurrences": 249, + "occurrence_ratio": 0.1337990327780763, + "cases": 249, + "case_ratio": 0.9880952380952381 + }, + { + "label": "f", + "occurrences": 249, + "occurrence_ratio": 0.1337990327780763, + "cases": 249, + "case_ratio": 0.9880952380952381 + }, + { + "label": "g", + "occurrences": 253, + "occurrence_ratio": 0.13594841483073616, + "cases": 250, + "case_ratio": 0.9920634920634921 + }, + { + "label": "h", + "occurrences": 163, + "occurrence_ratio": 0.08758731864588931, + "cases": 163, + "case_ratio": 0.6468253968253969 + }, + { + "label": "i", + "occurrences": 185, + "occurrence_ratio": 0.09940891993551854, + "cases": 175, + "case_ratio": 0.6944444444444444 + }, + { + "label": "l", + "occurrences": 182, + "occurrence_ratio": 0.09779688339602365, + "cases": 182, + "case_ratio": 0.7222222222222222 + }, + { + "label": "c", + "occurrences": 48, + "occurrence_ratio": 0.025792584631918324, + "cases": 48, + "case_ratio": 0.19047619047619047 + }, + { + "label": "k", + "occurrences": 48, + "occurrence_ratio": 0.025792584631918324, + "cases": 48, + "case_ratio": 0.19047619047619047 + }, + { + "label": "b", + "occurrences": 34, + "occurrence_ratio": 0.018269747447608814, + "cases": 32, + "case_ratio": 0.12698412698412698 + }, + { + "label": "j", + "occurrences": 22, + "occurrence_ratio": 0.011821601289629231, + "cases": 22, + "case_ratio": 0.0873015873015873 + } + ], + "sources": [ + { + "label": "a", + "occurrences": 175, + "occurrence_ratio": 0.6944444444444444, + "sinks": [ + "k", + "l" + ] + }, + { + "label": "c", + "occurrences": 45, + "occurrence_ratio": 0.17857142857142858, + "sinks": [ + "k" + ] + }, + { + "label": "b", + "occurrences": 32, + "occurrence_ratio": 0.12698412698412698, + "sinks": [ + "k", + "j", + "l" + ] + } + ], + "sinks": [ + { + "label": "l", + "occurrences": 182, + "occurrence_ratio": 0.7222222222222222, + "sources": [ + "a", + "b" + ] + }, + { + "label": "k", + "occurrences": 48, + "occurrence_ratio": 0.19047619047619047, + "sources": [ + "a", + "b", + "c" + ] + }, + { + "label": "j", + "occurrences": 22, + "occurrence_ratio": 0.0873015873015873, + "sources": [ + "b" + ] + } + ], + "timeframe": { + "data": [ + { + "x": "2022-01-21T03:21:48", + "y": 347 + }, + { + "x": "2022-02-26T08:13:24", + "y": 426 + }, + { + "x": "2022-04-03T13:05:00", + "y": 394 + }, + { + "x": "2022-05-09T17:56:36", + "y": 375 + }, + { + "x": "2022-06-14T22:48:12", + "y": 431 + }, + { + "x": "2022-07-21T03:39:48", + "y": 393 + }, + { + "x": "2022-08-26T08:31:24", + "y": 284 + }, + { + "x": "2022-10-01T13:23:00", + "y": 359 + }, + { + "x": "2022-11-06T18:14:36", + "y": 386 + }, + { + "x": "2022-12-12T23:06:12", + "y": 327 + } + ], + "x_axis": { + "min": "2022-01-03T00:56:00", + "max": "2022-12-31T01:32:00" + }, + "y_axis": { + "min": 0, + "max": 431 + } + }, + "traces": [ + { + "id": 1, + "count": 95 + }, + { + "id": 2, + "count": 74 + }, + { + "id": 3, + "count": 45 + }, + { + "id": 4, + "count": 22 + }, + { + "id": 5, + "count": 8 + }, + { + "id": 6, + "count": 2 + }, + { + "id": 7, + "count": 1 + }, + { + "id": 8, + "count": 1 + }, + { + "id": 9, + "count": 1 + }, + { + "id": 10, + "count": 1 + }, + { + "id": 11, + "count": 1 + }, + { + "id": 12, + "count": 1 + } + ], + "attrs": [] +} diff --git a/src/mocks/fixtures/my-account.json b/src/mocks/fixtures/my-account.json new file mode 100644 index 0000000..0a6119c --- /dev/null +++ b/src/mocks/fixtures/my-account.json @@ -0,0 +1,9 @@ +{ + "username": "testadmin", + "name": "Test Admin", + "is_sso": false, + "created_at": "2025-01-15T10:00:00Z", + "roles": [ + { "code": "admin", "name": "Administrator" } + ] +} diff --git a/src/mocks/fixtures/performance.json b/src/mocks/fixtures/performance.json new file mode 100644 index 0000000..5c3eba2 --- /dev/null +++ b/src/mocks/fixtures/performance.json @@ -0,0 +1,928 @@ +{ + "time": { + "avg_cycle_time": { + "data": [ + { + "x": "2022-01-21T03:21:48", + "y": 980220.0 + }, + { + "x": "2022-02-26T08:13:24", + "y": 1000376.129032 + }, + { + "x": "2022-04-03T13:05:00", + "y": 911990.0 + }, + { + "x": "2022-05-09T17:56:36", + "y": 1041860.0 + }, + { + "x": "2022-06-14T22:48:12", + "y": 985415.625 + }, + { + "x": "2022-07-21T03:39:48", + "y": 938079.130435 + }, + { + "x": "2022-08-26T08:31:24", + "y": 1074680.0 + }, + { + "x": "2022-10-01T13:23:00", + "y": 1061848.695652 + }, + { + "x": "2022-11-06T18:14:36", + "y": 970119.230769 + }, + { + "x": "2022-12-12T23:06:12", + "y": 1060703.076923 + } + ], + "x_axis": { + "min": "2022-01-03T00:56:00", + "max": "2022-12-31T01:32:00" + }, + "y_axis": { + "min": 0.0, + "max": 1074680.0 + } + }, + "avg_cycle_efficiency": { + "data": [ + { + "x": "2022-01-21T03:21:48", + "y": 0.9527980523449506 + }, + { + "x": "2022-02-26T08:13:24", + "y": 0.9516493513262202 + }, + { + "x": "2022-04-03T13:05:00", + "y": 0.9475330648076836 + }, + { + "x": "2022-05-09T17:56:36", + "y": 0.9537265449333607 + }, + { + "x": "2022-06-14T22:48:12", + "y": 0.9528919667258132 + }, + { + "x": "2022-07-21T03:39:48", + "y": 0.9489804015433904 + }, + { + "x": "2022-08-26T08:31:24", + "y": 0.9538748758272698 + }, + { + "x": "2022-10-01T13:23:00", + "y": 0.9548679615433759 + }, + { + "x": "2022-11-06T18:14:36", + "y": 0.9469965631092006 + }, + { + "x": "2022-12-12T23:06:12", + "y": 0.9505469198562757 + } + ], + "x_axis": { + "min": "2022-01-03T00:56:00", + "max": "2022-12-31T01:32:00" + }, + "y_axis": { + "min": 0.0, + "max": 1.0 + } + }, + "avg_process_time": { + "data": [ + { + "x": "2022-01-21T03:21:48", + "y": 937067.368421 + }, + { + "x": "2022-02-26T08:13:24", + "y": 953767.741935 + }, + { + "x": "2022-04-03T13:05:00", + "y": 865780.0 + }, + { + "x": "2022-05-09T17:56:36", + "y": 994600.0 + }, + { + "x": "2022-06-14T22:48:12", + "y": 939795.0 + }, + { + "x": "2022-07-21T03:39:48", + "y": 890947.826087 + }, + { + "x": "2022-08-26T08:31:24", + "y": 1026345.714286 + }, + { + "x": "2022-10-01T13:23:00", + "y": 1016363.478261 + }, + { + "x": "2022-11-06T18:14:36", + "y": 923626.153846 + }, + { + "x": "2022-12-12T23:06:12", + "y": 1011540.0 + } + ], + "x_axis": { + "min": "2022-01-03T00:56:00", + "max": "2022-12-31T01:32:00" + }, + "y_axis": { + "min": 0.0, + "max": 1026345.714286 + } + }, + "avg_process_time_by_task": { + "data": [ + { + "x": "a", + "y": 131147.486631 + }, + { + "x": "b", + "y": 136627.058824 + }, + { + "x": "c", + "y": 133261.25 + }, + { + "x": "d", + "y": 132697.095436 + }, + { + "x": "e", + "y": 124442.891566 + }, + { + "x": "f", + "y": 127175.180723 + }, + { + "x": "g", + "y": 127627.826087 + }, + { + "x": "h", + "y": 128163.680982 + }, + { + "x": "i", + "y": 125588.756757 + }, + { + "x": "j", + "y": 101290.909091 + }, + { + "x": "k", + "y": 142543.75 + }, + { + "x": "l", + "y": 138070.879121 + } + ], + "x_axis": { + "labels": [ + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l" + ] + }, + "y_axis": { + "min": 0.0, + "max": 142543.75 + } + }, + "avg_waiting_time": { + "data": [ + { + "x": "2022-01-21T03:21:48", + "y": 43152.631579 + }, + { + "x": "2022-02-26T08:13:24", + "y": 46608.387097 + }, + { + "x": "2022-04-03T13:05:00", + "y": 46210.0 + }, + { + "x": "2022-05-09T17:56:36", + "y": 47260.0 + }, + { + "x": "2022-06-14T22:48:12", + "y": 45620.625 + }, + { + "x": "2022-07-21T03:39:48", + "y": 47131.304348 + }, + { + "x": "2022-08-26T08:31:24", + "y": 48334.285714 + }, + { + "x": "2022-10-01T13:23:00", + "y": 45485.217391 + }, + { + "x": "2022-11-06T18:14:36", + "y": 46493.076923 + }, + { + "x": "2022-12-12T23:06:12", + "y": 49163.076923 + } + ], + "x_axis": { + "min": "2022-01-03T00:56:00", + "max": "2022-12-31T01:32:00" + }, + "y_axis": { + "min": 0.0, + "max": 49163.076923 + } + }, + "avg_waiting_time_by_edge": { + "data": [ + { + "x": [ + "a", + "a" + ], + "y": 6420.0 + }, + { + "x": [ + "a", + "d" + ], + "y": 7506.352941 + }, + { + "x": [ + "a", + "f" + ], + "y": 5940.0 + }, + { + "x": [ + "a", + "g" + ], + "y": 5175.0 + }, + { + "x": [ + "a", + "i" + ], + "y": 6260.0 + }, + { + "x": [ + "b", + "a" + ], + "y": 6840.0 + }, + { + "x": [ + "b", + "b" + ], + "y": 3540.0 + }, + { + "x": [ + "b", + "g" + ], + "y": 7273.636364 + }, + { + "x": [ + "b", + "i" + ], + "y": 6288.0 + }, + { + "x": [ + "c", + "g" + ], + "y": 11460.0 + }, + { + "x": [ + "c", + "h" + ], + "y": 6821.73913 + }, + { + "x": [ + "c", + "k" + ], + "y": 13500.0 + }, + { + "x": [ + "d", + "c" + ], + "y": 11760.0 + }, + { + "x": [ + "d", + "e" + ], + "y": 7166.694915 + }, + { + "x": [ + "d", + "g" + ], + "y": 8080.0 + }, + { + "x": [ + "d", + "i" + ], + "y": 3600.0 + }, + { + "x": [ + "e", + "a" + ], + "y": 7260.0 + }, + { + "x": [ + "e", + "d" + ], + "y": 6780.0 + }, + { + "x": [ + "e", + "f" + ], + "y": 7288.474576 + }, + { + "x": [ + "e", + "g" + ], + "y": 14040.0 + }, + { + "x": [ + "e", + "k" + ], + "y": 13620.0 + }, + { + "x": [ + "e", + "l" + ], + "y": 3780.0 + }, + { + "x": [ + "f", + "d" + ], + "y": 10140.0 + }, + { + "x": [ + "f", + "e" + ], + "y": 3940.0 + }, + { + "x": [ + "f", + "g" + ], + "y": 6983.271028 + }, + { + "x": [ + "f", + "j" + ], + "y": 8170.909091 + }, + { + "x": [ + "f", + "l" + ], + "y": 6667.5 + }, + { + "x": [ + "g", + "c" + ], + "y": 2400.0 + }, + { + "x": [ + "g", + "e" + ], + "y": 11880.0 + }, + { + "x": [ + "g", + "f" + ], + "y": 5302.5 + }, + { + "x": [ + "g", + "g" + ], + "y": 11400.0 + }, + { + "x": [ + "g", + "h" + ], + "y": 7592.820513 + }, + { + "x": [ + "g", + "i" + ], + "y": 7140.0 + }, + { + "x": [ + "g", + "k" + ], + "y": 8116.0 + }, + { + "x": [ + "g", + "l" + ], + "y": 7457.368421 + }, + { + "x": [ + "h", + "i" + ], + "y": 7288.888889 + }, + { + "x": [ + "h", + "l" + ], + "y": 6960.0 + }, + { + "x": [ + "i", + "a" + ], + "y": 8910.0 + }, + { + "x": [ + "i", + "b" + ], + "y": 5880.0 + }, + { + "x": [ + "i", + "c" + ], + "y": 5460.0 + }, + { + "x": [ + "i", + "d" + ], + "y": 7710.447761 + }, + { + "x": [ + "i", + "e" + ], + "y": 9153.333333 + }, + { + "x": [ + "i", + "g" + ], + "y": 8640.0 + }, + { + "x": [ + "i", + "i" + ], + "y": 6324.0 + }, + { + "x": [ + "i", + "k" + ], + "y": 3240.0 + }, + { + "x": [ + "i", + "l" + ], + "y": 7188.75 + } + ], + "x_axis": { + "labels": [ + [ + "a", + "a" + ], + [ + "a", + "d" + ], + [ + "a", + "f" + ], + [ + "a", + "g" + ], + [ + "a", + "i" + ], + [ + "b", + "a" + ], + [ + "b", + "b" + ], + [ + "b", + "g" + ], + [ + "b", + "i" + ], + [ + "c", + "g" + ], + [ + "c", + "h" + ], + [ + "c", + "k" + ], + [ + "d", + "c" + ], + [ + "d", + "e" + ], + [ + "d", + "g" + ], + [ + "d", + "i" + ], + [ + "e", + "a" + ], + [ + "e", + "d" + ], + [ + "e", + "f" + ], + [ + "e", + "g" + ], + [ + "e", + "k" + ], + [ + "e", + "l" + ], + [ + "f", + "d" + ], + [ + "f", + "e" + ], + [ + "f", + "g" + ], + [ + "f", + "j" + ], + [ + "f", + "l" + ], + [ + "g", + "c" + ], + [ + "g", + "e" + ], + [ + "g", + "f" + ], + [ + "g", + "g" + ], + [ + "g", + "h" + ], + [ + "g", + "i" + ], + [ + "g", + "k" + ], + [ + "g", + "l" + ], + [ + "h", + "i" + ], + [ + "h", + "l" + ], + [ + "i", + "a" + ], + [ + "i", + "b" + ], + [ + "i", + "c" + ], + [ + "i", + "d" + ], + [ + "i", + "e" + ], + [ + "i", + "g" + ], + [ + "i", + "i" + ], + [ + "i", + "k" + ], + [ + "i", + "l" + ] + ] + }, + "y_axis": { + "min": 0.0, + "max": 14040.0 + } + } + }, + "freq": { + "cases": { + "data": [ + { + "x": "2022-01-21T03:21:48", + "y": 30 + }, + { + "x": "2022-02-26T08:13:24", + "y": 25 + }, + { + "x": "2022-04-03T13:05:00", + "y": 30 + }, + { + "x": "2022-05-09T17:56:36", + "y": 26 + }, + { + "x": "2022-06-14T22:48:12", + "y": 28 + }, + { + "x": "2022-07-21T03:39:48", + "y": 27 + }, + { + "x": "2022-08-26T08:31:24", + "y": 17 + }, + { + "x": "2022-10-01T13:23:00", + "y": 24 + }, + { + "x": "2022-11-06T18:14:36", + "y": 28 + }, + { + "x": "2022-12-12T23:06:12", + "y": 17 + } + ], + "x_axis": { + "min": "2022-01-03T00:56:00", + "max": "2022-12-31T01:32:00" + }, + "y_axis": { + "min": 0, + "max": 30 + } + }, + "cases_by_task": { + "data": [ + { + "x": "a", + "y": 184 + }, + { + "x": "b", + "y": 32 + }, + { + "x": "c", + "y": 48 + }, + { + "x": "d", + "y": 241 + }, + { + "x": "e", + "y": 249 + }, + { + "x": "f", + "y": 249 + }, + { + "x": "g", + "y": 250 + }, + { + "x": "h", + "y": 163 + }, + { + "x": "i", + "y": 175 + }, + { + "x": "j", + "y": 22 + }, + { + "x": "k", + "y": 48 + }, + { + "x": "l", + "y": 182 + } + ], + "x_axis": { + "labels": [ + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l" + ] + }, + "y_axis": { + "min": 0, + "max": 250 + } + } + } +} diff --git a/src/mocks/fixtures/token.json b/src/mocks/fixtures/token.json new file mode 100644 index 0000000..fe6e0c6 --- /dev/null +++ b/src/mocks/fixtures/token.json @@ -0,0 +1,6 @@ +{ + "access_token": "fake-access-token-for-testing", + "token_type": "bearer", + "expires_in": 3600, + "refresh_token": "fake-refresh-token-for-testing" +} diff --git a/src/mocks/fixtures/trace-detail.json b/src/mocks/fixtures/trace-detail.json new file mode 100644 index 0000000..6e929a7 --- /dev/null +++ b/src/mocks/fixtures/trace-detail.json @@ -0,0 +1,154 @@ +{ + "task_seq": [ + "a", + "d", + "e", + "f", + "g", + "h", + "i", + "l" + ], + "cases": [ + { + "id": "H00564053", + "started_at": "2022-01-03T00:56:00", + "completed_at": "2022-01-12T02:29:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00723931", + "started_at": "2022-01-04T17:51:00", + "completed_at": "2022-01-17T10:00:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00542949", + "started_at": "2022-01-10T19:05:00", + "completed_at": "2022-01-28T09:38:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00320575", + "started_at": "2022-01-12T21:35:00", + "completed_at": "2022-01-24T19:38:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00565387", + "started_at": "2022-01-20T20:30:00", + "completed_at": "2022-02-06T10:57:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00832338", + "started_at": "2022-01-29T15:00:00", + "completed_at": "2022-02-13T17:46:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00525137", + "started_at": "2022-02-05T23:26:00", + "completed_at": "2022-02-14T19:47:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00093124", + "started_at": "2022-02-09T16:56:00", + "completed_at": "2022-02-28T17:38:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00657586", + "started_at": "2022-02-14T20:07:00", + "completed_at": "2022-02-28T15:21:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00141668", + "started_at": "2022-02-17T13:57:00", + "completed_at": "2022-03-06T00:01:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00493818", + "started_at": "2022-02-20T19:54:00", + "completed_at": "2022-03-05T05:06:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00488827", + "started_at": "2022-02-21T00:38:00", + "completed_at": "2022-03-03T16:24:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00874806", + "started_at": "2022-02-24T15:15:00", + "completed_at": "2022-03-12T01:12:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00395448", + "started_at": "2022-02-26T03:35:00", + "completed_at": "2022-03-08T23:11:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00414605", + "started_at": "2022-02-26T17:11:00", + "completed_at": "2022-03-10T08:50:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00564269", + "started_at": "2022-03-04T01:18:00", + "completed_at": "2022-03-16T08:14:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00729845", + "started_at": "2022-03-05T09:29:00", + "completed_at": "2022-03-17T15:25:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00194115", + "started_at": "2022-03-09T18:58:00", + "completed_at": "2022-03-23T09:01:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00517238", + "started_at": "2022-03-21T06:30:00", + "completed_at": "2022-04-05T05:27:00", + "attributes": [], + "facets": [] + }, + { + "id": "H00377237", + "started_at": "2022-03-24T12:06:00", + "completed_at": "2022-04-04T15:44:00", + "attributes": [], + "facets": [] + } + ] +} diff --git a/src/mocks/fixtures/traces.json b/src/mocks/fixtures/traces.json new file mode 100644 index 0000000..abfd636 --- /dev/null +++ b/src/mocks/fixtures/traces.json @@ -0,0 +1,50 @@ +[ + { + "id": 1, + "count": 95 + }, + { + "id": 2, + "count": 74 + }, + { + "id": 3, + "count": 45 + }, + { + "id": 4, + "count": 22 + }, + { + "id": 5, + "count": 8 + }, + { + "id": 6, + "count": 2 + }, + { + "id": 7, + "count": 1 + }, + { + "id": 8, + "count": 1 + }, + { + "id": 9, + "count": 1 + }, + { + "id": 10, + "count": 1 + }, + { + "id": 11, + "count": 1 + }, + { + "id": 12, + "count": 1 + } +] diff --git a/src/mocks/fixtures/user-detail.json b/src/mocks/fixtures/user-detail.json new file mode 100644 index 0000000..296f3fb --- /dev/null +++ b/src/mocks/fixtures/user-detail.json @@ -0,0 +1,14 @@ +{ + "username": "testadmin", + "name": "Test Admin", + "is_admin": true, + "is_active": true, + "is_sso": false, + "has_data": true, + "roles": [ + { "code": "admin", "name": "Administrator" } + ], + "detail": { + "visits": 42 + } +} diff --git a/src/mocks/fixtures/users.json b/src/mocks/fixtures/users.json new file mode 100644 index 0000000..4552cc8 --- /dev/null +++ b/src/mocks/fixtures/users.json @@ -0,0 +1,26 @@ +[ + { + "username": "testadmin", + "name": "Test Admin", + "is_admin": true, + "is_active": true, + "is_sso": false, + "has_data": true + }, + { + "username": "user1", + "name": "Alice Wang", + "is_admin": false, + "is_active": true, + "is_sso": false, + "has_data": true + }, + { + "username": "user2", + "name": "Bob Chen", + "is_admin": false, + "is_active": false, + "is_sso": true, + "has_data": false + } +] diff --git a/src/mocks/handlers/account.js b/src/mocks/handlers/account.js new file mode 100644 index 0000000..b1eda48 --- /dev/null +++ b/src/mocks/handlers/account.js @@ -0,0 +1,20 @@ +/** + * MSW handlers for current user account endpoints. + * @module mocks/handlers/account + */ +import { http, HttpResponse } from "msw"; +import myAccountData from "../fixtures/my-account.json"; +import { captureRequest } from "../request-log.js"; + +export const accountHandlers = [ + http.get("/api/my-account", ({ request }) => { + captureRequest("GET", "/api/my-account"); + return HttpResponse.json(myAccountData); + }), + + http.put("/api/my-account", async ({ request }) => { + const body = await request.json(); + captureRequest("PUT", "/api/my-account", body); + return HttpResponse.json({ success: true }); + }), +]; diff --git a/src/mocks/handlers/auth.js b/src/mocks/handlers/auth.js new file mode 100644 index 0000000..9ab56a5 --- /dev/null +++ b/src/mocks/handlers/auth.js @@ -0,0 +1,15 @@ +/** + * MSW handlers for authentication endpoints. + * @module mocks/handlers/auth + */ +import { http, HttpResponse } from "msw"; +import tokenData from "../fixtures/token.json"; +import { captureRequest } from "../request-log.js"; + +export const authHandlers = [ + http.post("/api/oauth/token", async ({ request }) => { + const body = await request.text(); + captureRequest("POST", "/api/oauth/token", body); + return HttpResponse.json(tokenData); + }), +]; diff --git a/src/mocks/handlers/compare.js b/src/mocks/handlers/compare.js new file mode 100644 index 0000000..1200a3e --- /dev/null +++ b/src/mocks/handlers/compare.js @@ -0,0 +1,14 @@ +/** + * MSW handlers for comparison dashboard endpoints. + * @module mocks/handlers/compare + */ +import { http, HttpResponse } from "msw"; +import compareData from "../fixtures/compare.json"; +import { captureRequest } from "../request-log.js"; + +export const compareHandlers = [ + http.get("/api/compare", ({ request }) => { + captureRequest("GET", "/api/compare"); + return HttpResponse.json(compareData); + }), +]; diff --git a/src/mocks/handlers/conformance.js b/src/mocks/handlers/conformance.js new file mode 100644 index 0000000..2c9ffa5 --- /dev/null +++ b/src/mocks/handlers/conformance.js @@ -0,0 +1,19 @@ +/** + * MSW handlers for conformance check parameter endpoints. + * @module mocks/handlers/conformance + */ +import { http, HttpResponse } from "msw"; +import filterParamsData from "../fixtures/filter-params.json"; +import { captureRequest } from "../request-log.js"; + +export const conformanceHandlers = [ + http.get("/api/log-checks/params*", ({ request }) => { + captureRequest("GET", new URL(request.url).pathname); + return HttpResponse.json(filterParamsData); + }), + + http.get("/api/filter-checks/params*", ({ request }) => { + captureRequest("GET", new URL(request.url).pathname); + return HttpResponse.json(filterParamsData); + }), +]; diff --git a/src/mocks/handlers/discover.js b/src/mocks/handlers/discover.js new file mode 100644 index 0000000..38f161f --- /dev/null +++ b/src/mocks/handlers/discover.js @@ -0,0 +1,24 @@ +/** + * MSW handlers for process discovery (map) endpoints. + * @module mocks/handlers/discover + */ +import { http, HttpResponse } from "msw"; +import discoverData from "../fixtures/discover.json"; +import { captureRequest } from "../request-log.js"; + +export const discoverHandlers = [ + http.get("/api/logs/:id/discover", ({ params }) => { + captureRequest("GET", `/api/logs/${params.id}/discover`); + return HttpResponse.json(discoverData); + }), + + http.get("/api/filters/:id/discover", ({ params }) => { + captureRequest("GET", `/api/filters/${params.id}/discover`); + return HttpResponse.json(discoverData); + }), + + http.get("/api/temp-filters/:id/discover", ({ params }) => { + captureRequest("GET", `/api/temp-filters/${params.id}/discover`); + return HttpResponse.json(discoverData); + }), +]; diff --git a/src/mocks/handlers/files.js b/src/mocks/handlers/files.js new file mode 100644 index 0000000..7127c67 --- /dev/null +++ b/src/mocks/handlers/files.js @@ -0,0 +1,14 @@ +/** + * MSW handlers for file management endpoints. + * @module mocks/handlers/files + */ +import { http, HttpResponse } from "msw"; +import filesData from "../fixtures/files.json"; +import { captureRequest } from "../request-log.js"; + +export const filesHandlers = [ + http.get("/api/files", ({ request }) => { + captureRequest("GET", "/api/files"); + return HttpResponse.json(filesData); + }), +]; diff --git a/src/mocks/handlers/index.js b/src/mocks/handlers/index.js new file mode 100644 index 0000000..71eccd7 --- /dev/null +++ b/src/mocks/handlers/index.js @@ -0,0 +1,27 @@ +/** + * Combined MSW request handlers for all API endpoints. + * @module mocks/handlers + */ +import { authHandlers } from "./auth.js"; +import { accountHandlers } from "./account.js"; +import { usersHandlers } from "./users.js"; +import { filesHandlers } from "./files.js"; +import { discoverHandlers } from "./discover.js"; +import { performanceHandlers } from "./performance.js"; +import { tracesHandlers } from "./traces.js"; +import { conformanceHandlers } from "./conformance.js"; +import { compareHandlers } from "./compare.js"; +import { operationsHandlers } from "./operations.js"; + +export const handlers = [ + ...authHandlers, + ...accountHandlers, + ...usersHandlers, + ...filesHandlers, + ...discoverHandlers, + ...performanceHandlers, + ...tracesHandlers, + ...conformanceHandlers, + ...compareHandlers, + ...operationsHandlers, +]; diff --git a/src/mocks/handlers/operations.js b/src/mocks/handlers/operations.js new file mode 100644 index 0000000..76511d9 --- /dev/null +++ b/src/mocks/handlers/operations.js @@ -0,0 +1,70 @@ +/** + * MSW handlers for filter detail, filter params, dependents, + * rename, and deletion endpoints. + * @module mocks/handlers/operations + */ +import { http, HttpResponse } from "msw"; +import { captureRequest } from "../request-log.js"; + +export const operationsHandlers = [ + // Filter detail + http.get("/api/filters/:id", ({ params }) => { + captureRequest("GET", `/api/filters/${params.id}`); + return HttpResponse.json({ + rules: [], + log: { id: 1 }, + name: "filtered-sample", + }); + }), + + // Filter params and has-result + http.get("/api/filters/params*", ({ request }) => { + captureRequest("GET", new URL(request.url).pathname); + return HttpResponse.json({}); + }), + + http.get("/api/filters/has-result*", ({ request }) => { + captureRequest("GET", new URL(request.url).pathname); + return HttpResponse.json(false); + }), + + // Dependents + http.get("/api/logs/:id/dependents", ({ params }) => { + captureRequest("GET", `/api/logs/${params.id}/dependents`); + return HttpResponse.json([]); + }), + + http.get("/api/filters/:id/dependents", ({ params }) => { + captureRequest("GET", `/api/filters/${params.id}/dependents`); + return HttpResponse.json([]); + }), + + http.get("/api/log-checks/:id/dependents", ({ params }) => { + captureRequest("GET", `/api/log-checks/${params.id}/dependents`); + return HttpResponse.json([]); + }), + + http.get("/api/filter-checks/:id/dependents", ({ params }) => { + captureRequest("GET", `/api/filter-checks/${params.id}/dependents`); + return HttpResponse.json([]); + }), + + // Rename + http.put("/api/logs/:id/rename", async ({ request, params }) => { + const body = await request.json(); + captureRequest("PUT", `/api/logs/${params.id}/rename`, body); + return HttpResponse.json({ success: true }); + }), + + http.put("/api/filters/:id/rename", async ({ request, params }) => { + const body = await request.json(); + captureRequest("PUT", `/api/filters/${params.id}/rename`, body); + return HttpResponse.json({ success: true }); + }), + + // Deletion + http.delete("/api/deletion/:id", ({ params }) => { + captureRequest("DELETE", `/api/deletion/${params.id}`); + return HttpResponse.json({ success: true }); + }), +]; diff --git a/src/mocks/handlers/performance.js b/src/mocks/handlers/performance.js new file mode 100644 index 0000000..cb2175a --- /dev/null +++ b/src/mocks/handlers/performance.js @@ -0,0 +1,19 @@ +/** + * MSW handlers for performance metrics endpoints. + * @module mocks/handlers/performance + */ +import { http, HttpResponse } from "msw"; +import performanceData from "../fixtures/performance.json"; +import { captureRequest } from "../request-log.js"; + +export const performanceHandlers = [ + http.get("/api/logs/:id/performance", ({ params }) => { + captureRequest("GET", `/api/logs/${params.id}/performance`); + return HttpResponse.json(performanceData); + }), + + http.get("/api/filters/:id/performance", ({ params }) => { + captureRequest("GET", `/api/filters/${params.id}/performance`); + return HttpResponse.json(performanceData); + }), +]; diff --git a/src/mocks/handlers/traces.js b/src/mocks/handlers/traces.js new file mode 100644 index 0000000..342f221 --- /dev/null +++ b/src/mocks/handlers/traces.js @@ -0,0 +1,35 @@ +/** + * MSW handlers for trace list and detail endpoints. + * @module mocks/handlers/traces + */ +import { http, HttpResponse } from "msw"; +import tracesData from "../fixtures/traces.json"; +import traceDetailData from "../fixtures/trace-detail.json"; +import { captureRequest } from "../request-log.js"; + +export const tracesHandlers = [ + http.get("/api/logs/:logId/traces/:traceId", ({ params }) => { + captureRequest("GET", `/api/logs/${params.logId}/traces/${params.traceId}`); + return HttpResponse.json(traceDetailData); + }), + + http.get("/api/filters/:filterId/traces/:traceId", ({ params }) => { + captureRequest("GET", `/api/filters/${params.filterId}/traces/${params.traceId}`); + return HttpResponse.json(traceDetailData); + }), + + http.get("/api/logs/:id/traces", ({ params }) => { + captureRequest("GET", `/api/logs/${params.id}/traces`); + return HttpResponse.json(tracesData); + }), + + http.get("/api/filters/:id/traces", ({ params }) => { + captureRequest("GET", `/api/filters/${params.id}/traces`); + return HttpResponse.json(tracesData); + }), + + http.get("/api/temp-filters/:id/traces", ({ params }) => { + captureRequest("GET", `/api/temp-filters/${params.id}/traces`); + return HttpResponse.json(tracesData); + }), +]; diff --git a/src/mocks/handlers/users.js b/src/mocks/handlers/users.js new file mode 100644 index 0000000..ffb92f3 --- /dev/null +++ b/src/mocks/handlers/users.js @@ -0,0 +1,49 @@ +/** + * MSW handlers for user management (account admin) endpoints. + * @module mocks/handlers/users + */ +import { http, HttpResponse } from "msw"; +import usersData from "../fixtures/users.json"; +import userDetailData from "../fixtures/user-detail.json"; +import { captureRequest } from "../request-log.js"; + +export const usersHandlers = [ + http.get("/api/users", ({ request }) => { + captureRequest("GET", "/api/users"); + return HttpResponse.json(usersData); + }), + + http.post("/api/users", async ({ request }) => { + const body = await request.json(); + captureRequest("POST", "/api/users", body); + return HttpResponse.json({ success: true }); + }), + + // User roles (must be before /api/users/:username to match first) + http.put("/api/users/:username/roles/:role", async ({ request, params }) => { + captureRequest("PUT", `/api/users/${params.username}/roles/${params.role}`); + return HttpResponse.json({ success: true }); + }), + + http.delete("/api/users/:username/roles/:role", ({ request, params }) => { + captureRequest("DELETE", `/api/users/${params.username}/roles/${params.role}`); + return HttpResponse.json({ success: true }); + }), + + // User CRUD (after roles so roles match first) + http.get("/api/users/:username", ({ request, params }) => { + captureRequest("GET", `/api/users/${params.username}`); + return HttpResponse.json(userDetailData); + }), + + http.put("/api/users/:username", async ({ request, params }) => { + const body = await request.json(); + captureRequest("PUT", `/api/users/${params.username}`, body); + return HttpResponse.json({ success: true }); + }), + + http.delete("/api/users/:username", ({ request, params }) => { + captureRequest("DELETE", `/api/users/${params.username}`); + return HttpResponse.json({ success: true }); + }), +]; diff --git a/src/mocks/node.js b/src/mocks/node.js new file mode 100644 index 0000000..e37da35 --- /dev/null +++ b/src/mocks/node.js @@ -0,0 +1,8 @@ +/** + * MSW server for Node.js (Vitest). + * @module mocks/node + */ +import { setupServer } from "msw/node"; +import { handlers } from "./handlers/index.js"; + +export const server = setupServer(...handlers); diff --git a/src/mocks/request-log.js b/src/mocks/request-log.js new file mode 100644 index 0000000..19b5b47 --- /dev/null +++ b/src/mocks/request-log.js @@ -0,0 +1,48 @@ +/** + * Request logging utility for MSW handlers. + * Captures request details for test assertions, + * replacing vi.fn() call verification. + * @module mocks/request-log + */ + +/** @type {Array<{method: string, url: string, body: any}>} */ +let log = []; + +/** + * Records a request in the log. Called from MSW handlers. + * @param {string} method - HTTP method. + * @param {string} url - Request URL path. + * @param {any} [body] - Parsed request body. + */ +export function captureRequest(method, url, body = undefined) { + log.push({ method, url, body }); +} + +/** + * Returns a copy of all logged requests. + * @returns {Array<{method: string, url: string, body: any}>} + */ +export function getRequests() { + return [...log]; +} + +/** + * Clears the request log. Call in afterEach. + */ +export function clearRequests() { + log = []; +} + +/** + * Finds logged requests matching the given method and URL pattern. + * @param {string} method - HTTP method to match. + * @param {string|RegExp} urlPattern - URL string or regex to match. + * @returns {Array<{method: string, url: string, body: any}>} + */ +export function findRequest(method, urlPattern) { + return log.filter((r) => { + if (r.method !== method) return false; + if (typeof urlPattern === "string") return r.url === urlPattern; + return urlPattern.test(r.url); + }); +} diff --git a/tests/setup-msw.js b/tests/setup-msw.js new file mode 100644 index 0000000..809cc6e --- /dev/null +++ b/tests/setup-msw.js @@ -0,0 +1,15 @@ +/** + * Vitest global setup for MSW. + * Starts the MSW server before all tests, resets handlers + * and request log after each test, closes after all tests. + */ +import { beforeAll, afterEach, afterAll } from "vitest"; +import { server } from "@/mocks/node.js"; +import { clearRequests } from "@/mocks/request-log.js"; + +beforeAll(() => server.listen({ onUnhandledRequest: "warn" })); +afterEach(() => { + server.resetHandlers(); + clearRequests(); +}); +afterAll(() => server.close()); diff --git a/vite.config.js b/vite.config.js index 3d6da28..5849c84 100644 --- a/vite.config.js +++ b/vite.config.js @@ -89,6 +89,7 @@ export default defineConfig(({ mode }) => { test: { globals: true, environment: "jsdom", + setupFiles: ["./tests/setup-msw.js"], // reporter: ['text', 'json', 'html', 'vue'], }, };