Backported `/tests` from `macros-2.0`. (#4842) * Backported `/tests` from `macros-2.0`. * Added `eslint-plugin-playwright` * Improve formatting --------- Co-authored-by: user <user@exmaple.com> Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>

1c1f25b5c6aa8041175df8b77fdfc6e27416b4c8

DeclineThyself <235079501+DeclineThyself@users.noreply.github.com>

Signed
12 files changed, +150 -586Showing whitespace changes
package-lock.json+31 -1
@@ -134,7 +134,8 @@
134 "@types/yauzl": "^2.10.3",134 "@types/yauzl": "^2.10.3",
135 "eslint": "^8.57.1",135 "eslint": "^8.57.1",
136 "eslint-plugin-jest": "^27.9.0",136 "eslint-plugin-jest": "^27.9.0",
137 "eslint-plugin-jsdoc": "^48.10.0"137 "eslint-plugin-jsdoc": "^48.10.0",
138 "eslint-plugin-playwright": "^2.3.0"
138 },139 },
139 "engines": {140 "engines": {
140 "node": ">= 18"141 "node": ">= 18"
@@ -4559,6 +4560,35 @@
4559 "dev": true,4560 "dev": true,
4560 "license": "MIT"4561 "license": "MIT"
4561 },4562 },
4563 "node_modules/eslint-plugin-playwright": {
4564 "version": "2.3.0",
4565 "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.3.0.tgz",
4566 "integrity": "sha512-7UeUuIb5SZrNkrUGb2F+iwHM97kn33/huajcVtAaQFCSMUYGNFvjzRPil5C0OIppslPfuOV68M/zsisXx+/ZvQ==",
4567 "dev": true,
4568 "license": "MIT",
4569 "dependencies": {
4570 "globals": "^16.4.0"
4571 },
4572 "engines": {
4573 "node": ">=16.9.0"
4574 },
4575 "peerDependencies": {
4576 "eslint": ">=8.40.0"
4577 }
4578 },
4579 "node_modules/eslint-plugin-playwright/node_modules/globals": {
4580 "version": "16.5.0",
4581 "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
4582 "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
4583 "dev": true,
4584 "license": "MIT",
4585 "engines": {
4586 "node": ">=18"
4587 },
4588 "funding": {
4589 "url": "https://github.com/sponsors/sindresorhus"
4590 }
4591 },
4562 "node_modules/eslint-scope": {4592 "node_modules/eslint-scope": {
4563 "version": "7.2.2",4593 "version": "7.2.2",
4564 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",4594 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
package.json+2 -1
@@ -165,6 +165,7 @@
165 "@types/yauzl": "^2.10.3",165 "@types/yauzl": "^2.10.3",
166 "eslint": "^8.57.1",166 "eslint": "^8.57.1",
167 "eslint-plugin-jest": "^27.9.0",167 "eslint-plugin-jest": "^27.9.0",
168 "eslint-plugin-jsdoc": "^48.10.0"168 "eslint-plugin-jsdoc": "^48.10.0",
169 "eslint-plugin-playwright": "^2.3.0"
169 }170 }
170}171}
tests/.eslintrc.cjs+9 -2
@@ -2,10 +2,12 @@ module.exports = {
2 root: true,2 root: true,
3 plugins: [3 plugins: [
4 'jest',4 'jest',
5 'playwright',
5 ],6 ],
6 extends: [7 extends: [
7 'eslint:recommended',8 'eslint:recommended',
8 'plugin:jest/recommended',9 'plugin:jest/recommended',
10 'plugin:playwright/recommended',
9 ],11 ],
10 env: {12 env: {
11 es6: true,13 es6: true,
@@ -19,9 +21,10 @@ module.exports = {
19 overrides: [21 overrides: [
20 ],22 ],
21 ignorePatterns: [23 ignorePatterns: [
24 '*.min.js',
25 'node_modules/**/*',
22 ],26 ],
23 globals: {27 globals: {
24 page: 'readonly',
25 },28 },
26 rules: {29 rules: {
27 'no-unused-vars': ['error', { args: 'none' }],30 'no-unused-vars': ['error', { args: 'none' }],
@@ -38,10 +41,14 @@ module.exports = {
38 'space-infix-ops': 'error',41 'space-infix-ops': 'error',
39 'no-unused-expressions': ['error', { allowShortCircuit: true, allowTernary: true }],42 'no-unused-expressions': ['error', { allowShortCircuit: true, allowTernary: true }],
40 'no-cond-assign': 'error',43 'no-cond-assign': 'error',
44
45 // These rules should eventually be enabled.
46 'no-async-promise-executor': 'off',
47 'no-inner-declarations': 'off',
41 },48 },
42 settings: {49 settings: {
43 jest: {50 jest: {
44 version: '29.7.0',51 version: 29,
45 },52 },
46 },53 },
47};54};
tests/frontend/frontent-test-utils.js+22 -0
@@ -0,0 +1,22 @@
1export const testSetup = {
2 /**
3 * Navigates to the home page without waiting for SillyTavern to load.
4 * @param {Object} params
5 * @param {import('@playwright/test').Page} params.page
6 */
7 goST: async ({ page }) => {
8 await page.goto('/');
9 },
10
11 /**
12 * Waits for SillyTavern to fully load by navigating to the home page and waiting for the preloader to disappear.
13 * @param {Object} params
14 * @param {import('@playwright/test').Page} params.page
15 */
16 awaitST: async ({ page }) => {
17 await page.goto('/');
18 await page.click('#userList .userSelect:last-child');
19 await page.waitForURL('http://127.0.0.1:8000');
20 await page.waitForFunction('document.getElementById("preloader") === null', { timeout: 0 });
21 },
22};
tests/jest-e2e.config.json+0 -11
@@ -1,11 +0,0 @@
1{
2 "verbose": true,
3 "transform": {},
4 "preset": "jest-puppeteer",
5 "setupFilesAfterEnv": [
6 "<rootDir>/jest.setup.js"
7 ],
8 "testMatch": [
9 "**/?(*.)+(e2e).js"
10 ]
11}
tests/jest.setup.js+0 -2
@@ -1,2 +0,0 @@
1// Initialize global variables for Jest tests here
2global.ST_URL = 'http://localhost:8000';
tests/jsconfig.json+5 -0
@@ -0,0 +1,5 @@
1{
2 "compilerOptions": {
3 "baseUrl": ".",
4 },
5}
tests/package-lock.json+52 -556
@@ -7,10 +7,10 @@
7 "name": "sillytavern-tests",7 "name": "sillytavern-tests",
8 "license": "AGPL-3.0",8 "license": "AGPL-3.0",
9 "dependencies": {9 "dependencies": {
10 "@playwright/test": "^1.56.1",
10 "@types/jest": "^29.5.12",11 "@types/jest": "^29.5.12",
11 "eslint": "^8.57.0",12 "eslint": "^8.57.0",
12 "jest": "^29.7.0",13 "jest": "^29.7.0"
13 "jest-puppeteer": "^10.0.1"
14 }14 }
15 },15 },
16 "node_modules/@ampproject/remapping": {16 "node_modules/@ampproject/remapping": {
@@ -601,21 +601,6 @@
601 "node": "^12.22.0 || ^14.17.0 || >=16.0.0"601 "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
602 }602 }
603 },603 },
604 "node_modules/@hapi/hoek": {
605 "version": "9.3.0",
606 "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
607 "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
608 "license": "BSD-3-Clause"
609 },
610 "node_modules/@hapi/topo": {
611 "version": "5.1.0",
612 "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
613 "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
614 "license": "BSD-3-Clause",
615 "dependencies": {
616 "@hapi/hoek": "^9.0.0"
617 }
618 },
619 "node_modules/@humanwhocodes/config-array": {604 "node_modules/@humanwhocodes/config-array": {
620 "version": "0.11.14",605 "version": "0.11.14",
621 "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",606 "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
@@ -1037,22 +1022,16 @@
1037 "node": ">= 8"1022 "node": ">= 8"
1038 }1023 }
1039 },1024 },
1040 "node_modules/@puppeteer/browsers": {1025 "node_modules/@playwright/test": {
1041 "version": "2.10.2",1026 "version": "1.56.1",
1042 "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz",1027 "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz",
1043 "integrity": "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==",1028 "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==",
1044 "license": "Apache-2.0",1029 "license": "Apache-2.0",
1045 "dependencies": {1030 "dependencies": {
1046 "debug": "^4.4.0",1031 "playwright": "1.56.1"
1047 "extract-zip": "^2.0.1",
1048 "progress": "^2.0.3",
1049 "proxy-agent": "^6.5.0",
1050 "semver": "^7.7.1",
1051 "tar-fs": "^3.0.8",
1052 "yargs": "^17.7.2"
1053 },1032 },
1054 "bin": {1033 "bin": {
1055 "browsers": "lib/cjs/main-cli.js"1034 "playwright": "cli.js"
1056 },1035 },
1057 "engines": {1036 "engines": {
1058 "node": ">=18"1037 "node": ">=18"
@@ -1667,19 +1646,6 @@
1667 "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",1646 "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
1668 "license": "MIT"1647 "license": "MIT"
1669 },1648 },
1670 "node_modules/call-bind-apply-helpers": {
1671 "version": "1.0.2",
1672 "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
1673 "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
1674 "license": "MIT",
1675 "dependencies": {
1676 "es-errors": "^1.3.0",
1677 "function-bind": "^1.1.2"
1678 },
1679 "engines": {
1680 "node": ">= 0.4"
1681 }
1682 },
1683 "node_modules/callsites": {1649 "node_modules/callsites": {
1684 "version": "3.1.0",1650 "version": "3.1.0",
1685 "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",1651 "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -1825,27 +1791,6 @@
1825 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",1791 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1826 "license": "MIT"1792 "license": "MIT"
1827 },1793 },
1828 "node_modules/combined-stream": {
1829 "version": "1.0.8",
1830 "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1831 "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1832 "license": "MIT",
1833 "dependencies": {
1834 "delayed-stream": "~1.0.0"
1835 },
1836 "engines": {
1837 "node": ">= 0.8"
1838 }
1839 },
1840 "node_modules/commander": {
1841 "version": "5.1.0",
1842 "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
1843 "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
1844 "license": "MIT",
1845 "engines": {
1846 "node": ">= 6"
1847 }
1848 },
1849 "node_modules/concat-map": {1794 "node_modules/concat-map": {
1850 "version": "0.0.1",1795 "version": "0.0.1",
1851 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",1796 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2037,13 +1982,6 @@
2037 "node": ">=8"1982 "node": ">=8"
2038 }1983 }
2039 },1984 },
2040 "node_modules/devtools-protocol": {
2041 "version": "0.0.1425554",
2042 "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz",
2043 "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==",
2044 "license": "BSD-3-Clause",
2045 "peer": true
2046 },
2047 "node_modules/diff-sequences": {1985 "node_modules/diff-sequences": {
2048 "version": "29.6.3",1986 "version": "29.6.3",
2049 "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",1987 "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
@@ -2065,20 +2003,6 @@
2065 "node": ">=6.0.0"2003 "node": ">=6.0.0"
2066 }2004 }
2067 },2005 },
2068 "node_modules/dunder-proto": {
2069 "version": "1.0.1",
2070 "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
2071 "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
2072 "license": "MIT",
2073 "dependencies": {
2074 "call-bind-apply-helpers": "^1.0.1",
2075 "es-errors": "^1.3.0",
2076 "gopd": "^1.2.0"
2077 },
2078 "engines": {
2079 "node": ">= 0.4"
2080 }
2081 },
2082 "node_modules/electron-to-chromium": {2006 "node_modules/electron-to-chromium": {
2083 "version": "1.4.820",2007 "version": "1.4.820",
2084 "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.820.tgz",2008 "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.820.tgz",
@@ -2130,51 +2054,6 @@
2130 "is-arrayish": "^0.2.1"2054 "is-arrayish": "^0.2.1"
2131 }2055 }
2132 },2056 },
2133 "node_modules/es-define-property": {
2134 "version": "1.0.1",
2135 "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
2136 "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
2137 "license": "MIT",
2138 "engines": {
2139 "node": ">= 0.4"
2140 }
2141 },
2142 "node_modules/es-errors": {
2143 "version": "1.3.0",
2144 "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
2145 "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
2146 "license": "MIT",
2147 "engines": {
2148 "node": ">= 0.4"
2149 }
2150 },
2151 "node_modules/es-object-atoms": {
2152 "version": "1.1.1",
2153 "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
2154 "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
2155 "license": "MIT",
2156 "dependencies": {
2157 "es-errors": "^1.3.0"
2158 },
2159 "engines": {
2160 "node": ">= 0.4"
2161 }
2162 },
2163 "node_modules/es-set-tostringtag": {
2164 "version": "2.1.0",
2165 "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
2166 "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
2167 "license": "MIT",
2168 "dependencies": {
2169 "es-errors": "^1.3.0",
2170 "get-intrinsic": "^1.2.6",
2171 "has-tostringtag": "^1.0.2",
2172 "hasown": "^2.0.2"
2173 },
2174 "engines": {
2175 "node": ">= 0.4"
2176 }
2177 },
2178 "node_modules/escalade": {2057 "node_modules/escalade": {
2179 "version": "3.1.2",2058 "version": "3.1.2",
2180 "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",2059 "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
@@ -2504,18 +2383,6 @@
2504 "node": ">= 0.8.0"2383 "node": ">= 0.8.0"
2505 }2384 }
2506 },2385 },
2507 "node_modules/expand-tilde": {
2508 "version": "1.2.2",
2509 "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
2510 "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==",
2511 "license": "MIT",
2512 "dependencies": {
2513 "os-homedir": "^1.0.1"
2514 },
2515 "engines": {
2516 "node": ">=0.10.0"
2517 }
2518 },
2519 "node_modules/expect": {2386 "node_modules/expect": {
2520 "version": "29.7.0",2387 "version": "29.7.0",
2521 "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",2388 "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
@@ -2650,45 +2517,6 @@
2650 "node": ">=8"2517 "node": ">=8"
2651 }2518 }
2652 },2519 },
2653 "node_modules/find-file-up": {
2654 "version": "0.1.3",
2655 "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz",
2656 "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==",
2657 "license": "MIT",
2658 "dependencies": {
2659 "fs-exists-sync": "^0.1.0",
2660 "resolve-dir": "^0.1.0"
2661 },
2662 "engines": {
2663 "node": ">=0.10.0"
2664 }
2665 },
2666 "node_modules/find-pkg": {
2667 "version": "0.1.2",
2668 "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz",
2669 "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==",
2670 "license": "MIT",
2671 "dependencies": {
2672 "find-file-up": "^0.1.2"
2673 },
2674 "engines": {
2675 "node": ">=0.10.0"
2676 }
2677 },
2678 "node_modules/find-process": {
2679 "version": "1.4.7",
2680 "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz",
2681 "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==",
2682 "license": "MIT",
2683 "dependencies": {
2684 "chalk": "^4.0.0",
2685 "commander": "^5.1.0",
2686 "debug": "^4.1.1"
2687 },
2688 "bin": {
2689 "find-process": "bin/find-process.js"
2690 }
2691 },
2692 "node_modules/find-up": {2520 "node_modules/find-up": {
2693 "version": "4.1.0",2521 "version": "4.1.0",
2694 "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",2522 "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@@ -2722,51 +2550,6 @@
2722 "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",2550 "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
2723 "license": "ISC"2551 "license": "ISC"
2724 },2552 },
2725 "node_modules/follow-redirects": {
2726 "version": "1.15.6",
2727 "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
2728 "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
2729 "funding": [
2730 {
2731 "type": "individual",
2732 "url": "https://github.com/sponsors/RubenVerborgh"
2733 }
2734 ],
2735 "license": "MIT",
2736 "engines": {
2737 "node": ">=4.0"
2738 },
2739 "peerDependenciesMeta": {
2740 "debug": {
2741 "optional": true
2742 }
2743 }
2744 },
2745 "node_modules/form-data": {
2746 "version": "4.0.4",
2747 "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
2748 "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
2749 "license": "MIT",
2750 "dependencies": {
2751 "asynckit": "^0.4.0",
2752 "combined-stream": "^1.0.8",
2753 "es-set-tostringtag": "^2.1.0",
2754 "hasown": "^2.0.2",
2755 "mime-types": "^2.1.12"
2756 },
2757 "engines": {
2758 "node": ">= 6"
2759 }
2760 },
2761 "node_modules/fs-exists-sync": {
2762 "version": "0.1.0",
2763 "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
2764 "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==",
2765 "license": "MIT",
2766 "engines": {
2767 "node": ">=0.10.0"
2768 }
2769 },
2770 "node_modules/fs.realpath": {2553 "node_modules/fs.realpath": {
2771 "version": "1.0.0",2554 "version": "1.0.0",
2772 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",2555 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -2814,30 +2597,6 @@
2814 "node": "6.* || 8.* || >= 10.*"2597 "node": "6.* || 8.* || >= 10.*"
2815 }2598 }
2816 },2599 },
2817 "node_modules/get-intrinsic": {
2818 "version": "1.3.0",
2819 "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
2820 "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
2821 "license": "MIT",
2822 "dependencies": {
2823 "call-bind-apply-helpers": "^1.0.2",
2824 "es-define-property": "^1.0.1",
2825 "es-errors": "^1.3.0",
2826 "es-object-atoms": "^1.1.1",
2827 "function-bind": "^1.1.2",
2828 "get-proto": "^1.0.1",
2829 "gopd": "^1.2.0",
2830 "has-symbols": "^1.1.0",
2831 "hasown": "^2.0.2",
2832 "math-intrinsics": "^1.1.0"
2833 },
2834 "engines": {
2835 "node": ">= 0.4"
2836 },
2837 "funding": {
2838 "url": "https://github.com/sponsors/ljharb"
2839 }
2840 },
2841 "node_modules/get-package-type": {2600 "node_modules/get-package-type": {
2842 "version": "0.1.0",2601 "version": "0.1.0",
2843 "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",2602 "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
@@ -2847,19 +2606,6 @@
2847 "node": ">=8.0.0"2606 "node": ">=8.0.0"
2848 }2607 }
2849 },2608 },
2850 "node_modules/get-proto": {
2851 "version": "1.0.1",
2852 "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
2853 "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
2854 "license": "MIT",
2855 "dependencies": {
2856 "dunder-proto": "^1.0.1",
2857 "es-object-atoms": "^1.0.0"
2858 },
2859 "engines": {
2860 "node": ">= 0.4"
2861 }
2862 },
2863 "node_modules/get-stream": {2609 "node_modules/get-stream": {
2864 "version": "6.0.1",2610 "version": "6.0.1",
2865 "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",2611 "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -2919,46 +2665,6 @@
2919 "node": ">=10.13.0"2665 "node": ">=10.13.0"
2920 }2666 }
2921 },2667 },
2922 "node_modules/global-modules": {
2923 "version": "0.2.3",
2924 "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
2925 "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==",
2926 "license": "MIT",
2927 "dependencies": {
2928 "global-prefix": "^0.1.4",
2929 "is-windows": "^0.2.0"
2930 },
2931 "engines": {
2932 "node": ">=0.10.0"
2933 }
2934 },
2935 "node_modules/global-prefix": {
2936 "version": "0.1.5",
2937 "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
2938 "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==",
2939 "license": "MIT",
2940 "dependencies": {
2941 "homedir-polyfill": "^1.0.0",
2942 "ini": "^1.3.4",
2943 "is-windows": "^0.2.0",
2944 "which": "^1.2.12"
2945 },
2946 "engines": {
2947 "node": ">=0.10.0"
2948 }
2949 },
2950 "node_modules/global-prefix/node_modules/which": {
2951 "version": "1.3.1",
2952 "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2953 "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2954 "license": "ISC",
2955 "dependencies": {
2956 "isexe": "^2.0.0"
2957 },
2958 "bin": {
2959 "which": "bin/which"
2960 }
2961 },
2962 "node_modules/globals": {2668 "node_modules/globals": {
2963 "version": "11.12.0",2669 "version": "11.12.0",
2964 "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",2670 "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -2968,18 +2674,6 @@
2968 "node": ">=4"2674 "node": ">=4"
2969 }2675 }
2970 },2676 },
2971 "node_modules/gopd": {
2972 "version": "1.2.0",
2973 "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
2974 "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
2975 "license": "MIT",
2976 "engines": {
2977 "node": ">= 0.4"
2978 },
2979 "funding": {
2980 "url": "https://github.com/sponsors/ljharb"
2981 }
2982 },
2983 "node_modules/graceful-fs": {2677 "node_modules/graceful-fs": {
2984 "version": "4.2.11",2678 "version": "4.2.11",
2985 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",2679 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -3001,33 +2695,6 @@
3001 "node": ">=8"2695 "node": ">=8"
3002 }2696 }
3003 },2697 },
3004 "node_modules/has-symbols": {
3005 "version": "1.1.0",
3006 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
3007 "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
3008 "license": "MIT",
3009 "engines": {
3010 "node": ">= 0.4"
3011 },
3012 "funding": {
3013 "url": "https://github.com/sponsors/ljharb"
3014 }
3015 },
3016 "node_modules/has-tostringtag": {
3017 "version": "1.0.2",
3018 "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
3019 "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
3020 "license": "MIT",
3021 "dependencies": {
3022 "has-symbols": "^1.0.3"
3023 },
3024 "engines": {
3025 "node": ">= 0.4"
3026 },
3027 "funding": {
3028 "url": "https://github.com/sponsors/ljharb"
3029 }
3030 },
3031 "node_modules/hasown": {2698 "node_modules/hasown": {
3032 "version": "2.0.2",2699 "version": "2.0.2",
3033 "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",2700 "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -3040,18 +2707,6 @@
3040 "node": ">= 0.4"2707 "node": ">= 0.4"
3041 }2708 }
3042 },2709 },
3043 "node_modules/homedir-polyfill": {
3044 "version": "1.0.3",
3045 "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
3046 "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
3047 "license": "MIT",
3048 "dependencies": {
3049 "parse-passwd": "^1.0.0"
3050 },
3051 "engines": {
3052 "node": ">=0.10.0"
3053 }
3054 },
3055 "node_modules/html-escaper": {2710 "node_modules/html-escaper": {
3056 "version": "2.0.2",2711 "version": "2.0.2",
3057 "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",2712 "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -3287,15 +2942,6 @@
3287 "url": "https://github.com/sponsors/sindresorhus"2942 "url": "https://github.com/sponsors/sindresorhus"
3288 }2943 }
3289 },2944 },
3290 "node_modules/is-windows": {
3291 "version": "0.2.0",
3292 "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
3293 "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==",
3294 "license": "MIT",
3295 "engines": {
3296 "node": ">=0.10.0"
3297 }
3298 },
3299 "node_modules/isexe": {2945 "node_modules/isexe": {
3300 "version": "2.0.0",2946 "version": "2.0.0",
3301 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",2947 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -3529,23 +3175,6 @@
3529 }3175 }
3530 }3176 }
3531 },3177 },
3532 "node_modules/jest-dev-server": {
3533 "version": "10.0.0",
3534 "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-10.0.0.tgz",
3535 "integrity": "sha512-FtyBBDxrAIfTX3hyKSOwj5KU6Z7fFLew5pQYOFpwyf+qpPpULL8aYxtsFkbkAwcs+Mb7qhcNbVLeiWsLOd7CKw==",
3536 "dependencies": {
3537 "chalk": "^4.1.2",
3538 "cwd": "^0.10.0",
3539 "find-process": "^1.4.7",
3540 "prompts": "^2.4.2",
3541 "spawnd": "^10.0.0",
3542 "tree-kill": "^1.2.2",
3543 "wait-on": "^7.2.0"
3544 },
3545 "engines": {
3546 "node": ">=16"
3547 }
3548 },
3549 "node_modules/jest-diff": {3178 "node_modules/jest-diff": {
3550 "version": "29.7.0",3179 "version": "29.7.0",
3551 "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",3180 "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
@@ -3606,21 +3235,6 @@
3606 "node": "^14.15.0 || ^16.10.0 || >=18.0.0"3235 "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
3607 }3236 }
3608 },3237 },
3609 "node_modules/jest-environment-puppeteer": {
3610 "version": "10.0.1",
3611 "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-10.0.1.tgz",
3612 "integrity": "sha512-FxMzVRyqieQqSy5CPWiwdK5t9dkRHid5eoRTVa8RtYeXLlpW6lU0dAmxEfPkdnDVCiPUhC2APeKOXq0J72bgag==",
3613 "dependencies": {
3614 "chalk": "^4.1.2",
3615 "cosmiconfig": "^8.3.6",
3616 "deepmerge": "^4.3.1",
3617 "jest-dev-server": "^10.0.0",
3618 "jest-environment-node": "^29.7.0"
3619 },
3620 "engines": {
3621 "node": ">=16"
3622 }
3623 },
3624 "node_modules/jest-get-type": {3238 "node_modules/jest-get-type": {
3625 "version": "29.6.3",3239 "version": "29.6.3",
3626 "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",3240 "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
@@ -3734,21 +3348,6 @@
3734 }3348 }
3735 }3349 }
3736 },3350 },
3737 "node_modules/jest-puppeteer": {
3738 "version": "10.0.1",
3739 "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-10.0.1.tgz",
3740 "integrity": "sha512-FzC35XbqeuQEt1smXh1EOqhJaRkWqJkyWDMfGkcZ8C59QHXeJ7F/iOmiNqYi6l/OsycUuOPCk+IkjfGfS9YbrQ==",
3741 "dependencies": {
3742 "expect-puppeteer": "^10.0.0",
3743 "jest-environment-puppeteer": "^10.0.1"
3744 },
3745 "engines": {
3746 "node": ">=16"
3747 },
3748 "peerDependencies": {
3749 "puppeteer": ">=19"
3750 }
3751 },
3752 "node_modules/jest-regex-util": {3351 "node_modules/jest-regex-util": {
3753 "version": "29.6.3",3352 "version": "29.6.3",
3754 "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",3353 "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
@@ -3994,19 +3593,6 @@
3994 "url": "https://github.com/chalk/supports-color?sponsor=1"3593 "url": "https://github.com/chalk/supports-color?sponsor=1"
3995 }3594 }
3996 },3595 },
3997 "node_modules/joi": {
3998 "version": "17.13.3",
3999 "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
4000 "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
4001 "license": "BSD-3-Clause",
4002 "dependencies": {
4003 "@hapi/hoek": "^9.3.0",
4004 "@hapi/topo": "^5.1.0",
4005 "@sideway/address": "^4.1.5",
4006 "@sideway/formula": "^3.0.1",
4007 "@sideway/pinpoint": "^2.0.0"
4008 }
4009 },
4010 "node_modules/js-tokens": {3596 "node_modules/js-tokens": {
4011 "version": "4.0.0",3597 "version": "4.0.0",
4012 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",3598 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -4138,12 +3724,6 @@
4138 "node": ">=8"3724 "node": ">=8"
4139 }3725 }
4140 },3726 },
4141 "node_modules/lodash": {
4142 "version": "4.17.21",
4143 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
4144 "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
4145 "license": "MIT"
4146 },
4147 "node_modules/lodash.merge": {3727 "node_modules/lodash.merge": {
4148 "version": "4.6.2",3728 "version": "4.6.2",
4149 "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",3729 "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -4195,15 +3775,6 @@
4195 "tmpl": "1.0.5"3775 "tmpl": "1.0.5"
4196 }3776 }
4197 },3777 },
4198 "node_modules/math-intrinsics": {
4199 "version": "1.1.0",
4200 "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
4201 "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
4202 "license": "MIT",
4203 "engines": {
4204 "node": ">= 0.4"
4205 }
4206 },
4207 "node_modules/merge-stream": {3778 "node_modules/merge-stream": {
4208 "version": "2.0.0",3779 "version": "2.0.0",
4209 "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",3780 "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -4222,27 +3793,6 @@
4222 "node": ">=8.6"3793 "node": ">=8.6"
4223 }3794 }
4224 },3795 },
4225 "node_modules/mime-db": {
4226 "version": "1.52.0",
4227 "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
4228 "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
4229 "license": "MIT",
4230 "engines": {
4231 "node": ">= 0.6"
4232 }
4233 },
4234 "node_modules/mime-types": {
4235 "version": "2.1.35",
4236 "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
4237 "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
4238 "license": "MIT",
4239 "dependencies": {
4240 "mime-db": "1.52.0"
4241 },
4242 "engines": {
4243 "node": ">= 0.6"
4244 }
4245 },
4246 "node_modules/mimic-fn": {3796 "node_modules/mimic-fn": {
4247 "version": "2.1.0",3797 "version": "2.1.0",
4248 "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",3798 "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
@@ -4374,15 +3924,6 @@
4374 "node": ">= 0.8.0"3924 "node": ">= 0.8.0"
4375 }3925 }
4376 },3926 },
4377 "node_modules/os-homedir": {
4378 "version": "1.0.2",
4379 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
4380 "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
4381 "license": "MIT",
4382 "engines": {
4383 "node": ">=0.10.0"
4384 }
4385 },
4386 "node_modules/p-limit": {3927 "node_modules/p-limit": {
4387 "version": "3.1.0",3928 "version": "3.1.0",
4388 "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",3929 "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -4496,15 +4037,6 @@
4496 "url": "https://github.com/sponsors/sindresorhus"4037 "url": "https://github.com/sponsors/sindresorhus"
4497 }4038 }
4498 },4039 },
4499 "node_modules/parse-passwd": {
4500 "version": "1.0.0",
4501 "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
4502 "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
4503 "license": "MIT",
4504 "engines": {
4505 "node": ">=0.10.0"
4506 }
4507 },
4508 "node_modules/path-exists": {4040 "node_modules/path-exists": {
4509 "version": "4.0.0",4041 "version": "4.0.0",
4510 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",4042 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -4592,6 +4124,50 @@
4592 "node": ">=8"4124 "node": ">=8"
4593 }4125 }
4594 },4126 },
4127 "node_modules/playwright": {
4128 "version": "1.56.1",
4129 "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz",
4130 "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==",
4131 "license": "Apache-2.0",
4132 "dependencies": {
4133 "playwright-core": "1.56.1"
4134 },
4135 "bin": {
4136 "playwright": "cli.js"
4137 },
4138 "engines": {
4139 "node": ">=18"
4140 },
4141 "optionalDependencies": {
4142 "fsevents": "2.3.2"
4143 }
4144 },
4145 "node_modules/playwright-core": {
4146 "version": "1.56.1",
4147 "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz",
4148 "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==",
4149 "license": "Apache-2.0",
4150 "bin": {
4151 "playwright-core": "cli.js"
4152 },
4153 "engines": {
4154 "node": ">=18"
4155 }
4156 },
4157 "node_modules/playwright/node_modules/fsevents": {
4158 "version": "2.3.2",
4159 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
4160 "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
4161 "hasInstallScript": true,
4162 "license": "MIT",
4163 "optional": true,
4164 "os": [
4165 "darwin"
4166 ],
4167 "engines": {
4168 "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
4169 }
4170 },
4595 "node_modules/prelude-ls": {4171 "node_modules/prelude-ls": {
4596 "version": "1.2.1",4172 "version": "1.2.1",
4597 "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",4173 "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -4864,19 +4440,6 @@
4864 "node": ">=8"4440 "node": ">=8"
4865 }4441 }
4866 },4442 },
4867 "node_modules/resolve-dir": {
4868 "version": "0.1.1",
4869 "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
4870 "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==",
4871 "license": "MIT",
4872 "dependencies": {
4873 "expand-tilde": "^1.2.2",
4874 "global-modules": "^0.2.3"
4875 },
4876 "engines": {
4877 "node": ">=0.10.0"
4878 }
4879 },
4880 "node_modules/resolve-from": {4443 "node_modules/resolve-from": {
4881 "version": "5.0.0",4444 "version": "5.0.0",
4882 "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",4445 "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -4944,15 +4507,6 @@
4944 "queue-microtask": "^1.2.2"4507 "queue-microtask": "^1.2.2"
4945 }4508 }
4946 },4509 },
4947 "node_modules/rxjs": {
4948 "version": "7.8.1",
4949 "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
4950 "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
4951 "license": "Apache-2.0",
4952 "dependencies": {
4953 "tslib": "^2.1.0"
4954 }
4955 },
4956 "node_modules/semver": {4510 "node_modules/semver": {
4957 "version": "6.3.1",4511 "version": "6.3.1",
4958 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",4512 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
@@ -5061,30 +4615,6 @@
5061 "source-map": "^0.6.0"4615 "source-map": "^0.6.0"
5062 }4616 }
5063 },4617 },
5064 "node_modules/spawnd": {
5065 "version": "10.0.0",
5066 "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-10.0.0.tgz",
5067 "integrity": "sha512-6GKcakMTryb5b1SWCvdubCDHEsR2k+5VZUD5G19umZRarkvj1RyCGyizcqhjewI7cqZo8fTVD8HpnDZbVOLMtg==",
5068 "dependencies": {
5069 "signal-exit": "^4.1.0",
5070 "tree-kill": "^1.2.2"
5071 },
5072 "engines": {
5073 "node": ">=16"
5074 }
5075 },
5076 "node_modules/spawnd/node_modules/signal-exit": {
5077 "version": "4.1.0",
5078 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
5079 "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
5080 "license": "ISC",
5081 "engines": {
5082 "node": ">=14"
5083 },
5084 "funding": {
5085 "url": "https://github.com/sponsors/isaacs"
5086 }
5087 },
5088 "node_modules/sprintf-js": {4618 "node_modules/sprintf-js": {
5089 "version": "1.0.3",4619 "version": "1.0.3",
5090 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",4620 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -5281,21 +4811,6 @@
5281 "node": ">=8.0"4811 "node": ">=8.0"
5282 }4812 }
5283 },4813 },
5284 "node_modules/tree-kill": {
5285 "version": "1.2.2",
5286 "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
5287 "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
5288 "license": "MIT",
5289 "bin": {
5290 "tree-kill": "cli.js"
5291 }
5292 },
5293 "node_modules/tslib": {
5294 "version": "2.6.3",
5295 "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
5296 "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
5297 "license": "0BSD"
5298 },
5299 "node_modules/type-check": {4814 "node_modules/type-check": {
5300 "version": "0.4.0",4815 "version": "0.4.0",
5301 "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",4816 "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -5394,25 +4909,6 @@
5394 "node": ">=10.12.0"4909 "node": ">=10.12.0"
5395 }4910 }
5396 },4911 },
5397 "node_modules/wait-on": {
5398 "version": "7.2.0",
5399 "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz",
5400 "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==",
5401 "license": "MIT",
5402 "dependencies": {
5403 "axios": "^1.6.1",
5404 "joi": "^17.11.0",
5405 "lodash": "^4.17.21",
5406 "minimist": "^1.2.8",
5407 "rxjs": "^7.8.1"
5408 },
5409 "bin": {
5410 "wait-on": "bin/wait-on"
5411 },
5412 "engines": {
5413 "node": ">=12.0.0"
5414 }
5415 },
5416 "node_modules/walker": {4912 "node_modules/walker": {
5417 "version": "1.0.8",4913 "version": "1.0.8",
5418 "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",4914 "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
tests/package.json+5 -3
@@ -5,12 +5,14 @@
5 "scripts": {5 "scripts": {
6 "test": "npm run test:unit && npm run test:e2e",6 "test": "npm run test:unit && npm run test:e2e",
7 "test:unit": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.json",7 "test:unit": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.json",
8 "test:e2e": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest-e2e.config.json"8 "test:e2e": "playwright test",
9 "lint": "eslint \"**/*.js\" ./*.js",
10 "lint:fix": "eslint \"**/*.js\" ./*.js --fix"
9 },11 },
10 "dependencies": {12 "dependencies": {
13 "@playwright/test": "^1.56.1",
11 "@types/jest": "^29.5.12",14 "@types/jest": "^29.5.12",
12 "eslint": "^8.57.0",15 "eslint": "^8.57.0",
13 "jest": "^29.7.0",16 "jest": "^29.7.0"
14 "jest-puppeteer": "^10.0.1"
15 }17 }
16}18}
tests/playwright.config.js+12 -0
@@ -0,0 +1,12 @@
1import { defineConfig } from '@playwright/test';
2
3export default defineConfig({
4 testMatch: '*.e2e.js',
5 use: {
6 baseURL: 'http://127.0.0.1:8000',
7 video: 'only-on-failure',
8 screenshot: 'only-on-failure',
9 },
10 workers: 4,
11 fullyParallel: true,
12});
tests/sample.e2e.js+7 -5
@@ -1,10 +1,12 @@
1describe('sample', () => {1import { test, expect } from '@playwright/test';
2 beforeAll(async () => {2
3 await page.goto(global.ST_URL);3test.describe('sample', () => {
4 test.beforeEach(async({ page }) => {
5 await page.goto('/');
4 await page.waitForFunction('document.getElementById("preloader") === null', { timeout: 0 });6 await page.waitForFunction('document.getElementById("preloader") === null', { timeout: 0 });
5 });7 });
68
7 it('should be titled "SillyTavern"', async () => {9 test('should be titled "SillyTavern"', async ({ page }) => {
8 await expect(page.title()).resolves.toMatch('SillyTavern');10 await expect(page).toHaveTitle('SillyTavern');
9 });11 });
10});12});
tests/util.test.js+5 -5
@@ -1,14 +1,14 @@
1import { describe, it, expect } from '@jest/globals';1import { describe, test, expect } from '@jest/globals';
2import { CHAT_COMPLETION_SOURCES } from '../src/constants';2import { CHAT_COMPLETION_SOURCES } from '../src/constants';
3import { flattenSchema } from '../src/util';3import { flattenSchema } from '../src/util';
44
5describe('flattenSchema', () => {5describe('flattenSchema', () => {
6 it('should return the schema if it is not an object', () => {6 test('should return the schema if it is not an object', () => {
7 const schema = 'it is not an object';7 const schema = 'it is not an object';
8 expect(flattenSchema(schema, CHAT_COMPLETION_SOURCES.MAKERSUITE)).toBe(schema);8 expect(flattenSchema(schema, CHAT_COMPLETION_SOURCES.MAKERSUITE)).toBe(schema);
9 });9 });
1010
11 it('should handle schema with $defs and $ref', () => {11 test('should handle schema with $defs and $ref', () => {
12 const schema = {12 const schema = {
13 $schema: 'http://json-schema.org/draft-07/schema#',13 $schema: 'http://json-schema.org/draft-07/schema#',
14 $defs: {14 $defs: {
@@ -37,7 +37,7 @@ describe('flattenSchema', () => {
37 expect(flattenSchema(schema, CHAT_COMPLETION_SOURCES.MAKERSUITE)).toEqual(expected);37 expect(flattenSchema(schema, CHAT_COMPLETION_SOURCES.MAKERSUITE)).toEqual(expected);
38 });38 });
3939
40 it('should filter unsupported properties for Google API schema', () => {40 test('should filter unsupported properties for Google API schema', () => {
41 const schema = {41 const schema = {
42 $defs: {42 $defs: {
43 a: {43 a: {
@@ -68,7 +68,7 @@ describe('flattenSchema', () => {
68 expect(flattenSchema(schema, CHAT_COMPLETION_SOURCES.MAKERSUITE)).toEqual(expected);68 expect(flattenSchema(schema, CHAT_COMPLETION_SOURCES.MAKERSUITE)).toEqual(expected);
69 });69 });
7070
71 it('should not filter properties for non-Google API schema', () => {71 test('should not filter properties for non-Google API schema', () => {
72 const schema = {72 const schema = {
73 $defs: {73 $defs: {
74 a: {74 a: {