diff --git a/package.json b/package.json index dbfac3a..5e8b249 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,8 @@ }, "dependencies": { "@auth/drizzle-adapter": "^1.7.2", - "@capacitor/cli": "^7.2.0", - "@capacitor/core": "^7.2.0", + "@clerk/nextjs": "^6.14.3", + "@clerk/themes": "^2.2.31", "@hookform/resolvers": "^5.0.1", "@paralleldrive/cuid2": "^2.2.2", "@radix-ui/react-avatar": "^1.1.3", @@ -46,7 +46,6 @@ "drizzle-orm": "^0.41.0", "lucide-react": "^0.487.0", "next": "^15.2.3", - "next-auth": "5.0.0-beta.25", "next-pwa": "^5.6.0", "next-themes": "^0.4.6", "postgres": "^3.4.4", @@ -56,6 +55,7 @@ "server-only": "^0.0.1", "sonner": "^2.0.3", "superjson": "^2.2.1", + "svix": "^1.64.0", "tailwind-merge": "^3.1.0", "tw-animate-css": "^1.2.5", "use-debounce": "^10.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e65b0e0..4f775ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,12 +11,12 @@ importers: '@auth/drizzle-adapter': specifier: ^1.7.2 version: 1.8.0 - '@capacitor/cli': - specifier: ^7.2.0 - version: 7.2.0 - '@capacitor/core': - specifier: ^7.2.0 - version: 7.2.0 + '@clerk/nextjs': + specifier: ^6.14.3 + version: 6.14.3(next@15.2.4(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svix@1.64.0) + '@clerk/themes': + specifier: ^2.2.31 + version: 2.2.31 '@hookform/resolvers': specifier: ^5.0.1 version: 5.0.1(react-hook-form@7.55.0(react@19.1.0)) @@ -86,9 +86,6 @@ importers: next: specifier: ^15.2.3 version: 15.2.4(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - next-auth: - specifier: 5.0.0-beta.25 - version: 5.0.0-beta.25(next@15.2.4(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) next-pwa: specifier: ^5.6.0 version: 5.6.0(@babel/core@7.26.10)(esbuild@0.19.12)(next@15.2.4(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(webpack@5.99.2(esbuild@0.19.12)) @@ -116,6 +113,9 @@ importers: superjson: specifier: ^2.2.1 version: 2.2.2 + svix: + specifier: ^1.64.0 + version: 1.64.0 tailwind-merge: specifier: ^3.1.0 version: 3.1.0 @@ -133,7 +133,7 @@ importers: version: 3.24.2 zustand: specifier: ^5.0.3 - version: 5.0.3(@types/react@19.1.0)(react@19.1.0) + version: 5.0.3(@types/react@19.1.0)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) devDependencies: '@biomejs/biome': specifier: 1.9.4 @@ -179,20 +179,6 @@ packages: peerDependencies: ajv: '>=8' - '@auth/core@0.37.2': - resolution: {integrity: sha512-kUvzyvkcd6h1vpeMAojK2y7+PAV5H+0Cc9+ZlKYDFhDY31AlvsB+GW5vNO4qE3Y07KeQgvNO9U0QUx/fN62kBw==} - peerDependencies: - '@simplewebauthn/browser': ^9.0.1 - '@simplewebauthn/server': ^9.0.2 - nodemailer: ^6.8.0 - peerDependenciesMeta: - '@simplewebauthn/browser': - optional: true - '@simplewebauthn/server': - optional: true - nodemailer: - optional: true - '@auth/core@0.38.0': resolution: {integrity: sha512-ClHl44x4cY3wfJmHLpW+XrYqED0fZIzbHmwbExltzroCjR5ts3DLTWzADRba8mJFYZ8JIEJDa+lXnGl0E9Bl7Q==} peerDependencies: @@ -748,13 +734,49 @@ packages: cpu: [x64] os: [win32] - '@capacitor/cli@7.2.0': - resolution: {integrity: sha512-RNW9vtYYYSDmOdguYBSW0VpRnG/d6lGydlc9DLrJ7qbSPxFrotTz9IjkM48O+SruUma61DyuSqJttdbay2xSxg==} - engines: {node: '>=20.0.0'} - hasBin: true + '@clerk/backend@1.27.3': + resolution: {integrity: sha512-Epuhej19VcBnPfDenQoDvj+MpExs/OhJRsFM0jM1TmTt75tE6UFJwJHD5byAPX0TuGvncHKqv5FjcuPEF8zu5Q==} + engines: {node: '>=18.17.0'} + peerDependencies: + svix: ^1.62.0 + peerDependenciesMeta: + svix: + optional: true - '@capacitor/core@7.2.0': - resolution: {integrity: sha512-2zCnA6RJeZ9ec4470o8QMZEQTWpekw9FNoqm5TLc10jeCrhvHVI8MPgxdZVc3mOdFlyieYu4AS1fNxSqbS57Pw==} + '@clerk/clerk-react@5.27.0': + resolution: {integrity: sha512-OD6ZYREAtlxVLUgGJu1S6A6kUzXKo9VX+x5ZlGWjdPqfxXdrlFx7n8WqgJKREOGV8f20DcuphNCnBdLzbRCvHg==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + + '@clerk/nextjs@6.14.3': + resolution: {integrity: sha512-HMZPn8Rv9waatoKihH0HcRjiZKzTO1OmrZxkFdFwbLlyQBeOYe5u85qgTZR0elvIp6zD5kGjj+l3b6HVLqrMrw==} + engines: {node: '>=18.17.0'} + peerDependencies: + next: ^13.5.7 || ^14.2.25 || ^15.2.3 + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + + '@clerk/shared@3.6.0': + resolution: {integrity: sha512-rAbXmwXTgexye+og4iFyfyzve3is5TQL03n5k0K3qEbH7TjxUx5MbHpdTg1zRhNvrzwxpxJmcduoOuyQh1W9DA==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@clerk/themes@2.2.31': + resolution: {integrity: sha512-4jH+YU7+PigHRhSlfxmc5SsrJ7ARMIoXwq5gKSJs2iQKvRmWXMhgj+NzcdR4okJC9DapToXdYz+fPbOlLQyJ/Q==} + engines: {node: '>=18.17.0'} + + '@clerk/types@4.53.0': + resolution: {integrity: sha512-MkJckVDQtxPK9WTbPZugsqO5dbatiX1uCtSdu4b16OKtt0adZSXX72RKQLKdRfcP/eIbijruBMrGIuZR9qLEeQ==} + engines: {node: '>=18.17.0'} '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} @@ -1165,42 +1187,6 @@ packages: cpu: [x64] os: [win32] - '@ionic/cli-framework-output@2.2.8': - resolution: {integrity: sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==} - engines: {node: '>=16.0.0'} - - '@ionic/utils-array@2.1.6': - resolution: {integrity: sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==} - engines: {node: '>=16.0.0'} - - '@ionic/utils-fs@3.1.7': - resolution: {integrity: sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==} - engines: {node: '>=16.0.0'} - - '@ionic/utils-object@2.1.6': - resolution: {integrity: sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==} - engines: {node: '>=16.0.0'} - - '@ionic/utils-process@2.1.12': - resolution: {integrity: sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==} - engines: {node: '>=16.0.0'} - - '@ionic/utils-stream@3.1.7': - resolution: {integrity: sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==} - engines: {node: '>=16.0.0'} - - '@ionic/utils-subprocess@3.0.1': - resolution: {integrity: sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==} - engines: {node: '>=16.0.0'} - - '@ionic/utils-terminal@2.3.5': - resolution: {integrity: sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==} - engines: {node: '>=16.0.0'} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -1756,6 +1742,9 @@ packages: peerDependencies: rollup: ^1.20.0||^2.0.0 + '@stablelib/base64@1.0.1': + resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -1904,9 +1893,6 @@ packages: peerDependencies: typescript: '>=5.7.2' - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -1919,9 +1905,6 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/fs-extra@8.1.5': - resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} - '@types/glob@7.2.0': resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} @@ -1937,6 +1920,9 @@ packages: '@types/node@20.17.30': resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} + '@types/node@22.14.1': + resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} + '@types/react-dom@19.1.1': resolution: {integrity: sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==} peerDependencies: @@ -1948,9 +1934,6 @@ packages: '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} - '@types/slice-ansi@4.0.0': - resolution: {integrity: sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1999,10 +1982,6 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@xmldom/xmldom@0.8.10': - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -2038,22 +2017,10 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - aria-hidden@1.2.4: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} @@ -2078,10 +2045,6 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -2122,20 +2085,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - bplist-parser@0.3.2: - resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} - engines: {node: '>= 5.10.0'} - brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -2151,9 +2103,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -2184,10 +2133,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -2228,10 +2173,6 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2248,9 +2189,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} @@ -2259,10 +2200,6 @@ packages: core-js-compat@3.41.0: resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} @@ -2299,10 +2236,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -2311,6 +2244,10 @@ packages: resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} engines: {node: '>=6'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -2322,6 +2259,9 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + drizzle-kit@0.30.6: resolution: {integrity: sha512-U4wWit0fyZuGuP7iNmRleQyK2V8wCuv57vf5l3MnG4z4fzNTjY/U13M8owyQ5RavqvqxBifWORaR3wIUzlN64g==} hasBin: true @@ -2419,9 +2359,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -2430,16 +2367,6 @@ packages: electron-to-chromium@1.5.134: resolution: {integrity: sha512-zSwzrLg3jNP3bwsLqWHmS5z2nIOQ5ngMnfMZOWWtXnqqQkPVyOipxK98w+1beLw1TB+EImPNcG8wVP/cLVs2Og==} - elementtree@0.1.7: - resolution: {integrity: sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==} - engines: {node: '>= 0.4.0'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} @@ -2448,10 +2375,6 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2483,6 +2406,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + esbuild-register@3.6.0: resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: @@ -2539,15 +2465,15 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-sha256@1.3.0: + resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -2567,22 +2493,10 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} - engines: {node: '>=14.14'} - fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2639,11 +2553,6 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@11.0.1: - resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} - engines: {node: 20 || >=22} - hasBin: true - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -2712,10 +2621,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@4.1.3: - resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -2755,11 +2660,6 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2768,10 +2668,6 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-generator-function@1.1.0: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} @@ -2859,24 +2755,13 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.1: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} - jackspeak@4.1.0: - resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} - engines: {node: 20 || >=22} - jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} @@ -2894,12 +2779,13 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - jose@5.10.0: - resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} - jose@6.0.10: resolution: {integrity: sha512-skIAxZqcMkOrSwjJvplIPYrlXGpxTPnro2/QWTDCxAdWQrSTV5/KqspMWmi5WAx5+ULswASJiZ0a+1B/Lxt9cw==} + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2937,14 +2823,6 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -3034,9 +2912,8 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} - engines: {node: 20 || >=22} + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3053,6 +2930,10 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -3076,10 +2957,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -3087,27 +2964,6 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -3116,30 +2972,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - native-run@2.0.1: - resolution: {integrity: sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==} - engines: {node: '>=16.0.0'} - hasBin: true - neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next-auth@5.0.0-beta.25: - resolution: {integrity: sha512-2dJJw1sHQl2qxCrRk+KTQbeH+izFbGFPuJj5eGgBZFYyiYYtvlrBeUw1E/OJJxTRjuxbSYGnCTkUIRsIIW0bog==} - peerDependencies: - '@simplewebauthn/browser': ^9.0.1 - '@simplewebauthn/server': ^9.0.2 - next: ^14.0.0-0 || ^15.0.0-0 - nodemailer: ^6.6.5 - react: ^18.2.0 || ^19.0.0-0 - peerDependenciesMeta: - '@simplewebauthn/browser': - optional: true - '@simplewebauthn/server': - optional: true - nodemailer: - optional: true - next-pwa@5.6.0: resolution: {integrity: sha512-XV8g8C6B7UmViXU8askMEYhWwQ4qc/XqJGnexbLV68hzKaGHZDMtHsm2TNxFcbR7+ypVuth/wwpiIlMwpRJJ5A==} peerDependencies: @@ -3187,6 +3022,18 @@ packages: sass: optional: true + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -3212,10 +3059,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -3236,9 +3079,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3250,24 +3090,13 @@ packages: path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3295,10 +3124,6 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - plist@3.1.0: - resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} - engines: {node: '>=10.4.0'} - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -3315,19 +3140,11 @@ packages: resolution: {integrity: sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==} engines: {node: '>=12'} - preact-render-to-string@5.2.3: - resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} - peerDependencies: - preact: '>=10' - preact-render-to-string@6.5.11: resolution: {integrity: sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==} peerDependencies: preact: '>=10' - preact@10.11.3: - resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} - preact@10.24.3: resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} @@ -3335,17 +3152,13 @@ packages: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} - pretty-format@3.8.0: - resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3397,10 +3210,6 @@ packages: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -3437,6 +3246,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -3454,11 +3266,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} - engines: {node: 20 || >=22} - hasBin: true - rollup-plugin-terser@7.0.2: resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser @@ -3488,12 +3295,6 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - sax@1.1.4: - resolution: {integrity: sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==} - - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} @@ -3539,14 +3340,6 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - shell-quote@1.8.2: resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} engines: {node: '>= 0.4'} @@ -3567,26 +3360,19 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + snakecase-keys@8.0.1: + resolution: {integrity: sha512-Sj51kE1zC7zh6TDlNNz0/Jn1n5HiHdoQErxO8jLtnyrkJW/M5PrI7x05uDgY3BO7OUQYKCvmeMurW6BPUdwEOw==} + engines: {node: '>=18'} sonner@2.0.3: resolution: {integrity: sha512-njQ4Hht92m0sMqqHVDL32V2Oun9W1+PHO9NDv9FHfJjT3JT22IG4Jpo3FPQy+mouRKCXFWO+r67v6MrHX2zeIA==} @@ -3616,22 +3402,13 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -3648,21 +3425,10 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-comments@2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} @@ -3709,6 +3475,17 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svix-fetch@3.0.0: + resolution: {integrity: sha512-rcADxEFhSqHbraZIsjyZNh4TF6V+koloX1OzZ+AQuObX9mZ2LIMhm1buZeuc5BIZPftZpJCMBsSiBaeszo9tRw==} + + svix@1.64.0: + resolution: {integrity: sha512-qY77OJIvo4HnxLP+ayMY/SOxRCyOIxl9K/Vws0hIMkIfmR15Tr+1jIlCXFJkK/O/9q4qvJUwHvqy3yimHh/RPg==} + + swr@2.3.3: + resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + tailwind-merge@3.1.0: resolution: {integrity: sha512-aV27Oj8B7U/tAOMhJsSGdWqelfmudnGMdXIlMnk1JfsjwSjts6o8HyfN7SFH3EztzH4YH8kk6GbLTHzITJO39Q==} @@ -3719,10 +3496,6 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -3752,20 +3525,16 @@ packages: engines: {node: '>=10'} hasBin: true - through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -3776,6 +3545,10 @@ packages: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} + type-fest@4.39.1: + resolution: {integrity: sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==} + engines: {node: '>=16'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -3804,6 +3577,9 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -3828,10 +3604,6 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} @@ -3845,6 +3617,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -3871,8 +3646,10 @@ packages: '@types/react': optional: true - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 vaul@1.1.2: resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} @@ -3888,6 +3665,9 @@ packages: resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -3908,6 +3688,12 @@ packages: webpack-cli: optional: true + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -3927,11 +3713,6 @@ packages: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - which@4.0.0: resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} engines: {node: ^16.13.0 || >=18.0.0} @@ -3994,38 +3775,12 @@ packages: workbox-window@6.6.0: resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - xml2js@0.6.2: - resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} - engines: {node: '>=4.0.0'} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - - xmlbuilder@15.1.1: - resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} - engines: {node: '>=8.0'} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - zod@3.24.2: resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} @@ -4063,16 +3818,6 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - '@auth/core@0.37.2': - dependencies: - '@panva/hkdf': 1.2.1 - '@types/cookie': 0.6.0 - cookie: 0.7.1 - jose: 5.10.0 - oauth4webapi: 3.3.2 - preact: 10.11.3 - preact-render-to-string: 5.2.3(preact@10.11.3) - '@auth/core@0.38.0': dependencies: '@panva/hkdf': 1.2.1 @@ -4763,32 +4508,62 @@ snapshots: '@biomejs/cli-win32-x64@1.9.4': optional: true - '@capacitor/cli@7.2.0': + '@clerk/backend@1.27.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svix@1.64.0)': dependencies: - '@ionic/cli-framework-output': 2.2.8 - '@ionic/utils-subprocess': 3.0.1 - '@ionic/utils-terminal': 2.3.5 - commander: 12.1.0 - debug: 4.4.0 - env-paths: 2.2.1 - fs-extra: 11.3.0 - kleur: 4.1.5 - native-run: 2.0.1 - open: 8.4.2 - plist: 3.1.0 - prompts: 2.4.2 - rimraf: 6.0.1 - semver: 7.7.1 - tar: 6.2.1 + '@clerk/shared': 3.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/types': 4.53.0 + cookie: 1.0.2 + snakecase-keys: 8.0.1 tslib: 2.8.1 - xml2js: 0.6.2 + optionalDependencies: + svix: 1.64.0 transitivePeerDependencies: - - supports-color + - react + - react-dom - '@capacitor/core@7.2.0': + '@clerk/clerk-react@5.27.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: + '@clerk/shared': 3.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/types': 4.53.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) tslib: 2.8.1 + '@clerk/nextjs@6.14.3(next@15.2.4(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svix@1.64.0)': + dependencies: + '@clerk/backend': 1.27.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(svix@1.64.0) + '@clerk/clerk-react': 5.27.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/shared': 3.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clerk/types': 4.53.0 + next: 15.2.4(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + server-only: 0.0.1 + tslib: 2.8.1 + transitivePeerDependencies: + - svix + + '@clerk/shared@3.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@clerk/types': 4.53.0 + dequal: 2.0.3 + glob-to-regexp: 0.4.1 + js-cookie: 3.0.5 + std-env: 3.9.0 + swr: 2.3.3(react@19.1.0) + optionalDependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@clerk/themes@2.2.31': + dependencies: + '@clerk/types': 4.53.0 + tslib: 2.8.1 + + '@clerk/types@4.53.0': + dependencies: + csstype: 3.1.3 + '@drizzle-team/brocli@0.10.2': {} '@emnapi/runtime@1.4.0': @@ -5038,91 +4813,6 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@ionic/cli-framework-output@2.2.8': - dependencies: - '@ionic/utils-terminal': 2.3.5 - debug: 4.4.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@ionic/utils-array@2.1.6': - dependencies: - debug: 4.4.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@ionic/utils-fs@3.1.7': - dependencies: - '@types/fs-extra': 8.1.5 - debug: 4.4.0 - fs-extra: 9.1.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@ionic/utils-object@2.1.6': - dependencies: - debug: 4.4.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@ionic/utils-process@2.1.12': - dependencies: - '@ionic/utils-object': 2.1.6 - '@ionic/utils-terminal': 2.3.5 - debug: 4.4.0 - signal-exit: 3.0.7 - tree-kill: 1.2.2 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@ionic/utils-stream@3.1.7': - dependencies: - debug: 4.4.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@ionic/utils-subprocess@3.0.1': - dependencies: - '@ionic/utils-array': 2.1.6 - '@ionic/utils-fs': 3.1.7 - '@ionic/utils-process': 2.1.12 - '@ionic/utils-stream': 3.1.7 - '@ionic/utils-terminal': 2.3.5 - cross-spawn: 7.0.6 - debug: 4.4.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@ionic/utils-terminal@2.3.5': - dependencies: - '@types/slice-ansi': 4.0.0 - debug: 4.4.0 - signal-exit: 3.0.7 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - tslib: 2.8.1 - untildify: 4.0.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - supports-color - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -5623,6 +5313,8 @@ snapshots: picomatch: 2.3.1 rollup: 2.79.2 + '@stablelib/base64@1.0.1': {} + '@standard-schema/utils@0.3.0': {} '@surma/rollup-plugin-off-main-thread@2.2.3': @@ -5741,8 +5433,6 @@ snapshots: dependencies: typescript: 5.8.2 - '@types/cookie@0.6.0': {} - '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -5757,10 +5447,6 @@ snapshots: '@types/estree@1.0.7': {} - '@types/fs-extra@8.1.5': - dependencies: - '@types/node': 20.17.30 - '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 @@ -5791,6 +5477,10 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@22.14.1': + dependencies: + undici-types: 6.21.0 + '@types/react-dom@19.1.1(@types/react@19.1.0)': dependencies: '@types/react': 19.1.0 @@ -5803,8 +5493,6 @@ snapshots: dependencies: '@types/node': 20.17.30 - '@types/slice-ansi@4.0.0': {} - '@types/trusted-types@2.0.7': {} '@webassemblyjs/ast@1.14.1': @@ -5883,8 +5571,6 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@xmldom/xmldom@0.8.10': {} - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -5918,16 +5604,10 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} - aria-hidden@1.2.4: dependencies: tslib: 2.8.1 @@ -5955,8 +5635,6 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - astral-regex@2.0.0: {} - async-function@1.0.0: {} async@3.2.6: {} @@ -6002,16 +5680,8 @@ snapshots: balanced-match@1.0.2: {} - base64-js@1.5.1: {} - - big-integer@1.6.52: {} - big.js@5.2.2: {} - bplist-parser@0.3.2: - dependencies: - big-integer: 1.6.52 - brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -6032,8 +5702,6 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) - buffer-crc32@0.2.13: {} - buffer-from@1.1.2: {} builtin-modules@3.3.0: {} @@ -6066,8 +5734,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chownr@2.0.0: {} - chrome-trace-event@1.0.4: {} class-variance-authority@0.7.1: @@ -6113,8 +5779,6 @@ snapshots: color-string: 1.9.1 optional: true - commander@12.1.0: {} - commander@2.20.3: {} common-tags@1.8.2: {} @@ -6125,7 +5789,7 @@ snapshots: convert-source-map@2.0.0: {} - cookie@0.7.1: {} + cookie@1.0.2: {} copy-anything@3.0.5: dependencies: @@ -6135,12 +5799,6 @@ snapshots: dependencies: browserslist: 4.24.4 - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - crypto-random-string@2.0.0: {} csstype@3.1.3: {} @@ -6175,8 +5833,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@2.0.0: {} - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -6193,6 +5849,8 @@ snapshots: pify: 4.0.1 rimraf: 2.7.1 + dequal@2.0.3: {} + detect-libc@2.0.3: {} detect-node-es@1.1.0: {} @@ -6201,6 +5859,11 @@ snapshots: dependencies: path-type: 4.0.0 + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + drizzle-kit@0.30.6: dependencies: '@drizzle-team/brocli': 0.10.2 @@ -6222,22 +5885,12 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - ejs@3.1.10: dependencies: jake: 10.9.2 electron-to-chromium@1.5.134: {} - elementtree@0.1.7: - dependencies: - sax: 1.1.4 - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - emojis-list@3.0.0: {} enhanced-resolve@5.18.1: @@ -6245,8 +5898,6 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 - env-paths@2.2.1: {} - env-paths@3.0.0: {} es-abstract@1.23.9: @@ -6326,6 +5977,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es6-promise@4.2.8: {} + esbuild-register@3.6.0(esbuild@0.19.12): dependencies: debug: 4.4.0 @@ -6417,16 +6070,14 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-sha256@1.3.0: {} + fast-uri@3.0.6: {} fastq@1.19.1: dependencies: reusify: 1.1.0 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - filelist@1.0.4: dependencies: minimatch: 5.1.6 @@ -6450,17 +6101,6 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - fs-extra@11.3.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -6468,10 +6108,6 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -6541,15 +6177,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@11.0.1: - dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.0 - minimatch: 10.0.1 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -6620,8 +6247,6 @@ snapshots: inherits@2.0.4: {} - ini@4.1.3: {} - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -6671,16 +6296,12 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-docker@2.2.1: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: dependencies: call-bound: 1.0.4 @@ -6760,20 +6381,10 @@ snapshots: is-what@4.1.16: {} - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - isarray@2.0.5: {} - isexe@2.0.0: {} - isexe@3.1.1: {} - jackspeak@4.1.0: - dependencies: - '@isaacs/cliui': 8.0.2 - jake@10.9.2: dependencies: async: 3.2.6 @@ -6795,10 +6406,10 @@ snapshots: jiti@2.4.2: {} - jose@5.10.0: {} - jose@6.0.10: {} + js-cookie@3.0.5: {} + js-tokens@4.0.0: {} jsesc@3.0.2: {} @@ -6823,10 +6434,6 @@ snapshots: jsonpointer@5.0.1: {} - kleur@3.0.3: {} - - kleur@4.1.5: {} - leven@3.1.0: {} lightningcss-darwin-arm64@1.29.2: @@ -6892,7 +6499,9 @@ snapshots: lodash@4.17.21: {} - lru-cache@11.1.0: {} + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 lru-cache@5.1.1: dependencies: @@ -6910,6 +6519,8 @@ snapshots: dependencies: semver: 6.3.1 + map-obj@4.3.0: {} + math-intrinsics@1.1.0: {} merge-stream@2.0.0: {} @@ -6927,10 +6538,6 @@ snapshots: dependencies: mime-db: 1.52.0 - minimatch@10.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -6939,49 +6546,12 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - - minipass@7.1.2: {} - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mkdirp@1.0.4: {} - ms@2.1.3: {} nanoid@3.3.11: {} - native-run@2.0.1: - dependencies: - '@ionic/utils-fs': 3.1.7 - '@ionic/utils-terminal': 2.3.5 - bplist-parser: 0.3.2 - debug: 4.4.0 - elementtree: 0.1.7 - ini: 4.1.3 - plist: 3.1.0 - split2: 4.2.0 - through2: 4.0.2 - tslib: 2.8.1 - yauzl: 2.10.0 - transitivePeerDependencies: - - supports-color - neo-async@2.6.2: {} - next-auth@5.0.0-beta.25(next@15.2.4(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0): - dependencies: - '@auth/core': 0.37.2 - next: 15.2.4(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - next-pwa@5.6.0(@babel/core@7.26.10)(esbuild@0.19.12)(next@15.2.4(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(webpack@5.99.2(esbuild@0.19.12)): dependencies: babel-loader: 8.4.1(@babel/core@7.26.10)(webpack@5.99.2(esbuild@0.19.12)) @@ -7055,6 +6625,15 @@ snapshots: - '@babel/core' - babel-plugin-macros + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-releases@2.0.19: {} oauth4webapi@3.3.2: {} @@ -7078,12 +6657,6 @@ snapshots: dependencies: wrappy: 1.0.2 - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -7102,27 +6675,16 @@ snapshots: p-try@2.2.0: {} - package-json-from-dist@1.0.1: {} - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} path-is-inside@1.0.2: {} - path-key@3.1.1: {} - path-parse@1.0.7: {} - path-scurry@2.0.0: - dependencies: - lru-cache: 11.1.0 - minipass: 7.1.2 - path-type@4.0.0: {} - pend@1.2.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -7141,12 +6703,6 @@ snapshots: dependencies: find-up: 4.1.0 - plist@3.1.0: - dependencies: - '@xmldom/xmldom': 0.8.10 - base64-js: 1.5.1 - xmlbuilder: 15.1.1 - possible-typed-array-names@1.1.0: {} postcss@8.4.31: @@ -7163,30 +6719,18 @@ snapshots: postgres@3.4.5: {} - preact-render-to-string@5.2.3(preact@10.11.3): - dependencies: - preact: 10.11.3 - pretty-format: 3.8.0 - preact-render-to-string@6.5.11(preact@10.24.3): dependencies: preact: 10.24.3 - preact@10.11.3: {} - preact@10.24.3: {} pretty-bytes@5.6.0: {} - pretty-format@3.8.0: {} - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - punycode@2.3.1: {} + querystringify@2.2.0: {} + queue-microtask@1.2.3: {} randombytes@2.1.0: @@ -7231,12 +6775,6 @@ snapshots: react@19.1.0: {} - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -7286,6 +6824,8 @@ snapshots: require-from-string@2.0.2: {} + requires-port@1.0.0: {} + resolve-pkg-maps@1.0.0: {} resolve@1.22.10: @@ -7300,11 +6840,6 @@ snapshots: dependencies: glob: 7.2.3 - rimraf@6.0.1: - dependencies: - glob: 11.0.1 - package-json-from-dist: 1.0.1 - rollup-plugin-terser@7.0.2(rollup@2.79.2): dependencies: '@babel/code-frame': 7.26.2 @@ -7342,10 +6877,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - sax@1.1.4: {} - - sax@1.4.1: {} - scheduler@0.26.0: {} schema-utils@2.7.1: @@ -7424,12 +6955,6 @@ snapshots: '@img/sharp-win32-x64': 0.33.5 optional: true - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - shell-quote@1.8.2: {} side-channel-list@1.0.0: @@ -7460,24 +6985,23 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 optional: true - sisteransi@1.0.5: {} - slash@3.0.0: {} - slice-ansi@4.0.0: + snake-case@3.0.4: dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 + dot-case: 3.0.4 + tslib: 2.8.1 + + snakecase-keys@8.0.1: + dependencies: + map-obj: 4.3.0 + snake-case: 3.0.4 + type-fest: 4.39.1 sonner@2.0.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: @@ -7501,22 +7025,10 @@ snapshots: sourcemap-codec@1.4.8: {} - split2@4.2.0: {} + std-env@3.9.0: {} streamsearch@1.1.0: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 @@ -7556,24 +7068,12 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - strip-comments@2.0.1: {} styled-jsx@5.1.1(@babel/core@7.26.10)(react@19.1.0): @@ -7604,21 +7104,36 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svix-fetch@3.0.0: + dependencies: + node-fetch: 2.7.0 + whatwg-fetch: 3.6.20 + transitivePeerDependencies: + - encoding + + svix@1.64.0: + dependencies: + '@stablelib/base64': 1.0.1 + '@types/node': 22.14.1 + es6-promise: 4.2.8 + fast-sha256: 1.3.0 + svix-fetch: 3.0.0 + url-parse: 1.5.10 + transitivePeerDependencies: + - encoding + + swr@2.3.3(react@19.1.0): + dependencies: + dequal: 2.0.3 + react: 19.1.0 + use-sync-external-store: 1.5.0(react@19.1.0) + tailwind-merge@3.1.0: {} tailwindcss@4.1.1: {} tapable@2.2.1: {} - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - temp-dir@2.0.0: {} tempy@0.6.0: @@ -7646,26 +7161,24 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - through2@4.0.2: - dependencies: - readable-stream: 3.6.2 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 - tree-kill@1.2.2: {} - tslib@2.8.1: {} tw-animate-css@1.2.5: {} type-fest@0.16.0: {} + type-fest@4.39.1: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -7710,6 +7223,8 @@ snapshots: undici-types@6.19.8: {} + undici-types@6.21.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -7727,8 +7242,6 @@ snapshots: universalify@2.0.1: {} - untildify@4.0.0: {} - upath@1.2.0: {} update-browserslist-db@1.1.3(browserslist@4.24.4): @@ -7741,6 +7254,11 @@ snapshots: dependencies: punycode: 2.3.1 + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + use-callback-ref@1.3.3(@types/react@19.1.0)(react@19.1.0): dependencies: react: 19.1.0 @@ -7760,7 +7278,9 @@ snapshots: optionalDependencies: '@types/react': 19.1.0 - util-deprecate@1.0.2: {} + use-sync-external-store@1.5.0(react@19.1.0): + dependencies: + react: 19.1.0 vaul@1.1.2(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: @@ -7781,6 +7301,8 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} webpack-sources@1.4.3: @@ -7820,6 +7342,13 @@ snapshots: - esbuild - uglify-js + whatwg-fetch@3.6.20: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -7867,10 +7396,6 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 - which@2.0.2: - dependencies: - isexe: 2.0.0 - which@4.0.0: dependencies: isexe: 3.1.1 @@ -8000,41 +7525,14 @@ snapshots: '@types/trusted-types': 2.0.7 workbox-core: 6.6.0 - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - wrappy@1.0.2: {} - xml2js@0.6.2: - dependencies: - sax: 1.4.1 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} - - xmlbuilder@15.1.1: {} - yallist@3.1.1: {} - yallist@4.0.0: {} - - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - zod@3.24.2: {} - zustand@5.0.3(@types/react@19.1.0)(react@19.1.0): + zustand@5.0.3(@types/react@19.1.0)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): optionalDependencies: '@types/react': 19.1.0 react: 19.1.0 + use-sync-external-store: 1.5.0(react@19.1.0) diff --git a/public/sw.js b/public/sw.js index 410c9b9..535f4b4 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1 +1 @@ -if(!self.define){let e,s={};const t=(t,a)=>(t=new URL(t+".js",a).href,s[t]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=t,e.onload=s,document.head.appendChild(e)}else e=t,importScripts(t),s()})).then((()=>{let e=s[t];if(!e)throw new Error(`Module ${t} didn’t register its module`);return e})));self.define=(a,n)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(s[i])return;let c={};const r=e=>t(e,i),w={module:{uri:i},exports:c,require:r};s[i]=Promise.all(a.map((e=>w[e]||r(e)))).then((e=>(n(...e),c)))}}define(["./workbox-e9849328"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"9ddae6fb651604de7630293119506ed4"},{url:"/_next/static/D_QH_2w1wpvaQUPstb-Bw/_buildManifest.js",revision:"01b09b3e9dda7539be2313c35bd1b563"},{url:"/_next/static/D_QH_2w1wpvaQUPstb-Bw/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/1-af1f1e25dae140be.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/200-1def31964b2356b0.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/23-54b4ab21f3550ebc.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/283-d8ce32dab0aedc01.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/315-7943c6e46aec5d5e.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/323-cfe0cbab1e5ba15a.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/369-b616bc8f00fc0b77.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/427-8d8c459025f4dcb9.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/47edcb22-e33a29a5fce76af4.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/748-db3977eb7f9230bd.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/75-789b1b8b478cf3fd.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/(router)/add/page-a77d7554a2057d55.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/(router)/expense/page-ff0cf84c8ba67037.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/(router)/friend/page-0681de5cb14c92a3.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/(router)/group/page-9b31fbf8a9666021.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/(router)/layout-c185c2070dd928d9.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/(router)/page-644f0b4f976f6a09.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/_not-found/page-50a202315221fd62.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/api/auth/%5B...nextauth%5D/route-c76daf5c74849c0b.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/api/trpc/%5Btrpc%5D/route-3f6b1acc32fca989.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/layout-65f84582b7fce980.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/app/manifest.webmanifest/route-1cba1848fd15aa6a.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/framework-289b5a20f31bf2b1.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/main-094812ef791a00bb.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/main-app-da974a6306d5a606.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/pages/_app-7e5d4a60281b6427.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/pages/_error-77fa64d81664a8ec.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-69c67d16c363604a.js",revision:"D_QH_2w1wpvaQUPstb-Bw"},{url:"/_next/static/css/74d14436e2fb3a38.css",revision:"74d14436e2fb3a38"},{url:"/_next/static/media/569ce4b8f30dc480-s.p.woff2",revision:"ef6cefb32024deac234e82f932a95cbd"},{url:"/_next/static/media/ba015fad6dcf6784-s.woff2",revision:"8ea4f719af3312a055caf09f34c89a77"},{url:"/favicon.ico",revision:"7f98bbc43ba0d1dbf3564adf0821a304"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:t,state:a})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); +if(!self.define){let e,s={};const t=(t,n)=>(t=new URL(t+".js",n).href,s[t]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=t,e.onload=s,document.head.appendChild(e)}else e=t,importScripts(t),s()})).then((()=>{let e=s[t];if(!e)throw new Error(`Module ${t} didn’t register its module`);return e})));self.define=(n,a)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(s[i])return;let c={};const o=e=>t(e,i),r={module:{uri:i},exports:c,require:o};s[i]=Promise.all(n.map((e=>r[e]||o(e)))).then((e=>(a(...e),c)))}}define(["./workbox-e9849328"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"0820c38a85c862052596b67a14fe8157"},{url:"/_next/static/7ZHts89Qmk_UFK8ov_QqN/_buildManifest.js",revision:"01b09b3e9dda7539be2313c35bd1b563"},{url:"/_next/static/7ZHts89Qmk_UFK8ov_QqN/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/1-af1f1e25dae140be.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/200-1def31964b2356b0.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/23-54b4ab21f3550ebc.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/283-d8ce32dab0aedc01.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/315-7943c6e46aec5d5e.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/323-cfe0cbab1e5ba15a.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/369-b616bc8f00fc0b77.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/427-8d8c459025f4dcb9.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/47edcb22-e33a29a5fce76af4.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/748-db3977eb7f9230bd.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/75-789b1b8b478cf3fd.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/add/page-54de27b56a2dc618.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/expense/page-c5772adc1910fa74.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/friend/page-aeacac438903a352.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/group/page-ce470f9cffb07e38.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/layout-4c08d82a2e792b42.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/page-623140009262c78d.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/_not-found/page-50a202315221fd62.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/api/auth/%5B...nextauth%5D/route-c76daf5c74849c0b.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/api/trpc/%5Btrpc%5D/route-3f6b1acc32fca989.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/layout-8e88f1db16e0189d.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/manifest.webmanifest/route-1cba1848fd15aa6a.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/framework-289b5a20f31bf2b1.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/main-094812ef791a00bb.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/main-app-aff18f84bb4c7dff.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/pages/_app-7e5d4a60281b6427.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/pages/_error-77fa64d81664a8ec.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-69c67d16c363604a.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/css/64d9c3c8374914ad.css",revision:"64d9c3c8374914ad"},{url:"/_next/static/media/569ce4b8f30dc480-s.p.woff2",revision:"ef6cefb32024deac234e82f932a95cbd"},{url:"/_next/static/media/ba015fad6dcf6784-s.woff2",revision:"8ea4f719af3312a055caf09f34c89a77"},{url:"/favicon.ico",revision:"7f98bbc43ba0d1dbf3564adf0821a304"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:t,state:n})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); diff --git a/src/app/(router)/add/page.tsx b/src/app/(router)/add/page.tsx index ffdbb6d..3fd3421 100644 --- a/src/app/(router)/add/page.tsx +++ b/src/app/(router)/add/page.tsx @@ -1,22 +1,24 @@ import ExpenseForm from "@/app/_components/expense/expense-form"; import Header from "@/components/header"; -import Section from "@/components/section"; + import { Button } from "@/components/ui/button"; -import { auth } from "@/server/auth"; import { api, HydrateClient } from "@/trpc/server"; +import { currentUser } from "@clerk/nextjs/server"; import React from "react"; export default async function Page() { - const session = await auth(); - if (session?.user) void api.friend.getAll.prefetch(); + const user = await currentUser(); + if (user) void api.friend.getAll.prefetch(); + const sessionUser = await api.user.getSessionUser(); + return (
-
- +
); } diff --git a/src/app/(router)/expense/page.tsx b/src/app/(router)/expense/page.tsx index 0f883dc..4dbeca6 100644 --- a/src/app/(router)/expense/page.tsx +++ b/src/app/(router)/expense/page.tsx @@ -1,3 +1,4 @@ +import ExpenseCard from "@/app/_components/expense/expense-card"; import Header from "@/components/header"; import Section from "@/components/section"; import { Button } from "@/components/ui/button"; @@ -7,20 +8,26 @@ import React from "react"; export default async function Page() { const splits = await api.expense.getAll(); + return ( <>
-
- {splits.map(({ expense }) => ( -
-

{expense.description}

-

{expense.amount}

-
- ))} +
+ Expense Stats +
+ +
); diff --git a/src/app/(router)/friend/page.tsx b/src/app/(router)/friend/page.tsx index 490ad12..ea39456 100644 --- a/src/app/(router)/friend/page.tsx +++ b/src/app/(router)/friend/page.tsx @@ -1,13 +1,13 @@ import AddFriendDrawer from "@/app/_components/friend/add-friend-drawer"; import FriendList from "@/app/_components/friend/friend-list"; import Header from "@/components/header"; -import { auth } from "@/server/auth"; import { api, HydrateClient } from "@/trpc/server"; +import { currentUser } from "@clerk/nextjs/server"; import React from "react"; export default async function Page() { - const session = await auth(); - if (session?.user) void api.friend.getAll.prefetch(); + const user = await currentUser(); + if (user) void api.friend.getAll.prefetch(); return ( diff --git a/src/app/(router)/layout.tsx b/src/app/(router)/layout.tsx index cab1dec..afcb899 100644 --- a/src/app/(router)/layout.tsx +++ b/src/app/(router)/layout.tsx @@ -1,6 +1,4 @@ import Navbar from "@/components/navbar"; -import { auth } from "@/server/auth"; -import { redirect } from "next/navigation"; import React from "react"; export default async function Layout({ @@ -8,11 +6,9 @@ export default async function Layout({ }: { children: React.ReactNode; }) { - const session = await auth(); - if (!session?.user) return redirect("/api/auth/signin"); return (
-
+
{children}
diff --git a/src/app/(router)/page.tsx b/src/app/(router)/page.tsx index 5100239..5b40229 100644 --- a/src/app/(router)/page.tsx +++ b/src/app/(router)/page.tsx @@ -1,17 +1,18 @@ import { appConfig } from "@/app.config"; import Header from "@/components/header"; import Section from "@/components/section"; -import { auth } from "@/server/auth"; import UserDropdown from "../_components/user-dropdown"; import { ModeToggle } from "@/components/mode-toggle"; +import { UserButton } from "@clerk/nextjs"; export default async function Home() { - const session = await auth(); + // const session = await auth(); return ( <>
- + + {/* */}
diff --git a/src/app/(router)/sign-in/page.tsx b/src/app/(router)/sign-in/page.tsx new file mode 100644 index 0000000..3facb54 --- /dev/null +++ b/src/app/(router)/sign-in/page.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +function Page() { + return
SignIn page
; +} + +export default Page; diff --git a/src/app/_components/expense/expense-card.tsx b/src/app/_components/expense/expense-card.tsx new file mode 100644 index 0000000..46369b8 --- /dev/null +++ b/src/app/_components/expense/expense-card.tsx @@ -0,0 +1,87 @@ +import Avatar from "@/components/avatar"; +import { + Card, + CardContent, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + Drawer, + DrawerClose, + DrawerContent, + DrawerDescription, + DrawerFooter, + DrawerHeader, + DrawerTitle, + DrawerTrigger, +} from "@/components/ui/drawer"; + +import { Separator } from "@/components/ui/separator"; +import { getAmount } from "@/lib/utils"; +import type { Expense } from "@/server/db/schema"; +import React from "react"; +import { UserBadge } from "./expense-participants"; +import { Icons } from "@/components/icons"; + +import ExpenseDetails from "./expense-details"; +import { Button } from "@/components/ui/button"; + +function ExpenseCard({ expense }: { expense: Expense }) { + return ( + + + + + +

{expense.description}

+ + {getAmount(Number(expense.amount))} + +
+
+ + + {expense?.splits?.map((split, idx) => ( +
+ + + + + + {getAmount(Number(split.amount))} + +
+ ))} +
+ + + + + You Owe/Get + + {getAmount(Number(expense.amount))} + + +
+
+ + + Are you absolutely sure? + This action cannot be undone. + +
+ +
+ + + + + + +
+
+ ); +} + +export default ExpenseCard; diff --git a/src/app/_components/expense/expense-details.tsx b/src/app/_components/expense/expense-details.tsx new file mode 100644 index 0000000..02e0a71 --- /dev/null +++ b/src/app/_components/expense/expense-details.tsx @@ -0,0 +1,8 @@ +import type { Expense } from "@/server/db/schema"; +import React from "react"; + +function ExpenseDetails({ expense }: { expense: Expense }) { + return
ExpenseDetails for expense: {expense.id}
; +} + +export default ExpenseDetails; diff --git a/src/app/_components/expense/expense-form.tsx b/src/app/_components/expense/expense-form.tsx index 5912993..3ba1c49 100644 --- a/src/app/_components/expense/expense-form.tsx +++ b/src/app/_components/expense/expense-form.tsx @@ -1,6 +1,6 @@ "use client"; import React from "react"; -import type { Expense } from "@/server/db/schema"; +import type { Expense, User } from "@/server/db/schema"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; @@ -19,7 +19,6 @@ import { Textarea } from "@/components/ui/textarea"; import { NumberInput } from "@/components/number-input"; import { EuroIcon } from "lucide-react"; import ExpenseSplit from "./expense-split"; -import type { Session } from "next-auth"; import { toast } from "sonner"; import { api } from "@/trpc/react"; import { useExpenseStore } from "@/lib/store/expense-store"; @@ -30,13 +29,13 @@ import { cn } from "@/lib/utils"; import { useRouter } from "next/navigation"; function ExpenseForm({ - session, initialExpense, hideSubmit, + sessionUser, }: { - session: Session; initialExpense?: Expense; hideSubmit?: boolean; + sessionUser: User; }) { const form = useForm>({ resolver: zodResolver(expenseSchema), @@ -61,8 +60,8 @@ function ExpenseForm({ onSuccess(expense) { form.reset(); resetExpenseStore(); - addParticipant(session.user); - setPayments([{ amount: amount, userId: session.user.id }]); + addParticipant(sessionUser); + setPayments([{ amount: amount, userId: sessionUser.id }]); toast.message("Expense Created", { position: "bottom-center", action: { @@ -95,13 +94,13 @@ function ExpenseForm({ } React.useEffect(() => { - addParticipant(session.user); - setPayments([{ amount, userId: session.user.id }]); + addParticipant(sessionUser); + setPayments([{ amount, userId: sessionUser.id }]); }, []); const handleAmountChange = (value: number) => { setAmount(value); - const firstUserId = payments[0]?.userId ?? session.user.id; + const firstUserId = payments[0]?.userId ?? sessionUser.id; setPayments([{ amount: value, userId: firstUserId }]); recalculateSplits(); }; @@ -119,7 +118,7 @@ function ExpenseForm({ )} - + )} /> - + {/* diff --git a/src/app/_components/expense/expense-participants.tsx b/src/app/_components/expense/expense-participants.tsx index dd13eb1..7f4dba5 100644 --- a/src/app/_components/expense/expense-participants.tsx +++ b/src/app/_components/expense/expense-participants.tsx @@ -6,9 +6,30 @@ import FriendSelect from "../friend/friend-select"; import { api } from "@/trpc/react"; import { Button } from "@/components/ui/button"; import { XIcon } from "lucide-react"; -import type { Session } from "next-auth"; +import type { User } from "@/server/db/schema"; -export default function ExpenseParticipants({ session }: { session: Session }) { +export const UserBadge = ({ + user, + children, +}: { + user: User; + children?: React.ReactNode; +}) => { + return ( +
+ + {user.name} + + {children} +
+ ); +}; + +export default function ExpenseParticipants({ + sessionUserId, +}: { + sessionUserId: string; +}) { const [friends] = api.friend.getAll.useSuspenseQuery(); const participants = useExpenseStore((state) => state.participants); const addParticipant = useExpenseStore((state) => state.addParticipant); @@ -30,25 +51,21 @@ export default function ExpenseParticipants({ session }: { session: Session }) { /> {participants.map((user) => ( -
    - - - {user.name} - {session.user.id !== user.id && ( - - )} +
      + + {sessionUserId !== user.id && ( + + )} +
    ))}
diff --git a/src/app/_components/expense/expense-split.tsx b/src/app/_components/expense/expense-split.tsx index a6d8491..3911a79 100644 --- a/src/app/_components/expense/expense-split.tsx +++ b/src/app/_components/expense/expense-split.tsx @@ -3,15 +3,14 @@ import React from "react"; import FriendSelect from "../friend/friend-select"; import { Button } from "@/components/ui/button"; -import type { Session } from "next-auth"; - import { Icons } from "@/components/icons"; import { useExpenseStore } from "@/lib/store/expense-store"; import PaidByInput from "./paid-by"; import { api } from "@/trpc/react"; import SplitTo from "./split-to"; +import type { User } from "@/server/db/schema"; -export default function ExpenseSplit({ session }: { session: Session }) { +export default function ExpenseSplit({ sessionUser }: { sessionUser: User }) { const [friends] = api.friend.getAll.useSuspenseQuery(); const friendTarget = useExpenseStore((state) => state.friendTarget); @@ -22,7 +21,7 @@ export default function ExpenseSplit({ session }: { session: Session }) {
Paid by - +
and spliited diff --git a/src/app/_components/expense/paid-by.tsx b/src/app/_components/expense/paid-by.tsx index 15950d4..f31acce 100644 --- a/src/app/_components/expense/paid-by.tsx +++ b/src/app/_components/expense/paid-by.tsx @@ -8,20 +8,16 @@ import { } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { DialogClose } from "@radix-ui/react-dialog"; -import type { PublicUser } from "next-auth"; import Avatar from "@/components/avatar"; import { Icons } from "@/components/icons"; import { cn } from "@/lib/utils"; import PaidByCustomSplit from "./paid-by-custom-split"; import { useExpenseStore } from "@/lib/store/expense-store"; +import type { User } from "@/server/db/schema"; /* saved result is an array of objects with user and amount */ -export default function PaidByInput({ - sessionUser, -}: { - sessionUser: PublicUser; -}) { +export default function PaidByInput({ sessionUser }: { sessionUser: User }) { const amount = useExpenseStore((state) => state.amount); const payments = useExpenseStore((state) => state.payments); const setPayments = useExpenseStore((state) => state.setPayments); diff --git a/src/app/_components/install-prompt.tsx b/src/app/_components/install-prompt.tsx deleted file mode 100644 index 64ee3de..0000000 --- a/src/app/_components/install-prompt.tsx +++ /dev/null @@ -1,86 +0,0 @@ -// "use client"; -// import React, { useEffect, useState } from "react"; -// export function usePwaInstallStatus() { -// const [isStandalone, setIsStandalone] = useState(false); -// const [isIOS, setIsIOS] = useState(false); -// const [isAndroid, setIsAndroid] = useState(false); - -// useEffect(() => { -// const userAgent = -// navigator.userAgent || navigator.vendor || (window as any).opera; - -// // iOS detection -// const iOS = /iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream; -// setIsIOS(iOS); - -// // Android detection -// const android = /android/i.test(userAgent); -// setIsAndroid(android); - -// // PWA "standalone" mode detection (works for both iOS & Android) -// const isInStandaloneMode = -// window.matchMedia("(display-mode: standalone)").matches || -// (navigator as any).standalone === true; // for iOS Safari - -// setIsStandalone(isInStandaloneMode); -// }, []); - -// return { isIOS, isAndroid, isStandalone }; -// } - -// function InstallPrompt() { -// const { isIOS, isAndroid, isStandalone } = usePwaInstallStatus(); -// const [deferredPrompt, setDeferredPrompt] = useState(null); - -// useEffect(() => { -// const handler = (e: any) => { -// e.preventDefault(); -// setDeferredPrompt(e); -// }; - -// window.addEventListener("beforeinstallprompt", handler); - -// return () => { -// window.removeEventListener("beforeinstallprompt", handler); -// }; -// }, []); - -// const handleInstallClick = () => { -// console.log("install clicked"); - -// if (deferredPrompt) { -// deferredPrompt.prompt(); -// deferredPrompt.userChoice.then((choiceResult: any) => { -// if (choiceResult.outcome === "accepted") { -// console.log("User accepted the A2HS prompt"); -// } else { -// console.log("User dismissed the A2HS prompt"); -// } -// setDeferredPrompt(null); -// }); -// } -// }; -// if (isStandalone) { -// return null; // Already running as a PWA, no need to show install prompt -// } - -// return ( -//
-// {isIOS &&

Tap "Share" and "Add to Home Screen" to install the app.

} -// {isAndroid && } -//
-// ); -// } - -// export default function PWAWrapper({ -// children, -// }: { -// children: React.ReactNode; -// }) { -// return ( -// <> -// -// {children} -// -// ); -// } diff --git a/src/app/_components/user-dropdown.tsx b/src/app/_components/user-dropdown.tsx deleted file mode 100644 index f65029f..0000000 --- a/src/app/_components/user-dropdown.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from "react"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import type { User } from "next-auth"; -import Avatar from "@/components/avatar"; -import { LogOut } from "lucide-react"; -import { Button } from "@/components/ui/button"; -import { Icons } from "@/components/icons"; -import Link from "next/link"; - -export default function UserDropdown({ user }: { user: User }) { - return ( - - - - - - My Account - - - - - Profile - - - - - - - Billing - - - - - - - Logout - - - - - - ); -} diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts deleted file mode 100644 index 63cd05d..0000000 --- a/src/app/api/auth/[...nextauth]/route.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { handlers } from "@/server/auth"; - -export const { GET, POST } = handlers; diff --git a/src/app/api/webhooks/route.ts b/src/app/api/webhooks/route.ts new file mode 100644 index 0000000..be5a6ed --- /dev/null +++ b/src/app/api/webhooks/route.ts @@ -0,0 +1,43 @@ +import { env } from "@/env"; +import { db } from "@/server/db"; +import { users } from "@/server/db/schema"; +import { verifyWebhook } from "@clerk/nextjs/webhooks"; +import { eq } from "drizzle-orm"; + +export async function POST(req: Request) { + try { + const evt = await verifyWebhook(req, { + signingSecret: env.CLERK_WEBHOOK_SIGNING_SECRET, + }); + + const eventType = evt.type; + switch (eventType) { + case "user.created": + await db.insert(users).values({ + id: evt.data.id, + name: evt.data.first_name ?? evt.data.last_name, + image: evt.data.image_url, + }); + break; + case "user.updated": + await db + .update(users) + .set({ + name: evt.data.first_name ?? evt.data.last_name, + image: evt.data.image_url, + }) + .where(eq(users.id, evt.data.id)); + break; + case "user.deleted": + await db.delete(users).where(eq(users.id, evt.data.id!)); + break; + default: + console.log("Unknown event type:", eventType); + break; + } + return new Response("Webhook received", { status: 200 }); + } catch (err) { + console.error("Error verifying webhook:", err); + return new Response("Error verifying webhook", { status: 400 }); + } +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 9e9b0f0..ffc1702 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -3,8 +3,7 @@ import "@/styles/globals.css"; import type { Metadata } from "next"; import { Geist } from "next/font/google"; import { Toaster } from "@/components/ui/sonner"; -import { TRPCReactProvider } from "@/trpc/react"; -import { ThemeProvider } from "@/components/theme-provider"; +import Providers from "./providers"; // import PWAWrapper from "./_components/install-prompt"; export const metadata: Metadata = { @@ -24,19 +23,10 @@ export default function RootLayout({ return ( - - - {/* - */} - {children} - - - + + {children} + + ); diff --git a/src/app/providers.tsx b/src/app/providers.tsx new file mode 100644 index 0000000..2469bf1 --- /dev/null +++ b/src/app/providers.tsx @@ -0,0 +1,32 @@ +import React from "react"; +import { TRPCReactProvider } from "@/trpc/react"; +import { ThemeProvider } from "@/components/theme-provider"; + +import { ClerkProvider } from "@clerk/nextjs"; +import { dark } from "@clerk/themes"; + +function Providers({ children }: { children: React.ReactNode }) { + return ( + + + + {children} + + + + ); +} + +export default Providers; diff --git a/src/components/header.tsx b/src/components/header.tsx index a330d10..b4dfd54 100644 --- a/src/components/header.tsx +++ b/src/components/header.tsx @@ -12,9 +12,12 @@ export default function Header({ return (

{text}

-
- {children} + + {/* Glow effect */} + {glow && ( +
+ )}
); } diff --git a/src/components/icons.tsx b/src/components/icons.tsx index 154301d..636c60a 100644 --- a/src/components/icons.tsx +++ b/src/components/icons.tsx @@ -4,6 +4,7 @@ type IconName = | "logo" | "home" | "wallet" + | "brokenWallet" | "add" | "group" | "friends" @@ -81,6 +82,23 @@ export const Icons: Record = { ); }, + brokenWallet(props) { + return ( + + + + ); + }, add(props) { return ( + + {/* Glow effect */} {active && ( -
+
)}
); diff --git a/src/env.js b/src/env.js index 0a23897..cf59bca 100644 --- a/src/env.js +++ b/src/env.js @@ -2,51 +2,59 @@ import { createEnv } from "@t3-oss/env-nextjs"; import { z } from "zod"; export const env = createEnv({ - /** - * Specify your server-side environment variables schema here. This way you can ensure the app - * isn't built with invalid env vars. - */ - server: { - AUTH_SECRET: - process.env.NODE_ENV === "production" - ? z.string() - : z.string().optional(), - AUTH_DISCORD_ID: z.string(), - AUTH_DISCORD_SECRET: z.string(), - DATABASE_URL: z.string().url(), - NODE_ENV: z - .enum(["development", "test", "production"]) - .default("development"), - }, + /** + * Specify your server-side environment variables schema here. This way you can ensure the app + * isn't built with invalid env vars. + */ + server: { + // AUTH_SECRET: + // process.env.NODE_ENV === "production" + // ? z.string() + // : z.string().optional(), + // AUTH_DISCORD_ID: z.string(), + // AUTH_DISCORD_SECRET: z.string(), + DATABASE_URL: z.string().url(), + NODE_ENV: z + .enum(["development", "test", "production"]) + .default("development"), + CLERK_SECRET_KEY: z.string(), + CLERK_WEBHOOK_SIGNING_SECRET: z.string(), + }, - /** - * Specify your client-side environment variables schema here. This way you can ensure the app - * isn't built with invalid env vars. To expose them to the client, prefix them with - * `NEXT_PUBLIC_`. - */ - client: { - // NEXT_PUBLIC_CLIENTVAR: z.string(), - }, + /** + * Specify your client-side environment variables schema here. This way you can ensure the app + * isn't built with invalid env vars. To expose them to the client, prefix them with + * `NEXT_PUBLIC_`. + */ + client: { + // NEXT_PUBLIC_CLIENTVAR: z.string(), + NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string(), + }, - /** - * You can't destruct `process.env` as a regular object in the Next.js edge runtimes (e.g. - * middlewares) or client-side so we need to destruct manually. - */ - runtimeEnv: { - AUTH_SECRET: process.env.AUTH_SECRET, - AUTH_DISCORD_ID: process.env.AUTH_DISCORD_ID, - AUTH_DISCORD_SECRET: process.env.AUTH_DISCORD_SECRET, - DATABASE_URL: process.env.DATABASE_URL, - NODE_ENV: process.env.NODE_ENV, - }, - /** - * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially - * useful for Docker builds. - */ - skipValidation: !!process.env.SKIP_ENV_VALIDATION, - /** - * Makes it so that empty strings are treated as undefined. `SOME_VAR: z.string()` and - * `SOME_VAR=''` will throw an error. - */ - emptyStringAsUndefined: true, + /** + * You can't destruct `process.env` as a regular object in the Next.js edge runtimes (e.g. + * middlewares) or client-side so we need to destruct manually. + */ + runtimeEnv: { + // AUTH_SECRET: process.env.AUTH_SECRET, + // AUTH_DISCORD_ID: process.env.AUTH_DISCORD_ID, + // AUTH_DISCORD_SECRET: process.env.AUTH_DISCORD_SECRET, + NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: + process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, + CLERK_SECRET_KEY: process.env.CLERK_SECRET_KEY, + CLERK_WEBHOOK_SIGNING_SECRET: process.env.CLERK_WEBHOOK_SIGNING_SECRET, + + DATABASE_URL: process.env.DATABASE_URL, + NODE_ENV: process.env.NODE_ENV, + }, + /** + * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially + * useful for Docker builds. + */ + skipValidation: !!process.env.SKIP_ENV_VALIDATION, + /** + * Makes it so that empty strings are treated as undefined. `SOME_VAR: z.string()` and + * `SOME_VAR=''` will throw an error. + */ + emptyStringAsUndefined: true, }); diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index a224338..c0c6f95 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -16,3 +16,5 @@ export function debounce void>( timeoutId = setTimeout(() => func(...args), delay); }; } + +export const getAmount = (amount: number) => `${amount.toFixed(2)}€`; diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 0000000..908e900 --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,21 @@ +import { clerkMiddleware, createRouteMatcher } from "@clerk/nextjs/server"; + +const isProtectedRoute = createRouteMatcher([ + "/", + "/friend", + "/expense", + "/group", + "/add", +]); + +export default clerkMiddleware(async (auth, req) => { + if (isProtectedRoute(req)) await auth.protect(); +}); +export const config = { + matcher: [ + // Skip Next.js internals and all static files, unless found in search params + "/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)", + // Always run for API routes + "/(api|trpc)(.*)", + ], +}; diff --git a/src/server/api/root.ts b/src/server/api/root.ts index 72453a3..e481ef0 100644 --- a/src/server/api/root.ts +++ b/src/server/api/root.ts @@ -1,6 +1,5 @@ -import { expenseRouter } from "@/server/api/routers/expense"; import { createCallerFactory, createTRPCRouter } from "@/server/api/trpc"; -import { friendRouter } from "./routers/friend"; +import { expenseRouter, friendRouter, userRouter } from "./routers"; /** * This is the primary router for your server. @@ -10,6 +9,7 @@ import { friendRouter } from "./routers/friend"; export const appRouter = createTRPCRouter({ expense: expenseRouter, friend: friendRouter, + user: userRouter, }); // export type definition of API diff --git a/src/server/api/routers/expense.ts b/src/server/api/routers/expense.ts index f1ad7d3..c5c3d08 100644 --- a/src/server/api/routers/expense.ts +++ b/src/server/api/routers/expense.ts @@ -5,17 +5,41 @@ import { expenses, expenseSplits, type ExpenseSplit } from "@/server/db/schema"; import { expenseSchema, expenseSplitSchema } from "@/lib/validations/expense"; import { eq, or } from "drizzle-orm"; +function restructureExpenseSplits(expenseSplits: Array) { + const expensesMap = new Map(); + + expenseSplits.forEach((split) => { + const expenseId = split.expenseId; + const expense = split.expense; + + if (!expensesMap.has(expenseId)) { + expensesMap.set(expenseId, { + ...expense, + splits: [], + }); + } + + expensesMap.get(expenseId).splits.push(split); + }); + + return Array.from(expensesMap.values()); +} + export const expenseRouter = createTRPCRouter({ getAll: protectedProcedure.query(async ({ ctx }) => { - return await ctx.db.query.expenseSplits.findMany({ + const splits = await ctx.db.query.expenseSplits.findMany({ where: or( - eq(expenseSplits.owedFromId, ctx.session.user.id), - eq(expenseSplits.owedToId, ctx.session.user.id) + eq(expenseSplits.owedFromId, ctx.auth.userId), + eq(expenseSplits.owedToId, ctx.auth.userId) ), with: { + owedFrom: true, + owedTo: true, expense: true, }, }); + const expenses = restructureExpenseSplits(splits); + return expenses; }), create: protectedProcedure .input( @@ -34,7 +58,7 @@ export const expenseRouter = createTRPCRouter({ const [expense] = await ctx.db .insert(expenses) .values({ - createdById: ctx.session.user.id, + createdById: ctx.auth.userId, ...input.expense, amount: input.expense.amount.toString(), }) diff --git a/src/server/api/routers/friend.ts b/src/server/api/routers/friend.ts index 930a2d4..5c16541 100644 --- a/src/server/api/routers/friend.ts +++ b/src/server/api/routers/friend.ts @@ -10,8 +10,8 @@ export const friendRouter = createTRPCRouter({ getAll: protectedProcedure.query(async ({ ctx }) => { const friends = await ctx.db.query.friendships.findMany({ where: or( - eq(friendships.userOneId, ctx.session.user.id), - eq(friendships.userTwoId, ctx.session.user.id) + eq(friendships.userOneId, ctx.auth.userId), + eq(friendships.userTwoId, ctx.auth.userId) ), with: { userOne: true, @@ -21,8 +21,8 @@ export const friendRouter = createTRPCRouter({ return friends.map((f) => ({ id: f.id, status: f.status, - requestedBy: ctx.session.user.id === f.userOneId ? "me" : "them", - user: ctx.session.user.id === f.userOneId ? f.userTwo : f.userOne, + requestedBy: ctx.auth.userId === f.userOneId ? "me" : "them", + user: ctx.auth.userId === f.userOneId ? f.userTwo : f.userOne, })); }), getPendingFriendRequests: protectedProcedure.query( @@ -30,8 +30,8 @@ export const friendRouter = createTRPCRouter({ await ctx.db.query.friendships.findMany({ where: and( or( - eq(friendships.userOneId, ctx.session.user.id), - eq(friendships.userTwoId, ctx.session.user.id) + eq(friendships.userOneId, ctx.auth.userId), + eq(friendships.userTwoId, ctx.auth.userId) ), eq(friendships.status, "pending") ), @@ -40,7 +40,7 @@ export const friendRouter = createTRPCRouter({ search: protectedProcedure .input(z.object({ search: z.string() })) .query(async ({ ctx, input }) => { - const userId = ctx.session.user.id; + const userId = ctx.auth.userId; const friendIds = await ctx.db.query.friendships.findMany({ where: and( or( @@ -91,7 +91,7 @@ export const friendRouter = createTRPCRouter({ .input(z.object({ userId: z.string() })) .mutation(async ({ ctx, input }) => { await ctx.db.insert(friendships).values({ - userOneId: ctx.session.user.id, + userOneId: ctx.auth.userId, userTwoId: input.userId, status: "pending", }); diff --git a/src/server/api/routers/index.ts b/src/server/api/routers/index.ts new file mode 100644 index 0000000..8d75cc1 --- /dev/null +++ b/src/server/api/routers/index.ts @@ -0,0 +1,3 @@ +export { friendRouter } from "./friend"; +export { expenseRouter } from "./expense"; +export { userRouter } from "./user"; diff --git a/src/server/api/routers/user.ts b/src/server/api/routers/user.ts index 5daf9ae..32be565 100644 --- a/src/server/api/routers/user.ts +++ b/src/server/api/routers/user.ts @@ -1,14 +1,12 @@ -import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc"; +import { eq } from "drizzle-orm"; +import { createTRPCRouter, protectedProcedure } from "../trpc"; +import { users } from "@/server/db/schema"; export const userRouter = createTRPCRouter({ - getAll: protectedProcedure.query( - async ({ ctx }) => - await ctx.db.query.users.findMany({ - columns: { - id: true, - name: true, - image: true, - }, - }) - ), + getSessionUser: protectedProcedure.query(async ({ ctx }) => { + const user = await ctx.db.query.users.findFirst({ + where: eq(users.id, ctx.auth.userId), + }); + return user; + }), }); diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index ab1ce47..ce434e6 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -11,8 +11,8 @@ import { TRPCError, initTRPC } from "@trpc/server"; import superjson from "superjson"; import { ZodError } from "zod"; -import { auth } from "@/server/auth"; import { db } from "@/server/db"; +import { auth } from "@clerk/nextjs/server"; /** * 1. CONTEXT @@ -27,13 +27,13 @@ import { db } from "@/server/db"; * @see https://trpc.io/docs/server/context */ export const createTRPCContext = async (opts: { headers: Headers }) => { - const session = await auth(); + const clerkAuth = await auth(); - return { - db, - session, - ...opts, - }; + return { + db, + auth: clerkAuth, + ...opts, + }; }; /** @@ -44,17 +44,17 @@ export const createTRPCContext = async (opts: { headers: Headers }) => { * errors on the backend. */ const t = initTRPC.context().create({ - transformer: superjson, - errorFormatter({ shape, error }) { - return { - ...shape, - data: { - ...shape.data, - zodError: - error.cause instanceof ZodError ? error.cause.flatten() : null, - }, - }; - }, + transformer: superjson, + errorFormatter({ shape, error }) { + return { + ...shape, + data: { + ...shape.data, + zodError: + error.cause instanceof ZodError ? error.cause.flatten() : null, + }, + }; + }, }); /** @@ -85,20 +85,20 @@ export const createTRPCRouter = t.router; * network latency that would occur in production but not in local development. */ const timingMiddleware = t.middleware(async ({ next, path }) => { - const start = Date.now(); + const start = Date.now(); - if (t._config.isDev) { - // artificial delay in dev - const waitMs = Math.floor(Math.random() * 400) + 100; - await new Promise((resolve) => setTimeout(resolve, waitMs)); - } + if (t._config.isDev) { + // artificial delay in dev + const waitMs = Math.floor(Math.random() * 400) + 100; + await new Promise((resolve) => setTimeout(resolve, waitMs)); + } - const result = await next(); + const result = await next(); - const end = Date.now(); - console.log(`[TRPC] ${path} took ${end - start}ms to execute`); + const end = Date.now(); + console.log(`[TRPC] ${path} took ${end - start}ms to execute`); - return result; + return result; }); /** @@ -119,15 +119,15 @@ export const publicProcedure = t.procedure.use(timingMiddleware); * @see https://trpc.io/docs/procedures */ export const protectedProcedure = t.procedure - .use(timingMiddleware) - .use(({ ctx, next }) => { - if (!ctx.session?.user) { - throw new TRPCError({ code: "UNAUTHORIZED" }); - } - return next({ - ctx: { - // infers the `session` as non-nullable - session: { ...ctx.session, user: ctx.session.user }, - }, - }); - }); + .use(timingMiddleware) + .use(({ ctx, next }) => { + if (!ctx.auth?.userId) { + throw new TRPCError({ code: "UNAUTHORIZED" }); + } + return next({ + ctx: { + // infers the `session` as non-nullable + auth: { ...ctx.auth, userId: ctx.auth.userId }, + }, + }); + }); diff --git a/src/server/auth/config.ts b/src/server/auth/config.ts deleted file mode 100644 index 3d3774e..0000000 --- a/src/server/auth/config.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { DrizzleAdapter } from "@auth/drizzle-adapter"; -import type { DefaultSession, NextAuthConfig, User } from "next-auth"; -import DiscordProvider from "next-auth/providers/discord"; - -import { db } from "@/server/db"; -import { - accounts, - sessions, - users, - verificationTokens, -} from "@/server/db/schema"; - -/** - * Module augmentation for `next-auth` types. Allows us to add custom properties to the `session` - * object and keep type safety. - * - * @see https://next-auth.js.org/getting-started/typescript#module-augmentation - */ -declare module "next-auth" { - interface Session extends DefaultSession { - user: { - id: string; - // ...other properties - // role: UserRole; - } & DefaultSession["user"]; - } - - // interface User { - // // ...other properties - // // role: UserRole; - // } - type PublicUser = Pick; -} - -/** - * Options for NextAuth.js used to configure adapters, providers, callbacks, etc. - * - * @see https://next-auth.js.org/configuration/options - */ -export const authConfig = { - trustHost: true, - providers: [ - DiscordProvider, - /** - * ...add more providers here. - * - * Most other providers require a bit more work than the Discord provider. For example, the - * GitHub provider requires you to add the `refresh_token_expires_in` field to the Account - * model. Refer to the NextAuth.js docs for the provider you want to use. Example: - * - * @see https://next-auth.js.org/providers/github - */ - ], - adapter: DrizzleAdapter(db, { - usersTable: users, - accountsTable: accounts, - sessionsTable: sessions, - verificationTokensTable: verificationTokens, - }), - - callbacks: { - session: ({ session, user }) => ({ - ...session, - user: { - ...session.user, - id: user.id, - }, - }), - }, -} satisfies NextAuthConfig; diff --git a/src/server/auth/index.ts b/src/server/auth/index.ts deleted file mode 100644 index 76c146d..0000000 --- a/src/server/auth/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import NextAuth from "next-auth"; -import { cache } from "react"; - -import { authConfig } from "./config"; - -const { auth: uncachedAuth, handlers, signIn, signOut } = NextAuth(authConfig); - -const auth = cache(uncachedAuth); - -export { auth, handlers, signIn, signOut }; diff --git a/src/server/db/index.ts b/src/server/db/index.ts index 5e4fea9..011e0af 100644 --- a/src/server/db/index.ts +++ b/src/server/db/index.ts @@ -9,7 +9,7 @@ import * as schema from "./schema"; * update. */ const globalForDb = globalThis as unknown as { - conn: postgres.Sql | undefined; + conn: postgres.Sql | undefined; }; const conn = globalForDb.conn ?? postgres(env.DATABASE_URL); diff --git a/src/server/db/schema.ts b/src/server/db/schema.ts index 72e6f28..fd4c41a 100644 --- a/src/server/db/schema.ts +++ b/src/server/db/schema.ts @@ -1,8 +1,6 @@ import { relations, sql } from "drizzle-orm"; -import { index, pgTableCreator, primaryKey } from "drizzle-orm/pg-core"; -import type { User } from "next-auth"; -import type { AdapterAccount } from "next-auth/adapters"; - +import { index, pgTableCreator } from "drizzle-orm/pg-core"; +import { createId as createCuid2 } from "@paralleldrive/cuid2"; /** * This is an example of how to use the multi-project schema feature of Drizzle ORM. Use the same * database instance for multiple projects. @@ -11,17 +9,16 @@ import type { AdapterAccount } from "next-auth/adapters"; */ export const createTable = pgTableCreator((name) => `betterwise_${name}`); +const createId = () => createCuid2(); + export const expenses = createTable( "expense", (d) => ({ - id: d - .uuid() - .primaryKey() - .default(sql`gen_random_uuid()`), - groupId: d.uuid(), - friendId: d.uuid(), + id: d.varchar().primaryKey().$defaultFn(createId), + groupId: d.varchar(), + friendId: d.varchar(), createdById: d - .uuid() + .varchar() .notNull() .references(() => users.id), amount: d.numeric({ scale: 2 }), @@ -61,20 +58,17 @@ export type Expense = typeof expenses.$inferSelect & { export const expenseSplits = createTable( "expense_split", (d) => ({ - id: d - .uuid() - .primaryKey() - .default(sql`gen_random_uuid()`), + id: d.varchar().primaryKey().$defaultFn(createId), expenseId: d - .uuid() + .varchar() .notNull() .references(() => expenses.id, { onDelete: "cascade" }), owedToId: d - .uuid() + .varchar() .notNull() .references(() => users.id), owedFromId: d - .uuid() + .varchar() .notNull() .references(() => users.id), amount: d.numeric({ scale: 2 }), @@ -105,22 +99,20 @@ export const expenseSplitRelations = relations(expenseSplits, ({ one }) => ({ export type ExpenseSplit = typeof expenseSplits.$inferSelect & { expense?: Expense; paidBy?: User; - owedBy?: User; + owedTo?: User; + owedFrom?: User; }; export const settlements = createTable( "settlement", (d) => ({ - id: d - .uuid() - .primaryKey() - .default(sql`gen_random_uuid()`), + id: d.varchar().primaryKey().$defaultFn(createId), payerId: d - .uuid() + .varchar() .notNull() .references(() => users.id), receiverId: d - .uuid() + .varchar() .notNull() .references(() => users.id), amount: d.numeric().notNull(), @@ -153,18 +145,16 @@ export type Settlement = typeof settlements.$inferSelect & { }; // Groups Table + export const groups = createTable( "group", (d) => ({ - id: d - .uuid() - .primaryKey() - .default(sql`gen_random_uuid()`), + id: d.varchar().primaryKey().$defaultFn(createId), name: d.varchar({ length: 255 }).notNull(), createdById: d - .uuid() + .varchar() .notNull() - .references(() => users.id, { onDelete: "cascade" }), + .references(() => users.id), createdAt: d .timestamp({ withTimezone: true }) .default(sql`CURRENT_TIMESTAMP`) @@ -190,16 +180,13 @@ export type Group = typeof groups.$inferSelect & { export const groupMembers = createTable( "group_member", (d) => ({ - id: d - .uuid() - .primaryKey() - .default(sql`gen_random_uuid()`), + id: d.varchar().primaryKey().$defaultFn(createId), groupId: d - .uuid() + .varchar() .notNull() .references(() => groups.id, { onDelete: "cascade" }), userId: d - .uuid() + .varchar() .notNull() .references(() => users.id, { onDelete: "cascade" }), joinedAt: d @@ -233,19 +220,17 @@ export type GroupMember = typeof groupMembers.$inferSelect & { }; // Friendships Table (Tracks friend relationships) + export const friendships = createTable( "friendship", (d) => ({ - id: d - .uuid() - .primaryKey() - .default(sql`gen_random_uuid()`), + id: d.varchar().primaryKey().$defaultFn(createId), userOneId: d - .uuid() + .varchar() .notNull() .references(() => users.id, { onDelete: "cascade" }), userTwoId: d - .uuid() + .varchar() .notNull() .references(() => users.id, { onDelete: "cascade" }), status: d @@ -281,76 +266,11 @@ export type Friendship = typeof friendships.$inferSelect & { }; export const users = createTable("user", (d) => ({ - id: d - .uuid() - .primaryKey() - .default(sql`gen_random_uuid()`), + id: d.varchar().notNull().primaryKey().unique(), name: d.varchar({ length: 255 }), - email: d.varchar({ length: 255 }).notNull(), - emailVerified: d - .timestamp({ - mode: "date", - withTimezone: true, - }) - .default(sql`CURRENT_TIMESTAMP`), image: d.varchar({ length: 255 }), })); -export const usersRelations = relations(users, ({ many }) => ({ - accounts: many(accounts), -})); +export type User = typeof users.$inferSelect; -export const accounts = createTable( - "account", - (d) => ({ - userId: d - .uuid() - .notNull() - .references(() => users.id), - type: d.varchar({ length: 255 }).$type().notNull(), - provider: d.varchar({ length: 255 }).notNull(), - providerAccountId: d.varchar({ length: 255 }).notNull(), - refresh_token: d.text(), - access_token: d.text(), - expires_at: d.integer(), - token_type: d.varchar({ length: 255 }), - scope: d.varchar({ length: 255 }), - id_token: d.text(), - session_state: d.varchar({ length: 255 }), - }), - (t) => [ - primaryKey({ columns: [t.provider, t.providerAccountId] }), - index("account_user_id_idx").on(t.userId), - ] -); - -export const accountsRelations = relations(accounts, ({ one }) => ({ - user: one(users, { fields: [accounts.userId], references: [users.id] }), -})); - -export const sessions = createTable( - "session", - (d) => ({ - sessionToken: d.varchar({ length: 255 }).notNull().primaryKey(), - userId: d - .uuid() - .notNull() - .references(() => users.id), - expires: d.timestamp({ mode: "date", withTimezone: true }).notNull(), - }), - (t) => [index("t_user_id_idx").on(t.userId)] -); - -export const sessionsRelations = relations(sessions, ({ one }) => ({ - user: one(users, { fields: [sessions.userId], references: [users.id] }), -})); - -export const verificationTokens = createTable( - "verification_token", - (d) => ({ - identifier: d.varchar({ length: 255 }).notNull(), - token: d.varchar({ length: 255 }).notNull(), - expires: d.timestamp({ mode: "date", withTimezone: true }).notNull(), - }), - (t) => [primaryKey({ columns: [t.identifier, t.token] })] -); +// export const usersRelations = relations(users, ({ many }) => ({}));