diff --git a/.dockerignore b/.dockerignore index 91f5648..6635cf5 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,6 @@ .DS_Store node_modules +/build /.svelte-kit /package .env diff --git a/Dockerfile b/Dockerfile index d845650..43b82b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,36 @@ +# stage build +FROM node:20-alpine + +WORKDIR /app + +# copy everything to the container +COPY . . + +# clean install all dependencies +RUN corepack enable && pnpm i + +# remove potential security issues +RUN pnpm audit fix + +# build SvelteKit appmakeAuthjsRequest +RUN pnpm run build + + +# stage run FROM node:20-alpine WORKDIR /app # copy dependency list -COPY package.json pnpm-lock.yaml run/entrypoint.sh ./ -COPY patches ./patches -COPY prisma ./prisma +COPY --from=0 /app/package*.json /app/pnpm-lock.yaml ./ +COPY --from=0 /app/patches ./patches +COPY --from=0 /app/prisma ./prisma # Setup pnpm, install Prisma CLI (for generating client) and install dependencies RUN corepack enable && pnpm i --prod && pnpm audit fix && npx prisma generate # copy built SvelteKit app to /app -COPY build ./ +COPY --from=0 /app/build ./ EXPOSE 3000 -CMD ["./entrypoint.sh"] +CMD ["node", "./index.js"] diff --git a/package.json b/package.json index 9ad9517..5d3e1eb 100644 --- a/package.json +++ b/package.json @@ -18,56 +18,56 @@ }, "dependencies": { "@auth/core": "^0.30.0", - "@floating-ui/core": "^1.6.1", + "@floating-ui/core": "^1.6.0", "@mdi/js": "^7.4.47", - "@prisma/client": "^5.13.0", + "@prisma/client": "^5.12.1", "carta-md": "4.0.2", "diff": "^5.2.0", - "isomorphic-dompurify": "^2.9.0", - "prisma": "^5.13.0", + "isomorphic-dompurify": "^2.7.0", + "prisma": "^5.12.1", "qs": "^6.12.1", "set-cookie-parser": "^2.6.0", "svelte-floating-ui": "^1.5.8", - "zod": "^3.23.6", + "zod": "^3.22.4", "zod-form-data": "^2.0.2" }, "devDependencies": { "@faker-js/faker": "^8.4.1", "@playwright/test": "^1.43.1", - "@stylistic/eslint-plugin": "^1.8.0", + "@stylistic/eslint-plugin": "^1.7.2", "@sveltejs/adapter-node": "^5.0.1", - "@sveltejs/kit": "^2.5.7", + "@sveltejs/kit": "^2.5.6", "@sveltejs/vite-plugin-svelte": "^3.1.0", - "@tailwindcss/typography": "^0.5.13", + "@tailwindcss/typography": "^0.5.12", "@trpc/client": "^10.45.2", "@trpc/server": "^10.45.2", - "@types/diff": "^5.2.0", - "@types/node": "^20.12.8", + "@types/diff": "^5.0.9", + "@types/node": "^20.12.7", "@types/qs": "^6.9.15", "@types/set-cookie-parser": "^2.4.7", "autoprefixer": "^10.4.19", - "daisyui": "^4.10.5", + "daisyui": "^4.10.2", "dotenv": "^16.4.5", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-no-relative-import-paths": "^1.5.4", - "eslint-plugin-svelte": "^2.38.0", - "eslint-plugin-unused-imports": "^3.2.0", - "globals": "^15.1.0", + "eslint-plugin-svelte": "^2.37.0", + "eslint-plugin-unused-imports": "^3.1.0", + "globals": "^15.0.0", "postcss-import": "^16.1.0", - "postcss-nesting": "^12.1.2", + "postcss-nesting": "^12.1.1", "svelte": "^4.2.15", - "svelte-check": "^3.7.1", - "sveltekit-superforms": "^2.13.0", + "svelte-check": "^3.6.9", + "sveltekit-superforms": "^2.12.5", "tailwindcss": "^3.4.3", "trpc-sveltekit": "^3.6.1", "tslib": "^2.6.2", - "tsx": "^4.9.1", + "tsx": "^4.7.2", "typescript": "^5.4.5", - "typescript-eslint": "^7.8.0", - "vite": "^5.2.11", - "vitest": "^1.6.0" + "typescript-eslint": "^7.7.0", + "vite": "^5.2.9", + "vitest": "^1.5.0" }, "type": "module", "pnpm": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1c54b7..0a247f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,14 +14,14 @@ dependencies: specifier: ^0.30.0 version: 0.30.0 '@floating-ui/core': - specifier: ^1.6.1 - version: 1.6.1 + specifier: ^1.6.0 + version: 1.6.0 '@mdi/js': specifier: ^7.4.47 version: 7.4.47 '@prisma/client': - specifier: ^5.13.0 - version: 5.13.0(prisma@5.13.0) + specifier: ^5.12.1 + version: 5.12.1(prisma@5.12.1) carta-md: specifier: 4.0.2 version: 4.0.2(patch_hash=i33ea43vfgrg3ziu25cfu7s2zq)(svelte@4.2.15) @@ -29,11 +29,8 @@ dependencies: specifier: ^5.2.0 version: 5.2.0 isomorphic-dompurify: - specifier: ^2.9.0 - version: 2.9.0 - prisma: - specifier: ^5.13.0 - version: 5.13.0 + specifier: ^2.7.0 + version: 2.7.0 qs: specifier: ^6.12.1 version: 6.12.1 @@ -44,11 +41,11 @@ dependencies: specifier: ^1.5.8 version: 1.5.8 zod: - specifier: ^3.23.6 - version: 3.23.6 + specifier: ^3.22.4 + version: 3.22.4 zod-form-data: specifier: ^2.0.2 - version: 2.0.2(zod@3.23.6) + version: 2.0.2(zod@3.22.4) devDependencies: '@faker-js/faker': @@ -58,20 +55,20 @@ devDependencies: specifier: ^1.43.1 version: 1.43.1 '@stylistic/eslint-plugin': - specifier: ^1.8.0 - version: 1.8.0(eslint@8.57.0)(typescript@5.4.5) + specifier: ^1.7.2 + version: 1.7.2(eslint@8.57.0)(typescript@5.4.5) '@sveltejs/adapter-node': specifier: ^5.0.1 - version: 5.0.1(@sveltejs/kit@2.5.7) + version: 5.0.1(@sveltejs/kit@2.5.6) '@sveltejs/kit': - specifier: ^2.5.7 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.11) + specifier: ^2.5.6 + version: 2.5.6(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.9) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.15)(vite@5.2.11) + version: 3.1.0(svelte@4.2.15)(vite@5.2.9) '@tailwindcss/typography': - specifier: ^0.5.13 - version: 0.5.13(tailwindcss@3.4.3) + specifier: ^0.5.12 + version: 0.5.12(tailwindcss@3.4.3) '@trpc/client': specifier: ^10.45.2 version: 10.45.2(@trpc/server@10.45.2) @@ -79,11 +76,11 @@ devDependencies: specifier: ^10.45.2 version: 10.45.2 '@types/diff': - specifier: ^5.2.0 - version: 5.2.0 + specifier: ^5.0.9 + version: 5.0.9 '@types/node': - specifier: ^20.12.8 - version: 20.12.8 + specifier: ^20.12.7 + version: 20.12.7 '@types/qs': specifier: ^6.9.15 version: 6.9.15 @@ -94,8 +91,8 @@ devDependencies: specifier: ^10.4.19 version: 10.4.19(postcss@8.4.38) daisyui: - specifier: ^4.10.5 - version: 4.10.5(postcss@8.4.38) + specifier: ^4.10.2 + version: 4.10.2(postcss@8.4.38) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -107,61 +104,69 @@ devDependencies: version: 9.1.0(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.8.0)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.7.0)(eslint@8.57.0) eslint-plugin-no-relative-import-paths: specifier: ^1.5.4 version: 1.5.4 eslint-plugin-svelte: - specifier: ^2.38.0 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.15) + specifier: ^2.37.0 + version: 2.37.0(eslint@8.57.0)(svelte@4.2.15) eslint-plugin-unused-imports: - specifier: ^3.2.0 - version: 3.2.0(eslint@8.57.0) + specifier: ^3.1.0 + version: 3.1.0(eslint@8.57.0) globals: - specifier: ^15.1.0 - version: 15.1.0 + specifier: ^15.0.0 + version: 15.0.0 postcss-import: specifier: ^16.1.0 version: 16.1.0(postcss@8.4.38) postcss-nesting: - specifier: ^12.1.2 - version: 12.1.2(postcss@8.4.38) + specifier: ^12.1.1 + version: 12.1.1(postcss@8.4.38) + prisma: + specifier: ^5.12.1 + version: 5.12.1 svelte: specifier: ^4.2.15 version: 4.2.15 svelte-check: - specifier: ^3.7.1 - version: 3.7.1(postcss@8.4.38)(svelte@4.2.15) + specifier: ^3.6.9 + version: 3.6.9(postcss@8.4.38)(svelte@4.2.15) sveltekit-superforms: - specifier: ^2.13.0 - version: 2.13.0(@sveltejs/kit@2.5.7)(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(svelte@4.2.15) + specifier: ^2.12.5 + version: 2.12.5(@sveltejs/kit@2.5.6)(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(svelte@4.2.15) tailwindcss: specifier: ^3.4.3 version: 3.4.3 trpc-sveltekit: specifier: ^3.6.1 - version: 3.6.1(@sveltejs/adapter-node@5.0.1)(@trpc/client@10.45.2)(@trpc/server@10.45.2)(ws@8.17.0) + version: 3.6.1(@sveltejs/adapter-node@5.0.1)(@trpc/client@10.45.2)(@trpc/server@10.45.2)(ws@8.16.0) tslib: specifier: ^2.6.2 version: 2.6.2 tsx: - specifier: ^4.9.1 - version: 4.9.1 + specifier: ^4.7.2 + version: 4.7.2 typescript: specifier: ^5.4.5 version: 5.4.5 typescript-eslint: - specifier: ^7.8.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + specifier: ^7.7.0 + version: 7.7.0(eslint@8.57.0)(typescript@5.4.5) vite: - specifier: ^5.2.11 - version: 5.2.11(@types/node@20.12.8) + specifier: ^5.2.9 + version: 5.2.9(@types/node@20.12.7) vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.12.8) + specifier: ^1.5.0 + version: 1.5.0(@types/node@20.12.7) packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -197,15 +202,6 @@ packages: preact-render-to-string: 5.2.3(preact@10.11.3) dev: false - /@babel/runtime@7.24.5: - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} - engines: {node: '>=6.9.0'} - requiresBuild: true - dependencies: - regenerator-runtime: 0.14.1 - dev: true - optional: true - /@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.16): resolution: {integrity: sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==} engines: {node: ^14 || ^16 || >=18} @@ -224,6 +220,15 @@ packages: postcss-selector-parser: 6.0.16 dev: true + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + /@esbuild/aix-ppc64@0.20.2: resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} @@ -233,6 +238,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.20.2: resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} @@ -242,6 +256,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.20.2: resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} @@ -251,6 +274,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.20.2: resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} @@ -260,6 +292,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.20.2: resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} @@ -269,6 +310,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.20.2: resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} @@ -278,6 +328,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.20.2: resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} @@ -287,6 +346,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.20.2: resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} @@ -296,6 +364,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.20.2: resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} @@ -305,6 +382,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.20.2: resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} @@ -314,6 +400,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.20.2: resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} @@ -323,6 +418,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.20.2: resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} @@ -332,6 +436,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.20.2: resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} @@ -341,6 +454,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.20.2: resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} @@ -350,6 +472,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.20.2: resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} @@ -359,6 +490,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.20.2: resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} @@ -368,6 +508,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.20.2: resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} @@ -377,6 +526,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.20.2: resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} @@ -386,6 +544,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.20.2: resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} @@ -395,6 +562,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.20.2: resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} @@ -404,6 +580,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.20.2: resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} @@ -413,6 +598,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.20.2: resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} @@ -422,6 +616,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.20.2: resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} @@ -468,32 +671,26 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@exodus/schemasafe@1.3.0: - resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} - requiresBuild: true - dev: true - optional: true - /@faker-js/faker@8.4.1: resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} dev: true - /@floating-ui/core@1.6.1: - resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} dependencies: - '@floating-ui/utils': 0.2.2 + '@floating-ui/utils': 0.2.1 dev: false - /@floating-ui/dom@1.6.5: - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + /@floating-ui/dom@1.6.3: + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} dependencies: - '@floating-ui/core': 1.6.1 - '@floating-ui/utils': 0.2.2 + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 dev: false - /@floating-ui/utils@0.2.2: - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} dev: false /@gcornut/valibot-json-schema@0.0.27(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(valibot@0.30.0): @@ -646,8 +843,8 @@ packages: dev: true optional: true - /@prisma/client@5.13.0(prisma@5.13.0): - resolution: {integrity: sha512-uYdfpPncbZ/syJyiYBwGZS8Gt1PTNoErNYMuqHDa2r30rNSFtgTA/LXsSk55R7pdRTMi5pHkeP9B14K6nHmwkg==} + /@prisma/client@5.12.1(prisma@5.12.1): + resolution: {integrity: sha512-6/JnizEdlSBxDIdiLbrBdMW5NqDxOmhXAJaNXiPpgzAPr/nLZResT6MMpbOHLo5yAbQ1Vv5UU8PTPRzb0WIxdA==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -656,42 +853,37 @@ packages: prisma: optional: true dependencies: - prisma: 5.13.0 + prisma: 5.12.1 dev: false - /@prisma/debug@5.13.0: - resolution: {integrity: sha512-699iqlEvzyCj9ETrXhs8o8wQc/eVW+FigSsHpiskSFydhjVuwTJEfj/nIYqTaWFYuxiWQRfm3r01meuW97SZaQ==} - dev: false + /@prisma/debug@5.12.1: + resolution: {integrity: sha512-kd/wNsR0klrv79o1ITsbWxYyh4QWuBidvxsXSParPsYSu0ircUmNk3q4ojsgNc3/81b0ozg76iastOG43tbf8A==} - /@prisma/engines-version@5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b: - resolution: {integrity: sha512-AyUuhahTINGn8auyqYdmxsN+qn0mw3eg+uhkp8zwknXYIqoT3bChG4RqNY/nfDkPvzWAPBa9mrDyBeOnWSgO6A==} - dev: false + /@prisma/engines-version@5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab: + resolution: {integrity: sha512-6yvO8s80Tym61aB4QNtYZfWVmE3pwqe807jEtzm8C5VDe7nw8O1FGX3TXUaXmWV0fQTIAfRbeL2Gwrndabp/0g==} - /@prisma/engines@5.13.0: - resolution: {integrity: sha512-hIFLm4H1boj6CBZx55P4xKby9jgDTeDG0Jj3iXtwaaHmlD5JmiDkZhh8+DYWkTGchu+rRF36AVROLnk0oaqhHw==} + /@prisma/engines@5.12.1: + resolution: {integrity: sha512-HQDdglLw2bZR/TXD2Y+YfDMvi5Q8H+acbswqOsWyq9pPjBLYJ6gzM+ptlTU/AV6tl0XSZLU1/7F4qaWa8bqpJA==} requiresBuild: true dependencies: - '@prisma/debug': 5.13.0 - '@prisma/engines-version': 5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b - '@prisma/fetch-engine': 5.13.0 - '@prisma/get-platform': 5.13.0 - dev: false + '@prisma/debug': 5.12.1 + '@prisma/engines-version': 5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab + '@prisma/fetch-engine': 5.12.1 + '@prisma/get-platform': 5.12.1 - /@prisma/fetch-engine@5.13.0: - resolution: {integrity: sha512-Yh4W+t6YKyqgcSEB3odBXt7QyVSm0OQlBSldQF2SNXtmOgMX8D7PF/fvH6E6qBCpjB/yeJLy/FfwfFijoHI6sA==} + /@prisma/fetch-engine@5.12.1: + resolution: {integrity: sha512-qSs3KcX1HKcea1A+hlJVK/ljj0PNIUHDxAayGMvgJBqmaN32P9tCidlKz1EGv6WoRFICYnk3Dd/YFLBwnFIozA==} dependencies: - '@prisma/debug': 5.13.0 - '@prisma/engines-version': 5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b - '@prisma/get-platform': 5.13.0 - dev: false + '@prisma/debug': 5.12.1 + '@prisma/engines-version': 5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab + '@prisma/get-platform': 5.12.1 - /@prisma/get-platform@5.13.0: - resolution: {integrity: sha512-B/WrQwYTzwr7qCLifQzYOmQhZcFmIFhR81xC45gweInSUn2hTEbfKUPd2keAog+y5WI5xLAFNJ3wkXplvSVkSw==} + /@prisma/get-platform@5.12.1: + resolution: {integrity: sha512-pgIR+pSvhYHiUcqXVEZS31NrFOTENC9yFUdEAcx7cdQBoZPmHVjtjN4Ss6NzVDMYPrKJJ51U14EhEoeuBlMioQ==} dependencies: - '@prisma/debug': 5.13.0 - dev: false + '@prisma/debug': 5.12.1 - /@rollup/plugin-commonjs@25.0.7(rollup@4.17.2): + /@rollup/plugin-commonjs@25.0.7(rollup@4.14.3): resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -700,16 +892,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.17.2) + '@rollup/pluginutils': 5.1.0(rollup@4.14.3) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.10 - rollup: 4.17.2 + rollup: 4.14.3 dev: true - /@rollup/plugin-json@6.1.0(rollup@4.17.2): + /@rollup/plugin-json@6.1.0(rollup@4.14.3): resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -718,11 +910,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.17.2) - rollup: 4.17.2 + '@rollup/pluginutils': 5.1.0(rollup@4.14.3) + rollup: 4.14.3 dev: true - /@rollup/plugin-node-resolve@15.2.3(rollup@4.17.2): + /@rollup/plugin-node-resolve@15.2.3(rollup@4.14.3): resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -731,16 +923,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.17.2) + '@rollup/pluginutils': 5.1.0(rollup@4.14.3) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 - rollup: 4.17.2 + rollup: 4.14.3 dev: true - /@rollup/pluginutils@5.1.0(rollup@4.17.2): + /@rollup/pluginutils@5.1.0(rollup@4.14.3): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -752,131 +944,131 @@ packages: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.17.2 + rollup: 4.14.3 dev: true - /@rollup/rollup-android-arm-eabi@4.17.2: - resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + /@rollup/rollup-android-arm-eabi@4.14.3: + resolution: {integrity: sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.17.2: - resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + /@rollup/rollup-android-arm64@4.14.3: + resolution: {integrity: sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.17.2: - resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + /@rollup/rollup-darwin-arm64@4.14.3: + resolution: {integrity: sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.17.2: - resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + /@rollup/rollup-darwin-x64@4.14.3: + resolution: {integrity: sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.17.2: - resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} + /@rollup/rollup-linux-arm-gnueabihf@4.14.3: + resolution: {integrity: sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-musleabihf@4.17.2: - resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + /@rollup/rollup-linux-arm-musleabihf@4.14.3: + resolution: {integrity: sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.17.2: - resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + /@rollup/rollup-linux-arm64-gnu@4.14.3: + resolution: {integrity: sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.17.2: - resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + /@rollup/rollup-linux-arm64-musl@4.14.3: + resolution: {integrity: sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: - resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + /@rollup/rollup-linux-powerpc64le-gnu@4.14.3: + resolution: {integrity: sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==} cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.17.2: - resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} + /@rollup/rollup-linux-riscv64-gnu@4.14.3: + resolution: {integrity: sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.17.2: - resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + /@rollup/rollup-linux-s390x-gnu@4.14.3: + resolution: {integrity: sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==} cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.17.2: - resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + /@rollup/rollup-linux-x64-gnu@4.14.3: + resolution: {integrity: sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.17.2: - resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + /@rollup/rollup-linux-x64-musl@4.14.3: + resolution: {integrity: sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.17.2: - resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + /@rollup/rollup-win32-arm64-msvc@4.14.3: + resolution: {integrity: sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.17.2: - resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + /@rollup/rollup-win32-ia32-msvc@4.14.3: + resolution: {integrity: sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.17.2: - resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + /@rollup/rollup-win32-x64-msvc@4.14.3: + resolution: {integrity: sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==} cpu: [x64] os: [win32] requiresBuild: true @@ -911,8 +1103,8 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@sinclair/typebox@0.32.29: - resolution: {integrity: sha512-GWKskKPGQV0vVYizqCu0E1YLwGthvlkDqpRxB3iBuqxJ8dN/9n1cnDRSQHF59GMoxDJwzSgmxpU617SidtUnMw==} + /@sinclair/typebox@0.32.20: + resolution: {integrity: sha512-ziK497ILSIYMxD/thl496idIb03IZPlha04itLQu1xAFQbumWZ+Dj4PMMCkDRpAYhvVSdmRlTjGu2B2MA5RplQ==} requiresBuild: true dev: true optional: true @@ -923,8 +1115,8 @@ packages: dev: true optional: true - /@stylistic/eslint-plugin-js@1.8.0(eslint@8.57.0): - resolution: {integrity: sha512-jdvnzt+pZPg8TfclZlTZPiUbbima93ylvQ+wNgHLNmup3obY6heQvgewSu9i2CfS61BnRByv+F9fxQLPoNeHag==} + /@stylistic/eslint-plugin-js@1.7.2(eslint@8.57.0): + resolution: {integrity: sha512-ZYX7C5p7zlHbACwFLU+lISVh6tdcRP/++PWegh2Sy0UgMT5kU0XkPa2tKWEtJYzZmPhJxu9LxbnWcnE/tTwSDQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' @@ -937,21 +1129,21 @@ packages: espree: 9.6.1 dev: true - /@stylistic/eslint-plugin-jsx@1.8.0(eslint@8.57.0): - resolution: {integrity: sha512-PC7tYXipF03TTilGJva1amAham7qOAFXT5r5jLTY6iIxkFqyb6H7Ljx5pv8d7n98VyIVidOEKY/AP8vNzAFNKg==} + /@stylistic/eslint-plugin-jsx@1.7.2(eslint@8.57.0): + resolution: {integrity: sha512-lNZR5PR0HLJPs+kY0y8fy6KroKlYqA5PwsYWpVYWzqZWiL5jgAeUo4s9yLFYjJjzildJ5MsTVMy/xP81Qz6GXg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.8.0(eslint@8.57.0) + '@stylistic/eslint-plugin-js': 1.7.2(eslint@8.57.0) '@types/eslint': 8.56.10 eslint: 8.57.0 estraverse: 5.3.0 picomatch: 4.0.2 dev: true - /@stylistic/eslint-plugin-plus@1.8.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-TkrjzzYmTuAaLvFwtxomsgMUD8g8PREOQOQzTfKmiJ6oc4XOyFW4q/L9ES1J3UFSLybNCwbhu36lhXJut1w2Sg==} + /@stylistic/eslint-plugin-plus@1.7.2(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-luUfRVbBVtt0+/FNt8/76BANJEzb/nHWasHD7UUjyMrch2U9xUKpObrkTCzqBuisKek+uFupwGjqXqDP07+fQw==} peerDependencies: eslint: '*' dependencies: @@ -963,13 +1155,13 @@ packages: - typescript dev: true - /@stylistic/eslint-plugin-ts@1.8.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-WuCIhz4JEHxzhAWjrBASMGj6Or1wAjDqTsRIck3DRRrw/FJ8C/8AAuHPk8ECHNSDI5PZ0OT72nF2uSUn0aQq1w==} + /@stylistic/eslint-plugin-ts@1.7.2(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-szX89YPocwCe4T0eT3alj7MwEzDHt5+B+kb/vQfSSLIjI9CGgoWrgj50zU8PtaDctTh4ZieFBzU/lRmkSUo0RQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.8.0(eslint@8.57.0) + '@stylistic/eslint-plugin-js': 1.7.2(eslint@8.57.0) '@types/eslint': 8.56.10 '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 @@ -978,16 +1170,16 @@ packages: - typescript dev: true - /@stylistic/eslint-plugin@1.8.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-JRR0lCDU97AiE0X6qTc/uf8Hv0yETUdyJgoNzTLUIWdhVJVe/KGPnFmEsO1iXfNUIS6vhv3JJ5vaZ2qtXhZe1g==} + /@stylistic/eslint-plugin@1.7.2(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-TesaPR4AOCeD4unwu9gZCdTe8SsUpykriICuwXV8GFBgESuVbfVp+S8g6xTWe9ntVR803bNMtnr2UhxHW0iFqg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.8.0(eslint@8.57.0) - '@stylistic/eslint-plugin-jsx': 1.8.0(eslint@8.57.0) - '@stylistic/eslint-plugin-plus': 1.8.0(eslint@8.57.0)(typescript@5.4.5) - '@stylistic/eslint-plugin-ts': 1.8.0(eslint@8.57.0)(typescript@5.4.5) + '@stylistic/eslint-plugin-js': 1.7.2(eslint@8.57.0) + '@stylistic/eslint-plugin-jsx': 1.7.2(eslint@8.57.0) + '@stylistic/eslint-plugin-plus': 1.7.2(eslint@8.57.0)(typescript@5.4.5) + '@stylistic/eslint-plugin-ts': 1.7.2(eslint@8.57.0)(typescript@5.4.5) '@types/eslint': 8.56.10 eslint: 8.57.0 transitivePeerDependencies: @@ -995,20 +1187,20 @@ packages: - typescript dev: true - /@sveltejs/adapter-node@5.0.1(@sveltejs/kit@2.5.7): + /@sveltejs/adapter-node@5.0.1(@sveltejs/kit@2.5.6): resolution: {integrity: sha512-eYdmxdUWMW+dad1JfMsWBPY2vjXz9eE+52A2AQnXPScPJlIxIVk5mmbaEEzrZivLfO2wEcLTZ5vdC03W69x+iA==} peerDependencies: '@sveltejs/kit': ^2.4.0 dependencies: - '@rollup/plugin-commonjs': 25.0.7(rollup@4.17.2) - '@rollup/plugin-json': 6.1.0(rollup@4.17.2) - '@rollup/plugin-node-resolve': 15.2.3(rollup@4.17.2) - '@sveltejs/kit': 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.11) - rollup: 4.17.2 + '@rollup/plugin-commonjs': 25.0.7(rollup@4.14.3) + '@rollup/plugin-json': 6.1.0(rollup@4.14.3) + '@rollup/plugin-node-resolve': 15.2.3(rollup@4.14.3) + '@sveltejs/kit': 2.5.6(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.9) + rollup: 4.14.3 dev: true - /@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.11): - resolution: {integrity: sha512-6uedTzrb7nQrw6HALxnPrPaXdIN2jJJTzTIl96Z3P5NiG+OAfpdPbrWrvkJ3GN4CfWqrmU4dJqwMMRMTD/C7ow==} + /@sveltejs/kit@2.5.6(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.9): + resolution: {integrity: sha512-AYb02Jm5MfNqJHc8zrj7ScQAFAKmTUCkpkfoi8EVaZZDdnjkvI7L2GtnTDhpiXSAZRVitZX4qm59sMS1FgL+lQ==} engines: {node: '>=18.13'} hasBin: true requiresBuild: true @@ -1017,12 +1209,12 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.15)(vite@5.2.11) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.15)(vite@5.2.9) '@types/cookie': 0.6.0 cookie: 0.6.0 - devalue: 5.0.0 + devalue: 4.3.2 esm-env: 1.0.0 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.0.0 kleur: 4.1.5 magic-string: 0.30.10 mrmime: 2.0.0 @@ -1031,10 +1223,10 @@ packages: sirv: 2.0.4 svelte: 4.2.15 tiny-glob: 0.2.9 - vite: 5.2.11(@types/node@20.12.8) + vite: 5.2.9(@types/node@20.12.7) dev: true - /@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.11): + /@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.9): resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} engines: {node: ^18.0.0 || >=20} peerDependencies: @@ -1042,36 +1234,36 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.15)(vite@5.2.11) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.15)(vite@5.2.9) debug: 4.3.4 svelte: 4.2.15 - vite: 5.2.11(@types/node@20.12.8) + vite: 5.2.9(@types/node@20.12.7) transitivePeerDependencies: - supports-color dev: true - /@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.2.11): + /@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.2.9): resolution: {integrity: sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.11) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.9) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.10 svelte: 4.2.15 svelte-hmr: 0.16.0(svelte@4.2.15) - vite: 5.2.11(@types/node@20.12.8) - vitefu: 0.2.5(vite@5.2.11) + vite: 5.2.9(@types/node@20.12.7) + vitefu: 0.2.5(vite@5.2.9) transitivePeerDependencies: - supports-color dev: true - /@tailwindcss/typography@0.5.13(tailwindcss@3.4.3): - resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==} + /@tailwindcss/typography@0.5.12(tailwindcss@3.4.3): + resolution: {integrity: sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' dependencies: @@ -1103,8 +1295,8 @@ packages: '@types/ms': 0.7.34 dev: false - /@types/diff@5.2.0: - resolution: {integrity: sha512-pjJH+02ukgJRW0mViDUA1cdC+wzSgRu0e4cPuogPLAw0i66y62iMP0ZlXoJAmoXrKRZnF3pMDwyKZsgNVlMX4A==} + /@types/diff@5.0.9: + resolution: {integrity: sha512-RWVEhh/zGXpAVF/ZChwNnv7r4rvqzJ7lYNSmZSVTxjV0PBLf6Qu7RNg+SUtkpzxmiNkjCx0Xn2tPp7FIkshJwQ==} dev: true /@types/dompurify@3.0.5: @@ -1147,8 +1339,8 @@ packages: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: false - /@types/node@20.12.8: - resolution: {integrity: sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==} + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} dependencies: undici-types: 5.26.5 dev: true @@ -1172,7 +1364,7 @@ packages: /@types/set-cookie-parser@2.4.7: resolution: {integrity: sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==} dependencies: - '@types/node': 20.12.8 + '@types/node': 20.12.7 dev: true /@types/trusted-types@2.0.7: @@ -1189,8 +1381,8 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} + /@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1201,11 +1393,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/type-utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/type-utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 @@ -1218,8 +1410,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} + /@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1228,10 +1420,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 eslint: 8.57.0 typescript: 5.4.5 @@ -1247,16 +1439,16 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/scope-manager@7.8.0: - resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} + /@typescript-eslint/scope-manager@7.7.0: + resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 dev: true - /@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} + /@typescript-eslint/type-utils@7.7.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1265,8 +1457,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) @@ -1280,8 +1472,8 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@7.8.0: - resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} + /@typescript-eslint/types@7.7.0: + resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} engines: {node: ^18.18.0 || >=20.0.0} dev: true @@ -1307,8 +1499,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5): - resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} + /@typescript-eslint/typescript-estree@7.7.0(typescript@5.4.5): + resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1316,8 +1508,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1348,8 +1540,8 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} + /@typescript-eslint/utils@7.7.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1357,9 +1549,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -1375,11 +1567,11 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.8.0: - resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} + /@typescript-eslint/visitor-keys@7.7.0: + resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/types': 7.7.0 eslint-visitor-keys: 3.4.3 dev: true @@ -1402,45 +1594,45 @@ packages: '@types/validator': 13.11.9 '@vinejs/compiler': 2.5.0 camelcase: 8.0.0 - dayjs: 1.11.11 + dayjs: 1.11.10 dlv: 1.1.3 normalize-url: 8.0.1 validator: 13.11.0 dev: true optional: true - /@vitest/expect@1.6.0: - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + /@vitest/expect@1.5.0: + resolution: {integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==} dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 chai: 4.4.1 dev: true - /@vitest/runner@1.6.0: - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + /@vitest/runner@1.5.0: + resolution: {integrity: sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==} dependencies: - '@vitest/utils': 1.6.0 + '@vitest/utils': 1.5.0 p-limit: 5.0.0 pathe: 1.1.2 dev: true - /@vitest/snapshot@1.6.0: - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + /@vitest/snapshot@1.5.0: + resolution: {integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==} dependencies: magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.6.0: - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + /@vitest/spy@1.5.0: + resolution: {integrity: sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==} dependencies: tinyspy: 2.2.1 dev: true - /@vitest/utils@1.6.0: - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + /@vitest/utils@1.5.0: + resolution: {integrity: sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -1629,7 +1821,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001616 + caniuse-lite: 1.0.30001611 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -1687,10 +1879,10 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001616 - electron-to-chromium: 1.4.756 + caniuse-lite: 1.0.30001611 + electron-to-chromium: 1.4.742 node-releases: 2.0.14 - update-browserslist-db: 1.0.15(browserslist@4.23.0) + update-browserslist-db: 1.0.13(browserslist@4.23.0) dev: true /buffer-crc32@0.2.13: @@ -1739,8 +1931,8 @@ packages: dev: true optional: true - /caniuse-lite@1.0.30001616: - resolution: {integrity: sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==} + /caniuse-lite@1.0.30001611: + resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} dev: true /carta-md@4.0.2(patch_hash=i33ea43vfgrg3ziu25cfu7s2zq)(svelte@4.2.15): @@ -1911,8 +2103,8 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /daisyui@4.10.5(postcss@8.4.38): - resolution: {integrity: sha512-eOFUo5yEg0WV+3VK2C/+/XN1WH/OhFV4HzrMG5etAzcnB2hPg3aoR7gF1ZUpIv+b5MglLuAVMgub0rv660EgZg==} + /daisyui@4.10.2(postcss@8.4.38): + resolution: {integrity: sha512-eCWS1W/JPyxW9IvlgW5m0R6rp9ZhRsBTW37rvEUthckkjsV04u8XipV519OoccSA46ixhSJa3q7XLI1WUFtRCA==} engines: {node: '>=16.9.0'} dependencies: css-selector-tokenizer: 0.8.0 @@ -1958,8 +2150,8 @@ packages: is-data-view: 1.0.1 dev: true - /dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} requiresBuild: true dev: true optional: true @@ -2043,12 +2235,8 @@ packages: engines: {node: '>=8'} dev: true - /devalue@4.3.3: - resolution: {integrity: sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==} - dev: true - - /devalue@5.0.0: - resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} + /devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} dev: true /devlop@1.1.0: @@ -2096,8 +2284,8 @@ packages: esutils: 2.0.3 dev: true - /dompurify@3.1.2: - resolution: {integrity: sha512-hLGGBI1tw5N8qTELr3blKjAML/LY4ANxksbS612UiJyDfyf/2D092Pvm+S7pmeTGJRqvlJkFzBoHBQKgQlOQVg==} + /dompurify@3.1.0: + resolution: {integrity: sha512-yoU4rhgPKCo+p5UrWWWNKiIq+ToGqmVVhk0PmMYBK4kRsR3/qhemNFL8f6CFmBd4gMwm3F4T7HBoydP5uY07fA==} dev: false /dotenv@16.4.5: @@ -2109,8 +2297,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.756: - resolution: {integrity: sha512-RJKZ9+vEBMeiPAvKNWyZjuYyUqMndcP1f335oHqn3BEQbs2NFtVrnK5+6Xg5wSM9TknNNpWghGDUCKGYF+xWXw==} + /electron-to-chromium@1.4.742: + resolution: {integrity: sha512-EhE+z1d5RNytAq/qnGAxPR+ie3UzKbv7qqQc0wnEbOh+KDUplgfzkGSCy9d78B+S+nVNTS42BabHXB6Ni+Ud4w==} dev: true /emoji-regex@8.0.0: @@ -2145,7 +2333,7 @@ packages: function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 - globalthis: 1.0.4 + globalthis: 1.0.3 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 @@ -2235,6 +2423,37 @@ packages: dev: true optional: true + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + /esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} @@ -2310,7 +2529,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -2331,7 +2550,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -2339,7 +2558,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0)(eslint@8.57.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -2349,7 +2568,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -2358,7 +2577,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -2378,12 +2597,12 @@ packages: resolution: {integrity: sha512-2smViH7R3682NR6dwgYr8Vm7emqNP1gEjBku6DbvUy3Ef/2Fz+mhwsFjZGSixzWzazMCj4MAgIWTsHELCCDJKA==} dev: true - /eslint-plugin-svelte@2.38.0(eslint@8.57.0)(svelte@4.2.15): - resolution: {integrity: sha512-IwwxhHzitx3dr0/xo0z4jjDlb2AAHBPKt+juMyKKGTLlKi1rZfA4qixMwnveU20/JTHyipM6keX4Vr7LZFYc9g==} + /eslint-plugin-svelte@2.37.0(eslint@8.57.0)(svelte@4.2.15): + resolution: {integrity: sha512-H/2Gz7agYHEMEEzRuLYuCmAIdjuBnbhFG9hOK0yCdSBvvJGJMkjo+lR6j67OIvLOavgp4L7zA5LnDKi8WqdPhQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.112 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.95 peerDependenciesMeta: svelte: optional: true @@ -2401,14 +2620,14 @@ packages: postcss-selector-parser: 6.0.16 semver: 7.6.0 svelte: 4.2.15 - svelte-eslint-parser: 0.35.0(svelte@4.2.15) + svelte-eslint-parser: 0.34.1(svelte@4.2.15) transitivePeerDependencies: - supports-color - ts-node dev: true - /eslint-plugin-unused-imports@3.2.0(eslint@8.57.0): - resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==} + /eslint-plugin-unused-imports@3.1.0(eslint@8.57.0): + resolution: {integrity: sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': 6 - 7 @@ -2479,7 +2698,7 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.4 + optionator: 0.9.3 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -2739,7 +2958,7 @@ packages: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.4 - minipass: 7.1.0 + minipass: 7.0.4 path-scurry: 1.10.2 dev: true @@ -2772,17 +2991,16 @@ packages: type-fest: 0.20.2 dev: true - /globals@15.1.0: - resolution: {integrity: sha512-926gJqg+4mkxwYKiFvoomM4J0kWESfk3qfTvRL2/oc/tK/eTDBbrfcKnSa2KtfdxB5onoL7D3A3qIHQFpd4+UA==} + /globals@15.0.0: + resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} engines: {node: '>=18'} dev: true - /globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 - gopd: 1.0.1 dev: true /globalyzer@0.1.0: @@ -2991,8 +3209,8 @@ packages: resolve-from: 4.0.0 dev: true - /import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + /import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} dev: true /imurmurhash@0.1.4: @@ -3199,12 +3417,12 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /isomorphic-dompurify@2.9.0: - resolution: {integrity: sha512-iVtiFB+4hoU/1mIiOYOxFUE3hAiOSoKtTNQndLQul1aWKV9miVx127duUTk0+q/sqexjg87iFjcQYQPNvmEHgw==} + /isomorphic-dompurify@2.7.0: + resolution: {integrity: sha512-0FTlXP/gEEWW+O/sXaO9yZ4bgegrHnOqzbdCNAMeO2KYIOVMAcqVIo+uTcWYd1+DmI+nV58vUmNW03nauoKn2w==} engines: {node: '>=18'} dependencies: '@types/dompurify': 3.0.5 - dompurify: 3.1.2 + dompurify: 3.1.0 jsdom: 24.0.0 transitivePeerDependencies: - bufferutil @@ -3227,8 +3445,8 @@ packages: hasBin: true dev: true - /joi@17.13.1: - resolution: {integrity: sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==} + /joi@17.12.3: + resolution: {integrity: sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==} requiresBuild: true dependencies: '@hapi/hoek': 9.3.0 @@ -3271,18 +3489,18 @@ packages: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.9 + nwsapi: 2.2.7 parse5: 7.1.2 rrweb-cssom: 0.6.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.4 + tough-cookie: 4.1.3 w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - ws: 8.17.0 + ws: 8.16.0 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -3294,16 +3512,6 @@ packages: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true - /json-schema-to-ts@3.1.0: - resolution: {integrity: sha512-UeVN/ery4/JeXI8h4rM8yZPxsH+KqPi/84qFxHfTGHZnWnK9D0UU9ZGYO+6XAaJLqCWMiks+ARuFOKAiSxJCHA==} - engines: {node: '>=16'} - requiresBuild: true - dependencies: - '@babel/runtime': 7.24.5 - ts-algebra: 2.0.0 - dev: true - optional: true - /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -3364,7 +3572,7 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} dependencies: - mlly: 1.7.0 + mlly: 1.6.1 pkg-types: 1.1.0 dev: true @@ -3400,8 +3608,8 @@ packages: get-func-name: 2.0.2 dev: true - /lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} dev: true @@ -3882,8 +4090,8 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass@7.1.0: - resolution: {integrity: sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} dev: true @@ -3894,8 +4102,8 @@ packages: minimist: 1.2.8 dev: true - /mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + /mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} dependencies: acorn: 8.11.3 pathe: 1.1.2 @@ -3966,8 +4174,8 @@ packages: path-key: 4.0.0 dev: true - /nwsapi@2.2.9: - resolution: {integrity: sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==} + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} dev: false /oauth4webapi@2.10.4: @@ -4043,16 +4251,16 @@ packages: mimic-fn: 4.0.0 dev: true - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.5 dev: true /p-limit@3.1.0: @@ -4117,8 +4325,8 @@ packages: resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.2.2 - minipass: 7.1.0 + lru-cache: 10.2.0 + minipass: 7.0.4 dev: true /path-type@4.0.0: @@ -4169,7 +4377,7 @@ packages: resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} dependencies: confbox: 0.1.7 - mlly: 1.7.0 + mlly: 1.6.1 pathe: 1.1.2 dev: true @@ -4259,7 +4467,7 @@ packages: dependencies: lilconfig: 3.1.1 postcss: 8.4.38 - yaml: 2.4.2 + yaml: 2.4.1 dev: true /postcss-nested@6.0.1(postcss@8.4.38): @@ -4272,8 +4480,8 @@ packages: postcss-selector-parser: 6.0.16 dev: true - /postcss-nesting@12.1.2(postcss@8.4.38): - resolution: {integrity: sha512-FUmTHGDNundodutB4PUBxt/EPuhgtpk8FJGRsBhOuy+6FnkR2A8RZWIsyyy6XmhvX2DZQQWIkvu+HB4IbJm+Ew==} + /postcss-nesting@12.1.1(postcss@8.4.38): + resolution: {integrity: sha512-qc74KvIAQNa5ujZKG1UV286dhaDW6basbUy2i9AzNU/T8C9hpvGu9NZzm1SfePe2yP7sPYgpA8d4sPVopn2Hhw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -4355,21 +4563,20 @@ packages: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.3.1 + react-is: 18.2.0 dev: true /pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} dev: false - /prisma@5.13.0: - resolution: {integrity: sha512-kGtcJaElNRAdAGsCNykFSZ7dBKpL14Cbs+VaQ8cECxQlRPDjBlMHNFYeYt0SKovAVy2Y65JXQwB3A5+zIQwnTg==} + /prisma@5.12.1: + resolution: {integrity: sha512-SkMnb6wyIxTv9ACqiHBI2u9gD6y98qXRoCoLEnZsF6yee5Qg828G+ARrESN+lQHdw4maSZFFSBPPDpvSiVTo0Q==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.13.0 - dev: false + '@prisma/engines': 5.12.1 /property-expr@2.0.6: resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} @@ -4404,8 +4611,8 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true /read-cache@1.0.0: @@ -4421,12 +4628,6 @@ packages: picomatch: 2.3.1 dev: true - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - requiresBuild: true - dev: true - optional: true - /regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} @@ -4528,29 +4729,29 @@ packages: glob: 7.2.3 dev: true - /rollup@4.17.2: - resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + /rollup@4.14.3: + resolution: {integrity: sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.2 - '@rollup/rollup-android-arm64': 4.17.2 - '@rollup/rollup-darwin-arm64': 4.17.2 - '@rollup/rollup-darwin-x64': 4.17.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 - '@rollup/rollup-linux-arm-musleabihf': 4.17.2 - '@rollup/rollup-linux-arm64-gnu': 4.17.2 - '@rollup/rollup-linux-arm64-musl': 4.17.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 - '@rollup/rollup-linux-riscv64-gnu': 4.17.2 - '@rollup/rollup-linux-s390x-gnu': 4.17.2 - '@rollup/rollup-linux-x64-gnu': 4.17.2 - '@rollup/rollup-linux-x64-musl': 4.17.2 - '@rollup/rollup-win32-arm64-msvc': 4.17.2 - '@rollup/rollup-win32-ia32-msvc': 4.17.2 - '@rollup/rollup-win32-x64-msvc': 4.17.2 + '@rollup/rollup-android-arm-eabi': 4.14.3 + '@rollup/rollup-android-arm64': 4.14.3 + '@rollup/rollup-darwin-arm64': 4.14.3 + '@rollup/rollup-darwin-x64': 4.14.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.14.3 + '@rollup/rollup-linux-arm-musleabihf': 4.14.3 + '@rollup/rollup-linux-arm64-gnu': 4.14.3 + '@rollup/rollup-linux-arm64-musl': 4.14.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.14.3 + '@rollup/rollup-linux-riscv64-gnu': 4.14.3 + '@rollup/rollup-linux-s390x-gnu': 4.14.3 + '@rollup/rollup-linux-x64-gnu': 4.14.3 + '@rollup/rollup-linux-x64-musl': 4.14.3 + '@rollup/rollup-win32-arm64-msvc': 4.14.3 + '@rollup/rollup-win32-ia32-msvc': 4.14.3 + '@rollup/rollup-win32-x64-msvc': 4.14.3 fsevents: 2.3.3 dev: true @@ -4864,8 +5065,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /svelte-check@3.7.1(postcss@8.4.38)(svelte@4.2.15): - resolution: {integrity: sha512-U4uJoLCzmz2o2U33c7mPDJNhRYX/DNFV11XTUDlFxaKLsO7P+40gvJHMPpoRfa24jqZfST4/G9fGNcUGMO8NAQ==} + /svelte-check@3.6.9(postcss@8.4.38)(svelte@4.2.15): + resolution: {integrity: sha512-hDQrk3L0osX07djQyMiXocKysTLfusqi8AriNcCiQxhQR49/LonYolcUGMtZ0fbUR8HTR198Prrgf52WWU9wEg==} hasBin: true peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 @@ -4891,11 +5092,11 @@ packages: - sugarss dev: true - /svelte-eslint-parser@0.35.0(svelte@4.2.15): - resolution: {integrity: sha512-CtbPseajW0gjwEvHiuzYJkPDjAcHz2FaHt540j6RVYrZgnE6xWkzUBodQ4I3nV+G5AS0Svt8K6aIA/CIU9xT2Q==} + /svelte-eslint-parser@0.34.1(svelte@4.2.15): + resolution: {integrity: sha512-9+uLA1pqI9AZioKVGJzYYmlOZWxfoCXSbAM9iaNm7H01XlYlzRTtJfZgl9o3StQGN41PfGJIbkKkfk3e/pHFfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.112 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.94 peerDependenciesMeta: svelte: optional: true @@ -4911,8 +5112,8 @@ packages: /svelte-floating-ui@1.5.8: resolution: {integrity: sha512-dVvJhZ2bT+kQDHlE4Lep8t+sgEc0XD96fXLzAi2DDI2bsaegBbClxXVNMma0C2WsG+n9GJSYx292dTvA8CYRtw==} dependencies: - '@floating-ui/core': 1.6.1 - '@floating-ui/dom': 1.6.5 + '@floating-ui/core': 1.6.0 + '@floating-ui/dom': 1.6.3 dev: false /svelte-hmr@0.16.0(svelte@4.2.15): @@ -4991,33 +5192,31 @@ packages: magic-string: 0.30.10 periscopic: 3.1.0 - /sveltekit-superforms@2.13.0(@sveltejs/kit@2.5.7)(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(svelte@4.2.15): - resolution: {integrity: sha512-OJguA5oqLKa4H5SIpGjoneQAKDztDL0GepZFQn/Fv4BMvexbN9tFKujX0Ry81zYuJHfwRE5hN13+WLP4ro/WRw==} + /sveltekit-superforms@2.12.5(@sveltejs/kit@2.5.6)(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(svelte@4.2.15): + resolution: {integrity: sha512-p8qHNsMcPoB1mgTU8catzID8HJmxIK9ozRbGrv50Jk/XPotOjn5zTvW/stkVDBDL/tPLz0vfw+2PNbkkHCdhlw==} requiresBuild: true peerDependencies: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x || >=5.0.0-next.51 dependencies: - '@sveltejs/kit': 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.11) - devalue: 4.3.3 + '@sveltejs/kit': 2.5.6(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.15)(vite@5.2.9) + devalue: 4.3.2 just-clone: 6.2.0 memoize-weak: 1.0.2 svelte: 4.2.15 ts-deepmerge: 7.0.0 optionalDependencies: - '@exodus/schemasafe': 1.3.0 '@gcornut/valibot-json-schema': 0.0.27(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(valibot@0.30.0) - '@sinclair/typebox': 0.32.29 + '@sinclair/typebox': 0.32.20 '@sodaru/yup-to-json-schema': 2.0.1 '@vinejs/vine': 1.8.0 arktype: 1.0.29-alpha - joi: 17.13.1 - json-schema-to-ts: 3.1.0 + joi: 17.12.3 superstruct: 1.0.4 valibot: 0.30.0 yup: 1.4.0 - zod: 3.23.6 - zod-to-json-schema: 3.23.0(zod@3.23.6) + zod: 3.22.4 + zod-to-json-schema: 3.22.5(zod@3.22.4) transitivePeerDependencies: - '@types/json-schema' - esbuild @@ -5089,8 +5288,8 @@ packages: globrex: 0.1.2 dev: true - /tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + /tinybench@2.7.0: + resolution: {integrity: sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==} dev: true /tinypool@0.8.4: @@ -5121,8 +5320,8 @@ packages: engines: {node: '>=6'} dev: true - /tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} dependencies: psl: 1.9.0 @@ -5146,7 +5345,7 @@ packages: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} dev: false - /trpc-sveltekit@3.6.1(@sveltejs/adapter-node@5.0.1)(@trpc/client@10.45.2)(@trpc/server@10.45.2)(ws@8.17.0): + /trpc-sveltekit@3.6.1(@sveltejs/adapter-node@5.0.1)(@trpc/client@10.45.2)(@trpc/server@10.45.2)(ws@8.16.0): resolution: {integrity: sha512-5Sfw/xwvyuAdpoMHPgzC5B3m3pjbjcT6d3Vo9ukS1/NP8d2LPj30wWyHP3ploeUQNJRvCffRRkc69mp7csqf/g==} peerDependencies: '@sveltejs/adapter-node': '>=1.2' @@ -5154,18 +5353,12 @@ packages: '@trpc/server': ^10.0.0 ws: '>=8' dependencies: - '@sveltejs/adapter-node': 5.0.1(@sveltejs/kit@2.5.7) + '@sveltejs/adapter-node': 5.0.1(@sveltejs/kit@2.5.6) '@trpc/client': 10.45.2(@trpc/server@10.45.2) '@trpc/server': 10.45.2 - ws: 8.17.0 + ws: 8.16.0 dev: true - /ts-algebra@2.0.0: - resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} - requiresBuild: true - dev: true - optional: true - /ts-api-utils@1.3.0(typescript@5.4.5): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -5202,12 +5395,12 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsx@4.9.1: - resolution: {integrity: sha512-CqSJaYyZ6GEqnGtPuMPQHvUwRGU6VHSVF+RDxoOmRg/XD4aF0pD973tKhoUYGQtdcoCHcSOGk34ioFaP+vYcMQ==} + /tsx@4.7.2: + resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - esbuild: 0.20.2 + esbuild: 0.19.12 get-tsconfig: 4.7.3 optionalDependencies: fsevents: 2.3.3 @@ -5281,8 +5474,8 @@ packages: possible-typed-array-names: 1.0.0 dev: true - /typescript-eslint@7.8.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-sheFG+/D8N/L7gC3WT0Q8sB97Nm573Yfr+vZFzl/4nBdYcmviBPtwGSX9TJ7wpVg28ocerKVOt+k2eGmHzcgVA==} + /typescript-eslint@7.7.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-wZZ+7mTQJCn4mGAvzdERtL4vwKGM/mF9cMSMeKUllz3Hgbd1Mdd5L60Q+nJmCio9RB4OyMMr0EX4Ry2Q7jiAyw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -5291,9 +5484,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 typescript: 5.4.5 transitivePeerDependencies: @@ -5373,8 +5566,8 @@ packages: engines: {node: '>= 4.0.0'} dev: false - /update-browserslist-db@1.0.15(browserslist@4.23.0): - resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5436,8 +5629,8 @@ packages: vfile-message: 4.0.2 dev: false - /vite-node@1.6.0(@types/node@20.12.8): - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + /vite-node@1.5.0(@types/node@20.12.7): + resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -5445,7 +5638,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.11(@types/node@20.12.8) + vite: 5.2.9(@types/node@20.12.7) transitivePeerDependencies: - '@types/node' - less @@ -5457,8 +5650,8 @@ packages: - terser dev: true - /vite@5.2.11(@types/node@20.12.8): - resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + /vite@5.2.9(@types/node@20.12.7): + resolution: {integrity: sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5485,15 +5678,15 @@ packages: terser: optional: true dependencies: - '@types/node': 20.12.8 + '@types/node': 20.12.7 esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.17.2 + rollup: 4.14.3 optionalDependencies: fsevents: 2.3.3 dev: true - /vitefu@0.2.5(vite@5.2.11): + /vitefu@0.2.5(vite@5.2.9): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -5501,18 +5694,18 @@ packages: vite: optional: true dependencies: - vite: 5.2.11(@types/node@20.12.8) + vite: 5.2.9(@types/node@20.12.7) dev: true - /vitest@1.6.0(@types/node@20.12.8): - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + /vitest@1.5.0(@types/node@20.12.7): + resolution: {integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@vitest/browser': 1.5.0 + '@vitest/ui': 1.5.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5529,12 +5722,12 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.12.8 - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 + '@types/node': 20.12.7 + '@vitest/expect': 1.5.0 + '@vitest/runner': 1.5.0 + '@vitest/snapshot': 1.5.0 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 acorn-walk: 8.3.2 chai: 4.4.1 debug: 4.3.4 @@ -5545,10 +5738,10 @@ packages: picocolors: 1.0.0 std-env: 3.7.0 strip-literal: 2.1.0 - tinybench: 2.8.0 + tinybench: 2.7.0 tinypool: 0.8.4 - vite: 5.2.11(@types/node@20.12.8) - vite-node: 1.6.0(@types/node@20.12.8) + vite: 5.2.9(@types/node@20.12.7) + vite-node: 1.5.0(@types/node@20.12.7) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -5634,11 +5827,6 @@ packages: stackback: 0.0.2 dev: true - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true - /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -5661,8 +5849,8 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5691,8 +5879,8 @@ packages: engines: {node: '>= 6'} dev: true - /yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + /yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} engines: {node: '>= 14'} hasBin: true dev: true @@ -5718,26 +5906,26 @@ packages: dev: true optional: true - /zod-form-data@2.0.2(zod@3.23.6): + /zod-form-data@2.0.2(zod@3.22.4): resolution: {integrity: sha512-sKTi+k0fvkxdakD0V5rq+9WVJA3cuTQUfEmNqvHrTzPLvjfLmkkBLfR0ed3qOi9MScJXTHIDH/jUNnEJ3CBX4g==} peerDependencies: zod: '>= 3.11.0' dependencies: - zod: 3.23.6 + zod: 3.22.4 dev: false - /zod-to-json-schema@3.23.0(zod@3.23.6): - resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==} + /zod-to-json-schema@3.22.5(zod@3.22.4): + resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} requiresBuild: true peerDependencies: - zod: ^3.23.3 + zod: ^3.22.4 dependencies: - zod: 3.23.6 + zod: 3.22.4 dev: true optional: true - /zod@3.23.6: - resolution: {integrity: sha512-RTHJlZhsRbuA8Hmp/iNL7jnfc4nZishjsanDAfEY1QpDQZCahUp3xDzl+zfweE9BklxMUcgBgS1b7Lvie/ZVwA==} + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} diff --git a/run/entrypoint.sh b/run/entrypoint.sh deleted file mode 100755 index c749cb0..0000000 --- a/run/entrypoint.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -set -e -# Migrate database before starting server -npx prisma migrate deploy -node ./index.js diff --git a/src/lib/components/ui/EntryCard.svelte b/src/lib/components/ui/EntryCard.svelte index 409c5db..5958457 100644 --- a/src/lib/components/ui/EntryCard.svelte +++ b/src/lib/components/ui/EntryCard.svelte @@ -10,7 +10,7 @@ -
+
{formatDate(entry.current_version.date)} {#if entry.current_version.category} diff --git a/src/lib/server/query/entry.ts b/src/lib/server/query/entry.ts index aa51a1a..73a98f5 100644 --- a/src/lib/server/query/entry.ts +++ b/src/lib/server/query/entry.ts @@ -10,7 +10,7 @@ import type { PaginationRequest, SortRequest, } from "$lib/shared/model"; -import { DateRange, utcDateToYMD } from "$lib/shared/util"; +import { DateRange, dateToYMD } from "$lib/shared/util"; import { ErrorConflict, ErrorInvalidInput } from "$lib/shared/util/error"; import { prisma } from "$lib/server/prisma"; @@ -365,7 +365,7 @@ left join stations s on s.id = r.station_id`, current_version: { id: item.version_id, text: item.text, - date: utcDateToYMD(item.date), + date: dateToYMD(item.date), category: item.category_id ? { id: item.category_id, diff --git a/src/lib/server/query/mapping.ts b/src/lib/server/query/mapping.ts index 1be7996..03fd49c 100644 --- a/src/lib/server/query/mapping.ts +++ b/src/lib/server/query/mapping.ts @@ -19,7 +19,7 @@ import type { EntryExecution, UserTagNameNonnull, } from "$lib/shared/model"; -import { utcDateToYMD } from "$lib/shared/util"; +import { dateToYMD } from "$lib/shared/util"; import { ErrorNotFound } from "$lib/shared/util/error"; type DbRoomLn = DbRoom & { station: DbStation }; @@ -73,7 +73,7 @@ export function mapVersion(version: DbEntryVersionLn): EntryVersion { return { id: version.id, text: version.text, - date: utcDateToYMD(version.date), + date: dateToYMD(version.date), category: version.category, priority: version.priority, author: version.author, diff --git a/src/lib/shared/util/date.test.ts b/src/lib/shared/util/date.test.ts deleted file mode 100644 index eca9cc9..0000000 --- a/src/lib/shared/util/date.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { expect, it, vi } from "vitest"; - -import { - DateRange, dateFromYMD, dateToYMD, formatDate, humanDate, utcDateToYMD, -} from "./date"; - -const MINUTE = 60000; -const HOUR = 3_600_000; -const DAY = 24 * HOUR; - -it("formatDate", () => { - const date = new Date(2024, 0, 2); - expect(formatDate(date)).toBe("02.01.2024"); -}); - -it.each([ - { s: "2024-01-02", exp: new Date(2024, 0, 2) }, - { s: "24-01-02", exp: NaN }, -])("dateFromYMD", ({ s, exp }) => { - expect(dateFromYMD(s)).toStrictEqual(exp); -}); - -it("utcDateToYMD", () => { - const utcDate = new Date(Date.UTC(2024, 0, 2)); - expect(utcDateToYMD(utcDate)).toBe("2024-01-02"); -}); - -it("dateToYMD", () => { - const date = new Date(2024, 0, 2); - expect(dateToYMD(date)).toBe("2024-01-02"); -}); - -it.each([ - { s: 0, txt: "jetzt gerade" }, - { s: -30 * MINUTE, txt: "vor 30 Minuten" }, - { s: -11 * HOUR, txt: "vor 11 Stunden" }, - { s: -DAY, txt: "gestern" }, - { s: -2.5 * DAY, txt: "vor 2 Tagen" }, - { s: -2.6 * DAY, txt: "vor 3 Tagen" }, - { s: -3.5 * DAY, txt: "vor 3 Tagen" }, - { s: -4 * DAY, txt: "am 28.12.2023, 12:00" }, - - { s: 28 * MINUTE, txt: "in 28 Minuten" }, - { s: 8 * HOUR, txt: "in 8 Stunden" }, - { s: DAY, txt: "morgen" }, - { s: 2.6 * DAY, txt: "in 3 Tagen" }, - { s: 4 * DAY, txt: "am 05.01.2024, 12:00" }, -])("humanDate", ({ s, txt }) => { - const mockDate = new Date(2024, 0, 1, 12, 0); - vi.setSystemTime(mockDate); - - const dt = new Date(Number(mockDate) + s); - const res = humanDate(dt, true); - expect(res).toBe(txt); - - vi.useRealTimers(); -}); - -it.each([ - { s: "", exp: null }, - { s: "..", exp: null }, - { s: "foo..bar", exp: null }, - { s: "2024-04-15", exp: new DateRange(dateFromYMD("2024-04-15"), dateFromYMD("2024-04-15")) }, - { s: "2024-04-13..2024-04-20", exp: new DateRange(dateFromYMD("2024-04-13"), dateFromYMD("2024-04-20")) }, - { s: "2024-04-13..", exp: new DateRange(dateFromYMD("2024-04-13"), null) }, - { s: "..2024-04-20", exp: new DateRange(null, dateFromYMD("2024-04-20")) }, -])("parse daterange $s", ({ s, exp }) => { - const res = DateRange.parse(s); - expect(res).toStrictEqual(exp); - - if (res && s !== "2024-04-15") { - expect(res.toString()).toBe(s); - } -}); diff --git a/src/lib/shared/util/date.ts b/src/lib/shared/util/date.ts deleted file mode 100644 index 43770bb..0000000 --- a/src/lib/shared/util/date.ts +++ /dev/null @@ -1,172 +0,0 @@ -const LOCALE = "de-DE"; -const MS_PER_DAY = 86400000; - -function coerceDate(date: Date | string): Date { - if (!(date instanceof Date)) { - const d1 = dateFromYMD(date); - if (d1) return d1; - return new Date(date); - } - return date; -} - -export function formatDate(date: Date | string, time = false): string { - const dt = coerceDate(date); - if (time) { - return dt.toLocaleString(LOCALE, { - day: "2-digit", - month: "2-digit", - year: "numeric", - hour: "2-digit", - minute: "2-digit", - }); - } - return dt.toLocaleDateString(LOCALE, { - day: "2-digit", - month: "2-digit", - year: "numeric", - }); -} - -export function dateFromYMD(s: string): Date { - const re = /^(\d{4})-(\d{2})-(\d{2})$/; - const match = s.match(re); - if (match) { - return new Date( - parseInt(match[1]), - parseInt(match[2]) - 1, - parseInt(match[3]), - ); - } - // @ts-expect-error emulate behavior of date constructor - return NaN; -} - -/** Convert the given date to a string (using the internal UTC format) */ -export function utcDateToYMD(date: Date): string { - return date.toISOString().slice(0, 10); -} - -/** Convert the given date to a string (using the local timezone) */ -export function dateToYMD(date: Date): string { - return date.getFullYear().toString().padStart(4, "0") + "-" - + (date.getMonth() + 1).toString().padStart(2, "0") + "-" - + date.getDate().toString().padStart(2, "0"); -} - -function dateDiffInDays(a: Date, b: Date): number { - const ts1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate()); - const ts2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate()); - - return Math.round((ts2 - ts1) / MS_PER_DAY); -} - -export function humanDate(date: Date | string, time = false): string { - const now = new Date(); - const dt = coerceDate(date); - const threshold = 302400000; // 3.5 * 24 * 3_600_000 - const diff = Number(dt) - Number(now); // pos: Future, neg: Past - if (Math.abs(diff) > threshold) return `am ${formatDate(date, time)}`; - - const intl = new Intl.RelativeTimeFormat(LOCALE); - - const diffDays = dateDiffInDays(now, dt); - if (diffDays !== 0) { - if (diffDays === 1) return "morgen"; - if (diffDays === -1) return "gestern"; - return intl.format(diffDays, "day"); - } - - if (time) { - const diffHours = Math.round(diff / 3_600_000); - if (diffHours !== 0) return intl.format(diffHours, "hour"); - - const diffMinutes = Math.round(diff / 60_000); - if (diffMinutes !== 0) return intl.format(diffMinutes, "minute"); - } - - return time ? "jetzt gerade" : "heute"; -} - -export class DateRange { - start: Date | null; - - end: Date | null; - - constructor(start: Date | null, end: Date | null) { - if (start === null && end == null) throw Error("this is not a range"); - this.start = start; - this.end = end; - } - - /** Construct a new DateRange with the given length in days */ - static withLength(start: Date, nDays: number): DateRange { - const end = new Date(start); - end.setDate(start.getDate() + nDays); - return new DateRange(start, end); - } - - /** Create a date range of the current calendar week */ - static thisWeek(): DateRange { - const dayStart = new Date(); - // Correct for timezone - dayStart.setMinutes(dayStart.getMinutes() - dayStart.getTimezoneOffset()); - - const todayWd = dayStart.getDay(); - // Day starts at Sunday (0) - const daysMinus = todayWd === 0 ? 6 : todayWd - 1; - dayStart.setDate(dayStart.getDate() - daysMinus); - return DateRange.withLength(dayStart, 6); - } - - /** Parse a date range from a string - * - * Accepted formats: - * - Single date `2024-04-15` => `2024-04-15..2024-04-15` - * - Range with 2 ends: `2024-04-13..2024-04-20` - * - Range with 1 end: `2024-04-13..`; `..2024-04-20` - */ - static parse(s: string): DateRange | null { - const parts = s.split("..", 2); - const parsed = parts.map((p) => { - if (p.length === 0) return null; - return dateFromYMD(p); - }); - - if (parsed.length === 0 - // @ts-expect-error Parsed dates can be NaN - || parsed.findIndex(isNaN) !== -1 - || parsed.every((e) => e === null) - ) return null; - - if (parsed.length === 2) { - return new DateRange(parsed[0], parsed[1]); - } else { - return new DateRange(parsed[0], parsed[0]); - } - } - - /** Shift the range by the given number of days. This modifies the range in-place */ - addDays(n: number) { - this.start?.setDate(this.start.getDate() + n); - this.end?.setDate(this.end.getDate() + n); - } - - /** Return a parsable string representation */ - toString(): string { - let res = ""; - if (this.start) res += dateToYMD(this.start); - res += ".."; - if (this.end) res += dateToYMD(this.end); - return res; - } - - /** Return a string representation for display purposes */ - format(): string { - let res = ""; - if (this.start) res += formatDate(this.start); - res += " \u2013 "; - if (this.end) res += formatDate(this.end); - return res; - } -} diff --git a/src/lib/shared/util/index.test.ts b/src/lib/shared/util/index.test.ts new file mode 100644 index 0000000..0381f1f --- /dev/null +++ b/src/lib/shared/util/index.test.ts @@ -0,0 +1,74 @@ +import { expect, it, vi } from "vitest"; + +import type { EntityQuery } from "$lib/shared/model"; +import { ZEntriesQuery } from "$lib/shared/model/validation"; + +import { + getQueryUrl, humanDate, DateRange, parseQueryUrl, +} from "."; + +const MINUTE = 60000; +const HOUR = 3_600_000; +const DAY = 24 * HOUR; + +it.each([ + { s: 0, txt: "jetzt gerade" }, + { s: -30 * MINUTE, txt: "vor 30 Minuten" }, + { s: -11 * HOUR, txt: "vor 11 Stunden" }, + { s: -DAY, txt: "gestern" }, + { s: -2.5 * DAY, txt: "vor 2 Tagen" }, + { s: -2.6 * DAY, txt: "vor 3 Tagen" }, + { s: -3.5 * DAY, txt: "vor 3 Tagen" }, + { s: -4 * DAY, txt: "am 28.12.2023, 12:00" }, + + { s: 28 * MINUTE, txt: "in 28 Minuten" }, + { s: 8 * HOUR, txt: "in 8 Stunden" }, + { s: DAY, txt: "morgen" }, + { s: 2.6 * DAY, txt: "in 3 Tagen" }, + { s: 4 * DAY, txt: "am 05.01.2024, 12:00" }, +])("humanDate", ({ s, txt }) => { + const mockDate = new Date(2024, 0, 1, 12, 0); + vi.setSystemTime(mockDate); + + const dt = new Date(Number(mockDate) + s); + const res = humanDate(dt, true); + expect(res).toBe(txt); + + vi.useRealTimers(); +}); + +it("getQueryUrl", () => { + const query: EntityQuery = { + filter: { + author: [{ id: 2, name: "Max" }], + category: [{ id: 1, name: "Blutabnahme" }, { id: 2, name: "Labortests" }], + done: true, + search: "Hello World", + }, + pagination: { limit: 10, offset: 20 }, + sort: { field: "room", asc: true }, + }; + + const queryUrl = getQueryUrl(query, ""); + expect(queryUrl).toBe("?filter%5Bauthor%5D%5B0%5D%5Bid%5D=2&filter%5Bauthor%5D%5B0%5D%5Bname%5D=Max&filter%5Bcategory%5D%5B0%5D%5Bid%5D=1&filter%5Bcategory%5D%5B0%5D%5Bname%5D=Blutabnahme&filter%5Bcategory%5D%5B1%5D%5Bid%5D=2&filter%5Bcategory%5D%5B1%5D%5Bname%5D=Labortests&filter%5Bdone%5D=true&filter%5Bsearch%5D=Hello%20World&pagination%5Blimit%5D=10&pagination%5Boffset%5D=20&sort%5Bfield%5D=room&sort%5Basc%5D=true"); + + const decoded = ZEntriesQuery.parse(parseQueryUrl(queryUrl)); + expect(decoded).toStrictEqual(query); +}); + +it.each([ + { s: "", exp: null }, + { s: "..", exp: null }, + { s: "foo..bar", exp: null }, + { s: "2024-04-15", exp: new DateRange(new Date("2024-04-15"), new Date("2024-04-15")) }, + { s: "2024-04-13..2024-04-20", exp: new DateRange(new Date("2024-04-13"), new Date("2024-04-20")) }, + { s: "2024-04-13..", exp: new DateRange(new Date("2024-04-13"), null) }, + { s: "..2024-04-20", exp: new DateRange(null, new Date("2024-04-20")) }, +])("parse date range $s", ({ s, exp }) => { + const res = DateRange.parse(s); + expect(res).toStrictEqual(exp); + + if (res && s !== "2024-04-15") { + expect(res.toString()).toBe(s); + } +}); diff --git a/src/lib/shared/util/index.ts b/src/lib/shared/util/index.ts index 4f3d187..2491245 100644 --- a/src/lib/shared/util/index.ts +++ b/src/lib/shared/util/index.ts @@ -1,2 +1,251 @@ -export * from "./util"; -export * from "./date"; +import { goto } from "$app/navigation"; + +import { isRedirect, error } from "@sveltejs/kit"; +import { TRPCClientError } from "@trpc/client"; +import DOMPurify from "isomorphic-dompurify"; +import qs from "qs"; +import { ZodError } from "zod"; + +import type { EntityQuery, Patient } from "$lib/shared/model"; +import type { RouterOutput } from "../trpc"; + +const LOCALE = "de-DE"; + +function coerceDate(date: Date | string): Date { + if (!(date instanceof Date)) { + return new Date(date); + } + return date; +} + +export function formatDate(date: Date | string, time = false): string { + const dt = coerceDate(date); + if (time) { + return dt.toLocaleString(LOCALE, { + day: "2-digit", + month: "2-digit", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }); + } + return dt.toLocaleDateString(LOCALE, { + day: "2-digit", + month: "2-digit", + year: "numeric", + }); +} + +const MS_PER_DAY = 86400000; + +function dateDiffInDays(a: Date, b: Date): number { + const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate()); + const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate()); + + return Math.round((utc2 - utc1) / MS_PER_DAY); +} + +export function humanDate(date: Date | string, time = false): string { + const now = new Date(); + const dt = coerceDate(date); + const threshold = 302400000; // 3.5 * 24 * 3_600_000 + const diff = Number(dt) - Number(now); // pos: Future, neg: Past + if (Math.abs(diff) > threshold) return `am ${formatDate(date, time)}`; + + const intl = new Intl.RelativeTimeFormat(LOCALE); + + const diffDays = dateDiffInDays(now, dt); + if (diffDays !== 0) { + if (diffDays === 1) return "morgen"; + if (diffDays === -1) return "gestern"; + return intl.format(diffDays, "day"); + } + + if (time) { + const diffHours = Math.round(diff / 3_600_000); + if (diffHours !== 0) return intl.format(diffHours, "hour"); + + const diffMinutes = Math.round(diff / 60_000); + if (diffMinutes !== 0) return intl.format(diffMinutes, "minute"); + } + + return time ? "jetzt gerade" : "heute"; +} + +export function formatBool(val: boolean): string { + return val ? "Ja" : "Nein"; +} + +/** Encode an entity query (search and filter) into an URL */ +export function getQueryUrl(query: EntityQuery, basePath: string): string { + if (Object.values(query).filter((q) => q !== undefined).length === 0) return basePath; + return basePath + "?" + qs.stringify(query); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function parseQueryUrl(search: string): any { + return qs.parse(search, { ignoreQueryPrefix: true, allowDots: true }); +} + +export function gotoEntityQuery(query: EntityQuery, basePath: string) { + if (window && window.location.pathname.startsWith(`${basePath}/`)) { + if (window.location.search) { + const oldQuery: EntityQuery = parseQueryUrl(window.location.search); + const newQuery: EntityQuery = { + filter: { ...oldQuery.filter, ...query.filter }, + sort: query.sort, + }; + goto(getQueryUrl(newQuery, basePath)); + return; + } + } + goto(getQueryUrl(query, basePath)); +} + +/** Wrap a page load query to handle occuring errors + * + * Converts TRPC errors to SvelteKit ones + */ +export async function loadWrap(f: () => Promise) { + try { + return await f(); + } catch (e) { + if (isRedirect(e)) { + throw e; + } else if (e instanceof TRPCClientError) { + error(e.data?.httpStatus ?? 500, e.message); + } else if (e instanceof ZodError) { + error(400, e.message); + } else if (e instanceof Error) { + error(500, e.message); + } else { + error(500, "unknown error"); + } + } +} + +export function baseUrl(url: URL): string { + return `${url.protocol}//${url.host}`; +} + +export function dateToYMD(date: Date): string { + return date.toISOString().slice(0, 10); +} + +export class Debouncer { + private delay: number; + + private handler: () => unknown; + + private timeout: number | null = null; + + constructor(delay: number, handler: () => unknown) { + this.delay = delay; + this.handler = handler; + } + + clear() { + if (this.timeout) window.clearTimeout(this.timeout); + } + + trigger() { + this.clear(); + this.timeout = window.setTimeout(this.handler, this.delay); + } + + now() { + this.clear(); + this.handler(); + } +} + +export function sanitizeHtml(s: string): string { + return DOMPurify.sanitize(s, { FORBID_TAGS: ["img"] }); +} + +export class DateRange { + start: Date | null; + + end: Date | null; + + constructor(start: Date | null, end: Date | null) { + if (start === null && end == null) throw Error("this is not a range"); + this.start = start; + this.end = end; + } + + /** Construct a new DateRange with the given length in days */ + static withLength(start: Date, nDays: number): DateRange { + const end = new Date(start); + end.setDate(start.getDate() + nDays); + return new DateRange(start, end); + } + + /** Create a date range of the current calendar week */ + static thisWeek(): DateRange { + const dayStart = new Date(); + // Correct for timezone + dayStart.setMinutes(dayStart.getMinutes() - dayStart.getTimezoneOffset()); + + const todayWd = dayStart.getDay(); + // Day starts at Sunday (0) + const daysMinus = todayWd === 0 ? 6 : todayWd - 1; + dayStart.setDate(dayStart.getDate() - daysMinus); + return DateRange.withLength(dayStart, 6); + } + + /** Parse a date range from a string + * + * Accepted formats: + * - Single date `2024-04-15` => `2024-04-15..2024-04-15` + * - Range with 2 ends: `2024-04-13..2024-04-20` + * - Range with 1 end: `2024-04-13..`; `..2024-04-20` + */ + static parse(s: string): DateRange | null { + const parts = s.split("..", 2); + const parsed = parts.map((p) => { + if (p.length === 0) return null; + return new Date(p); + }); + + if (parsed.length === 0 + // @ts-expect-error Parsed dates can be NaN + || parsed.findIndex(isNaN) !== -1 + || parsed.every((e) => e === null) + ) return null; + + if (parsed.length === 2) { + return new DateRange(parsed[0], parsed[1]); + } else { + return new DateRange(parsed[0], parsed[0]); + } + } + + /** Shift the range by the given number of days. This modifies the range in-place */ + addDays(n: number) { + this.start?.setDate(this.start.getDate() + n); + this.end?.setDate(this.end.getDate() + n); + } + + /** Return a parsable string representation */ + toString(): string { + let res = ""; + if (this.start) res += dateToYMD(this.start); + res += ".."; + if (this.end) res += dateToYMD(this.end); + return res; + } + + /** Return a string representation for display purposes */ + format(): string { + let res = ""; + if (this.start) res += formatDate(this.start); + res += " \u2013 "; + if (this.end) res += formatDate(this.end); + return res; + } +} + +export function formatPatientName(patient: RouterOutput["patient"]["list"]["items"][0]): string { + return `${patient.first_name} ${patient.last_name} (${patient.age})`; +} diff --git a/src/lib/shared/util/util.test.ts b/src/lib/shared/util/util.test.ts deleted file mode 100644 index eef4b3d..0000000 --- a/src/lib/shared/util/util.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { expect, it } from "vitest"; - -import type { EntityQuery } from "$lib/shared/model"; -import { ZEntriesQuery } from "$lib/shared/model/validation"; - -import { - getQueryUrl, parseQueryUrl, -} from "."; - -it("getQueryUrl", () => { - const query: EntityQuery = { - filter: { - author: [{ id: 2, name: "Max" }], - category: [{ id: 1, name: "Blutabnahme" }, { id: 2, name: "Labortests" }], - done: true, - search: "Hello World", - }, - pagination: { limit: 10, offset: 20 }, - sort: { field: "room", asc: true }, - }; - - const queryUrl = getQueryUrl(query, ""); - expect(queryUrl).toBe("?filter%5Bauthor%5D%5B0%5D%5Bid%5D=2&filter%5Bauthor%5D%5B0%5D%5Bname%5D=Max&filter%5Bcategory%5D%5B0%5D%5Bid%5D=1&filter%5Bcategory%5D%5B0%5D%5Bname%5D=Blutabnahme&filter%5Bcategory%5D%5B1%5D%5Bid%5D=2&filter%5Bcategory%5D%5B1%5D%5Bname%5D=Labortests&filter%5Bdone%5D=true&filter%5Bsearch%5D=Hello%20World&pagination%5Blimit%5D=10&pagination%5Boffset%5D=20&sort%5Bfield%5D=room&sort%5Basc%5D=true"); - - const decoded = ZEntriesQuery.parse(parseQueryUrl(queryUrl)); - expect(decoded).toStrictEqual(query); -}); diff --git a/src/lib/shared/util/util.ts b/src/lib/shared/util/util.ts deleted file mode 100644 index daead40..0000000 --- a/src/lib/shared/util/util.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { goto } from "$app/navigation"; - -import { isRedirect, error } from "@sveltejs/kit"; -import { TRPCClientError } from "@trpc/client"; -import DOMPurify from "isomorphic-dompurify"; -import qs from "qs"; -import { ZodError } from "zod"; - -import type { EntityQuery } from "$lib/shared/model"; -import type { RouterOutput } from "$lib/shared/trpc"; - -export function formatBool(val: boolean): string { - return val ? "Ja" : "Nein"; -} - -/** Encode an entity query (search and filter) into an URL */ -export function getQueryUrl(query: EntityQuery, basePath: string): string { - if (Object.values(query).filter((q) => q !== undefined).length === 0) return basePath; - return basePath + "?" + qs.stringify(query); -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function parseQueryUrl(search: string): any { - return qs.parse(search, { ignoreQueryPrefix: true, allowDots: true }); -} - -export function gotoEntityQuery(query: EntityQuery, basePath: string) { - if (window && window.location.pathname.startsWith(`${basePath}/`)) { - if (window.location.search) { - const oldQuery: EntityQuery = parseQueryUrl(window.location.search); - const newQuery: EntityQuery = { - filter: { ...oldQuery.filter, ...query.filter }, - sort: query.sort, - }; - goto(getQueryUrl(newQuery, basePath)); - return; - } - } - goto(getQueryUrl(query, basePath)); -} - -/** Wrap a page load query to handle occuring errors - * - * Converts TRPC errors to SvelteKit ones - */ -export async function loadWrap(f: () => Promise) { - try { - return await f(); - } catch (e) { - if (isRedirect(e)) { - throw e; - } else if (e instanceof TRPCClientError) { - error(e.data?.httpStatus ?? 500, e.message); - } else if (e instanceof ZodError) { - error(400, e.message); - } else if (e instanceof Error) { - error(500, e.message); - } else { - error(500, "unknown error"); - } - } -} - -export function baseUrl(url: URL): string { - return `${url.protocol}//${url.host}`; -} - -export class Debouncer { - private delay: number; - - private handler: () => unknown; - - private timeout: number | null = null; - - constructor(delay: number, handler: () => unknown) { - this.delay = delay; - this.handler = handler; - } - - clear() { - if (this.timeout) window.clearTimeout(this.timeout); - } - - trigger() { - this.clear(); - this.timeout = window.setTimeout(this.handler, this.delay); - } - - now() { - this.clear(); - this.handler(); - } -} - -export function sanitizeHtml(s: string): string { - return DOMPurify.sanitize(s, { FORBID_TAGS: ["img"] }); -} - -export function formatPatientName(patient: RouterOutput["patient"]["list"]["items"][0]): string { - return `${patient.first_name} ${patient.last_name} (${patient.age})`; -} - -export function divFloor(a: number, b: number): number { - return Math.floor(a / b); -} diff --git a/src/routes/(app)/visit/+page.svelte b/src/routes/(app)/visit/+page.svelte index 1ff17d6..1640510 100644 --- a/src/routes/(app)/visit/+page.svelte +++ b/src/routes/(app)/visit/+page.svelte @@ -53,7 +53,7 @@ filter: { done: false, station: selection ? [selection] : undefined, - date: dateRange ? [{ id: dateRange.toString() }] : undefined, + date: dateRange ? [{ id: dateRange.toString(), name: dateRange.format() }] : undefined, }, }); } diff --git a/src/routes/(app)/visit/+page.ts b/src/routes/(app)/visit/+page.ts index bd1917b..3bf6689 100644 --- a/src/routes/(app)/visit/+page.ts +++ b/src/routes/(app)/visit/+page.ts @@ -1,14 +1,10 @@ import type { PageLoad } from "./$types"; -import { redirect } from "@sveltejs/kit"; import { z } from "zod"; -import { URL_VISIT } from "$lib/shared/constants"; import { ZEntriesQuery } from "$lib/shared/model/validation"; import { trpc } from "$lib/shared/trpc"; -import { - DateRange, getQueryUrl, loadWrap, parseQueryUrl, -} from "$lib/shared/util"; +import { DateRange, loadWrap, parseQueryUrl } from "$lib/shared/util"; export const load: PageLoad = async (event) => { return loadWrap(async () => { @@ -19,17 +15,13 @@ export const load: PageLoad = async (event) => { query = ZEntriesQuery.parse(decoded); } + // Default filter (current week) + const drange = DateRange.thisWeek(); if (!query.filter) { - const url = getQueryUrl({ - filter: { - done: false, - date: [{ id: DateRange.thisWeek().toString() }], - }, - }, URL_VISIT); - redirect(302, url); + query.filter = { + date: [{ id: drange.toString() }], + }; } - - // Sort entries by date if (!query.sort) { query.sort = { field: "date" }; }