From 73adfd66ed0d40e18f0d876994c70fb0133889ac Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 21 Feb 2025 09:53:16 +0100 Subject: [PATCH 01/92] chore: Simplificeer package-lock package-lock.json van subpackages unificeren naar root --- backend/package-lock.json | 4447 ----------------------- frontend/package-lock.json | 6825 ------------------------------------ package-lock.json | 465 +-- 3 files changed, 166 insertions(+), 11571 deletions(-) delete mode 100644 backend/package-lock.json delete mode 100644 frontend/package-lock.json diff --git a/backend/package-lock.json b/backend/package-lock.json deleted file mode 100644 index d344f142..00000000 --- a/backend/package-lock.json +++ /dev/null @@ -1,4447 +0,0 @@ -{ - "name": "dwengo-1-backend", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "dwengo-1-backend", - "version": "0.0.1", - "license": "MIT", - "dependencies": { - "@mikro-orm/core": "^6.4.6", - "@mikro-orm/postgresql": "^6.4.6", - "@mikro-orm/reflection": "^6.4.6", - "dotenv": "^16.4.7", - "express": "^5.0.1" - }, - "devDependencies": { - "@mikro-orm/cli": "^6.4.6", - "@types/express": "^5.0.0", - "@types/node": "^22.13.4", - "ts-node": "^10.9.2", - "tsx": "^4.19.3", - "typescript": "^5.7.3", - "vitest": "^3.0.6" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jercle/yargonaut": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@jercle/yargonaut/-/yargonaut-1.1.5.tgz", - "integrity": "sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "chalk": "^4.1.2", - "figlet": "^1.5.2", - "parent-require": "^1.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@mikro-orm/cli": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/@mikro-orm/cli/-/cli-6.4.6.tgz", - "integrity": "sha512-sTMoDSJrnHZBT+ZAG40OeZwR9zRTYHtaaub9OoMM2CrxfI1KeiNqL/XFB4LaM5SVRAbnoEFpMJwQ8KS+5NcN9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jercle/yargonaut": "1.1.5", - "@mikro-orm/core": "6.4.6", - "@mikro-orm/knex": "6.4.6", - "fs-extra": "11.3.0", - "tsconfig-paths": "4.2.0", - "yargs": "17.7.2" - }, - "bin": { - "mikro-orm": "cli", - "mikro-orm-esm": "esm" - }, - "engines": { - "node": ">= 18.12.0" - } - }, - "node_modules/@mikro-orm/core": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/@mikro-orm/core/-/core-6.4.6.tgz", - "integrity": "sha512-xVm/ALG/3vTMgh6SrvojJ6jjMa0s2hNzWN0triDB16BaNdLwWE4aAaAe+3CuoMFqJAArSOUISTEjExbzELB1ZA==", - "license": "MIT", - "dependencies": { - "dataloader": "2.2.3", - "dotenv": "16.4.7", - "esprima": "4.0.1", - "fs-extra": "11.3.0", - "globby": "11.1.0", - "mikro-orm": "6.4.6", - "reflect-metadata": "0.2.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/b4nan" - } - }, - "node_modules/@mikro-orm/knex": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/@mikro-orm/knex/-/knex-6.4.6.tgz", - "integrity": "sha512-o6t67tFH/GuPZCCEtKbTTL8HDXNgB2ITjButCTZLwteL0qI9yE/f7K6K+dEUKW+hAL3KRvc2BQeumvCVWFeISg==", - "license": "MIT", - "dependencies": { - "fs-extra": "11.3.0", - "knex": "3.1.0", - "sqlstring": "2.3.3" - }, - "engines": { - "node": ">= 18.12.0" - }, - "peerDependencies": { - "@mikro-orm/core": "^6.0.0", - "better-sqlite3": "*", - "libsql": "*", - "mariadb": "*" - }, - "peerDependenciesMeta": { - "better-sqlite3": { - "optional": true - }, - "libsql": { - "optional": true - }, - "mariadb": { - "optional": true - } - } - }, - "node_modules/@mikro-orm/postgresql": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/@mikro-orm/postgresql/-/postgresql-6.4.6.tgz", - "integrity": "sha512-ZcuGp6n/SPzkHPANksjdLPyeu6jT7WCg3ueNViVrxdsguCi+/grz4I+hbOQDXV8uNHCAUOw6+WP2ndcVEYkZZQ==", - "license": "MIT", - "dependencies": { - "@mikro-orm/knex": "6.4.6", - "pg": "8.13.2", - "postgres-array": "3.0.2", - "postgres-date": "2.1.0", - "postgres-interval": "4.0.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "peerDependencies": { - "@mikro-orm/core": "^6.0.0" - } - }, - "node_modules/@mikro-orm/reflection": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/@mikro-orm/reflection/-/reflection-6.4.6.tgz", - "integrity": "sha512-7mL7HFVnaOOhDNgLjjndWyeJUtOl2wKn0spSqB8uRjS4XtwNEGVZNkW5YD1t/x7TJ99wUhe+oRDiySciiJSeBQ==", - "license": "MIT", - "dependencies": { - "globby": "11.1.0", - "ts-morph": "25.0.1" - }, - "engines": { - "node": ">= 18.12.0" - }, - "peerDependencies": { - "@mikro-orm/core": "^6.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@ts-morph/common": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.26.1.tgz", - "integrity": "sha512-Sn28TGl/4cFpcM+jwsH1wLncYq3FtN/BIpem+HOygfBWPT5pAeS5dB4VFVzV8FbnOKHpDLZmvAl4AjPEev5idA==", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.3.2", - "minimatch": "^9.0.4", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", - "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", - "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@vitest/expect": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.6.tgz", - "integrity": "sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.0.6", - "@vitest/utils": "3.0.6", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.6.tgz", - "integrity": "sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.0.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.6.tgz", - "integrity": "sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.6.tgz", - "integrity": "sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.0.6", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.6.tgz", - "integrity": "sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.0.6", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.6.tgz", - "integrity": "sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.6.tgz", - "integrity": "sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.0.6", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.1.0.tgz", - "integrity": "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.5.2", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "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/code-block-writer": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", - "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dataloader": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", - "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/expect-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", - "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/express": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.0.1.tgz", - "integrity": "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.0.1", - "content-disposition": "^1.0.0", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "^1.2.1", - "debug": "4.3.6", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "^2.0.0", - "fresh": "2.0.0", - "http-errors": "2.0.0", - "merge-descriptors": "^2.0.0", - "methods": "~1.1.2", - "mime-types": "^3.0.0", - "on-finished": "2.4.1", - "once": "1.4.0", - "parseurl": "~1.3.3", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "router": "^2.0.0", - "safe-buffer": "5.2.1", - "send": "^1.1.0", - "serve-static": "^2.1.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "^2.0.0", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figlet": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.8.0.tgz", - "integrity": "sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==", - "dev": true, - "license": "MIT", - "bin": { - "figlet": "bin/index.js" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.0.0.tgz", - "integrity": "sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "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.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/getopts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", - "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", - "license": "MIT" - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/knex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", - "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", - "license": "MIT", - "dependencies": { - "colorette": "2.0.19", - "commander": "^10.0.0", - "debug": "4.3.4", - "escalade": "^3.1.1", - "esm": "^3.2.25", - "get-package-type": "^0.1.0", - "getopts": "2.3.0", - "interpret": "^2.2.0", - "lodash": "^4.17.21", - "pg-connection-string": "2.6.2", - "rechoir": "^0.8.0", - "resolve-from": "^5.0.0", - "tarn": "^3.0.2", - "tildify": "2.0.0" - }, - "bin": { - "knex": "bin/cli.js" - }, - "engines": { - "node": ">=16" - }, - "peerDependenciesMeta": { - "better-sqlite3": { - "optional": true - }, - "mysql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/knex/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true, - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mikro-orm": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/mikro-orm/-/mikro-orm-6.4.6.tgz", - "integrity": "sha512-Lr3uFK06O/4F/AtQAsuYD6QH7DgmUooSVFVGf1y02IuiKVFKOMJ4iKimkRMyoA+ykKhgYIp8WiaEqbWJVuz4Vw==", - "license": "MIT", - "engines": { - "node": ">= 18.12.0" - } - }, - "node_modules/mime-db": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", - "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", - "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.53.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parent-require": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", - "integrity": "sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/pg": { - "version": "8.13.2", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.2.tgz", - "integrity": "sha512-L5QkPvTjVWWHbLaFjCkOSplpb2uCiRYbg0IJ2okCy5ClYfWlSgDDnvdR6dyw3EWAH2AfS4j8E61QFI7gLfTtlw==", - "license": "MIT", - "dependencies": { - "pg-connection-string": "^2.7.0", - "pg-pool": "^3.7.1", - "pg-protocol": "^1.7.1", - "pg-types": "^2.1.0", - "pgpass": "1.x" - }, - "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.1" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", - "license": "MIT", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", - "license": "MIT" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "license": "ISC", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.1.tgz", - "integrity": "sha512-xIOsFoh7Vdhojas6q3596mXFsR8nwBQBXX5JiV7p9buEVAGqYL4yFzclON5P9vFrpu1u7Zwl2oriyDa89n0wbw==", - "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.1.tgz", - "integrity": "sha512-gjTHWGYWsEgy9MsY0Gp6ZJxV24IjDqdpTW7Eh0x+WfJLFsm/TJx1MzL6T0D88mBvkpxotCQ6TwW6N+Kko7lhgQ==", - "license": "MIT" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pg-types/node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pg-types/node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pg-types/node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pg/node_modules/pg-connection-string": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", - "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", - "license": "MIT" - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "license": "MIT", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postgres-array": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", - "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", - "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/postgres-interval": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-4.0.2.tgz", - "integrity": "sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.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/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", - "fsevents": "~2.3.2" - } - }, - "node_modules/router": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.1.0.tgz", - "integrity": "sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==", - "license": "MIT", - "dependencies": { - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.1.0.tgz", - "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "destroy": "^1.2.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "http-errors": "^2.0.0", - "mime-types": "^2.1.35", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/send/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.1.0.tgz", - "integrity": "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sqlstring": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", - "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", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tarn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/tildify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ts-morph": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.1.tgz", - "integrity": "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==", - "license": "MIT", - "dependencies": { - "@ts-morph/common": "~0.26.0", - "code-block-writer": "^13.0.3" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsx": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", - "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", - "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", - "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", - "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", - "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", - "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", - "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", - "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", - "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", - "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", - "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", - "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", - "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", - "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", - "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", - "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", - "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", - "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", - "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", - "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", - "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", - "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", - "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", - "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", - "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", - "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", - "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.0", - "@esbuild/android-arm": "0.25.0", - "@esbuild/android-arm64": "0.25.0", - "@esbuild/android-x64": "0.25.0", - "@esbuild/darwin-arm64": "0.25.0", - "@esbuild/darwin-x64": "0.25.0", - "@esbuild/freebsd-arm64": "0.25.0", - "@esbuild/freebsd-x64": "0.25.0", - "@esbuild/linux-arm": "0.25.0", - "@esbuild/linux-arm64": "0.25.0", - "@esbuild/linux-ia32": "0.25.0", - "@esbuild/linux-loong64": "0.25.0", - "@esbuild/linux-mips64el": "0.25.0", - "@esbuild/linux-ppc64": "0.25.0", - "@esbuild/linux-riscv64": "0.25.0", - "@esbuild/linux-s390x": "0.25.0", - "@esbuild/linux-x64": "0.25.0", - "@esbuild/netbsd-arm64": "0.25.0", - "@esbuild/netbsd-x64": "0.25.0", - "@esbuild/openbsd-arm64": "0.25.0", - "@esbuild/openbsd-x64": "0.25.0", - "@esbuild/sunos-x64": "0.25.0", - "@esbuild/win32-arm64": "0.25.0", - "@esbuild/win32-ia32": "0.25.0", - "@esbuild/win32-x64": "0.25.0" - } - }, - "node_modules/type-is": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", - "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", - "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.5.2", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.6.tgz", - "integrity": "sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-node/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/vite-node/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/vitest": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.6.tgz", - "integrity": "sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "3.0.6", - "@vitest/mocker": "3.0.6", - "@vitest/pretty-format": "^3.0.6", - "@vitest/runner": "3.0.6", - "@vitest/snapshot": "3.0.6", - "@vitest/spy": "3.0.6", - "@vitest/utils": "3.0.6", - "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.1.0", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "std-env": "^3.8.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.6", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.6", - "@vitest/ui": "3.0.6", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/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/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - } - } -} diff --git a/frontend/package-lock.json b/frontend/package-lock.json deleted file mode 100644 index b1e13507..00000000 --- a/frontend/package-lock.json +++ /dev/null @@ -1,6825 +0,0 @@ -{ - "name": "dwengo-1-frontend", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "dwengo-1-frontend", - "version": "0.0.1", - "dependencies": { - "vue": "^3.5.13", - "vue-router": "^4.5.0", - "vuetify": "^3.7.12" - }, - "devDependencies": { - "@playwright/test": "^1.50.1", - "@tsconfig/node22": "^22.0.0", - "@types/jsdom": "^21.1.7", - "@types/node": "^22.13.4", - "@vitejs/plugin-vue": "^5.2.1", - "@vitest/eslint-plugin": "1.1.31", - "@vue/eslint-config-prettier": "^10.2.0", - "@vue/eslint-config-typescript": "^14.4.0", - "@vue/test-utils": "^2.4.6", - "@vue/tsconfig": "^0.7.0", - "eslint": "^9.20.1", - "eslint-plugin-playwright": "^2.2.0", - "eslint-plugin-vue": "^9.32.0", - "jiti": "^2.4.2", - "jsdom": "^26.0.0", - "npm-run-all2": "^7.0.2", - "prettier": "^3.5.1", - "typescript": "~5.7.3", - "vite": "^6.1.0", - "vite-plugin-vue-devtools": "^7.7.2", - "vitest": "^3.0.5", - "vue-tsc": "^2.2.2" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@antfu/utils": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", - "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@asamuzakjp/css-color": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.3.tgz", - "integrity": "sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.1", - "@csstools/css-color-parser": "^3.0.7", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", - "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.26.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.9" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", - "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-decorators": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", - "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", - "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", - "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", - "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", - "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", - "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.3" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", - "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", - "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", - "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.6.tgz", - "integrity": "sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.11.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@playwright/test": { - "version": "1.50.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.50.1.tgz", - "integrity": "sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.50.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@tsconfig/node22": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/@tsconfig/node22/-/node22-22.0.0.tgz", - "integrity": "sha512-twLQ77zevtxobBOD4ToAtVmuYrpeYUh3qh+TEp+08IWhpsrIflVHqQ1F1CiPxQGL7doCdBIOOCF+1Tm833faNg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jsdom": { - "version": "21.1.7", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", - "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", - "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", - "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/type-utils": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", - "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", - "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", - "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", - "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", - "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", - "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", - "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.24.1", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", - "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vitest/eslint-plugin": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.31.tgz", - "integrity": "sha512-xlsLr+e+AXZ/00eVZCtNmMeCJoJaRCoLDiAgLcxgQjSS1EertieB2MUHf8xIqPKs9lECc/UpL+y1xDcpvi02hw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@typescript-eslint/utils": ">= 8.0", - "eslint": ">= 8.57.0", - "typescript": ">= 5.0.0", - "vitest": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@vitest/expect": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.6.tgz", - "integrity": "sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.0.6", - "@vitest/utils": "3.0.6", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.6.tgz", - "integrity": "sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.0.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.6.tgz", - "integrity": "sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.6.tgz", - "integrity": "sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.0.6", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.6.tgz", - "integrity": "sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.0.6", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.6.tgz", - "integrity": "sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.6.tgz", - "integrity": "sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.0.6", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@volar/language-core": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", - "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.11" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", - "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", - "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.11", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, - "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz", - "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/babel-plugin-jsx": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz", - "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.6", - "@babel/types": "^7.25.6", - "@vue/babel-helper-vue-transform-on": "1.2.5", - "@vue/babel-plugin-resolve-type": "1.2.5", - "html-tags": "^3.3.1", - "svg-tags": "^1.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - } - } - }, - "node_modules/@vue/babel-plugin-resolve-type": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz", - "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/parser": "^7.25.6", - "@vue/compiler-sfc": "^3.5.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", - "license": "MIT" - }, - "node_modules/@vue/devtools-core": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.2.tgz", - "integrity": "sha512-lexREWj1lKi91Tblr38ntSsy6CvI8ba7u+jmwh2yruib/ltLUcsIzEjCnrkh1yYGGIKXbAuYV2tOG10fGDB9OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.2", - "@vue/devtools-shared": "^7.7.2", - "mitt": "^3.0.1", - "nanoid": "^5.0.9", - "pathe": "^2.0.2", - "vite-hot-client": "^0.2.4" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/@vue/devtools-core/node_modules/nanoid": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.0.tgz", - "integrity": "sha512-zDAl/llz8Ue/EblwSYwdxGBYfj46IM1dhjVi8dyp9LQffoIGxJEAHj2oeZ4uNcgycSRcQ83CnfcZqEJzVDLcDw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz", - "integrity": "sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^7.7.2", - "birpc": "^0.2.19", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.1" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz", - "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/eslint-config-prettier": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-10.2.0.tgz", - "integrity": "sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-prettier": "^5.2.2" - }, - "peerDependencies": { - "eslint": ">= 8.21.0", - "prettier": ">= 3.0.0" - } - }, - "node_modules/@vue/eslint-config-typescript": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.4.0.tgz", - "integrity": "sha512-daU+eAekEeVz3CReE4PRW25fe+OJDKwE28jHN6LimDEnuFMbJ6H4WGogEpNof276wVP6UvzOeJQfLFjB5mW29A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^8.23.0", - "fast-glob": "^3.3.3", - "typescript-eslint": "^8.23.0", - "vue-eslint-parser": "^9.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^9.10.0", - "eslint-plugin-vue": "^9.28.0", - "typescript": ">=4.8.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.2.tgz", - "integrity": "sha512-QotO41kurE5PLf3vrNgGTk3QswO2PdUFjBwNiOi7zMmGhwb25PSTh9hD1MCgKC06AVv+8sZQvlL3Do4TTVHSiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "~2.4.11", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^1.0.3", - "minimatch": "^9.0.3", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "vue": "3.5.13" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "license": "MIT" - }, - "node_modules/@vue/test-utils": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz", - "integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-beautify": "^1.14.9", - "vue-component-type-helpers": "^2.0.0" - } - }, - "node_modules/@vue/tsconfig": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.7.0.tgz", - "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": "5.x", - "vue": "^3.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vue": { - "optional": true - } - } - }, - "node_modules/abbrev": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", - "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/alien-signals": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.3.tgz", - "integrity": "sha512-zQOh3wAYK5ujENxvBBR3CFGF/b6afaSzZ/c9yNhJ1ENrGHETvpUuKQsa93Qrclp0+PzTF93MaZ7scVp1uUozhA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/birpc": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", - "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001700", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", - "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", - "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^2.8.2", - "rrweb-cssom": "^0.8.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" - }, - "bin": { - "editorconfig": "bin/editorconfig" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.102", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", - "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-stack-parser-es": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", - "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", - "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.11.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.20.0", - "@eslint/plugin-kit": "^0.2.5", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", - "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "build/bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-playwright": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.2.0.tgz", - "integrity": "sha512-qSQpAw7RcSzE3zPp8FMGkthaCWovHZ/BsXtpmnGax9vQLIovlh1bsZHEa2+j2lv9DWhnyeLM/qZmp7ffQZfQvg==", - "dev": true, - "license": "MIT", - "workspaces": [ - "examples" - ], - "dependencies": { - "globals": "^13.23.0" - }, - "engines": { - "node": ">=16.6.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/eslint-plugin-playwright/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", - "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-vue": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.32.0.tgz", - "integrity": "sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "globals": "^13.24.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.3", - "vue-eslint-parser": "^9.4.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-vue/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.2.tgz", - "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.3", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.0", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.5.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/expect-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", - "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", - "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-beautify": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.3.tgz", - "integrity": "sha512-rKKGuyTxGNlyN4EQKWzNndzXpi0bOl8Gl8YQAW1as/oMz0XhD6sHJO1hTvoBDOSzKuJb9WkwoAb34FfdkKMv2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^1.0.4", - "glob": "^10.4.2", - "js-cookie": "^3.0.5", - "nopt": "^8.0.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", - "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.1", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.0.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, - "license": "MIT" - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-run-all2": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-7.0.2.tgz", - "integrity": "sha512-7tXR+r9hzRNOPNTvXegM+QzCuMjzUIIq66VDunL6j60O4RrExx32XUhlrS7UK4VcdGw5/Wxzb3kfNcFix9JKDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "cross-spawn": "^7.0.6", - "memorystream": "^0.3.1", - "minimatch": "^9.0.0", - "pidtree": "^0.6.0", - "read-package-json-fast": "^4.0.0", - "shell-quote": "^1.7.3", - "which": "^5.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "npm-run-all2": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0", - "npm": ">= 9" - } - }, - "node_modules/npm-run-all2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm-run-all2/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/npm-run-all2/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", - "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/playwright": { - "version": "1.50.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.50.1.tgz", - "integrity": "sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.50.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.50.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.50.1.tgz", - "integrity": "sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz", - "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-ms": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", - "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-ms": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "license": "ISC" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/read-package-json-fast": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", - "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==", - "dev": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "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/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/superjson": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", - "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "6.1.77", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.77.tgz", - "integrity": "sha512-lBpoWgy+kYmuXWQ83+R7LlJCnsd9YW8DGpZSHhrMl4b8Ly/1vzOie3OdtmUJDkKxcgRGOehDu5btKkty+JEe+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.77" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.77", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.77.tgz", - "integrity": "sha512-bCaqm24FPk8OgBkM0u/SrEWJgHnhBWYqeBo6yUmcZJDCHt/IfyWBb+14CXdGi4RInMv4v7eUAin15W0DoA+Ytg==", - "dev": true, - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.1.tgz", - "integrity": "sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/ts-api-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", - "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", - "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.24.1", - "@typescript-eslint/parser": "8.24.1", - "@typescript-eslint/utils": "8.24.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true, - "license": "MIT" - }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", - "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.5.2", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-hot-client": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.4.tgz", - "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/vite-node": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.6.tgz", - "integrity": "sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-inspect": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz", - "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@antfu/utils": "^0.7.10", - "@rollup/pluginutils": "^5.1.3", - "debug": "^4.3.7", - "error-stack-parser-es": "^0.1.5", - "fs-extra": "^11.2.0", - "open": "^10.1.0", - "perfect-debounce": "^1.0.0", - "picocolors": "^1.1.1", - "sirv": "^3.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - } - } - }, - "node_modules/vite-plugin-vue-devtools": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.2.tgz", - "integrity": "sha512-5V0UijQWiSBj32blkyPEqIbzc6HO9c1bwnBhx+ay2dzU0FakH+qMdNUT8nF9BvDE+i6I1U8CqCuJiO20vKEdQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-core": "^7.7.2", - "@vue/devtools-kit": "^7.7.2", - "@vue/devtools-shared": "^7.7.2", - "execa": "^9.5.1", - "sirv": "^3.0.0", - "vite-plugin-inspect": "0.8.9", - "vite-plugin-vue-inspector": "^5.3.1" - }, - "engines": { - "node": ">=v14.21.3" - }, - "peerDependencies": { - "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/vite-plugin-vue-inspector": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz", - "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.0", - "@babel/plugin-proposal-decorators": "^7.23.0", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.22.15", - "@vue/babel-plugin-jsx": "^1.1.5", - "@vue/compiler-dom": "^3.3.4", - "kolorist": "^1.8.0", - "magic-string": "^0.30.4" - }, - "peerDependencies": { - "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/vitest": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.6.tgz", - "integrity": "sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "3.0.6", - "@vitest/mocker": "3.0.6", - "@vitest/pretty-format": "^3.0.6", - "@vitest/runner": "3.0.6", - "@vitest/snapshot": "3.0.6", - "@vitest/spy": "3.0.6", - "@vitest/utils": "3.0.6", - "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.1.0", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "std-env": "^3.8.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.6", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.6", - "@vitest/ui": "3.0.6", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-component-type-helpers": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.2.tgz", - "integrity": "sha512-6lLY+n2xz2kCYshl59mL6gy8OUUTmkscmDFMO8i7Lj+QKwgnIFUZmM1i/iTYObtrczZVdw7UakPqDTGwVSGaRg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-eslint-parser": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-router": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", - "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-tsc": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.2.tgz", - "integrity": "sha512-1icPKkxAA5KTAaSwg0wVWdE48EdsH8fgvcbAiqojP4jXKl6LEM3soiW1aG/zrWrFt8Mw1ncG2vG1PvpZpVfehA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/typescript": "~2.4.11", - "@vue/language-core": "2.2.2" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": ">=5.0.0" - } - }, - "node_modules/vuetify": { - "version": "3.7.12", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.12.tgz", - "integrity": "sha512-cBxWXKPNl3vWc10/EEpfK4RBrCZERAHEUZCWmrJPd6v+JU0sbm4sEgIpy8IU5d1BzA1kIhknpbgYy2IqiZponA==", - "license": "MIT", - "engines": { - "node": "^12.20 || >=14.13" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/johnleider" - }, - "peerDependencies": { - "typescript": ">=4.7", - "vite-plugin-vuetify": ">=1.0.0", - "vue": "^3.3.0", - "webpack-plugin-vuetify": ">=2.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vite-plugin-vuetify": { - "optional": true - }, - "webpack-plugin-vuetify": { - "optional": true - } - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", - "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", - "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package-lock.json b/package-lock.json index a00e4f54..55c5eb00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "dwengo-1-monorepo", "version": "0.0.1", + "license": "MIT", "workspaces": [ "backend", "frontend" @@ -26,7 +27,6 @@ "backend": { "name": "dwengo-1-backend", "version": "0.0.1", - "license": "MIT", "dependencies": { "@mikro-orm/core": "^6.4.6", "@mikro-orm/postgresql": "^6.4.6", @@ -1487,6 +1487,91 @@ "node": ">=12" } }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jercle/yargonaut": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@jercle/yargonaut/-/yargonaut-1.1.5.tgz", @@ -1783,6 +1868,13 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", @@ -2547,16 +2639,6 @@ } } }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@vitest/pretty-format": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.6.tgz", @@ -2720,6 +2802,12 @@ "source-map-js": "^1.2.0" } }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/@vue/compiler-dom": { "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", @@ -2747,6 +2835,12 @@ "source-map-js": "^1.2.0" } }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/@vue/compiler-ssr": { "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", @@ -3070,23 +3164,20 @@ } }, "node_modules/alien-signals": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.3.tgz", - "integrity": "sha512-zQOh3wAYK5ujENxvBBR3CFGF/b6afaSzZ/c9yNhJ1ENrGHETvpUuKQsa93Qrclp0+PzTF93MaZ7scVp1uUozhA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.4.tgz", + "integrity": "sha512-DJqqQD3XcsaQcQ1s+iE2jDUZmmQpXwHiR6fCAim/w87luaW+vmLY8fMlrdkmRwzaFXhkxf3rqPCR59tKVv1MDw==", "dev": true, "license": "MIT" }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/ansi-styles": { @@ -3411,69 +3502,6 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/code-block-writer": { "version": "13.0.3", "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", @@ -3915,9 +3943,9 @@ "license": "ISC" }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, @@ -4409,10 +4437,14 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/esutils": { "version": "2.0.3", @@ -4824,9 +4856,9 @@ } }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6609,6 +6641,21 @@ "node": ">=18" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", @@ -7378,21 +7425,18 @@ "license": "MIT" }, "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/string-width-cjs": { @@ -7411,24 +7455,7 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -7441,22 +7468,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", @@ -7471,16 +7482,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7648,22 +7649,22 @@ } }, "node_modules/tldts": { - "version": "6.1.77", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.77.tgz", - "integrity": "sha512-lBpoWgy+kYmuXWQ83+R7LlJCnsd9YW8DGpZSHhrMl4b8Ly/1vzOie3OdtmUJDkKxcgRGOehDu5btKkty+JEe+g==", + "version": "6.1.78", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.78.tgz", + "integrity": "sha512-fSgYrW0ITH0SR/CqKMXIruYIPpNu5aDgUp22UhYoSrnUQwc7SBqifEBFNce7AAcygUPBo6a/gbtcguWdmko4RQ==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.77" + "tldts-core": "^6.1.78" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.77", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.77.tgz", - "integrity": "sha512-bCaqm24FPk8OgBkM0u/SrEWJgHnhBWYqeBo6yUmcZJDCHt/IfyWBb+14CXdGi4RInMv4v7eUAin15W0DoA+Ytg==", + "version": "6.1.78", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.78.tgz", + "integrity": "sha512-jS0svNsB99jR6AJBmfmEWuKIgz91Haya91Z43PATaeHJ24BkMoNRb/jlaD37VYjb0mYf6gRL/HOnvS1zEnYBiw==", "dev": true, "license": "MIT" }, @@ -7833,22 +7834,6 @@ "fsevents": "~2.3.3" } }, - "node_modules/tsx/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8686,21 +8671,6 @@ "@esbuild/win32-x64": "0.24.2" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/vitest": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.6.tgz", @@ -8899,9 +8869,9 @@ } }, "node_modules/vuetify": { - "version": "3.7.12", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.12.tgz", - "integrity": "sha512-cBxWXKPNl3vWc10/EEpfK4RBrCZERAHEUZCWmrJPd6v+JU0sbm4sEgIpy8IU5d1BzA1kIhknpbgYy2IqiZponA==", + "version": "3.7.13", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.13.tgz", + "integrity": "sha512-4+RuQU+zLtXhlN2eZUpKXums9ftzUzhMeiNEJvvJY4XdOzVwUCth2dTnEZkSF6EKdLHk3WhtRk0cIWXZxpBvcw==", "license": "MIT", "engines": { "node": "^12.20 || >=14.13" @@ -9055,18 +9025,18 @@ } }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -9091,64 +9061,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9249,51 +9161,6 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", From 4186e7c7d4904bb2ddf9b1c6355f0764569c37d6 Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Sat, 22 Feb 2025 22:55:27 +0100 Subject: [PATCH 02/92] feat(backend): theme routes in different languages --- _i18n/de.yml | 326 +++++++++++++++++++++++++++++++ _i18n/en.yml | 327 +++++++++++++++++++++++++++++++ _i18n/fr.yml | 334 ++++++++++++++++++++++++++++++++ _i18n/nl.yml | 364 +++++++++++++++++++++++++++++++++++ backend/package.json | 4 +- backend/src/app.ts | 7 +- backend/src/routes/themes.ts | 177 +++++++++++++++++ package-lock.json | 17 +- package.json | 3 + 9 files changed, 1553 insertions(+), 6 deletions(-) create mode 100644 _i18n/de.yml create mode 100644 _i18n/en.yml create mode 100644 _i18n/fr.yml create mode 100644 _i18n/nl.yml create mode 100644 backend/src/routes/themes.ts diff --git a/_i18n/de.yml b/_i18n/de.yml new file mode 100644 index 00000000..3356a9aa --- /dev/null +++ b/_i18n/de.yml @@ -0,0 +1,326 @@ +# translate theme pages + +curricula_page: + title: Unsere Unterrichtsthemen + read_more: Lees meer + curricula_files: Bestanden + algorithms: + title: Algorithmen + sub_title: Algorithmen + description: "Schüler der zweiten und dritten Klasse (Sekundarstufe) lernen, wie sie Algorithmen verwenden können, um Probleme zu lösen. Sie lernen, wie sie Algorithmen entwerfen und die Effizienz von Algorithmen analysieren können. Sie lernen auch, wie sie Algorithmen zur Problemlösung einsetzen können." + contact: "" + teaser: https://www.youtube.com/embed/2B6gZ9HdQ1Y + basics_ai: + title: Basisprincipes van AI + sub_title: Basisprincipes van AI + description: "Onder dit lesthema bundelen we verschillende activiteiten waarin de basisprincipes van artificiële intelligentie (AI) aan bod komen. Leerlingen leren wat AI is, hoe het werkt en hoe het kan worden toegepast in verschillende domeinen." + contact: "" + kiks: + title: KI und Klima + sub_title: KIKS + description: "Schülerinnen und Schüler der dritten Klasse (SO) erforschen, wie Pflanzen sich über ihre Spaltöffnungen an den Klimawandel anpassen. Dazu zählen sie diese Spaltöffnungen mit künstlicher Intelligenz und Bilderkennung." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + curricula_files: + - file_title: "Projektblatt KIKS" + file_info: "Dies ist ein kurzer Überblick über das KIKS-Projekt mit Projektstruktur und -merkmalen." + file_location: "/assets/files/kiks/projectfiche_kiks.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Die Anleitung - auch in gedruckter Version erhältlich" + file_info: "Wir möchten den Lehrern Hintergrundwissen über den Inhalt dieses Projekts vermitteln: den Klimawandel, die Biologie der Spaltöffnungen und die Art und Weise, wie Pflanzen sich über die Spaltöffnungen an den Klimawandel anpassen, die wissenschaftliche Forschung der UGent und des Plantentuin Meise, die Bürgerwissenschaft, was künstliche Intelligenz (KI) ist, die Geschichte von KI, ihre Anwendung und Ethik, die Prinzipien digitaler Bilder, die Mathematik hinter den Algorithmen und die Grundlagen der derzeit am häufigsten verwendeten KI-Techniken. Wir zeigen auch, wie wir mit KIKS im Unterricht gearbeitet haben." + file_location: "/assets/files/kiks/KIKS_handleiding_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Ein Schülerkurs" + file_info: "Mit dem Schülerkurs geben wir ein Beispiel für einen möglichen, umfassenden Weg, den ein Lehrer mit den Schülern gehen kann. Der Weg umfasst den Klimawandel, die Biologie der Spaltöffnungen mit einer Mikroskopie-Aufgabe, die Art und Weise, wie Pflanzen sich über die Spaltöffnungen an den Klimawandel anpassen, die wissenschaftliche Forschung der UGent und des Plantentuin Meise, das Sammeln von Daten zur Schulung eines neuronalen Netzwerks, was künstliche Intelligenz (KI) ist, die Geschichte von KI, ihre Anwendung und Ethik, die Prinzipien digitaler Bilder, das Arbeiten mit Convolutional Neural Networks, die Mathematik hinter dem Perceptron-Algorithmus, das lineare und nicht-lineare Klassifizieren von Daten und die Grundlagen des maschinellen Lernens." + file_location: "/assets/files/kiks/KIKS_leerlingencursus_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Die Lehrziele" + file_info: "Im Rahmen des KIKS-Projekts können viele Lehrziele erreicht werden. Der Lehrer entscheidet selbst, welche Lehrziele mit dem Projekt in Verbindung gebracht werden. Darüber hinaus bietet das Projekt viele Möglichkeiten, die Schüler aktiv und selbstständig lernen zu lassen und ICT-Kenntnisse zu vermitteln. KIKS kann auch verwendet werden, um eine Forschungsaufgabe zu entwickeln. In den Endzielen und Lehrplänen der verschiedenen Verbände finden sich viele Lehrziele, die KIKS mit Biologie, Geografie und Mathematik verknüpfen." + file_location: "/assets/files/kiks/Leerdoelen-KIKS.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Das Erstellen eines Nagellaktabdrucks eines Blattteils" + file_info: "Um die Anzahl der Spaltöffnungen auf einem Teil eines Blattes einer Pflanze zu kennen, betrachten wir die Blattoberfläche unter dem Mikroskop. Wir können dazu einen Teil der dünnen Cuticula des Blattes entfernen, aber bei einigen Pflanzen gelingt das nicht so gut, zum Beispiel aufgrund der Steifheit des Blattes. Dies kann jedoch aufgefangen werden, indem die gleiche Methode verwendet wird wie die Forscher des Plantentuin Meise, nämlich einen Abdruck eines Teils der Blattoberfläche mit transparentem Nagellack zu machen. Das mikroskopische Bild kann mit einem Smartphone fotografiert werden." + file_location: "https://vimeo.com/467062270" + file_icon_name: "play_arrow" + link_name: "Ansehen" + socialrobot: + title: Sozialer Roboter + sub_title: Robotik im Klassenzimmer + description: "Während Schülerinnen und Schüler der ersten Klasse (SO) einen sozialen Roboter basteln und programmieren, lernen sie komplexe Probleme durch computational thinking zu lösen. Auf spielerische Weise arbeiten sie an den neuen Endzielen für digitale Kompetenzen." + contact: Fragen? Kontaktieren Sie uns unter team@aiopschool.be. Die Presse kann sich an Francis Wyffels wenden unter Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Projektblatt Sozialer Roboter" + file_info: "Dies ist ein kurzer Überblick über das Projekt 'Sozialer Roboter' mit Projektstruktur und -merkmalen." + file_location: "/assets/files/socialrobot/projectfiche_socialerobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Collage sozialer Roboter" + file_info: "Die Roboter auf diesem Foto sind Arbeiten von Schülern der ersten Klasse der Sekundarstufe oder Prototypen." + file_location: "/assets/files/socialrobot/collage.png" + file_icon_name: "description" + link_name: "Download" + - file_title: "Bausatz für das 'Sozialer Roboter'-Projekt" + file_info: "Möchten Sie, dass Ihre Schülerinnen und Schüler auch einen sozialen Roboter entwerfen und bauen? Das geht mit dem Bausatz von Dwengo vzw. Auf der Abbildung sehen Sie die aktuelle Zusammensetzung des Bausatzes. Interessiert? Kontaktieren Sie uns per E-Mail oder finden Sie weitere Informationen auf dieser Projektseite." + file_location: "/assets/files/socialrobot/constructiekit_socialerobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Vom Projekt zu den Endzielen" + file_info: "Die Endziele, an denen gearbeitet werden kann, werden mit den verschiedenen Phasen des Projekts 'Sozialer Roboter' verknüpft." + file_location: "/assets/files/socialrobot/EindtermenAStroomSsocialeRobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotionsmaschine (unvollständig) - Computational Thinking (unplugged Aktivität)" + file_info: "Unplugged Aktivität" + file_location: "/assets/files/socialrobot/emotiemachine_gewoon_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotionsmaschine (Aufgabe) - Computational Thinking (unplugged Aktivität)" + file_info: "Unplugged Aktivität" + file_location: "/assets/files/socialrobot/emotiemachine_gids.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotionsmaschine (vollständig) - Computational Thinking (unplugged Aktivität)" + file_info: "Unplugged Aktivität" + file_location: "/assets/files/socialrobot/emotiemachine_ingevuld_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotionsmaschine mit LED-Matrix - Computational Thinking (unplugged Aktivität)" + file_info: "Unplugged Aktivität" + file_location: "/assets/files/socialrobot/emotiemachine_matrices_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Lehrerhandbuch" + file_info: "Die gebündelten Handbücher, in denen die Verwendung des Dwenguino und der Sensoren und Aktuatoren erklärt wird." + file_location: "/assets/files/socialrobot/ficheboekje_lkn.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Handbücher für Schülerinnen und Schüler" + file_info: "In diesen Handbüchern wird die Verwendung des Dwenguino und der Sensoren und Aktuatoren erklärt." + file_location: "/assets/files/socialrobot/fichesSocialeRobot_lln.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Erstelle ein Gesicht - Computational Thinking (unplugged Aktivität)" + file_info: "Unplugged Aktivität" + file_location: "/assets/files/socialrobot/maakeengezicht_activiteit.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Aufgaben der Übungen im MOOC" + file_info: "Eine Übersicht über die Programmieraufgaben im MOOC." + file_location: "/assets/files/socialrobot/Opgaven_MOOC.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Poster 'Sozialer Roboter'-Projekt" + file_info: "Das Poster zeigt die verschiedenen Aspekte des Projekts." + file_location: "/assets/files/socialrobot/posterSocialeRobot_nl_Qo4ANmV.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Handbuch 'Hallo Roboter!'" + file_info: "Mit diesem Lehrbuch bringen Sie Ihren eigenen sozialen Roboter zum Leben." + file_location: "/assets/files/socialrobot/handleiding_hallo_robot.pdf" + file_icon_name: "description" + link_name: "Download" + chatbot: + title: Sprachtechnologie in der Schule + sub_title: Mit einem Chatbot arbeiten + description: "Wo Sprache und Technologie aufeinandertreffen, entsteht das Gebiet des Natural Language Processing. Kann ein Computer Texte verstehen, übersetzen oder sogar schreiben? Kann ein Computer Emotionen erkennen? Schülerinnen und Schüler der zweiten und dritten Klasse (SO) lernen in diesem Paket alles darüber." + contact: Fragen? Kontaktieren Sie uns unter team@aiopschool.be. Die Presse kann sich an Francis Wyffels wenden unter Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Projektblatt Chatbot" + file_info: "Dies ist ein kurzer Überblick über das Chatbot-Projekt mit Projektstruktur und -merkmalen." + file_location: "/assets/files/chatbot/projectfiche_chatbot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "BrAInfood Chatbots" + file_info: "In diesem brAInfood - für Jugendliche konzipiert - gibt das Zentrum für Daten & Gesellschaft weitere Informationen zu Chatbots. Das brAInfood enthält eine fiktive Geschichte über Lotte, die mit einem Chatbot spricht und vermutlich Informationen über sie an Unternehmen weitergibt. Es werden auch einige Punkte zu Chatbots erläutert sowie einige Tipps für Jugendliche, um ihre (personenbezogenen) Daten besser zu schützen. Auf diese Weise möchten wir Jugendliche für die Funktionsweise von Chatbots sensibilisieren und sie dazu anregen, über die gesammelten Daten nachzudenken." + file_location: "/assets/files/chatbot/Brainfood13_Chatbots_NL.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "BrAInfood Personalisierte Nachrichten" + file_info: "In diesem brAInfood des Zentrums für Daten & Gesellschaft werden Tipps gegeben, wie Sie die Kontrolle über Ihren Nachrichten-Feed behalten können." + file_location: "/assets/files/chatbot/brainfoodaanbevelingnieuws.jpg" + file_icon_name: "description" + link_name: "Download" + - file_title: "Handbuch 'Chatbot' - Auch in gedruckter Form erhältlich" + file_info: "Lehrkräfte erhalten über dieses Handbuch ausreichend Hintergrundinformationen, um mit (einem Teil des) Projekts 'Chatbot' im Klassenzimmer zu arbeiten. Das Buch behandelt verschiedene Aspekte der Sprachtechnologie, wie die Geschichte der künstlichen Intelligenz, ethische Aspekte, Sentimentanalyse und Cybermobbingerkennung, Chatbots, sprechende digitale Assistenten und Autorenerkennung. Es wird auch auf die STEM-Endziele sowie die Endziele zu digitaler Kompetenz und Medienkompetenz eingegangen." + file_location: "/assets/files/chatbot/Chatbot_handleiding_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Improbotics - Lehrermappe - Lehrerfassung" + file_info: "In der Theateraufführung Improbotics improvisiert ein sozialer Roboter in den Szenen mit. In der Mappe für Lehrkräfte finden Sie Informationen zu den verwendeten Technologien." + file_location: "/assets/files/chatbot/Improbotics_lesmap_Leerkracht.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Improbotics - Lehrermappe - Schülerinnen und Schüler" + file_info: "In der Theateraufführung Improbotics improvisiert ein sozialer Roboter in den Szenen mit. In der Mappe finden Sie Informationen zu den verwendeten Technologien." + file_location: "/assets/files/chatbot/Improbotics_lesmap_Leerling.pdf" + file_icon_name: "description" + link_name: "Download" + care: + title: KI im Gesundheitswesen + sub_title: KI-Systeme, die im Gesundheitswesen helfen + description: "Krankenhäuser machen bereits heute Gebrauch von künstlicher Intelligenz. Schülerinnen und Schüler der zweiten und dritten Klasse (SO) entdecken, welche Systeme existieren und wie sie Ärzte bei Entscheidungen unterstützen. Auf diese Weise lernen die Schülerinnen und Schüler die Prinzipien des Entscheidungsbaums, einer weit verbreiteten Technik im maschinellen Lernen." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + curricula_files: + - file_title: "Projektblatt KI im Gesundheitswesen" + file_info: "Dies ist ein kurzer Überblick über das Projekt KI im Gesundheitswesen mit Projektstruktur und -merkmalen." + file_location: "/assets/files/care/projectfiche_aiindezorg.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Sprouts" + file_info: "Ein Spiel zur Einführung in 'Graphen'." + file_location: "/assets/files/care/Sprouts.mov" + file_icon_name: "play_arrow" + link_name: "Download" + - file_title: "Erklärung zu Übungen mit Graphen aus dem Schülerkurs" + file_info: "Welche Figuren repräsentieren denselben Graphen? Eine formalere Methode." + file_location: "/assets/files/care/dezelfdegraafFormeel.mov" + file_icon_name: "play_arrow" + link_name: "Download" + - file_title: "Erklärung zu Übungen mit Graphen aus dem Schülerkurs" + file_info: "Welche Figuren repräsentieren denselben Graphen? Eine Methode mit Farben." + file_location: "/assets/files/care/dezelfdeGraaf.mov" + file_icon_name: "play_arrow" + link_name: "Download" + - file_title: "Der Schülerkurs - Ziel Durchfluss" + file_info: "Schülerkurs" + file_location: "/assets/files/care/AIindeZorg_doorstroom_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Kartenset - Auch in gedruckter Form erhältlich" + file_info: "Mit diesem Kartenset können Lehrer die Schüler über ethische Aspekte neuer Technologien nachdenken lassen. Wie steht es um die Privatsphäre? Werden soziale Kontakte beeinträchtigt? Welche Technologien werden begeistert aufgenommen? Was ist nicht wünschenswert? Sind die neuen Technologien für alle erschwinglich?" + file_location: "/assets/files/care/Kaartset_AIIndeZorg_AIOpSchool_Dwengo.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Anleitung für das Kartenset" + file_info: "Diese Anleitung bietet zusätzliche Erläuterungen zum Kartenset." + file_location: "/assets/files/care/AIIndeZorgKaartenset_UitlegVoorLeerkracht.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Entscheidungsbaum 'mBrAIn'-Projekt in nicht kompakter Form" + file_info: "Im Forschungsprojekt 'mBrain', das die Entwicklung einer App zum Vorhersagen eines Migräneanfalls zum Ziel hat, wurde ein Entscheidungsbaum erstellt. Mit diesem Entscheidungsbaum wird ein Problem der binären Klassifikation angegangen: Es gibt nur zwei Klassen: 'Migräne' und 'Keine Migräne'. (Quellen: Femke Ongenae. (2021), UGent; Van Hoecke, S., Ongenae, F., Paemeleire, K., & Vandenbussche, N. (2020). App muss Kopfschmerzen vorhersagen. EOS Wissenschaftsspezial, Technologie und Gesundheit, 25.) Wir haben die Form dieses Entscheidungsbaums in einen binären Entscheidungsbaum umgewandelt, um zu zeigen, dass diese Form nicht immer benutzerfreundlich ist. Weitere Informationen finden Sie im vierten Kapitel des Schülerkurses dieses Projekts." + file_location: "/assets/files/care/MBrainBeslissingsboom.png" + file_icon_name: "description" + link_name: "Download" + - file_title: "Suche nach Sprache - Computerdenken (unplugged Aktivität)" + file_info: "Das Locked-In-Syndrom ist eine der schlimmsten medizinischen Erkrankungen. Man ist vollständig gelähmt, außer dass man vielleicht noch mit einem Auge blinzeln kann. Der intelligente Geist ist in einem nutzlosen Körper eingesperrt: Man kann alles fühlen, aber nicht kommunizieren. Es kann jedem passieren, aus dem Nichts, als Folge eines Schlaganfalls. Wenn Sie Menschen mit dem Locked-In-Syndrom helfen möchten, ist es besser, Arzt oder Krankenschwester zu werden? Oder kann man als Informatiker auch helfen?" + file_location: "/assets/files/care/ZoektochtNaarSpraak.pdf" + file_icon_name: "description" + link_name: "Download" + stem: + title: Python in MINT + sub_title: Datavisualisierungen mit Python + description: "In diesem Paket lernen Sie, komplexe Probleme einfacher und schneller mit der Programmiersprache Python zu lösen. Programmieren kann nämlich eine verbindende Rolle zwischen Wissenschaft, Technik, Design und angewandter Mathematik spielen. Kurz gesagt, dank Python holen wir das Beste aus MINT heraus." + contact: Fragen? Kontaktieren Sie uns unter team@aiopschool.be. Die Presse kann sich an Francis Wyffels unter Francis@dwengo.org wenden. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + agriculture: + title: KI in der Landwirtschaft + sub_title: KI in der Landwirtschaft + description: "Verfaulte Tomaten während der Ernte entfernen? Künstliche Intelligenz kann dabei helfen. Aber wie? Schülerinnen und Schüler der zweiten und dritten Klasse (SO) setzen KI ein. Vielleicht kann ein vibrierendes Laufband das System noch verbessern?" + contact: Fragen? Kontaktieren Sie uns unter team@aiopschool.be. Die Presse kann sich an Francis Wyffels unter Francis@dwengo.org wenden. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Design" + file_info: "Design des Laufbands" + file_location: "/assets/files/art/Transportband_InnoVET_RCH.zip" + file_icon_name: "description" + link_name: "Download" + art: + title: KI in der Kunst + sub_title: Zeichenroboter im Unterricht + description: "Können wir Kunst mit künstlicher Intelligenz schaffen? Schülerinnen und Schüler der zweiten und dritten Klasse (SO) setzen sich kreativ mit KI auseinander und reflektieren über das Ergebnis. Ist das Kunst? Sie entdecken auch, wie KI unser kulturelles Erbe schützen kann." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + wegostem: + title: WeGoSTEM + sub_title: Zeichenroboter im Unterricht + description: "Wir fordern Kinder der dritten Klasse (GS) heraus, einen zeichnenden Kunstroboter zu programmieren. Spielerisch lernen die Kinder viele MINT-Fähigkeiten, von Technik bis zum algorithmischen Denken." + contact: Fragen? Kontaktieren Sie uns unter team@aiopschool.be. Die Presse kann sich an Francis Wyffels unter Francis@dwengo.org wenden. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + computational_thinking: + title: Algorithmisches Denken + sub_title: Algorithmisches Denken im Unterricht + description: "Wie können wir komplexe Probleme mithilfe eines Computers lösen? Dank algorithmischem Denken! Das können Sie durch verschiedene Aktivitäten mit oder ohne Computer lernen. Wir helfen Ihnen gerne auf dem Weg." + contact: Fragen? Kontaktieren Sie uns unter team@aiopschool.be. Die Presse kann sich an Francis Wyffels unter Francis@dwengo.org wenden. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Konzepte und Ansätze des algorithmischen Denkens" + file_info: "Poster​" + file_location: "/assets/files/computational_thinking/CDposterDwengo2.png" + file_icon_name: "description" + link_name: "Download" + - file_title: "Erklärung der vier Konzepte des algorithmischen Denkens" + file_info: "Präsentation über die vier Konzepte des algorithmischen Denkens: Dekomposition, Mustererkennung, Abstraktion und Algorithmus. Sie können die PDF herunterladen > öffnen > präsentieren über CTRL-L und mit den Pfeiltasten navigieren." + file_location: "/assets/files/computational_thinking/CD4concepten_33V3gBg.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Konzepte und Prinzipien" + file_info: "Übersicht​" + file_location: "/assets/files/computational_thinking/Icoontjes.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged-Aktivität - Emotionsmaschine (Aufgabe)" + file_info: "Wie können Sie Emotionen bei einem Roboter fördern?​" + file_location: "/assets/files/computational_thinking/emotiemachine_gids.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged-Aktivität - Emotionsmaschine" + file_info: "Wie können Sie Emotionen bei einem Roboter fördern?​" + file_location: "/assets/files/computational_thinking/emotiemachine_gewoon_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged-Aktivität - Farben nach Zahlen" + file_info: "​Bilder können auf verschiedene Weisen dargestellt werden. Bei diesem Farben-nach-Zahlen-Rätsel müssen Sie ein Bild rekonstruieren, indem Sie die gegebene Liste von Zahlen verwenden. Diese Liste sagt Ihnen, welche Farbe Sie jedem Quadrat ('Pixel') zuordnen." + file_location: "/assets/files/computational_thinking/kleurenopnummer1.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged-Aktivität - Ein menschliches Computernetzwerk" + file_info: "In dieser Aktivität lernen die Schülerinnen und Schüler, wie die Datenübertragung im Internet funktioniert. Computer, Smartphones und andere Geräte, die über das Internet miteinander verbunden sind, können kommunizieren. Um sich gegenseitig zu verstehen, muss diese Kommunikation nach bestimmten Regeln erfolgen. Diese Regeln nennen wir Protokoll.​" + file_location: "/assets/files/computational_thinking/menselijkComputernetwerk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged-Aktivität - Komprimierung" + file_info: "Um Bilder über Netzwerke zu senden, möchten wir die Informationen mit möglichst wenig Daten darstellen. Hier kommt die Komprimierung ins Spiel. Mit Hilfe von Algorithmen werden Bilder mit möglichst wenigen Zahlen dargestellt, aber so, dass Sie das ursprüngliche Bild immer noch wiederherstellen können. Andere Algorithmen stellen das ursprüngliche Bild wieder her, wenn die Informationen ihr Ziel erreicht haben.​" + file_location: "/assets/files/computational_thinking/puzzel-gecomprimeerdepixel11.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged-Aktivität - Programmieren Sie einmal einen Menschen" + file_info: "Computer können nicht interpretieren und führen daher buchstäblich jede Anweisung aus, die Sie ihnen geben. Die Herausforderung für den Programmierer besteht darin, Probleme in kleine, vom Computer ausführbare Schritte zu zerlegen und dem Computer die Anweisungen auf die richtige Weise zu geben.​" + file_location: "/assets/files/computational_thinking/programmeerEensEenMens.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged-Aktivität - Suche nach Sprache" + file_info: "Das Locked-In-Syndrom ist eine der schlimmsten medizinischen Erkrankungen. Sie sind vollständig gelähmt, außer dass Sie vielleicht noch mit einem Auge blinzeln können. Ihr intelligenter Geist ist in einem nutzlosen Körper gefangen: Sie können alles fühlen, aber nicht kommunizieren. Es kann jedem passieren, aus dem Nichts, als Folge eines Schlaganfalls. Wenn Sie Menschen mit dem Locked-In-Syndrom helfen möchten, werden Sie am besten Arzt oder Krankenschwester? Oder kann Ihnen auch ein Informatiker helfen?​" + file_location: "/assets/files/computational_thinking/ZoektochtNaarSpraak.pdf" + file_icon_name: "description" + link_name: "Download" + math_with_python: + title: Python im Mathematikunterricht + sub_title: Python in der Mathematik + description: "Die Programmiersprache Python bietet interessante Möglichkeiten, den Mathematikunterricht zu bereichern. Von der Pythagoras-Theorie bis zur Erstellung eigener Grafiken, digitalen Bildverarbeitung und linearer Regression wird alles mit Python klarer." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + python_programming: + title: Programmieren mit Python + sub_title: Grundlagen des Programmierens in Python + description: "Die Grundprinzipien des Programmierens erlernen? Das ist perfekt möglich mit diesem Paket. Wir verwenden Python und lernen alles über Sequenzen, Wiederholungsstrukturen und Auswahlstrukturen. Genau das steht in den Endzielen. Und noch mehr!" + contact: Fragen? Kontaktieren Sie uns unter team@aiopschool.be. Die Presse kann sich an Francis Wyffels unter Francis@dwengo.org wenden. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + physical_computing: + title: Physical Computing + sub_title: Programmieren von Robotern im Unterricht + description: "Ein Musikinstrument, Auto oder Wetterstation bauen? Das geht mit Dwenguino, einer Mikrocontroller-Plattform mit einer eigenen Programmierumgebung. Schülerinnen und Schüler der Grundschule und der Sekundarstufe können sofort damit arbeiten. Echt oder in unserem Simulator, blockbasiert oder textuell." + contact: Fragen? Kontaktieren Sie uns unter team@aiopschool.be. Die Presse kann sich an Francis Wyffels unter Francis@dwengo.org wenden. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Bouw jouw eigen robot" + file_info: "Baue deinen eigenen fahrenden Roboter." + file_location: "/assets/files/physical_computing/bouwjouweigenrobot.pdf" + file_icon_name: "description" + link_name: "Download" diff --git a/_i18n/en.yml b/_i18n/en.yml new file mode 100644 index 00000000..60164f92 --- /dev/null +++ b/_i18n/en.yml @@ -0,0 +1,327 @@ +# translate theme pages + +curricula_page: + title: Our teaching topics + read_more: Read more + curricula_files: Files + algorithms: + title: Algorithms + sub_title: Algorithms + description: "Students in the second and third grade (secondary education) learn how to use algorithms to solve problems. They learn how to design algorithms and analyze the efficiency of algorithms. They also learn how to use algorithms to solve problems." + contact: "" + teaser: https://www.youtube.com/embed/2B6gZ9HdQ1Y + basics_ai: + title: Basisprincipes van AI + sub_title: Basisprincipes van AI + description: "Onder dit lesthema bundelen we verschillende activiteiten waarin de basisprincipes van artificiële intelligentie (AI) aan bod komen. Leerlingen leren wat AI is, hoe het werkt en hoe het kan worden toegepast in verschillende domeinen." + contact: "" + kiks: + title: AI and Climate + sub_title: KIKS + description: "Students in the third grade (SO) investigate how plants adapt to climate change through their stomata. They use artificial intelligence and image recognition to count these stomata." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + curricula_files: + - file_title: "Project Sheet KIKS" + file_info: "This is a brief overview of the KIKS project with project structure and characteristics." + file_location: "/assets/files/kiks/projectfiche_kiks.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "The manual - also available in print" + file_info: "We want to provide teachers with background knowledge about the content of this project: climate change, the biology of stomata, how plants adapt to climate change through stomata, the scientific research of UGent and Plantentuin Meise underlying this project, citizen science, what artificial intelligence (AI) is, the history of AI, its use and ethics, principles of digital images, mathematics behind algorithms, and foundations of currently most-used AI techniques. We also explain how we implemented KIKS in the classroom." + file_location: "/assets/files/kiks/KIKS_handleiding_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Student Course" + file_info: "With the student course, we provide an example of a possible, comprehensive trajectory that a teacher can go through with students. The trajectory includes climate change, the biology of stomata with a microscopy assignment, how plants adapt to climate change through stomata, the scientific research of UGent and Plantentuin Meise, collecting data to train a neural network, what artificial intelligence (AI) is, the history of AI, its use and ethics, principles of digital images, working with convolutions, mathematics behind the Perceptron algorithm, linear and non-linear classification of data, and foundations of machine learning." + file_location: "/assets/files/kiks/KIKS_leerlingencursus_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Curriculum Goals" + file_info: "Within the KIKS project, many curriculum goals can be addressed. The teacher determines which goals are related to the project. Moreover, the project offers many opportunities to actively engage and let students learn independently, as well as teach ICT skills. KIKS can also be used for a research assignment. In the final objectives and curricula of various educational bodies, many goals can be found linking KIKS with biology, geography, and mathematics." + file_location: "/assets/files/kiks/Leerdoelen-KIKS.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Making a Nail Polish Impression of a Leaf Part" + file_info: "To know the number of stomata on a part of a plant leaf, we examine the leaf surface under the microscope. We can remove a piece of the thin cuticle of the leaf for this, but for some plants, it is not so successful, for example, due to the stiffness of the leaf. However, this can be compensated by using the same method as the researchers at Plantentuin Meise, namely, taking an impression of a part of the leaf surface with transparent nail polish. The microscopic image can be photographed with a smartphone." + file_location: "https://vimeo.com/467062270" + file_icon_name: "play_arrow" + link_name: "Watch" + socialrobot: + title: Social Robot + sub_title: Robotics in the classroom + description: "While first-year students (secondary education) build and program a social robot, they learn to solve complex problems through computational thinking. They playfully work on the new end terms for digital competencies." + contact: Questions? Contact us at team@aiopschool.be. The press can contact Francis Wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Project Sheet Social Robot" + file_info: "This is a brief overview of the 'Social Robot' project with project structure and characteristics." + file_location: "/assets/files/socialrobot/projectfiche_socialerobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Collage of Social Robots" + file_info: "The robots in this photo are creations of first-year secondary education students or prototypes." + file_location: "/assets/files/socialrobot/collage.png" + file_icon_name: "description" + link_name: "Download" + - file_title: "Construction Kit for 'Social Robot' Project" + file_info: "Do you want your students to design and build a social robot too? This is possible via the construction kit of Dwengovzw. The figure shows the current composition of the construction kit. Interested? Contact us by email or find more information on this project page." + file_location: "/assets/files/socialrobot/constructiekit_socialerobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "From Project to End Terms" + file_info: "The end terms that can be worked on are linked to the different phases of the 'Social Robot' project." + file_location: "/assets/files/socialrobot/EindtermenAStroomSsocialeRobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotion Machine (Incomplete) - Computational Thinking (Unplugged Activity)" + file_info: "Unplugged activity" + file_location: "/assets/files/socialrobot/emotiemachine_gewoon_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotion Machine (Task) - Computational Thinking (Unplugged Activity)" + file_info: "Unplugged activity" + file_location: "/assets/files/socialrobot/emotiemachine_gids.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotion Machine (Complete) - Computational Thinking (Unplugged Activity)" + file_info: "Unplugged activity" + file_location: "/assets/files/socialrobot/emotiemachine_ingevuld_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotion Machine with LED Matrix - Computational Thinking (Unplugged Activity)" + file_info: "Unplugged activity" + file_location: "/assets/files/socialrobot/emotiemachine_matrices_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Teacher's Guide" + file_info: "The bundled sheets explain the use of the Dwenguino and the sensors and actuators." + file_location: "/assets/files/socialrobot/ficheboekje_lkn.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Information Sheets for Students" + file_info: "These information sheets explain the use of the Dwenguino and sensors and actuators." + file_location: "/assets/files/socialrobot/fichesSocialeRobot_lln.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Create a Face - Computational Thinking (Unplugged Activity)" + file_info: "Unplugged activity" + file_location: "/assets/files/socialrobot/maakeengezicht_activiteit.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Tasks for Exercises in the MOOC" + file_info: "An overview of programming exercises in the MOOC" + file_location: "/assets/files/socialrobot/Opgaven_MOOC.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Poster 'Social Robot' Project" + file_info: "The poster displays the different aspects of the project." + file_location: "/assets/files/socialrobot/posterSocialeRobot_nl_Qo4ANmV.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Manual 'Hello Robot!'" + file_info: "With this lesson booklet, you bring your own social robot to life." + file_location: "/assets/files/socialrobot/handleiding_hallo_robot.pdf" + file_icon_name: "description" + link_name: "Download" + chatbot: + title: Language Technology at School + sub_title: Getting Started with a Chatbot + description: "Where language and technology come together, the domain of Natural Language Processing emerges. Can a computer understand, translate, or even write texts? Can a computer recognize emotions? Students in the second and third grades (SO) learn all about it in this package." + contact: Questions? Contact us at team@aiopschool.be. The press can contact Francis Wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Project Sheet Chatbot" + file_info: "This is a brief overview of the Chatbot project with project structure and characteristics." + file_location: "/assets/files/chatbot/projectfiche_chatbot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "BrAInfood Chatbots" + file_info: "In this BrAInfood - aimed at young people - the Knowledge Center Data & Society provides more information about chatbots. The BrAInfood includes a fictional story about Lotte talking to a chatbot and presumably providing information about her to companies. Further, some points related to chatbots are explained, along with some tips for young people to better protect their (personal) data. In this way, we aim to make young people more aware of how chatbots work and encourage them to reflect on the data collected about them." + file_location: "/assets/files/chatbot/Brainfood13_Chatbots_NL.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "BrAInfood Personalized Newsfeeds" + file_info: "In this BrAInfood from the Knowledge Center Data & Society, tips are given on how to keep control over your newsfeed." + file_location: "/assets/files/chatbot/brainfoodaanbevelingnieuws.jpg" + file_icon_name: "description" + link_name: "Download" + - file_title: "Manual 'Chatbot' - Also available in print" + file_info: "Teachers acquire sufficient background information through this manual to work with (a part of) the 'Chatbot' project in the classroom. The book covers various aspects of language technology, such as the history of artificial intelligence, its ethical aspects, sentiment analysis, and cyberbullying detection, chatbots, speaking digital assistants, and author recognition. It also addresses the STEM objectives and the objectives related to digital competence and media literacy." + file_location: "/assets/files/chatbot/Chatbot_handleiding_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Improbotics - Lesson Plan - Teacher's Version" + file_info: "In the theater performance Improbotics, a social robot improvises in the scenes. The lesson plan provides information about the technologies used." + file_location: "/assets/files/chatbot/Improbotics_lesmap_Leerkracht.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Improbotics - Lesson Plan - Students" + file_info: "In the theater performance Improbotics, a social robot improvises in the scenes. The lesson plan provides information about the technologies used." + file_location: "/assets/files/chatbot/Improbotics_lesmap_Leerling.pdf" + file_icon_name: "description" + link_name: "Download" + care: + title: AI in Healthcare + sub_title: AI Systems Assisting in Healthcare + description: "Hospitals are already using artificial intelligence today. Students in the second and third grades (SO) discover the existing systems and how they help doctors make decisions. This way, students learn the principles of the decision tree, a commonly used technique in machine learning." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + curricula_files: + - file_title: "Project Sheet AI in Healthcare" + file_info: "This is a brief overview of the AI in Healthcare project with project structure and characteristics." + file_location: "/assets/files/care/projectfiche_aiindezorg.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Sprouts" + file_info: "A game as an introduction to 'Graphs'." + file_location: "/assets/files/care/Sprouts.mov" + file_icon_name: "play_arrow" + link_name: "Download" + - file_title: "Explanation of Exercises on Graphs from the Student Course" + file_info: "Which figures represent the same graph? A more formal approach." + file_location: "/assets/files/care/dezelfdegraafFormeel.mov" + file_icon_name: "play_arrow" + link_name: "Download" + - file_title: "Explanation of Exercises on Graphs from the Student Course" + file_info: "Which figures represent the same graph? An approach with colors." + file_location: "/assets/files/care/dezelfdeGraaf.mov" + file_icon_name: "play_arrow" + link_name: "Download" + - file_title: "Student Course - Finality Throughflow" + file_info: "Student course." + file_location: "/assets/files/care/AIinHealthcare_throughflow_firstedition.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Card Set - Also available in print" + file_info: "With this card set, you can make students reflect on the ethical aspects of new technologies. What about privacy? Are social contacts not at risk? Which technologies are welcomed? What is undesirable? Are the new technologies affordable for everyone?" + file_location: "/assets/files/care/Cardset_AIinHealthcare_AIOpSchool_Dwengo.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Manual for Card Set" + file_info: "This manual provides additional explanation for the card set." + file_location: "/assets/files/care/AIinHealthcareCardset_InstructionForTeacher.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Decision Tree 'mBrAIn' Project in Non-compact Form" + file_info: "In the research project 'mBrain,' which aims to develop an app predicting a migraine attack, a decision tree was constructed. This decision tree addresses a binary classification problem: there are only two classes, 'Migraine' and 'No Migraine.' (Sources: Femke Ongenae. (2021), UGent; Van Hoecke, S., Ongenae, F., Paemeleire, K., & Vandenbussche, N. (2020). App moet hoofdpijn voorspellen. EOS Wetenschap Special, Technologie en gezondheid, 25.) We have transformed the shape of this decision tree into a binary decision tree to demonstrate that this form is not always user-friendly. For more explanation, see chapter 4 of the student course of this project." + file_location: "/assets/files/care/MBrainBeslissingsboom.png" + file_icon_name: "description" + link_name: "Download" + - file_title: "Search for Speech - Computational Thinking (unplugged activity)" + file_info: "Locked-in syndrome is one of the worst medical conditions. You are completely paralyzed, except that you might still be able to blink with one eye. Your intelligent mind is trapped in a useless body: you can feel everything but cannot communicate. It can happen to anyone, out of nowhere, as a result of a stroke. If you want to help people with the locked-in syndrome, is it best to become a doctor or a nurse? Or can you also help as a computer scientist?" + file_location: "/assets/files/care/ZoektochtNaarSpraak.pdf" + file_icon_name: "description" + link_name: "Download" + stem: + title: Python in STEM + sub_title: Data Visualizations with Python + description: "In this package, you'll learn to tackle complex problems more easily and quickly with the programming language Python. Programming can indeed play a connecting role between science, technology, design, and applied mathematics. In short, thanks to Python, we get the best out of STEM." + contact: Questions? Contact us at team@aiopschool.be. The press can contact Francis Wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + agriculture: + title: AI in Agriculture + sub_title: AI in agriculture + description: "Removing rotten tomatoes during harvest? Artificial intelligence can help with that. But how? Students in the second and third grades (SO) get hands-on experience with AI. Perhaps a vibrating conveyor belt can improve the system even more?" + contact: Questions? Contact us at team@aiopschool.be. The press can contact Francis Wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Design" + file_info: "Design of the conveyor belt" + file_location: "/assets/files/art/Transportband_InnoVET_RCH.zip" + file_icon_name: "description" + link_name: "Download" + art: + title: AI in Art + sub_title: Drawing Robots in the Classroom + description: "Can we create art with artificial intelligence? Students in the second and third grades (SO) express their creativity with AI and reflect on the result. Is this art? They also discover how AI can protect our cultural heritage." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + wegostem: + title: WeGoSTEM + sub_title: Drawing Robots in the Classroom + description: "We challenge third-grade (BO) children to program a drawing robot. Through play, children learn a lot of STEM skills, from technology to computational thinking." + contact: Questions? Contact us at team@aiopschool.be. The press can contact Francis Wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + + computational_thinking: + title: Computational Thinking + sub_title: Computational Thinking in the Classroom + description: "How can we solve complex problems with the help of a computer? Thanks to computational thinking! You can learn this through various activities with or without a computer. We'll help you get started." + contact: Questions? Contact us at team@aiopschool.be. The press can contact Francis Wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Concepts and Approach to Computational Thinking" + file_info: "poster" + file_location: "/assets/files/computational_thinking/CDposterDwengo2.png" + file_icon_name: "description" + link_name: "Download" + - file_title: "Explaining Four Concepts of Computational Thinking" + file_info: "Presentation on four concepts of computational thinking: decomposition, pattern recognition, abstraction, and algorithm. You can download the PDF, open it, present it using CTRL-L, and navigate with the arrow keys." + file_location: "/assets/files/computational_thinking/CD4concepten_33V3gBg.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Concepts and Principles" + file_info: "Overview" + file_location: "/assets/files/computational_thinking/Icoontjes.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged Activity - Emotion Machine (Assignment)" + file_info: "How can you stimulate emotions in a robot?" + file_location: "/assets/files/computational_thinking/emotiemachine_gids.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged Activity - Emotion Machine" + file_info: "How can you stimulate emotions in a robot?" + file_location: "/assets/files/computational_thinking/emotiemachine_gewoon_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged Activity - Color by Number" + file_info: "Images can be represented in many ways. In this color by number puzzle, you have to reconstruct an image using the given list of numbers; this list tells you which color to fill in each square ('pixel')." + file_location: "/assets/files/computational_thinking/kleurenopnummer1.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged Activity - Human Computer Network" + file_info: "In this activity, students learn how data transfer over the Internet works. Computers, smartphones, and other devices connected via the Internet can communicate with each other. To understand each other, this communication must follow certain agreements. We call these agreements a protocol." + file_location: "/assets/files/computational_thinking/menselijkComputernetwerk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged Activity - Compression" + file_info: "To send images over networks, we want to represent information with as little data as possible. Compression comes into play here. Using algorithms, images are represented with as few numbers as possible, but in a way that you can still recover the original figure. Other algorithms restore the original image when the information reaches its destination." + file_location: "/assets/files/computational_thinking/puzzel-gecomprimeerdepixel11.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged Activity - Program a Human" + file_info: "Computers cannot interpret, so they literally execute every instruction you give them. The programmer's challenge is to solve problems by breaking them down into small steps that the computer can execute and giving the instructions to the computer correctly." + file_location: "/assets/files/computational_thinking/programmeerEensEenMens.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged Activity - Search for Speech" + file_info: "Locked-in syndrome is one of the worst medical conditions. You are completely paralyzed, except that you may still be able to blink with one eye. Your intelligent mind is trapped in a useless body: you can feel everything but cannot communicate. It can happen to anyone, out of nowhere, as a result of a stroke. If you wanted to help people with locked-in syndrome, would you be better off as a doctor or nurse? Or can you help as a computer scientist?" + file_location: "/assets/files/computational_thinking/ZoektochtNaarSpraak.pdf" + file_icon_name: "description" + link_name: "Download" + math_with_python: + title: Python in Math Class + sub_title: Python in Mathematics + description: "The programming language Python offers great possibilities to enrich the math class. From the Pythagorean theorem to creating your own graphs, digital image processing, and linear regression, everything becomes clearer with Python." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + python_programming: + title: Programming with Python + sub_title: Basic Programming in Python + description: "Want to learn the basic principles of programming? You can do it perfectly with this package. We use Python and learn all about sequences, repetition structure, and decision structure. That's exactly what's in the end terms. And more!" + contact: Questions? Contact us at team@aiopschool.be. The press can contact Francis Wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + physical_computing: + title: Physical Computing + sub_title: Program Robots in the Classroom + description: "Build a musical instrument, car, or weather station? You can do that with Dwenguino, a microcontroller platform with its own programming environment. Students from both primary and secondary education can get started with it right away. In real life or in our simulator, block-based or textual." + contact: Questions? Contact us at team@aiopschool.be. The press can contact Francis Wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Bouw jouw eigen robot" + file_info: "Build your own driving robot." + file_location: "/assets/files/physical_computing/bouwjouweigenrobot.pdf" + file_icon_name: "link" + link_name: "Download" diff --git a/_i18n/fr.yml b/_i18n/fr.yml new file mode 100644 index 00000000..577388fc --- /dev/null +++ b/_i18n/fr.yml @@ -0,0 +1,334 @@ +# translate theme pages + +curricula_page: + title: Notre sujets d'enseignement + read_more: "Lees meer" + curricula_files: "Bestanden" + algorithms: + title: Algorithmes + sub_title: Algorithmes + description: "Les élèves de la troisième à la sixième année (enseignement secondaire) apprennent comment utiliser des algorithmes pour résoudre des problèmes. Ils apprennent à concevoir des algorithmes et à analyser l'efficacité de ces derniers. Ils apprennent également à utiliser des algorithmes pour résoudre des problèmes." + contact: "" + teaser: https://www.youtube.com/embed/2B6gZ9HdQ1Y + basics_ai: + title: Basisprincipes van AI + sub_title: Basisprincipes van AI + description: "Onder dit lesthema bundelen we verschillende activiteiten waarin de basisprincipes van artificiële intelligentie (AI) aan bod komen. Leerlingen leren wat AI is, hoe het werkt en hoe het kan worden toegepast in verschillende domeinen." + contact: "" + kiks: + title: "IA et changement climatique" + sub_title: "KIKS" + description: "Les élèves de la troisième année du secondaire explorent comment les plantes s'adaptent au changement climatique via leurs stomates. Ils utilisent l'intelligence artificielle et la reconnaissance d'image pour compter ces stomates." + contact: "" + teaser: "https://www.youtube.com/embed/dO-E33G20co" + curricula_files: + - file_title: "Fiche de projet KIKS" + file_info: "Il s'agit d'un bref aperçu du projet KIKS avec la structure et les caractéristiques du projet." + file_location: "/assets/files/kiks/projectfiche_kiks.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Le manuel - également disponible en version imprimée" + file_info: "Nous voulons donner aux enseignants des connaissances de base sur le contenu de ce projet : le changement climatique, la biologie des stomates et la manière dont les plantes s'adaptent à ce changement climatique via les stomates, la recherche scientifique de l'UGent et du Jardin botanique de Meise à l'origine de ce projet, la science citoyenne, ce qu'est l'intelligence artificielle (IA), l'histoire de l'IA, son utilisation et l'éthique qui l'entoure, les principes des images numériques, les mathématiques derrière les algorithmes et les fondements des techniques d'IA actuellement les plus utilisées. Nous expliquons également comment nous avons utilisé KIKS en classe." + file_location: "/assets/files/kiks/KIKS_handleiding_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Un cours pour les élèves" + file_info: "Avec le cours pour les élèves, nous donnons un exemple d'un parcours possible que l'enseignant peut suivre avec les élèves. Le parcours inclut le changement climatique, la biologie des stomates avec une tâche de microscopie, la manière dont les plantes s'adaptent au changement climatique via les stomates, la recherche scientifique de l'UGent et du Jardin botanique de Meise, la collecte de données pour entraîner un réseau neuronal, ce qu'est l'intelligence artificielle (IA), l'histoire de l'IA, son utilisation et l'éthique qui l'entoure, les principes des images numériques, le travail avec les convolutions, les mathématiques derrière l'algorithme du Perceptron, la classification linéaire et non linéaire des données, et les fondements de l'apprentissage machine." + file_location: "/assets/files/kiks/KIKS_leerlingencursus_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Les objectifs d'apprentissage" + file_info: "Dans le projet KIKS, de nombreux objectifs d'apprentissage peuvent être abordés. L'enseignant décide lui-même des objectifs d'apprentissage liés au projet. De plus, le projet offre de nombreuses possibilités pour permettre aux élèves d'apprendre de manière active et autonome, et pour enseigner les compétences en TIC. KIKS peut également être utilisé pour développer une mission de recherche. Les objectifs d'apprentissage et les plans de cours des différentes institutions contiennent de nombreux objectifs d'apprentissage liés à la biologie, à la géographie et aux mathématiques." + file_location: "/assets/files/kiks/Leerdoelen-KIKS.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "La réalisation d'une empreinte de vernis à ongles d'une partie d'une feuille" + file_info: "Pour connaître le nombre de stomates sur une partie d'une feuille d'une plante, nous examinons la surface de la feuille sous le microscope. Pour ce faire, nous pouvons retirer une partie de la cuticule très fine de la feuille, mais cela ne fonctionne pas aussi bien pour certaines plantes en raison de la rigidité de la feuille. Cela peut cependant être compensé en utilisant la même méthode que les chercheurs du Jardin botanique de Meise, à savoir prendre une empreinte d'une partie de la surface de la feuille avec du vernis à ongles transparent. L'image microscopique peut être photographiée avec un smartphone." + file_location: "https://vimeo.com/467062270" + file_icon_name: "play_arrow" + link_name: "Voir" + socialrobot: + title: "Robot social" + sub_title: "Robotique en classe" + description: "Alors que les élèves de la première année du secondaire bricolent et programment un robot social, ils apprennent à résoudre des problèmes complexes grâce à la pensée computationnelle. Ils travaillent de manière ludique sur les nouvelles compétences finales en compétences numériques." + contact: "Questions ? Contactez-nous via team@aiopschool.be. La presse peut contacter Francis Wyffels via Francis@dwengo.org." + teaser: "https://www.youtube.com/embed/tqSnpAKLsu8" + curricula_files: + - file_title: "Fiche de projet Robot social" + file_info: "Il s'agit d'un bref aperçu du projet 'Robot social' avec la structure et les caractéristiques du projet." + file_location: "/assets/files/socialrobot/projectfiche_socialerobot.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Collage des robots sociaux" + file_info: "Les robots sur cette photo sont des réalisations d'élèves de la première année du secondaire ou des prototypes." + file_location: "/assets/files/socialrobot/collage.png" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Kit de construction pour le projet 'Robot social'" + file_info: "Vous souhaitez que vos élèves conçoivent et construisent également un robot social ? Cela peut se faire avec le kit de construction de Dwengovzw. Sur la figure, vous découvrirez la composition actuelle du kit de construction. Intéressé ? Contactez-nous par e-mail ou trouvez plus d'informations sur cette page du projet." + file_location: "/assets/files/socialrobot/constructiekit_socialerobot.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "De la mission aux compétences finales" + file_info: "Les compétences finales qui peuvent être travaillées sont liées aux différentes phases du projet 'Robot social'." + file_location: "/assets/files/socialrobot/EindtermenAStroomSsocialeRobot.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Machine à émotions (incomplète) - Pensée computationnelle (activité débranchée)" + file_info: "Activité débranchée" + file_location: "/assets/files/socialrobot/emotiemachine_gewoon_nl.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Machine à émotions (mission) - Pensée computationnelle (activité débranchée)" + file_info: "Activité débranchée" + file_location: "/assets/files/socialrobot/emotiemachine_gids.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Machine à émotions (complète) - Pensée computationnelle (activité débranchée)" + file_info: "Activité débranchée" + file_location: "/assets/files/socialrobot/emotiemachine_ingevuld_nl.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Machine à émotions avec matrice de LED - Pensée computationnelle (activité débranchée)" + file_info: "Activité débranchée" + file_location: "/assets/files/socialrobot/emotiemachine_matrices_nl.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Guide pour les enseignants" + file_info: "Les fiches regroupées détaillant l'utilisation du Dwenguino et des capteurs et actionneurs." + file_location: "/assets/files/socialrobot/ficheboekje_lkn.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Fiches pour les élèves" + file_info: "Ces fiches expliquent l'utilisation du Dwenguino et des capteurs et actionneurs." + file_location: "/assets/files/socialrobot/fichesSocialeRobot_lln.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Créer un visage - Pensée computationnelle (activité débranchée)" + file_info: "Activité débranchée" + file_location: "/assets/files/socialrobot/maakeengezicht_activiteit.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Exercices de la MOOC" + file_info: "Aperçu des exercices de programmation dans le MOOC." + file_location: "/assets/files/socialrobot/Opgaven_MOOC.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Affiche du projet 'Robot social'" + file_info: "L'affiche représente les différents aspects du projet." + file_location: "/assets/files/socialrobot/posterSocialeRobot_nl_Qo4ANmV.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Guide 'Bonjour robot!'" + file_info: "Avec ce livret, donnez vie à votre propre robot social." + file_location: "/assets/files/socialrobot/handleiding_hallo_robot.pdf" + file_icon_name: "description" + link_name: "Télécharger" + chatbot: + title: "Technologie du langage à l'école" + sub_title: "Se mettre au travail avec un chatbot" + description: "Là où le langage et la technologie se rencontrent, naît le domaine du Traitement du Langage Naturel. Un ordinateur peut-il comprendre, traduire ou même écrire des textes ? Peut-il reconnaître les émotions ? Les élèves de la deuxième et de la troisième année (enseignement secondaire) en apprennent davantage dans ce programme." + contact: "Questions ? Contactez-nous via team@aiopschool.be. La presse peut contacter Francis Wyffels via Francis@dwengo.org." + teaser: "https://www.youtube.com/embed/tqSnpAKLsu8" + curricula_files: + - file_title: "Fiche de projet Chatbot" + file_info: "Il s'agit d'un bref aperçu du projet Chatbot avec la structure et les caractéristiques du projet." + file_location: "/assets/files/chatbot/projectfiche_chatbot.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "BrAInfood Chatbots" + file_info: "Dans ce BrAInfood destiné aux jeunes, le Centre de connaissances Data & Société donne plus d'informations sur les chatbots. Le BrAInfood contient une histoire fictive sur Lotte qui discute avec un chatbot et transmet potentiellement des informations à des entreprises. En outre, quelques points d'attention concernant les chatbots sont expliqués, ainsi que quelques conseils pour les jeunes afin de mieux protéger leurs données personnelles. De cette manière, nous voulons sensibiliser les jeunes au fonctionnement des chatbots et les encourager à réfléchir aux données qui sont collectées à leur sujet." + file_location: "/assets/files/chatbot/Brainfood13_Chatbots_FR.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "BrAInfood Nouvelles personnalisées" + file_info: "Dans ce BrAInfood du Centre de connaissances Data & Société, des conseils sont donnés sur la façon de garder le contrôle sur votre fil d'actualité." + file_location: "/assets/files/chatbot/brainfoodrecommendationnews.jpg" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Manuel 'Chatbot' - Également disponible en version imprimée" + file_info: "Les enseignants acquièrent, via ce manuel, des informations de base suffisantes pour aborder (une partie du) projet 'Chatbot' en classe. Le livre aborde différents aspects de la technologie du langage, tels que l'histoire de l'intelligence artificielle, ses aspects éthiques, l'analyse des sentiments et la détection du cyberharcèlement, les chatbots, les assistants numériques parlants et la reconnaissance d'auteur. Il aborde également les compétences finales STEM et les compétences finales en compétences numériques et en éducation aux médias." + file_location: "/assets/files/chatbot/Chatbot_handleiding_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Improbotics - Livret - Version enseignant" + file_info: "Dans la pièce de théâtre Improbotics, un robot social improvise dans les scènes. Le livret contient des informations sur les technologies utilisées." + file_location: "/assets/files/chatbot/Improbotics_lesmap_Enseignant.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Improbotics - Livret - Élèves" + file_info: "Dans la pièce de théâtre Improbotics, un robot social improvise dans les scènes. Le livret contient des informations sur les technologies utilisées." + file_location: "/assets/files/chatbot/Improbotics_lesmap_Eleve.pdf" + file_icon_name: "description" + link_name: "Télécharger" + + care: + title: "IA dans les soins de santé" + sub_title: "Systèmes d'IA aidant dans les soins de santé" + description: "Les hôpitaux utilisent déjà l'intelligence artificielle aujourd'hui. Les élèves de la deuxième et de la troisième année (enseignement secondaire) découvrent quels systèmes existent et comment ils aident les médecins à prendre des décisions. Ainsi, les élèves apprennent les principes de l'arbre de décision, une technique couramment utilisée dans l'apprentissage automatique." + contact: "" + teaser: "https://www.youtube.com/embed/dO-E33G20co" + curricula_files: + - file_title: "Fiche de projet IA dans les soins de santé" + file_info: "Il s'agit d'un bref aperçu du projet IA dans les soins de santé avec la structure et les caractéristiques du projet." + file_location: "/assets/files/care/projectfiche_aiindezorg.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Sprouts" + file_info: "Un jeu d'introduction aux 'Graphes'." + file_location: "/assets/files/care/Sprouts.mov" + file_icon_name: "play_arrow" + link_name: "Télécharger" + - file_title: "Explication des exercices de graphes du cours des élèves" + file_info: "Quels dessins représentent le même graphe ? Une approche plus formelle." + file_location: "/assets/files/care/dezelfdegraafFormeel.mov" + file_icon_name: "play_arrow" + link_name: "Télécharger" + - file_title: "Explication des exercices de graphes du cours des élèves" + file_info: "Quels dessins représentent le même graphe ? Une approche avec des couleurs." + file_location: "/assets/files/care/dezelfdeGraaf.mov" + file_icon_name: "play_arrow" + link_name: "Télécharger" + - file_title: "Le cours des élèves - Finalité Générale" + file_info: "Cours des élèves" + file_location: "/assets/files/care/AIindeZorg_doorstroom_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Ensemble de cartes - Également disponible en version imprimée" + file_info: "À l'aide de cet ensemble de cartes, vous pouvez amener les élèves à réfléchir aux aspects éthiques des nouvelles technologies. Qu'en est-il de la vie privée ? Les contacts sociaux ne sont-ils pas compromis ? Quelles technologies sont bien accueillies ? Qu'est-ce qui n'est pas souhaitable ? Les nouvelles technologies sont-elles abordables pour tous ?" + file_location: "/assets/files/care/Kaartset_AIIndeZorg_AIOpSchool_Dwengo.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Manuel de l'ensemble de cartes" + file_info: "Ce manuel fournit des explications supplémentaires sur l'ensemble de cartes." + file_location: "/assets/files/care/AIIndeZorgKaartenset_UitlegVoorLeerkracht.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Arbre de décision du projet 'mBrAIn' sous forme non compacte" + file_info: "Dans le projet de recherche 'mBrain', qui vise le développement d'une application prédisant une crise de migraine, une arborescence de décision a été construite. Cette arborescence de décision aborde un problème de classification binaire : il n'y a que deux classes, 'Migraine' et 'Pas de migraine'. (Sources : Femke Ongenae. (2021), UGent ; Van Hoecke, S., Ongenae, F., Paemeleire, K., & Vandenbussche, N. (2020). App doit prédire les maux de tête. EOS Wetenschap Special, Technologie en gezondheid, 25.) Nous avons transformé la forme de cette arborescence de décision en une arborescence de décision binaire pour montrer que cette forme n'est pas toujours conviviale. Pour plus d'explications, voir le chapitre 4 du cours des élèves de ce projet." + file_location: "/assets/files/care/MBrainBeslissingsboom.png" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Recherche de la parole - Pensée computationnelle (activité débranchée)" + file_info: "Le syndrome d'enfermement est l'une des pires conditions médicales. Vous êtes complètement paralysé, sauf peut-être pour cligner des yeux. Votre esprit intelligent est enfermé dans un corps inutile : vous pouvez tout ressentir, mais pas communiquer. Cela peut arriver à n'importe qui, à tout moment, suite à un AVC. Si vous voulez aider les personnes atteintes du syndrome d'enfermement, vaut-il mieux être médecin ou infirmier ? Ou en tant qu'informaticien, pouvez-vous aussi aider ?" + file_location: "/assets/files/care/ZoektochtNaarSpraak.pdf" + file_icon_name: "description" + link_name: "Télécharger" + stem: + title: "Python en STEM" + sub_title: "Visualisations de données avec Python" + description: "Dans ce programme, vous apprendrez à aborder des problèmes complexes de manière plus simple et plus rapide avec le langage de programmation Python. La programmation peut jouer un rôle de liaison entre la science, la technologie, la conception et les mathématiques appliquées. En bref, grâce à Python, nous tirons le meilleur parti de STEM." + contact: "Des questions ? Contactez-nous via team@aiopschool.be. La presse peut contacter Francis Wyffels via Francis@dwengo.org." + teaser: "https://www.youtube.com/embed/tqSnpAKLsu8" + + agriculture: + title: "IA dans l'Agriculture" + sub_title: "IA dans l'agriculture" + description: "Retirer les tomates pourries pendant la récolte ? L'intelligence artificielle peut aider. Mais comment ? Les élèves de la deuxième et de la troisième année (enseignement secondaire) travaillent avec l'IA. Peut-être qu'un tapis roulant vibrant pourrait améliorer le système encore davantage ?" + contact: "Des questions ? Contactez-nous via team@aiopschool.be. La presse peut contacter Francis Wyffels via Francis@dwengo.org." + teaser: "https://www.youtube.com/embed/tqSnpAKLsu8" + curricula_files: + - file_title: "Conception" + file_info: "Conception du tapis roulant" + file_location: "/assets/files/art/Transportband_InnoVET_RCH.zip" + file_icon_name: "description" + link_name: "Télécharger" + + art: + title: "IA dans l'Art" + sub_title: "Robots de dessin en classe" + description: "Peut-on créer de l'art avec l'intelligence artificielle ? Les élèves de la deuxième et de la troisième année (enseignement secondaire) expriment leur créativité avec l'IA et réfléchissent au résultat. Est-ce de l'art ? Ils découvrent également comment l'IA peut protéger notre patrimoine culturel." + contact: "" + teaser: "https://www.youtube.com/embed/dO-E33G20co" + + wegostem: + title: "WeGoSTEM" + sub_title: "Robots de dessin en classe" + description: "Nous mettons au défi les enfants de la troisième année (enseignement primaire) de programmer un robot artistique capable de dessiner. Les enfants apprennent de manière ludique de nombreuses compétences STEM, de la technologie à la pensée informatique." + contact: "Des questions ? Contactez-nous via team@aiopschool.be. La presse peut contacter Francis Wyffels via Francis@dwengo.org." + teaser: "https://www.youtube.com/embed/tqSnpAKLsu8" + + computational_thinking: + title: "Pensée informatique" + sub_title: "Pensée informatique en classe" + description: "Comment pouvons-nous résoudre des problèmes complexes à l'aide d'un ordinateur ? Grâce à la pensée informatique ! Vous pouvez apprendre cela grâce à diverses activités avec ou sans ordinateur. Nous vous aidons déjà à démarrer." + contact: "Des questions ? Contactez-nous via team@aiopschool.be. La presse peut contacter Francis Wyffels via Francis@dwengo.org." + teaser: "https://www.youtube.com/embed/tqSnpAKLsu8" + curricula_files: + - file_title: "Concepts et approches de la pensée informatique" + file_info: "poster" + file_location: "/assets/files/computational_thinking/CDposterDwengo2.png" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Explication des quatre concepts de la pensée informatique" + file_info: "Présentation des quatre concepts de la pensée informatique : décomposition, reconnaissance de motifs, abstraction et algorithme. Vous pouvez télécharger le PDF > ouvrir > présenter avec CTRL-L et naviguer avec les touches fléchées." + file_location: "/assets/files/computational_thinking/CD4concepten_33V3gBg.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Concepts et principes" + file_info: "Aperçu" + file_location: "/assets/files/computational_thinking/Icoontjes.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Activité sans ordinateur - Machine émotionnelle (tâche)" + file_info: "Comment stimuler les émotions chez un robot ?" + file_location: "/assets/files/computational_thinking/emotiemachine_gids.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Activité sans ordinateur - Machine émotionnelle" + file_info: "Comment stimuler les émotions chez un robot ?" + file_location: "/assets/files/computational_thinking/emotiemachine_gewoon_nl.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Activité sans ordinateur - Coloriage par numéro" + file_info: "Les images peuvent être représentées de nombreuses manières. Dans ce casse-tête de coloriage par numéro, vous devez reconstruire une image en utilisant la liste donnée de numéros ; cette liste vous dit dans quelle couleur remplir chaque carré ('pixel')." + file_location: "/assets/files/computational_thinking/kleurenopnummer1.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Activité sans ordinateur - Un réseau informatique humain" + file_info: "Dans cette activité, les élèves découvrent comment fonctionne le transfert de données sur Internet. Les ordinateurs, les smartphones et d'autres appareils connectés par Internet peuvent communiquer entre eux. Pour se comprendre, cette communication doit suivre certaines règles. Nous appelons ces règles un protocole." + file_location: "/assets/files/computational_thinking/menselijkComputernetwerk.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Activité sans ordinateur - Compression" + file_info: "Pour envoyer des images sur des réseaux, nous voulons représenter l'information avec le moins de données possible. C'est là qu'intervient la compression. À l'aide d'algorithmes, les images sont représentées avec le moins de nombres possible, mais de manière à ce que vous puissiez récupérer la figure originale. D'autres algorithmes restaurent l'image d'origine une fois que l'information a atteint sa destination." + file_location: "/assets/files/computational_thinking/puzzel-gecomprimeerdepixel11.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Activité sans ordinateur - Programmez un être humain" + file_info: "Les ordinateurs ne peuvent pas interpréter et exécutent donc littéralement chaque instruction que vous leur donnez. Le défi du programmeur consiste à résoudre des problèmes en les divisant en petites étapes exécutables par l'ordinateur, et à donner les instructions à l'ordinateur de la bonne manière." + file_location: "/assets/files/computational_thinking/programmeerEensEenMens.pdf" + file_icon_name: "description" + link_name: "Télécharger" + - file_title: "Activité sans ordinateur - Recherche de la parole" + file_info: "Le locked-in syndrome est l'une des pires affections médicales. Vous êtes complètement paralysé, sauf peut-être que vous pouvez cligner des yeux. Votre esprit intelligent est emprisonné dans un corps inutile : vous pouvez tout ressentir, mais pas communiquer. Cela peut arriver à n'importe qui, sans avertissement, à la suite d'une attaque. Si vous voulez aider les personnes atteintes du locked-in syndrome, vaut-il mieux être médecin ou infirmier ? Ou un informaticien peut-il aussi aider ?" + file_location: "/assets/files/computational_thinking/ZoektochtNaarSpraak.pdf" + file_icon_name: "description" + link_name: "Télécharger" + + math_with_python: + title: "Python dans le cours de mathématiques" + sub_title: "Python en mathématiques" + description: "Le langage de programmation Python offre des possibilités intéressantes pour enrichir le cours de mathématiques. De la théorie de Pythagore à la création de graphiques personnalisés, en passant par le traitement d'images numériques et la régression linéaire, tout devient plus clair avec Python." + contact: "" + teaser: "https://www.youtube.com/embed/dO-E33G20co" + + python_programming: + title: "Programmation avec Python" + sub_title: "Programmation de base en Python" + description: "Apprendre les principes de base de la programmation ? C'est possible avec ce programme. Nous utilisons Python et apprenons tout sur les séquences, les structures de répétition et les structures de choix. C'est exactement ce qui est stipulé dans les objectifs finaux. Et plus encore !" + contact: "Des questions ? Contactez-nous via team@aiopschool.be. La presse peut contacter Francis Wyffels via Francis@dwengo.org." + teaser: "https://www.youtube.com/embed/tqSnpAKLsu8" + + physical_computing: + title: "Informatique physique" + sub_title: "Programmer des robots en classe" + description: "Construire un instrument de musique, une voiture ou une station météorologique ? C'est possible avec Dwenguino, une plateforme de microcontrôleurs avec son propre environnement de programmation. Les élèves du primaire et du secondaire peuvent commencer à l'utiliser immédiatement. En vrai ou dans notre simulateur, en mode blocs ou textuel." + contact: "Des questions ? Contactez-nous via team@aiopschool.be. La presse peut contacter Francis Wyffels via Francis@dwengo.org." + teaser: "https://www.youtube.com/embed/tqSnpAKLsu8" + curricula_files: + - file_title: "Bouw jouw eigen robot" + file_info: "Construisez votre propre robot de conduite." + file_location: "/assets/files/physical_computing/bouwjouweigenrobot.pdf" + file_icon_name: "link" + link_name: "Download" diff --git a/_i18n/nl.yml b/_i18n/nl.yml new file mode 100644 index 00000000..98fc0beb --- /dev/null +++ b/_i18n/nl.yml @@ -0,0 +1,364 @@ +# translate theme pages + +curricula_page: + title: Onze lesthema's + read_more: Lees meer + curricula_files: Bestanden + + algorithms: + title: Algoritmes + sub_title: Algoritmes + description: "Leerlingen uit de tweede en de derde graad (SO) leren hoe ze algoritmes kunnen gebruiken om problemen op te lossen. Ze leren hoe ze algoritmes kunnen ontwerpen en hoe ze de efficiëntie van algoritmes kunnen analyseren. Ze leren ook hoe ze algoritmes kunnen gebruiken om problemen op te lossen." + contact: "" + + basics_ai: + title: Basisprincipes van AI + sub_title: Basisprincipes van AI + description: "Onder dit lesthema bundelen we verschillende activiteiten waarin de basisprincipes van artificiële intelligentie (AI) aan bod komen. Leerlingen leren wat AI is, hoe het werkt en hoe het kan worden toegepast in verschillende domeinen." + contact: "" + + kiks: + title: AI en Klimaat + sub_title: KIKS + description: "Leerlingen uit de derde graad (SO) onderzoeken hoe planten zich via hun huidmondjes aanpassen aan de klimaatverandering. Daarvoor tellen ze deze huidmondjes met artificiële intelligentie en beeldherkenning." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + curricula_files: + - file_title: "Projectfiche KIKS" + file_info: "Dit is een kort overzicht van het KIKS-project met projectstructuur- en kenmerken." + file_location: "/assets/files/kiks/projectfiche_kiks.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "De handleiding - ook verkrijgbaar in gedrukte versie" + file_info: "We willen de leerkrachten achtergrondkennis geven over de inhoud van dit project: de klimaatverandering, de biologie van de huidmondjes en de manier waarop planten zich via de huidmondjes aan die klimaatverandering aanpassen, het wetenschappelijk onderzoek van de UGent en de Plantentuin Meise dat aan de grondslag ligt van dit project, burgerwetenschap, wat is artificiële intelligentie (AI), de geschiedenis van AI, het gebruik ervan en de ethiek errond, de principes van digitale beelden, de wiskunde achter de algoritmen en de fundamenten van de momenteel meest gebruikte AI-technieken. We geven ook aan hoe wij met KIKS aan de slag gegaan zijn in de klas.​" + file_location: "/assets/files/kiks/KIKS_handleiding_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Een leerlingencursus" + file_info: "Met de leerlingencursus geven we een voorbeeld van een mogelijk, uitgebreid traject dat een leerkracht met leerlingen kan doorlopen. Het traject omvat de klimaatverandering, de biologie van de huidmondjes met een microscopie-opdracht, de manier waarop planten zich via de huidmondjes aan die klimaatverandering aanpassen, het wetenschappelijk onderzoek van de UGent en de Plantentuin Meise, het verzamelen van de data om een neuraal netwerk te trainen, wat is artificiële intelligentie (AI), de geschiedenis van AI, het gebruik ervan en de ethiek errond, de principes van digitale beelden, het werken met convoluties, de wiskunde achter het Perceptron-algoritme, het lineaire en niet-lineaire classificeren van data, en de fundamenten van machinaal leren." + file_location: "/assets/files/kiks/KIKS_leerlingencursus_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "De leerplandoelen" + file_info: "Binnen het KIKS-project kunnen behoorlijk veel leerdoelen aan bod komen. De leerkracht bepaalt zelf welke leerdoelen in verband gebracht worden met het project. Bovendien biedt het project heel wat mogelijkheden om de leerlingen actief en zelfstandig te laten leren en om ICT-vaardigheden bij te brengen. KIKS kan ook gebruikt worden om een onderzoeksopdracht uit te werken.\n In de minimumdoelen en leerplannen van de verschillende koepels zijn heel wat leerdoelen te vinden die KIKS linken met biologie, aardrijkskunde en wiskunde." + file_location: "/assets/files/kiks/Leerdoelen-KIKS.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Het maken van een nagellakafdruk van een deel van een blad" + file_info: "Om het aantal huidmondjes op een deel van een blad van een plant te kennen, bekijken we het bladoppervlak onder de microscoop. We kunnen daarvoor een stuk van de flinterdunne cuticula van het blad verwijderen, maar bij sommige planten lukt dat niet zo goed, bijvoorbeeld door de stugheid van het blad.\nDit kan echter opgevangen worden door dezelfde methode te gebruiken als de onderzoekers van de Plantentuin Meise, nl. een afdruk nemen van een deel van het bladoppervlak met doorzichtige nagellak.\nHet miscroscopische beeld kan met een smartphone gefotografeerd worden." + file_location: "https://www.youtube.com/watch?v=JptF3jhOV5k" + file_icon_name: "play_arrow" + link_name: "Kijk" + + socialrobot: + title: Sociale robot + sub_title: Robotica in de klas + description: "Terwijl leerlingen uit de eerste graad (SO) een sociale robot knutselen en programmeren, leren ze complexe problemen oplossen via computationeel denken. Spelenderwijs werken ze aan de nieuwe eindtermen rond digitale competenties." + contact: Vragen? Contacteer ons via team@aiopschool.be. De pers kan contact opnemen met Francis wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Projectfiche Sociale Robot" + file_info: "Dit is een kort overzicht van het 'Sociale Robot'-project met projectstructuur en -kenmerken." + file_location: "/assets/files/socialrobot/projectfiche_socialerobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Collage sociale robots" + file_info: "De robots op deze foto zijn realisaties van leerlingen van de eerste graad van het secundair onderwijs of zijn prototypes.​" + file_location: "/assets/files/socialrobot/collage.png" + file_icon_name: "description" + link_name: "Download" + - file_title: "Constructiekit voor 'Sociale Robot'-project" + file_info: "​Wil jij dat jouw leerlingen ook een sociale robot ontwerpen en bouwen? Dat kan via de constructiekit van Dwengo vzw. Op de figuur ontdek je de huidige samenstelling van de constructiekit. Geïnteresseerd? Contacteer ons via e-mail, bekijk de kit in de shop, of vind meer informatie op deze projectpagina." + file_location: "/assets/files/socialrobot/constructiekit_socialerobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Van project naar minimumdoelen eerste graad A-stroom" + file_info: "De minimumdoelen waaraan gewerkt kan worden, worden gelinkt aan de verschillende fasen van het 'Sociale Robot'-project.​" + file_location: "/assets/files/socialrobot/MinimumdoelenA-stroomSocialeRobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Van project naar minimumdoelen eerste graad B-stroom" + file_info: "De minimumdoelen waaraan gewerkt kan worden, worden gelinkt aan de verschillende fasen van het 'Sociale Robot'-project.​" + file_location: "/assets/files/socialrobot/minimumdoelenBstroomsocialerobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Van project naar minimumdoelen tweede graad" + file_info: "De minimumdoelen waaraan gewerkt kan worden, worden gelinkt aan de verschillende fasen van het 'Sociale Robot'-project.​" + file_location: "/assets/files/socialrobot/minimumdoelentweedegraadsocialerobot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotiemachine (onvolledig) - Computationeel denken (unplugged activiteit)" + file_info: "​Unplugged activiteit" + file_location: "/assets/files/socialrobot/emotiemachine_gewoon_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotiemachine (opdracht) - Computationeel denken (unplugged activiteit)" + file_info: "Unplugged activiteit​" + file_location: "/assets/files/socialrobot/emotiemachine_gids.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotiemachine (volledig) - Computationeel denken (unplugged activiteit)" + file_info: "Unplugged activiteit​" + file_location: "/assets/files/socialrobot/emotiemachine_ingevuld_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Emotiemachine met ledmatrix - Computationeel denken (unplugged activiteit)" + file_info: "Unplugged activiteit​" + file_location: "/assets/files/socialrobot/emotiemachine_matrices_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Ficheboekje voor leerkrachten" + file_info: "De gebundelde fiches waarin het gebruik van de Dwenguino en van de sensoren en actuatoren uit de doeken wordt gedaan." + file_location: "/assets/files/socialrobot/ficheboekje_lkr.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Fiches voor de leerlingen" + file_info: "In deze fiches wordt het gebruik van de Dwenguino en van de sensoren en actuatoren uit de doeken gedaan.​" + file_location: "/assets/files/socialrobot/fiches_lln.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Maak een gezicht - Computationeel denken (unplugged activiteit)" + file_info: "Unplugged activiteit​" + file_location: "/assets/files/socialrobot/maakeengezicht_activiteit.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Opgaven van opdrachten in de MOOC" + file_info: "​Een overzicht van de programmeeroefeningen in de MOOC" + file_location: "/assets/files/socialrobot/Opgaven_MOOC.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Poster 'Sociale Robot'-project" + file_info: "De poster geeft de verschillende aspecten van het project weer.​" + file_location: "/assets/files/socialrobot/posterSocialeRobot_nl_Qo4ANmV.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Handleiding 'Hallo robot!'" + file_info: "Met dit lesboekje breng je je eigen sociale robot tot leven.​" + file_location: "/assets/files/socialrobot/handleiding_hallo_robot.pdf" + file_icon_name: "description" + link_name: "Download" + + agriculture: + title: AI in de Landbouw + sub_title: AI in de landbouw + description: "Rotte tomaten weghalen tijdens de oogst? Daar kan artificiële intelligentie bij helpen. Maar hoe? Leerlingen uit de tweede en derde graad (SO) gaan met AI aan de slag. Misschien kan een trillende lopende band het systeem nog beter maken?" + contact: Vragen? Contacteer ons via team@aiopschool.be. De pers kan contact opnemen met Francis wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Ontwerp" + file_info: "Ontwerp van de lopende band" + file_location: "/assets/files/art/Transportband_InnoVET_RCH.zip" + file_icon_name: "description" + link_name: "Download" + - file_title: "De lopende band" + file_info: "Video van de detectie van tomaten" + file_location: "https://www.youtube.com/watch?v=6TSqY4ECMU04" + file_icon_name: "play_arrow" + link_name: "Kijk" + + art: + title: AI in de Kunst + sub_title: Tekenrobots in de klas + description: "Kunnen we kunst maken met artificiële intelligentie? Leerlingen uit de tweede en derde graad (SO) leven zich creatief uit met AI en reflecteren over het resultaat. Is dit kunst? Ook ontdekken ze hoe AI ons cultureel erfgoed kan beschermen." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + + wegostem: + title: WeGoSTEM + sub_title: Tekenrobots in de klas + description: "We dagen kinderen van de derde graad (BO) uit om een kunstrobot die kan tekenen te programmeren. Spelenderwijs leren de kinderen heel wat STEM-vaardigheden, van techniek tot computationeel denken." + contact: Vragen? Contacteer ons via team@aiopschool.be. De pers kan contact opnemen met Francis wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + + computational_thinking: + title: Computationeel denken + sub_title: Computationeel denken in de klas + description: "Hoe kunnen we complexe problemen oplossen met behulp van een computer? Dankzij computationeel denken! Dat kan je leren via allerlei activiteiten met óf zonder computer. Wij helpen je alvast op weg." + contact: Vragen? Contacteer ons via team@aiopschool.be. De pers kan contact opnemen met Francis wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Computationeel denken en programmeren in een STEM context" + file_info: "Informatievideo over het project" + file_location: "https://www.youtube.com/watch?v=Nifa0vooyKg" + file_icon_name: "play_arrow" + link_name: "Kijk" + - file_title: "Concepten en aanpak computationeel denken" + file_info: "Poster​" + file_location: "/assets/files/computational_thinking/CDposterDwengo2.png" + file_icon_name: "description" + link_name: "Download" + - file_title: "Vier concepten van Computationeel denken uitgelegd" + file_info: "Presentatie over vier concepten van computationeel denken: decompositie, patroonherkenning, abstractie en algoritme. Je kan de pdf downloaden > openen > presenteren via CTRL-L en navigeren met de pijltjestoetsen." + file_location: "/assets/files/computational_thinking/CD4concepten_33V3gBg.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Concepten en principes" + file_info: "Overzicht​" + file_location: "/assets/files/computational_thinking/Icoontjes.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged activiteit - Emotiemachine (opdracht)" + file_info: "Hoe kan je emoties stimuleren bij een robot?​" + file_location: "/assets/files/computational_thinking/emotiemachine_gids.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged activiteit - Emotiemachine" + file_info: "Hoe kan je emoties stimuleren bij een robot?​" + file_location: "/assets/files/computational_thinking/emotiemachine_gewoon_nl.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged activiteit - Kleuren op nummer" + file_info: "​Afbeeldingen kunnen op veel manieren worden gerepresenteerd. In deze kleuren op nummer puzzel moet je een afbeelding reconstrueren, gebruikmakend van de gegeven lijst van nummers; deze lijst vertelt je in welke kleur je elk vierkant (‘pixel’) inkleurt." + file_location: "/assets/files/computational_thinking/kleurenopnummer1.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged activiteit - Een menselijk computernetwerk" + file_info: "In deze activiteit maken de leerlingen kennis met hoe overdracht van gegevens over het internet werkt. Computers, smartphones en andere toestellen die met elkaar verbonden zijn via het internet, kunnen met elkaar communiceren. Om elkaar te kunnen begrijpen, dient die communicatie volgens bepaalde afspraken te verlopen. We noemen deze afspraken een protocol.​" + file_location: "/assets/files/computational_thinking/menselijkComputernetwerk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged activiteit - Comprimeren" + file_info: "Om afbeeldingen te verzenden over netwerken, willen we de informatie met zo weinig mogelijk data representeren. Daar komt compressie aan te pas. Met behulp van algoritmes worden afbeeldingen met zo weinig mogelijk getallen gerepresenteerd, maar wel op zo’n manier dat je de oorspronkelijke figuur nog kunt terugkrijgen. Andere algoritmes herstellen de oorspronkelijke afbeelding als de informatie de bestemming bereikt heeft.​" + file_location: "/assets/files/computational_thinking/puzzel-gecomprimeerdepixel11.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged activiteit - Programmeer eens een mens" + file_info: "Computers kunnen niet interpreteren en voeren dus letterlijk iedere instructie uit die je ze geeft. De uitdaging van de programmeur bestaat erin problemen op te lossen door ze op te delen in kleine stappen die uitvoerbaar zijn door de computer, en de instructies op de juiste manier aan de computer te geven.​" + file_location: "/assets/files/computational_thinking/programmeerEensEenMens.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Unplugged activiteit - Zoektocht naar spraak" + file_info: "Het locked-in syndroom is een van de ergste medische aandoeningen. Je bent volledig verlamd, behalve dat je misschien nog kunt knipperen met een oog. Je intelligente geest zit opgesloten in een nutteloos lichaam: je kan alles voelen, maar niet communiceren. Het kan iedereen overkomen, uit het niets, als gevolg van een beroerte. Als je mensen met het locked-in syndroom zou willen helpen, word je dan best arts of verpleegkundige? Of kan je als computerwetenschapper ook helpen?​" + file_location: "/assets/files/computational_thinking/ZoektochtNaarSpraak.pdf" + file_icon_name: "description" + link_name: "Download" + + math_with_python: + title: Python in de Wiskundeles + sub_title: Python in wiskunde + description: "De programmeertaal Python biedt toffe mogelijkheden om de wiskundeles te verrijken. Van de stelling van Pythagoras tot de opmaak van eigen grafieken, digitale beeldverwerking en lineaire regressie, alles wordt duidelijker met Python." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + + python_programming: + title: Programmeren met Python + sub_title: Basis programmeren in Python + description: "De basisprincipes van programmeren aanleren? Dat kan perfect via dit pakket. We gaan aan de slag met Python en leren alles over sequenties, herhalingsstructuur en keuzestructuur. Dat is precies wat er in de eindtermen staat. En meer!" + contact: Vragen? Contacteer ons via team@aiopschool.be. De pers kan contact opnemen met Francis wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + + stem: + title: Python in STEM + sub_title: Datavisualisaties met Python + description: "In dit pakket leer je complexe problemen eenvoudiger én sneller aanpakken met de programmeertaal Python. Programmeren kan immers een verbindende rol spelen tussen wetenschap, techniek, ontwerp en toegepaste wiskunde. Kortom, dankzij Python halen we het beste uit STEM." + contact: Vragen? Contacteer ons via team@aiopschool.be. De pers kan contact opnemen met Francis wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + + care: + title: AI in de Zorg + sub_title: AI systemen die helpen in de zorg + description: "Ziekenhuizen maken vandaag al gebruik van artificiële intelligentie. Leerlingen uit de tweede en derde graad (SO) ontdekken welke systemen er bestaan en hoe ze dokters helpen om beslissingen te nemen. Zo leren leerlingen de principes van de beslissingsboom, een veelgebruikte techniek in machine learning." + contact: "" + teaser: https://www.youtube.com/embed/dO-E33G20co + curricula_files: + - file_title: "Projectfiche AI in de Zorg" + file_info: "Dit is een kort overzicht van project AI in de Zorg met projectstructuur- en kenmerken." + file_location: "/assets/files/care/projectfiche_aiindezorg.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Sprouts" + file_info: "Een spel ter inleiding op 'Grafen'.​" + file_location: "/assets/files/care/Sprouts.mov" + file_icon_name: "play_arrow" + link_name: "Download" + - file_title: "Uitleg bij oefeningen grafen uit de leerlingencursus" + file_info: "Welke figuren stellen er dezelfde graaf voor? Een meer formele werkwijze.​" + file_location: "/assets/files/care/dezelfdegraafFormeel.mov" + file_icon_name: "play_arrow" + link_name: "Download" + - file_title: "Uitleg bij oefeningen grafen uit de leerlingencursus" + file_info: "Welke figuren stellen er dezelfde graaf voor? Een werkwijze met kleuren.​" + file_location: "/assets/files/care/dezelfdeGraaf.mov" + file_icon_name: "play_arrow" + link_name: "Download" + - file_title: "De leerlingencursus - Finaliteit Doorstroom" + file_info: "Leerlingencursus" + file_location: "/assets/files/care/AIindeZorg_doorstroom_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Kaartenset (unplugged activiteit) - Ook verkrijgbaar in gedrukte versie" + file_info: "Aan de hand van deze kaartenset kan je de leerlingen laten stilstaan bij de ethische aspecten van nieuwe technologieën. Hoe zit het met privacy? Komen de sociale contacten niet in het gedrang? Welke technologieën worden met open armen ontvangen? Wat is niet wenselijk? Zijn de nieuwe technologieën voor iedereen betaalbaar?" + file_location: "/assets/files/care/Kaartset_AIIndeZorg_AIOpSchool_Dwengo.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Handleiding kaartenset" + file_info: "Deze handleiding voorziet extra uitleg bij de kaartenset." + file_location: "/assets/files/care/AIIndeZorgKaartenset_UitlegVoorLeerkracht.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Beslissingsboom 'mBrAIn'-project in niet-compacte vorm" + file_info: "In het onderzoeksproject 'mBrain', dat de ontwikkeling van een app die een migraineaanval voorspelt, als doel heeft, werd een beslissingsboom geconstrueerd. Met deze beslissingsboom wordt een probleem van binaire classificatie aangepakt: er zijn slechts twee klassen: ‘Migraine’ en ‘Geen migraine’. (Bronnen: Femke Ongenae. (2021), UGent; Van Hoecke, S., Ongenae, F., Paemeleire, K., & Vandenbussche, N. (2020). App moet hoofdpijn voorspellen. EOS Wetenschap Special, Technologie en gezondheid, 25.) Wij hebben de vorm van deze beslissingsboom omgevormd tot een binaire beslissingsboom om aan te tonen dat deze vorm niet altijd gebruiksvriendelijk is. Voor meer uitleg zie hoofdstuk 4 van de leerlingencursus van dit project.​" + file_location: "/assets/files/care/MBrainBeslissingsboom.png" + file_icon_name: "description" + link_name: "Download" + - file_title: "Zoektocht naar spraak - Computationeel denken (unplugged activiteit)" + file_info: "Het locked-in syndroom is een van de ergste medische aandoeningen. Je bent volledig verlamd, behalve dat je misschien nog kunt knipperen met een oog. Je intelligente geest zit opgesloten in een nutteloos lichaam: je kan alles voelen, maar niet communiceren. Het kan iedereen overkomen, uit het niets, als gevolg van een beroerte. Als je mensen met het locked-in syndroom zou willen helpen, word je dan best arts of verpleegkundige? Of kan je als computerwetenschapper ook helpen?​" + file_location: "/assets/files/care/ZoektochtNaarSpraak.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Sociale robots en stellingenspel (unplugged activiteit)" + file_info: "In deze presentatie maken leerlingen eerst kennis met sociale robots. Nadien worden de leerlingen aan de hand van enkele stellingen uitgedaagd om stil te staan bij de ethische aspecten van nieuwe technologieën.​ Hoe zit het met privacy? Komen de sociale contacten niet in het gedrang? Welke technologieën worden met open armen ontvangen? Wat is niet wenselijk? Zijn de nieuwe technologieën voor iedereen betaalbaar?" + file_location: "/assets/files/care/StellingenspelByDwengo.pdf" + file_icon_name: "description" + link_name: "Download" + + chatbot: + title: Taaltechnologie + sub_title: Aan de slag met een chatbot + description: "Waar taal en technologie samenkomen, ontstaat het domein van Natural Language Processing. Kan een computer teksten begrijpen, vertalen of zelfs schrijven? Kan een computer emoties herkennen? Leerlingen uit de tweede en derde graad (SO) leren er alles over in dit pakket." + contact: Vragen? Contacteer ons via team@aiopschool.be. De pers kan contact opnemen met Francis wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Projectfiche Chatbot" + file_info: "Dit is een kort overzicht van Chatbot-project met projectstructuur- en kenmerken." + file_location: "/assets/files/chatbot/projectfiche_chatbot.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "BrAInfood Chatbots" + file_info: "In deze brAInfood - gericht naar jongeren - geeft het Kenniscentrum Data & Maatschappij meer informatie over chatbots. De brAInfood bevat een fictief verhaal over Lotte die praat met een chatbot, en vermoedelijk informatie over haar doorgeeft aan bedrijven. Verder worden enkele aandachtspunten met betrekking tot chatbots toegelicht, alsook enkele tips voor jongeren om hun (persoons)gegevens beter te beschermen. Op die manier willen we jongeren bewuster maken van de werking van chatbots en hen stimuleren te reflecteren over de gegevens die van hen worden verzameld.​" + file_location: "/assets/files/chatbot/Brainfood13_Chatbots_NL.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "BrAInfood Gepersonaliseerde nieuwsberichten" + file_info: "In deze brAInfood van het Kenniscentrum Data & Maatschappij worden tips gegeven over hoe je de controle houdt over je newsfeed.​" + file_location: "/assets/files/chatbot/brainfoodaanbevelingnieuws.jpg" + file_icon_name: "description" + link_name: "Download" + - file_title: "Handleiding 'Chatbot' - Ook verkrijgbaar in gedrukte versie" + file_info: "​Leerkrachten verwerven via deze handleiding voldoende achtergrondinformatie om met (een deel van) het 'Chatbot'-project aan de slag te gaan in de klas. Het boek behandelt verschillende aspecten van taaltechnologie, zoals de geschiedenis van de artificiële intelligentie, de ethische aspecten ervan, sentimentanalyse en cyberpestdetectie, chatbots, sprekende digitale assistenten, en auteursherkenning. Er wordt ook ingegaan op de STEM-eindtermen en de eindtermen rond digitale competentie en mediawijsheid." + file_location: "/assets/files/chatbot/Chatbot_handleiding_eerstedruk.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Improbotics - Lesmap - Leerkrachtenversie" + file_info: "In de theatervoorstelling Improbotics improviseert een sociale robot mee in de scènes. In de lesmap vind je informatie over de gebruikte technologieën.​" + file_location: "/assets/files/chatbot/Improbotics_lesmap_Leerkracht.pdf" + file_icon_name: "description" + link_name: "Download" + - file_title: "Improbotics - Lesmap - Leerlingen" + file_info: "In de theatervoorstelling Improbotics improviseert een sociale robot mee in de scènes. In de lesmap vind je informatie over de gebruikte technologieën.​" + file_location: "/assets/files/chatbot/Improbotics_lesmap_Leerling.pdf" + file_icon_name: "description" + link_name: "Download" + + physical_computing: + title: Physical computing + sub_title: Programmeer robots in de klas + description: "Een muziekinstrument, auto of weerstation bouwen? Dat kan met Dwenguino, een microcontrollerplatform met een eigen programmeeromgeving. Leerlingen uit zowel basis- als secundair onderwijs kunnen er meteen mee aan de slag. In het echt of in onze simulator, blokgebaseerd of tekstueel. " + contact: Vragen? Contacteer ons via team@aiopschool.be. De pers kan contact opnemen met Francis wyffels via Francis@dwengo.org. + teaser: https://www.youtube.com/embed/tqSnpAKLsu8 + curricula_files: + - file_title: "Bouw jouw eigen robot" + file_info: "Bouw je eigen rijdende robot." + file_location: "/assets/files/physical_computing/bouwjouweigenrobot.pdf" + file_icon_name: "description" + link_name: "Download" diff --git a/backend/package.json b/backend/package.json index 85a4d255..7b03d8f6 100644 --- a/backend/package.json +++ b/backend/package.json @@ -17,8 +17,10 @@ "@mikro-orm/core": "^6.4.6", "@mikro-orm/postgresql": "^6.4.6", "@mikro-orm/reflection": "^6.4.6", + "@types/js-yaml": "^4.0.9", "dotenv": "^16.4.7", - "express": "^5.0.1" + "express": "^5.0.1", + "js-yaml": "^4.1.0" }, "devDependencies": { "@mikro-orm/cli": "^6.4.6", diff --git a/backend/src/app.ts b/backend/src/app.ts index 65dd8a7a..89e1f3bc 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -1,5 +1,7 @@ import express, { Express, Response } from 'express'; import initORM from './orm.js'; +import themeRoutes from "./routes/themes.js"; + const app: Express = express(); const port: string | number = process.env.PORT || 3000; @@ -7,10 +9,13 @@ const port: string | number = process.env.PORT || 3000; // TODO Replace with Express routes app.get('/', (_, res: Response) => { res.json({ - message: 'Hello Dwengo!', + message: 'Hello Dwengo!🚀', }); }); +app.use("/routes", themeRoutes); + + async function startServer() { await initORM(); diff --git a/backend/src/routes/themes.ts b/backend/src/routes/themes.ts new file mode 100644 index 00000000..8a73c6bf --- /dev/null +++ b/backend/src/routes/themes.ts @@ -0,0 +1,177 @@ +import express, { Request, Response } from "express"; +import fs from "fs"; +import yaml from "js-yaml"; +import path from "path"; + +const router = express.Router(); + +const themes = [ + { + title: "kiks", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "pn_klimaatverandering", + "kiks1_microscopie", "kiks2_practicum", "pn_digitalebeelden", + "kiks3_dl_basis", "kiks4_dl_gevorderd", "kiks5_classificatie", + "kiks6_regressie", "kiks7_ethiek", "kiks8_eindtermen" + ] + }, + { + title: "art", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "art1", "art2", "art3" + ] + }, + { + title: "socialrobot", + hruids: [ + "sr0_lkr", "sr0_lln", "sr1", "sr2", "sr3", "sr4" + ] + }, + { + title: "agriculture", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "agri_landbouw", "agri_lopendeband" + ] + }, + { + title: "wegostem", + hruids: [ + "wegostem" + ] + }, + { + title: "computational_thinking", + hruids: [ + "ct1_concepten", "ct2_concreet", "ct3_voorbeelden", "ct6_cases", + "ct9_impact", "ct10_bebras", "ct8_eindtermen", "ct7_historiek", + "ct5_kijkwijzer", "ct4_evaluatiekader" + ] + }, + { + title: "math_with_python", + hruids: [ + "pn_werking", "maths_pythagoras", "maths_spreidingsdiagrammen", + "maths_rechten", "maths_lineaireregressie", "maths_epidemie", + "pn_digitalebeelden", "maths_logica", "maths_parameters", + "maths_parabolen", "pn_regressie", "maths7_grafen", "maths8_statistiek" + ] + }, + { + title: "python_programming", + hruids: [ + "pn_werking", "pn_datatypes", "pn_operatoren", "pn_structuren", + "pn_functies", "art2", "stem_insectbooks", "un_algoenprog" + ] + }, + { + title: "stem", + hruids: [ + "pn_werking", "maths_spreidingsdiagrammen", "pn_digitalebeelden", + "maths_epidemie", "stem_ipadres", "pn_klimaatverandering", + "stem_rechten", "stem_lineaireregressie", "stem_insectbooks" + ] + }, + { + title: "care", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "aiz1_zorg", "aiz2_grafen", + "aiz3_unplugged", "aiz4_eindtermen", "aiz5_triage" + ] + }, + { + title: "chatbot", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "cb5_chatbotunplugged", + "cb1_chatbot", "cb2_sentimentanalyse", "cb3_vervoegmachine", + "cb4_eindtermen", "cb6" + ] + }, + { + title: "physical_computing", + hruids: [ + "pc_starttodwenguino", "pc_rijdenderobot", "pc_theremin", + "pc_leerlijn_introductie", "pc_leerlijn_invoer_verwerking_uitvoer", + "pc_leerlijn_basisprincipes_digitale_elektronica", + "pc_leerlijn_grafisch_naar_tekstueel", "pc_leerlijn_basis_programmeren", + "pc_leerlijn_van_µc_naar_plc", "pc_leerlijn_fiches_dwenguino", + "pc_leerlijn_seriele_monitor", "pc_leerlijn_bus_protocollen", + "pc_leerlijn_wifi", "pc_leerlijn_fiches_arduino", + "pc_leerlijn_project_lijnvolger", "pc_leerlijn_project_bluetooth", + "pc_leerlijn_hddclock", "pc_leerlijn_fysica_valbeweging", + "pc_leerlijn_luchtkwaliteit", "pc_leerlijn_weerstation", + "pc_leerlijn_g0", "pc_leerlijn_g1", "pc_leerlijn_g3", "pc_leerlijn_g4", + "pc_leerlijn_g5" + ] + }, + { + title: "algorithms", + hruids: [ + "art2", "anm1", "anm2", "anm3", "anm4", "anm11", "anm12", "anm13", + "anm14", "anm15", "anm16", "anm17", "maths_epidemie", "stem_insectbooks" + ] + }, + { + title: "basics_ai", + hruids: [ + "un_artificiele_intelligentie", "org-dwengo-waisda-taal-murder-mistery", + "art1", "org-dwengo-waisda-beelden-emoties-herkennen", + "org-dwengo-waisda-beelden-unplugged-fax-lp", + "org-dwengo-waisda-beelden-teachable-machine" + ] + } +]; + + + +// Define interfaces for type safety +interface Theme { + title: string; + hruids: string[]; +} + +interface Translations { + curricula_page: { + [key: string]: { title: string }; + }; +} + +// Function to load translations from YAML files +const loadTranslations = (language: string): Translations => { + try { + const filePath = path.join(process.cwd(), "_i18n", `${language}.yml`); + const yamlFile = fs.readFileSync(filePath, "utf8"); + return yaml.load(yamlFile) as Translations; + } catch (error) { + console.error(`Kan vertaling niet laden voor ${language}, fallback naar Nederlands`); + const fallbackPath = path.join(process.cwd(), "_i18n", "nl.yml"); + return yaml.load(fs.readFileSync(fallbackPath, "utf8")) as Translations; + } +}; + +// **GET /themes** → Returns a list of all themes as { theme: "key", translation: "Title in requested language" } +router.get("/themes", (req: Request, res: Response) => { + const language = (req.query.language as string)?.toLowerCase() || "nl"; // Default: Nederlands + const translations = loadTranslations(language); + + const themeList = (themes as Theme[]).map((theme) => ({ + key: theme.title, // The original key + theme: translations.curricula_page[theme.title]?.title || theme.title + })); + res.json(themeList); +}); + +// **GET /themes/:theme** → Returns hruids for a theme +router.get("/themes/:theme", (req: Request, res: Response) => { + const themeKey = req.params.theme; // This is the `title` in themes_hruids.json + + // Find the theme in the JSON list + const theme = (themes as Theme[]).find((t) => t.title === themeKey); + + if (theme) { + res.json(theme.hruids); + } else { + res.status(404).json({ error: "Thema niet gevonden" }); + } +}); + +export default router; diff --git a/package-lock.json b/package-lock.json index a00e4f54..6aa75b60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,10 +7,14 @@ "": { "name": "dwengo-1-monorepo", "version": "0.0.1", + "license": "MIT", "workspaces": [ "backend", "frontend" ], + "dependencies": { + "@types/js-yaml": "^4.0.9" + }, "devDependencies": { "@eslint/compat": "^1.2.6", "@eslint/js": "^9.20.0", @@ -26,13 +30,14 @@ "backend": { "name": "dwengo-1-backend", "version": "0.0.1", - "license": "MIT", "dependencies": { "@mikro-orm/core": "^6.4.6", "@mikro-orm/postgresql": "^6.4.6", "@mikro-orm/reflection": "^6.4.6", + "@types/js-yaml": "^4.0.9", "dotenv": "^16.4.7", - "express": "^5.0.1" + "express": "^5.0.1", + "js-yaml": "^4.1.0" }, "devDependencies": { "@mikro-orm/cli": "^6.4.6", @@ -2196,6 +2201,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, "node_modules/@types/jsdom": { "version": "21.1.7", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", @@ -3116,7 +3127,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/array-union": { @@ -5514,7 +5524,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" diff --git a/package.json b/package.json index 59a2e01d..e8e4b33f 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,8 @@ "eslint-config-prettier": "^10.0.1", "jiti": "^2.4.2", "typescript-eslint": "^8.24.1" + }, + "dependencies": { + "@types/js-yaml": "^4.0.9" } } From 2030b97c21c6c7c94ee5db351352128c5ab12259 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Sun, 23 Feb 2025 22:11:15 +0100 Subject: [PATCH 03/92] docs: Details in README Signed-off-by: Tibo De Peuter --- README.md | 21 +++++----- assets/img/dwengo-groen-zwart.png | Bin 0 -> 51176 bytes assets/img/dwengo-groen-zwart.svg | 61 ++++++++++++++++++++++++++++++ backend/README.md | 22 +++++++++++ docs/architecture/schema.png | Bin 0 -> 107430 bytes docs/architecture/schema.py | 30 +++++++++++++++ docs/requirements.txt | 1 + frontend/README.md | 2 + package.json | 1 + 9 files changed, 129 insertions(+), 9 deletions(-) create mode 100644 assets/img/dwengo-groen-zwart.png create mode 100644 assets/img/dwengo-groen-zwart.svg create mode 100644 backend/README.md create mode 100644 docs/architecture/schema.png create mode 100644 docs/architecture/schema.py create mode 100644 docs/requirements.txt diff --git a/README.md b/README.md index 8dc37472..bc1cef46 100644 --- a/README.md +++ b/README.md @@ -23,28 +23,31 @@ en lessen kunnen samenstellen hun leerlingen en hun vooruitgang kunnen opvolgen. ### Quick start -1. Installeer Docker en Docker Compose op je systeem (zie [Docker](https://docs.docker.com/get-docker/)). -2. Clone de repository. -3. Voer `docker-compose up` uit in de root van de repository. +1. Installeer Docker en Docker Compose op je systeem (zie [Docker](https://docs.docker.com/get-docker/) en [Docker Compose](https://docs.docker.com/compose/)). +2. Clone deze repository. +3. Voer `docker compose up` uit in de root van de repository. ```bash docker compose version git clone https://github.com/SELab-2/Dwengo-1.git cd Dwengo-1 -docker-compose up +docker compose up ``` ### Handmatige installatie -Zie de submappen voor de installatie-instructies van de verschillende services. +Zie de submappen voor de installatie-instructies van de [frontend](./frontend/README.md) en [backend](./backend/README.md). ## Architectuur -``` -hier overzichtsdiagram invoegen -``` +![Architectuur](./docs/architecture/schema.png) -We maken gebruik van ... Meer informatie over deze ontwerpsbeslissingen kan je vinden in de [architectuurdocumentatie](./architectuur). +De tech-stack bestaat uit: + +- **Frontend**: TypeScript + Vue.js + Vuetify +- **Backend**: TypeScript + Node.js + Express.js + TypeORM + PostgreSQL + +Voor meer informatie over de keuze van deze tech-stack, zie [designkeuzes](https://github.com/SELab-2/Dwengo-1/wiki/Design-keuzes). ## Bijdragen aan Dwengo-1 diff --git a/assets/img/dwengo-groen-zwart.png b/assets/img/dwengo-groen-zwart.png new file mode 100644 index 0000000000000000000000000000000000000000..9d83c92f7158de23a045fcf729d9e0f40cc1afa2 GIT binary patch literal 51176 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�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 +image/svg+xml diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 00000000..76bc8eae --- /dev/null +++ b/backend/README.md @@ -0,0 +1,22 @@ +# dwengo-1-backend + +## Project setup + +```shell +npm install +``` + +Setup the environment variables in a `.env` file in the root of the project. You can use the `.env.example` file as a template. + +### Development + +```shell +npm run dev +``` + +### Production + +```shell +npm run build +npm run start +``` diff --git a/docs/architecture/schema.png b/docs/architecture/schema.png new file mode 100644 index 0000000000000000000000000000000000000000..616d896ce5eeb6676b92f0665d998102fd3b542b GIT binary patch literal 107430 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

PLzV_nMcyS{Ln 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 literal 0 HcmV?d00001 diff --git a/docs/architecture/schema.py b/docs/architecture/schema.py new file mode 100644 index 00000000..87a59f9a --- /dev/null +++ b/docs/architecture/schema.py @@ -0,0 +1,30 @@ +from diagrams import Cluster, Diagram +from diagrams.custom import Custom +from diagrams.onprem.certificates import LetsEncrypt +from diagrams.onprem.container import Docker +from diagrams.onprem.database import PostgreSQL +from diagrams.onprem.logging import Loki +from diagrams.onprem.monitoring import Grafana +from diagrams.onprem.network import Nginx +from diagrams.programming.framework import Vue +from diagrams.programming.language import Nodejs +from diagrams.programming.flowchart import InputOutput + +with Diagram("Dwengo-1 architectuur", filename="docs/architecture/schema", show=False): + reverse_proxy = Nginx("reverse proxy") + reverse_proxy >> LetsEncrypt("SSL") + + with Cluster("Docker"): + Docker() + + frontend = Vue("/") + backend = Nodejs("/api") + reverse_proxy >> frontend + frontend >> backend >> InputOutput("MikroORM") >> PostgreSQL() + + backend >> Loki("logging") >> Grafana("monitoring") + + with Cluster("Dwengo"): + dwengo = Custom("Dwengo", "../../assets/img/dwengo-groen-zwart.png") + + backend >> dwengo diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 00000000..76c7036b --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1 @@ +diagrams==0.24.1 diff --git a/frontend/README.md b/frontend/README.md index 6714b3a7..f798f404 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -6,6 +6,8 @@ This template should help get you started developing with Vue 3 in Vite. [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). +Webstorm should work out of the box. + ## Type Support for `.vue` Imports in TS TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types. diff --git a/package.json b/package.json index 59a2e01d..db7f5ba3 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "build": "npm run build --ws", "format": "npm run format --ws", "format-check": "npm run format-check --ws", + "generate-docs": "python3 -m venv .venv && source .venv/bin/activate && pip install -r docs/requirements.txt && python docs/architecture/schema.py", "lint": "npm run lint --ws", "test:unit": "npm run test:unit --ws" }, From 6f4e547c9e84855b2045ed54904166e2cb426202 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Sun, 23 Feb 2025 22:26:58 +0100 Subject: [PATCH 04/92] docs: Details in CONTRIBUTING Signed-off-by: Tibo De Peuter --- CONTRIBUTING.md | 67 +++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 83d1f83b..24c7bcd6 100755 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,24 +1,33 @@ # Hoe bijdragen aan Dwengo-1? +Bedankt dat je wil bijdragen aan Dwengo-1! +Hieronder vind je enkele richtlijnen om je op weg te helpen. + +Over het algemeen bestaat de workflow uit de volgende stappen: + +1. [Een issue aanmaken](#issues) +2. [Een branch maken](#workflow) +3. [Code schrijven](#coding-conventions) +4. [Werk committen](#commits) +5. [Een pull request maken](#pull-request) + ## Issues -Maak gebruik van de [label set](https://github.com/SELab-2/Dwengo-1/labels). +Als je een issue aanmaakt is het belangrijk om zo veel mogelijk (relevante) informatie te geven. +Om je op weg te helpen zijn er [templates](.github/ISSUE_TEMPLATE) voorzien. +Gebruik deze om alle nodige informatie te verzamelen. -Voor bug reports: +Gebruik de juiste [labels](https://github.com/SELab-2/Dwengo-1/labels) om te helpen een onderscheid te maken tussen verschillende categorieën issues. -Geef zo veel mogelijk informatie. Als er error berichten zijn, graag in tekst bijvoegen. Geen screenshots van error -messages, enkel van visuele bugs. - -Ken jezelf toe aan een issue als je eraan werkt, zodat iedereen een overzicht heeft van waar aan gewerkt wordt en door -wie. Zo wordt onnodig werk vermeden. +Ken jezelf toe aan een issue als je eraan werkt, zodat er beter een overzicht bewaard kan worden. +Op die manier vermijd je onnodig werk. ## Workflow -We zullen [Gitflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) gebruiken +We zullen (verzachte versie van) [Gitflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) gebruiken. +Lees [hier](TODO-wiki) meer over deze beslissing. -Lees [hier](wiki) meer over deze beslissing - -Concreet: +Concreet betekent dit dat het project uit de volgende branches bestaat: - `main` - Incl. tags (`v1.2.3`) @@ -28,8 +37,23 @@ Concreet: - `fix/something-#x`: Voor (minder dringende) bug fixes. Bug fixes worden aan een issue gelinkt. - `release/x.y.z`: Release prep branch +## Coding conventions + +- Formatting: [Prettier](https://prettier.io/) +- Linting: Maak gebruik van [ESLint](https://typescript-eslint.io/) of aan de hand van de [ + `npm` commando's](package.json). + +Voel je vrij om zelf commit hooks te installeren, maar we dwingen dit niet af. + ## Commits +Om de geschiedenis van het project overzichtelijk te houden, maken we gebruik van [conventional commits](https://www.conventionalcommits.org/). + + +Concreet + +Dit betekent dat elke commit een duidelijke boodschap moet hebben, die volgens een bepaald formaat is opgesteld. + Maken gebruik van [conventional commits](https://www.conventionalcommits.org/) Lees [hier](wiki) meer over deze beslissing @@ -46,26 +70,19 @@ type options: Als je een commit 'fixt', gebruik dan [ `git commit --fixup`](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---fixupamendrewordltcommitgt) -Als je een commit niet alleen hebt geschreven, maak dan -een [commit met meerdere auteurs](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors). +Als je een commit niet alleen hebt geschreven, maak dan een [commit met meerdere auteurs](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors). -## Pull request... +## Pull request + +Eens je code hebt geschreven en gecommit, is het tijd om een pull request te maken. +Het is fijn als je meteen ([draft](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests)) pull requests maakt, zodat anderen kunnen meekijken en feedback kunnen geven. Als je aan visuele features werkt, voeg dan een screenshot van de omgeving van de feature toe, voor en nadat de feature geïmplementeerd werd. -Start een draft pull request vanaf je een nieuwe feature branch pusht naar de server. - -Policies +Je zult merken dat sommige branches [beschermd](https://docs.github.com/en/github/administering-a-repository/about-protected-branches) zijn. +Dit betekent dat je niet zomaar kan mergen naar deze branches: - naar `main`: kan enkel vanuit `release/x.y.z` - naar `dev`: wordt nagekeken alvorens te mergen - elders: vrije keuze - -## Coding conventions - -- Formatting: [Prettier](https://prettier.io/) -- Linting: Maak gebruik van [ESLint](https://typescript-eslint.io/) of aan de hand van de [ - `npm` commando's](package.json). - -Voel je vrij om zelf commit hooks te installeren, maar we dwingen dit niet af. From c815ed1ebffca21c71809e23c62422df52ba7acb Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 24 Feb 2025 20:12:46 +0100 Subject: [PATCH 05/92] chore: Voeg PR template toe PR template om duidelijke en uitgebreide PRs aan te moedigen --- .github/PULL_REQUEST_TEMPLATE.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..2583e398 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,25 @@ + + +## Context + + + +## Richtlijnen + +Zorg ervoor dat het volgende in orde is voordat je de pull request indient: + +- De code volgt de stijlrichtlijnen van dit project. +- Een zelfreview van de code is uitgevoerd. +- Nieuwe en bestaande unittests slagen lokaal met de wijzigingen. +- De juiste labels zijn ingesteld op de pull request. + +## Screenshots + + + +## Aanvullende Opmerkingen + + + + +- Fixes # From f6ab7d5887f78053853671786f37282fe5d8cbbe Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 24 Feb 2025 20:26:40 +0100 Subject: [PATCH 06/92] chore: Herwerk richtlijnen --- .github/PULL_REQUEST_TEMPLATE.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2583e398..e9fb04c6 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,22 +4,25 @@ -## Richtlijnen - -Zorg ervoor dat het volgende in orde is voordat je de pull request indient: - -- De code volgt de stijlrichtlijnen van dit project. -- Een zelfreview van de code is uitgevoerd. -- Nieuwe en bestaande unittests slagen lokaal met de wijzigingen. -- De juiste labels zijn ingesteld op de pull request. - ## Screenshots -## Aanvullende Opmerkingen +## Aanvullende opmerkingen - Fixes # + + From c2d82a9eb2a78d8fc98d8e5f98a30f5a322b37f8 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 24 Feb 2025 20:36:02 +0100 Subject: [PATCH 07/92] docs: Add links to GH profiles --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index bc1cef46..2514dbb7 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,10 @@ Projectopgave

    -
  • Projectleider: Fransisco Van Langenhove (@Gabriellvl)
  • -
  • Technische lead: Tibo De Peuter (@tdpeuter)
  • -
  • Systeembeheerder: Timo De Meyst (@kloep1)
  • -
  • Customer relations officer: Adriaan Jacquet (@WhisperinCheetah)
  • +
  • Projectleider: Fransisco Van Langenhove (@Gabriellvl)
  • +
  • Technische lead: Tibo De Peuter (@tdpeuter)
  • +
  • Systeembeheerder: Timo De Meyst (@kloep1)
  • +
  • Customer relations officer: Adriaan Jacquet (@WhisperinCheetah)
Dit is de monorepo voor [Dwengo-1](https://sel2-1.ugent.be), een interactief leerplatform waar leerkrachten opdrachten From 12aa4ec1a65af7ec3f7f3f28ae3cec81bb3aa584 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 24 Feb 2025 21:16:50 +0100 Subject: [PATCH 08/92] docs: Verduidelijking en juiste links --- CONTRIBUTING.md | 71 ++++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 24c7bcd6..4890521b 100755 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,41 +24,44 @@ Op die manier vermijd je onnodig werk. ## Workflow -We zullen (verzachte versie van) [Gitflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) gebruiken. -Lees [hier](TODO-wiki) meer over deze beslissing. +Dit project maakt gebruik van (een minder strenge versie van) [Gitflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow). +Dat betekent dat verschillende branches een verschillende rol hebben. +Nieuwe branches worden aangemaakt vanuit `dev` en worden gemerged naar `dev`. -Concreet betekent dit dat het project uit de volgende branches bestaat: +Een overzicht: -- `main` - - Incl. tags (`v1.2.3`) -- `dev` +- `main`: Hier worden enkel de releases gemerged. Elke merge naar `main` moet een release zijn, aangeduid met een tag (`v1.2.3`). +- `dev`: Jouw branch hoort hiervan af te takken. - `feat/my-feat`: Voor features die uit geen of meer dan 1 issue bestaan - `feat/this-#x`: Voor features die aan een issue gelinkt kunnen worden - `fix/something-#x`: Voor (minder dringende) bug fixes. Bug fixes worden aan een issue gelinkt. -- `release/x.y.z`: Release prep branch +- `release/x.y.z`: Voorbereidingen voor een release. Hier worden enkel bug fixes en hotfixes gemerged. + +Lees [hier](https://github.com/SELab-2/Dwengo-1/wiki/Developmentstrategie-keuzes#gitflow) meer over de beslissing om Gitflow te gebruiken. + +We hebben ervoor gekozen om `main` en `dev` te beschermen. +Zie ook [pull request](#pull-request). ## Coding conventions -- Formatting: [Prettier](https://prettier.io/) -- Linting: Maak gebruik van [ESLint](https://typescript-eslint.io/) of aan de hand van de [ - `npm` commando's](package.json). +Om de code consistent te houden, maken dit project gebruik van enkele tools: -Voel je vrij om zelf commit hooks te installeren, maar we dwingen dit niet af. +- Formatting: [Prettier](https://prettier.io/), zorgt ervoor dat de code consistent geformatteerd is. +- Linting: [ESLint](https://typescript-eslint.io/), zorgt er o.a. voor dat de code geen "slechte" constructies bevat. + +Je kan ze handmatig uitvoeren met `npm run lint` en `npm run format`. + +Deze tools worden niet standaard automatisch uitgevoerd bij een commit. +Automatisch uitvoeren bij een commit kan met [git hooks](https://git-scm.com/docs/githooks). ## Commits -Om de geschiedenis van het project overzichtelijk te houden, maken we gebruik van [conventional commits](https://www.conventionalcommits.org/). +**Conventionele commits** - -Concreet +Dit project maakt gebruik van [conventional commits](https://www.conventionalcommits.org/). Dit betekent dat elke commit een duidelijke boodschap moet hebben, die volgens een bepaald formaat is opgesteld. - -Maken gebruik van [conventional commits](https://www.conventionalcommits.org/) - -Lees [hier](wiki) meer over deze beslissing - -Concreet: +In het kort ziet dat er zo uit: ``` (): @@ -67,8 +70,11 @@ type options: feat, fix, refactor, test, docs, build, ci, chore, ... ``` -Als je een commit 'fixt', gebruik dan [ -`git commit --fixup`](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---fixupamendrewordltcommitgt) +Lees [hier](https://github.com/SELab-2/Dwengo-1/wiki/Developmentstrategie-keuzes#conventionele-commits) meer over de beslissing om conventionele commits te gebruiken. + +**Andere tips** + +Als je een commit 'fixt', gebruik dan [`git commit --fixup`](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---fixupamendrewordltcommitgt) Als je een commit niet alleen hebt geschreven, maak dan een [commit met meerdere auteurs](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors). @@ -77,12 +83,23 @@ Als je een commit niet alleen hebt geschreven, maak dan een [commit met meerdere Eens je code hebt geschreven en gecommit, is het tijd om een pull request te maken. Het is fijn als je meteen ([draft](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests)) pull requests maakt, zodat anderen kunnen meekijken en feedback kunnen geven. -Als je aan visuele features werkt, voeg dan een screenshot van de omgeving van de feature toe, voor en nadat de feature -geïmplementeerd werd. +Om je op weg te helpen is er een [template](.github/PULL_REQUEST_TEMPLATE.md) voorzien. +Door deze in te vullen, zorg je ervoor dat de reviewer een duidelijk beeld heeft van wat je hebt gedaan. + +Als je aan visuele features werkt, voeg dan een screenshot van de omgeving van de feature toe, voor en na dat de feature geïmplementeerd werd. + +**Branch protection** Je zult merken dat sommige branches [beschermd](https://docs.github.com/en/github/administering-a-repository/about-protected-branches) zijn. Dit betekent dat je niet zomaar kan mergen naar deze branches: -- naar `main`: kan enkel vanuit `release/x.y.z` -- naar `dev`: wordt nagekeken alvorens te mergen -- elders: vrije keuze +- `main`: kan enkel vanuit `release/x.y.z` +- `dev`: wordt nagekeken alvorens te mergen + +Elders kan je vrij mergen. + +Het zou kunnen dat je code bepaalde checks moet doorstaan alvorens te mergen. +Dit kan gaan van een simpele lint check tot een volledige test suite die moet slagen. +Tag gerust een maintainer als je denkt dat je code klaar is om gemerged te worden. + +## Dankjewel! From e28f1405ec807fa3b05a99d663e6375c2f47c4fd Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Tue, 25 Feb 2025 08:15:35 +0100 Subject: [PATCH 09/92] fix: Link naar projectopgave --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2514dbb7..db5b63a4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ OneDrive Figma - + Projectopgave

From f45a9aa5a5980c6b59a99726095217edfea847f0 Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Tue, 25 Feb 2025 11:03:00 +0100 Subject: [PATCH 10/92] map routers gemaakt met router files in, backend/src/app.ts bevat verwijzingen naar deze files met app.use --- backend/src/app.ts | 18 ++++++++++++++++++ backend/src/routes/assignment.ts | 9 +++++++++ backend/src/routes/class.ts | 9 +++++++++ backend/src/routes/group.ts | 14 ++++++++++++++ backend/src/routes/login.ts | 9 +++++++++ backend/src/routes/question.ts | 9 +++++++++ backend/src/routes/student.ts | 25 +++++++++++++++++++++++++ backend/src/routes/submission.ts | 9 +++++++++ backend/src/routes/themes.ts | 10 ++++++++++ 9 files changed, 112 insertions(+) create mode 100644 backend/src/routes/assignment.ts create mode 100644 backend/src/routes/class.ts create mode 100644 backend/src/routes/group.ts create mode 100644 backend/src/routes/login.ts create mode 100644 backend/src/routes/question.ts create mode 100644 backend/src/routes/student.ts create mode 100644 backend/src/routes/submission.ts create mode 100644 backend/src/routes/themes.ts diff --git a/backend/src/app.ts b/backend/src/app.ts index 65dd8a7a..532f7734 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -1,9 +1,18 @@ import express, { Express, Response } from 'express'; import initORM from './orm.js'; +import studentRouter from './routes/student'; +import groupRouter from './routes/group'; +import assignmentRouter from './routes/assignment'; +import submissionRouter from './routes/submission'; +import classRouter from './routes/class'; +import questionRouter from './routes/question'; +import loginRouter from './routes/login'; + const app: Express = express(); const port: string | number = process.env.PORT || 3000; + // TODO Replace with Express routes app.get('/', (_, res: Response) => { res.json({ @@ -11,6 +20,15 @@ app.get('/', (_, res: Response) => { }); }); +app.use('/student', studentRouter); +app.use('/group', groupRouter); +app.use('/assignment', assignmentRouter); +app.use('/submission', submissionRouter); +app.use('/class', classRouter); +app.use('/question', questionRouter); +app.use('/login', loginRouter); + + async function startServer() { await initORM(); diff --git a/backend/src/routes/assignment.ts b/backend/src/routes/assignment.ts new file mode 100644 index 00000000..0a3b4c02 --- /dev/null +++ b/backend/src/routes/assignment.ts @@ -0,0 +1,9 @@ +import express from 'express' +const router = express.Router(); + +// information about an assignment with id 'id' +router.get('/:id', (req, res) => { + res.send('assignment'); +}) + +export default router \ No newline at end of file diff --git a/backend/src/routes/class.ts b/backend/src/routes/class.ts new file mode 100644 index 00000000..746e8662 --- /dev/null +++ b/backend/src/routes/class.ts @@ -0,0 +1,9 @@ +import express from 'express' +const router = express.Router(); + +// information about an class with id 'id' +router.get('/:id', (req, res) => { + res.send('class'); +}) + +export default router \ No newline at end of file diff --git a/backend/src/routes/group.ts b/backend/src/routes/group.ts new file mode 100644 index 00000000..87e8e6ee --- /dev/null +++ b/backend/src/routes/group.ts @@ -0,0 +1,14 @@ +import express from 'express' +const router = express.Router(); + +// information about a group (members, ... [TODO DOC]) +router.get('/:id', (req, res) => { + res.send('group'); +}) + +// the list of questions a group has made +router.get('/:id/questions', (req, res) => { + res.send('questions'); +}) + +export default router \ No newline at end of file diff --git a/backend/src/routes/login.ts b/backend/src/routes/login.ts new file mode 100644 index 00000000..691a860c --- /dev/null +++ b/backend/src/routes/login.ts @@ -0,0 +1,9 @@ +import express from 'express' +const router = express.Router(); + +// returns login paths for IDP +router.get('/', (req, res) => { + res.send('login route'); +}) + +export default router \ No newline at end of file diff --git a/backend/src/routes/question.ts b/backend/src/routes/question.ts new file mode 100644 index 00000000..1de0ae42 --- /dev/null +++ b/backend/src/routes/question.ts @@ -0,0 +1,9 @@ +import express from 'express' +const router = express.Router(); + +// information about an question with id 'id' +router.get('/:id', (req, res) => { + res.send('question'); +}) + +export default router \ No newline at end of file diff --git a/backend/src/routes/student.ts b/backend/src/routes/student.ts new file mode 100644 index 00000000..151b050f --- /dev/null +++ b/backend/src/routes/student.ts @@ -0,0 +1,25 @@ +import express from 'express' +const router = express.Router(); + +// the list of classes a student is in +router.get('/:id/classes', (req, res) => { + res.send('classes'); +}) + +// the list of submissions a student has made +router.get('/:id/submissions', (req, res) => { + res.send('submissions'); +}) + + +// the list of assignments a student has +router.get('/:id/assignments', (req, res) => { + res.send('assignments'); +}) + +// the list of groups a student is in +router.get('/:id/group', (req, res) => { + res.send('groups'); +}) + +export default router \ No newline at end of file diff --git a/backend/src/routes/submission.ts b/backend/src/routes/submission.ts new file mode 100644 index 00000000..dbec9c8b --- /dev/null +++ b/backend/src/routes/submission.ts @@ -0,0 +1,9 @@ +import express from 'express' +const router = express.Router(); + +// information about an submission with id 'id' +router.get('/:id', (req, res) => { + res.send('submission'); +}) + +export default router \ No newline at end of file diff --git a/backend/src/routes/themes.ts b/backend/src/routes/themes.ts new file mode 100644 index 00000000..99f4dd0c --- /dev/null +++ b/backend/src/routes/themes.ts @@ -0,0 +1,10 @@ +import express from 'express' +const router = express.Router(); + +// I'm not sure what's supposed to be here +// https://github.com/SELab-2/Dwengo-1/issues/24 +router.get('/', (req, res) => { + res.send('themes route'); +}) + +export default router \ No newline at end of file From deb5d772cbcdf46e8593e80ce384705f87c8648d Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Tue, 25 Feb 2025 11:04:52 +0100 Subject: [PATCH 11/92] pad suffixen in routes/student.ts en routes/group.ts veranderd naar enkelvoud --- backend/src/routes/group.ts | 2 +- backend/src/routes/student.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/routes/group.ts b/backend/src/routes/group.ts index 87e8e6ee..36e0be6e 100644 --- a/backend/src/routes/group.ts +++ b/backend/src/routes/group.ts @@ -7,7 +7,7 @@ router.get('/:id', (req, res) => { }) // the list of questions a group has made -router.get('/:id/questions', (req, res) => { +router.get('/:id/question', (req, res) => { res.send('questions'); }) diff --git a/backend/src/routes/student.ts b/backend/src/routes/student.ts index 151b050f..55582992 100644 --- a/backend/src/routes/student.ts +++ b/backend/src/routes/student.ts @@ -2,18 +2,18 @@ import express from 'express' const router = express.Router(); // the list of classes a student is in -router.get('/:id/classes', (req, res) => { +router.get('/:id/class', (req, res) => { res.send('classes'); }) // the list of submissions a student has made -router.get('/:id/submissions', (req, res) => { +router.get('/:id/submission', (req, res) => { res.send('submissions'); }) // the list of assignments a student has -router.get('/:id/assignments', (req, res) => { +router.get('/:id/assignment', (req, res) => { res.send('assignments'); }) From 16b8ab368b48d2cf850f287d9f1d8f02334a3441 Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Tue, 25 Feb 2025 12:27:57 +0100 Subject: [PATCH 12/92] databank verbinding in app.ts uitgezet, dummy json bodies toegevoegd in verschillende routes --- backend/package.json | 7 ++++--- backend/src/app.ts | 4 ++-- backend/src/routes/assignment.ts | 9 ++++++++- backend/src/routes/class.ts | 10 +++++++++- backend/src/routes/group.ts | 14 ++++++++++++-- backend/src/routes/login.ts | 7 ++++++- backend/src/routes/question.ts | 10 +++++++++- backend/src/routes/student.ts | 24 ++++++++++++++++-------- backend/src/routes/submission.ts | 9 ++++++++- 9 files changed, 74 insertions(+), 20 deletions(-) diff --git a/backend/package.json b/backend/package.json index 85a4d255..8aae346d 100644 --- a/backend/package.json +++ b/backend/package.json @@ -14,9 +14,10 @@ "test:unit": "vitest --run" }, "dependencies": { - "@mikro-orm/core": "^6.4.6", - "@mikro-orm/postgresql": "^6.4.6", - "@mikro-orm/reflection": "^6.4.6", + "@mikro-orm/core": "6.4.6", + "@mikro-orm/postgresql": "6.4.6", + "@mikro-orm/sqlite": "6.4.6", + "@mikro-orm/reflection": "6.4.6", "dotenv": "^16.4.7", "express": "^5.0.1" }, diff --git a/backend/src/app.ts b/backend/src/app.ts index 532f7734..b21ca26b 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -1,5 +1,5 @@ import express, { Express, Response } from 'express'; -import initORM from './orm.js'; +import { initORM } from './orm.js'; import studentRouter from './routes/student'; import groupRouter from './routes/group'; @@ -30,7 +30,7 @@ app.use('/login', loginRouter); async function startServer() { - await initORM(); + //await initORM(); app.listen(port, () => { console.log(`Server is running at http://localhost:${port}`); diff --git a/backend/src/routes/assignment.ts b/backend/src/routes/assignment.ts index 0a3b4c02..95116243 100644 --- a/backend/src/routes/assignment.ts +++ b/backend/src/routes/assignment.ts @@ -3,7 +3,14 @@ const router = express.Router(); // information about an assignment with id 'id' router.get('/:id', (req, res) => { - res.send('assignment'); + res.json({ + id: req.params.id, + title: 'Dit is een test assignment', + description: 'Een korte beschrijving', + groups: [ '0' ], + learningPath: '0', + class: '0' + }); }) export default router \ No newline at end of file diff --git a/backend/src/routes/class.ts b/backend/src/routes/class.ts index 746e8662..c9fe4259 100644 --- a/backend/src/routes/class.ts +++ b/backend/src/routes/class.ts @@ -3,7 +3,15 @@ const router = express.Router(); // information about an class with id 'id' router.get('/:id', (req, res) => { - res.send('class'); + res.json({ + id: req.params.id, + displayName: 'Klas 4B', + teachers: [ '0' ], + students: [ '0' ], + assignments: [ '0' ], + joinRequests: [ '0' ], + invitations: [ '0' ], + }); }) export default router \ No newline at end of file diff --git a/backend/src/routes/group.ts b/backend/src/routes/group.ts index 36e0be6e..bca20889 100644 --- a/backend/src/routes/group.ts +++ b/backend/src/routes/group.ts @@ -3,12 +3,22 @@ const router = express.Router(); // information about a group (members, ... [TODO DOC]) router.get('/:id', (req, res) => { - res.send('group'); + res.json({ + id: req.params.id, + assignment: '0', + students: [ '0' ], + submissions: [ '0' ], + // reference to other endpoint + // should be less hardcoded + questions: `/group/${req.params.id}/question`, + }); }) // the list of questions a group has made router.get('/:id/question', (req, res) => { - res.send('questions'); + res.json({ + questions: [ '0' ], + }); }) export default router \ No newline at end of file diff --git a/backend/src/routes/login.ts b/backend/src/routes/login.ts index 691a860c..550e6d93 100644 --- a/backend/src/routes/login.ts +++ b/backend/src/routes/login.ts @@ -3,7 +3,12 @@ const router = express.Router(); // returns login paths for IDP router.get('/', (req, res) => { - res.send('login route'); + res.json({ + // dummy variables, needs to be changed + // with IDP endpoints + leerkracht: '/login-leerkracht', + leerling: '/login-leerling', + }); }) export default router \ No newline at end of file diff --git a/backend/src/routes/question.ts b/backend/src/routes/question.ts index 1de0ae42..2218abf9 100644 --- a/backend/src/routes/question.ts +++ b/backend/src/routes/question.ts @@ -3,7 +3,15 @@ const router = express.Router(); // information about an question with id 'id' router.get('/:id', (req, res) => { - res.send('question'); + res.json({ + id: req.params.id, + student: '0', + group: '0', + time: new Date(2025, 1, 1), + content: 'Zijn alle gehele getallen groter dan 2 gelijk aan de som van 2 priemgetallen????', + answers: [ '0' ], + learningObject: [ '0' ], + }); }) export default router \ No newline at end of file diff --git a/backend/src/routes/student.ts b/backend/src/routes/student.ts index 55582992..3c8cd16c 100644 --- a/backend/src/routes/student.ts +++ b/backend/src/routes/student.ts @@ -2,24 +2,32 @@ import express from 'express' const router = express.Router(); // the list of classes a student is in -router.get('/:id/class', (req, res) => { - res.send('classes'); +router.get('/:id/classes', (req, res) => { + res.json({ + classes: [ '0' ], + }); }) // the list of submissions a student has made -router.get('/:id/submission', (req, res) => { - res.send('submissions'); +router.get('/:id/submissions', (req, res) => { + res.json({ + submissions: [ '0' ], + }); }) // the list of assignments a student has -router.get('/:id/assignment', (req, res) => { - res.send('assignments'); +router.get('/:id/assignments', (req, res) => { + res.json({ + assignments: [ '0' ], + }); }) // the list of groups a student is in -router.get('/:id/group', (req, res) => { - res.send('groups'); +router.get('/:id/groups', (req, res) => { + res.json({ + groups: [ '0' ], + }); }) export default router \ No newline at end of file diff --git a/backend/src/routes/submission.ts b/backend/src/routes/submission.ts index dbec9c8b..b830af8b 100644 --- a/backend/src/routes/submission.ts +++ b/backend/src/routes/submission.ts @@ -3,7 +3,14 @@ const router = express.Router(); // information about an submission with id 'id' router.get('/:id', (req, res) => { - res.send('submission'); + res.json({ + id: req.params.id, + student: '0', + group: '0', + time: new Date(2025, 1, 1), + content: 'Wortel 2 is rationeel', + learningObject: '0', + }); }) export default router \ No newline at end of file From d9998a99eae2f2721a91950e18784a2d8894845d Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Tue, 25 Feb 2025 12:32:06 +0100 Subject: [PATCH 13/92] databank aanpassingen teruggerold, import statement geupdate in app.ts --- backend/src/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/app.ts b/backend/src/app.ts index b21ca26b..5e4e781a 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -1,5 +1,5 @@ import express, { Express, Response } from 'express'; -import { initORM } from './orm.js'; +import initORM from './orm.js'; import studentRouter from './routes/student'; import groupRouter from './routes/group'; From 62a278a6e0334dd7ba7d1d914f369b30014900fb Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Fri, 21 Feb 2025 00:24:10 +0100 Subject: [PATCH 14/92] feat(backend): Databank initialiseren Verbinding met databank aangemaakt, eerste entities toegevoegd, centrale API aangemaakt om omgevingsvariabelen voor onze app op te vragen. --- .gitignore | 6 ++- backend/src/entities/users/student.entity.ts | 6 +++ backend/src/entities/users/teacher.entity.ts | 7 ++++ .../src/entities/{ => users}/user.entity.ts | 6 +-- backend/src/mikro-orm.config.ts | 11 +++-- backend/src/orm.ts | 15 ++++++- backend/src/util/envvars.ts | 42 +++++++++++++++++++ docker-compose.yml | 3 +- 8 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 backend/src/entities/users/student.entity.ts create mode 100644 backend/src/entities/users/teacher.entity.ts rename backend/src/entities/{ => users}/user.entity.ts (67%) create mode 100644 backend/src/util/envvars.ts diff --git a/.gitignore b/.gitignore index 9bb07775..d28e7d73 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,9 @@ build/Release node_modules/ jspm_packages/ +# package-lock.json +backend/package-lock.json + # Snowpack dependency directory (https://snowpack.dev/) web_modules/ @@ -641,7 +644,8 @@ FodyWeavers.xsd .LSOverride # Icon must end with two \r -Icon +Icon + # Thumbnails ._* diff --git a/backend/src/entities/users/student.entity.ts b/backend/src/entities/users/student.entity.ts new file mode 100644 index 00000000..ab5a537a --- /dev/null +++ b/backend/src/entities/users/student.entity.ts @@ -0,0 +1,6 @@ +import {User} from "./user.entity"; +import { Entity } from '@mikro-orm/core'; + +@Entity() +export class Student extends User { +} diff --git a/backend/src/entities/users/teacher.entity.ts b/backend/src/entities/users/teacher.entity.ts new file mode 100644 index 00000000..0b3e8c18 --- /dev/null +++ b/backend/src/entities/users/teacher.entity.ts @@ -0,0 +1,7 @@ +import { Entity } from '@mikro-orm/core'; +import {User} from "./user.entity"; + +@Entity() +export class Teacher extends User { + +} diff --git a/backend/src/entities/user.entity.ts b/backend/src/entities/users/user.entity.ts similarity index 67% rename from backend/src/entities/user.entity.ts rename to backend/src/entities/users/user.entity.ts index f7b0c426..0da754f5 100644 --- a/backend/src/entities/user.entity.ts +++ b/backend/src/entities/users/user.entity.ts @@ -1,9 +1,9 @@ import { Entity, PrimaryKey, Property } from '@mikro-orm/core'; -@Entity() +@Entity({abstract: true}) export class User { - @PrimaryKey({ type: 'number' }) - id!: number; + @PrimaryKey({type: "string"}) + username!: string; @Property() firstName: string = ''; diff --git a/backend/src/mikro-orm.config.ts b/backend/src/mikro-orm.config.ts index c4302a37..d5e97046 100644 --- a/backend/src/mikro-orm.config.ts +++ b/backend/src/mikro-orm.config.ts @@ -1,9 +1,14 @@ -import { Options } from '@mikro-orm/core'; -import { PostgreSqlDriver } from '@mikro-orm/postgresql'; +import {Options} from '@mikro-orm/core'; +import {PostgreSqlDriver} from "@mikro-orm/postgresql"; +import {EnvVars, getEnvVar, getNumericEnvVar} from "./util/envvars"; const config: Options = { driver: PostgreSqlDriver, - dbName: 'dwengo', + host: getEnvVar(EnvVars.DbHost, {required: true}), + port: getNumericEnvVar(EnvVars.DbPort, {defaultValue: 5432}), + dbName: getEnvVar(EnvVars.DbName, {defaultValue: "dwengo"}), + user: getEnvVar(EnvVars.DbUsername, {required: true}), + password: getEnvVar(EnvVars.DbPassword, {required: true}), entities: ['dist/**/*.entity.js'], entitiesTs: ['src/**/*.entity.ts'], debug: true, diff --git a/backend/src/orm.ts b/backend/src/orm.ts index d9de328f..16727a76 100644 --- a/backend/src/orm.ts +++ b/backend/src/orm.ts @@ -1,6 +1,19 @@ import { MikroORM } from '@mikro-orm/core'; import config from './mikro-orm.config.js'; +import {EnvVars, getEnvVar} from "./util/envvars"; export default async function initORM() { - await MikroORM.init(config); + const orm = await MikroORM.init(config); + + // Update the database scheme if necessary and enabled. + if (getEnvVar(EnvVars.DbUpdate)) { + await orm.schema.updateSchema(); + } else { + const diff = await orm.schema.getUpdateSchemaSQL(); + if (diff) { + throw Error("The database structure needs to be updated in order to fit the new database structure " + + "of the app. In order to do so automatically, set the environment variable DWENGO_DB_UPDATE to true. " + + "The following queries will then be executed:\n" + diff) + } + } } diff --git a/backend/src/util/envvars.ts b/backend/src/util/envvars.ts new file mode 100644 index 00000000..f9bdfb50 --- /dev/null +++ b/backend/src/util/envvars.ts @@ -0,0 +1,42 @@ +const PREFIX = "DWENGO_"; +const DB_PREFIX = PREFIX + "DB_"; + +type EnvVar = {[key: string]: {name: string, required?: boolean, defaultValue?: boolean}}; + +export const EnvVars: EnvVar = { + DbHost: {key: DB_PREFIX + "HOST", required: true}, + DbPort: {key: DB_PREFIX + "PORT", defaultValue: 5432}, + DbName: {key: DB_PREFIX + "NAME", defaultValue: "dwengo"}, + DbUsername: {key: DB_PREFIX + "USERNAME", required: true}, + DbPassword: {key: DB_PREFIX + "PASSWORD", required: true}, + DbUpdate: {key: DB_PREFIX + "UPDATE", defaultValue: false}, +} as const; + +/** + * Returns the value of the given environment variable if it is set. + * Otherwise, + * - throw an error if the environment variable was required, + * - return the default value if there is one and it was not required, + * - return an empty string if the environment variable is not required and there is also no default. + * @param envVar The properties of the environment variable (from the EnvVar object). + */ +export function getEnvVar(envVar: EnvVar): string { + const value: string | undefined = process.env[envVar.key]; + if (value) { + return value; + } else if (envVar.required) { + throw new Error(`Missing environment variable: ${envVar.key}`); + } else { + return envVar.defaultValue || ""; + } +} + +export function getNumericEnvVar(envVar: EnvVar): number { + const valueString = getEnvVar(envVar); + const value = parseInt(valueString); + if (isNaN(value)) { + throw new Error(`Invalid value for environment variable ${envVar.key}: ${valueString}. Expected a number.`) + } else { + return value; + } +} diff --git a/docker-compose.yml b/docker-compose.yml index e8efb530..88b9f491 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,8 +6,7 @@ services: POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres ports: - - "5432:5432" - network_mode: "host" + - "5431:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./backend/config/db/init.sql:/docker-entrypoint-initdb.d/init.sql From d5101737efbb0e7603f4ed4586a31077ca045c01 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Sun, 23 Feb 2025 10:02:19 +0100 Subject: [PATCH 15/92] feat(backend): Entities toegevoegd Entites Class, Class Join Request, Class Invitation, Assignment, Group en entities om de Dwengo-leerinhoud te modelleren, toegevoegd. --- backend/package.json | 3 +- .../entities/assigments/assignment.entity.ts | 25 +++++ .../src/entities/assigments/group.entity.ts | 15 +++ .../classes/class-invitation.entity.ts | 18 ++++ .../classes/class-join-request.entity.ts | 21 +++++ backend/src/entities/classes/class.entity.ts | 19 ++++ .../src/entities/content/attachment.entity.ts | 16 ++++ backend/src/entities/content/language.ts | 6 ++ .../content/learning-object.entity.ts | 93 +++++++++++++++++++ .../entities/content/learning-path.entity.ts | 50 ++++++++++ backend/src/entities/users/student.entity.ts | 5 +- backend/src/entities/users/teacher.entity.ts | 6 +- backend/src/entities/users/user.entity.ts | 2 +- package-lock.json | 17 +++- 14 files changed, 289 insertions(+), 7 deletions(-) create mode 100644 backend/src/entities/assigments/assignment.entity.ts create mode 100644 backend/src/entities/assigments/group.entity.ts create mode 100644 backend/src/entities/classes/class-invitation.entity.ts create mode 100644 backend/src/entities/classes/class-join-request.entity.ts create mode 100644 backend/src/entities/classes/class.entity.ts create mode 100644 backend/src/entities/content/attachment.entity.ts create mode 100644 backend/src/entities/content/language.ts create mode 100644 backend/src/entities/content/learning-object.entity.ts create mode 100644 backend/src/entities/content/learning-path.entity.ts diff --git a/backend/package.json b/backend/package.json index 85a4d255..376d3416 100644 --- a/backend/package.json +++ b/backend/package.json @@ -18,7 +18,8 @@ "@mikro-orm/postgresql": "^6.4.6", "@mikro-orm/reflection": "^6.4.6", "dotenv": "^16.4.7", - "express": "^5.0.1" + "express": "^5.0.1", + "uuid": "^11.1.0" }, "devDependencies": { "@mikro-orm/cli": "^6.4.6", diff --git a/backend/src/entities/assigments/assignment.entity.ts b/backend/src/entities/assigments/assignment.entity.ts new file mode 100644 index 00000000..f3bd6a19 --- /dev/null +++ b/backend/src/entities/assigments/assignment.entity.ts @@ -0,0 +1,25 @@ +import {Entity, ManyToOne, OneToMany, PrimaryKey, Property} from "@mikro-orm/core"; +import {Class} from "../classes/class.entity"; +import {LearningPath} from "../content/learning-path.entity"; +import {Group} from "./group.entity" + +@Entity() +export class Assignment { + @ManyToOne({entity: () => Class, primary: true}) + within!: Class; + + @PrimaryKey({type: "number"}) + id!: number; + + @Property({type: "string"}) + title!: string; + + @Property({type: "longtext"}) + description!: string; + + @ManyToOne({entity: () => LearningPath}) + task!: LearningPath; + + @OneToMany({entity: () => Group}) + groups!: Group[]; +} diff --git a/backend/src/entities/assigments/group.entity.ts b/backend/src/entities/assigments/group.entity.ts new file mode 100644 index 00000000..48ca08d7 --- /dev/null +++ b/backend/src/entities/assigments/group.entity.ts @@ -0,0 +1,15 @@ +import {Entity, ManyToMany, ManyToOne, PrimaryKey} from "@mikro-orm/core"; +import {Assignment} from "./assignment.entity"; +import {Student} from "../users/student.entity"; + +@Entity() +export class Group { + @ManyToOne({entity: () => Assignment, primary: true}) + assignment!: Assignment; + + @PrimaryKey({type: "integer"}) + groupNumber!: number; + + @ManyToMany({entity: Student}) + members!: Student[]; +} diff --git a/backend/src/entities/classes/class-invitation.entity.ts b/backend/src/entities/classes/class-invitation.entity.ts new file mode 100644 index 00000000..c945b97e --- /dev/null +++ b/backend/src/entities/classes/class-invitation.entity.ts @@ -0,0 +1,18 @@ +import {Entity, ManyToOne} from "@mikro-orm/core"; +import {Teacher} from "../users/teacher.entity"; +import {Class} from "./class.entity"; + +/** + * Invitation of a teacher into a class (in order to teach it). + */ +@Entity() +export class TeacherInvitation { + @ManyToOne({entity: () => Teacher, primary: true}) + sender!: Teacher; + + @ManyToOne({entity: () => Teacher, primary: true}) + receiver!: Teacher; + + @ManyToOne({entity: () => Class, primary: true}) + class!: Class; +} diff --git a/backend/src/entities/classes/class-join-request.entity.ts b/backend/src/entities/classes/class-join-request.entity.ts new file mode 100644 index 00000000..1a8485aa --- /dev/null +++ b/backend/src/entities/classes/class-join-request.entity.ts @@ -0,0 +1,21 @@ +import {Entity, Enum, ManyToOne} from "@mikro-orm/core"; +import {Student} from "../users/student.entity"; +import {Class} from "./class.entity"; + +@Entity() +export class ClassJoinRequest { + @ManyToOne({entity: () => Student, primary: true}) + requester!: Student; + + @ManyToOne({entity: () => Class, primary: true}) + class!: Class; + + @Enum(() => ClassJoinRequestStatus) + status!: ClassJoinRequestStatus; +} + +export enum ClassJoinRequestStatus { + Open = "open", + Accepted = "accepted", + Declined = "declined" +} diff --git a/backend/src/entities/classes/class.entity.ts b/backend/src/entities/classes/class.entity.ts new file mode 100644 index 00000000..fa9d3cf8 --- /dev/null +++ b/backend/src/entities/classes/class.entity.ts @@ -0,0 +1,19 @@ +import {Collection, Entity, ManyToMany, PrimaryKey, Property} from "@mikro-orm/core"; +import { v4 } from 'uuid'; +import {Teacher} from "../users/teacher.entity"; +import {Student} from "../users/student.entity"; + +@Entity() +export class Class { + @PrimaryKey() + classId = v4(); + + @Property({type: "string"}) + displayName!: string; + + @ManyToMany(() => Teacher) + teachers!: Collection; + + @ManyToMany(() => Student) + students!: Collection; +} diff --git a/backend/src/entities/content/attachment.entity.ts b/backend/src/entities/content/attachment.entity.ts new file mode 100644 index 00000000..ac6edd93 --- /dev/null +++ b/backend/src/entities/content/attachment.entity.ts @@ -0,0 +1,16 @@ +import {ManyToOne, PrimaryKey, Property} from "@mikro-orm/core"; +import {LearningObject} from "./learning-object.entity"; + +export class Attachment { + @ManyToOne({entity: () => LearningObject, primary: true}) + learningObject!: LearningObject; + + @PrimaryKey({type: "integer"}) + no!: number; + + @Property({type: "string"}) + mimeType!: string; + + @Property({type: "blob"}) + content!: Buffer; +} diff --git a/backend/src/entities/content/language.ts b/backend/src/entities/content/language.ts new file mode 100644 index 00000000..b51e2c95 --- /dev/null +++ b/backend/src/entities/content/language.ts @@ -0,0 +1,6 @@ +export enum Language { + Dutch = "nl", + French = "fr", + English = "en", + Germany = "de" +} diff --git a/backend/src/entities/content/learning-object.entity.ts b/backend/src/entities/content/learning-object.entity.ts new file mode 100644 index 00000000..60db77af --- /dev/null +++ b/backend/src/entities/content/learning-object.entity.ts @@ -0,0 +1,93 @@ +import {Embeddable, Embedded, Entity, Enum, OneToMany, PrimaryKey, Property} from "@mikro-orm/core"; +import {Language} from "./language"; +import {Attachment} from "./attachment.entity"; + +@Entity() +export class LearningObject { + @PrimaryKey({type: "string"}) + hruid!: string; + + @Enum({items: () => Language, primary: true}) + language!: Language; + + @PrimaryKey({type: "string"}) + version: number = "1"; + + @PrimaryKey({type: "string"}) + author!: string; + + @Property({type: "string"}) + title!: string; + + @Property({type: "longtext"}) + description!: string; + + @Property({type: "string"}) + contentType!: string; + + @Property({type: "array"}) + keywords: string[] = []; + + @Property({type: "array", nullable: true}) + targetAges?: number[]; + + @Property({type: "bool"}) + teacherExclusive: boolean = false; + + @Property({type: "array"}) + skosConcepts!: string[]; + + @Embedded({entity: () => EducationalGoal, array: true}) + educationalGoals: EducationalGoal[] = []; + + @Property({type: "string"}) + copyright: string = "" + + @Property({type: "string"}) + license: string = "" + + @Property({type: "smallint", nullable: true}) + difficulty?: number; + + @Property({type: "integer"}) + estimatedTime!: number; + + @Property({type: "bool"}) + available: boolean = true; + + @Property({type: "string", nullable: true}) + contentLocation?: string; + + @OneToMany({entity: Attachment}) + attachments: Attachment[] = []; + + @Property({type: "blob"}) + content: Buffer; +} + +@Embeddable() +export class EducationalGoal { + @Property({type: "string"}) + source: string; + + @Property({type: "string"}) + id: string; +} + +@Embeddable() +export class ReturnValue { + @Property({type: "string"}) + callbackUrl: string; + + @Property({type: "json"}) + callbackSchema: Object; +} + +export enum ContentType { + Markdown = "text/markdown", + Image = "image/image", + Mpeg = "audio/mpeg", + Pdf = "application/pdf", + Extern = "extern", + Blockly = "Blockly" +} diff --git a/backend/src/entities/content/learning-path.entity.ts b/backend/src/entities/content/learning-path.entity.ts new file mode 100644 index 00000000..88346629 --- /dev/null +++ b/backend/src/entities/content/learning-path.entity.ts @@ -0,0 +1,50 @@ +import {Embeddable, Embedded, Entity, Enum, OneToOne, Property} from "@mikro-orm/core"; +import {Language} from "./language"; + +@Entity() +export class LearningPath { + @Enum({items: () => Language}) + language!: Language; + + @Property({type: "string"}) + title!: string; + + @Property({type: "longtext"}) + description!: string; + + @Property({type: "blob"}) + image!: string; + + @Embedded({entity: () => LearningPathNode, array: true}) + nodes: LearningPathNode[]; +} + +@Embeddable() +export class LearningPathNode { + @Property({type: "string"}) + learningObjectHruid!: string; + + @Enum({items: () => Language}) + language!: Language; + + @Property({type: "string"}) + version!: string; + + @Property({type: "longtext"}) + instruction!: string; + + @Property({type: "bool"}) + startNode!: boolean; + + @Embedded({entity: () => LearningPathTransition, array: true}) + transitions!: LearningPathTransition[]; +} + +@Embeddable() +export class LearningPathTransition { + @Property({type: "string"}) + condition!: string; + + @OneToOne({entity: () => LearningPathNode}) + next!: LearningPathNode; +} diff --git a/backend/src/entities/users/student.entity.ts b/backend/src/entities/users/student.entity.ts index ab5a537a..aead3ff6 100644 --- a/backend/src/entities/users/student.entity.ts +++ b/backend/src/entities/users/student.entity.ts @@ -1,6 +1,9 @@ import {User} from "./user.entity"; -import { Entity } from '@mikro-orm/core'; +import {Collection, Entity, ManyToMany} from '@mikro-orm/core'; +import {Class} from "../classes/class.entity"; @Entity() export class Student extends User { + @ManyToMany(() => Class) + classes!: Collection; } diff --git a/backend/src/entities/users/teacher.entity.ts b/backend/src/entities/users/teacher.entity.ts index 0b3e8c18..19aa4a5d 100644 --- a/backend/src/entities/users/teacher.entity.ts +++ b/backend/src/entities/users/teacher.entity.ts @@ -1,7 +1,9 @@ -import { Entity } from '@mikro-orm/core'; +import {Collection, Entity, ManyToMany} from '@mikro-orm/core'; import {User} from "./user.entity"; +import {Class} from "../classes/class.entity"; @Entity() export class Teacher extends User { - + @ManyToMany(() => Class) + classes!: Collection; } diff --git a/backend/src/entities/users/user.entity.ts b/backend/src/entities/users/user.entity.ts index 0da754f5..6f057ba3 100644 --- a/backend/src/entities/users/user.entity.ts +++ b/backend/src/entities/users/user.entity.ts @@ -1,7 +1,7 @@ import { Entity, PrimaryKey, Property } from '@mikro-orm/core'; @Entity({abstract: true}) -export class User { +export abstract class User { @PrimaryKey({type: "string"}) username!: string; diff --git a/package-lock.json b/package-lock.json index a00e4f54..91972f84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "dwengo-1-monorepo", "version": "0.0.1", + "license": "MIT", "workspaces": [ "backend", "frontend" @@ -26,13 +27,13 @@ "backend": { "name": "dwengo-1-backend", "version": "0.0.1", - "license": "MIT", "dependencies": { "@mikro-orm/core": "^6.4.6", "@mikro-orm/postgresql": "^6.4.6", "@mikro-orm/reflection": "^6.4.6", "dotenv": "^16.4.7", - "express": "^5.0.1" + "express": "^5.0.1", + "uuid": "^11.1.0" }, "devDependencies": { "@mikro-orm/cli": "^6.4.6", @@ -8021,6 +8022,18 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", From 4d3964c31f9bb0870ea1a601182a424cf8c731df Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Sun, 23 Feb 2025 14:43:02 +0100 Subject: [PATCH 16/92] fix(backend): Fouten in entity-definities gecorrigeerd. --- backend/src/entities/assigments/assignment.entity.ts | 4 ++-- backend/src/entities/assigments/group.entity.ts | 2 +- backend/src/entities/content/attachment.entity.ts | 3 ++- backend/src/entities/content/learning-object.entity.ts | 4 ++-- backend/src/entities/content/learning-path.entity.ts | 9 ++++++--- backend/src/entities/users/student.entity.ts | 4 ++++ 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/backend/src/entities/assigments/assignment.entity.ts b/backend/src/entities/assigments/assignment.entity.ts index f3bd6a19..24151e84 100644 --- a/backend/src/entities/assigments/assignment.entity.ts +++ b/backend/src/entities/assigments/assignment.entity.ts @@ -14,12 +14,12 @@ export class Assignment { @Property({type: "string"}) title!: string; - @Property({type: "longtext"}) + @Property({type: "text"}) description!: string; @ManyToOne({entity: () => LearningPath}) task!: LearningPath; - @OneToMany({entity: () => Group}) + @OneToMany({entity: () => Group, mappedBy: "assignment"}) groups!: Group[]; } diff --git a/backend/src/entities/assigments/group.entity.ts b/backend/src/entities/assigments/group.entity.ts index 48ca08d7..ad768683 100644 --- a/backend/src/entities/assigments/group.entity.ts +++ b/backend/src/entities/assigments/group.entity.ts @@ -10,6 +10,6 @@ export class Group { @PrimaryKey({type: "integer"}) groupNumber!: number; - @ManyToMany({entity: Student}) + @ManyToMany({entity: () => Student}) members!: Student[]; } diff --git a/backend/src/entities/content/attachment.entity.ts b/backend/src/entities/content/attachment.entity.ts index ac6edd93..600d2a83 100644 --- a/backend/src/entities/content/attachment.entity.ts +++ b/backend/src/entities/content/attachment.entity.ts @@ -1,6 +1,7 @@ -import {ManyToOne, PrimaryKey, Property} from "@mikro-orm/core"; +import {Entity, ManyToOne, PrimaryKey, Property} from "@mikro-orm/core"; import {LearningObject} from "./learning-object.entity"; +@Entity() export class Attachment { @ManyToOne({entity: () => LearningObject, primary: true}) learningObject!: LearningObject; diff --git a/backend/src/entities/content/learning-object.entity.ts b/backend/src/entities/content/learning-object.entity.ts index 60db77af..0ade62a9 100644 --- a/backend/src/entities/content/learning-object.entity.ts +++ b/backend/src/entities/content/learning-object.entity.ts @@ -19,7 +19,7 @@ export class LearningObject { @Property({type: "string"}) title!: string; - @Property({type: "longtext"}) + @Property({type: "text"}) description!: string; @Property({type: "string"}) @@ -58,7 +58,7 @@ export class LearningObject { @Property({type: "string", nullable: true}) contentLocation?: string; - @OneToMany({entity: Attachment}) + @OneToMany({entity: () => Attachment, mappedBy: "learningObject"}) attachments: Attachment[] = []; @Property({type: "blob"}) diff --git a/backend/src/entities/content/learning-path.entity.ts b/backend/src/entities/content/learning-path.entity.ts index 88346629..a1346497 100644 --- a/backend/src/entities/content/learning-path.entity.ts +++ b/backend/src/entities/content/learning-path.entity.ts @@ -1,15 +1,18 @@ -import {Embeddable, Embedded, Entity, Enum, OneToOne, Property} from "@mikro-orm/core"; +import {Embeddable, Embedded, Entity, Enum, OneToOne, PrimaryKey, Property} from "@mikro-orm/core"; import {Language} from "./language"; @Entity() export class LearningPath { - @Enum({items: () => Language}) + @PrimaryKey({type: "string"}) + hruid!: string; + + @Enum({items: () => Language, primary: true}) language!: Language; @Property({type: "string"}) title!: string; - @Property({type: "longtext"}) + @Property({type: "text"}) description!: string; @Property({type: "blob"}) diff --git a/backend/src/entities/users/student.entity.ts b/backend/src/entities/users/student.entity.ts index aead3ff6..59c8798c 100644 --- a/backend/src/entities/users/student.entity.ts +++ b/backend/src/entities/users/student.entity.ts @@ -1,9 +1,13 @@ import {User} from "./user.entity"; import {Collection, Entity, ManyToMany} from '@mikro-orm/core'; import {Class} from "../classes/class.entity"; +import {Group} from "../assigments/group.entity"; @Entity() export class Student extends User { @ManyToMany(() => Class) classes!: Collection; + + @ManyToMany(() => Group) + groups!: Collection; } From cdfe48d8c550b94cdfe8aa67e82d3b9bda6cc3ac Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Sun, 23 Feb 2025 15:04:34 +0100 Subject: [PATCH 17/92] feat(backend): Submission entity toegevoegd. --- .../entities/assigments/submission.entity.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 backend/src/entities/assigments/submission.entity.ts diff --git a/backend/src/entities/assigments/submission.entity.ts b/backend/src/entities/assigments/submission.entity.ts new file mode 100644 index 00000000..d6ccbef4 --- /dev/null +++ b/backend/src/entities/assigments/submission.entity.ts @@ -0,0 +1,22 @@ +import {Student} from "../users/student.entity"; +import {Group} from "./group.entity"; +import {Entity, Enum, ManyToOne, PrimaryKey} from "@mikro-orm/core"; +import {Language} from "../content/language"; + +@Entity() +export class Submission { + @ManyToOne({entity: () => Student, primary: true}) + submitter!: Student; + + @ManyToOne({entity: () => Group, primary: true}) + onBehalfOf!: Group; + + @PrimaryKey({type: "string"}) + hruid!: string; + + @Enum({items: () => Language, primary: true}) + language!: Language; + + @PrimaryKey({type: "string"}) + version: number = "1"; +} From 2657e49ad6b7fdd74f024f932aa70bfc19661691 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Sun, 23 Feb 2025 16:48:06 +0100 Subject: [PATCH 18/92] feat(backend): Question + Answer entities toegevoegd; kleine verbeteringen. --- .../entities/assigments/assignment.entity.ts | 11 +++++---- .../entities/assigments/submission.entity.ts | 22 ++++++++++------- .../content/learning-object.entity.ts | 16 ++++++++----- .../entities/content/learning-path.entity.ts | 6 ++++- .../src/entities/questions/answer.entity.ts | 19 +++++++++++++++ .../src/entities/questions/question.entity.ts | 24 +++++++++++++++++++ 6 files changed, 79 insertions(+), 19 deletions(-) create mode 100644 backend/src/entities/questions/answer.entity.ts create mode 100644 backend/src/entities/questions/question.entity.ts diff --git a/backend/src/entities/assigments/assignment.entity.ts b/backend/src/entities/assigments/assignment.entity.ts index 24151e84..294f75fe 100644 --- a/backend/src/entities/assigments/assignment.entity.ts +++ b/backend/src/entities/assigments/assignment.entity.ts @@ -1,7 +1,7 @@ -import {Entity, ManyToOne, OneToMany, PrimaryKey, Property} from "@mikro-orm/core"; +import {Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property} from "@mikro-orm/core"; import {Class} from "../classes/class.entity"; -import {LearningPath} from "../content/learning-path.entity"; import {Group} from "./group.entity" +import {Language} from "../content/language"; @Entity() export class Assignment { @@ -17,8 +17,11 @@ export class Assignment { @Property({type: "text"}) description!: string; - @ManyToOne({entity: () => LearningPath}) - task!: LearningPath; + @Property({type: "string"}) + learningPathHruid!: string; + + @Enum({items: () => Language}) + learningPathLanguage!: Language; @OneToMany({entity: () => Group, mappedBy: "assignment"}) groups!: Group[]; diff --git a/backend/src/entities/assigments/submission.entity.ts b/backend/src/entities/assigments/submission.entity.ts index d6ccbef4..57f7f980 100644 --- a/backend/src/entities/assigments/submission.entity.ts +++ b/backend/src/entities/assigments/submission.entity.ts @@ -1,22 +1,28 @@ import {Student} from "../users/student.entity"; import {Group} from "./group.entity"; -import {Entity, Enum, ManyToOne, PrimaryKey} from "@mikro-orm/core"; +import {Entity, Enum, ManyToOne, PrimaryKey, Property} from "@mikro-orm/core"; import {Language} from "../content/language"; @Entity() -export class Submission { +export class Submission { @ManyToOne({entity: () => Student, primary: true}) submitter!: Student; - @ManyToOne({entity: () => Group, primary: true}) - onBehalfOf!: Group; - @PrimaryKey({type: "string"}) - hruid!: string; + learningObjectHruid!: string; @Enum({items: () => Language, primary: true}) - language!: Language; + learningObjectLanguage!: Language; @PrimaryKey({type: "string"}) - version: number = "1"; + learningObjectVersion: number = "1"; + + @PrimaryKey({type: "datetime"}) + submissionTime: Date; + + @ManyToOne({entity: () => Group, nullable: true}) + onBehalfOf?: Group; + + @Property({type: "json"}) + content!: T; } diff --git a/backend/src/entities/content/learning-object.entity.ts b/backend/src/entities/content/learning-object.entity.ts index 0ade62a9..64f49ce8 100644 --- a/backend/src/entities/content/learning-object.entity.ts +++ b/backend/src/entities/content/learning-object.entity.ts @@ -1,9 +1,10 @@ -import {Embeddable, Embedded, Entity, Enum, OneToMany, PrimaryKey, Property} from "@mikro-orm/core"; +import {Embeddable, Embedded, Entity, Enum, ManyToMany, OneToMany, PrimaryKey, Property} from "@mikro-orm/core"; import {Language} from "./language"; import {Attachment} from "./attachment.entity"; +import {Teacher} from "../users/teacher.entity"; @Entity() -export class LearningObject { +export class LearningObject { @PrimaryKey({type: "string"}) hruid!: string; @@ -13,8 +14,8 @@ export class LearningObject { @PrimaryKey({type: "string"}) version: number = "1"; - @PrimaryKey({type: "string"}) - author!: string; + @ManyToMany({entity: () => Teacher}) + admins!: Teacher[]; @Property({type: "string"}) title!: string; @@ -52,6 +53,9 @@ export class LearningObject { @Property({type: "integer"}) estimatedTime!: number; + @Embedded({entity: () => ReturnValue}) + returnValue: ReturnValue; + @Property({type: "bool"}) available: boolean = true; @@ -75,12 +79,12 @@ export class EducationalGoal { } @Embeddable() -export class ReturnValue { +export class ReturnValue { @Property({type: "string"}) callbackUrl: string; @Property({type: "json"}) - callbackSchema: Object; + callbackSchema: R; } export enum ContentType { diff --git a/backend/src/entities/content/learning-path.entity.ts b/backend/src/entities/content/learning-path.entity.ts index a1346497..ef694af0 100644 --- a/backend/src/entities/content/learning-path.entity.ts +++ b/backend/src/entities/content/learning-path.entity.ts @@ -1,5 +1,6 @@ -import {Embeddable, Embedded, Entity, Enum, OneToOne, PrimaryKey, Property} from "@mikro-orm/core"; +import {Embeddable, Embedded, Entity, Enum, ManyToMany, OneToOne, PrimaryKey, Property} from "@mikro-orm/core"; import {Language} from "./language"; +import {Teacher} from "../users/teacher.entity"; @Entity() export class LearningPath { @@ -9,6 +10,9 @@ export class LearningPath { @Enum({items: () => Language, primary: true}) language!: Language; + @ManyToMany({entity: () => Teacher}) + admins!: Teacher[]; + @Property({type: "string"}) title!: string; diff --git a/backend/src/entities/questions/answer.entity.ts b/backend/src/entities/questions/answer.entity.ts new file mode 100644 index 00000000..545482a8 --- /dev/null +++ b/backend/src/entities/questions/answer.entity.ts @@ -0,0 +1,19 @@ +import {Entity, ManyToOne, PrimaryKey, Property} from "@mikro-orm/core"; +import {Question} from "./question.entity"; +import {Teacher} from "../users/teacher.entity"; + +@Entity() +export class Answer { + + @ManyToOne({entity: () => Teacher, primary: true}) + author!: Teacher; + + @ManyToOne({entity: () => Question, primary: true}) + toQuestion!: Question; + + @PrimaryKey({type: "datetime"}) + timestamp: Date; + + @Property({type: "text"}) + content: string; +} diff --git a/backend/src/entities/questions/question.entity.ts b/backend/src/entities/questions/question.entity.ts new file mode 100644 index 00000000..3a2976c5 --- /dev/null +++ b/backend/src/entities/questions/question.entity.ts @@ -0,0 +1,24 @@ +import {Entity, Enum, ManyToOne, PrimaryKey, Property} from "@mikro-orm/core"; +import {Language} from "../content/language"; +import {Student} from "../users/student.entity"; + +@Entity() +export class Question { + @ManyToOne({entity: () => Student, primary: true}) + author!: Student; + + @PrimaryKey({type: "string"}) + learningObjectHruid!: string; + + @Enum({items: () => Language, primary: true}) + learningObjectLanguage!: Language; + + @PrimaryKey({type: "string"}) + learningObjectVersion!: number = "1"; + + @PrimaryKey({type: "datetime"}) + timestamp!: Date; + + @Property({type: "text"}) + content!: string; +} From 374de3b21a81e58632ecb56bf7eb94f38b82a057 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Mon, 24 Feb 2025 01:13:20 +0100 Subject: [PATCH 19/92] feat(backend): Repositories toegevoegd, databank unit-testbaar gemaakt. --- backend/.env.test | 3 + backend/config/db/init.sql | 2 - backend/package.json | 9 +- backend/src/app.ts | 4 +- backend/src/data/dwengo-entity-repository.ts | 17 + backend/src/data/users/student-repository.ts | 11 + backend/src/entities/users/student.entity.ts | 7 +- backend/src/mikro-orm.config.ts | 40 +- backend/src/orm.ts | 15 +- backend/src/util/envvars.ts | 16 +- backend/tests/data/users.test.ts | 33 + backend/tests/example.test.ts | 2 +- backend/tests/testutils.ts | 7 + backend/vitest.config.ts | 8 + package-lock.json | 1543 +++++++++++++++++- 15 files changed, 1672 insertions(+), 45 deletions(-) create mode 100644 backend/.env.test delete mode 100644 backend/config/db/init.sql create mode 100644 backend/src/data/dwengo-entity-repository.ts create mode 100644 backend/src/data/users/student-repository.ts create mode 100644 backend/tests/data/users.test.ts create mode 100644 backend/tests/testutils.ts create mode 100644 backend/vitest.config.ts diff --git a/backend/.env.test b/backend/.env.test new file mode 100644 index 00000000..b8a81003 --- /dev/null +++ b/backend/.env.test @@ -0,0 +1,3 @@ +PORT=3000 +DWENGO_DB_UPDATE=true +DWENGO_DB_NAME=":memory:" diff --git a/backend/config/db/init.sql b/backend/config/db/init.sql deleted file mode 100644 index 37a68022..00000000 --- a/backend/config/db/init.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Create the database -CREATE DATABASE dwengo; \ No newline at end of file diff --git a/backend/package.json b/backend/package.json index 376d3416..ea96a257 100644 --- a/backend/package.json +++ b/backend/package.json @@ -11,12 +11,13 @@ "format": "prettier --write src/", "format-check": "prettier --check src/", "lint": "eslint . --fix", - "test:unit": "vitest --run" + "test:unit": "vitest" }, "dependencies": { - "@mikro-orm/core": "^6.4.6", - "@mikro-orm/postgresql": "^6.4.6", - "@mikro-orm/reflection": "^6.4.6", + "@mikro-orm/core": "6.4.6", + "@mikro-orm/postgresql": "6.4.6", + "@mikro-orm/sqlite": "6.4.6", + "@mikro-orm/reflection": "6.4.6", "dotenv": "^16.4.7", "express": "^5.0.1", "uuid": "^11.1.0" diff --git a/backend/src/app.ts b/backend/src/app.ts index 65dd8a7a..ecee4944 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -1,5 +1,5 @@ import express, { Express, Response } from 'express'; -import initORM from './orm.js'; +import { initORM } from './orm.js'; const app: Express = express(); const port: string | number = process.env.PORT || 3000; @@ -19,4 +19,4 @@ async function startServer() { }); } -startServer(); +await startServer(); diff --git a/backend/src/data/dwengo-entity-repository.ts b/backend/src/data/dwengo-entity-repository.ts new file mode 100644 index 00000000..dc64ed0e --- /dev/null +++ b/backend/src/data/dwengo-entity-repository.ts @@ -0,0 +1,17 @@ +import {EntityRepository, FilterQuery} from "@mikro-orm/core"; + +export abstract class DwengoEntityRepository extends EntityRepository { + public async save(entity: T) { + let em = this.getEntityManager(); + em.persist(entity); + await em.flush(); + } + public async deleteWhere(query: FilterQuery) { + let toDelete = await this.findOne(query); + let em = this.getEntityManager(); + if (toDelete) { + em.remove(toDelete); + await em.flush(); + } + } +} diff --git a/backend/src/data/users/student-repository.ts b/backend/src/data/users/student-repository.ts new file mode 100644 index 00000000..985f43a5 --- /dev/null +++ b/backend/src/data/users/student-repository.ts @@ -0,0 +1,11 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Student} from "../../entities/users/student.entity"; + +export class StudentRepository extends DwengoEntityRepository { + public findByUsername(username: string): Promise { + return this.findOne({username: username}); + } + public deleteByUsername(username: string): Promise { + return this.deleteWhere({username: username}); + } +} diff --git a/backend/src/entities/users/student.entity.ts b/backend/src/entities/users/student.entity.ts index 59c8798c..36fb1812 100644 --- a/backend/src/entities/users/student.entity.ts +++ b/backend/src/entities/users/student.entity.ts @@ -2,12 +2,17 @@ import {User} from "./user.entity"; import {Collection, Entity, ManyToMany} from '@mikro-orm/core'; import {Class} from "../classes/class.entity"; import {Group} from "../assigments/group.entity"; +import {StudentRepository} from "../../data/users/student-repository"; -@Entity() +@Entity({repository: () => StudentRepository}) export class Student extends User { @ManyToMany(() => Class) classes!: Collection; @ManyToMany(() => Group) groups!: Collection; + + constructor(public username: string, public firstName: string, public lastName: string) { + super(); + } } diff --git a/backend/src/mikro-orm.config.ts b/backend/src/mikro-orm.config.ts index d5e97046..99b0c2ab 100644 --- a/backend/src/mikro-orm.config.ts +++ b/backend/src/mikro-orm.config.ts @@ -1,17 +1,35 @@ import {Options} from '@mikro-orm/core'; import {PostgreSqlDriver} from "@mikro-orm/postgresql"; import {EnvVars, getEnvVar, getNumericEnvVar} from "./util/envvars"; +import {SqliteDriver} from "@mikro-orm/sqlite"; -const config: Options = { - driver: PostgreSqlDriver, - host: getEnvVar(EnvVars.DbHost, {required: true}), - port: getNumericEnvVar(EnvVars.DbPort, {defaultValue: 5432}), - dbName: getEnvVar(EnvVars.DbName, {defaultValue: "dwengo"}), - user: getEnvVar(EnvVars.DbUsername, {required: true}), - password: getEnvVar(EnvVars.DbPassword, {required: true}), - entities: ['dist/**/*.entity.js'], - entitiesTs: ['src/**/*.entity.ts'], - debug: true, -}; +const entities = ['dist/**/*.entity.js']; +const entitiesTs = ['src/**/*.entity.ts']; +function config(testingMode: boolean = false): Options { + if (testingMode) { + return { + driver: SqliteDriver, + dbName: getEnvVar(EnvVars.DbName), + entities: entities, + entitiesTs: entitiesTs, + + // Workaround: vitest: `TypeError: Unknown file extension ".ts"` (ERR_UNKNOWN_FILE_EXTENSION) + // (see https://mikro-orm.io/docs/guide/project-setup#testing-the-endpoint) + dynamicImportProvider: id => import(id) + }; + } else { + return { + driver: PostgreSqlDriver, + host: getEnvVar(EnvVars.DbHost), + port: getNumericEnvVar(EnvVars.DbPort), + dbName: getEnvVar(EnvVars.DbName), + user: getEnvVar(EnvVars.DbUsername), + password: getEnvVar(EnvVars.DbPassword), + entities: entities, + entitiesTs: entitiesTs, + debug: true + }; + } +} export default config; diff --git a/backend/src/orm.ts b/backend/src/orm.ts index 16727a76..35110024 100644 --- a/backend/src/orm.ts +++ b/backend/src/orm.ts @@ -1,10 +1,10 @@ -import { MikroORM } from '@mikro-orm/core'; +import {AnyEntity, EntityName, EntityRepository, MikroORM} from '@mikro-orm/core'; import config from './mikro-orm.config.js'; import {EnvVars, getEnvVar} from "./util/envvars"; -export default async function initORM() { - const orm = await MikroORM.init(config); - +let orm: MikroORM | undefined; +export async function initORM(testingMode: boolean = false) { + orm = await MikroORM.init(config(testingMode)); // Update the database scheme if necessary and enabled. if (getEnvVar(EnvVars.DbUpdate)) { await orm.schema.updateSchema(); @@ -17,3 +17,10 @@ export default async function initORM() { } } } + +export function getRepository(entityName: EntityName): EntityRepository { + if (orm === undefined) { + throw new Error("ORM is not initialized yet"); + } + return orm.em.fork().getRepository(entityName); +} diff --git a/backend/src/util/envvars.ts b/backend/src/util/envvars.ts index f9bdfb50..0415c89f 100644 --- a/backend/src/util/envvars.ts +++ b/backend/src/util/envvars.ts @@ -1,15 +1,15 @@ const PREFIX = "DWENGO_"; const DB_PREFIX = PREFIX + "DB_"; -type EnvVar = {[key: string]: {name: string, required?: boolean, defaultValue?: boolean}}; +type EnvVar = {key: string, required?: boolean, defaultValue?: any} -export const EnvVars: EnvVar = { - DbHost: {key: DB_PREFIX + "HOST", required: true}, - DbPort: {key: DB_PREFIX + "PORT", defaultValue: 5432}, - DbName: {key: DB_PREFIX + "NAME", defaultValue: "dwengo"}, - DbUsername: {key: DB_PREFIX + "USERNAME", required: true}, - DbPassword: {key: DB_PREFIX + "PASSWORD", required: true}, - DbUpdate: {key: DB_PREFIX + "UPDATE", defaultValue: false}, +export const EnvVars: {[key: string]: EnvVar} = { + "DbHost": {key: DB_PREFIX + "HOST", required: true}, + "DbPort": {key: DB_PREFIX + "PORT", defaultValue: 5432}, + "DbName": {key: DB_PREFIX + "NAME", defaultValue: "dwengo"}, + "DbUsername": {key: DB_PREFIX + "USERNAME", required: true}, + "DbPassword": {key: DB_PREFIX + "PASSWORD", required: true}, + "DbUpdate": {key: DB_PREFIX + "UPDATE", defaultValue: false}, } as const; /** diff --git a/backend/tests/data/users.test.ts b/backend/tests/data/users.test.ts new file mode 100644 index 00000000..c201f36f --- /dev/null +++ b/backend/tests/data/users.test.ts @@ -0,0 +1,33 @@ +import {initializeTests} from "../testutils" +import {Student} from "../../src/entities/users/student.entity"; +import {describe, it, expect, beforeAll} from "vitest"; +import {getRepository} from "../../src/orm"; +import {StudentRepository} from "../../src/data/users/student-repository"; + +const username = "teststudent"; +const firstName = "John"; +const lastName = "Doe"; +describe("StudentRepository", () => { + let studentRepository: StudentRepository; + + beforeAll(async () => { + await initializeTests() + studentRepository = getRepository(Student) as StudentRepository; + }); + + it("should return the queried student after he was added", async () => { + await studentRepository.insert(new Student(username, firstName, lastName)); + + let retrievedStudent = await studentRepository.findByUsername(username); + expect(retrievedStudent).toBeTruthy(); + expect(retrievedStudent?.firstName).toBe(firstName); + expect(retrievedStudent?.lastName).toBe(lastName); + }); + + it("should no longer return the queried student after he was removed again", async () => { + await studentRepository.deleteByUsername(username); + + let retrievedStudent = await studentRepository.findByUsername(username); + expect(retrievedStudent).toBeNull(); + }); +}); diff --git a/backend/tests/example.test.ts b/backend/tests/example.test.ts index 638d03b1..7030a84b 100644 --- a/backend/tests/example.test.ts +++ b/backend/tests/example.test.ts @@ -4,6 +4,6 @@ describe("Sample test", () => { it("should sum to 2", () => { const expected = 2; const result = 1 + 1; - expect(result).toBe(expected); + expect(result).equals(expected); }); }) diff --git a/backend/tests/testutils.ts b/backend/tests/testutils.ts new file mode 100644 index 00000000..af08b222 --- /dev/null +++ b/backend/tests/testutils.ts @@ -0,0 +1,7 @@ +import {initORM} from "../src/orm"; +import dotenv from "dotenv"; + +export async function initializeTests() { + dotenv.config({path: ".env.test"}); + await initORM(true); +} diff --git a/backend/vitest.config.ts b/backend/vitest.config.ts new file mode 100644 index 00000000..7601a84b --- /dev/null +++ b/backend/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + environment: 'node', + globals: true + } +}); diff --git a/package-lock.json b/package-lock.json index 91972f84..fc5da699 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,9 +28,10 @@ "name": "dwengo-1-backend", "version": "0.0.1", "dependencies": { - "@mikro-orm/core": "^6.4.6", - "@mikro-orm/postgresql": "^6.4.6", - "@mikro-orm/reflection": "^6.4.6", + "@mikro-orm/core": "6.4.6", + "@mikro-orm/postgresql": "6.4.6", + "@mikro-orm/reflection": "6.4.6", + "@mikro-orm/sqlite": "6.4.6", "dotenv": "^16.4.7", "express": "^5.0.1", "uuid": "^11.1.0" @@ -46,6 +47,23 @@ "vitest": "^3.0.6" } }, + "backend/node_modules/@mikro-orm/sqlite": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/@mikro-orm/sqlite/-/sqlite-6.4.6.tgz", + "integrity": "sha512-BvoLd6qge2N4P2w9yjPP8+Ya5dxxnZrS6W3B2xm0m8BUesWnaCg2pmGXQpzFjrpYMg40mZ+RJWRTPq4M2Nl4lw==", + "dependencies": { + "@mikro-orm/knex": "6.4.6", + "fs-extra": "11.3.0", + "sqlite3": "5.1.7", + "sqlstring-sqlite": "0.1.1" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0" + } + }, "backend/node_modules/globals": { "version": "15.15.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", @@ -1404,6 +1422,12 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "optional": true + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1707,6 +1731,30 @@ "node": ">= 8" } }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -2083,6 +2131,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/@ts-morph/common": { "version": "0.26.1", "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.26.1.tgz", @@ -3053,6 +3110,31 @@ "node": ">= 14" } }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "optional": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3106,6 +3188,26 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -3152,6 +3254,33 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/birpc": { "version": "0.2.19", "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", @@ -3162,6 +3291,16 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/body-parser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.1.0.tgz", @@ -3258,6 +3397,29 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", @@ -3293,6 +3455,108 @@ "node": ">=8" } }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -3397,6 +3661,23 @@ "node": ">= 16" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3501,6 +3782,15 @@ "dev": true, "license": "MIT" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", @@ -3533,7 +3823,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/config-chain": { @@ -3547,6 +3837,12 @@ "proto-list": "~1.2.1" } }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true + }, "node_modules/content-disposition": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", @@ -3715,6 +4011,20 @@ "dev": true, "license": "MIT" }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -3725,6 +4035,14 @@ "node": ">=6" } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3785,6 +4103,12 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3804,6 +4128,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -3931,6 +4263,35 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -3943,6 +4304,21 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true + }, "node_modules/error-stack-parser-es": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", @@ -4461,6 +4837,14 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, "node_modules/expect-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", @@ -4644,6 +5028,11 @@ "node": ">=16.0.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -4810,6 +5199,11 @@ "node": ">= 0.8" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-extra": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", @@ -4824,6 +5218,39 @@ "node": ">=14.14" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "optional": true + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -4848,6 +5275,73 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "optional": true + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4950,6 +5444,11 @@ "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", "license": "MIT" }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -5080,6 +5579,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -5135,6 +5640,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -5189,6 +5700,15 @@ "node": ">=18.18.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", @@ -5201,6 +5721,25 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -5231,12 +5770,38 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "optional": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -5247,7 +5812,6 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, "license": "ISC" }, "node_modules/interpret": { @@ -5259,6 +5823,19 @@ "node": ">= 0.10" } }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "optional": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -5312,7 +5889,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -5349,6 +5926,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5443,7 +6026,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/jackspeak": { @@ -5524,6 +6107,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "optional": true + }, "node_modules/jsdom": { "version": "26.0.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", @@ -5817,6 +6406,111 @@ "dev": true, "license": "ISC" }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -5917,6 +6611,17 @@ "node": ">= 0.6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -5936,7 +6641,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5952,6 +6656,189 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -5959,6 +6846,22 @@ "dev": true, "license": "MIT" }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -6000,6 +6903,11 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6016,6 +6924,110 @@ "node": ">= 0.6" } }, + "node_modules/node-abi": { + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -6145,6 +7157,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -6267,6 +7295,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -6347,6 +7390,15 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -6688,6 +7740,31 @@ "node": ">=12" } }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6744,6 +7821,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -6764,6 +7860,15 @@ "node": ">= 0.10" } }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6845,6 +7950,28 @@ "node": ">=0.10.0" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-package-json-fast": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", @@ -6859,6 +7986,19 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -6927,6 +8067,15 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "optional": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -6944,6 +8093,65 @@ "dev": true, "license": "MIT" }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/rollup": { "version": "4.34.8", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", @@ -7083,7 +8291,6 @@ "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7160,6 +8367,12 @@ "node": ">= 18" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7294,6 +8507,49 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/sirv": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", @@ -7318,6 +8574,56 @@ "node": ">=8" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "optional": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -7346,6 +8652,35 @@ "node": ">= 10.x" } }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "optional": true + }, + "node_modules/sqlite3": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, "node_modules/sqlstring": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", @@ -7355,6 +8690,44 @@ "node": ">= 0.6" } }, + "node_modules/sqlstring-sqlite": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sqlstring-sqlite/-/sqlstring-sqlite-0.1.1.tgz", + "integrity": "sha512-9CAYUJ0lEUPYJrswqiqdINNSfq3jqWo/bFJ7tufdoNeSK0Fy+d1kFTxjqO9PIqza0Kri+ZtYMfPVf1aZaFOvrQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ssri/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -7378,6 +8751,14 @@ "dev": true, "license": "MIT" }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -7586,6 +8967,66 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/tarn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", @@ -7850,6 +9291,17 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7947,6 +9399,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -8010,7 +9480,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, "license": "MIT" }, "node_modules/utils-merge": { @@ -9028,7 +10497,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -9057,6 +10526,56 @@ "node": ">=8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", From b730be375c159cd5723ca648b926c453185fa14a Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Tue, 25 Feb 2025 00:39:24 +0100 Subject: [PATCH 20/92] =?UTF-8?q?feat(backend):=20Mechanisme=20ge=C3=AFmpl?= =?UTF-8?q?ementeerd=20om=20makkelijk=20repositories=20te=20verkrijgen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/data/repositories.ts | 16 ++++++++++++++++ backend/src/orm.ts | 11 +++++------ backend/tests/data/users.test.ts | 8 ++++---- backend/tests/{testutils.ts => setup-tests.ts} | 2 +- 4 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 backend/src/data/repositories.ts rename backend/tests/{testutils.ts => setup-tests.ts} (76%) diff --git a/backend/src/data/repositories.ts b/backend/src/data/repositories.ts new file mode 100644 index 00000000..892e7ca3 --- /dev/null +++ b/backend/src/data/repositories.ts @@ -0,0 +1,16 @@ +import {AnyEntity, EntityName, EntityRepository} from "@mikro-orm/core"; +import {forkEntityManager} from "../orm"; +import {StudentRepository} from "./users/student-repository"; +import {Student} from "../entities/users/student.entity"; + +function repositoryGetter>(entity: EntityName): () => R { + let cachedRepo: R | undefined; + return (): R => { + if (!cachedRepo) { + cachedRepo = forkEntityManager().getRepository(entity) as R; + } + return cachedRepo; + } +} + +export const getStudentRepository = repositoryGetter(Student); diff --git a/backend/src/orm.ts b/backend/src/orm.ts index 35110024..e31efc14 100644 --- a/backend/src/orm.ts +++ b/backend/src/orm.ts @@ -1,4 +1,4 @@ -import {AnyEntity, EntityName, EntityRepository, MikroORM} from '@mikro-orm/core'; +import { EntityManager, MikroORM} from '@mikro-orm/core'; import config from './mikro-orm.config.js'; import {EnvVars, getEnvVar} from "./util/envvars"; @@ -17,10 +17,9 @@ export async function initORM(testingMode: boolean = false) { } } } - -export function getRepository(entityName: EntityName): EntityRepository { - if (orm === undefined) { - throw new Error("ORM is not initialized yet"); +export function forkEntityManager(): EntityManager { + if (!orm) { + throw Error("Accessing the Entity Manager before the ORM is fully initialized.") } - return orm.em.fork().getRepository(entityName); + return orm.em.fork(); } diff --git a/backend/tests/data/users.test.ts b/backend/tests/data/users.test.ts index c201f36f..c806f13c 100644 --- a/backend/tests/data/users.test.ts +++ b/backend/tests/data/users.test.ts @@ -1,8 +1,8 @@ -import {initializeTests} from "../testutils" +import {setupTestApp} from "../setup-tests" import {Student} from "../../src/entities/users/student.entity"; import {describe, it, expect, beforeAll} from "vitest"; -import {getRepository} from "../../src/orm"; import {StudentRepository} from "../../src/data/users/student-repository"; +import {getStudentRepository} from "../../src/data/repositories"; const username = "teststudent"; const firstName = "John"; @@ -11,8 +11,8 @@ describe("StudentRepository", () => { let studentRepository: StudentRepository; beforeAll(async () => { - await initializeTests() - studentRepository = getRepository(Student) as StudentRepository; + setupTestApp(); + studentRepository = getStudentRepository(); }); it("should return the queried student after he was added", async () => { diff --git a/backend/tests/testutils.ts b/backend/tests/setup-tests.ts similarity index 76% rename from backend/tests/testutils.ts rename to backend/tests/setup-tests.ts index af08b222..0fef6675 100644 --- a/backend/tests/testutils.ts +++ b/backend/tests/setup-tests.ts @@ -1,7 +1,7 @@ import {initORM} from "../src/orm"; import dotenv from "dotenv"; -export async function initializeTests() { +export async function setupTestApp() { dotenv.config({path: ".env.test"}); await initORM(true); } From 22fea6de83fe6d5ecca83ec27ebd3fdb5a4d34d7 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Tue, 25 Feb 2025 19:39:41 +0100 Subject: [PATCH 21/92] feat(backup): User- en TeacherRepository toegevoegd --- backend/src/data/users/teacher-repository.ts | 11 +++++++++++ backend/src/data/users/user-repository.ts | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 backend/src/data/users/teacher-repository.ts create mode 100644 backend/src/data/users/user-repository.ts diff --git a/backend/src/data/users/teacher-repository.ts b/backend/src/data/users/teacher-repository.ts new file mode 100644 index 00000000..2d86c9d1 --- /dev/null +++ b/backend/src/data/users/teacher-repository.ts @@ -0,0 +1,11 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Teacher} from "../../entities/users/teacher.entity"; + +export class TeacherRepository extends DwengoEntityRepository { + public findByUsername(username: string): Promise { + return this.findOne({username: username}); + } + public deleteByUsername(username: string): Promise { + return this.deleteWhere({username: username}); + } +} diff --git a/backend/src/data/users/user-repository.ts b/backend/src/data/users/user-repository.ts new file mode 100644 index 00000000..111244cd --- /dev/null +++ b/backend/src/data/users/user-repository.ts @@ -0,0 +1,11 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {User} from "../../entities/users/user.entity"; + +export class StudentRepository extends DwengoEntityRepository { + public findByUsername(username: string): Promise { + return this.findOne({username: username}); + } + public deleteByUsername(username: string): Promise { + return this.deleteWhere({username: username}); + } +} From c527bae7fc4f2e0aa3999b46801378929ae3dd47 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Tue, 25 Feb 2025 22:55:08 +0100 Subject: [PATCH 22/92] fix(backup): Date in primaire sleutel Componenten van primaire sleutels, die het aanmaaktijdstip bevatten, vervangen door volgnummers om problemen te vermijden wanneer meerdere entities exact op hetzelfde moment aangemaakt worden. --- .../src/entities/assigments/submission.entity.ts | 15 +++++++++------ backend/src/entities/questions/answer.entity.ts | 9 ++++++--- backend/src/entities/questions/question.entity.ts | 13 ++++++++----- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/backend/src/entities/assigments/submission.entity.ts b/backend/src/entities/assigments/submission.entity.ts index 57f7f980..8f833518 100644 --- a/backend/src/entities/assigments/submission.entity.ts +++ b/backend/src/entities/assigments/submission.entity.ts @@ -5,9 +5,6 @@ import {Language} from "../content/language"; @Entity() export class Submission { - @ManyToOne({entity: () => Student, primary: true}) - submitter!: Student; - @PrimaryKey({type: "string"}) learningObjectHruid!: string; @@ -15,10 +12,16 @@ export class Submission { learningObjectLanguage!: Language; @PrimaryKey({type: "string"}) - learningObjectVersion: number = "1"; + learningObjectVersion: string = "1"; - @PrimaryKey({type: "datetime"}) - submissionTime: Date; + @Property({type: "integer"}) + submissionNumber!: number; + + @ManyToOne({entity: () => Student}) + submitter!: Student; + + @Property({type: "datetime"}) + submissionTime!: Date; @ManyToOne({entity: () => Group, nullable: true}) onBehalfOf?: Group; diff --git a/backend/src/entities/questions/answer.entity.ts b/backend/src/entities/questions/answer.entity.ts index 545482a8..6dac636f 100644 --- a/backend/src/entities/questions/answer.entity.ts +++ b/backend/src/entities/questions/answer.entity.ts @@ -11,9 +11,12 @@ export class Answer { @ManyToOne({entity: () => Question, primary: true}) toQuestion!: Question; - @PrimaryKey({type: "datetime"}) - timestamp: Date; + @PrimaryKey({type: "integer"}) + sequenceNumber!: number; + + @Property({type: "datetime"}) + timestamp!: Date; @Property({type: "text"}) - content: string; + content!: string; } diff --git a/backend/src/entities/questions/question.entity.ts b/backend/src/entities/questions/question.entity.ts index 3a2976c5..34aa4bb2 100644 --- a/backend/src/entities/questions/question.entity.ts +++ b/backend/src/entities/questions/question.entity.ts @@ -4,9 +4,6 @@ import {Student} from "../users/student.entity"; @Entity() export class Question { - @ManyToOne({entity: () => Student, primary: true}) - author!: Student; - @PrimaryKey({type: "string"}) learningObjectHruid!: string; @@ -14,9 +11,15 @@ export class Question { learningObjectLanguage!: Language; @PrimaryKey({type: "string"}) - learningObjectVersion!: number = "1"; + learningObjectVersion: string = "1"; - @PrimaryKey({type: "datetime"}) + @PrimaryKey({type: "integer"}) + sequenceNumber!: number; + + @ManyToOne({entity: () => Student}) + author!: Student; + + @Property({type: "datetime"}) timestamp!: Date; @Property({type: "text"}) From 6beaf77adf40b49fbfc5517dacc5393e03eb8709 Mon Sep 17 00:00:00 2001 From: Joyelle Ndagijimana Date: Tue, 25 Feb 2025 23:01:36 +0100 Subject: [PATCH 23/92] feat(frontend): initialisatie router en bijhorende.vue componenten --- frontend/src/App.vue | 83 +------- frontend/src/components/BrowseThemes.vue | 11 ++ frontend/src/components/LearningPath.vue | 11 ++ frontend/src/components/MenuBar.vue | 11 ++ frontend/src/components/TheWelcome.vue | 178 ------------------ frontend/src/components/WelcomeItem.vue | 87 --------- .../components/__tests__/HelloWorld.spec.ts | 2 +- .../components/{ => __tests__}/HelloWorld.vue | 0 frontend/src/components/errors/NotFound.vue | 11 ++ .../src/components/icons/IconCommunity.vue | 12 -- .../components/icons/IconDocumentation.vue | 12 -- .../src/components/icons/IconEcosystem.vue | 12 -- frontend/src/components/icons/IconSupport.vue | 12 -- frontend/src/components/icons/IconTooling.vue | 19 -- frontend/src/main.ts | 1 - frontend/src/router/index.ts | 130 +++++++++++-- frontend/src/views/AboutView.vue | 16 -- .../views/{HomeView.vue => auth/HomePage.vue} | 7 +- frontend/src/views/auth/LoginPage.vue | 18 ++ frontend/src/views/auth/RegisterPage.vue | 18 ++ .../resources/assignment/CreateAssignment.vue | 11 ++ .../resources/assignment/SingleAssignment.vue | 11 ++ .../src/views/resources/class/CreateClass.vue | 11 ++ .../src/views/resources/class/SingleClass.vue | 11 ++ .../resources/discussion/CreateDiscussion.vue | 11 ++ .../resources/discussion/SingleDiscussion.vue | 11 ++ .../src/views/student/StudentAssignments.vue | 11 ++ frontend/src/views/student/StudentClasses.vue | 11 ++ .../src/views/student/StudentDiscussions.vue | 11 ++ .../src/views/student/StudentHomepage.vue | 11 ++ .../src/views/teacher/TeacherAssignments.vue | 11 ++ frontend/src/views/teacher/TeacherClasses.vue | 11 ++ .../src/views/teacher/TeacherDiscussions.vue | 11 ++ .../src/views/teacher/TeacherHomepage.vue | 11 ++ frontend/tsconfig.json | 5 +- frontend/vite.config.ts | 3 +- package-lock.json | 69 ++++++- package.json | 3 + 38 files changed, 436 insertions(+), 449 deletions(-) create mode 100644 frontend/src/components/BrowseThemes.vue create mode 100644 frontend/src/components/LearningPath.vue create mode 100644 frontend/src/components/MenuBar.vue delete mode 100644 frontend/src/components/TheWelcome.vue delete mode 100644 frontend/src/components/WelcomeItem.vue rename frontend/src/components/{ => __tests__}/HelloWorld.vue (100%) create mode 100644 frontend/src/components/errors/NotFound.vue delete mode 100644 frontend/src/components/icons/IconCommunity.vue delete mode 100644 frontend/src/components/icons/IconDocumentation.vue delete mode 100644 frontend/src/components/icons/IconEcosystem.vue delete mode 100644 frontend/src/components/icons/IconSupport.vue delete mode 100644 frontend/src/components/icons/IconTooling.vue delete mode 100644 frontend/src/views/AboutView.vue rename frontend/src/views/{HomeView.vue => auth/HomePage.vue} (50%) create mode 100644 frontend/src/views/auth/LoginPage.vue create mode 100644 frontend/src/views/auth/RegisterPage.vue create mode 100644 frontend/src/views/resources/assignment/CreateAssignment.vue create mode 100644 frontend/src/views/resources/assignment/SingleAssignment.vue create mode 100644 frontend/src/views/resources/class/CreateClass.vue create mode 100644 frontend/src/views/resources/class/SingleClass.vue create mode 100644 frontend/src/views/resources/discussion/CreateDiscussion.vue create mode 100644 frontend/src/views/resources/discussion/SingleDiscussion.vue create mode 100644 frontend/src/views/student/StudentAssignments.vue create mode 100644 frontend/src/views/student/StudentClasses.vue create mode 100644 frontend/src/views/student/StudentDiscussions.vue create mode 100644 frontend/src/views/student/StudentHomepage.vue create mode 100644 frontend/src/views/teacher/TeacherAssignments.vue create mode 100644 frontend/src/views/teacher/TeacherClasses.vue create mode 100644 frontend/src/views/teacher/TeacherDiscussions.vue create mode 100644 frontend/src/views/teacher/TeacherHomepage.vue diff --git a/frontend/src/App.vue b/frontend/src/App.vue index e1c5388d..7db110de 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,91 +1,10 @@ diff --git a/frontend/src/components/BrowseThemes.vue b/frontend/src/components/BrowseThemes.vue new file mode 100644 index 00000000..5191a920 --- /dev/null +++ b/frontend/src/components/BrowseThemes.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/components/LearningPath.vue b/frontend/src/components/LearningPath.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/components/LearningPath.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/components/MenuBar.vue b/frontend/src/components/MenuBar.vue new file mode 100644 index 00000000..73336fa3 --- /dev/null +++ b/frontend/src/components/MenuBar.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/components/TheWelcome.vue b/frontend/src/components/TheWelcome.vue deleted file mode 100644 index fc109ae4..00000000 --- a/frontend/src/components/TheWelcome.vue +++ /dev/null @@ -1,178 +0,0 @@ - - - diff --git a/frontend/src/components/WelcomeItem.vue b/frontend/src/components/WelcomeItem.vue deleted file mode 100644 index 5d1b8a63..00000000 --- a/frontend/src/components/WelcomeItem.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - diff --git a/frontend/src/components/__tests__/HelloWorld.spec.ts b/frontend/src/components/__tests__/HelloWorld.spec.ts index 79c1e3ae..ff48c1de 100644 --- a/frontend/src/components/__tests__/HelloWorld.spec.ts +++ b/frontend/src/components/__tests__/HelloWorld.spec.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from "vitest"; import { mount } from "@vue/test-utils"; -import HelloWorld from "../HelloWorld.vue"; +import HelloWorld from "./HelloWorld.vue"; describe("HelloWorld", () => { it("renders properly", () => { diff --git a/frontend/src/components/HelloWorld.vue b/frontend/src/components/__tests__/HelloWorld.vue similarity index 100% rename from frontend/src/components/HelloWorld.vue rename to frontend/src/components/__tests__/HelloWorld.vue diff --git a/frontend/src/components/errors/NotFound.vue b/frontend/src/components/errors/NotFound.vue new file mode 100644 index 00000000..7a45fea2 --- /dev/null +++ b/frontend/src/components/errors/NotFound.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/components/icons/IconCommunity.vue b/frontend/src/components/icons/IconCommunity.vue deleted file mode 100644 index 708fa1b6..00000000 --- a/frontend/src/components/icons/IconCommunity.vue +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/frontend/src/components/icons/IconDocumentation.vue b/frontend/src/components/icons/IconDocumentation.vue deleted file mode 100644 index cd61e991..00000000 --- a/frontend/src/components/icons/IconDocumentation.vue +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/frontend/src/components/icons/IconEcosystem.vue b/frontend/src/components/icons/IconEcosystem.vue deleted file mode 100644 index 0e72c40f..00000000 --- a/frontend/src/components/icons/IconEcosystem.vue +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/frontend/src/components/icons/IconSupport.vue b/frontend/src/components/icons/IconSupport.vue deleted file mode 100644 index cc131b12..00000000 --- a/frontend/src/components/icons/IconSupport.vue +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/frontend/src/components/icons/IconTooling.vue b/frontend/src/components/icons/IconTooling.vue deleted file mode 100644 index 9e820684..00000000 --- a/frontend/src/components/icons/IconTooling.vue +++ /dev/null @@ -1,19 +0,0 @@ - - diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 5701eca8..bc0c3d42 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -1,4 +1,3 @@ -import "./assets/main.css"; import { createApp } from "vue"; // Vuetify diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 55ba8fb7..3964dfd7 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -1,5 +1,23 @@ -import { createRouter, createWebHistory } from "vue-router"; -import HomeView from "../views/HomeView.vue"; +import {createRouter, createWebHistory} from "vue-router"; +import LoginPage from "@/views/auth/LoginPage.vue"; +import RegisterPage from "@/views/auth/RegisterPage.vue"; +import HomePage from "@/views/auth/HomePage.vue"; +import MenuBar from "@/components/MenuBar.vue"; +import StudentHomepage from "@/views/student/StudentHomepage.vue"; +import StudentAssignments from "@/views/student/StudentAssignments.vue"; +import StudentClasses from "@/views/student/StudentClasses.vue"; +import StudentDiscussions from "@/views/student/StudentDiscussions.vue"; +import TeacherHomepage from "@/views/teacher/TeacherHomepage.vue"; +import TeacherAssignments from "@/views/teacher/TeacherAssignments.vue"; +import TeacherClasses from "@/views/teacher/TeacherClasses.vue"; +import TeacherDiscussions from "@/views/teacher/TeacherDiscussions.vue"; +import SingleAssignment from "@/views/resources/assignment/SingleAssignment.vue"; +import SingleClass from "@/views/resources/class/SingleClass.vue"; +import SingleDiscussion from "@/views/resources/discussion/SingleDiscussion.vue"; +import NotFound from "@/components/errors/NotFound.vue"; +import CreateClass from "@/views/resources/class/CreateClass.vue"; +import CreateAssignment from "@/views/resources/assignment/CreateAssignment.vue"; +import CreateDiscussion from "@/views/resources/discussion/CreateDiscussion.vue"; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -7,17 +25,107 @@ const router = createRouter({ { path: "/", name: "home", - component: HomeView, + component: HomePage, }, { - path: "/about", - name: "about", - // Route level code-splitting - // This generates a separate chunk (About.[hash].js) for this route - // Which is lazy-loaded when the route is visited. - component: () => { - return import("../views/AboutView.vue"); - }, + path: "/:role/login", + name: "LoginPage", + component: LoginPage + }, + { + path: "/:role/register", + name: "RegisterPage", + component: RegisterPage + }, + { + path: "/student/:id", + component: MenuBar, + children: [ + { + path: "home", + name: "StudentHomePage", + component: StudentHomepage + }, + { + path: "assignment", + name: "StudentAssignments", + component: StudentAssignments + }, + { + path: "class", + name: "StudentClasses", + component: StudentClasses + }, + { + path: "discussion", + name: "StudentDiscussions", + component: StudentDiscussions + }, + ] + }, + + { + path: "/teacher/:id", + component: MenuBar, + children: [ + { + path: "home", + name: "TeacherHomepage", + component: TeacherHomepage + }, + { + path: "assignment", + name: "TeacherAssignments", + component: TeacherAssignments + }, + { + path: "class", + name: "TeacherClasses", + component: TeacherClasses + }, + { + path: "discussion", + name: "TeacherDiscussions", + component: TeacherDiscussions + }, + ] + }, + { + path: "/assignment/create", + name: "CreateAssigment", + component: CreateAssignment + + }, + { + path: "/assignment/:id", + name: "SingleAssigment", + component: SingleAssignment + + }, + { + path: "/class/create", + name: "CreateClass", + component: CreateClass + }, + { + path: "/class/:id", + name: "SingleClass", + component: SingleClass + }, + { + path: "/discussion/create", + name: "CreateDiscussion", + component: CreateDiscussion + }, + { + path: "/discussion/:id", + name: "SingleDiscussion", + component: SingleDiscussion + }, + { + path: "/:catchAll(.*)", + name: "NotFound", + component: NotFound, }, ], }); diff --git a/frontend/src/views/AboutView.vue b/frontend/src/views/AboutView.vue deleted file mode 100644 index 1c17d1c9..00000000 --- a/frontend/src/views/AboutView.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/auth/HomePage.vue similarity index 50% rename from frontend/src/views/HomeView.vue rename to frontend/src/views/auth/HomePage.vue index 56ceba6d..677f16f0 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/auth/HomePage.vue @@ -1,9 +1,12 @@ + diff --git a/frontend/src/views/auth/LoginPage.vue b/frontend/src/views/auth/LoginPage.vue new file mode 100644 index 00000000..8bee61b1 --- /dev/null +++ b/frontend/src/views/auth/LoginPage.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/frontend/src/views/auth/RegisterPage.vue b/frontend/src/views/auth/RegisterPage.vue new file mode 100644 index 00000000..8bee61b1 --- /dev/null +++ b/frontend/src/views/auth/RegisterPage.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/frontend/src/views/resources/assignment/CreateAssignment.vue b/frontend/src/views/resources/assignment/CreateAssignment.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/resources/assignment/CreateAssignment.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/resources/assignment/SingleAssignment.vue b/frontend/src/views/resources/assignment/SingleAssignment.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/resources/assignment/SingleAssignment.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/resources/class/CreateClass.vue b/frontend/src/views/resources/class/CreateClass.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/resources/class/CreateClass.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/resources/class/SingleClass.vue b/frontend/src/views/resources/class/SingleClass.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/resources/class/SingleClass.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/resources/discussion/CreateDiscussion.vue b/frontend/src/views/resources/discussion/CreateDiscussion.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/resources/discussion/CreateDiscussion.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/resources/discussion/SingleDiscussion.vue b/frontend/src/views/resources/discussion/SingleDiscussion.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/resources/discussion/SingleDiscussion.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/student/StudentAssignments.vue b/frontend/src/views/student/StudentAssignments.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/student/StudentAssignments.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/student/StudentClasses.vue b/frontend/src/views/student/StudentClasses.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/student/StudentClasses.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/student/StudentDiscussions.vue b/frontend/src/views/student/StudentDiscussions.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/student/StudentDiscussions.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/student/StudentHomepage.vue b/frontend/src/views/student/StudentHomepage.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/student/StudentHomepage.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/teacher/TeacherAssignments.vue b/frontend/src/views/teacher/TeacherAssignments.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/teacher/TeacherAssignments.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/teacher/TeacherClasses.vue b/frontend/src/views/teacher/TeacherClasses.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/teacher/TeacherClasses.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/teacher/TeacherDiscussions.vue b/frontend/src/views/teacher/TeacherDiscussions.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/teacher/TeacherDiscussions.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/views/teacher/TeacherHomepage.vue b/frontend/src/views/teacher/TeacherHomepage.vue new file mode 100644 index 00000000..4aaf6ef8 --- /dev/null +++ b/frontend/src/views/teacher/TeacherHomepage.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index fb7fbd25..e0d34b13 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -10,5 +10,8 @@ { "path": "./tsconfig.vitest.json" } - ] + ], + "compilerOptions": { + "resolveJsonModule": true + } } diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index a558039c..71efbde6 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -2,11 +2,10 @@ import { fileURLToPath, URL } from 'node:url'; import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; -import vueDevTools from 'vite-plugin-vue-devtools'; // https://vite.dev/config/ export default defineConfig({ - plugins: [vue(), vueDevTools()], + plugins: [vue()], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), diff --git a/package-lock.json b/package-lock.json index a00e4f54..bf217ea8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,10 +7,14 @@ "": { "name": "dwengo-1-monorepo", "version": "0.0.1", + "license": "MIT", "workspaces": [ "backend", "frontend" ], + "dependencies": { + "vue-i18n": "^10.0.5" + }, "devDependencies": { "@eslint/compat": "^1.2.6", "@eslint/js": "^9.20.0", @@ -26,7 +30,6 @@ "backend": { "name": "dwengo-1-backend", "version": "0.0.1", - "license": "MIT", "dependencies": { "@mikro-orm/core": "^6.4.6", "@mikro-orm/postgresql": "^6.4.6", @@ -1469,6 +1472,50 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@intlify/core-base": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-10.0.5.tgz", + "integrity": "sha512-F3snDTQs0MdvnnyzTDTVkOYVAZOE/MHwRvF7mn7Jw1yuih4NrFYLNYIymGlLmq4HU2iIdzYsZ7f47bOcwY73XQ==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "10.0.5", + "@intlify/shared": "10.0.5" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-10.0.5.tgz", + "integrity": "sha512-6GT1BJ852gZ0gItNZN2krX5QAmea+cmdjMvsWohArAZ3GmHdnNANEcF9JjPXAMRtQ6Ux5E269ymamg/+WU6tQA==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "10.0.5", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.5.tgz", + "integrity": "sha512-bmsP4L2HqBF6i6uaMqJMcFBONVjKt+siGluRq4Ca4C0q7W2eMaVZr8iCgF9dKbcVXutftkC7D6z2SaSMmLiDyA==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -8866,6 +8913,26 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/vue-i18n": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-10.0.5.tgz", + "integrity": "sha512-9/gmDlCblz3i8ypu/afiIc/SUIfTTE1mr0mZhb9pk70xo2csHAM9mp2gdQ3KD2O0AM3Hz/5ypb+FycTj/lHlPQ==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "10.0.5", + "@intlify/shared": "10.0.5", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vue-router": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", diff --git a/package.json b/package.json index 59a2e01d..693d54a5 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,8 @@ "eslint-config-prettier": "^10.0.1", "jiti": "^2.4.2", "typescript-eslint": "^8.24.1" + }, + "dependencies": { + "vue-i18n": "^10.0.5" } } From bd93e5fae378fbf036d91a20710ea824f6777253 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Tue, 25 Feb 2025 23:18:04 +0100 Subject: [PATCH 24/92] feat(backend): ClassRepository & gerelateerde repo's aangemaakt ClassRepository, ClassJoinRequestRepository en TeacherInvitationRepository aangemaakt. --- .../classes/class-join-request-repository.ts | 16 ++++++++++++++++ backend/src/data/classes/class-repository.ts | 11 +++++++++++ .../classes/teacher-invitation-repository.ts | 19 +++++++++++++++++++ ...entity.ts => teacher-invitation.entity.ts} | 0 4 files changed, 46 insertions(+) create mode 100644 backend/src/data/classes/class-join-request-repository.ts create mode 100644 backend/src/data/classes/class-repository.ts create mode 100644 backend/src/data/classes/teacher-invitation-repository.ts rename backend/src/entities/classes/{class-invitation.entity.ts => teacher-invitation.entity.ts} (100%) diff --git a/backend/src/data/classes/class-join-request-repository.ts b/backend/src/data/classes/class-join-request-repository.ts new file mode 100644 index 00000000..268bf5bc --- /dev/null +++ b/backend/src/data/classes/class-join-request-repository.ts @@ -0,0 +1,16 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Class} from "../../entities/classes/class.entity"; +import {ClassJoinRequest} from "../../entities/classes/class-join-request.entity"; +import {Student} from "../../entities/users/student.entity"; + +export class ClassJoinRequestRepository extends DwengoEntityRepository { + public findAllRequestsBy(requester: Student): Promise { + return this.findAll({where: {requester: requester}}); + } + public findAllOpenRequestsTo(clazz: Class): Promise { + return this.findAll({where: {class: clazz}}); + } + public deleteBy(requester: Student, clazz: Class): Promise { + return this.deleteWhere({requester: requester, class: clazz}); + } +} diff --git a/backend/src/data/classes/class-repository.ts b/backend/src/data/classes/class-repository.ts new file mode 100644 index 00000000..3b0f6923 --- /dev/null +++ b/backend/src/data/classes/class-repository.ts @@ -0,0 +1,11 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Class} from "../../entities/classes/class.entity"; + +export class ClassRepository extends DwengoEntityRepository { + public findById(id: string): Promise { + return this.findOne({classId: id}); + } + public deleteById(id: string): Promise { + return this.deleteWhere({classId: id}); + } +} diff --git a/backend/src/data/classes/teacher-invitation-repository.ts b/backend/src/data/classes/teacher-invitation-repository.ts new file mode 100644 index 00000000..bdd98f43 --- /dev/null +++ b/backend/src/data/classes/teacher-invitation-repository.ts @@ -0,0 +1,19 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Class} from "../../entities/classes/class.entity"; +import {TeacherInvitation} from "../../entities/classes/teacher-invitation.entity"; +import {Teacher} from "../../entities/users/teacher.entity"; + +export class TeacherInvitationRepository extends DwengoEntityRepository { + public findAllInvitationsForClass(clazz: Class): Promise { + return this.findAll({where: {class: clazz}}) + } + public findAllInvitationsBy(sender: Teacher): Promise { + return this.findAll({where: {sender: sender}}) + } + public findAllInvitationsFor(receiver: Teacher): Promise { + return this.findAll({where: {receiver: receiver}}) + } + public deleteBy(clazz: Class, sender: Teacher, receiver: Teacher): Promise { + return this.deleteWhere({sender: sender, receiver: receiver, class: clazz}); + } +} diff --git a/backend/src/entities/classes/class-invitation.entity.ts b/backend/src/entities/classes/teacher-invitation.entity.ts similarity index 100% rename from backend/src/entities/classes/class-invitation.entity.ts rename to backend/src/entities/classes/teacher-invitation.entity.ts From 2837618fd5fcc8824e0a51dc62ccbc668c4c781b Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Wed, 26 Feb 2025 00:00:18 +0100 Subject: [PATCH 25/92] feat(backend): Assignment-, Group- en SubmissionRepository aangemaakt --- .../data/assignments/assignment-repository.ts | 15 ++++++++ .../src/data/assignments/group-repository.ts | 15 ++++++++ .../data/assignments/submission-repository.ts | 34 +++++++++++++++++++ .../assignment.entity.ts | 0 .../group.entity.ts | 0 .../submission.entity.ts | 6 ++-- .../content/learning-object-identifier.ts | 7 ++++ backend/src/entities/users/student.entity.ts | 2 +- 8 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 backend/src/data/assignments/assignment-repository.ts create mode 100644 backend/src/data/assignments/group-repository.ts create mode 100644 backend/src/data/assignments/submission-repository.ts rename backend/src/entities/{assigments => assignments}/assignment.entity.ts (100%) rename backend/src/entities/{assigments => assignments}/group.entity.ts (100%) rename backend/src/entities/{assigments => assignments}/submission.entity.ts (89%) create mode 100644 backend/src/entities/content/learning-object-identifier.ts diff --git a/backend/src/data/assignments/assignment-repository.ts b/backend/src/data/assignments/assignment-repository.ts new file mode 100644 index 00000000..dcc2b45a --- /dev/null +++ b/backend/src/data/assignments/assignment-repository.ts @@ -0,0 +1,15 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Assignment} from "../../entities/assignments/assignment.entity"; +import {Class} from "../../entities/classes/class.entity"; + +export class AssignmentRepository extends DwengoEntityRepository { + public findByClassAndId(within: Class, id: number): Promise { + return this.findOne({within: within, id: id}); + } + public findAllAssignmentsInClass(within: Class): Promise { + return this.findAll({where: {within: within}}); + } + public deleteByClassAndId(within: Class, id: number): Promise { + return this.deleteWhere({within: within, id: id}); + } +} diff --git a/backend/src/data/assignments/group-repository.ts b/backend/src/data/assignments/group-repository.ts new file mode 100644 index 00000000..c7856a62 --- /dev/null +++ b/backend/src/data/assignments/group-repository.ts @@ -0,0 +1,15 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Group} from "../../entities/assignments/group.entity"; +import {Assignment} from "../../entities/assignments/assignment.entity"; + +export class GroupRepository extends DwengoEntityRepository { + public findByAssignmentAndGroupNumber(assignment: Assignment, groupNumber: number): Promise { + return this.findOne({assignment: assignment, groupNumber: groupNumber}); + } + public findAllGroupsForAssignment(assignment: Assignment): Promise { + return this.findAll({where: {assignment: assignment}}); + } + public deleteByAssignmentAndGroupNumber(assignment: Assignment, groupNumber: number) { + return this.deleteWhere({assignment: assignment, groupNumber: groupNumber}); + } +} diff --git a/backend/src/data/assignments/submission-repository.ts b/backend/src/data/assignments/submission-repository.ts new file mode 100644 index 00000000..90988578 --- /dev/null +++ b/backend/src/data/assignments/submission-repository.ts @@ -0,0 +1,34 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Group} from "../../entities/assignments/group.entity"; +import {Submission} from "../../entities/assignments/submission.entity"; +import {LearningObjectIdentifier} from "../../entities/content/learning-object-identifier"; +import {Student} from "../../entities/users/student.entity"; + +export class SubmissionRepository extends DwengoEntityRepository { + public findSubmissionByLearningObjectAndSubmissionNumber(loId: LearningObjectIdentifier, submissionNumber: number): Promise { + return this.findOne({ + learningObjectHruid: loId.hruid, + learningObjectLanguage: loId.language, + learningObjectVersion: loId.version, + submissionNumber: submissionNumber + }); + } + + public findMostRecentSubmissionForStudent(loId: LearningObjectIdentifier, submitter: Student): Promise { + return this.findOne({ + learningObjectHruid: loId.hruid, + learningObjectLanguage: loId.language, + learningObjectVersion: loId.version, + submitter: submitter, + }, {orderBy: {submissionNumber: "DESC"}}) + } + + public findMostRecentSubmissionForGroup(loId: LearningObjectIdentifier, group: Group): Promise { + return this.findOne({ + learningObjectHruid: loId.hruid, + learningObjectLanguage: loId.language, + learningObjectVersion: loId.version, + onBehalfOf: group, + }, {orderBy: {submissionNumber: "DESC"}}) + } +} diff --git a/backend/src/entities/assigments/assignment.entity.ts b/backend/src/entities/assignments/assignment.entity.ts similarity index 100% rename from backend/src/entities/assigments/assignment.entity.ts rename to backend/src/entities/assignments/assignment.entity.ts diff --git a/backend/src/entities/assigments/group.entity.ts b/backend/src/entities/assignments/group.entity.ts similarity index 100% rename from backend/src/entities/assigments/group.entity.ts rename to backend/src/entities/assignments/group.entity.ts diff --git a/backend/src/entities/assigments/submission.entity.ts b/backend/src/entities/assignments/submission.entity.ts similarity index 89% rename from backend/src/entities/assigments/submission.entity.ts rename to backend/src/entities/assignments/submission.entity.ts index 8f833518..381ac503 100644 --- a/backend/src/entities/assigments/submission.entity.ts +++ b/backend/src/entities/assignments/submission.entity.ts @@ -4,7 +4,7 @@ import {Entity, Enum, ManyToOne, PrimaryKey, Property} from "@mikro-orm/core"; import {Language} from "../content/language"; @Entity() -export class Submission { +export class Submission { @PrimaryKey({type: "string"}) learningObjectHruid!: string; @@ -14,7 +14,7 @@ export class Submission { @PrimaryKey({type: "string"}) learningObjectVersion: string = "1"; - @Property({type: "integer"}) + @PrimaryKey({type: "integer"}) submissionNumber!: number; @ManyToOne({entity: () => Student}) @@ -27,5 +27,5 @@ export class Submission { onBehalfOf?: Group; @Property({type: "json"}) - content!: T; + content!: string; } diff --git a/backend/src/entities/content/learning-object-identifier.ts b/backend/src/entities/content/learning-object-identifier.ts new file mode 100644 index 00000000..544ce8ea --- /dev/null +++ b/backend/src/entities/content/learning-object-identifier.ts @@ -0,0 +1,7 @@ +import {Language} from "./language"; + +export class LearningObjectIdentifier { + constructor(public hruid: string, public language: Language, public version: string) { + + } +} diff --git a/backend/src/entities/users/student.entity.ts b/backend/src/entities/users/student.entity.ts index 36fb1812..14ba4ad5 100644 --- a/backend/src/entities/users/student.entity.ts +++ b/backend/src/entities/users/student.entity.ts @@ -1,7 +1,7 @@ import {User} from "./user.entity"; import {Collection, Entity, ManyToMany} from '@mikro-orm/core'; import {Class} from "../classes/class.entity"; -import {Group} from "../assigments/group.entity"; +import {Group} from "../assignments/group.entity"; import {StudentRepository} from "../../data/users/student-repository"; @Entity({repository: () => StudentRepository}) From 71843dad65a5db323d914fd7258595ceede518e8 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Wed, 26 Feb 2025 00:39:39 +0100 Subject: [PATCH 26/92] feat(backend): Question- en AnswerRepository aangemaakt. Ook functie toegevoegd om submissies te verwijderen. --- .../data/assignments/submission-repository.ts | 9 +++++ .../src/data/questions/answer-repository.ts | 26 ++++++++++++++ .../src/data/questions/question-repository.ts | 36 +++++++++++++++++++ .../src/entities/questions/answer.entity.ts | 2 +- .../src/entities/questions/question.entity.ts | 2 +- 5 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 backend/src/data/questions/answer-repository.ts create mode 100644 backend/src/data/questions/question-repository.ts diff --git a/backend/src/data/assignments/submission-repository.ts b/backend/src/data/assignments/submission-repository.ts index 90988578..fcbd21e1 100644 --- a/backend/src/data/assignments/submission-repository.ts +++ b/backend/src/data/assignments/submission-repository.ts @@ -31,4 +31,13 @@ export class SubmissionRepository extends DwengoEntityRepository { onBehalfOf: group, }, {orderBy: {submissionNumber: "DESC"}}) } + + public deleteSubmissionByLearningObjectAndSubmissionNumber(loId: LearningObjectIdentifier, submissionNumber: number): Promise { + return this.deleteWhere({ + learningObjectHruid: loId.hruid, + learningObjectLanguage: loId.language, + learningObjectVersion: loId.version, + submissionNumber: submissionNumber + }) + } } diff --git a/backend/src/data/questions/answer-repository.ts b/backend/src/data/questions/answer-repository.ts new file mode 100644 index 00000000..4b8b46d7 --- /dev/null +++ b/backend/src/data/questions/answer-repository.ts @@ -0,0 +1,26 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Answer} from "../../entities/questions/answer.entity"; +import {Question} from "../../entities/questions/question.entity"; +import {Teacher} from "../../entities/users/teacher.entity"; + +export class AnswerRepository extends DwengoEntityRepository { + public createAnswer(answer: {toQuestion: Question, author: Teacher, content: string}): Promise { + let answerEntity = new Answer(); + answerEntity.toQuestion = answer.toQuestion; + answerEntity.author = answer.author; + answerEntity.content = answer.content; + return this.insert(answerEntity); + } + public findAllAnswersToQuestion(question: Question): Promise { + return this.findAll({ + where: { toQuestion: question }, + orderBy: { sequenceNumber: "ASC" } + }); + } + public removeAnswerByQuestionAndSequenceNumber(question: Question, sequenceNumber: number): Promise { + return this.deleteWhere({ + toQuestion: question, + sequenceNumber: sequenceNumber + }); + } +} diff --git a/backend/src/data/questions/question-repository.ts b/backend/src/data/questions/question-repository.ts new file mode 100644 index 00000000..b4429ec5 --- /dev/null +++ b/backend/src/data/questions/question-repository.ts @@ -0,0 +1,36 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Question} from "../../entities/questions/question.entity"; +import {LearningObjectIdentifier} from "../../entities/content/learning-object-identifier"; +import {Student} from "../../entities/users/student.entity"; + +export class QuestionRepository extends DwengoEntityRepository { + public createQuestion(question: {loId: LearningObjectIdentifier, author: Student, content: string}): Promise { + let questionEntity = new Question(); + questionEntity.learningObjectHruid = question.loId.hruid; + questionEntity.learningObjectLanguage = question.loId.language; + questionEntity.learningObjectVersion = question.loId.version; + questionEntity.author = question.author; + questionEntity.content = question.content; + return this.insert(questionEntity); + } + public findAllQuestionsAboutLearningObject(loId: LearningObjectIdentifier): Promise { + return this.findAll({ + where: { + learningObjectHruid: loId.hruid, + learningObjectLanguage: loId.language, + learningObjectVersion: loId.version + }, + orderBy: { + sequenceNumber: "ASC" + } + }); + } + public removeQuestionByLearningObjectAndSequenceNumber(loId: LearningObjectIdentifier, sequenceNumber: number): Promise { + return this.deleteWhere({ + learningObjectHruid: loId.hruid, + learningObjectLanguage: loId.language, + learningObjectVersion: loId.version, + sequenceNumber: sequenceNumber + }) + } +} diff --git a/backend/src/entities/questions/answer.entity.ts b/backend/src/entities/questions/answer.entity.ts index 6dac636f..cc8d69e7 100644 --- a/backend/src/entities/questions/answer.entity.ts +++ b/backend/src/entities/questions/answer.entity.ts @@ -15,7 +15,7 @@ export class Answer { sequenceNumber!: number; @Property({type: "datetime"}) - timestamp!: Date; + timestamp: Date = new Date(); @Property({type: "text"}) content!: string; diff --git a/backend/src/entities/questions/question.entity.ts b/backend/src/entities/questions/question.entity.ts index 34aa4bb2..36494212 100644 --- a/backend/src/entities/questions/question.entity.ts +++ b/backend/src/entities/questions/question.entity.ts @@ -20,7 +20,7 @@ export class Question { author!: Student; @Property({type: "datetime"}) - timestamp!: Date; + timestamp: Date = new Date(); @Property({type: "text"}) content!: string; From cf97a3af8467e7c8e8d3e5ed4a6d1b898e5875c6 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Wed, 26 Feb 2025 00:41:36 +0100 Subject: [PATCH 27/92] fix(backend): Fouten in LearningObject entity verbeterd. --- .../entities/content/learning-object.entity.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/src/entities/content/learning-object.entity.ts b/backend/src/entities/content/learning-object.entity.ts index 64f49ce8..8ccdb154 100644 --- a/backend/src/entities/content/learning-object.entity.ts +++ b/backend/src/entities/content/learning-object.entity.ts @@ -4,7 +4,7 @@ import {Attachment} from "./attachment.entity"; import {Teacher} from "../users/teacher.entity"; @Entity() -export class LearningObject { +export class LearningObject { @PrimaryKey({type: "string"}) hruid!: string; @@ -12,7 +12,7 @@ export class LearningObject { language!: Language; @PrimaryKey({type: "string"}) - version: number = "1"; + version: string = "1"; @ManyToMany({entity: () => Teacher}) admins!: Teacher[]; @@ -54,7 +54,7 @@ export class LearningObject { estimatedTime!: number; @Embedded({entity: () => ReturnValue}) - returnValue: ReturnValue; + returnValue!: ReturnValue; @Property({type: "bool"}) available: boolean = true; @@ -66,25 +66,25 @@ export class LearningObject { attachments: Attachment[] = []; @Property({type: "blob"}) - content: Buffer; + content!: Buffer; } @Embeddable() export class EducationalGoal { @Property({type: "string"}) - source: string; + source!: string; @Property({type: "string"}) - id: string; + id!: string; } @Embeddable() -export class ReturnValue { +export class ReturnValue { @Property({type: "string"}) - callbackUrl: string; + callbackUrl!: string; @Property({type: "json"}) - callbackSchema: R; + callbackSchema!: string; } export enum ContentType { From 8ec201513ce4986094e907cb2e871f6c4350bf18 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Wed, 26 Feb 2025 00:52:45 +0100 Subject: [PATCH 28/92] feat(backend): Repositories voor leerinhoud LearningObjectRepository, LearningPathRepository en AttachmentRepository aangemaakt. --- backend/src/data/content/attachment-repository.ts | 10 ++++++++++ .../src/data/content/learning-object-repository.ts | 14 ++++++++++++++ .../src/data/content/learning-path-repository.ts | 10 ++++++++++ backend/src/entities/content/attachment.entity.ts | 2 +- .../src/entities/content/learning-path.entity.ts | 2 +- 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 backend/src/data/content/attachment-repository.ts create mode 100644 backend/src/data/content/learning-object-repository.ts create mode 100644 backend/src/data/content/learning-path-repository.ts diff --git a/backend/src/data/content/attachment-repository.ts b/backend/src/data/content/attachment-repository.ts new file mode 100644 index 00000000..aa14fbe5 --- /dev/null +++ b/backend/src/data/content/attachment-repository.ts @@ -0,0 +1,10 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {Attachment} from "../../entities/content/attachment.entity"; +import {LearningObject} from "../../entities/content/learning-object.entity"; + +export class AttachmentRepository extends DwengoEntityRepository { + public findByLearningObjectAndNumber(learningObject: LearningObject, sequenceNumber: number) { + return this.findOne({learningObject: learningObject, sequenceNumber: sequenceNumber}); + } + // This repository is read-only for now since creating own learning object is an extension feature. +} diff --git a/backend/src/data/content/learning-object-repository.ts b/backend/src/data/content/learning-object-repository.ts new file mode 100644 index 00000000..fa8019c0 --- /dev/null +++ b/backend/src/data/content/learning-object-repository.ts @@ -0,0 +1,14 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {LearningObject} from "../../entities/content/learning-object.entity"; +import {LearningObjectIdentifier} from "../../entities/content/learning-object-identifier"; + +export class LearningObjectRepository extends DwengoEntityRepository { + public findByIdentifier(identifier: LearningObjectIdentifier): Promise { + return this.findOne({ + hruid: identifier.hruid, + language: identifier.language, + version: identifier.version + }); + } + // This repository is read-only for now since creating own learning object is an extension feature. +} diff --git a/backend/src/data/content/learning-path-repository.ts b/backend/src/data/content/learning-path-repository.ts new file mode 100644 index 00000000..0dd1f876 --- /dev/null +++ b/backend/src/data/content/learning-path-repository.ts @@ -0,0 +1,10 @@ +import {DwengoEntityRepository} from "../dwengo-entity-repository"; +import {LearningPath} from "../../entities/content/learning-path.entity"; +import {Language} from "../../entities/content/language"; + +export class LearningPathRepository extends DwengoEntityRepository { + public findByHruidAndLanguage(hruid: string, language: Language): Promise { + return this.findOne({hruid: hruid, language: language}); + } + // This repository is read-only for now since creating own learning object is an extension feature. +} diff --git a/backend/src/entities/content/attachment.entity.ts b/backend/src/entities/content/attachment.entity.ts index 600d2a83..4a14c4fe 100644 --- a/backend/src/entities/content/attachment.entity.ts +++ b/backend/src/entities/content/attachment.entity.ts @@ -7,7 +7,7 @@ export class Attachment { learningObject!: LearningObject; @PrimaryKey({type: "integer"}) - no!: number; + sequenceNumber!: number; @Property({type: "string"}) mimeType!: string; diff --git a/backend/src/entities/content/learning-path.entity.ts b/backend/src/entities/content/learning-path.entity.ts index ef694af0..24d058ea 100644 --- a/backend/src/entities/content/learning-path.entity.ts +++ b/backend/src/entities/content/learning-path.entity.ts @@ -23,7 +23,7 @@ export class LearningPath { image!: string; @Embedded({entity: () => LearningPathNode, array: true}) - nodes: LearningPathNode[]; + nodes: LearningPathNode[] = []; } @Embeddable() From 4e883a1a18d967cf118bcdcc2b29d7443d5945d9 Mon Sep 17 00:00:00 2001 From: Gerald Schmittinger Date: Wed, 26 Feb 2025 01:09:40 +0100 Subject: [PATCH 29/92] feat(backend): Nieuwe repositories voor leerinhoud aan repositories.ts toevoegen. --- backend/src/data/repositories.ts | 64 ++++++++++++++++++++++- backend/src/data/users/user-repository.ts | 2 +- backend/tests/data/users.test.ts | 2 +- 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/backend/src/data/repositories.ts b/backend/src/data/repositories.ts index 892e7ca3..2aaef875 100644 --- a/backend/src/data/repositories.ts +++ b/backend/src/data/repositories.ts @@ -1,16 +1,76 @@ -import {AnyEntity, EntityName, EntityRepository} from "@mikro-orm/core"; +import {AnyEntity, EntityManager, EntityName, EntityRepository} from "@mikro-orm/core"; import {forkEntityManager} from "../orm"; import {StudentRepository} from "./users/student-repository"; import {Student} from "../entities/users/student.entity"; +import {User} from "../entities/users/user.entity"; +import {UserRepository} from "./users/user-repository"; +import {Teacher} from "../entities/users/teacher.entity"; +import {TeacherRepository} from "./users/teacher-repository"; +import {Class} from "../entities/classes/class.entity"; +import {ClassRepository} from "./classes/class-repository"; +import {ClassJoinRequest} from "../entities/classes/class-join-request.entity"; +import {ClassJoinRequestRepository} from "./classes/class-join-request-repository"; +import {TeacherInvitationRepository} from "./classes/teacher-invitation-repository"; +import {TeacherInvitation} from "../entities/classes/teacher-invitation.entity"; +import {Assignment} from "../entities/assignments/assignment.entity"; +import {AssignmentRepository} from "./assignments/assignment-repository"; +import {GroupRepository} from "./assignments/group-repository"; +import {Group} from "../entities/assignments/group.entity"; +import {Submission} from "../entities/assignments/submission.entity"; +import {SubmissionRepository} from "./assignments/submission-repository"; +import {Question} from "../entities/questions/question.entity"; +import {QuestionRepository} from "./questions/question-repository"; +import {Answer} from "../entities/questions/answer.entity"; +import {AnswerRepository} from "./questions/answer-repository"; +import {LearningObject} from "../entities/content/learning-object.entity"; +import {LearningObjectRepository} from "./content/learning-object-repository"; +import {LearningPath} from "../entities/content/learning-path.entity"; +import {LearningPathRepository} from "./content/learning-path-repository"; +import {AttachmentRepository} from "./content/attachment-repository"; +import {Attachment} from "../entities/content/attachment.entity"; + +let entityManager: EntityManager | undefined; + +/** + * Execute all the database operations within the function f in a single transaction. + */ +export function transactional(f: () => Promise) { + entityManager?.transactional(f); +} function repositoryGetter>(entity: EntityName): () => R { let cachedRepo: R | undefined; return (): R => { if (!cachedRepo) { - cachedRepo = forkEntityManager().getRepository(entity) as R; + if (!entityManager) { + entityManager = forkEntityManager(); + } + cachedRepo = entityManager.getRepository(entity) as R; } return cachedRepo; } } +/* Users */ +export const getUserRepository = repositoryGetter(User) export const getStudentRepository = repositoryGetter(Student); +export const getTeacherRepository = repositoryGetter(Teacher); + +/* Classes */ +export const getClassRepository = repositoryGetter(Class); +export const getClassJoinRequestRepository = repositoryGetter(ClassJoinRequest); +export const getTeacherInvitationRepository = repositoryGetter(TeacherInvitationRepository); + +/* Assignments */ +export const getAssignmentRepository = repositoryGetter(Assignment); +export const getGroupRepository = repositoryGetter(Group); +export const getSubmissionRepository = repositoryGetter(Submission); + +/* Questions and answers */ +export const getQuestionRepository = repositoryGetter(Question); +export const getAnswerRepository = repositoryGetter(Answer); + +/* Learning content */ +export const getLearningObjectRepository = repositoryGetter(LearningObject); +export const getLearningPathRepository = repositoryGetter(LearningPath); +export const getAttachmentRepository = repositoryGetter(Assignment); diff --git a/backend/src/data/users/user-repository.ts b/backend/src/data/users/user-repository.ts index 111244cd..65e053ac 100644 --- a/backend/src/data/users/user-repository.ts +++ b/backend/src/data/users/user-repository.ts @@ -1,7 +1,7 @@ import {DwengoEntityRepository} from "../dwengo-entity-repository"; import {User} from "../../entities/users/user.entity"; -export class StudentRepository extends DwengoEntityRepository { +export class UserRepository extends DwengoEntityRepository { public findByUsername(username: string): Promise { return this.findOne({username: username}); } diff --git a/backend/tests/data/users.test.ts b/backend/tests/data/users.test.ts index c806f13c..1a538ba7 100644 --- a/backend/tests/data/users.test.ts +++ b/backend/tests/data/users.test.ts @@ -11,7 +11,7 @@ describe("StudentRepository", () => { let studentRepository: StudentRepository; beforeAll(async () => { - setupTestApp(); + await setupTestApp(); studentRepository = getStudentRepository(); }); From 7578ea971b3b85acc67242a213ece2af4a33ba44 Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Wed, 26 Feb 2025 13:02:59 +0100 Subject: [PATCH 30/92] fix: _i18n map to backend feat: added descripion + images to /themes languages --- {_i18n => backend/_i18n}/de.yml | 0 {_i18n => backend/_i18n}/en.yml | 0 {_i18n => backend/_i18n}/fr.yml | 0 {_i18n => backend/_i18n}/nl.yml | 0 backend/src/app.ts | 4 ++-- backend/src/routes/themes.ts | 18 +++++++++++------- 6 files changed, 13 insertions(+), 9 deletions(-) rename {_i18n => backend/_i18n}/de.yml (100%) rename {_i18n => backend/_i18n}/en.yml (100%) rename {_i18n => backend/_i18n}/fr.yml (100%) rename {_i18n => backend/_i18n}/nl.yml (100%) diff --git a/_i18n/de.yml b/backend/_i18n/de.yml similarity index 100% rename from _i18n/de.yml rename to backend/_i18n/de.yml diff --git a/_i18n/en.yml b/backend/_i18n/en.yml similarity index 100% rename from _i18n/en.yml rename to backend/_i18n/en.yml diff --git a/_i18n/fr.yml b/backend/_i18n/fr.yml similarity index 100% rename from _i18n/fr.yml rename to backend/_i18n/fr.yml diff --git a/_i18n/nl.yml b/backend/_i18n/nl.yml similarity index 100% rename from _i18n/nl.yml rename to backend/_i18n/nl.yml diff --git a/backend/src/app.ts b/backend/src/app.ts index 89e1f3bc..a3a62a62 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -13,11 +13,11 @@ app.get('/', (_, res: Response) => { }); }); -app.use("/routes", themeRoutes); +app.use("/theme", themeRoutes); async function startServer() { - await initORM(); + //Await initORM(); app.listen(port, () => { console.log(`Server is running at http://localhost:${port}`); diff --git a/backend/src/routes/themes.ts b/backend/src/routes/themes.ts index 8a73c6bf..96b6b610 100644 --- a/backend/src/routes/themes.ts +++ b/backend/src/routes/themes.ts @@ -131,10 +131,11 @@ interface Theme { interface Translations { curricula_page: { - [key: string]: { title: string }; + [key: string]: { title: string; description?: string }; // Description is nu optioneel }; } + // Function to load translations from YAML files const loadTranslations = (language: string): Translations => { try { @@ -143,29 +144,32 @@ const loadTranslations = (language: string): Translations => { return yaml.load(yamlFile) as Translations; } catch (error) { console.error(`Kan vertaling niet laden voor ${language}, fallback naar Nederlands`); + console.error("error", error); const fallbackPath = path.join(process.cwd(), "_i18n", "nl.yml"); return yaml.load(fs.readFileSync(fallbackPath, "utf8")) as Translations; } }; // **GET /themes** → Returns a list of all themes as { theme: "key", translation: "Title in requested language" } -router.get("/themes", (req: Request, res: Response) => { +router.get("", (req: Request, res: Response) => { const language = (req.query.language as string)?.toLowerCase() || "nl"; // Default: Nederlands const translations = loadTranslations(language); - const themeList = (themes as Theme[]).map((theme) => ({ + const themeList = (themes as Theme[]).map((theme) => {return { key: theme.title, // The original key - theme: translations.curricula_page[theme.title]?.title || theme.title - })); + title: translations.curricula_page[theme.title]?.title || theme.title, + description: translations.curricula_page[theme.title]?.description, + image: `https://dwengo.org/images/curricula/logo_${theme.title}.png` + }}); res.json(themeList); }); // **GET /themes/:theme** → Returns hruids for a theme -router.get("/themes/:theme", (req: Request, res: Response) => { +router.get("/:theme", (req: Request, res: Response) => { const themeKey = req.params.theme; // This is the `title` in themes_hruids.json // Find the theme in the JSON list - const theme = (themes as Theme[]).find((t) => t.title === themeKey); + const theme = (themes as Theme[]).find((t) => {return t.title === themeKey}); if (theme) { res.json(theme.hruids); From 8179132811a84c46a31188e52c891374d2c14f7c Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Wed, 26 Feb 2025 13:20:57 +0100 Subject: [PATCH 31/92] fix: MikroORM terug aangezet in backend/src/app.ts --- backend/src/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/app.ts b/backend/src/app.ts index 5e4e781a..532f7734 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -30,7 +30,7 @@ app.use('/login', loginRouter); async function startServer() { - //await initORM(); + await initORM(); app.listen(port, () => { console.log(`Server is running at http://localhost:${port}`); From 023c7f5d695803f14e4c68ff5fac277438b4c7b9 Mon Sep 17 00:00:00 2001 From: Joyelle Ndagijimana Date: Wed, 26 Feb 2025 13:30:23 +0100 Subject: [PATCH 32/92] feat(frontend): register pagina verwijderd en submappen hernoemd --- frontend/src/router/index.ts | 35 +++++++++---------- frontend/src/views/{auth => }/HomePage.vue | 0 frontend/src/views/{auth => }/LoginPage.vue | 0 .../views/{student => }/StudentHomepage.vue | 0 .../views/{teacher => }/TeacherHomepage.vue | 0 .../assignment/CreateAssignment.vue | 0 .../assignment/SingleAssignment.vue | 0 .../StudentAssignments.vue | 0 .../TeacherAssignments.vue | 0 frontend/src/views/auth/RegisterPage.vue | 18 ---------- .../{resources => }/class/CreateClass.vue | 0 .../{resources => }/class/SingleClass.vue | 0 .../{student => class}/StudentClasses.vue | 0 .../{teacher => class}/TeacherClasses.vue | 0 .../discussion/CreateDiscussion.vue | 0 .../discussion/SingleDiscussion.vue | 0 .../StudentDiscussions.vue | 0 .../TeacherDiscussions.vue | 0 18 files changed, 17 insertions(+), 36 deletions(-) rename frontend/src/views/{auth => }/HomePage.vue (100%) rename frontend/src/views/{auth => }/LoginPage.vue (100%) rename frontend/src/views/{student => }/StudentHomepage.vue (100%) rename frontend/src/views/{teacher => }/TeacherHomepage.vue (100%) rename frontend/src/views/{resources => }/assignment/CreateAssignment.vue (100%) rename frontend/src/views/{resources => }/assignment/SingleAssignment.vue (100%) rename frontend/src/views/{student => assignment}/StudentAssignments.vue (100%) rename frontend/src/views/{teacher => assignment}/TeacherAssignments.vue (100%) delete mode 100644 frontend/src/views/auth/RegisterPage.vue rename frontend/src/views/{resources => }/class/CreateClass.vue (100%) rename frontend/src/views/{resources => }/class/SingleClass.vue (100%) rename frontend/src/views/{student => class}/StudentClasses.vue (100%) rename frontend/src/views/{teacher => class}/TeacherClasses.vue (100%) rename frontend/src/views/{resources => }/discussion/CreateDiscussion.vue (100%) rename frontend/src/views/{resources => }/discussion/SingleDiscussion.vue (100%) rename frontend/src/views/{student => discussion}/StudentDiscussions.vue (100%) rename frontend/src/views/{teacher => discussion}/TeacherDiscussions.vue (100%) diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 3964dfd7..9eaaa622 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -1,23 +1,22 @@ import {createRouter, createWebHistory} from "vue-router"; -import LoginPage from "@/views/auth/LoginPage.vue"; -import RegisterPage from "@/views/auth/RegisterPage.vue"; -import HomePage from "@/views/auth/HomePage.vue"; +import LoginPage from "@/views/LoginPage.vue"; +import HomePage from "@/views/HomePage.vue"; import MenuBar from "@/components/MenuBar.vue"; -import StudentHomepage from "@/views/student/StudentHomepage.vue"; -import StudentAssignments from "@/views/student/StudentAssignments.vue"; -import StudentClasses from "@/views/student/StudentClasses.vue"; -import StudentDiscussions from "@/views/student/StudentDiscussions.vue"; -import TeacherHomepage from "@/views/teacher/TeacherHomepage.vue"; -import TeacherAssignments from "@/views/teacher/TeacherAssignments.vue"; -import TeacherClasses from "@/views/teacher/TeacherClasses.vue"; -import TeacherDiscussions from "@/views/teacher/TeacherDiscussions.vue"; -import SingleAssignment from "@/views/resources/assignment/SingleAssignment.vue"; -import SingleClass from "@/views/resources/class/SingleClass.vue"; -import SingleDiscussion from "@/views/resources/discussion/SingleDiscussion.vue"; +import StudentHomepage from "@/views/StudentHomepage.vue"; +import StudentAssignments from "@/views/assignment/StudentAssignments.vue"; +import StudentClasses from "@/views/class/StudentClasses.vue"; +import StudentDiscussions from "@/views/discussion/StudentDiscussions.vue"; +import TeacherHomepage from "@/views/TeacherHomepage.vue"; +import TeacherAssignments from "@/views/assignment/TeacherAssignments.vue"; +import TeacherClasses from "@/views/class/TeacherClasses.vue"; +import TeacherDiscussions from "@/views/discussion/TeacherDiscussions.vue"; +import SingleAssignment from "@/views/assignment/SingleAssignment.vue"; +import SingleClass from "@/views/class/SingleClass.vue"; +import SingleDiscussion from "@/views/discussion/SingleDiscussion.vue"; import NotFound from "@/components/errors/NotFound.vue"; -import CreateClass from "@/views/resources/class/CreateClass.vue"; -import CreateAssignment from "@/views/resources/assignment/CreateAssignment.vue"; -import CreateDiscussion from "@/views/resources/discussion/CreateDiscussion.vue"; +import CreateClass from "@/views/class/CreateClass.vue"; +import CreateAssignment from "@/views/assignment/CreateAssignment.vue"; +import CreateDiscussion from "@/views/discussion/CreateDiscussion.vue"; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -35,7 +34,7 @@ const router = createRouter({ { path: "/:role/register", name: "RegisterPage", - component: RegisterPage + component: () => {} }, { path: "/student/:id", diff --git a/frontend/src/views/auth/HomePage.vue b/frontend/src/views/HomePage.vue similarity index 100% rename from frontend/src/views/auth/HomePage.vue rename to frontend/src/views/HomePage.vue diff --git a/frontend/src/views/auth/LoginPage.vue b/frontend/src/views/LoginPage.vue similarity index 100% rename from frontend/src/views/auth/LoginPage.vue rename to frontend/src/views/LoginPage.vue diff --git a/frontend/src/views/student/StudentHomepage.vue b/frontend/src/views/StudentHomepage.vue similarity index 100% rename from frontend/src/views/student/StudentHomepage.vue rename to frontend/src/views/StudentHomepage.vue diff --git a/frontend/src/views/teacher/TeacherHomepage.vue b/frontend/src/views/TeacherHomepage.vue similarity index 100% rename from frontend/src/views/teacher/TeacherHomepage.vue rename to frontend/src/views/TeacherHomepage.vue diff --git a/frontend/src/views/resources/assignment/CreateAssignment.vue b/frontend/src/views/assignment/CreateAssignment.vue similarity index 100% rename from frontend/src/views/resources/assignment/CreateAssignment.vue rename to frontend/src/views/assignment/CreateAssignment.vue diff --git a/frontend/src/views/resources/assignment/SingleAssignment.vue b/frontend/src/views/assignment/SingleAssignment.vue similarity index 100% rename from frontend/src/views/resources/assignment/SingleAssignment.vue rename to frontend/src/views/assignment/SingleAssignment.vue diff --git a/frontend/src/views/student/StudentAssignments.vue b/frontend/src/views/assignment/StudentAssignments.vue similarity index 100% rename from frontend/src/views/student/StudentAssignments.vue rename to frontend/src/views/assignment/StudentAssignments.vue diff --git a/frontend/src/views/teacher/TeacherAssignments.vue b/frontend/src/views/assignment/TeacherAssignments.vue similarity index 100% rename from frontend/src/views/teacher/TeacherAssignments.vue rename to frontend/src/views/assignment/TeacherAssignments.vue diff --git a/frontend/src/views/auth/RegisterPage.vue b/frontend/src/views/auth/RegisterPage.vue deleted file mode 100644 index 8bee61b1..00000000 --- a/frontend/src/views/auth/RegisterPage.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/frontend/src/views/resources/class/CreateClass.vue b/frontend/src/views/class/CreateClass.vue similarity index 100% rename from frontend/src/views/resources/class/CreateClass.vue rename to frontend/src/views/class/CreateClass.vue diff --git a/frontend/src/views/resources/class/SingleClass.vue b/frontend/src/views/class/SingleClass.vue similarity index 100% rename from frontend/src/views/resources/class/SingleClass.vue rename to frontend/src/views/class/SingleClass.vue diff --git a/frontend/src/views/student/StudentClasses.vue b/frontend/src/views/class/StudentClasses.vue similarity index 100% rename from frontend/src/views/student/StudentClasses.vue rename to frontend/src/views/class/StudentClasses.vue diff --git a/frontend/src/views/teacher/TeacherClasses.vue b/frontend/src/views/class/TeacherClasses.vue similarity index 100% rename from frontend/src/views/teacher/TeacherClasses.vue rename to frontend/src/views/class/TeacherClasses.vue diff --git a/frontend/src/views/resources/discussion/CreateDiscussion.vue b/frontend/src/views/discussion/CreateDiscussion.vue similarity index 100% rename from frontend/src/views/resources/discussion/CreateDiscussion.vue rename to frontend/src/views/discussion/CreateDiscussion.vue diff --git a/frontend/src/views/resources/discussion/SingleDiscussion.vue b/frontend/src/views/discussion/SingleDiscussion.vue similarity index 100% rename from frontend/src/views/resources/discussion/SingleDiscussion.vue rename to frontend/src/views/discussion/SingleDiscussion.vue diff --git a/frontend/src/views/student/StudentDiscussions.vue b/frontend/src/views/discussion/StudentDiscussions.vue similarity index 100% rename from frontend/src/views/student/StudentDiscussions.vue rename to frontend/src/views/discussion/StudentDiscussions.vue diff --git a/frontend/src/views/teacher/TeacherDiscussions.vue b/frontend/src/views/discussion/TeacherDiscussions.vue similarity index 100% rename from frontend/src/views/teacher/TeacherDiscussions.vue rename to frontend/src/views/discussion/TeacherDiscussions.vue From e0c756fb361ab0fd3e18a50ee0c8bbe4fb07c52e Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Wed, 26 Feb 2025 14:17:21 +0100 Subject: [PATCH 33/92] feat: /teacher endpoint met dummy JSON voor #48 --- backend/src/routes/teacher.ts | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 backend/src/routes/teacher.ts diff --git a/backend/src/routes/teacher.ts b/backend/src/routes/teacher.ts new file mode 100644 index 00000000..a004ce8c --- /dev/null +++ b/backend/src/routes/teacher.ts @@ -0,0 +1,44 @@ +import express from 'express' +const router = express.Router(); + +// information about an question with id 'id' +router.get('/:id/', (req, res) => { + res.json({ + id: req.params.id, + firstName: 'John', + lastName: 'Doe', + username: 'JohnDoe1', + endpoints: { + classes: `/teacher/${req.params.id}/classes`, + questions: `/teacher/${req.params.id}/questions`, + invitations: `/teacher/${req.params.id}/invitations`, + }, + }); +}) + +router.get('/:id/questions', (req, res) => { + res.json({ + questions: [ + '0' + ], + }); +}); + +router.get('/:id/invitations', (req, res) => { + res.json({ + invitations: [ + '0' + ], + }); +}); + +router.get('/:id/classes', (req, res) => { + res.json({ + classes: [ + '0' + ], + }); +}); + + +export default router \ No newline at end of file From bb41fd848c2ea903f374e457b9c9ee96d67ca4fb Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Wed, 26 Feb 2025 14:18:48 +0100 Subject: [PATCH 34/92] feat: commentaar toegevoegd voor de verschillende endpoints in /teacher --- backend/src/routes/teacher.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/src/routes/teacher.ts b/backend/src/routes/teacher.ts index a004ce8c..851da986 100644 --- a/backend/src/routes/teacher.ts +++ b/backend/src/routes/teacher.ts @@ -1,7 +1,7 @@ import express from 'express' const router = express.Router(); -// information about an question with id 'id' +// information about a teacher router.get('/:id/', (req, res) => { res.json({ id: req.params.id, @@ -16,6 +16,7 @@ router.get('/:id/', (req, res) => { }); }) +// the questions students asked a teacher router.get('/:id/questions', (req, res) => { res.json({ questions: [ @@ -24,6 +25,7 @@ router.get('/:id/questions', (req, res) => { }); }); +// invitations to other classes a teacher received router.get('/:id/invitations', (req, res) => { res.json({ invitations: [ @@ -32,6 +34,7 @@ router.get('/:id/invitations', (req, res) => { }); }); +// a list with ids of classes a teacher is in router.get('/:id/classes', (req, res) => { res.json({ classes: [ From 62d4e3bc224d4fe52fa3af8cc5f9d25dab055cab Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Wed, 26 Feb 2025 14:20:58 +0100 Subject: [PATCH 35/92] feat: profiel endpoint van een student toegevoegd --- backend/src/routes/student.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/backend/src/routes/student.ts b/backend/src/routes/student.ts index 3c8cd16c..b799e6aa 100644 --- a/backend/src/routes/student.ts +++ b/backend/src/routes/student.ts @@ -1,6 +1,22 @@ import express from 'express' const router = express.Router(); +// information about a student's profile +router.get('/:id', (req, res) => { + res.json({ + id: req.params.id, + firstName: 'Jimmy', + lastName: 'Faster', + username: 'JimmyFaster2', + endpoints: { + classes: `/student/${req.params.id}/classes`, + questions: `/student/${req.params.id}/submissions`, + invitations: `/student/${req.params.id}/assignments`, + groups: `/student/${req.params.id}/groups`, + }, + }); +}); + // the list of classes a student is in router.get('/:id/classes', (req, res) => { res.json({ From 08e54dbcb1847d1d0b93bf60c7e91023e069572d Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Wed, 26 Feb 2025 14:35:42 +0100 Subject: [PATCH 36/92] feat+fix: extra endpoints in /class toegevoegd, links in responses naar zuster endpoints toegevoegd --- backend/src/routes/class.ts | 32 ++++++++++++++++++++++++++++++-- backend/src/routes/teacher.ts | 9 +++++---- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/backend/src/routes/class.ts b/backend/src/routes/class.ts index c9fe4259..4d031587 100644 --- a/backend/src/routes/class.ts +++ b/backend/src/routes/class.ts @@ -8,9 +8,37 @@ router.get('/:id', (req, res) => { displayName: 'Klas 4B', teachers: [ '0' ], students: [ '0' ], - assignments: [ '0' ], joinRequests: [ '0' ], - invitations: [ '0' ], + links: { + self: `${req.baseUrl}/${req.params.id}`, + classes: `${req.baseUrl}/${req.params.id}/invitations`, + questions: `${req.baseUrl}/${req.params.id}/assignments`, + students: `${req.baseUrl}/${req.params.id}/students`, + } + }); +}) + +router.get('/:id/invitations', (req, res) => { + res.json({ + invitations: [ + '0' + ], + }); +}) + +router.get('/:id/assignments', (req, res) => { + res.json({ + assignments: [ + '0' + ], + }); +}) + +router.get('/:id/students', (req, res) => { + res.json({ + students: [ + '0' + ], }); }) diff --git a/backend/src/routes/teacher.ts b/backend/src/routes/teacher.ts index 851da986..06ab320b 100644 --- a/backend/src/routes/teacher.ts +++ b/backend/src/routes/teacher.ts @@ -8,10 +8,11 @@ router.get('/:id/', (req, res) => { firstName: 'John', lastName: 'Doe', username: 'JohnDoe1', - endpoints: { - classes: `/teacher/${req.params.id}/classes`, - questions: `/teacher/${req.params.id}/questions`, - invitations: `/teacher/${req.params.id}/invitations`, + links: { + self: `${req.baseUrl}/${req.params.id}`, + classes: `${req.baseUrl}/${req.params.id}/classes`, + questions: `${req.baseUrl}/${req.params.id}/questions`, + invitations: `${req.baseUrl}/${req.params.id}/invitations`, }, }); }) From a7d4868e63e012bf750395b5404769a55ca5a9a5 Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Wed, 26 Feb 2025 14:40:32 +0100 Subject: [PATCH 37/92] feat: extra endpoints toegevoegd voor /assignment --- backend/src/routes/assignment.ts | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/backend/src/routes/assignment.ts b/backend/src/routes/assignment.ts index 95116243..38fffe29 100644 --- a/backend/src/routes/assignment.ts +++ b/backend/src/routes/assignment.ts @@ -9,8 +9,36 @@ router.get('/:id', (req, res) => { description: 'Een korte beschrijving', groups: [ '0' ], learningPath: '0', - class: '0' + class: '0', + links: { + self: `${req.baseUrl}/${req.params.id}`, + submissions: `${req.baseUrl}/${req.params.id}`, + }, }); }) +router.get('/:id/submissions', (req, res) => { + res.json({ + submissions: [ + '0' + ], + }); +}); + +router.get('/:id/groups', (req, res) => { + res.json({ + groups: [ + '0' + ], + }); +}); + +router.get('/:id/questions', (req, res) => { + res.json({ + questions: [ + '0' + ], + }); +}); + export default router \ No newline at end of file From 2e87710fe662af39aedb1e69ffecfeefb76e7bcf Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Wed, 26 Feb 2025 14:42:38 +0100 Subject: [PATCH 38/92] feat: extra endpoints voor /question toegevoegd --- backend/src/routes/question.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/backend/src/routes/question.ts b/backend/src/routes/question.ts index 2218abf9..16b1a484 100644 --- a/backend/src/routes/question.ts +++ b/backend/src/routes/question.ts @@ -9,9 +9,20 @@ router.get('/:id', (req, res) => { group: '0', time: new Date(2025, 1, 1), content: 'Zijn alle gehele getallen groter dan 2 gelijk aan de som van 2 priemgetallen????', - answers: [ '0' ], - learningObject: [ '0' ], + learningObject: '0', + links: { + self: `${req.baseUrl}/${req.params.id}`, + answers: `${req.baseUrl}/${req.params.id}/answers`, + } }); }) +router.get('/:id/answers', (req, res) => { + res.json({ + answers: [ + '0' + ], + }) +}) + export default router \ No newline at end of file From 1dc5cfa283dc4b9d4d16897ea728b847ddff2910 Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Wed, 26 Feb 2025 18:11:25 +0100 Subject: [PATCH 39/92] feat: added descripion + images to /themes languages --- backend/src/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/app.ts b/backend/src/app.ts index a3a62a62..fd792460 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -17,7 +17,7 @@ app.use("/theme", themeRoutes); async function startServer() { - //Await initORM(); + await initORM(); app.listen(port, () => { console.log(`Server is running at http://localhost:${port}`); From 6525e34f77aa8648fca2a5c1f6b45318e2bf9229 Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Wed, 26 Feb 2025 18:13:02 +0100 Subject: [PATCH 40/92] fix: lint const to function --- backend/src/routes/themes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/routes/themes.ts b/backend/src/routes/themes.ts index 96b6b610..c673ff26 100644 --- a/backend/src/routes/themes.ts +++ b/backend/src/routes/themes.ts @@ -137,7 +137,7 @@ interface Translations { // Function to load translations from YAML files -const loadTranslations = (language: string): Translations => { +function loadTranslations(language: string): Translations { try { const filePath = path.join(process.cwd(), "_i18n", `${language}.yml`); const yamlFile = fs.readFileSync(filePath, "utf8"); From 9edc11aed17e9de768f7b7c9f9433724765a6751 Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Wed, 26 Feb 2025 18:33:34 +0100 Subject: [PATCH 41/92] fix: splits route file door controller --- backend/src/controllers/themes.ts | 178 +++++++++++++++++++++++++++++ backend/src/routes/themes.ts | 180 +----------------------------- 2 files changed, 182 insertions(+), 176 deletions(-) create mode 100644 backend/src/controllers/themes.ts diff --git a/backend/src/controllers/themes.ts b/backend/src/controllers/themes.ts new file mode 100644 index 00000000..b76474b2 --- /dev/null +++ b/backend/src/controllers/themes.ts @@ -0,0 +1,178 @@ +import fs from "fs"; +import path from "path"; +import yaml from "js-yaml"; +import { Request, Response } from "express"; + +interface Theme { + title: string; + hruids: string[]; +} + +interface Translations { + curricula_page: { + [key: string]: { title: string; description?: string }; // Optioneel veld description + }; +} + +const themes: Theme[] = [ + { + title: "kiks", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "pn_klimaatverandering", + "kiks1_microscopie", "kiks2_practicum", "pn_digitalebeelden", + "kiks3_dl_basis", "kiks4_dl_gevorderd", "kiks5_classificatie", + "kiks6_regressie", "kiks7_ethiek", "kiks8_eindtermen" + ] + }, + { + title: "art", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "art1", "art2", "art3" + ] + }, + { + title: "socialrobot", + hruids: [ + "sr0_lkr", "sr0_lln", "sr1", "sr2", "sr3", "sr4" + ] + }, + { + title: "agriculture", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "agri_landbouw", "agri_lopendeband" + ] + }, + { + title: "wegostem", + hruids: [ + "wegostem" + ] + }, + { + title: "computational_thinking", + hruids: [ + "ct1_concepten", "ct2_concreet", "ct3_voorbeelden", "ct6_cases", + "ct9_impact", "ct10_bebras", "ct8_eindtermen", "ct7_historiek", + "ct5_kijkwijzer", "ct4_evaluatiekader" + ] + }, + { + title: "math_with_python", + hruids: [ + "pn_werking", "maths_pythagoras", "maths_spreidingsdiagrammen", + "maths_rechten", "maths_lineaireregressie", "maths_epidemie", + "pn_digitalebeelden", "maths_logica", "maths_parameters", + "maths_parabolen", "pn_regressie", "maths7_grafen", "maths8_statistiek" + ] + }, + { + title: "python_programming", + hruids: [ + "pn_werking", "pn_datatypes", "pn_operatoren", "pn_structuren", + "pn_functies", "art2", "stem_insectbooks", "un_algoenprog" + ] + }, + { + title: "stem", + hruids: [ + "pn_werking", "maths_spreidingsdiagrammen", "pn_digitalebeelden", + "maths_epidemie", "stem_ipadres", "pn_klimaatverandering", + "stem_rechten", "stem_lineaireregressie", "stem_insectbooks" + ] + }, + { + title: "care", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "aiz1_zorg", "aiz2_grafen", + "aiz3_unplugged", "aiz4_eindtermen", "aiz5_triage" + ] + }, + { + title: "chatbot", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "cb5_chatbotunplugged", + "cb1_chatbot", "cb2_sentimentanalyse", "cb3_vervoegmachine", + "cb4_eindtermen", "cb6" + ] + }, + { + title: "physical_computing", + hruids: [ + "pc_starttodwenguino", "pc_rijdenderobot", "pc_theremin", + "pc_leerlijn_introductie", "pc_leerlijn_invoer_verwerking_uitvoer", + "pc_leerlijn_basisprincipes_digitale_elektronica", + "pc_leerlijn_grafisch_naar_tekstueel", "pc_leerlijn_basis_programmeren", + "pc_leerlijn_van_µc_naar_plc", "pc_leerlijn_fiches_dwenguino", + "pc_leerlijn_seriele_monitor", "pc_leerlijn_bus_protocollen", + "pc_leerlijn_wifi", "pc_leerlijn_fiches_arduino", + "pc_leerlijn_project_lijnvolger", "pc_leerlijn_project_bluetooth", + "pc_leerlijn_hddclock", "pc_leerlijn_fysica_valbeweging", + "pc_leerlijn_luchtkwaliteit", "pc_leerlijn_weerstation", + "pc_leerlijn_g0", "pc_leerlijn_g1", "pc_leerlijn_g3", "pc_leerlijn_g4", + "pc_leerlijn_g5" + ] + }, + { + title: "algorithms", + hruids: [ + "art2", "anm1", "anm2", "anm3", "anm4", "anm11", "anm12", "anm13", + "anm14", "anm15", "anm16", "anm17", "maths_epidemie", "stem_insectbooks" + ] + }, + { + title: "basics_ai", + hruids: [ + "un_artificiele_intelligentie", "org-dwengo-waisda-taal-murder-mistery", + "art1", "org-dwengo-waisda-beelden-emoties-herkennen", + "org-dwengo-waisda-beelden-unplugged-fax-lp", + "org-dwengo-waisda-beelden-teachable-machine" + ] + } +]; + +/** + * Laadt de vertalingen uit een YAML-bestand + */ +function loadTranslations(language: string): Translations { + try { + const filePath = path.join(process.cwd(), "_i18n", `${language}.yml`); + const yamlFile = fs.readFileSync(filePath, "utf8"); + return yaml.load(yamlFile) as Translations; + } catch (error) { + console.error(`Kan vertaling niet laden voor ${language}, fallback naar Nederlands`); + console.error(error); + const fallbackPath = path.join(process.cwd(), "_i18n", "nl.yml"); + return yaml.load(fs.readFileSync(fallbackPath, "utf8")) as Translations; + } +} + +/** + * GET /themes → Haalt de lijst met thema's op inclusief vertalingen + */ +export function getThemes(req: Request, res: Response){ + const language = (req.query.language as string)?.toLowerCase() || "nl"; + const translations = loadTranslations(language); + + const themeList = themes.map((theme) => {return { + key: theme.title, + title: translations.curricula_page[theme.title]?.title || theme.title, + description: translations.curricula_page[theme.title]?.description, + image: `https://dwengo.org/images/curricula/logo_${theme.title}.png` + }}); + + res.json(themeList); +}; + +/** + * GET /themes/:theme → Geeft de HRUIDs terug voor een specifiek thema + */ +export function getThemeByTitle(req: Request, res: Response) { + const themeKey = req.params.theme; + const theme = themes.find((t) => {return t.title === themeKey}); + + if (theme) { + res.json(theme.hruids); + } else { + res.status(404).json({ error: "Thema niet gevonden" }); + } +}; diff --git a/backend/src/routes/themes.ts b/backend/src/routes/themes.ts index c673ff26..6245349c 100644 --- a/backend/src/routes/themes.ts +++ b/backend/src/routes/themes.ts @@ -1,181 +1,9 @@ -import express, { Request, Response } from "express"; -import fs from "fs"; -import yaml from "js-yaml"; -import path from "path"; +import express from "express"; +import { getThemes, getThemeByTitle } from "../controllers/themes.js"; const router = express.Router(); -const themes = [ - { - title: "kiks", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "pn_klimaatverandering", - "kiks1_microscopie", "kiks2_practicum", "pn_digitalebeelden", - "kiks3_dl_basis", "kiks4_dl_gevorderd", "kiks5_classificatie", - "kiks6_regressie", "kiks7_ethiek", "kiks8_eindtermen" - ] - }, - { - title: "art", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "art1", "art2", "art3" - ] - }, - { - title: "socialrobot", - hruids: [ - "sr0_lkr", "sr0_lln", "sr1", "sr2", "sr3", "sr4" - ] - }, - { - title: "agriculture", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "agri_landbouw", "agri_lopendeband" - ] - }, - { - title: "wegostem", - hruids: [ - "wegostem" - ] - }, - { - title: "computational_thinking", - hruids: [ - "ct1_concepten", "ct2_concreet", "ct3_voorbeelden", "ct6_cases", - "ct9_impact", "ct10_bebras", "ct8_eindtermen", "ct7_historiek", - "ct5_kijkwijzer", "ct4_evaluatiekader" - ] - }, - { - title: "math_with_python", - hruids: [ - "pn_werking", "maths_pythagoras", "maths_spreidingsdiagrammen", - "maths_rechten", "maths_lineaireregressie", "maths_epidemie", - "pn_digitalebeelden", "maths_logica", "maths_parameters", - "maths_parabolen", "pn_regressie", "maths7_grafen", "maths8_statistiek" - ] - }, - { - title: "python_programming", - hruids: [ - "pn_werking", "pn_datatypes", "pn_operatoren", "pn_structuren", - "pn_functies", "art2", "stem_insectbooks", "un_algoenprog" - ] - }, - { - title: "stem", - hruids: [ - "pn_werking", "maths_spreidingsdiagrammen", "pn_digitalebeelden", - "maths_epidemie", "stem_ipadres", "pn_klimaatverandering", - "stem_rechten", "stem_lineaireregressie", "stem_insectbooks" - ] - }, - { - title: "care", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "aiz1_zorg", "aiz2_grafen", - "aiz3_unplugged", "aiz4_eindtermen", "aiz5_triage" - ] - }, - { - title: "chatbot", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "cb5_chatbotunplugged", - "cb1_chatbot", "cb2_sentimentanalyse", "cb3_vervoegmachine", - "cb4_eindtermen", "cb6" - ] - }, - { - title: "physical_computing", - hruids: [ - "pc_starttodwenguino", "pc_rijdenderobot", "pc_theremin", - "pc_leerlijn_introductie", "pc_leerlijn_invoer_verwerking_uitvoer", - "pc_leerlijn_basisprincipes_digitale_elektronica", - "pc_leerlijn_grafisch_naar_tekstueel", "pc_leerlijn_basis_programmeren", - "pc_leerlijn_van_µc_naar_plc", "pc_leerlijn_fiches_dwenguino", - "pc_leerlijn_seriele_monitor", "pc_leerlijn_bus_protocollen", - "pc_leerlijn_wifi", "pc_leerlijn_fiches_arduino", - "pc_leerlijn_project_lijnvolger", "pc_leerlijn_project_bluetooth", - "pc_leerlijn_hddclock", "pc_leerlijn_fysica_valbeweging", - "pc_leerlijn_luchtkwaliteit", "pc_leerlijn_weerstation", - "pc_leerlijn_g0", "pc_leerlijn_g1", "pc_leerlijn_g3", "pc_leerlijn_g4", - "pc_leerlijn_g5" - ] - }, - { - title: "algorithms", - hruids: [ - "art2", "anm1", "anm2", "anm3", "anm4", "anm11", "anm12", "anm13", - "anm14", "anm15", "anm16", "anm17", "maths_epidemie", "stem_insectbooks" - ] - }, - { - title: "basics_ai", - hruids: [ - "un_artificiele_intelligentie", "org-dwengo-waisda-taal-murder-mistery", - "art1", "org-dwengo-waisda-beelden-emoties-herkennen", - "org-dwengo-waisda-beelden-unplugged-fax-lp", - "org-dwengo-waisda-beelden-teachable-machine" - ] - } -]; - - - -// Define interfaces for type safety -interface Theme { - title: string; - hruids: string[]; -} - -interface Translations { - curricula_page: { - [key: string]: { title: string; description?: string }; // Description is nu optioneel - }; -} - - -// Function to load translations from YAML files -function loadTranslations(language: string): Translations { - try { - const filePath = path.join(process.cwd(), "_i18n", `${language}.yml`); - const yamlFile = fs.readFileSync(filePath, "utf8"); - return yaml.load(yamlFile) as Translations; - } catch (error) { - console.error(`Kan vertaling niet laden voor ${language}, fallback naar Nederlands`); - console.error("error", error); - const fallbackPath = path.join(process.cwd(), "_i18n", "nl.yml"); - return yaml.load(fs.readFileSync(fallbackPath, "utf8")) as Translations; - } -}; - -// **GET /themes** → Returns a list of all themes as { theme: "key", translation: "Title in requested language" } -router.get("", (req: Request, res: Response) => { - const language = (req.query.language as string)?.toLowerCase() || "nl"; // Default: Nederlands - const translations = loadTranslations(language); - - const themeList = (themes as Theme[]).map((theme) => {return { - key: theme.title, // The original key - title: translations.curricula_page[theme.title]?.title || theme.title, - description: translations.curricula_page[theme.title]?.description, - image: `https://dwengo.org/images/curricula/logo_${theme.title}.png` - }}); - res.json(themeList); -}); - -// **GET /themes/:theme** → Returns hruids for a theme -router.get("/:theme", (req: Request, res: Response) => { - const themeKey = req.params.theme; // This is the `title` in themes_hruids.json - - // Find the theme in the JSON list - const theme = (themes as Theme[]).find((t) => {return t.title === themeKey}); - - if (theme) { - res.json(theme.hruids); - } else { - res.status(404).json({ error: "Thema niet gevonden" }); - } -}); +router.get("/", getThemes); +router.get("/:theme", getThemeByTitle); export default router; From ab17e982c7790afcb973aed9dc78fe370fd26eb7 Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Wed, 26 Feb 2025 18:51:27 +0100 Subject: [PATCH 42/92] fix: grote variabele in data bestand --- backend/src/controllers/themes.ts | 122 +----------------------------- backend/src/data/themes.ts | 120 +++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 121 deletions(-) create mode 100644 backend/src/data/themes.ts diff --git a/backend/src/controllers/themes.ts b/backend/src/controllers/themes.ts index b76474b2..27419989 100644 --- a/backend/src/controllers/themes.ts +++ b/backend/src/controllers/themes.ts @@ -2,11 +2,7 @@ import fs from "fs"; import path from "path"; import yaml from "js-yaml"; import { Request, Response } from "express"; - -interface Theme { - title: string; - hruids: string[]; -} +import { themes } from "../data/themes.js"; interface Translations { curricula_page: { @@ -14,122 +10,6 @@ interface Translations { }; } -const themes: Theme[] = [ - { - title: "kiks", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "pn_klimaatverandering", - "kiks1_microscopie", "kiks2_practicum", "pn_digitalebeelden", - "kiks3_dl_basis", "kiks4_dl_gevorderd", "kiks5_classificatie", - "kiks6_regressie", "kiks7_ethiek", "kiks8_eindtermen" - ] - }, - { - title: "art", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "art1", "art2", "art3" - ] - }, - { - title: "socialrobot", - hruids: [ - "sr0_lkr", "sr0_lln", "sr1", "sr2", "sr3", "sr4" - ] - }, - { - title: "agriculture", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "agri_landbouw", "agri_lopendeband" - ] - }, - { - title: "wegostem", - hruids: [ - "wegostem" - ] - }, - { - title: "computational_thinking", - hruids: [ - "ct1_concepten", "ct2_concreet", "ct3_voorbeelden", "ct6_cases", - "ct9_impact", "ct10_bebras", "ct8_eindtermen", "ct7_historiek", - "ct5_kijkwijzer", "ct4_evaluatiekader" - ] - }, - { - title: "math_with_python", - hruids: [ - "pn_werking", "maths_pythagoras", "maths_spreidingsdiagrammen", - "maths_rechten", "maths_lineaireregressie", "maths_epidemie", - "pn_digitalebeelden", "maths_logica", "maths_parameters", - "maths_parabolen", "pn_regressie", "maths7_grafen", "maths8_statistiek" - ] - }, - { - title: "python_programming", - hruids: [ - "pn_werking", "pn_datatypes", "pn_operatoren", "pn_structuren", - "pn_functies", "art2", "stem_insectbooks", "un_algoenprog" - ] - }, - { - title: "stem", - hruids: [ - "pn_werking", "maths_spreidingsdiagrammen", "pn_digitalebeelden", - "maths_epidemie", "stem_ipadres", "pn_klimaatverandering", - "stem_rechten", "stem_lineaireregressie", "stem_insectbooks" - ] - }, - { - title: "care", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "aiz1_zorg", "aiz2_grafen", - "aiz3_unplugged", "aiz4_eindtermen", "aiz5_triage" - ] - }, - { - title: "chatbot", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "cb5_chatbotunplugged", - "cb1_chatbot", "cb2_sentimentanalyse", "cb3_vervoegmachine", - "cb4_eindtermen", "cb6" - ] - }, - { - title: "physical_computing", - hruids: [ - "pc_starttodwenguino", "pc_rijdenderobot", "pc_theremin", - "pc_leerlijn_introductie", "pc_leerlijn_invoer_verwerking_uitvoer", - "pc_leerlijn_basisprincipes_digitale_elektronica", - "pc_leerlijn_grafisch_naar_tekstueel", "pc_leerlijn_basis_programmeren", - "pc_leerlijn_van_µc_naar_plc", "pc_leerlijn_fiches_dwenguino", - "pc_leerlijn_seriele_monitor", "pc_leerlijn_bus_protocollen", - "pc_leerlijn_wifi", "pc_leerlijn_fiches_arduino", - "pc_leerlijn_project_lijnvolger", "pc_leerlijn_project_bluetooth", - "pc_leerlijn_hddclock", "pc_leerlijn_fysica_valbeweging", - "pc_leerlijn_luchtkwaliteit", "pc_leerlijn_weerstation", - "pc_leerlijn_g0", "pc_leerlijn_g1", "pc_leerlijn_g3", "pc_leerlijn_g4", - "pc_leerlijn_g5" - ] - }, - { - title: "algorithms", - hruids: [ - "art2", "anm1", "anm2", "anm3", "anm4", "anm11", "anm12", "anm13", - "anm14", "anm15", "anm16", "anm17", "maths_epidemie", "stem_insectbooks" - ] - }, - { - title: "basics_ai", - hruids: [ - "un_artificiele_intelligentie", "org-dwengo-waisda-taal-murder-mistery", - "art1", "org-dwengo-waisda-beelden-emoties-herkennen", - "org-dwengo-waisda-beelden-unplugged-fax-lp", - "org-dwengo-waisda-beelden-teachable-machine" - ] - } -]; - /** * Laadt de vertalingen uit een YAML-bestand */ diff --git a/backend/src/data/themes.ts b/backend/src/data/themes.ts new file mode 100644 index 00000000..5a7e3d76 --- /dev/null +++ b/backend/src/data/themes.ts @@ -0,0 +1,120 @@ +export interface Theme { + title: string; + hruids: string[]; +} + +export const themes: Theme[] = [ + { + title: "kiks", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "pn_klimaatverandering", + "kiks1_microscopie", "kiks2_practicum", "pn_digitalebeelden", + "kiks3_dl_basis", "kiks4_dl_gevorderd", "kiks5_classificatie", + "kiks6_regressie", "kiks7_ethiek", "kiks8_eindtermen" + ] + }, + { + title: "art", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "art1", "art2", "art3" + ] + }, + { + title: "socialrobot", + hruids: [ + "sr0_lkr", "sr0_lln", "sr1", "sr2", "sr3", "sr4" + ] + }, + { + title: "agriculture", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "agri_landbouw", "agri_lopendeband" + ] + }, + { + title: "wegostem", + hruids: [ + "wegostem" + ] + }, + { + title: "computational_thinking", + hruids: [ + "ct1_concepten", "ct2_concreet", "ct3_voorbeelden", "ct6_cases", + "ct9_impact", "ct10_bebras", "ct8_eindtermen", "ct7_historiek", + "ct5_kijkwijzer", "ct4_evaluatiekader" + ] + }, + { + title: "math_with_python", + hruids: [ + "pn_werking", "maths_pythagoras", "maths_spreidingsdiagrammen", + "maths_rechten", "maths_lineaireregressie", "maths_epidemie", + "pn_digitalebeelden", "maths_logica", "maths_parameters", + "maths_parabolen", "pn_regressie", "maths7_grafen", "maths8_statistiek" + ] + }, + { + title: "python_programming", + hruids: [ + "pn_werking", "pn_datatypes", "pn_operatoren", "pn_structuren", + "pn_functies", "art2", "stem_insectbooks", "un_algoenprog" + ] + }, + { + title: "stem", + hruids: [ + "pn_werking", "maths_spreidingsdiagrammen", "pn_digitalebeelden", + "maths_epidemie", "stem_ipadres", "pn_klimaatverandering", + "stem_rechten", "stem_lineaireregressie", "stem_insectbooks" + ] + }, + { + title: "care", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "aiz1_zorg", "aiz2_grafen", + "aiz3_unplugged", "aiz4_eindtermen", "aiz5_triage" + ] + }, + { + title: "chatbot", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "cb5_chatbotunplugged", + "cb1_chatbot", "cb2_sentimentanalyse", "cb3_vervoegmachine", + "cb4_eindtermen", "cb6" + ] + }, + { + title: "physical_computing", + hruids: [ + "pc_starttodwenguino", "pc_rijdenderobot", "pc_theremin", + "pc_leerlijn_introductie", "pc_leerlijn_invoer_verwerking_uitvoer", + "pc_leerlijn_basisprincipes_digitale_elektronica", + "pc_leerlijn_grafisch_naar_tekstueel", "pc_leerlijn_basis_programmeren", + "pc_leerlijn_van_µc_naar_plc", "pc_leerlijn_fiches_dwenguino", + "pc_leerlijn_seriele_monitor", "pc_leerlijn_bus_protocollen", + "pc_leerlijn_wifi", "pc_leerlijn_fiches_arduino", + "pc_leerlijn_project_lijnvolger", "pc_leerlijn_project_bluetooth", + "pc_leerlijn_hddclock", "pc_leerlijn_fysica_valbeweging", + "pc_leerlijn_luchtkwaliteit", "pc_leerlijn_weerstation", + "pc_leerlijn_g0", "pc_leerlijn_g1", "pc_leerlijn_g3", "pc_leerlijn_g4", + "pc_leerlijn_g5" + ] + }, + { + title: "algorithms", + hruids: [ + "art2", "anm1", "anm2", "anm3", "anm4", "anm11", "anm12", "anm13", + "anm14", "anm15", "anm16", "anm17", "maths_epidemie", "stem_insectbooks" + ] + }, + { + title: "basics_ai", + hruids: [ + "un_artificiele_intelligentie", "org-dwengo-waisda-taal-murder-mistery", + "art1", "org-dwengo-waisda-beelden-emoties-herkennen", + "org-dwengo-waisda-beelden-unplugged-fax-lp", + "org-dwengo-waisda-beelden-teachable-machine" + ] + } +]; From 7634da475fd9b784ccc2c4e8ad06e09f5c15b986 Mon Sep 17 00:00:00 2001 From: Joyelle Ndagijimana Date: Wed, 26 Feb 2025 19:51:55 +0100 Subject: [PATCH 43/92] feat(frontend): issue in verband met login pagina verbeterd --- frontend/src/router/index.ts | 28 +++++++++---------- frontend/src/views/LoginPage.vue | 8 ------ .../CreateAssignment.vue | 0 .../SingleAssignment.vue | 0 .../StudentAssignments.vue | 0 .../TeacherAssignments.vue | 0 .../views/{class => classes}/CreateClass.vue | 0 .../views/{class => classes}/SingleClass.vue | 0 .../{class => classes}/StudentClasses.vue | 0 .../{class => classes}/TeacherClasses.vue | 0 .../CreateDiscussion.vue | 0 .../SingleDiscussion.vue | 0 .../StudentDiscussions.vue | 0 .../TeacherDiscussions.vue | 0 14 files changed, 14 insertions(+), 22 deletions(-) rename frontend/src/views/{assignment => assignments}/CreateAssignment.vue (100%) rename frontend/src/views/{assignment => assignments}/SingleAssignment.vue (100%) rename frontend/src/views/{assignment => assignments}/StudentAssignments.vue (100%) rename frontend/src/views/{assignment => assignments}/TeacherAssignments.vue (100%) rename frontend/src/views/{class => classes}/CreateClass.vue (100%) rename frontend/src/views/{class => classes}/SingleClass.vue (100%) rename frontend/src/views/{class => classes}/StudentClasses.vue (100%) rename frontend/src/views/{class => classes}/TeacherClasses.vue (100%) rename frontend/src/views/{discussion => discussions}/CreateDiscussion.vue (100%) rename frontend/src/views/{discussion => discussions}/SingleDiscussion.vue (100%) rename frontend/src/views/{discussion => discussions}/StudentDiscussions.vue (100%) rename frontend/src/views/{discussion => discussions}/TeacherDiscussions.vue (100%) diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 9eaaa622..68636767 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -3,20 +3,20 @@ import LoginPage from "@/views/LoginPage.vue"; import HomePage from "@/views/HomePage.vue"; import MenuBar from "@/components/MenuBar.vue"; import StudentHomepage from "@/views/StudentHomepage.vue"; -import StudentAssignments from "@/views/assignment/StudentAssignments.vue"; -import StudentClasses from "@/views/class/StudentClasses.vue"; -import StudentDiscussions from "@/views/discussion/StudentDiscussions.vue"; +import StudentAssignments from "@/views/assignments/StudentAssignments.vue"; +import StudentClasses from "@/views/classes/StudentClasses.vue"; +import StudentDiscussions from "@/views/discussions/StudentDiscussions.vue"; import TeacherHomepage from "@/views/TeacherHomepage.vue"; -import TeacherAssignments from "@/views/assignment/TeacherAssignments.vue"; -import TeacherClasses from "@/views/class/TeacherClasses.vue"; -import TeacherDiscussions from "@/views/discussion/TeacherDiscussions.vue"; -import SingleAssignment from "@/views/assignment/SingleAssignment.vue"; -import SingleClass from "@/views/class/SingleClass.vue"; -import SingleDiscussion from "@/views/discussion/SingleDiscussion.vue"; +import TeacherAssignments from "@/views/assignments/TeacherAssignments.vue"; +import TeacherClasses from "@/views/classes/TeacherClasses.vue"; +import TeacherDiscussions from "@/views/discussions/TeacherDiscussions.vue"; +import SingleAssignment from "@/views/assignments/SingleAssignment.vue"; +import SingleClass from "@/views/classes/SingleClass.vue"; +import SingleDiscussion from "@/views/discussions/SingleDiscussion.vue"; import NotFound from "@/components/errors/NotFound.vue"; -import CreateClass from "@/views/class/CreateClass.vue"; -import CreateAssignment from "@/views/assignment/CreateAssignment.vue"; -import CreateDiscussion from "@/views/discussion/CreateDiscussion.vue"; +import CreateClass from "@/views/classes/CreateClass.vue"; +import CreateAssignment from "@/views/assignments/CreateAssignment.vue"; +import CreateDiscussion from "@/views/discussions/CreateDiscussion.vue"; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -27,12 +27,12 @@ const router = createRouter({ component: HomePage, }, { - path: "/:role/login", + path: "/login", name: "LoginPage", component: LoginPage }, { - path: "/:role/register", + path: "/register", name: "RegisterPage", component: () => {} }, diff --git a/frontend/src/views/LoginPage.vue b/frontend/src/views/LoginPage.vue index 8bee61b1..85a69bfd 100644 --- a/frontend/src/views/LoginPage.vue +++ b/frontend/src/views/LoginPage.vue @@ -1,12 +1,4 @@