From 2e396c7cf29dbe6a142a03383b6717146e220a79 Mon Sep 17 00:00:00 2001 From: Torben Haack Date: Mon, 4 Nov 2024 07:19:42 +0100 Subject: [PATCH] test data generation --- packages/reservation-platform/package.json | 9 + packages/reservation-platform/pnpm-lock.yaml | 941 ++++++++++++++++-- .../scripts/generate-data.js | 384 +++++++ .../scripts/generate-data.ts | 357 +++++++ 4 files changed, 1628 insertions(+), 63 deletions(-) create mode 100644 packages/reservation-platform/scripts/generate-data.js create mode 100644 packages/reservation-platform/scripts/generate-data.ts diff --git a/packages/reservation-platform/package.json b/packages/reservation-platform/package.json index cf7a33e..ef36b8f 100644 --- a/packages/reservation-platform/package.json +++ b/packages/reservation-platform/package.json @@ -16,6 +16,7 @@ "db:reset": "pnpm db:clean && pnpm db" }, "dependencies": { + "@faker-js/faker": "^9.2.0", "@headlessui/react": "^2.1.10", "@headlessui/tailwindcss": "^0.2.1", "@hookform/resolvers": "^3.9.0", @@ -40,8 +41,10 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "drizzle-orm": "^0.30.10", + "lodash": "^4.17.21", "lucia": "^3.2.1", "lucide-react": "^0.378.0", + "luxon": "^3.5.0", "next": "14.2.3", "next-themes": "^0.3.0", "oslo": "^1.2.1", @@ -52,21 +55,27 @@ "react-timer-hook": "^3.0.7", "regression": "^2.0.1", "sonner": "^1.5.0", + "sqlite": "^5.1.1", + "sqlite3": "^5.1.7", "swr": "^2.2.5", "tailwind-merge": "^2.5.3", "tailwindcss-animate": "^1.0.7", "use-debounce": "^10.0.3", + "uuid": "^11.0.2", "zod": "^3.23.8" }, "devDependencies": { "@biomejs/biome": "^1.9.3", "@tailwindcss/forms": "^0.5.9", + "@types/lodash": "^4.17.13", + "@types/luxon": "^3.4.2", "@types/node": "^20.16.11", "@types/react": "^18.3.11", "@types/react-dom": "^18.3.1", "drizzle-kit": "^0.21.4", "postcss": "^8.4.47", "tailwindcss": "^3.4.13", + "ts-node": "^10.9.2", "typescript": "^5.6.3" } } diff --git a/packages/reservation-platform/pnpm-lock.yaml b/packages/reservation-platform/pnpm-lock.yaml index 00e0bdb..54df20d 100644 --- a/packages/reservation-platform/pnpm-lock.yaml +++ b/packages/reservation-platform/pnpm-lock.yaml @@ -8,12 +8,15 @@ importers: .: dependencies: + '@faker-js/faker': + specifier: ^9.2.0 + version: 9.2.0 '@headlessui/react': specifier: ^2.1.10 version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@headlessui/tailwindcss': specifier: ^0.2.1 - version: 0.2.1(tailwindcss@3.4.13) + version: 0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))) '@hookform/resolvers': specifier: ^3.9.0 version: 3.9.0(react-hook-form@7.53.0(react@18.3.1)) @@ -22,7 +25,7 @@ importers: version: 0.14.0 '@lucia-auth/adapter-drizzle': specifier: ^1.1.0 - version: 1.1.0(drizzle-orm@0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1))(lucia@3.2.1) + version: 1.1.0(drizzle-orm@0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1)(sqlite3@5.1.7))(lucia@3.2.1) '@radix-ui/react-alert-dialog': specifier: ^1.1.2 version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -67,7 +70,7 @@ importers: version: 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tremor/react': specifier: ^3.18.3 - version: 3.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.13) + version: 3.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))) arctic: specifier: ^1.9.2 version: 1.9.2 @@ -79,13 +82,19 @@ importers: version: 2.1.1 drizzle-orm: specifier: ^0.30.10 - version: 0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1) + version: 0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1)(sqlite3@5.1.7) + lodash: + specifier: ^4.17.21 + version: 4.17.21 lucia: specifier: ^3.2.1 version: 3.2.1 lucide-react: specifier: ^0.378.0 version: 0.378.0(react@18.3.1) + luxon: + specifier: ^3.5.0 + version: 3.5.0 next: specifier: 14.2.3 version: 14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -116,6 +125,12 @@ importers: sonner: specifier: ^1.5.0 version: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + sqlite: + specifier: ^5.1.1 + version: 5.1.1 + sqlite3: + specifier: ^5.1.7 + version: 5.1.7 swr: specifier: ^2.2.5 version: 2.2.5(react@18.3.1) @@ -124,10 +139,13 @@ importers: version: 2.5.3 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))) use-debounce: specifier: ^10.0.3 version: 10.0.3(react@18.3.1) + uuid: + specifier: ^11.0.2 + version: 11.0.2 zod: specifier: ^3.23.8 version: 3.23.8 @@ -137,7 +155,13 @@ importers: version: 1.9.3 '@tailwindcss/forms': specifier: ^0.5.9 - version: 0.5.9(tailwindcss@3.4.13) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))) + '@types/lodash': + specifier: ^4.17.13 + version: 4.17.13 + '@types/luxon': + specifier: ^3.4.2 + version: 3.4.2 '@types/node': specifier: ^20.16.11 version: 20.16.11 @@ -155,7 +179,10 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.4.13 - version: 3.4.13 + version: 3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.16.11)(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -223,6 +250,10 @@ packages: cpu: [x64] os: [win32] + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@emnapi/core@0.45.0': resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} @@ -507,6 +538,10 @@ packages: cpu: [x64] os: [win32] + '@faker-js/faker@9.2.0': + resolution: {integrity: sha512-ulqQu4KMr1/sTFIYvqSdegHT8NIkt66tFAkugGnHA+1WAfEn6hMzNR+svjXGFRVLnapxvej67Z/LwchFrnLBUg==} + engines: {node: '>=18.0.0', npm: '>=9.0.0'} + '@floating-ui/core@1.6.1': resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} @@ -546,6 +581,9 @@ packages: '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@headlessui/react@1.7.19': resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} engines: {node: '>=10'} @@ -593,6 +631,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@libsql/client@0.14.0': resolution: {integrity: sha512-/9HEKfn6fwXB5aTEEoMeFh4CtG0ZzbncBb1e++OCdVpgKZ/xyMsIVYXm0w7Pv4RUel803vE6LwniB3PqD72R0Q==} @@ -896,6 +937,14 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@npmcli/fs@1.1.1': + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + + '@npmcli/move-file@1.1.2': + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + '@oslojs/asn1@1.0.0': resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==} @@ -1401,12 +1450,28 @@ packages: '@tanstack/virtual-core@3.5.0': resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} + '@tootallnate/once@1.1.2': + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + '@tremor/react@3.18.3': resolution: {integrity: sha512-7QyGE2W9f2FpwH24TKy3/mqBgLl4sHZeQcXP3rxXZ8W2AUq7AVaG1+vIT3xXxISrkh7zknjWlZsuhoF8NWNVDw==} peerDependencies: react: ^18.0.0 react-dom: '>=16.6.0' + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tybys/wasm-util@0.8.3': resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} @@ -1440,6 +1505,12 @@ packages: '@types/d3-timer@3.0.2': resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/lodash@4.17.13': + resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + + '@types/luxon@3.4.2': + resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} + '@types/node@20.16.11': resolution: {integrity: sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==} @@ -1455,6 +1526,30 @@ packages: '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1478,9 +1573,20 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + arctic@1.9.2: resolution: {integrity: sha512-VTnGpYx+ypboJdNrWnK17WeD7zN/xSCHnpecd5QYsBfVZde/5i+7DJ1wrf/ioSDMiEjagXmyNWAE3V2C9f1hNg==} + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -1507,6 +1613,9 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1524,6 +1633,10 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} + cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -1538,9 +1651,17 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + class-variance-authority@0.7.0: resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + cli-color@2.0.4: resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} engines: {node: '>=0.10'} @@ -1563,6 +1684,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1571,6 +1696,15 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1658,6 +1792,9 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} @@ -1672,6 +1809,10 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + difflib@0.2.4: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} @@ -1778,13 +1919,23 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} engines: {node: '>=0.10'} @@ -1864,6 +2015,10 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fs-monkey@1.0.6: resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} @@ -1878,6 +2033,11 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -1901,6 +2061,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} @@ -1912,6 +2076,9 @@ packages: hanji@0.0.5: resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1919,9 +2086,38 @@ packages: heap@0.2.7: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -1939,6 +2135,10 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1958,6 +2158,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1982,6 +2185,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + json-diff@0.9.0: resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} hasBin: true @@ -2015,6 +2221,10 @@ packages: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} @@ -2026,6 +2236,17 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 + luxon@3.5.0: + resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} + engines: {node: '>=12'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + memfs-browser@3.5.10302: resolution: {integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==} @@ -2052,6 +2273,9 @@ packages: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} @@ -2063,13 +2287,50 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.1: resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -2084,6 +2345,10 @@ packages: napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + next-themes@0.3.0: resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} peerDependencies: @@ -2115,6 +2380,9 @@ packages: resolution: {integrity: sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==} engines: {node: '>=10'} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -2123,10 +2391,25 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -2144,6 +2427,14 @@ packages: oslo@1.2.1: resolution: {integrity: sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA==} + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -2223,9 +2514,21 @@ packages: engines: {node: '>=10'} hasBin: true + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + promise-limit@2.7.0: resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -2356,16 +2659,28 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -2374,6 +2689,9 @@ packages: engines: {node: '>=10'} hasBin: true + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2382,6 +2700,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -2395,6 +2716,18 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonner@1.5.0: resolution: {integrity: sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==} peerDependencies: @@ -2416,6 +2749,19 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sqlite3@5.1.7: + resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} + + sqlite@5.1.1: + resolution: {integrity: sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==} + + ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -2493,6 +2839,10 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -2513,6 +2863,20 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -2530,6 +2894,12 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + use-callback-ref@1.3.2: resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} engines: {node: '>=10'} @@ -2564,6 +2934,13 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@11.0.2: + resolution: {integrity: sha512-14FfcOJmqdjbBPdDjFQyk/SdT4NySW4eM0zcG+HqbHP5jzuH56xO3J1DGhgs/cEMCfwYi3HQI1gnTO62iaG+tQ==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} @@ -2576,6 +2953,9 @@ packages: engines: {node: '>= 8'} hasBin: true + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -2602,11 +2982,18 @@ packages: utf-8-validate: optional: true + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.4.2: resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} engines: {node: '>= 14'} hasBin: true + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -2653,6 +3040,10 @@ snapshots: '@biomejs/cli-win32-x64@1.9.3': optional: true + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + '@emnapi/core@0.45.0': dependencies: tslib: 2.6.2 @@ -2808,6 +3199,8 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true + '@faker-js/faker@9.2.0': {} + '@floating-ui/core@1.6.1': dependencies: '@floating-ui/utils': 0.2.8 @@ -2853,6 +3246,9 @@ snapshots: '@floating-ui/utils@0.2.8': {} + '@gar/promisify@1.1.3': + optional: true + '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -2869,9 +3265,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.13)': + '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)))': dependencies: - tailwindcss: 3.4.13 + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)) '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': dependencies: @@ -2903,6 +3299,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@libsql/client@0.14.0': dependencies: '@libsql/core': 0.14.0 @@ -2959,9 +3360,9 @@ snapshots: '@libsql/win32-x64-msvc@0.4.6': optional: true - '@lucia-auth/adapter-drizzle@1.1.0(drizzle-orm@0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1))(lucia@3.2.1)': + '@lucia-auth/adapter-drizzle@1.1.0(drizzle-orm@0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1)(sqlite3@5.1.7))(lucia@3.2.1)': dependencies: - drizzle-orm: 0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1) + drizzle-orm: 0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1)(sqlite3@5.1.7) lucia: 3.2.1 '@neon-rs/load@0.0.4': {} @@ -3135,6 +3536,18 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@npmcli/fs@1.1.1': + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.6.2 + optional: true + + '@npmcli/move-file@1.1.2': + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + optional: true + '@oslojs/asn1@1.0.0': dependencies: '@oslojs/binary': 1.0.0 @@ -3617,10 +4030,10 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.6.2 - '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13)': + '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)))': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.13 + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)) '@tanstack/react-table@8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -3646,11 +4059,14 @@ snapshots: '@tanstack/virtual-core@3.5.0': {} - '@tremor/react@3.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.13)': + '@tootallnate/once@1.1.2': + optional: true + + '@tremor/react@3.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)))': dependencies: '@floating-ui/react': 0.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.13) + '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))) date-fns: 3.6.0 react: 18.3.1 react-day-picker: 8.10.1(date-fns@3.6.0)(react@18.3.1) @@ -3661,6 +4077,14 @@ snapshots: transitivePeerDependencies: - tailwindcss + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + '@tybys/wasm-util@0.8.3': dependencies: tslib: 2.6.2 @@ -3695,6 +4119,10 @@ snapshots: '@types/d3-timer@3.0.2': {} + '@types/lodash@4.17.13': {} + + '@types/luxon@3.4.2': {} + '@types/node@20.16.11': dependencies: undici-types: 6.19.8 @@ -3714,6 +4142,33 @@ snapshots: dependencies: '@types/node': 20.16.11 + abbrev@1.1.1: + optional: true + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + optional: true + + agentkeepalive@4.5.0: + dependencies: + humanize-ms: 1.2.1 + optional: true + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + optional: true + ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -3731,10 +4186,21 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + aproba@2.0.0: + optional: true + arctic@1.9.2: dependencies: oslo: 1.2.0 + are-we-there-yet@3.0.1: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + optional: true + + arg@4.1.3: {} + arg@5.0.2: {} aria-hidden@1.2.4: @@ -3743,8 +4209,7 @@ snapshots: balanced-match@1.0.2: {} - base64-js@1.5.1: - optional: true + base64-js@1.5.1: {} better-sqlite3@9.6.0: dependencies: @@ -3757,13 +4222,17 @@ snapshots: bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - optional: true bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 optional: true brace-expansion@2.0.1: @@ -3780,12 +4249,35 @@ snapshots: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - optional: true busboy@1.6.0: dependencies: streamsearch: 1.1.0 + cacache@15.3.0: + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.1 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + optional: true + camelcase-css@2.0.1: {} caniuse-lite@1.0.30001617: {} @@ -3802,13 +4294,17 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@1.1.4: - optional: true + chownr@1.1.4: {} + + chownr@2.0.0: {} class-variance-authority@0.7.0: dependencies: clsx: 2.0.0 + clean-stack@2.2.0: + optional: true + cli-color@2.0.4: dependencies: d: 1.0.2 @@ -3829,10 +4325,21 @@ snapshots: color-name@1.1.4: {} + color-support@1.1.3: + optional: true + commander@4.1.1: {} commander@9.5.0: {} + concat-map@0.0.1: + optional: true + + console-control-strings@1.1.0: + optional: true + + create-require@1.1.1: {} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -3899,20 +4406,22 @@ snapshots: decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - optional: true - deep-extend@0.6.0: + deep-extend@0.6.0: {} + + delegates@1.0.0: optional: true detect-libc@2.0.2: {} - detect-libc@2.0.3: - optional: true + detect-libc@2.0.3: {} detect-node-es@1.1.0: {} didyoumean@1.2.2: {} + diff@4.0.2: {} + difflib@0.2.4: dependencies: heap: 0.2.7 @@ -3942,13 +4451,14 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1): + drizzle-orm@0.30.10(@libsql/client@0.14.0)(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@9.6.0)(react@18.3.1)(sqlite3@5.1.7): optionalDependencies: '@libsql/client': 0.14.0 '@types/better-sqlite3': 7.6.11 '@types/react': 18.3.11 better-sqlite3: 9.6.0 react: 18.3.1 + sqlite3: 5.1.7 eastasianwidth@0.2.0: {} @@ -3956,13 +4466,23 @@ snapshots: emoji-regex@9.2.2: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + end-of-stream@1.4.4: dependencies: once: 1.4.0 + + env-paths@2.2.1: optional: true env-paths@3.0.0: {} + err-code@2.0.3: + optional: true + es5-ext@0.10.64: dependencies: es6-iterator: 2.0.3 @@ -4060,8 +4580,7 @@ snapshots: eventemitter3@4.0.7: {} - expand-template@2.0.3: - optional: true + expand-template@2.0.3: {} ext@1.7.0: dependencies: @@ -4086,8 +4605,7 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - file-uri-to-path@1.0.0: - optional: true + file-uri-to-path@1.0.0: {} fill-range@7.0.1: dependencies: @@ -4102,8 +4620,11 @@ snapshots: dependencies: fetch-blob: 3.2.0 - fs-constants@1.0.0: - optional: true + fs-constants@1.0.0: {} + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 fs-monkey@1.0.6: optional: true @@ -4115,14 +4636,25 @@ snapshots: function-bind@1.1.2: {} + gauge@4.0.4: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + optional: true + get-nonce@1.0.1: {} get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 - github-from-package@0.0.0: - optional: true + github-from-package@0.0.0: {} glob-parent@5.1.2: dependencies: @@ -4140,6 +4672,16 @@ snapshots: minipass: 7.1.1 path-scurry: 1.11.0 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + optional: true + glob@8.1.0: dependencies: fs.realpath: 1.0.0 @@ -4155,13 +4697,54 @@ snapshots: lodash.throttle: 4.1.1 sisteransi: 1.0.5 + has-unicode@2.0.1: + optional: true + hasown@2.0.2: dependencies: function-bind: 1.1.2 heap@0.2.7: {} - ieee754@1.2.1: + http-cache-semantics@4.1.1: + optional: true + + http-proxy-agent@4.0.1: + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + optional: true + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + optional: true + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.2 + optional: true + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + ieee754@1.2.1: {} + + imurmurhash@0.1.4: + optional: true + + indent-string@4.0.0: + optional: true + + infer-owner@1.0.4: optional: true inflight@1.0.6: @@ -4171,8 +4754,7 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: - optional: true + ini@1.3.8: {} internmap@2.0.3: {} @@ -4180,6 +4762,12 @@ snapshots: dependencies: loose-envify: 1.4.0 + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + optional: true + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -4196,6 +4784,9 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-lambda@1.0.1: + optional: true + is-number@7.0.0: {} is-promise@2.2.2: {} @@ -4214,6 +4805,9 @@ snapshots: js-tokens@4.0.0: {} + jsbn@1.1.0: + optional: true + json-diff@0.9.0: dependencies: cli-color: 2.0.4 @@ -4249,6 +4843,11 @@ snapshots: lru-cache@10.2.2: {} + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + optional: true + lru-queue@0.1.0: dependencies: es5-ext: 0.10.64 @@ -4262,6 +4861,33 @@ snapshots: dependencies: react: 18.3.1 + luxon@3.5.0: {} + + make-error@1.3.6: {} + + make-fetch-happen@9.1.0: + dependencies: + agentkeepalive: 4.5.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.4 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + memfs-browser@3.5.10302: dependencies: memfs: 3.5.3 @@ -4290,11 +4916,15 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 - mimic-response@3.1.0: - optional: true + mimic-response@3.1.0: {} mini-svg-data-uri@1.4.4: {} + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + optional: true + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 @@ -4303,13 +4933,53 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimist@1.2.8: + minimist@1.2.8: {} + + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 optional: true + minipass-fetch@1.4.1: + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + optional: true + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + optional: true + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + minipass@7.1.1: {} - mkdirp-classic@0.5.3: - optional: true + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} ms@2.1.2: {} @@ -4321,7 +4991,9 @@ snapshots: nanoid@3.3.7: {} - napi-build-utils@1.0.2: + napi-build-utils@1.0.2: {} + + negotiator@0.6.4: optional: true next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -4359,7 +5031,8 @@ snapshots: node-abi@3.62.0: dependencies: semver: 7.6.2 - optional: true + + node-addon-api@7.1.1: {} node-domexception@1.0.0: {} @@ -4369,8 +5042,38 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-gyp@8.4.1: + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.6.2 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + optional: true + normalize-path@3.0.0: {} + npmlog@6.0.2: + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + optional: true + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -4389,6 +5092,14 @@ snapshots: '@node-rs/argon2': 1.7.0 '@node-rs/bcrypt': 1.9.0 + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + optional: true + + path-is-absolute@1.0.1: + optional: true + path-key@3.1.1: {} path-parse@1.0.7: {} @@ -4420,12 +5131,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.47): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: postcss: 8.4.47 + ts-node: 10.9.2(@types/node@20.16.11)(typescript@5.6.3) postcss-nested@6.0.1(postcss@8.4.47): dependencies: @@ -4465,10 +5177,18 @@ snapshots: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 + + promise-inflight@1.0.1: optional: true promise-limit@2.7.0: {} + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + optional: true + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -4479,7 +5199,6 @@ snapshots: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - optional: true queue-microtask@1.2.3: {} @@ -4489,7 +5208,6 @@ snapshots: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - optional: true react-day-picker@8.10.1(date-fns@3.6.0)(react@18.3.1): dependencies: @@ -4579,7 +5297,6 @@ snapshots: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - optional: true readdirp@3.6.0: dependencies: @@ -4614,20 +5331,32 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + retry@0.12.0: + optional: true + reusify@1.0.4: {} + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + optional: true + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.2.1: + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: optional: true scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - semver@7.6.2: + semver@7.6.2: {} + + set-blocking@2.0.0: optional: true shebang-command@2.0.0: @@ -4636,20 +5365,39 @@ snapshots: shebang-regex@3.0.0: {} + signal-exit@3.0.7: + optional: true + signal-exit@4.1.0: {} - simple-concat@1.0.1: - optional: true + simple-concat@1.0.1: {} simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - optional: true sisteransi@1.0.5: {} + smart-buffer@4.2.0: + optional: true + + socks-proxy-agent@6.2.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + optional: true + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + optional: true + sonner@1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -4666,6 +5414,28 @@ snapshots: source-map@0.6.1: {} + sprintf-js@1.1.3: + optional: true + + sqlite3@5.1.7: + dependencies: + bindings: 1.5.0 + node-addon-api: 7.1.1 + prebuild-install: 7.1.2 + tar: 6.2.1 + optionalDependencies: + node-gyp: 8.4.1 + transitivePeerDependencies: + - bluebird + - supports-color + + sqlite@5.1.1: {} + + ssri@8.0.1: + dependencies: + minipass: 3.3.6 + optional: true + streamsearch@1.1.0: {} string-width@4.2.3: @@ -4683,7 +5453,6 @@ snapshots: string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - optional: true strip-ansi@6.0.1: dependencies: @@ -4693,8 +5462,7 @@ snapshots: dependencies: ansi-regex: 6.0.1 - strip-json-comments@2.0.1: - optional: true + strip-json-comments@2.0.1: {} styled-jsx@5.1.1(react@18.3.1): dependencies: @@ -4723,11 +5491,11 @@ snapshots: tailwind-merge@2.5.3: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.13): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3))): dependencies: - tailwindcss: 3.4.13 + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)) - tailwindcss@3.4.13: + tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -4746,7 +5514,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3)) postcss-nested: 6.0.1(postcss@8.4.47) postcss-selector-parser: 6.0.16 resolve: 1.22.8 @@ -4760,7 +5528,6 @@ snapshots: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - optional: true tar-stream@2.2.0: dependencies: @@ -4769,7 +5536,15 @@ snapshots: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - optional: true + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 thenify-all@1.6.0: dependencies: @@ -4792,12 +5567,29 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.16.11 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.6.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + tslib@2.6.2: {} tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - optional: true type@2.7.2: {} @@ -4805,6 +5597,16 @@ snapshots: undici-types@6.19.8: {} + unique-filename@1.1.1: + dependencies: + unique-slug: 2.0.2 + optional: true + + unique-slug@2.0.2: + dependencies: + imurmurhash: 0.1.4 + optional: true + use-callback-ref@1.3.2(@types/react@18.3.11)(react@18.3.1): dependencies: react: 18.3.1 @@ -4830,6 +5632,10 @@ snapshots: util-deprecate@1.0.2: {} + uuid@11.0.2: {} + + v8-compile-cache-lib@3.0.1: {} + victory-vendor@36.9.2: dependencies: '@types/d3-array': 3.2.1 @@ -4853,6 +5659,11 @@ snapshots: dependencies: isexe: 2.0.0 + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + optional: true + wordwrap@1.0.0: {} wrap-ansi@7.0.0: @@ -4871,6 +5682,10 @@ snapshots: ws@8.18.0: {} + yallist@4.0.0: {} + yaml@2.4.2: {} + yn@3.1.1: {} + zod@3.23.8: {} diff --git a/packages/reservation-platform/scripts/generate-data.js b/packages/reservation-platform/scripts/generate-data.js new file mode 100644 index 0000000..2ee6c79 --- /dev/null +++ b/packages/reservation-platform/scripts/generate-data.js @@ -0,0 +1,384 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var sqlite3 = require("sqlite3"); +var faker_1 = require("@faker-js/faker"); +var lodash_1 = require("lodash"); +var luxon_1 = require("luxon"); +var sqlite_1 = require("sqlite"); +var uuid_1 = require("uuid"); +var dbPath = "./db/sqlite.db"; +// Configurations for test data generation +var startDate = luxon_1.DateTime.fromISO("2024-11-01"); +var endDate = luxon_1.DateTime.fromISO("2024-11-30"); +var holidays = []; // Example holidays +var existingJobs = []; +// Calendar week usage configs +var weekUsage = { + 44: { minJobs: 4, maxJobs: 6 }, + 45: { minJobs: 10, maxJobs: 15 }, + 46: { minJobs: 10, maxJobs: 15 }, + 47: { minJobs: 3, maxJobs: 5 }, + 48: { minJobs: 10, maxJobs: 15 }, +}; +var printerUsageBias = { + fastPrints: ["Printer A", "Printer B"], + largePrints: ["Printer C", "Printer D", "Printer E"], +}; +var initDB = function () { return __awaiter(void 0, void 0, void 0, function () { + return __generator(this, function (_a) { + console.log("Initializing database connection..."); + return [2 /*return*/, (0, sqlite_1.open)({ + filename: dbPath, + driver: sqlite3.Database, + })]; + }); +}); }; +var createUser = function (isPowerUser) { + if (isPowerUser === void 0) { isPowerUser = false; } + var name = [faker_1.faker.person.firstName(), faker_1.faker.person.lastName()]; + var user = { + id: (0, uuid_1.v4)(), + github_id: faker_1.faker.number.int(), + username: "".concat(name[0].slice(0, 2)).concat(name[1].slice(0, 6)).toUpperCase(), + displayName: "".concat(name[0], " ").concat(name[1]).toUpperCase(), + email: "".concat(name[0], ".").concat(name[1], "@mercedes-benz.com"), + role: (0, lodash_1.sample)(["user", "admin"]), + isPowerUser: isPowerUser, + }; + console.log("Created user:", user); + return user; +}; +var createPrinter = function () { + var printer = { + id: (0, uuid_1.v4)(), + name: "Printer ".concat(faker_1.faker.number.int({ max: 9 })), + description: faker_1.faker.lorem.sentence(), + status: (0, lodash_1.random)(0, 2), + }; + console.log("Created printer:", printer); + return printer; +}; +var isPrinterAvailable = function (printer, startAt, duration) { + var endAt = startAt + duration * 60 * 1000; // Convert minutes to milliseconds + return !existingJobs.some(function (job) { + var jobStart = job.startAt; + var jobEnd = job.startAt + job.durationInMinutes * 60 * 1000; + return (printer.id === job.printerId && + ((startAt >= jobStart && startAt < jobEnd) || + (endAt > jobStart && endAt <= jobEnd) || + (startAt <= jobStart && endAt >= jobEnd))); + }); +}; +var weightedSampleUser = function (users) { + var weights = users.map(function (user) { return (user.isPowerUser ? 3 : 1); }); + var weightedUsers = users.flatMap(function (user, index) { return Array(weights[index]).fill(user); }); + return (0, lodash_1.sample)(weightedUsers); +}; +var normalRandom = function (mean, stdDev) { + var u = 0; + var v = 0; + while (u === 0) + u = Math.random(); + while (v === 0) + v = Math.random(); + return mean + stdDev * Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v); +}; +var createPrintJob = function (users, printers, startAt) { + var user = weightedSampleUser(users); + var printer; + // Probabilistic determination for large prints + var isLargePrint = (0, lodash_1.random)(0, 100) < 30; // 30% chance for a large print + if (isLargePrint) { + printer = (0, lodash_1.sample)(printers.filter(function (p) { return printerUsageBias.largePrints.includes(p.name); })); + } + else { + printer = (0, lodash_1.sample)(printers.filter(function (p) { return printerUsageBias.fastPrints.includes(p.name); })); + } + if (!printer) { + printer = (0, lodash_1.sample)(printers); + } + // Variable duration for print jobs with realistic limits + var duration = Math.round(normalRandom(isLargePrint ? 240 : 75, 30)); + var minDuration = 15; + var maxDuration = isLargePrint ? 5760 : 3540; // Maximum duration of 96 hours or 59 minutes in minutes + if (isLargePrint) { + duration = Math.min(duration, maxDuration); + } + duration = Math.max(duration, minDuration); + duration = Math.min(duration, maxDuration); + // Ensure printer availability + if (!isPrinterAvailable(printer, startAt, duration)) { + console.log("Printer not available, skipping job creation."); + return null; + } + // Dynamic error probability based on printer status, duration, and other factors + var aborted = false; + var abortReason = null; + var baseErrorRate = Math.max(0, Math.min(5, 100)); // Ensure error rate is between 0% and 100% + var userErrorModifier = user.isPowerUser ? -2 : 2; // Power users make fewer errors + var timeErrorModifier = startAt >= luxon_1.DateTime.fromObject({ hour: 14 }).toMillis() && startAt <= luxon_1.DateTime.fromObject({ hour: 17 }).toMillis() + ? 1 + : 0; // More errors in the afternoon + var errorRate = baseErrorRate + userErrorModifier + timeErrorModifier; + if ((0, lodash_1.random)(0, 100) < Math.max(0, Math.min(errorRate, 100))) { + aborted = true; + abortReason = generateDynamicAbortReason(); + } + var printJob = { + id: (0, uuid_1.v4)(), + printerId: printer.id, + userId: user.id, + startAt: startAt, + durationInMinutes: duration, + comments: faker_1.faker.lorem.sentence(), + aborted: aborted, + abortReason: abortReason, + }; + console.log("Created print job:", printJob); + return printJob; +}; +var generateDynamicAbortReason = function () { + var reasons = [ + "Filament gerissen", + "Drucker überhitzt", + "Schichtversatz festgestellt", + "Düse verstopft", + "Kalibrierung fehlgeschlagen", + "E".concat((0, lodash_1.random)(500, 599)), + ]; + var reason = (0, lodash_1.sample)(reasons); + // Add typos to simulate human variability + if ((0, lodash_1.random)(0, 1)) { + reason = reason.replace("e", (0, lodash_1.random)(0, 1) ? "é" : "e"); + } + return reason; +}; +var generatePrintJobsForWeek = function (users, printers, weekNumber, +// biome-ignore lint/suspicious/noExplicitAny: +db, dryRun) { return __awaiter(void 0, void 0, void 0, function () { + var weekConfig, totalJobs, startOfWeek, jobsRemaining, day, dayDate, _i, printers_1, printer, jobsForDay, i, timeSlots, selectedSlot, startAt, printJob; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Generating print jobs for week ".concat(weekNumber, "...")); + weekConfig = weekUsage[weekNumber]; + totalJobs = (0, lodash_1.random)(weekConfig.minJobs, weekConfig.maxJobs); + startOfWeek = startDate.plus({ weeks: weekNumber - 44 }); + jobsRemaining = totalJobs; + day = 0; + _a.label = 1; + case 1: + if (!(day < 7)) return [3 /*break*/, 7]; + dayDate = startOfWeek.plus({ days: day }); + if (dayDate > endDate || jobsRemaining <= 0) + return [3 /*break*/, 7]; + if (holidays.includes(dayDate.toISODate()) || dayDate.weekday === 6 || dayDate.weekday === 7) { + console.log("Skipping holiday or weekend: ".concat(dayDate.toISODate())); + return [3 /*break*/, 6]; + } + // Update printer status to simulate maintenance or breakdowns + for (_i = 0, printers_1 = printers; _i < printers_1.length; _i++) { + printer = printers_1[_i]; + if ((0, lodash_1.random)(0, 100) < 5) { + // 5% chance per day that a printer goes out of service + printer.status = 2; // Status 2 means "out of service" + console.log("Printer ".concat(printer.name, " is out of service on ").concat(dayDate.toISODate())); + } + else if (printer.status === 2) { + printer.status = 0; // Printer becomes available again + } + } + jobsForDay = Math.min(jobsRemaining, (0, lodash_1.random)(1, 3)); + jobsRemaining -= jobsForDay; + console.log("Generating ".concat(jobsForDay, " print jobs for day ").concat(dayDate.toISODate(), "...")); + i = 0; + _a.label = 2; + case 2: + if (!(i < jobsForDay)) return [3 /*break*/, 6]; + timeSlots = [ + { hour: 7, minute: 0 }, + { hour: 11, minute: 0 }, + { hour: 13, minute: 0 }, + { hour: 15, minute: 0 }, + ]; + selectedSlot = (0, lodash_1.sample)(timeSlots); + startAt = luxon_1.DateTime.fromISO("".concat(dayDate.toISODate(), "T").concat(String(selectedSlot.hour).padStart(2, "0"), ":").concat(String(selectedSlot.minute + (0, lodash_1.random)(0, 30)).padStart(2, "0"), ":00")); + printJob = createPrintJob(users, printers, startAt.toMillis()); + if (!printJob) return [3 /*break*/, 5]; + if (!!dryRun) return [3 /*break*/, 4]; + return [4 /*yield*/, db.run("INSERT INTO printJob (id, printerId, userId, startAt, durationInMinutes, comments, aborted, abortReason)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)", [ + printJob.id, + printJob.printerId, + printJob.userId, + printJob.startAt, + printJob.durationInMinutes, + printJob.comments, + printJob.aborted ? 1 : 0, + printJob.abortReason, + ])]; + case 3: + _a.sent(); + _a.label = 4; + case 4: + existingJobs.push(printJob); + console.log("Inserted print job into database:", printJob.id); + console.log(JSON.stringify({ + event: "PrintJobCreated", + jobId: printJob.id, + printerId: printJob.printerId, + userId: printJob.userId, + startAt: new Date(printJob.startAt).toISOString(), + duration: printJob.durationInMinutes, + aborted: printJob.aborted, + })); + _a.label = 5; + case 5: + i++; + return [3 /*break*/, 2]; + case 6: + day++; + return [3 /*break*/, 1]; + case 7: return [2 /*return*/]; + } + }); +}); }; +var generateTestData = function () { + var args_1 = []; + for (var _i = 0; _i < arguments.length; _i++) { + args_1[_i] = arguments[_i]; + } + return __awaiter(void 0, __spreadArray([], args_1, true), void 0, function (dryRun) { + var db, users, printers, _a, users_1, user, _b, printers_2, printer, validateData, _c, _d, weekNumber; + if (dryRun === void 0) { dryRun = false; } + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + console.log("Starting test data generation..."); + return [4 /*yield*/, initDB()]; + case 1: + db = _e.sent(); + users = __spreadArray(__spreadArray([], Array.from({ length: 7 }, function () { return createUser(false); }), true), Array.from({ length: 3 }, function () { return createUser(true); }), true); + printers = Array.from({ length: 5 }, createPrinter); + if (!!dryRun) return [3 /*break*/, 9]; + _a = 0, users_1 = users; + _e.label = 2; + case 2: + if (!(_a < users_1.length)) return [3 /*break*/, 5]; + user = users_1[_a]; + return [4 /*yield*/, db.run("INSERT INTO user (id, github_id, name, displayName, email, role)\n VALUES (?, ?, ?, ?, ?, ?)", [user.id, user.github_id, user.username, user.displayName, user.email, user.role])]; + case 3: + _e.sent(); + console.log("Inserted user into database:", user.id); + _e.label = 4; + case 4: + _a++; + return [3 /*break*/, 2]; + case 5: + _b = 0, printers_2 = printers; + _e.label = 6; + case 6: + if (!(_b < printers_2.length)) return [3 /*break*/, 9]; + printer = printers_2[_b]; + return [4 /*yield*/, db.run("INSERT INTO printer (id, name, description, status)\n VALUES (?, ?, ?, ?)", [printer.id, printer.name, printer.description, printer.status])]; + case 7: + _e.sent(); + console.log("Inserted printer into database:", printer.id); + _e.label = 8; + case 8: + _b++; + return [3 /*break*/, 6]; + case 9: + validateData = function (printJobs, users, printers) { + var _loop_1 = function (job) { + var userExists = users.some(function (user) { return user.id === job.userId; }); + var printerExists = printers.some(function (printer) { return printer.id === job.printerId; }); + if (!userExists || !printerExists) { + console.error("Invalid job detected: ".concat(job.id)); + } + }; + for (var _i = 0, printJobs_1 = printJobs; _i < printJobs_1.length; _i++) { + var job = printJobs_1[_i]; + _loop_1(job); + } + }; + _c = 0, _d = Object.keys(weekUsage); + _e.label = 10; + case 10: + if (!(_c < _d.length)) return [3 /*break*/, 13]; + weekNumber = _d[_c]; + return [4 /*yield*/, generatePrintJobsForWeek(users, printers, Number.parseInt("".concat(weekNumber)), db, dryRun)]; + case 11: + _e.sent(); + console.log("======> \uD83D\uDCC5 Week ".concat(weekNumber)); + validateData(existingJobs, users, printers); + _e.label = 12; + case 12: + _c++; + return [3 /*break*/, 10]; + case 13: + if (!!dryRun) return [3 /*break*/, 15]; + return [4 /*yield*/, db.close()]; + case 14: + _e.sent(); + console.log("Database connection closed. Test data generation complete."); + return [3 /*break*/, 16]; + case 15: + console.log("Dry run complete. No data was written to the database."); + _e.label = 16; + case 16: return [2 /*return*/]; + } + }); + }); +}; +generateTestData(process.argv.includes("--dry-run")) + .then(function () { + console.log("Test data generation script finished."); +}) + .catch(function (err) { + console.error("Error generating test data:", err); +}); diff --git a/packages/reservation-platform/scripts/generate-data.ts b/packages/reservation-platform/scripts/generate-data.ts new file mode 100644 index 0000000..a65ab8a --- /dev/null +++ b/packages/reservation-platform/scripts/generate-data.ts @@ -0,0 +1,357 @@ +import * as sqlite3 from "sqlite3"; +type User = { + id: string; + github_id: number; + username: string; + displayName: string; + email: string; + role: string | undefined; + isPowerUser: boolean; +}; + +type Printer = { + id: string; + name: string; + description: string; + status: number; +}; + +type PrintJob = { + id: string; + printerId: string; + userId: string; + startAt: number; + durationInMinutes: number; + comments: string; + aborted: boolean; + abortReason: string | null; +}; + +import { faker } from "@faker-js/faker"; +import { random, sample } from "lodash"; +import { DateTime } from "luxon"; +import { open } from "sqlite"; +import { v4 as uuidv4 } from "uuid"; + +const dbPath = "./db/sqlite.db"; + +// Configurations for test data generation +const startDate = DateTime.fromISO("2024-11-01"); +const endDate = DateTime.fromISO("2024-11-30"); +const holidays: string[] = []; // Example holidays + +const existingJobs: PrintJob[] = []; + +// Calendar week usage configs +const weekUsage = { + 44: { minJobs: 4, maxJobs: 6 }, + 45: { minJobs: 10, maxJobs: 15 }, + 46: { minJobs: 10, maxJobs: 15 }, + 47: { minJobs: 3, maxJobs: 5 }, + 48: { minJobs: 10, maxJobs: 15 }, +}; + +const printerUsageBias = { + fastPrints: ["Printer A", "Printer B"], + largePrints: ["Printer C", "Printer D", "Printer E"], +}; + +const initDB = async () => { + console.log("Initializing database connection..."); + return open({ + filename: dbPath, + driver: sqlite3.Database, + }); +}; + +const createUser = (isPowerUser = false): User => { + const name = [faker.person.firstName(), faker.person.lastName()]; + + const user = { + id: uuidv4(), + github_id: faker.number.int(), + username: `${name[0].slice(0, 2)}${name[1].slice(0, 6)}`.toUpperCase(), + displayName: `${name[0]} ${name[1]}`.toUpperCase(), + email: `${name[0]}.${name[1]}@mercedes-benz.com`, + role: sample(["user", "admin"]), + isPowerUser, + }; + console.log("Created user:", user); + return user; +}; + +const createPrinter = (): Printer => { + const printer = { + id: uuidv4(), + name: `Printer ${faker.number.int({ max: 9 })}`, + description: faker.lorem.sentence(), + status: random(0, 2), + }; + console.log("Created printer:", printer); + return printer; +}; + +const isPrinterAvailable = (printer: Printer, startAt: number, duration: number): boolean => { + const endAt = startAt + duration * 60 * 1000; // Convert minutes to milliseconds + return !existingJobs.some((job) => { + const jobStart = job.startAt; + const jobEnd = job.startAt + job.durationInMinutes * 60 * 1000; + return ( + printer.id === job.printerId && + ((startAt >= jobStart && startAt < jobEnd) || + (endAt > jobStart && endAt <= jobEnd) || + (startAt <= jobStart && endAt >= jobEnd)) + ); + }); +}; + +const weightedSampleUser = (users: User[]): User | undefined => { + const weights = users.map((user) => (user.isPowerUser ? 3 : 1)); + const weightedUsers = users.flatMap((user, index) => Array(weights[index]).fill(user)); + return sample(weightedUsers); +}; + +const normalRandom = (mean: number, stdDev: number): number => { + let u = 0; + let v = 0; + while (u === 0) u = Math.random(); + while (v === 0) v = Math.random(); + return mean + stdDev * Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v); +}; + +const createPrintJob = (users: User[], printers: Printer[], startAt: number): PrintJob | null => { + const user = weightedSampleUser(users) as User; + let printer: Printer; + + // Probabilistic determination for large prints + const isLargePrint = random(0, 100) < 30; // 30% chance for a large print + + if (isLargePrint) { + printer = sample(printers.filter((p) => printerUsageBias.largePrints.includes(p.name))) as Printer; + } else { + printer = sample(printers.filter((p) => printerUsageBias.fastPrints.includes(p.name))) as Printer; + } + + if (!printer) { + printer = sample(printers) as Printer; + } + + // Variable duration for print jobs with realistic limits + let duration = Math.round(normalRandom(isLargePrint ? 240 : 75, 30)); + const minDuration = 15; + const maxDuration = isLargePrint ? 5760 : 3540; // Maximum duration of 96 hours or 59 minutes in minutes + if (isLargePrint) { + duration = Math.min(duration, maxDuration); + } + duration = Math.max(duration, minDuration); + duration = Math.min(duration, maxDuration); + + // Ensure printer availability + if (!isPrinterAvailable(printer, startAt, duration)) { + console.log("Printer not available, skipping job creation."); + return null; + } + + // Dynamic error probability based on printer status, duration, and other factors + let aborted = false; + let abortReason = null; + const baseErrorRate = Math.max(0, Math.min(5, 100)); // Ensure error rate is between 0% and 100% + const userErrorModifier = user.isPowerUser ? -2 : 2; // Power users make fewer errors + const timeErrorModifier = + startAt >= DateTime.fromObject({ hour: 14 }).toMillis() && startAt <= DateTime.fromObject({ hour: 17 }).toMillis() + ? 1 + : 0; // More errors in the afternoon + const errorRate = baseErrorRate + userErrorModifier + timeErrorModifier; + + if (random(0, 100) < Math.max(0, Math.min(errorRate, 100))) { + aborted = true; + abortReason = generateDynamicAbortReason(); + } + + const printJob = { + id: uuidv4(), + printerId: printer.id, + userId: user.id, + startAt, + durationInMinutes: duration, + comments: faker.lorem.sentence(), + aborted, + abortReason, + }; + console.log("Created print job:", printJob); + return printJob; +}; + +const generateDynamicAbortReason = (): string => { + const reasons = [ + "Filament gerissen", + "Drucker überhitzt", + "Schichtversatz festgestellt", + "Düse verstopft", + "Kalibrierung fehlgeschlagen", + `E${random(500, 599)}`, // Error codes + ]; + let reason = sample(reasons) as string; + + // Add typos to simulate human variability + if (random(0, 1)) { + reason = reason.replace("e", random(0, 1) ? "é" : "e"); + } + return reason; +}; + +const generatePrintJobsForWeek = async ( + users: User[], + printers: Printer[], + weekNumber: number, + // biome-ignore lint/suspicious/noExplicitAny: + db: any, + dryRun: boolean, +) => { + console.log(`Generating print jobs for week ${weekNumber}...`); + const weekConfig = weekUsage[weekNumber as keyof typeof weekUsage]; + const totalJobs = random(weekConfig.minJobs, weekConfig.maxJobs); + const startOfWeek = startDate.plus({ weeks: weekNumber - 44 }); + + let jobsRemaining = totalJobs; + for (let day = 0; day < 7; day++) { + const dayDate = startOfWeek.plus({ days: day }); + if (dayDate > endDate || jobsRemaining <= 0) break; + + if (holidays.includes(dayDate.toISODate() as string) || dayDate.weekday === 6 || dayDate.weekday === 7) { + console.log(`Skipping holiday or weekend: ${dayDate.toISODate()}`); + continue; + } + + // Update printer status to simulate maintenance or breakdowns + for (const printer of printers) { + if (random(0, 100) < 5) { + // 5% chance per day that a printer goes out of service + printer.status = 2; // Status 2 means "out of service" + console.log(`Printer ${printer.name} is out of service on ${dayDate.toISODate()}`); + } else if (printer.status === 2) { + printer.status = 0; // Printer becomes available again + } + } + + const jobsForDay = Math.min(jobsRemaining, random(1, 3)); + jobsRemaining -= jobsForDay; + + console.log(`Generating ${jobsForDay} print jobs for day ${dayDate.toISODate()}...`); + for (let i = 0; i < jobsForDay; i++) { + // Simulate peak usage in the morning and after lunch + const timeSlots = [ + { hour: 7, minute: 0 }, + { hour: 11, minute: 0 }, + { hour: 13, minute: 0 }, + { hour: 15, minute: 0 }, + ]; + const selectedSlot = sample(timeSlots) as { + hour: number; + minute: number; + }; + const startAt = DateTime.fromISO( + `${dayDate.toISODate()}T${String(selectedSlot.hour).padStart(2, "0")}:${String(selectedSlot.minute + random(0, 30)).padStart(2, "0")}:00`, + ); + + const printJob = createPrintJob(users, printers, startAt.toMillis()); + if (printJob) { + if (!dryRun) { + await db.run( + `INSERT INTO printJob (id, printerId, userId, startAt, durationInMinutes, comments, aborted, abortReason) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, + [ + printJob.id, + printJob.printerId, + printJob.userId, + printJob.startAt, + printJob.durationInMinutes, + printJob.comments, + printJob.aborted ? 1 : 0, + printJob.abortReason, + ], + ); + } + existingJobs.push(printJob); + console.log("Inserted print job into database:", printJob.id); + console.log( + JSON.stringify({ + event: "PrintJobCreated", + jobId: printJob.id, + printerId: printJob.printerId, + userId: printJob.userId, + startAt: new Date(printJob.startAt).toISOString(), + duration: printJob.durationInMinutes, + aborted: printJob.aborted, + }), + ); + } + } + } +}; + +const generateTestData = async (dryRun = false): Promise => { + console.log("Starting test data generation..."); + const db = await initDB(); + + // Generate users and printers + const users = [ + ...Array.from({ length: 7 }, () => createUser(false)), + ...Array.from({ length: 3 }, () => createUser(true)), + ]; + const printers = Array.from({ length: 5 }, createPrinter); + + if (!dryRun) { + // Insert users into the database + for (const user of users) { + await db.run( + `INSERT INTO user (id, github_id, name, displayName, email, role) + VALUES (?, ?, ?, ?, ?, ?)`, + [user.id, user.github_id, user.username, user.displayName, user.email, user.role], + ); + console.log("Inserted user into database:", user.id); + } + + // Insert printers into the database + for (const printer of printers) { + await db.run( + `INSERT INTO printer (id, name, description, status) + VALUES (?, ?, ?, ?)`, + [printer.id, printer.name, printer.description, printer.status], + ); + console.log("Inserted printer into database:", printer.id); + } + } + + const validateData = (printJobs: PrintJob[], users: User[], printers: Printer[]): void => { + for (const job of printJobs) { + const userExists = users.some((user) => user.id === job.userId); + const printerExists = printers.some((printer) => printer.id === job.printerId); + if (!userExists || !printerExists) { + console.error(`Invalid job detected: ${job.id}`); + } + } + }; + + // Generate print jobs for each week + for (const weekNumber of Object.keys(weekUsage) as unknown as number[]) { + await generatePrintJobsForWeek(users, printers, Number.parseInt(`${weekNumber}`), db, dryRun); + console.log(`======> 📅 Week ${weekNumber}`); + validateData(existingJobs, users, printers); + } + + if (!dryRun) { + await db.close(); + console.log("Database connection closed. Test data generation complete."); + } else { + console.log("Dry run complete. No data was written to the database."); + } +}; + +generateTestData(process.argv.includes("--dry-run")) + .then(() => { + console.log("Test data generation script finished."); + }) + .catch((err) => { + console.error("Error generating test data:", err); + });