diff --git a/.eslintrc.json b/.eslintrc.json index dd8d795..bf919bc 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,5 +4,8 @@ "node": true }, "plugins": ["solid"], - "extends": ["eslint:recommended", "plugin:solid/typescript"] + "extends": [ + "plugin:@typescript-eslint/recommended", + "plugin:solid/typescript" + ] } diff --git a/package.json b/package.json index 50c6174..369f0a5 100644 --- a/package.json +++ b/package.json @@ -23,31 +23,36 @@ "@lucia-auth/adapter-drizzle": "^1.0.2", "@paralleldrive/cuid2": "^2.2.2", "@solidjs/meta": "^0.29.3", - "@solidjs/router": "^0.12.3", - "@solidjs/start": "^0.5.9", - "arctic": "^1.1.6", - "drizzle-orm": "^0.29.3", + "@solidjs/router": "^0.12.4", + "@solidjs/start": "^0.5.10", + "arctic": "^1.2.0", + "drizzle-orm": "^0.29.4", + "http-status": "^1.7.4", + "json-stable-stringify": "^1.1.1", "lucia": "^3.0.1", "moment-timezone": "^0.5.45", - "openapi-fetch": "^0.9.1", + "object-hash": "^3.0.0", + "openapi-fetch": "^0.9.2", "postgres": "^3.4.3", "solid-js": "^1.8.15", "vinxi": "^0.3.3" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^7.0.1", - "dotenv": "^16.4.4", + "@types/json-stable-stringify": "^1.0.36", + "@types/object-hash": "^3.0.6", + "@typescript-eslint/eslint-plugin": "^7.0.2", + "dotenv": "^16.4.5", "drizzle-kit": "^0.20.14", "drizzle-zod": "^0.5.1", - "eslint": "^8.56.0", + "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-solid": "^0.13.1", - "h3": "^1.10.1", + "h3": "^1.10.2", "openapi-typescript": "^6.7.4", "pg": "^8.11.3", "prettier": "^3.2.5", "prettier-plugin-organize-imports": "^3.2.4", - "sass": "^1.71.0", + "sass": "^1.71.1", "typescript": "^5.3.3", "zod": "3.22.4" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0860245..ae2aebf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,26 +36,35 @@ dependencies: specifier: ^0.29.3 version: 0.29.3(solid-js@1.8.15) '@solidjs/router': - specifier: ^0.12.3 - version: 0.12.3(solid-js@1.8.15) + specifier: ^0.12.4 + version: 0.12.4(solid-js@1.8.15) '@solidjs/start': - specifier: ^0.5.9 - version: 0.5.9(solid-js@1.8.15)(vinxi@0.3.3)(vite@5.1.3) + specifier: ^0.5.10 + version: 0.5.10(solid-js@1.8.15)(vinxi@0.3.3)(vite@5.1.4) arctic: - specifier: ^1.1.6 - version: 1.1.6 + specifier: ^1.2.0 + version: 1.2.0 drizzle-orm: - specifier: ^0.29.3 - version: 0.29.3(pg@8.11.3)(postgres@3.4.3) + specifier: ^0.29.4 + version: 0.29.4(pg@8.11.3)(postgres@3.4.3) + http-status: + specifier: ^1.7.4 + version: 1.7.4 + json-stable-stringify: + specifier: ^1.1.1 + version: 1.1.1 lucia: specifier: ^3.0.1 version: 3.0.1 moment-timezone: specifier: ^0.5.45 version: 0.5.45 + object-hash: + specifier: ^3.0.0 + version: 3.0.0 openapi-fetch: - specifier: ^0.9.1 - version: 0.9.1 + specifier: ^0.9.2 + version: 0.9.2 postgres: specifier: ^3.4.3 version: 3.4.3 @@ -64,33 +73,39 @@ dependencies: version: 1.8.15 vinxi: specifier: ^0.3.3 - version: 0.3.3(preact@10.19.5)(sass@1.71.0) + version: 0.3.3(preact@10.19.6)(sass@1.71.1) devDependencies: + '@types/json-stable-stringify': + specifier: ^1.0.36 + version: 1.0.36 + '@types/object-hash': + specifier: ^3.0.6 + version: 3.0.6 '@typescript-eslint/eslint-plugin': - specifier: ^7.0.1 - version: 7.0.1(@typescript-eslint/parser@7.0.1)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^7.0.2 + version: 7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.57.0)(typescript@5.3.3) dotenv: - specifier: ^16.4.4 - version: 16.4.4 + specifier: ^16.4.5 + version: 16.4.5 drizzle-kit: specifier: ^0.20.14 version: 0.20.14 drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) + version: 0.5.1(drizzle-orm@0.29.4)(zod@3.22.4) eslint: - specifier: ^8.56.0 - version: 8.56.0 + specifier: ^8.57.0 + version: 8.57.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.56.0) + version: 9.1.0(eslint@8.57.0) eslint-plugin-solid: specifier: ^0.13.1 - version: 0.13.1(eslint@8.56.0)(typescript@5.3.3) + version: 0.13.1(eslint@8.57.0)(typescript@5.3.3) h3: - specifier: ^1.10.1 - version: 1.10.1 + specifier: ^1.10.2 + version: 1.10.2 openapi-typescript: specifier: ^6.7.4 version: 6.7.4 @@ -104,8 +119,8 @@ devDependencies: specifier: ^3.2.4 version: 3.2.4(prettier@3.2.5)(typescript@5.3.3) sass: - specifier: ^1.71.0 - version: 1.71.0 + specifier: ^1.71.1 + version: 1.71.1 typescript: specifier: ^5.3.3 version: 5.3.3 @@ -138,8 +153,8 @@ packages: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/gen-mapping': 0.3.4 + '@jridgewell/trace-mapping': 0.3.23 dev: false /@antfu/utils@0.7.7: @@ -187,8 +202,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/gen-mapping': 0.3.4 + '@jridgewell/trace-mapping': 0.3.23 jsesc: 2.5.2 dev: false @@ -315,7 +330,6 @@ packages: /@babel/parser@7.23.9: resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} - hasBin: true dependencies: '@babel/types': 7.23.9 dev: false @@ -813,13 +827,13 @@ packages: requiresBuild: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.56.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 dev: true @@ -845,8 +859,8 @@ packages: - supports-color dev: true - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -940,13 +954,13 @@ packages: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + /@jridgewell/gen-mapping@0.3.4: + resolution: {integrity: sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.23 dev: false /@jridgewell/resolve-uri@3.1.2: @@ -962,16 +976,16 @@ packages: /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/gen-mapping': 0.3.4 + '@jridgewell/trace-mapping': 0.3.23 dev: false /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: false - /@jridgewell/trace-mapping@0.3.22: - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + /@jridgewell/trace-mapping@0.3.23: + resolution: {integrity: sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==} dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 @@ -987,7 +1001,6 @@ packages: /@mapbox/node-pre-gyp@1.0.11: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true dependencies: detect-libc: 2.0.2 https-proxy-agent: 5.0.1 @@ -1656,8 +1669,8 @@ packages: '@noble/hashes': 1.3.3 dev: false - /@parcel/watcher-android-arm64@2.4.0: - resolution: {integrity: sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==} + /@parcel/watcher-android-arm64@2.4.1: + resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] @@ -1665,8 +1678,8 @@ packages: dev: false optional: true - /@parcel/watcher-darwin-arm64@2.4.0: - resolution: {integrity: sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==} + /@parcel/watcher-darwin-arm64@2.4.1: + resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] @@ -1674,8 +1687,8 @@ packages: dev: false optional: true - /@parcel/watcher-darwin-x64@2.4.0: - resolution: {integrity: sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==} + /@parcel/watcher-darwin-x64@2.4.1: + resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] @@ -1683,8 +1696,8 @@ packages: dev: false optional: true - /@parcel/watcher-freebsd-x64@2.4.0: - resolution: {integrity: sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==} + /@parcel/watcher-freebsd-x64@2.4.1: + resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] @@ -1692,8 +1705,8 @@ packages: dev: false optional: true - /@parcel/watcher-linux-arm-glibc@2.4.0: - resolution: {integrity: sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==} + /@parcel/watcher-linux-arm-glibc@2.4.1: + resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] @@ -1701,8 +1714,8 @@ packages: dev: false optional: true - /@parcel/watcher-linux-arm64-glibc@2.4.0: - resolution: {integrity: sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==} + /@parcel/watcher-linux-arm64-glibc@2.4.1: + resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] @@ -1710,8 +1723,8 @@ packages: dev: false optional: true - /@parcel/watcher-linux-arm64-musl@2.4.0: - resolution: {integrity: sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==} + /@parcel/watcher-linux-arm64-musl@2.4.1: + resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] @@ -1719,8 +1732,8 @@ packages: dev: false optional: true - /@parcel/watcher-linux-x64-glibc@2.4.0: - resolution: {integrity: sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==} + /@parcel/watcher-linux-x64-glibc@2.4.1: + resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] @@ -1728,8 +1741,8 @@ packages: dev: false optional: true - /@parcel/watcher-linux-x64-musl@2.4.0: - resolution: {integrity: sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==} + /@parcel/watcher-linux-x64-musl@2.4.1: + resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] @@ -1757,8 +1770,8 @@ packages: bundledDependencies: - napi-wasm - /@parcel/watcher-win32-arm64@2.4.0: - resolution: {integrity: sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==} + /@parcel/watcher-win32-arm64@2.4.1: + resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] @@ -1766,8 +1779,8 @@ packages: dev: false optional: true - /@parcel/watcher-win32-ia32@2.4.0: - resolution: {integrity: sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==} + /@parcel/watcher-win32-ia32@2.4.1: + resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] @@ -1775,8 +1788,8 @@ packages: dev: false optional: true - /@parcel/watcher-win32-x64@2.4.0: - resolution: {integrity: sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==} + /@parcel/watcher-win32-x64@2.4.1: + resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] @@ -1784,8 +1797,8 @@ packages: dev: false optional: true - /@parcel/watcher@2.4.0: - resolution: {integrity: sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==} + /@parcel/watcher@2.4.1: + resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} engines: {node: '>= 10.0.0'} dependencies: detect-libc: 1.0.3 @@ -1793,25 +1806,25 @@ packages: micromatch: 4.0.5 node-addon-api: 7.1.0 optionalDependencies: - '@parcel/watcher-android-arm64': 2.4.0 - '@parcel/watcher-darwin-arm64': 2.4.0 - '@parcel/watcher-darwin-x64': 2.4.0 - '@parcel/watcher-freebsd-x64': 2.4.0 - '@parcel/watcher-linux-arm-glibc': 2.4.0 - '@parcel/watcher-linux-arm64-glibc': 2.4.0 - '@parcel/watcher-linux-arm64-musl': 2.4.0 - '@parcel/watcher-linux-x64-glibc': 2.4.0 - '@parcel/watcher-linux-x64-musl': 2.4.0 - '@parcel/watcher-win32-arm64': 2.4.0 - '@parcel/watcher-win32-ia32': 2.4.0 - '@parcel/watcher-win32-x64': 2.4.0 + '@parcel/watcher-android-arm64': 2.4.1 + '@parcel/watcher-darwin-arm64': 2.4.1 + '@parcel/watcher-darwin-x64': 2.4.1 + '@parcel/watcher-freebsd-x64': 2.4.1 + '@parcel/watcher-linux-arm-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-musl': 2.4.1 + '@parcel/watcher-linux-x64-glibc': 2.4.1 + '@parcel/watcher-linux-x64-musl': 2.4.1 + '@parcel/watcher-win32-arm64': 2.4.1 + '@parcel/watcher-win32-ia32': 2.4.1 + '@parcel/watcher-win32-x64': 2.4.1 dev: false /@polka/url@1.0.0-next.24: resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} dev: false - /@preact/preset-vite@2.8.1(@babel/core@7.23.9)(preact@10.19.5)(vite@5.1.1): + /@preact/preset-vite@2.8.1(@babel/core@7.23.9)(preact@10.19.6)(vite@5.1.1): resolution: {integrity: sha512-a9KV4opdj17X2gOFuGup0aE+sXYABX/tJi/QDptOrleX4FlnoZgDWvz45tHOdVfrZX+3uvVsIYPHxRsTerkDNA==} peerDependencies: '@babel/core': 7.x @@ -1820,7 +1833,7 @@ packages: '@babel/core': 7.23.9 '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.9) - '@prefresh/vite': 2.4.5(preact@10.19.5)(vite@5.1.1) + '@prefresh/vite': 2.4.5(preact@10.19.6)(vite@5.1.1) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.23.9) debug: 4.3.4 @@ -1828,7 +1841,7 @@ packages: magic-string: 0.30.5 node-html-parser: 6.1.12 resolve: 1.22.8 - vite: 5.1.1(sass@1.71.0) + vite: 5.1.1(sass@1.71.1) transitivePeerDependencies: - preact - supports-color @@ -1838,19 +1851,19 @@ packages: resolution: {integrity: sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==} dev: false - /@prefresh/core@1.5.2(preact@10.19.5): + /@prefresh/core@1.5.2(preact@10.19.6): resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==} peerDependencies: preact: ^10.0.0 dependencies: - preact: 10.19.5 + preact: 10.19.6 dev: false /@prefresh/utils@1.2.0: resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==} dev: false - /@prefresh/vite@2.4.5(preact@10.19.5)(vite@5.1.1): + /@prefresh/vite@2.4.5(preact@10.19.6)(vite@5.1.1): resolution: {integrity: sha512-iForDVJ2M8gQYnm5pHumvTEJjGGc7YNYC0GVKnHFL+GvFfKHfH9Rpq67nUAzNbjuLEpqEOUuQVQajMazWu2ZNQ==} peerDependencies: preact: ^10.4.0 @@ -1858,11 +1871,11 @@ packages: dependencies: '@babel/core': 7.23.9 '@prefresh/babel-plugin': 0.5.1 - '@prefresh/core': 1.5.2(preact@10.19.5) + '@prefresh/core': 1.5.2(preact@10.19.6) '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 - preact: 10.19.5 - vite: 5.1.1(sass@1.71.0) + preact: 10.19.6 + vite: 5.1.1(sass@1.71.1) transitivePeerDependencies: - supports-color dev: false @@ -1970,7 +1983,7 @@ packages: rollup: 4.12.0 serialize-javascript: 6.0.2 smob: 1.4.1 - terser: 5.27.1 + terser: 5.28.1 dev: false /@rollup/plugin-wasm@6.2.2(rollup@4.12.0): @@ -2113,8 +2126,8 @@ packages: dev: false optional: true - /@sindresorhus/merge-streams@2.2.1: - resolution: {integrity: sha512-255V7MMIKw6aQ43Wbqp9HZ+VHn6acddERTLiiLnlcPLU9PdTq9Aijl12oklAgUEblLWye+vHLzmqBx6f2TGcZw==} + /@sindresorhus/merge-streams@2.3.0: + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} dev: false @@ -2126,8 +2139,8 @@ packages: solid-js: 1.8.15 dev: false - /@solidjs/router@0.12.3(solid-js@1.8.15): - resolution: {integrity: sha512-s5HunmOt5BXt514kHD9aDbiQ6la33297h9XKUGuMKpzJD1wgXhWTm+HmtG3SXirRfGc0UJ3yDDhNoAD8b2Om1w==} + /@solidjs/router@0.12.4(solid-js@1.8.15): + resolution: {integrity: sha512-2S5QWYmpWSIWn5ei85eoStEMmECERX2BiBkEvmqYDrgX79I8D95YaWVdHbcFGOxISPTY4TP7RxjRiofs/AIFJQ==} peerDependencies: solid-js: ^1.8.6 dependencies: @@ -2142,8 +2155,8 @@ packages: solid-js: 1.8.15 dev: false - /@solidjs/start@0.5.9(solid-js@1.8.15)(vinxi@0.3.3)(vite@5.1.3): - resolution: {integrity: sha512-NNDmre4EYPQ6ZklfFZl1s4uvmGhsC61CMkOxcdfWS3+KAS0GpF52my7IztApKw4h+adLFbBy3qkF7qi8aCfcjw==} + /@solidjs/start@0.5.10(solid-js@1.8.15)(vinxi@0.3.3)(vite@5.1.4): + resolution: {integrity: sha512-hAZ5V9gwo6YBrfk6dzOTKTFyx3KebK2a5nZNcQ3HAUSeRs89cEPxvATnMe0Qh2Vea/PCssqodb0jWbPAnlUp3Q==} dependencies: '@vinxi/plugin-directives': 0.2.0(vinxi@0.3.3) '@vinxi/server-components': 0.2.0(vinxi@0.3.3) @@ -2157,8 +2170,8 @@ packages: shikiji: 0.9.19 source-map-js: 1.0.2 terracotta: 1.0.5(solid-js@1.8.15) - vite-plugin-inspect: 0.7.42(vite@5.1.3) - vite-plugin-solid: 2.9.1(solid-js@1.8.15)(vite@5.1.3) + vite-plugin-inspect: 0.7.42(vite@5.1.4) + vite-plugin-solid: 2.9.1(solid-js@1.8.15)(vite@5.1.4) transitivePeerDependencies: - '@nuxt/kit' - '@testing-library/jest-dom' @@ -2221,13 +2234,17 @@ packages: /@types/http-proxy@1.17.14: resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} dependencies: - '@types/node': 20.11.19 + '@types/node': 20.11.20 dev: false /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true + /@types/json-stable-stringify@1.0.36: + resolution: {integrity: sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==} + dev: true + /@types/micromatch@4.0.6: resolution: {integrity: sha512-2eulCHWqjEpk9/vyic4tBhI8a9qQEl6DaK2n/sF7TweX9YESlypgKyhXMDGt4DAOy/jhLPvVrZc8pTDAMsplJA==} dependencies: @@ -2238,12 +2255,16 @@ packages: resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} dev: false - /@types/node@20.11.19: - resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} + /@types/node@20.11.20: + resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==} dependencies: undici-types: 5.26.5 dev: false + /@types/object-hash@3.0.6: + resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==} + dev: true + /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: false @@ -2257,17 +2278,17 @@ packages: dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 20.11.19 + '@types/node': 20.11.20 dev: false /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 20.11.19 + '@types/node': 20.11.20 dev: false - /@typescript-eslint/eslint-plugin@7.0.1(@typescript-eslint/parser@7.0.1)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-OLvgeBv3vXlnnJGIAgCLYKjgMEU+wBGj07MQ/nxAaON+3mLzX7mJbhRYrVGiVvFiXtwFlkcBa/TtmglHy0UbzQ==} + /@typescript-eslint/eslint-plugin@7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -2278,13 +2299,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.0.1(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 7.0.1 - '@typescript-eslint/type-utils': 7.0.1(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 7.0.1(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 7.0.1 + '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 7.0.2 + '@typescript-eslint/type-utils': 7.0.2(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 7.0.2(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.0.2 debug: 4.3.4 - eslint: 8.56.0 + eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -2295,8 +2316,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.0.1(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-8GcRRZNzaHxKzBPU3tKtFNing571/GwPBeCvmAUw0yBtfE2XVd0zFKJIMSWkHJcPQi0ekxjIts6L/rrZq5cxGQ==} + /@typescript-eslint/parser@7.0.2(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^8.56.0 @@ -2305,12 +2326,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.0.1 - '@typescript-eslint/types': 7.0.1 - '@typescript-eslint/typescript-estree': 7.0.1(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 7.0.1 + '@typescript-eslint/scope-manager': 7.0.2 + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.0.2 debug: 4.3.4 - eslint: 8.56.0 + eslint: 8.57.0 typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -2324,16 +2345,16 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/scope-manager@7.0.1: - resolution: {integrity: sha512-v7/T7As10g3bcWOOPAcbnMDuvctHzCFYCG/8R4bK4iYzdFqsZTbXGln0cZNVcwQcwewsYU2BJLay8j0/4zOk4w==} + /@typescript-eslint/scope-manager@7.0.2: + resolution: {integrity: sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 7.0.1 - '@typescript-eslint/visitor-keys': 7.0.1 + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/visitor-keys': 7.0.2 dev: true - /@typescript-eslint/type-utils@7.0.1(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-YtT9UcstTG5Yqy4xtLiClm1ZpM/pWVGFnkAa90UfdkkZsR1eP2mR/1jbHeYp8Ay1l1JHPyGvoUYR6o3On5Nhmw==} + /@typescript-eslint/type-utils@7.0.2(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^8.56.0 @@ -2342,10 +2363,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.0.1(typescript@5.3.3) - '@typescript-eslint/utils': 7.0.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) + '@typescript-eslint/utils': 7.0.2(eslint@8.57.0)(typescript@5.3.3) debug: 4.3.4 - eslint: 8.56.0 + eslint: 8.57.0 ts-api-utils: 1.2.1(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -2357,8 +2378,8 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@7.0.1: - resolution: {integrity: sha512-uJDfmirz4FHib6ENju/7cz9SdMSkeVvJDK3VcMFvf/hAShg8C74FW+06MaQPODHfDJp/z/zHfgawIJRjlu0RLg==} + /@typescript-eslint/types@7.0.2: + resolution: {integrity: sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==} engines: {node: ^16.0.0 || >=18.0.0} dev: true @@ -2384,8 +2405,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.0.1(typescript@5.3.3): - resolution: {integrity: sha512-SO9wHb6ph0/FN5OJxH4MiPscGah5wjOd0RRpaLvuBv9g8565Fgu0uMySFEPqwPHiQU90yzJ2FjRYKGrAhS1xig==} + /@typescript-eslint/typescript-estree@7.0.2(typescript@5.3.3): + resolution: {integrity: sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -2393,8 +2414,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.0.1 - '@typescript-eslint/visitor-keys': 7.0.1 + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/visitor-keys': 7.0.2 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2406,38 +2427,38 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.3.3): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.7 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - eslint: 8.56.0 + eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@7.0.1(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-oe4his30JgPbnv+9Vef1h48jm0S6ft4mNwi9wj7bX10joGn07QRfqIqFHoMiajrtoU88cIhXf8ahwgrcbNLgPA==} + /@typescript-eslint/utils@7.0.2(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^8.56.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.7 - '@typescript-eslint/scope-manager': 7.0.1 - '@typescript-eslint/types': 7.0.1 - '@typescript-eslint/typescript-estree': 7.0.1(typescript@5.3.3) - eslint: 8.56.0 + '@typescript-eslint/scope-manager': 7.0.2 + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) + eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: - supports-color @@ -2452,11 +2473,11 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.0.1: - resolution: {integrity: sha512-hwAgrOyk++RTXrP4KzCg7zB2U0xt7RUU0ZdMSCsqF3eKUwkdXUMyTb0qdCuji7VIbcpG62kKTU9M1J1c9UpFBw==} + /@typescript-eslint/visitor-keys@7.0.2: + resolution: {integrity: sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 7.0.1 + '@typescript-eslint/types': 7.0.2 eslint-visitor-keys: 3.4.3 dev: true @@ -2467,7 +2488,6 @@ packages: /@vercel/nft@0.24.4: resolution: {integrity: sha512-KjYAZty7boH5fi5udp6p+lNu6nawgs++pHW+3koErMgbRkkHuToGX/FwjN5clV1FcaM3udfd4zW/sUapkMgpZw==} engines: {node: '>=16'} - hasBin: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 '@rollup/pluginutils': 4.2.1 @@ -2485,12 +2505,12 @@ packages: - supports-color dev: false - /@vinxi/devtools@0.2.0(@babel/core@7.23.9)(preact@10.19.5)(vite@5.1.1): + /@vinxi/devtools@0.2.0(@babel/core@7.23.9)(preact@10.19.6)(vite@5.1.1): resolution: {integrity: sha512-LpQp5zbiBhV4eo2w6AiJFtpZZj4LaRBOnzggIPTeSJYvgrxRMAqe/34Har3vVo+b7sPOjxFbE1zHZhLzaAcidw==} dependencies: - '@preact/preset-vite': 2.8.1(@babel/core@7.23.9)(preact@10.19.5)(vite@5.1.1) + '@preact/preset-vite': 2.8.1(@babel/core@7.23.9)(preact@10.19.6)(vite@5.1.1) '@solidjs/router': 0.8.4(solid-js@1.8.15) - birpc: 0.2.15 + birpc: 0.2.17 solid-js: 1.8.15 vite-plugin-inspect: 0.7.42(vite@5.1.1) vite-plugin-solid: 2.10.1(solid-js@1.8.15)(vite@5.1.1) @@ -2509,19 +2529,18 @@ packages: /@vinxi/listhen@1.5.6: resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==} - hasBin: true dependencies: - '@parcel/watcher': 2.4.0 + '@parcel/watcher': 2.4.1 '@parcel/watcher-wasm': 2.3.0 citty: 0.1.6 clipboardy: 4.0.0 consola: 3.2.3 defu: 6.1.4 get-port-please: 3.1.2 - h3: 1.10.1 + h3: 1.10.2 http-shutdown: 1.2.2 jiti: 1.21.0 - mlly: 1.5.0 + mlly: 1.6.1 node-forge: 1.3.1 pathe: 1.1.2 std-env: 3.7.0 @@ -2544,7 +2563,7 @@ packages: magicast: 0.2.11 recast: 0.23.4 tslib: 2.6.2 - vinxi: 0.3.3(preact@10.19.5)(sass@1.71.0) + vinxi: 0.3.3(preact@10.19.6)(sass@1.71.1) dev: false /@vinxi/server-components@0.2.0(vinxi@0.3.3): @@ -2559,7 +2578,7 @@ packages: astring: 1.8.6 magicast: 0.2.11 recast: 0.23.4 - vinxi: 0.3.3(preact@10.19.5)(sass@1.71.0) + vinxi: 0.3.3(preact@10.19.6)(sass@1.71.1) dev: false /@vinxi/server-functions@0.2.1(vinxi@0.3.3): @@ -2574,7 +2593,7 @@ packages: astring: 1.8.6 magicast: 0.2.11 recast: 0.23.4 - vinxi: 0.3.3(preact@10.19.5)(sass@1.71.0) + vinxi: 0.3.3(preact@10.19.6)(sass@1.71.1) dev: false /abbrev@1.1.1: @@ -2606,7 +2625,6 @@ packages: /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} - hasBin: true /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -2699,8 +2717,8 @@ packages: zip-stream: 5.0.1 dev: false - /arctic@1.1.6: - resolution: {integrity: sha512-tE24DLtMn0s7BBqH3D8f8kWSqrg2AFYS3FVAvnj8N9h1Pu/dYmhyAy7WmW1/rrpLY4yP8q3D5s+PqfF3XybI+A==} + /arctic@1.2.0: + resolution: {integrity: sha512-fzJQgTGrjPtRU69Oz0091w1cGdfAKlnEoawaKuTJ52DOnpyQM2N18i1aeyvsvJKqb9P/PbPPfsyXgOEQS9wMTQ==} dependencies: auri: 1.0.2 oslo: 1.0.1 @@ -2747,7 +2765,6 @@ packages: /astring@1.8.6: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true dev: false /async-sema@3.1.1: @@ -2760,18 +2777,19 @@ packages: /auri@1.0.2: resolution: {integrity: sha512-OC54Bv+hAPvYlo98ZwK3cTo2ijg0CBylaAO5dZ/xZQ7e897k0o4qtxkUPQHruJrFUnL5BebCXz+bUAeXQHp9dg==} - hasBin: true dependencies: '@actions/core': 1.10.1 - dotenv: 16.4.4 + dotenv: 16.4.5 front-matter: 4.0.2 nanoid: 4.0.2 oslo: 1.1.2 dev: false - /available-typed-arrays@1.0.6: - resolution: {integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==} + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 dev: false /b4a@1.6.6: @@ -2832,8 +2850,8 @@ packages: file-uri-to-path: 1.0.0 dev: false - /birpc@0.2.15: - resolution: {integrity: sha512-LuZgWLW6DB1zenkfJuF4/kfSZdazOR2xaMSzeqgvfbNIwECwV1AJso9wpNje79uaRU86Obbujv4qtDnwoOLQww==} + /birpc@0.2.17: + resolution: {integrity: sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==} dev: false /boolbase@1.0.0: @@ -2881,10 +2899,9 @@ packages: /browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true dependencies: - caniuse-lite: 1.0.30001588 - electron-to-chromium: 1.4.673 + caniuse-lite: 1.0.30001589 + electron-to-chromium: 1.4.681 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) dev: false @@ -2912,17 +2929,16 @@ packages: run-applescript: 5.0.0 dev: false - /c12@1.8.0: - resolution: {integrity: sha512-93U6RndoaAwFQPBcS9F/6lwtgBfrWh4695sQ/ChILkbj0C7zOZVptOU3Sxp0I/9xvfW/lzBWD90AXDQz4muSkA==} + /c12@1.9.0: + resolution: {integrity: sha512-7KTCZXdIbOA2hLRQ+1KzJ15Qp9Wn58one74dkihMVp2H6EzKTa3OYBy0BSfS1CCcmxYyqeX8L02m40zjQ+dstg==} dependencies: chokidar: 3.6.0 + confbox: 0.1.3 defu: 6.1.4 - dotenv: 16.4.4 + dotenv: 16.4.5 giget: 1.2.1 jiti: 1.21.0 - json5: 2.2.3 - jsonc-parser: 3.2.1 - mlly: 1.5.0 + mlly: 1.6.1 ohash: 1.1.3 pathe: 1.1.2 perfect-debounce: 1.0.0 @@ -2950,8 +2966,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - /caniuse-lite@1.0.30001588: - resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} + /caniuse-lite@1.0.30001589: + resolution: {integrity: sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==} dev: false /chalk@2.4.2: @@ -3010,7 +3026,7 @@ packages: engines: {node: '>=0.10'} dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.63 es6-iterator: 2.0.3 memoizee: 0.4.15 timers-ext: 0.1.7 @@ -3060,7 +3076,6 @@ packages: /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true dev: false /commander@2.20.3: @@ -3089,6 +3104,10 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /confbox@0.1.3: + resolution: {integrity: sha512-eH3ZxAihl1PhKfpr4VfEN6/vUd87fmgb6JkldHgg/YR6aEBhW63qUDgzP2Y6WM0UumdsYp5H3kibalXAdHfbgg==} + dev: false + /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -3118,7 +3137,6 @@ packages: /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} - hasBin: true dev: false /crc32-stream@5.0.0: @@ -3163,12 +3181,12 @@ packages: /d@1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.63 type: 1.2.0 dev: true - /dax-sh@0.39.1: - resolution: {integrity: sha512-QrVpBGbcdQWFDXVHPjR9PcoZliKJc/sRP5RU1dL+YiJZ5ZiPnjTU7hOj3E3fUy+rCZmpUBMNFVfJQabTAGUUbA==} + /dax-sh@0.39.2: + resolution: {integrity: sha512-gpuGEkBQM+5y6p4cWaw9+ePy5TNon+fdwFVtTI8leU3UhwhsBfPewRxMXGuQNC+M2b/MDGMlfgpqynkcd0C3FQ==} dependencies: '@deno/shim-deno': 0.19.1 undici-types: 5.28.3 @@ -3268,8 +3286,8 @@ packages: engines: {node: '>= 0.8'} dev: false - /destr@2.0.2: - resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} + /destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} @@ -3279,7 +3297,6 @@ packages: /detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} - hasBin: true dev: false /detect-libc@2.0.2: @@ -3341,8 +3358,8 @@ packages: type-fest: 3.13.1 dev: false - /dotenv@16.4.4: - resolution: {integrity: sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==} + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} /dreamopt@0.8.0: @@ -3354,7 +3371,6 @@ packages: /drizzle-kit@0.20.14: resolution: {integrity: sha512-0fHv3YIEaUcSVPSGyaaBfOi9bmpajjhbJNdPsRMIUvYdLVxBu9eGjH8mRc3Qk7HVmEidFc/lhG1YyJhoXrn5yA==} - hasBin: true dependencies: '@drizzle-team/studio': 0.0.39 '@esbuild-kit/esm-loader': 2.6.5 @@ -3374,8 +3390,8 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(pg@8.11.3)(postgres@3.4.3): - resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} + /drizzle-orm@0.29.4(pg@8.11.3)(postgres@3.4.3): + resolution: {integrity: sha512-ZnSM8TAxFhzH7p1s3+w3pRE/eKaOeNkH9SKitm717pubDVVcV2I0BCDBPGKV+pe02+wMfw37ntlTcCyo2rA3IA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -3448,19 +3464,18 @@ packages: pg: 8.11.3 postgres: 3.4.3 - /drizzle-zod@0.5.1(drizzle-orm@0.29.3)(zod@3.22.4): + /drizzle-zod@0.5.1(drizzle-orm@0.29.4)(zod@3.22.4): resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} peerDependencies: drizzle-orm: '>=0.23.13' zod: '*' dependencies: - drizzle-orm: 0.29.3(pg@8.11.3)(postgres@3.4.3) + drizzle-orm: 0.29.4(pg@8.11.3)(postgres@3.4.3) zod: 3.22.4 dev: true /dts-buddy@0.2.5: resolution: {integrity: sha512-66HTWHyXS3JwgpRwcu88rsDyZfPUb0oPYmiNg5f4BgCAFTVorJXpygf339QyXOXX1PuqHpvB+qo7O+8Ni1vXUQ==} - hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 '@jridgewell/sourcemap-codec': 1.4.15 @@ -3486,8 +3501,8 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /electron-to-chromium@1.4.673: - resolution: {integrity: sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==} + /electron-to-chromium@1.4.681: + resolution: {integrity: sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==} dev: false /emoji-regex@8.0.0: @@ -3539,13 +3554,14 @@ packages: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} dev: false - /es5-ext@0.10.62: - resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + /es5-ext@0.10.63: + resolution: {integrity: sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ==} engines: {node: '>=0.10'} requiresBuild: true dependencies: es6-iterator: 2.0.3 es6-symbol: 3.1.3 + esniff: 2.0.1 next-tick: 1.1.0 dev: true @@ -3553,7 +3569,7 @@ packages: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.63 es6-symbol: 3.1.3 dev: true @@ -3568,7 +3584,7 @@ packages: resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.63 es6-iterator: 2.0.3 es6-symbol: 3.1.3 dev: true @@ -3587,7 +3603,6 @@ packages: /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} - hasBin: true requiresBuild: true optionalDependencies: '@esbuild/android-arm': 0.18.20 @@ -3616,7 +3631,6 @@ packages: /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 @@ -3667,23 +3681,23 @@ packages: engines: {node: '>=12'} dev: false - /eslint-config-prettier@9.1.0(eslint@8.56.0): + /eslint-config-prettier@9.1.0(eslint@8.57.0): resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.56.0 + eslint: 8.57.0 dev: true - /eslint-plugin-solid@0.13.1(eslint@8.56.0)(typescript@5.3.3): + /eslint-plugin-solid@0.13.1(eslint@8.57.0)(typescript@5.3.3): resolution: {integrity: sha512-PdNrAylFzeh/SbnLc2pQ432l+bXFGzXj/qNqkh5QNVZCoWIdSs0CJA2D7hqW0DloztwUrzkVZCDWFWc3iRAm/Q==} engines: {node: '>=12.0.0'} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - eslint: 8.56.0 + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 is-html: 2.0.0 kebab-case: 1.0.2 known-css-properties: 0.24.0 @@ -3706,15 +3720,14 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 + '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -3753,6 +3766,16 @@ packages: - supports-color dev: true + /esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.1 + es5-ext: 0.10.63 + event-emitter: 0.3.5 + type: 2.7.2 + dev: true + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3765,7 +3788,6 @@ packages: /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} - hasBin: true dev: false /esquery@1.5.0: @@ -3811,7 +3833,7 @@ packages: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.63 dev: true /eventemitter3@4.0.7: @@ -3842,7 +3864,7 @@ packages: human-signals: 4.3.1 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.2.0 + npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 @@ -3857,7 +3879,7 @@ packages: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.2.0 + npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -3929,18 +3951,17 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.9 + flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 dev: true /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true dev: false - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true /follow-redirects@1.15.5: @@ -4037,7 +4058,7 @@ packages: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.1 dev: false @@ -4069,7 +4090,6 @@ packages: /giget@1.2.1: resolution: {integrity: sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==} - hasBin: true dependencies: citty: 0.1.6 consola: 3.2.3 @@ -4146,7 +4166,7 @@ packages: resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} engines: {node: '>=18'} dependencies: - '@sindresorhus/merge-streams': 2.2.1 + '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 ignore: 5.3.1 path-type: 5.0.0 @@ -4184,7 +4204,21 @@ packages: dependencies: cookie-es: 1.0.0 defu: 6.1.4 - destr: 2.0.2 + destr: 2.0.3 + iron-webcrypto: 1.0.0 + ohash: 1.1.3 + radix3: 1.1.0 + ufo: 1.4.0 + uncrypto: 0.1.3 + unenv: 1.9.0 + dev: false + + /h3@1.10.2: + resolution: {integrity: sha512-r1iNNcFGL4G9pL3lgYxwX0O2ZmqdKqhILAJsnlw5icn5I1QHnADM4TgVdYRtHUqy+NntVpHIEFwnw/XCbebICg==} + dependencies: + cookie-es: 1.0.0 + defu: 6.1.4 + destr: 2.0.3 iron-webcrypto: 1.0.0 ohash: 1.1.3 radix3: 1.1.0 @@ -4215,8 +4249,8 @@ packages: es-define-property: 1.0.0 dev: false - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} dev: false @@ -4245,7 +4279,6 @@ packages: /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true dev: false /heap@0.2.7: @@ -4296,6 +4329,11 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: false + /http-status@1.7.4: + resolution: {integrity: sha512-c2qSwNtTlHVYAhMj9JpGdyo0No/+DiKXCJ9pHtZ2Yf3QmPnBIytKSRT7BuyIiQ7icXLynavGmxUqkOjSrAuMuA==} + engines: {node: '>= 0.4.0'} + dev: false + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -4413,13 +4451,11 @@ packages: /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} - hasBin: true dev: false /is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true dev: false /is-extglob@2.1.1: @@ -4454,7 +4490,6 @@ packages: /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} - hasBin: true dependencies: is-docker: 3.0.0 dev: false @@ -4541,6 +4576,10 @@ packages: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: false + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: false + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -4551,7 +4590,6 @@ packages: /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true dev: false /js-tokens@4.0.0: @@ -4560,7 +4598,6 @@ packages: /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 @@ -4568,14 +4605,12 @@ packages: /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true dependencies: argparse: 2.0.1 /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} - hasBin: true dev: false /json-buffer@3.0.1: @@ -4584,7 +4619,6 @@ packages: /json-diff@0.9.0: resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} - hasBin: true dependencies: cli-color: 2.0.3 difflib: 0.2.4 @@ -4599,10 +4633,19 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true + /json-stable-stringify@1.1.1: + resolution: {integrity: sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + dev: false + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} - hasBin: true dev: false /jsonc-parser@3.2.1: @@ -4617,6 +4660,10 @@ packages: graceful-fs: 4.2.11 dev: false + /jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + dev: false + /kebab-case@1.0.2: resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} dev: true @@ -4666,9 +4713,8 @@ packages: /listhen@1.6.0: resolution: {integrity: sha512-z0RcEXVX5oTpY1bO02SKoTU/kmZSrFSngNNzHRM6KICR17PTq7ANush6AE6ztGJwJD4RLpBrVHd9GnV51J7s3w==} - hasBin: true dependencies: - '@parcel/watcher': 2.4.0 + '@parcel/watcher': 2.4.1 '@parcel/watcher-wasm': 2.4.0 citty: 0.1.6 clipboardy: 4.0.0 @@ -4676,10 +4722,10 @@ packages: crossws: 0.1.1 defu: 6.1.4 get-port-please: 3.1.2 - h3: 1.10.1 + h3: 1.10.2 http-shutdown: 1.2.2 jiti: 1.21.0 - mlly: 1.5.0 + mlly: 1.6.1 node-forge: 1.3.1 pathe: 1.1.2 std-env: 3.7.0 @@ -4692,7 +4738,7 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} dependencies: - mlly: 1.5.0 + mlly: 1.6.1 pkg-types: 1.0.3 dev: false @@ -4747,7 +4793,7 @@ packages: /lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.63 dev: true /lucia@3.0.1: @@ -4806,7 +4852,7 @@ packages: resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.63 es6-weak-map: 2.0.3 event-emitter: 0.3.5 is-promise: 2.2.2 @@ -4840,13 +4886,11 @@ packages: /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} - hasBin: true dev: false /mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} - hasBin: true /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -4906,11 +4950,10 @@ packages: /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} - hasBin: true dev: false - /mlly@1.5.0: - resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} + /mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} dependencies: acorn: 8.11.3 pathe: 1.1.2 @@ -4952,13 +4995,11 @@ packages: /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true dev: false /nanoid@4.0.2: resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} engines: {node: ^14 || ^16 || >=18} - hasBin: true dev: false /natural-compare@1.4.0: @@ -4993,14 +5034,14 @@ packages: '@types/http-proxy': 1.17.14 '@vercel/nft': 0.24.4 archiver: 6.0.1 - c12: 1.8.0 + c12: 1.9.0 chalk: 5.3.0 chokidar: 3.6.0 citty: 0.1.6 consola: 3.2.3 cookie-es: 1.0.0 defu: 6.1.4 - destr: 2.0.2 + destr: 2.0.3 dot-prop: 8.0.2 esbuild: 0.19.12 escape-string-regexp: 5.0.0 @@ -5009,7 +5050,7 @@ packages: fs-extra: 11.2.0 globby: 14.0.1 gzip-size: 7.0.0 - h3: 1.10.1 + h3: 1.10.2 hookable: 5.5.3 httpxy: 0.1.5 is-primitive: 3.0.1 @@ -5019,7 +5060,7 @@ packages: listhen: 1.6.0 magic-string: 0.30.7 mime: 3.0.0 - mlly: 1.5.0 + mlly: 1.6.1 mri: 1.2.0 node-fetch-native: 1.6.2 ofetch: 1.3.3 @@ -5087,7 +5128,6 @@ packages: /node-gyp-build@4.8.0: resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} - hasBin: true dev: false /node-html-parser@6.1.12: @@ -5104,7 +5144,6 @@ packages: /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} - hasBin: true dependencies: abbrev: 1.1.1 dev: false @@ -5120,8 +5159,8 @@ packages: path-key: 3.1.1 dev: false - /npm-run-path@5.2.0: - resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 @@ -5145,7 +5184,6 @@ packages: /nypm@0.3.6: resolution: {integrity: sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==} engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true dependencies: citty: 0.1.6 execa: 8.0.1 @@ -5158,6 +5196,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} @@ -5184,7 +5227,7 @@ packages: /ofetch@1.3.3: resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} dependencies: - destr: 2.0.2 + destr: 2.0.3 node-fetch-native: 1.6.2 ufo: 1.4.0 dev: false @@ -5237,8 +5280,8 @@ packages: is-wsl: 2.2.0 dev: false - /openapi-fetch@0.9.1: - resolution: {integrity: sha512-5Ctb4L2v9X4Kc21zYtEufFNuLhUN6hO/3MZC89am7lnWXGXDUEnPOYC8a5wK9rtySCbJjq2QrDJo3CY6vWqbNw==} + /openapi-fetch@0.9.2: + resolution: {integrity: sha512-EEzVCoGAbGP1Z3eTZXI0urHtvb+JRKLnPbnemsUzeTWcHCaAXsdhAWYfdLAx4fTNNUaL23BQLup8dQjMMkCRqA==} dependencies: openapi-typescript-helpers: 0.0.7 dev: false @@ -5249,7 +5292,6 @@ packages: /openapi-typescript@6.7.4: resolution: {integrity: sha512-EZyeW9Wy7UDCKv0iYmKrq2pVZtquXiD/YHiUClAKqiMi42nodx/EQH11K6fLqjt1IZlJmVokrAsExsBMM2RROQ==} - hasBin: true dependencies: ansi-colors: 4.1.3 fast-glob: 3.3.2 @@ -5425,10 +5467,15 @@ packages: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: jsonc-parser: 3.2.1 - mlly: 1.5.0 + mlly: 1.6.1 pathe: 1.1.2 dev: false + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: false + /postcss@8.4.35: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} @@ -5460,8 +5507,8 @@ packages: resolution: {integrity: sha512-iHJn4+M9vbTdHSdDzNkC0crHq+1CUdFhx+YqCE+SqWxPjm+Zu63jq7yZborOBF64c8pc58O5uMudyL1FQcHacA==} engines: {node: '>=12'} - /preact@10.19.5: - resolution: {integrity: sha512-OPELkDmSVbKjbFqF9tgvOowiiQ9TmsJljIzXRyNE8nGiis94pwv1siF78rQkAP1Q1738Ce6pellRg/Ns/CtHqQ==} + /preact@10.19.6: + resolution: {integrity: sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==} dev: false /prelude-ls@1.2.1: @@ -5489,7 +5536,6 @@ packages: /prettier@3.2.5: resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} engines: {node: '>=14'} - hasBin: true dev: true /pretty-bytes@6.1.1: @@ -5531,7 +5577,7 @@ packages: resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} dependencies: defu: 6.1.4 - destr: 2.0.2 + destr: 2.0.3 flat: 5.0.2 dev: false @@ -5616,7 +5662,6 @@ packages: /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 @@ -5629,7 +5674,6 @@ packages: /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true dependencies: glob: 7.2.3 @@ -5653,7 +5697,6 @@ packages: /rollup@4.12.0: resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: @@ -5700,10 +5743,9 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false - /sass@1.71.0: - resolution: {integrity: sha512-HKKIKf49Vkxlrav3F/w6qRuPcmImGVbIXJ2I3Kg0VMA+3Bav+8yE9G5XmP5lMj6nl4OlqbPftGAscNaNu28b8w==} + /sass@1.71.1: + resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} engines: {node: '>=14.0.0'} - hasBin: true dependencies: chokidar: 3.6.0 immutable: 4.3.5 @@ -5715,13 +5757,11 @@ packages: /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true dev: false /semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} - hasBin: true dependencies: lru-cache: 6.0.0 @@ -5937,8 +5977,8 @@ packages: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: false - /streamx@2.16.0: - resolution: {integrity: sha512-a7Fi0PoUeusrUcMS4+HxivnZqYsw2MFEP841TIyLxTcEIucHcJsk+0ARcq3tGq1xDn+xK7sKHetvfMzI1/CzMA==} + /streamx@2.16.1: + resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 @@ -6056,7 +6096,7 @@ packages: dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 - streamx: 2.16.0 + streamx: 2.16.1 dev: false /tar@6.2.0: @@ -6081,10 +6121,9 @@ packages: solid-use: 0.8.0(solid-js@1.8.15) dev: false - /terser@5.27.1: - resolution: {integrity: sha512-29wAr6UU/oQpnTw5HoadwjUZnFQXGdOfj0LjZ4sVxzqwHh/QVkvr7m8y9WoR4iN3FRitVduTc6KdjcW38Npsug==} + /terser@5.28.1: + resolution: {integrity: sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==} engines: {node: '>=10'} - hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 acorn: 8.11.3 @@ -6099,7 +6138,7 @@ packages: /timers-ext@0.1.7: resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.63 next-tick: 1.1.0 dev: true @@ -6200,13 +6239,11 @@ packages: /typescript@5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} - hasBin: true dev: false /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} - hasBin: true dev: true /ufo@1.4.0: @@ -6262,7 +6299,7 @@ packages: fast-glob: 3.3.2 local-pkg: 0.5.0 magic-string: 0.30.7 - mlly: 1.5.0 + mlly: 1.6.1 pathe: 1.1.2 pkg-types: 1.0.3 scule: 1.3.0 @@ -6329,8 +6366,8 @@ packages: dependencies: anymatch: 3.1.3 chokidar: 3.6.0 - destr: 2.0.2 - h3: 1.10.1 + destr: 2.0.3 + h3: 1.10.2 ioredis: 5.3.2 listhen: 1.6.0 lru-cache: 10.2.0 @@ -6349,7 +6386,6 @@ packages: /untun@0.1.3: resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} - hasBin: true dependencies: citty: 0.1.6 consola: 3.2.3 @@ -6397,16 +6433,14 @@ packages: /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true dev: false /validate-html-nesting@1.2.2: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} dev: false - /vinxi@0.3.3(preact@10.19.5)(sass@1.71.0): + /vinxi@0.3.3(preact@10.19.6)(sass@1.71.1): resolution: {integrity: sha512-0KYGeNowy9SU7K2F7DTI7H4aGAelKLHzzxthf6fdd6cmokFhHM8xZ+fooTTciplbSMccW2adtsrg9Ia61jaPDg==} - hasBin: true dependencies: '@babel/core': 7.23.9 '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) @@ -6414,15 +6448,15 @@ packages: '@types/micromatch': 4.0.6 '@types/serve-static': 1.15.5 '@types/ws': 8.5.10 - '@vinxi/devtools': 0.2.0(@babel/core@7.23.9)(preact@10.19.5)(vite@5.1.1) + '@vinxi/devtools': 0.2.0(@babel/core@7.23.9)(preact@10.19.6)(vite@5.1.1) '@vinxi/listhen': 1.5.6 boxen: 7.1.1 - c12: 1.8.0 + c12: 1.9.0 chokidar: 3.6.0 citty: 0.1.6 consola: 3.2.3 cookie-es: 1.0.0 - dax-sh: 0.39.1 + dax-sh: 0.39.2 defu: 6.1.4 dts-buddy: 0.2.5 es-module-lexer: 1.4.1 @@ -6451,7 +6485,7 @@ packages: unenv: 1.9.0 unimport: 3.7.1(rollup@4.12.0) unstorage: 1.10.1 - vite: 5.1.1(sass@1.71.0) + vite: 5.1.1(sass@1.71.1) ws: 8.16.0 zod: 3.22.4 transitivePeerDependencies: @@ -6504,13 +6538,13 @@ packages: open: 9.1.0 picocolors: 1.0.0 sirv: 2.0.4 - vite: 5.1.1(sass@1.71.0) + vite: 5.1.1(sass@1.71.1) transitivePeerDependencies: - rollup - supports-color dev: false - /vite-plugin-inspect@0.7.42(vite@5.1.3): + /vite-plugin-inspect@0.7.42(vite@5.1.4): resolution: {integrity: sha512-JCyX86wr3siQc+p9Kd0t8VkFHAJag0RaQVIpdFGSv5FEaePEVB6+V/RGtz2dQkkGSXQzRWrPs4cU3dRKg32bXw==} engines: {node: '>=14'} peerDependencies: @@ -6528,7 +6562,7 @@ packages: open: 9.1.0 picocolors: 1.0.0 sirv: 2.0.4 - vite: 5.1.3(sass@1.71.0) + vite: 5.1.4(sass@1.71.1) transitivePeerDependencies: - rollup - supports-color @@ -6550,13 +6584,13 @@ packages: merge-anything: 5.1.7 solid-js: 1.8.15 solid-refresh: 0.6.3(solid-js@1.8.15) - vite: 5.1.1(sass@1.71.0) + vite: 5.1.1(sass@1.71.1) vitefu: 0.2.5(vite@5.1.1) transitivePeerDependencies: - supports-color dev: false - /vite-plugin-solid@2.9.1(solid-js@1.8.15)(vite@5.1.3): + /vite-plugin-solid@2.9.1(solid-js@1.8.15)(vite@5.1.4): resolution: {integrity: sha512-RC4hj+lbvljw57BbMGDApvEOPEh14lwrr/GeXRLNQLcR1qnOdzOwwTSFy13Gj/6FNIZpBEl0bWPU+VYFawrqUw==} peerDependencies: '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* @@ -6572,13 +6606,13 @@ packages: merge-anything: 5.1.7 solid-js: 1.8.15 solid-refresh: 0.6.3(solid-js@1.8.15) - vite: 5.1.3(sass@1.71.0) - vitefu: 0.2.5(vite@5.1.3) + vite: 5.1.4(sass@1.71.1) + vitefu: 0.2.5(vite@5.1.4) transitivePeerDependencies: - supports-color dev: false - /vite@5.1.1(sass@1.71.0): + /vite@5.1.1(sass@1.71.1): resolution: {integrity: sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -6609,13 +6643,13 @@ packages: esbuild: 0.19.12 postcss: 8.4.35 rollup: 4.12.0 - sass: 1.71.0 + sass: 1.71.1 optionalDependencies: fsevents: 2.3.3 dev: false - /vite@5.1.3(sass@1.71.0): - resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==} + /vite@5.1.4(sass@1.71.1): + resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -6645,7 +6679,7 @@ packages: esbuild: 0.19.12 postcss: 8.4.35 rollup: 4.12.0 - sass: 1.71.0 + sass: 1.71.1 optionalDependencies: fsevents: 2.3.3 dev: false @@ -6658,10 +6692,10 @@ packages: vite: optional: true dependencies: - vite: 5.1.1(sass@1.71.0) + vite: 5.1.1(sass@1.71.1) dev: false - /vitefu@0.2.5(vite@5.1.3): + /vitefu@0.2.5(vite@5.1.4): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -6669,7 +6703,7 @@ packages: vite: optional: true dependencies: - vite: 5.1.3(sass@1.71.0) + vite: 5.1.4(sass@1.71.1) dev: false /webidl-conversions@3.0.1: @@ -6696,7 +6730,7 @@ packages: resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.6 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 @@ -6706,14 +6740,12 @@ packages: /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} - hasBin: true dependencies: isexe: 2.0.0 /which@4.0.0: resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true dependencies: isexe: 3.1.1 dev: false diff --git a/public/api/specs/liljudd.json b/public/api/specs/liljudd.json index 72d2901..aaa6295 100644 --- a/public/api/specs/liljudd.json +++ b/public/api/specs/liljudd.json @@ -10,19 +10,22 @@ "version": "0.0.0" }, "paths": { - "/api/boot/config": { + "/api/boot": { "get": { - "tags": ["Guild configs"], - "summary": "Find a guild's config by ID", - "description": "Returns a single guild's config.", - "operationId": "getGuildsFromBoot", + "tags": ["Bot bootup"], + "summary": "Retrieve all guild's configs", + "description": "Returns all guild's configs.", + "operationId": "getGuildsForBoot", "responses": { "200": { "description": "successful operation", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/bootConfig" + "type": "array", + "items": { + "$ref": "#/components/schemas/guildConfig" + } } } } @@ -30,20 +33,23 @@ "400": { "description": "Invalid ID supplied" }, + "401": { + "description": "Unauthorized" + }, "404": { "description": "Guild not found" } }, "security": [ { - "bot_token": [] + "basicAuth": [] } ] } }, "/api/{guildId}/config": { "get": { - "tags": ["Guild configs"], + "tags": ["Guild config"], "summary": "Find a guild's config by ID", "description": "Returns a single guild's config.", "operationId": "getGuildById", @@ -73,18 +79,21 @@ "400": { "description": "Invalid ID supplied" }, + "401": { + "description": "Unauthorized" + }, "404": { "description": "Guild not found" } }, "security": [ { - "bot_token": [] + "basicAuth": [] } ] }, "delete": { - "tags": ["Guild configs"], + "tags": ["Guild config"], "summary": "Deletes a guild's config by ID", "description": "Delete a guild's config when the bot is removed from the guild.", "operationId": "deleteGuildById", @@ -107,13 +116,16 @@ "400": { "description": "Invalid ID supplied" }, + "401": { + "description": "Unauthorized" + }, "404": { "description": "Guild not found" } }, "security": [ { - "bot_token": [] + "basicAuth": [] } ] } @@ -153,19 +165,22 @@ "400": { "description": "Invalid ID supplied" }, + "401": { + "description": "Unauthorized" + }, "404": { "description": "Guild not found" } }, "security": [ { - "bot_token": [] + "basicAuth": [] } ] }, "put": { "tags": ["Time planning messages"], - "summary": "Put message IDs for tp_messages of guild by ID", + "summary": "Put new message IDs for tp_messages of guild by ID", "description": "Returns tp_messages for a guild", "operationId": "putTp_messagesOfGuildById", "parameters": [ @@ -180,30 +195,37 @@ } } ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/tp_messages" - } + "requestBody": { + "description": "Put new message IDs for tp_messages in channel", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/tp_messages" } } }, + "required": true + }, + "responses": { "204": { - "description": "Time planning not enabled for this guild" + "description": "successful operation" }, "400": { "description": "Invalid ID supplied" }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Time planning not enabled for this guild" + }, "404": { "description": "Guild not found" } }, "security": [ { - "bot_token": [] + "basicAuth": [] } ] } @@ -232,9 +254,20 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/tp_messages" + "type": "object", + "required": ["matches", "timezone"], + "properties": { + "matches": { + "type": "array", + "items": { + "$ref": "#/components/schemas/match" + } + }, + "timezone": { + "type": "string", + "format": "text", + "example": "Europe/Berlin" + } } } } @@ -246,21 +279,22 @@ "400": { "description": "Invalid ID supplied" }, + "401": { + "description": "Unauthorized" + }, "404": { "description": "Guild not found" } }, "security": [ { - "bot_token": [] + "basicAuth": [] } ] - } - }, - "/api/{guildId}/matches/{channelId}": { + }, "post": { "tags": ["Matches"], - "summary": "Save a new created match in channel of guild by IDs", + "summary": "Save a new created match of guild by ID", "description": "Returns tp_messages for a guild", "operationId": "postMatchOfGuildById", "parameters": [ @@ -273,108 +307,48 @@ "type": "string", "format": "varchar(20)" } - }, - { - "name": "channelId", - "in": "path", - "description": "ID of match's channel to set", - "required": true, - "schema": { - "type": "string", - "format": "varchar(20)" - } } ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/tp_messages" + "requestBody": { + "description": "Save a new created match in channel", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["match", "timezone"], + "properties": { + "match": { + "$ref": "#/components/schemas/match" + }, + "timezone": { + "type": "string", + "format": "text", + "example": "Europe/Berlin", + "description": "Has to match guild tz" + } } } } }, + "required": true + }, + "responses": { "204": { - "description": "Time planning not enabled for this guild" + "description": "successful operation" }, "400": { "description": "Invalid ID supplied" }, + "401": { + "description": "Unauthorized" + }, "404": { "description": "Guild not found" } }, "security": [ { - "bot_token": [] - } - ] - } - }, - "/api/{guildId}/matches/{channelId}/{matchMessageId}": { - "put": { - "tags": ["Matches"], - "summary": "Set state for match of guild by IDs", - "description": "Returns tp_messages for a guild", - "operationId": "putMatchOfGuildById", - "parameters": [ - { - "name": "guildId", - "in": "path", - "description": "ID of guild's tp_messages to return", - "required": true, - "schema": { - "type": "string", - "format": "varchar(20)" - } - }, - { - "name": "channelId", - "in": "path", - "description": "ID of match's channel to set", - "required": true, - "schema": { - "type": "string", - "format": "varchar(20)" - } - }, - { - "name": "matchMessageId", - "in": "path", - "description": "ID of match's message Id to set", - "required": true, - "schema": { - "type": "string", - "format": "varchar(20)" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/tp_messages" - } - } - } - }, - "204": { - "description": "Time planning not enabled for this guild" - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Guild not found" - } - }, - "security": [ - { - "bot_token": [] + "basicAuth": [] } ] } @@ -382,21 +356,11 @@ }, "components": { "schemas": { - "bootConfig": { - "type": "object", - "properties": { - "guilds": { - "type": "array", - "items": { - "$ref": "#/components/schemas/guildConfig" - } - } - } - }, "guildConfig": { "type": "object", + "required": ["guildId", "timezone", "features", "matches", "checksum"], "properties": { - "guildID": { + "guildId": { "type": "string", "format": "varchar(20)", "example": "1234567890123456789" @@ -408,14 +372,27 @@ }, "features": { "type": "object", + "required": ["timePlanning"], "properties": { - "time_planning": { + "timePlanning": { "type": "object", + "required": [ + "enabled", + "channelId", + "targetMinute", + "targetHour", + "targetDay", + "roles" + ], "properties": { - "channelID": { + "enabled": { + "type": "boolean" + }, + "channelId": { "type": "string", "format": "varchar(20)", - "example": "1234567890123456789" + "example": "1234567890123456789", + "nullable": true }, "targetMinute": { "type": "number", @@ -431,6 +408,11 @@ }, "roles": { "type": "object", + "required": [ + "enabled", + "isAvailableRoleId", + "wantsToBeNotifieRoledId" + ], "properties": { "enabled": { "type": "boolean" @@ -458,13 +440,25 @@ "items": { "$ref": "#/components/schemas/match" } + }, + "checksum": { + "type": "string" } } }, "match": { "type": "object", + "required": [ + "channelId", + "matchType", + "createrId", + "roleId", + "opponentName", + "messageId", + "utc_ts" + ], "properties": { - "channelID": { + "channelId": { "type": "string", "format": "varcharq(20)", "example": "1234567890123456789" @@ -489,54 +483,81 @@ "format": "varchar(100)", "example": "?" }, - "messsageId": { + "messageId": { "type": "string", "format": "varchar(20)", "example": "1234567890123456789" }, "utc_ts": { "type": "string", - "example": "1706180188" + "example": "2020-01-01T00:00:00Z" } } }, "tp_messages": { "type": "object", + "required": ["channelId", "messageIds"], "properties": { - "guildId": { - "type": "string", - "format": "varchar(20)", - "example": "1234567890123456789" - }, "channelId": { "type": "string", "format": "varchar(20)", "example": "1234567890123456789" }, "messageIds": { - "type": "array", - "items": { - "type": "string", - "format": "varchar(20)" - }, - "example": [ - "1234567890123456789", - "1234567890123456789", - "1234567890123456789", - "1234567890123456789", - "1234567890123456789", - "1234567890123456789", - "1234567890123456789" - ] + "type": "object", + "required": ["0", "1", "2", "3", "4", "5", "6"], + "properties": { + "0": { + "type": "string", + "format": "varchar(20)", + "example": "1234567890123456789", + "nullable": true + }, + "1": { + "type": "string", + "format": "varchar(20)", + "example": "1234567890123456789", + "nullable": true + }, + "2": { + "type": "string", + "format": "varchar(20)", + "example": "1234567890123456789", + "nullable": true + }, + "3": { + "type": "string", + "format": "varchar(20)", + "example": "1234567890123456789", + "nullable": true + }, + "4": { + "type": "string", + "format": "varchar(20)", + "example": "1234567890123456789", + "nullable": true + }, + "5": { + "type": "string", + "format": "varchar(20)", + "example": "1234567890123456789", + "nullable": true + }, + "6": { + "type": "string", + "format": "varchar(20)", + "example": "1234567890123456789", + "nullable": true + } + } } } } }, "securitySchemes": { - "bot_token": { + "basicAuth": { "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT" + "scheme": "basic" } } } diff --git a/sample_conf.json b/sample_conf.json deleted file mode 100644 index 539c5b4..0000000 --- a/sample_conf.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "data": { - "guilds": [ - { - "guildID": "some ID", - "UTCOffset": 0, - "features": { - "time_planning": { - "channelID": "some ID", - "targetWeekday": 0, - "targetHour": 0, - "targetMinute": 0, - "isAvailableRoleId": "some ID", - "wantsToBeNotifieRoledId": "some ID" - } - }, - "matches": [ - { - "channelID": "some ID", - "matchType": "", - "createrId": "some ID", - "roleId": "some ID", - "opponentName": "", - "messsageId": "", - "plannedFor": 1704314625000 - } - ] - } - ] - }, - "accessToken": "some Token" -} diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index 36576aa..7986256 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -1,5 +1,5 @@ import { faCirclePlus } from "@fortawesome/pro-regular-svg-icons"; -import { JSX, Show, Suspense } from "solid-js"; +import { JSX, Show } from "solid-js"; import "../styles/components/NavBar.scss"; import { FontAwesomeIcon } from "./FontAwesomeIcon"; import NavUser from "./NavUser"; @@ -41,9 +41,7 @@ function NavBar() { > - - - + ); diff --git a/src/components/NavUser.tsx b/src/components/NavUser.tsx index 5aaa6bc..3c91d85 100644 --- a/src/components/NavUser.tsx +++ b/src/components/NavUser.tsx @@ -3,48 +3,27 @@ import { faArrowRightToBracket, faGear, } from "@fortawesome/pro-regular-svg-icons"; -import { User } from "lucia"; -import { Show, createResource } from "solid-js"; +import { cache, createAsync } from "@solidjs/router"; +import { Show } from "solid-js"; import { getRequestEvent } from "solid-js/web"; import { FontAwesomeIcon } from "./FontAwesomeIcon"; import { Li } from "./NavBar"; -async function getUser(): Promise< - | ({ - success: false; - message: string; - // user?: undefined; - } & Partial) - | ({ - success: true; - message?: undefined; - } & User) -> { +async function getUser() { "use server"; const event = getRequestEvent(); - if (!event) return { success: false, message: "No request event!" }; - const pathname = new URL(event.request.url).pathname; - const { user } = event.nativeEvent.context; - if (!user) return { success: false, message: "User not logged in!" }; - - console.log("userInfo", pathname, "success"); - - return { success: true, ...user }; + return event?.nativeEvent.context.user; } +const cachedUser = cache(() => getUser(), "userInfo"); + function NavUser() { - const [user] = createResource(async () => { - const user = await getUser(); - - if (!user.success) console.error("userInfo", user.message); - - return user; - }); + const user = createAsync(() => cachedUser()); const pfp = () => { const thisUser = user(); - if (!thisUser?.success) return ""; + if (!thisUser?.id) return ""; return thisUser.image ? `https://cdn.discordapp.com/avatars/${thisUser.discord_id}/${thisUser.image}.png` diff --git a/src/drizzle/schema.ts b/src/drizzle/schema.ts index 48c2708..341e4c2 100644 --- a/src/drizzle/schema.ts +++ b/src/drizzle/schema.ts @@ -1,8 +1,8 @@ import { relations } from "drizzle-orm"; import { boolean, - integer, pgTable, + primaryKey, serial, smallint, text, @@ -37,10 +37,51 @@ export const discordTokens = pgTable("tokens", { expiresAt: timestamp("expires_at", { mode: "date" }).notNull(), }); -export const matchPlannings = pgTable("match_planning", { +export const guilds = pgTable("guilds", { + id: varchar("id", { length: 20 }).primaryKey(), + timezone: text("timezone").notNull().default("Etc/UTC"), + tpEnabled: boolean("tp_enabled").notNull().default(false), + tpChannelId: varchar("tp_channel_id", { length: 20 }), + tpInterval: smallint("target_interval").notNull(), + tpRoles: boolean("tp_roles").notNull(), + isAvailableRoleId: varchar("is_available_role_id", { length: 20 }), + wantsToBeNotifieRoledId: varchar("wants_to_be_notified_role_id", { + length: 20, + }), +}); + +export const guildsRelations = relations(guilds, ({ many }) => ({ + tpMessages: many(tpMessages), + matches: many(matches), +})); + +export const tpMessages = pgTable( + "tp_messages", + { + messageId: varchar("message_id", { length: 20 }), + day: smallint("day").notNull(), + guildId: varchar("guild_id", { length: 20 }) + .notNull() + .references(() => guilds.id, { onDelete: "cascade" }), + }, + (table) => { + return { + pk: primaryKey({ columns: [table.guildId, table.day] }), + }; + }, +); + +export const tpMessagesRelations = relations(tpMessages, ({ one }) => ({ + guild: one(guilds, { + fields: [tpMessages.guildId], + references: [guilds.id], + }), +})); + +export const matches = pgTable("matches", { id: serial("id").primaryKey(), channelId: varchar("channel_id", { length: 20 }).notNull(), - matchtype: varchar("match_type", { length: 50 }).notNull(), + matchType: varchar("match_type", { length: 50 }).notNull(), createrId: varchar("creater_id", { length: 20 }).notNull(), roleId: varchar("role_id", { length: 20 }).notNull(), opponentName: varchar("opponent_name", { length: 100 }).notNull(), @@ -51,65 +92,9 @@ export const matchPlannings = pgTable("match_planning", { .references(() => guilds.id, { onDelete: "cascade" }), }); -export const matchPlanningsRelations = relations(matchPlannings, ({ one }) => ({ +export const matchPlanningsRelations = relations(matches, ({ one }) => ({ guild: one(guilds, { - fields: [matchPlannings.guildId], + fields: [matches.guildId], references: [guilds.id], }), })); - -export const guilds = pgTable("guild", { - id: varchar("id", { length: 20 }).primaryKey(), - timezone: text("timezone").notNull(), -}); - -export const guildsRelations = relations(guilds, ({ one, many }) => ({ - matches: many(matchPlannings), - timePlanning: one(timePlannings, { - fields: [guilds.id], - references: [timePlannings.guildId], - }), -})); - -export const timePlannings = pgTable("time_planning", { - id: serial("id").primaryKey(), - guildId: varchar("guild_id", { length: 20 }) - .notNull() - .unique() - .references(() => guilds.id, { - onDelete: "cascade", - }), - channelId: varchar("channel_id", { length: 20 }).notNull(), - target_interval: smallint("target_interval").notNull(), - roles: boolean("roles").notNull(), - isAvailableRoleId: varchar("is_available_role_id", { length: 20 }), - wantsToBeNotifieRoledId: varchar("wants_to_be_notified_role_id", { - length: 20, - }), -}); - -export const timePlanningsRelations = relations( - timePlannings, - ({ one, many }) => ({ - guild: one(guilds, { - fields: [timePlannings.guildId], - references: [guilds.id], - }), - messages: many(tpMessages), - }), -); - -export const tpMessages = pgTable("tp_message", { - messageId: varchar("message_id", { length: 20 }).primaryKey(), - day: smallint("day").notNull(), - planId: integer("plan_id") - .notNull() - .references(() => timePlannings.id, { onDelete: "cascade" }), -}); - -export const tpMessagesRelations = relations(tpMessages, ({ one }) => ({ - plan: one(timePlannings, { - fields: [tpMessages.planId], - references: [timePlannings.id], - }), -})); diff --git a/src/lib/auth.ts b/src/lib/auth.ts index bce2d61..b4da669 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -1,6 +1,5 @@ import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle"; import { Discord } from "arctic"; -import { PgColumn, PgTableWithColumns } from "drizzle-orm/pg-core"; import { Lucia } from "lucia"; import db from "~/drizzle"; import { sessions, users } from "~/drizzle/schema"; @@ -17,30 +16,16 @@ export const lucia = new Lucia(adapter, { getUserAttributes: (attributes) => attributes, }); -declare module "lucia" { - // eslint-disable-next-line no-unused-vars - interface Register { - Lucia: typeof lucia; - DatabaseUserAttributes: DatabaseUserAttributes; - } -} - -type GetColumns = - T extends PgTableWithColumns ? First["columns"] : never; - -type ExtractDataTypes = { - [K in keyof T]: T[K] extends PgColumn - ? DataType["data"] - : never; -}; - -interface DatabaseUserAttributes - extends ExtractDataTypes> { - warst: string; -} - export const discord = new Discord( import.meta.env.VITE_DISCORD_CLIENT_ID, import.meta.env.VITE_DISCORD_CLIENT_SECRET, import.meta.env.VITE_AUTH_REDIRECT_URL, ); + +const unencoded = `${import.meta.env.VITE_DISCORD_CLIENT_ID}:${import.meta.env.VITE_DISCORD_CLIENT_SECRET}`; +const encoded = btoa(unencoded); + +export const BasicAuth = { + unencoded: `Basic ${unencoded}`, + encoded: `Basic ${encoded}`, +}; diff --git a/src/lib/responseBuilders.ts b/src/lib/responseBuilders.ts new file mode 100644 index 0000000..ee58883 --- /dev/null +++ b/src/lib/responseBuilders.ts @@ -0,0 +1,83 @@ +import stringify from "json-stable-stringify"; +import objectHash from "object-hash"; + +export const buildMatches = ( + matches: { + id: number; + messageId: string; + guildId: string; + channelId: string; + matchType: string; + createrId: string; + roleId: string; + opponentName: string; + utc_ts: Date; + }[], +) => + matches.map( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + ({ id, guildId, utc_ts, ...match }) => ({ + ...match, + utc_ts: utc_ts.toISOString(), + }), + ); + +export function buildConfig(guildQuery: { + id: string; + timezone: string; + tpEnabled: boolean; + tpChannelId: string | null; + tpInterval: number; + tpRoles: boolean; + isAvailableRoleId: string | null; + wantsToBeNotifieRoledId: string | null; + tpMessages: { + messageId: string | null; + day: number; + guildId: string; + }[]; + matches: { + id: number; + messageId: string; + guildId: string; + channelId: string; + matchType: string; + createrId: string; + roleId: string; + opponentName: string; + utc_ts: Date; + }[]; +}) { + const { + id, + timezone, + tpEnabled, + tpChannelId, + tpInterval, + tpRoles, + isAvailableRoleId, + wantsToBeNotifieRoledId, + } = guildQuery; + + const targetMinute = tpInterval & 63; + const targetHour = (tpInterval >> 6) & 31; + const targetDay = (tpInterval >> 11) & 7; + + const payload = { + guildId: id, + timezone, + features: { + timePlanning: { + enabled: tpEnabled, + channelId: tpChannelId, + targetMinute, + targetHour, + targetDay, + roles: { enabled: tpRoles, isAvailableRoleId, wantsToBeNotifieRoledId }, + }, + }, + matches: buildMatches(guildQuery.matches), + checksum: objectHash(stringify(guildQuery)), + }; + return payload; +} diff --git a/src/lib/responses.ts b/src/lib/responses.ts new file mode 100644 index 0000000..65d6991 --- /dev/null +++ b/src/lib/responses.ts @@ -0,0 +1,39 @@ +import httpStatus from "http-status"; +import { + APIResponse, + Methods, + MyPaths, + ResponseSchemas, + StatusCodes, +} from "~/types/backend"; + +export function ErrorResponse< + P extends MyPaths, + M extends Methods

, + C extends StatusCodes = StatusCodes, +>(code: C, error?: string): APIResponse { + const responseData = { + error: error ?? httpStatus[`${httpStatus[code]}_NAME`], + }; + + console.log(responseData); + return new Response(JSON.stringify(responseData), { + status: httpStatus[code], + headers: { + "Content-Type": "application/json", + }, + }); +} + +export function Res< + P extends MyPaths, + M extends Methods

, + C extends StatusCodes = StatusCodes, +>(code: C, payload: ResponseSchemas): APIResponse { + return new Response(payload === null ? null : JSON.stringify(payload), { + status: httpStatus[code], + headers: { + "Content-Type": "application/json", + }, + }); +} diff --git a/src/lib/zod.ts b/src/lib/zod.ts new file mode 100644 index 0000000..b5810e1 --- /dev/null +++ b/src/lib/zod.ts @@ -0,0 +1,37 @@ +import moment from "moment-timezone"; +import { z } from "zod"; + +export const zodId = z + .string() + .refine((value) => /^\d{7,20}$/.test(value), "Invalid ID supplied"); + +export const zodTpMessages = z.object({ + channelId: zodId, + messageIds: z.object({ + "0": zodId.nullable(), + "1": zodId.nullable(), + "2": zodId.nullable(), + "3": zodId.nullable(), + "4": zodId.nullable(), + "5": zodId.nullable(), + "6": zodId.nullable(), + }), +}); + +export const zodMatch = z.object({ + match: z.object({ + channelId: zodId, + createrId: zodId, + messageId: zodId, + roleId: zodId, + matchType: z.string(), + opponentName: z.string(), + utc_ts: z.string().datetime(), + }), + timezone: z + .string() + .refine( + (value) => moment.tz.names().includes(value), + "Unknown timezone supplied", + ), +}); diff --git a/src/routes/api/[guildId]/config.ts b/src/routes/api/[guildId]/config.ts new file mode 100644 index 0000000..9eb7816 --- /dev/null +++ b/src/routes/api/[guildId]/config.ts @@ -0,0 +1,73 @@ +import { APIEvent } from "@solidjs/start/server/types"; +import { eq } from "drizzle-orm"; +import db from "~/drizzle"; +import { guilds } from "~/drizzle/schema"; +import { BasicAuth } from "~/lib/auth"; +import { buildConfig } from "~/lib/responseBuilders"; +import { ErrorResponse, Res } from "~/lib/responses"; +import { zodId } from "~/lib/zod"; +import { APIResponse } from "~/types/backend"; + +type Path = "/api/{guildId}/config"; + +export const GET = async ( + event: APIEvent, +): Promise> => { + switch (event.request.headers.get("authorization")) { + case BasicAuth.unencoded: + case BasicAuth.encoded: + break; + + default: + return ErrorResponse("UNAUTHORIZED"); + } + + try { + zodId.parse(event.params.guildId); + } catch (e) { + return ErrorResponse("BAD_REQUEST", JSON.stringify(e)); + } + + const guildQuery = await db.query.guilds + .findFirst({ + where: eq(guilds.id, event.params.guildId), + with: { tpMessages: true, matches: true }, + }) + .execute(); + + if (!guildQuery) return ErrorResponse("NOT_FOUND"); + + return Res("OK", buildConfig(guildQuery)); +}; + +export const DELETE = async ( + event: APIEvent, +): Promise> => { + switch (event.request.headers.get("authorization")) { + case BasicAuth.unencoded: + case BasicAuth.encoded: + break; + + default: + return ErrorResponse("UNAUTHORIZED"); + } + + try { + zodId.parse(event.params.guildId); + } catch (e) { + return ErrorResponse("BAD_REQUEST", JSON.stringify(e)); + } + + const guildQuery = await db.query.guilds + .findFirst({ + where: eq(guilds.id, event.params.guildId), + with: { tpMessages: true, matches: true }, + }) + .execute(); + + if (!guildQuery) return ErrorResponse("NOT_FOUND"); + + await db.delete(guilds).where(eq(guilds.id, event.params.guildId)).execute(); + + return Res("NO_CONTENT", null); +}; diff --git a/src/routes/api/[guildId]/matches.ts b/src/routes/api/[guildId]/matches.ts new file mode 100644 index 0000000..703654a --- /dev/null +++ b/src/routes/api/[guildId]/matches.ts @@ -0,0 +1,93 @@ +import { APIEvent } from "@solidjs/start/server/types"; +import { eq } from "drizzle-orm"; +import db from "~/drizzle"; +import { guilds, matches } from "~/drizzle/schema"; +import { BasicAuth } from "~/lib/auth"; +import { buildMatches } from "~/lib/responseBuilders"; +import { ErrorResponse, Res } from "~/lib/responses"; +import { zodMatch } from "~/lib/zod"; +import { APIResponse, RequestBody } from "~/types/backend"; + +type Path = "/api/{guildId}/matches"; + +export const GET = async ( + event: APIEvent, +): Promise> => { + switch (event.request.headers.get("authorization")) { + case BasicAuth.unencoded: + case BasicAuth.encoded: + break; + + default: + return ErrorResponse("UNAUTHORIZED"); + } + + const guild = await db.query.guilds + .findFirst({ + where: eq(guilds.id, event.params.guildId), + with: { + matches: true, + }, + }) + .execute(); + + console.log(event.params.guildId, guild); + + if (!guild) return ErrorResponse("NOT_FOUND"); + + if (guild.matches.length < 1) return Res("NO_CONTENT", null); + + return Res("OK", { + matches: buildMatches(guild.matches), + timezone: guild.timezone, + }); +}; + +export const POST = async ( + event: APIEvent, +): Promise> => { + switch (event.request.headers.get("authorization")) { + case BasicAuth.unencoded: + case BasicAuth.encoded: + break; + + default: + return ErrorResponse("UNAUTHORIZED"); + } + + const guild = await db.query.guilds + .findFirst({ + where: eq(guilds.id, event.params.guildId), + with: { + matches: true, + }, + }) + .execute(); + + console.log(event.params.guildId, guild); + + if (!guild) return ErrorResponse("NOT_FOUND"); + + const unparsedBody = await new Response(event.request.body).json(); + + let body: RequestBody; + try { + body = zodMatch.parse(unparsedBody); + } catch (e) { + return ErrorResponse("BAD_REQUEST", JSON.stringify(e)); + } + + if (body.timezone !== guild.timezone) + return ErrorResponse( + "BAD_REQUEST", + "Match's timezone is different from guild's timezone", + ); + + await db.insert(matches).values({ + ...body.match, + guildId: guild.id, + utc_ts: new Date(body.match.utc_ts), + }); + + return Res("NO_CONTENT", null); +}; diff --git a/src/routes/api/[guildId]/tp_messages.ts b/src/routes/api/[guildId]/tp_messages.ts new file mode 100644 index 0000000..c4cb99a --- /dev/null +++ b/src/routes/api/[guildId]/tp_messages.ts @@ -0,0 +1,114 @@ +import { APIEvent } from "@solidjs/start/server/types"; +import { and, eq } from "drizzle-orm"; +import db from "~/drizzle"; +import { guilds, tpMessages } from "~/drizzle/schema"; +import { BasicAuth } from "~/lib/auth"; +import { ErrorResponse, Res } from "~/lib/responses"; +import { zodTpMessages } from "~/lib/zod"; +import { APIResponse, RequestBody } from "~/types/backend"; + +type Path = "/api/{guildId}/tp_messages"; + +const DayKeys = ["0", "1", "2", "3", "4", "5", "6"] as const; +type DayKeys = (typeof DayKeys)[number]; +type Messages = Record; + +export const GET = async ( + event: APIEvent, +): Promise> => { + switch (event.request.headers.get("authorization")) { + case BasicAuth.unencoded: + case BasicAuth.encoded: + break; + + default: + return ErrorResponse("UNAUTHORIZED"); + } + + const guild = await db.query.guilds.findFirst({ + where: eq(guilds.id, event.params.guildId), + with: { + tpMessages: true, + }, + }); + + if (!guild) return ErrorResponse("NOT_FOUND"); + + if (!guild.tpEnabled || !guild.tpChannelId) return Res("NO_CONTENT", null); + + const tpMessages = guild.tpMessages.reduce( + (acc, message) => { + const day = message.day.toString() as DayKeys; + if (!/^[0-6]$/.test(day)) return acc; + acc[day] = message.messageId; + return acc; + }, + { + "0": null, + "1": null, + "2": null, + "3": null, + "4": null, + "5": null, + "6": null, + } as Messages, + ); + + return Res("OK", { + channelId: guild.tpChannelId, + messageIds: tpMessages, + }); +}; + +export const PUT = async ( + event: APIEvent, +): Promise> => { + switch (event.request.headers.get("authorization")) { + case BasicAuth.unencoded: + case BasicAuth.encoded: + break; + + default: + return ErrorResponse("UNAUTHORIZED"); + } + + const guild = await db.query.guilds + .findFirst({ + where: eq(guilds.id, event.params.guildId), + with: { tpMessages: true }, + }) + .execute(); + + if (!guild) return ErrorResponse("NOT_FOUND"); + + if (!guild.tpEnabled) return ErrorResponse("FORBIDDEN"); + + const unparsedBody = await new Response(event.request.body).json(); + + let body: RequestBody; + try { + body = zodTpMessages.parse(unparsedBody); + } catch (e) { + return ErrorResponse("BAD_REQUEST", JSON.stringify(e)); + } + + if (guild.tpChannelId !== body.channelId) + await db + .update(guilds) + .set({ tpChannelId: body.channelId }) + .where(eq(guilds.id, guild.id)) + .execute(); + + await Promise.all( + DayKeys.map(async (dayStr) => { + const day = parseInt(dayStr); + await db + .update(tpMessages) + .set({ messageId: body.messageIds[dayStr] }) + .where(and(eq(tpMessages.guildId, guild.id), eq(tpMessages.day, day))) + .execute(); + }), + ); + + return Res("NO_CONTENT", null); +}; diff --git a/src/routes/api/auth/callback/discord.ts b/src/routes/api/auth/callback/discord.ts index 4ed93d0..c6f2ec0 100644 --- a/src/routes/api/auth/callback/discord.ts +++ b/src/routes/api/auth/callback/discord.ts @@ -2,6 +2,7 @@ import { createId } from "@paralleldrive/cuid2"; import { APIEvent } from "@solidjs/start/server/types"; import { OAuth2RequestError } from "arctic"; import { eq } from "drizzle-orm"; +import httpStatus from "http-status"; import createClient from "openapi-fetch"; import { getCookie, setCookie } from "vinxi/http"; import db from "~/drizzle"; @@ -20,20 +21,20 @@ export async function GET(event: APIEvent): Promise { switch (error) { case "access_denied": return new Response(null, { - status: 302, + status: httpStatus.FOUND, headers: { Location: "/" }, }); default: console.log("Discord oauth error:", error_description); return new Response(decodeURI(error_description ?? ""), { - status: 400, + status: httpStatus.BAD_REQUEST, }); } const storedState = getCookie("discord_oauth_state") ?? null; if (!code || !state || !storedState || state !== storedState) { return new Response(null, { - status: 400, + status: httpStatus.BAD_REQUEST, }); } @@ -77,7 +78,7 @@ export async function GET(event: APIEvent): Promise { .execute(); return new Response(null, { - status: 302, + status: httpStatus.FOUND, headers: { Location: "/config" }, }); } @@ -112,7 +113,7 @@ export async function GET(event: APIEvent): Promise { sessionCookie.attributes, ); return new Response(null, { - status: 302, + status: httpStatus.FOUND, headers: { Location: "/config" }, }); } catch (e) { @@ -120,13 +121,13 @@ export async function GET(event: APIEvent): Promise { if (e instanceof OAuth2RequestError) { // invalid code return new Response(null, { - status: 400, + status: httpStatus.BAD_REQUEST, }); } console.error("Unknown error on callback."); console.error(e); return new Response(null, { - status: 500, + status: httpStatus.INTERNAL_SERVER_ERROR, }); } } diff --git a/src/routes/api/auth/login.ts b/src/routes/api/auth/login.ts index b971d5b..1ae41b5 100644 --- a/src/routes/api/auth/login.ts +++ b/src/routes/api/auth/login.ts @@ -1,5 +1,6 @@ import { APIEvent } from "@solidjs/start/server/types"; import { generateState } from "arctic"; +import httpStatus from "http-status"; import { setCookie } from "vinxi/http"; import { discord } from "~/lib/auth"; @@ -18,7 +19,7 @@ export async function GET(event: APIEvent) { }); return new Response(null, { - status: 302, + status: httpStatus.FOUND, headers: { Location: url.toString() }, }); } diff --git a/src/routes/api/auth/logout.ts b/src/routes/api/auth/logout.ts index 9222960..ece785d 100644 --- a/src/routes/api/auth/logout.ts +++ b/src/routes/api/auth/logout.ts @@ -1,4 +1,5 @@ import { APIEvent } from "@solidjs/start/server/types"; +import httpStatus from "http-status"; import { appendHeader } from "vinxi/http"; import { lucia } from "~/lib/auth"; @@ -13,7 +14,7 @@ export const GET = async (event: APIEvent) => { lucia.createBlankSessionCookie().serialize(), ); return new Response(null, { - status: 302, + status: httpStatus.FOUND, headers: { Location: "/" }, }); }; diff --git a/src/routes/api/boot.ts b/src/routes/api/boot.ts new file mode 100644 index 0000000..bad071c --- /dev/null +++ b/src/routes/api/boot.ts @@ -0,0 +1,35 @@ +import { APIEvent } from "@solidjs/start/server/types"; +import { eq } from "drizzle-orm"; +import db from "~/drizzle"; +import { guilds } from "~/drizzle/schema"; +import { BasicAuth } from "~/lib/auth"; +import { buildConfig } from "~/lib/responseBuilders"; +import { ErrorResponse, Res } from "~/lib/responses"; +import { APIResponse } from "~/types/backend"; + +type Path = "/api/boot"; + +export const GET = async ( + event: APIEvent, +): Promise> => { + switch (event.request.headers.get("authorization")) { + case BasicAuth.unencoded: + case BasicAuth.encoded: + break; + + default: + return ErrorResponse("UNAUTHORIZED"); + } + + const guildQuery = await db.query.guilds + .findMany({ + where: eq(guilds.id, event.params.guildId), + with: { tpMessages: true, matches: true }, + }) + .execute(); + + return Res( + "OK", + guildQuery.map((e) => buildConfig(e)), + ); +}; diff --git a/src/routes/api/bot/[guildId]/config.ts b/src/routes/api/bot/[guildId]/config.ts deleted file mode 100644 index 00595dc..0000000 --- a/src/routes/api/bot/[guildId]/config.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { APIEvent } from "@solidjs/start/server/types"; -import { eq } from "drizzle-orm"; -import db from "~/drizzle"; -import { guilds } from "~/drizzle/schema"; - -export const GET = async ({ params }: APIEvent) => { - if (params.guildId === "boot") { - const guilds = await db.query.guilds - .findMany({ - with: { - timePlanning: { with: { messages: true } }, - matches: true, - }, - }) - .execute(); - - return { guilds }; - } - - const guild = await db.query.guilds - .findFirst({ - where: eq(guilds.id, params.guildId), - with: { - timePlanning: { with: { messages: true } }, - matches: true, - }, - }) - .execute(); - - if (!guild) - return new Response(JSON.stringify({ error: "No such guild found." }), { - status: 404, - }); - - return guild; -}; - -export const DELETE = async ({ params }: APIEvent) => { - const guildQuery = await db.query.guilds - .findFirst({ - where: eq(guilds.id, params.guildId), - with: { - timePlanning: { with: { messages: true } }, - matches: true, - }, - }) - .execute(); - - if (!guildQuery) - return new Response(JSON.stringify({ error: "No such guild found." }), { - status: 404, - }); - - const guild = await db - .delete(guilds) - .where(eq(guilds.id, params.guildId)) - .returning() - .execute(); - - return guild; -}; diff --git a/src/routes/api/bot/[guildId]/matches/[channelId]/[matchMessageId].ts b/src/routes/api/bot/[guildId]/matches/[channelId]/[matchMessageId].ts deleted file mode 100644 index c701f81..0000000 --- a/src/routes/api/bot/[guildId]/matches/[channelId]/[matchMessageId].ts +++ /dev/null @@ -1,24 +0,0 @@ -import { APIEvent } from "@solidjs/start/server/types"; -import { eq } from "drizzle-orm"; -import db from "~/drizzle"; -import { guilds } from "~/drizzle/schema"; - -export const PUT = async ({ params }: APIEvent) => { - const guild = await db.query.guilds - .findFirst({ - where: eq(guilds.id, params.guildId), - with: { - timePlanning: { with: { messages: true } }, - matches: true, - }, - }) - .execute(); - - if (!guild) - return new Response(JSON.stringify({ error: "No such guild found." }), { - status: 404, - }); - - return "TODO"; - // return guild.timePlanning; -}; diff --git a/src/routes/api/bot/[guildId]/matches/[channelId]/index.ts b/src/routes/api/bot/[guildId]/matches/[channelId]/index.ts deleted file mode 100644 index bf84d60..0000000 --- a/src/routes/api/bot/[guildId]/matches/[channelId]/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { APIEvent } from "@solidjs/start/server/types"; -import { eq } from "drizzle-orm"; -import db from "~/drizzle"; -import { guilds } from "~/drizzle/schema"; - -export const POST = async ({ params }: APIEvent) => { - const guild = await db.query.guilds - .findFirst({ - where: eq(guilds.id, params.guildId), - with: { - timePlanning: { with: { messages: true } }, - matches: true, - }, - }) - .execute(); - - if (!guild) - return new Response(JSON.stringify({ error: "No such guild found." }), { - status: 404, - }); - - return "TODO"; - // return guild.timePlanning; -}; diff --git a/src/routes/api/bot/[guildId]/matches/index.ts b/src/routes/api/bot/[guildId]/matches/index.ts deleted file mode 100644 index 403aab3..0000000 --- a/src/routes/api/bot/[guildId]/matches/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { APIEvent } from "@solidjs/start/server/types"; -import { eq } from "drizzle-orm"; -import db from "~/drizzle"; -import { guilds } from "~/drizzle/schema"; - -export const GET = async ({ params }: APIEvent) => { - const guild = await db.query.guilds - .findFirst({ - where: eq(guilds.id, params.guildId), - with: { - timePlanning: { with: { messages: true } }, - matches: true, - }, - }) - .execute(); - - if (!guild) - return new Response(JSON.stringify({ error: "No such guild found." }), { - status: 404, - }); - - return "TODO"; - // return guild.timePlanning; -}; diff --git a/src/routes/api/bot/[guildId]/tp_messages.ts b/src/routes/api/bot/[guildId]/tp_messages.ts deleted file mode 100644 index 8ede1ed..0000000 --- a/src/routes/api/bot/[guildId]/tp_messages.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { APIEvent } from "@solidjs/start/server/types"; -import { eq } from "drizzle-orm"; -import db from "~/drizzle"; -import { guilds } from "~/drizzle/schema"; - -export const GET = async ({ params }: APIEvent) => { - const guild = await db.query.guilds - .findFirst({ - where: eq(guilds.id, params.guildId), - with: { - timePlanning: { with: { messages: true } }, - matches: true, - }, - }) - .execute(); - - if (!guild) - return new Response(JSON.stringify({ error: "No such guild found." }), { - status: 404, - }); - - return "TODO"; - // return guild.timePlanning; -}; - -export const PUT = async () => { - return "TODO"; -}; diff --git a/src/routes/api/bot/boot/config.ts b/src/routes/api/bot/boot/config.ts deleted file mode 100644 index c93810c..0000000 --- a/src/routes/api/bot/boot/config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import db from "~/drizzle"; - -export const GET = async () => { - const guilds = await db.query.guilds - .findMany({ - with: { - timePlanning: { with: { messages: true } }, - matches: true, - }, - }) - .execute(); - - return { guilds }; -}; diff --git a/src/types/authjs.d.ts b/src/types/authjs.d.ts deleted file mode 100644 index 18d303c..0000000 --- a/src/types/authjs.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { DefaultSession as DSession } from "@auth/core/types" - -declare module "@auth/core/types" { - /** - * Returned by `useSession`, `getSession` and received as a prop on the `SessionProvider` React Context - */ - interface Session extends DSession { - user?: { - id: string - name?: string | null - email?: string | null - image?: string | null - } - } -} diff --git a/src/types/backend.d.ts b/src/types/backend.d.ts new file mode 100644 index 0000000..0d605b6 --- /dev/null +++ b/src/types/backend.d.ts @@ -0,0 +1,70 @@ +import { HttpStatus } from "http-status"; +import { paths } from "./liljudd"; + +export type MyPaths = keyof paths; + +export type Methods = keyof paths[Path]; + +export type Responses< + Path extends MyPaths, + Method extends Methods, +> = "responses" extends keyof paths[Path][Method] + ? paths[Path][Method]["responses"] + : never; + +type StatusCodes

> = { + [CodeName in keyof HttpStatus]: HttpStatus[CodeName] extends number + ? HttpStatus[CodeName] extends keyof Responses + ? CodeName + : never + : never; +}[keyof HttpStatus]; + +export type ResponseSchemas< + Path extends MyPaths, + Method extends Methods, + Code extends StatusCodes, +> = Code extends keyof HttpStatus + ? HttpStatus[Code] extends keyof Responses + ? "content" extends keyof Responses[HttpStatus[Code]] + ? "application/json" extends keyof Responses< + Path, + Method + >[HttpStatus[Code]]["content"] + ? Responses< + Path, + Method + >[HttpStatus[Code]]["content"]["application/json"] extends never + ? null + : Responses< + Path, + Method + >[HttpStatus[Code]]["content"]["application/json"] + : never + : never + : never + : never; + +export type Parameters< + Path extends MyPaths, + Method extends Methods, +> = "parameters" extends keyof paths[Path][Method] + ? "path" extends keyof paths[Path][Method]["parameters"] + ? paths[Path][Method]["parameters"]["path"] + : never + : never; + +export type RequestBody< + Path extends MyPaths, + Method extends Methods, +> = "requestBody" extends keyof paths[Path][Method] + ? "content" extends keyof paths[Path][Method]["requestBody"] + ? "application/json" extends keyof paths[Path][Method]["requestBody"]["content"] + ? paths[Path][Method]["requestBody"]["content"]["application/json"] + : never + : never + : never; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export interface APIResponse> + extends Response {} diff --git a/src/global.d.ts b/src/types/global.d.ts similarity index 100% rename from src/global.d.ts rename to src/types/global.d.ts diff --git a/src/types/liljudd.d.ts b/src/types/liljudd.d.ts index 97f3c89..236c849 100644 --- a/src/types/liljudd.d.ts +++ b/src/types/liljudd.d.ts @@ -5,24 +5,48 @@ export interface paths { - "/api/config/{guildId}": { + "/api/boot": { /** - * Find guild config by ID - * @description Returns a single guild config + * Retrieve all guild's configs + * @description Returns all guild's configs. + */ + get: operations["getGuildsForBoot"]; + }; + "/api/{guildId}/config": { + /** + * Find a guild's config by ID + * @description Returns a single guild's config. */ get: operations["getGuildById"]; /** - * Deletes a guild config by ID - * @description Delete a guild's config + * Deletes a guild's config by ID + * @description Delete a guild's config when the bot is removed from the guild. */ delete: operations["deleteGuildById"]; }; - "/api/tp_messages/{guildId}": { + "/api/{guildId}/tp_messages": { /** - * Find guild by ID for it's tp_messages + * Find the tp_messages of guild by ID * @description Returns tp_messages for a guild */ get: operations["getTp_messagesOfGuildById"]; + /** + * Put new message IDs for tp_messages of guild by ID + * @description Returns tp_messages for a guild + */ + put: operations["putTp_messagesOfGuildById"]; + }; + "/api/{guildId}/matches": { + /** + * Find all matches of guild by ID + * @description Returns tp_messages for a guild + */ + get: operations["getMatchesOfGuildById"]; + /** + * Save a new created match of guild by ID + * @description Returns tp_messages for a guild + */ + post: operations["postMatchOfGuildById"]; }; } @@ -32,66 +56,124 @@ export interface components { schemas: { guildConfig: { /** - * Format: varchar(19) + * Format: varchar(20) * @example 1234567890123456789 */ - guildID?: string; - features?: { - time_planning?: { + guildId: string; + /** + * Format: text + * @example Europe/Berlin + */ + timezone: string; + features: { + timePlanning: { + enabled: boolean; /** - * Format: varchar(19) + * Format: varchar(20) * @example 1234567890123456789 */ - channelID?: string; - /** @example 0 0 1 * * * 60o 1w */ - cron?: string; - /** - * Format: varchar(19) - * @example 1234567890123456789 - */ - isAvailableRoleId?: string; - /** - * Format: varchar(19) - * @example 1234567890123456789 - */ - wantsToBeNotifieRoledId?: string; + channelId: string | null; + /** @example 0 */ + targetMinute: number; + /** @example 1 */ + targetHour: number; + /** @example 1 */ + targetDay: number; + roles: { + enabled: boolean; + /** + * Format: varchar(20) + * @example 1234567890123456789 + */ + isAvailableRoleId: string | null; + /** + * Format: varchar(20) + * @example 1234567890123456789 + */ + wantsToBeNotifieRoledId: string | null; + }; }; }; - matches?: components["schemas"]["match"][]; + matches: components["schemas"]["match"][]; + checksum: string; }; match: { /** - * Format: varchar(19) + * Format: varcharq(20) * @example 1234567890123456789 */ - channelID?: string; + channelId: string; /** * Format: varchar(50) * @example Scrim */ - matchType?: string; + matchType: string; /** - * Format: varchar(19) + * Format: varchar(20) * @example 1234567890123456789 */ - createrId?: string; + createrId: string; /** - * Format: varchar(19) + * Format: varchar(20) * @example 1234567890123456789 */ - roleId?: string; + roleId: string; /** * Format: varchar(100) * @example ? */ - opponentName?: string; + opponentName: string; /** - * Format: varchar(19) + * Format: varchar(20) * @example 1234567890123456789 */ - messsageId?: string; - /** @example 0 0 1 5 2 2023 60o */ - cron?: string; + messageId: string; + /** @example 2020-01-01T00:00:00Z */ + utc_ts: string; + }; + tp_messages: { + /** + * Format: varchar(20) + * @example 1234567890123456789 + */ + channelId: string; + messageIds: { + /** + * Format: varchar(20) + * @example 1234567890123456789 + */ + 0: string | null; + /** + * Format: varchar(20) + * @example 1234567890123456789 + */ + 1: string | null; + /** + * Format: varchar(20) + * @example 1234567890123456789 + */ + 2: string | null; + /** + * Format: varchar(20) + * @example 1234567890123456789 + */ + 3: string | null; + /** + * Format: varchar(20) + * @example 1234567890123456789 + */ + 4: string | null; + /** + * Format: varchar(20) + * @example 1234567890123456789 + */ + 5: string | null; + /** + * Format: varchar(20) + * @example 1234567890123456789 + */ + 6: string | null; + }; }; }; responses: never; @@ -108,8 +190,34 @@ export type external = Record; export interface operations { /** - * Find guild config by ID - * @description Returns a single guild config + * Retrieve all guild's configs + * @description Returns all guild's configs. + */ + getGuildsForBoot: { + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": components["schemas"]["guildConfig"][]; + }; + }; + /** @description Invalid ID supplied */ + 400: { + content: never; + }; + /** @description Unauthorized */ + 401: { + content: never; + }; + /** @description Guild not found */ + 404: { + content: never; + }; + }; + }; + /** + * Find a guild's config by ID + * @description Returns a single guild's config. */ getGuildById: { parameters: { @@ -129,6 +237,10 @@ export interface operations { 400: { content: never; }; + /** @description Unauthorized */ + 401: { + content: never; + }; /** @description Guild not found */ 404: { content: never; @@ -136,8 +248,8 @@ export interface operations { }; }; /** - * Deletes a guild config by ID - * @description Delete a guild's config + * Deletes a guild's config by ID + * @description Delete a guild's config when the bot is removed from the guild. */ deleteGuildById: { parameters: { @@ -155,6 +267,10 @@ export interface operations { 400: { content: never; }; + /** @description Unauthorized */ + 401: { + content: never; + }; /** @description Guild not found */ 404: { content: never; @@ -162,7 +278,7 @@ export interface operations { }; }; /** - * Find guild by ID for it's tp_messages + * Find the tp_messages of guild by ID * @description Returns tp_messages for a guild */ getTp_messagesOfGuildById: { @@ -176,7 +292,7 @@ export interface operations { /** @description successful operation */ 200: { content: { - "application/json": components["schemas"]["guildConfig"]; + "application/json": components["schemas"]["tp_messages"]; }; }; /** @description Time planning not enabled for this guild */ @@ -187,6 +303,137 @@ export interface operations { 400: { content: never; }; + /** @description Unauthorized */ + 401: { + content: never; + }; + /** @description Guild not found */ + 404: { + content: never; + }; + }; + }; + /** + * Put new message IDs for tp_messages of guild by ID + * @description Returns tp_messages for a guild + */ + putTp_messagesOfGuildById: { + parameters: { + path: { + /** @description ID of guild's tp_messages to return */ + guildId: string; + }; + }; + /** @description Put new message IDs for tp_messages in channel */ + requestBody: { + content: { + "application/json": components["schemas"]["tp_messages"]; + }; + }; + responses: { + /** @description successful operation */ + 204: { + content: never; + }; + /** @description Invalid ID supplied */ + 400: { + content: never; + }; + /** @description Unauthorized */ + 401: { + content: never; + }; + /** @description Time planning not enabled for this guild */ + 403: { + content: never; + }; + /** @description Guild not found */ + 404: { + content: never; + }; + }; + }; + /** + * Find all matches of guild by ID + * @description Returns tp_messages for a guild + */ + getMatchesOfGuildById: { + parameters: { + path: { + /** @description ID of guild's tp_messages to return */ + guildId: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + matches: components["schemas"]["match"][]; + /** + * Format: text + * @example Europe/Berlin + */ + timezone: string; + }; + }; + }; + /** @description Time planning not enabled for this guild */ + 204: { + content: never; + }; + /** @description Invalid ID supplied */ + 400: { + content: never; + }; + /** @description Unauthorized */ + 401: { + content: never; + }; + /** @description Guild not found */ + 404: { + content: never; + }; + }; + }; + /** + * Save a new created match of guild by ID + * @description Returns tp_messages for a guild + */ + postMatchOfGuildById: { + parameters: { + path: { + /** @description ID of match's guild to set */ + guildId: string; + }; + }; + /** @description Save a new created match in channel */ + requestBody: { + content: { + "application/json": { + match: components["schemas"]["match"]; + /** + * Format: text + * @description Has to match guild tz + * @example Europe/Berlin + */ + timezone: string; + }; + }; + }; + responses: { + /** @description successful operation */ + 204: { + content: never; + }; + /** @description Invalid ID supplied */ + 400: { + content: never; + }; + /** @description Unauthorized */ + 401: { + content: never; + }; /** @description Guild not found */ 404: { content: never; diff --git a/src/types/lucia-auth.d.ts b/src/types/lucia-auth.d.ts new file mode 100644 index 0000000..aea0005 --- /dev/null +++ b/src/types/lucia-auth.d.ts @@ -0,0 +1,25 @@ +import { PgColumn, PgTableWithColumns } from "drizzle-orm/pg-core"; +import { users } from "~/drizzle/schema"; +import { lucia } from "~/lib/auth"; + +declare module "lucia" { + // eslint-disable-next-line no-unused-vars + interface Register { + Lucia: typeof lucia; + DatabaseUserAttributes: DatabaseUserAttributes; + } +} + +type GetColumns = + T extends PgTableWithColumns ? First["columns"] : never; + +type ExtractDataTypes = { + [K in keyof T]: T[K] extends PgColumn + ? DataType["data"] + : never; +}; + +interface DatabaseUserAttributes + extends ExtractDataTypes> { + warst: string; +}