Working on Auth flows. Struggling with getting client and server to both update when signing in or out.

This commit is contained in:
Gabriel Brown 2025-05-30 10:06:34 -05:00
parent 22cf7be870
commit 28569c4f4e
11 changed files with 344 additions and 223 deletions

View File

@ -29,29 +29,29 @@
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.510.0",
"next": "^15.3.2",
"next": "^15.3.3",
"next-themes": "^0.4.6",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-hook-form": "^7.56.4",
"sonner": "^2.0.3",
"zod": "^3.25.32"
"zod": "^3.25.42"
},
"devDependencies": {
"@eslint/eslintrc": "^3.3.1",
"@tailwindcss/postcss": "^4.1.8",
"@types/node": "^20.17.51",
"@types/node": "^20.17.55",
"@types/react": "^19.1.6",
"@types/react-dom": "^19.1.5",
"eslint": "^9.27.0",
"eslint-config-next": "^15.3.2",
"postcss": "^8.5.3",
"eslint-config-next": "^15.3.3",
"postcss": "^8.5.4",
"prettier": "^3.5.3",
"prettier-plugin-tailwindcss": "^0.6.11",
"tailwind-merge": "^3.3.0",
"tailwindcss": "^4.1.8",
"tailwindcss-animate": "^1.0.7",
"tw-animate-css": "^1.3.0",
"tw-animate-css": "^1.3.2",
"typescript": "^5.8.3",
"typescript-eslint": "^8.33.0"
},

362
pnpm-lock.yaml generated
View File

@ -37,7 +37,7 @@ importers:
version: 2.49.8
'@t3-oss/env-nextjs':
specifier: ^0.12.0
version: 0.12.0(typescript@5.8.3)(zod@3.25.32)
version: 0.12.0(typescript@5.8.3)(zod@3.25.42)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@ -48,8 +48,8 @@ importers:
specifier: ^0.510.0
version: 0.510.0(react@19.1.0)
next:
specifier: ^15.3.2
version: 15.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
specifier: ^15.3.3
version: 15.3.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@ -66,8 +66,8 @@ importers:
specifier: ^2.0.3
version: 2.0.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
zod:
specifier: ^3.25.32
version: 3.25.32
specifier: ^3.25.42
version: 3.25.42
devDependencies:
'@eslint/eslintrc':
specifier: ^3.3.1
@ -76,8 +76,8 @@ importers:
specifier: ^4.1.8
version: 4.1.8
'@types/node':
specifier: ^20.17.51
version: 20.17.51
specifier: ^20.17.55
version: 20.17.55
'@types/react':
specifier: ^19.1.6
version: 19.1.6
@ -88,11 +88,11 @@ importers:
specifier: ^9.27.0
version: 9.27.0(jiti@2.4.2)
eslint-config-next:
specifier: ^15.3.2
version: 15.3.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)
specifier: ^15.3.3
version: 15.3.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)
postcss:
specifier: ^8.5.3
version: 8.5.3
specifier: ^8.5.4
version: 8.5.4
prettier:
specifier: ^3.5.3
version: 3.5.3
@ -109,8 +109,8 @@ importers:
specifier: ^1.0.7
version: 1.0.7(tailwindcss@4.1.8)
tw-animate-css:
specifier: ^1.3.0
version: 1.3.0
specifier: ^1.3.2
version: 1.3.2
typescript:
specifier: ^5.8.3
version: 5.8.3
@ -356,56 +356,56 @@ packages:
'@napi-rs/wasm-runtime@0.2.10':
resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==}
'@next/env@15.3.2':
resolution: {integrity: sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==}
'@next/env@15.3.3':
resolution: {integrity: sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==}
'@next/eslint-plugin-next@15.3.2':
resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==}
'@next/eslint-plugin-next@15.3.3':
resolution: {integrity: sha512-VKZJEiEdpKkfBmcokGjHu0vGDG+8CehGs90tBEy/IDoDDKGngeyIStt2MmE5FYNyU9BhgR7tybNWTAJY/30u+Q==}
'@next/swc-darwin-arm64@15.3.2':
resolution: {integrity: sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==}
'@next/swc-darwin-arm64@15.3.3':
resolution: {integrity: sha512-WRJERLuH+O3oYB4yZNVahSVFmtxRNjNF1I1c34tYMoJb0Pve+7/RaLAJJizyYiFhjYNGHRAE1Ri2Fd23zgDqhg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@next/swc-darwin-x64@15.3.2':
resolution: {integrity: sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==}
'@next/swc-darwin-x64@15.3.3':
resolution: {integrity: sha512-XHdzH/yBc55lu78k/XwtuFR/ZXUTcflpRXcsu0nKmF45U96jt1tsOZhVrn5YH+paw66zOANpOnFQ9i6/j+UYvw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@next/swc-linux-arm64-gnu@15.3.2':
resolution: {integrity: sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==}
'@next/swc-linux-arm64-gnu@15.3.3':
resolution: {integrity: sha512-VZ3sYL2LXB8znNGcjhocikEkag/8xiLgnvQts41tq6i+wql63SMS1Q6N8RVXHw5pEUjiof+II3HkDd7GFcgkzw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-arm64-musl@15.3.2':
resolution: {integrity: sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==}
'@next/swc-linux-arm64-musl@15.3.3':
resolution: {integrity: sha512-h6Y1fLU4RWAp1HPNJWDYBQ+e3G7sLckyBXhmH9ajn8l/RSMnhbuPBV/fXmy3muMcVwoJdHL+UtzRzs0nXOf9SA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-x64-gnu@15.3.2':
resolution: {integrity: sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==}
'@next/swc-linux-x64-gnu@15.3.3':
resolution: {integrity: sha512-jJ8HRiF3N8Zw6hGlytCj5BiHyG/K+fnTKVDEKvUCyiQ/0r5tgwO7OgaRiOjjRoIx2vwLR+Rz8hQoPrnmFbJdfw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-linux-x64-musl@15.3.2':
resolution: {integrity: sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==}
'@next/swc-linux-x64-musl@15.3.3':
resolution: {integrity: sha512-HrUcTr4N+RgiiGn3jjeT6Oo208UT/7BuTr7K0mdKRBtTbT4v9zJqCDKO97DUqqoBK1qyzP1RwvrWTvU6EPh/Cw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-win32-arm64-msvc@15.3.2':
resolution: {integrity: sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==}
'@next/swc-win32-arm64-msvc@15.3.3':
resolution: {integrity: sha512-SxorONgi6K7ZUysMtRF3mIeHC5aA3IQLmKFQzU0OuhuUYwpOBc1ypaLJLP5Bf3M9k53KUUUj4vTPwzGvl/NwlQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@next/swc-win32-x64-msvc@15.3.2':
resolution: {integrity: sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==}
'@next/swc-win32-x64-msvc@15.3.3':
resolution: {integrity: sha512-4QZG6F8enl9/S2+yIiOiju0iCTFd93d8VC1q9LZS4p/Xuk81W2QDjCFeoogmrWWkAD59z8ZxepBQap2dKS5ruw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@ -932,8 +932,8 @@ packages:
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
'@types/node@20.17.51':
resolution: {integrity: sha512-hccptBl7C8lHiKxTBsY6vYYmqpmw1E/aGR/8fmueE+B390L3pdMOpNSRvFO4ZnXzW5+p2HBXV0yNABd2vdk22Q==}
'@types/node@20.17.55':
resolution: {integrity: sha512-ESpPDUEtW1a9nueMQtcTq/5iY/7osurPpBpFKH2VAyREKdzoFRRod6Oms0SSTfV7u52CcH7b6dFVnjfPD8fxWg==}
'@types/phoenix@1.6.6':
resolution: {integrity: sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==}
@ -1006,88 +1006,88 @@ packages:
resolution: {integrity: sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@unrs/resolver-binding-darwin-arm64@1.7.5':
resolution: {integrity: sha512-efMrMFYcAY+Bg3TjHS9TIxyLW7DCkbmWyaePXA/FTuNNgzUgM9ffBoeA+4g90DjHMUuGyIcM4+96w1RoxNP3Tw==}
'@unrs/resolver-binding-darwin-arm64@1.7.8':
resolution: {integrity: sha512-rsRK8T7yxraNRDmpFLZCWqpea6OlXPNRRCjWMx24O1V86KFol7u2gj9zJCv6zB1oJjtnzWceuqdnCgOipFcJPA==}
cpu: [arm64]
os: [darwin]
'@unrs/resolver-binding-darwin-x64@1.7.5':
resolution: {integrity: sha512-K5Usy9LwmeLohtZGOC0IxhybYluGMrtBP/l73jVNKvuk240KmblE6lphSbydrocvEZEVfTfLmba8UeoSUfnh4A==}
'@unrs/resolver-binding-darwin-x64@1.7.8':
resolution: {integrity: sha512-16yEMWa+Olqkk8Kl6Bu0ltT5OgEedkSAsxcz1B3yEctrDYp3EMBu/5PPAGhWVGnwhtf3hNe3y15gfYBAjOv5tQ==}
cpu: [x64]
os: [darwin]
'@unrs/resolver-binding-freebsd-x64@1.7.5':
resolution: {integrity: sha512-4vur1vMwq/hOkruiR24shuatm56jZo098x8ETchIewX8RbSwyTqHjnnJZ1WTLX2Vkg9hgy4RQqFpLnrL6Xp/hQ==}
'@unrs/resolver-binding-freebsd-x64@1.7.8':
resolution: {integrity: sha512-ST4uqF6FmdZQgv+Q73FU1uHzppeT4mhX3IIEmHlLObrv5Ep50olWRz0iQ4PWovadjHMTAmpuJAGaAuCZYb7UAQ==}
cpu: [x64]
os: [freebsd]
'@unrs/resolver-binding-linux-arm-gnueabihf@1.7.5':
resolution: {integrity: sha512-/hD8IHDjlTUb1/ePHavsaHYRF8lMDh+14TXHmxC8cwqrBVoHIzGZV66z2VjBDpDUtmAutptOhfKBpRLv0O0ywA==}
'@unrs/resolver-binding-linux-arm-gnueabihf@1.7.8':
resolution: {integrity: sha512-Z/A/4Rm2VWku2g25C3tVb986fY6unx5jaaCFpx1pbAj0OKkyuJ5wcQLHvNbIcJ9qhiYwXfrkB7JNlxrAbg7YFg==}
cpu: [arm]
os: [linux]
'@unrs/resolver-binding-linux-arm-musleabihf@1.7.5':
resolution: {integrity: sha512-UPrkyN5ziuT+uRATrwabvl8JZNMt1T/fN96bZVnK3E34lQLbku99biFEUHZgXh0knJzoSoAKWfyMyyrcv4Dqfg==}
'@unrs/resolver-binding-linux-arm-musleabihf@1.7.8':
resolution: {integrity: sha512-HN0p7o38qKmDo3bZUiQa6gP7Qhf0sKgJZtRfSHi6JL2Gi4NaUVF0EO1sQ1RHbeQ4VvfjUGMh3QE5dxEh06BgQQ==}
cpu: [arm]
os: [linux]
'@unrs/resolver-binding-linux-arm64-gnu@1.7.5':
resolution: {integrity: sha512-btpXWiZystUjfNviOWjf7gwjak0h1dSrzjDGn4b8OkSIMw3Gp4yYtOMZRXxUtaaZRdnOQHqRh9+39PyK6LXQbQ==}
'@unrs/resolver-binding-linux-arm64-gnu@1.7.8':
resolution: {integrity: sha512-HsoVqDBt9G69AN0KWeDNJW+7i8KFlwxrbbnJffgTGpiZd6Jw+Q95sqkXp8y458KhKduKLmXfVZGnKBTNxAgPjw==}
cpu: [arm64]
os: [linux]
'@unrs/resolver-binding-linux-arm64-musl@1.7.5':
resolution: {integrity: sha512-fzTDlm/RWRgHomLSabeV+/iKkAld+kUQaBJ2h0OveaV6+ZmZqEbdG9WDCe8U3/dax49mlPwZIvEnMZujzTPWCg==}
'@unrs/resolver-binding-linux-arm64-musl@1.7.8':
resolution: {integrity: sha512-VfR2yTDUbUvn+e/Aw22CC9fQg9zdShHAfwWctNBdOk7w9CHWl2OtYlcMvjzMAns8QxoHQoqn3/CEnZ4Ts7hfrA==}
cpu: [arm64]
os: [linux]
'@unrs/resolver-binding-linux-ppc64-gnu@1.7.5':
resolution: {integrity: sha512-i+9usBSko2DyFvB7iimhfDtIk9tWhg4sKh7kZC8JGfGMdhYWZ8a40VvgE/Xj8iDsX6ngVRsIsgsNCU9jPx86zw==}
'@unrs/resolver-binding-linux-ppc64-gnu@1.7.8':
resolution: {integrity: sha512-xUauVQNz4uDgs4UJJiUAwMe3N0PA0wvtImh7V0IFu++UKZJhssXbKHBRR4ecUJpUHCX2bc4Wc8sGsB6P+7BANg==}
cpu: [ppc64]
os: [linux]
'@unrs/resolver-binding-linux-riscv64-gnu@1.7.5':
resolution: {integrity: sha512-gpdNeCckfTMOWyZ+AjB0KpgHE2aCCoGtKDSocKwU9RkfWpeVvpcokey5l1A68WXCDE33sonekbe8Wm4+E0z7VQ==}
'@unrs/resolver-binding-linux-riscv64-gnu@1.7.8':
resolution: {integrity: sha512-GqyIB+CuSHGhhc8ph5RrurtNetYJjb6SctSHafqmdGcRuGi6uyTMR8l18hMEhZFsXdFMc/MpInPLvmNV22xn+A==}
cpu: [riscv64]
os: [linux]
'@unrs/resolver-binding-linux-riscv64-musl@1.7.5':
resolution: {integrity: sha512-avni2nC47b0ZBCXL3lg6I3z9lyP1kKVYZXIyIsA/pcTra+Uuq0RgeWeEBc8IJ6DjGrpft7gWyyekrYK58VomGQ==}
'@unrs/resolver-binding-linux-riscv64-musl@1.7.8':
resolution: {integrity: sha512-eEU3rWIFRv60xaAbtsgwHNWRZGD7cqkpCvNtio/f1TjEE3HfKLzPNB24fA9X/8ZXQrGldE65b7UKK3PmO4eWIQ==}
cpu: [riscv64]
os: [linux]
'@unrs/resolver-binding-linux-s390x-gnu@1.7.5':
resolution: {integrity: sha512-GLv1+kVnVluyG8KRIl176jIoExlhgl3ASZz+VGyQpv5EwD5FqOtZHFzsRJA3xXNQlnHj3iMO4SA/HX4dc6iOvA==}
'@unrs/resolver-binding-linux-s390x-gnu@1.7.8':
resolution: {integrity: sha512-GVLI0f4I4TlLqEUoOFvTWedLsJEdvsD0+sxhdvQ5s+N+m2DSynTs8h9jxR0qQbKlpHWpc2Ortz3z48NHRT4l+w==}
cpu: [s390x]
os: [linux]
'@unrs/resolver-binding-linux-x64-gnu@1.7.5':
resolution: {integrity: sha512-frsoBmP2ww2axFqZvIexnDF5UuO0exCZjrchM7uvPbNzZCaU+B43r6Y3ywEFsXXH6MbZNpw10Ntuwb9N0orfcg==}
'@unrs/resolver-binding-linux-x64-gnu@1.7.8':
resolution: {integrity: sha512-GX1pZ/4ncUreB0Rlp1l7bhKAZ8ZmvDIgXdeb5V2iK0eRRF332+6gRfR/r5LK88xfbtOpsmRHU6mQ4N8ZnwvGEA==}
cpu: [x64]
os: [linux]
'@unrs/resolver-binding-linux-x64-musl@1.7.5':
resolution: {integrity: sha512-kdI20RI0k+XcA+vuW6KB/EJbzUvRfo8PsKy2DFlX1fhTVsEXaf21nkU9C3NdTwlTkl9YvvLGNTKoJDH7yn7K8w==}
'@unrs/resolver-binding-linux-x64-musl@1.7.8':
resolution: {integrity: sha512-n1N84MnsvDupzVuYqJGj+2pb9s8BI1A5RgXHvtVFHedGZVBCFjDpQVRlmsFMt6xZiKwDPaqsM16O/1isCUGt7w==}
cpu: [x64]
os: [linux]
'@unrs/resolver-binding-wasm32-wasi@1.7.5':
resolution: {integrity: sha512-6F+PAhfsokXDtLihQzomvVK0rYzSP/qkgJg4+R4RaCmE3pwFspLeyUi1Wd11hwP4FQQn5/5Yw9jraUMQpMPWCg==}
'@unrs/resolver-binding-wasm32-wasi@1.7.8':
resolution: {integrity: sha512-x94WnaU5g+pCPDVedfnXzoG6lCOF2xFGebNwhtbJCWfceE94Zj8aysSxdxotlrZrxnz5D3ijtyFUYtpz04n39Q==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
'@unrs/resolver-binding-win32-arm64-msvc@1.7.5':
resolution: {integrity: sha512-rZ1SRHK95gOqy7hQBcG2sxKMoKFRFAl8f+cGYayA3RRNidkY86uNsXZiWDGgIuelYXSudvAd9RElDib/Lkx7pQ==}
'@unrs/resolver-binding-win32-arm64-msvc@1.7.8':
resolution: {integrity: sha512-vst2u8EJZ5L6jhJ6iLis3w9rg16aYqRxQuBAMYQRVrPMI43693hLP7DuqyOBRKgsQXy9/jgh204k0ViHkqQgdg==}
cpu: [arm64]
os: [win32]
'@unrs/resolver-binding-win32-ia32-msvc@1.7.5':
resolution: {integrity: sha512-49JiW5JickDuC/VqSBlbZTqwX8sJBGBfodU/v4+vM8Eig63JOAK7bOtG8M8kxXRrkJIGhumba4cTf4QcWbMRcg==}
'@unrs/resolver-binding-win32-ia32-msvc@1.7.8':
resolution: {integrity: sha512-yb3LZOLMFqnA+/ShlE1E5bpYPGDsA590VHHJPB+efnyowT776GJXBoh82em6O9WmYBUq57YblGTcMYAFBm72HA==}
cpu: [ia32]
os: [win32]
'@unrs/resolver-binding-win32-x64-msvc@1.7.5':
resolution: {integrity: sha512-69JcsNlbafX/FsafXswKb5M+jPXC9IRcNVz5SqEKH9+PA5jmJ6+fFyjFX1pipBRADGn+EuPhCeDcQl+CAxP+2g==}
'@unrs/resolver-binding-win32-x64-msvc@1.7.8':
resolution: {integrity: sha512-hHKFx+opG5BA3/owMXon8ypwSotBGTdblG6oda/iOu9+OEYnk0cxD2uIcGyGT8jCK578kV+xMrNxqbn8Zjlpgw==}
cpu: [x64]
os: [win32]
@ -1203,8 +1203,8 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
caniuse-lite@1.0.30001718:
resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==}
caniuse-lite@1.0.30001720:
resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==}
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@ -1317,8 +1317,8 @@ packages:
resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
engines: {node: '>=10.13.0'}
es-abstract@1.23.10:
resolution: {integrity: sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==}
es-abstract@1.24.0:
resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
engines: {node: '>= 0.4'}
es-define-property@1.0.1:
@ -1353,8 +1353,8 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
eslint-config-next@15.3.2:
resolution: {integrity: sha512-FerU4DYccO4FgeYFFglz0SnaKRe1ejXQrDb8kWUkTAg036YWi+jUsgg4sIGNCDhAsDITsZaL4MzBWKB6f4G1Dg==}
eslint-config-next@15.3.3:
resolution: {integrity: sha512-QJLv/Ouk2vZnxL4b67njJwTLjTf7uZRltI0LL4GERYR4qMF5z08+gxkfODAeaK7TiC6o+cER91bDaEnwrTWV6Q==}
peerDependencies:
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
typescript: '>=3.3.1'
@ -1680,6 +1680,10 @@ packages:
resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
engines: {node: '>= 0.4'}
is-negative-zero@2.0.3:
resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
engines: {node: '>= 0.4'}
is-number-object@1.1.1:
resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
engines: {node: '>= 0.4'}
@ -1916,8 +1920,8 @@ packages:
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
next@15.3.2:
resolution: {integrity: sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==}
next@15.3.3:
resolution: {integrity: sha512-JqNj29hHNmCLtNvd090SyRbXJiivQ+58XjCcrC50Crb5g5u2zi7Y2YivbsEfzk6AtVI80akdOQbaMZwWB1Hthw==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true
peerDependencies:
@ -2019,8 +2023,8 @@ packages:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
postcss@8.5.3:
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
postcss@8.5.4:
resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==}
engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1:
@ -2256,6 +2260,10 @@ packages:
stable-hash@0.0.5:
resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
stop-iteration-iterator@1.1.0:
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
engines: {node: '>= 0.4'}
streamsearch@1.1.0:
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
engines: {node: '>=10.0.0'}
@ -2354,8 +2362,8 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
tw-animate-css@1.3.0:
resolution: {integrity: sha512-jrJ0XenzS9KVuDThJDvnhalbl4IYiMQ/XvpA0a2FL8KmlK+6CSMviO7ROY/I7z1NnUs5NnDhlM6fXmF40xPxzw==}
tw-animate-css@1.3.2:
resolution: {integrity: sha512-khGYcg4sHWFWcjpiWvy0KN0Bd6yVy6Ecc4r9ZP2u7FV+n4/Fp8MQscCWJkM0KMIRvrpGyKpIQnIbEd1hrewdeg==}
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
@ -2396,8 +2404,8 @@ packages:
undici-types@6.19.8:
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
unrs-resolver@1.7.5:
resolution: {integrity: sha512-DnuJxogme0dCRIdH+yIwpaNLWfff9DqcpfDh4J8qca17rOnu6e3AfNzB8mnUzjv7EgayXQkwnt1A2vT8BM9ZHA==}
unrs-resolver@1.7.8:
resolution: {integrity: sha512-2zsXwyOXmCX9nGz4vhtZRYhe30V78heAv+KDc21A/KMdovGHbZcixeD5JHEF0DrFXzdytwuzYclcPbvp8A3Jlw==}
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@ -2478,8 +2486,8 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
zod@3.25.32:
resolution: {integrity: sha512-OSm2xTIRfW8CV5/QKgngwmQW/8aPfGdaQFlrGoErlgg/Epm7cjb6K6VEyExfe65a3VybUOnu381edLb0dfJl0g==}
zod@3.25.42:
resolution: {integrity: sha512-PcALTLskaucbeHc41tU/xfjfhcz8z0GdhhDcSgrCTmSazUuqnYqiXO63M0QUBVwpBlsLsNVn5qHSC5Dw3KZvaQ==}
snapshots:
@ -2694,34 +2702,34 @@ snapshots:
'@tybys/wasm-util': 0.9.0
optional: true
'@next/env@15.3.2': {}
'@next/env@15.3.3': {}
'@next/eslint-plugin-next@15.3.2':
'@next/eslint-plugin-next@15.3.3':
dependencies:
fast-glob: 3.3.1
'@next/swc-darwin-arm64@15.3.2':
'@next/swc-darwin-arm64@15.3.3':
optional: true
'@next/swc-darwin-x64@15.3.2':
'@next/swc-darwin-x64@15.3.3':
optional: true
'@next/swc-linux-arm64-gnu@15.3.2':
'@next/swc-linux-arm64-gnu@15.3.3':
optional: true
'@next/swc-linux-arm64-musl@15.3.2':
'@next/swc-linux-arm64-musl@15.3.3':
optional: true
'@next/swc-linux-x64-gnu@15.3.2':
'@next/swc-linux-x64-gnu@15.3.3':
optional: true
'@next/swc-linux-x64-musl@15.3.2':
'@next/swc-linux-x64-musl@15.3.3':
optional: true
'@next/swc-win32-arm64-msvc@15.3.2':
'@next/swc-win32-arm64-msvc@15.3.3':
optional: true
'@next/swc-win32-x64-msvc@15.3.2':
'@next/swc-win32-x64-msvc@15.3.3':
optional: true
'@nodelib/fs.scandir@2.1.5':
@ -3097,17 +3105,17 @@ snapshots:
dependencies:
tslib: 2.8.1
'@t3-oss/env-core@0.12.0(typescript@5.8.3)(zod@3.25.32)':
'@t3-oss/env-core@0.12.0(typescript@5.8.3)(zod@3.25.42)':
optionalDependencies:
typescript: 5.8.3
zod: 3.25.32
zod: 3.25.42
'@t3-oss/env-nextjs@0.12.0(typescript@5.8.3)(zod@3.25.32)':
'@t3-oss/env-nextjs@0.12.0(typescript@5.8.3)(zod@3.25.42)':
dependencies:
'@t3-oss/env-core': 0.12.0(typescript@5.8.3)(zod@3.25.32)
'@t3-oss/env-core': 0.12.0(typescript@5.8.3)(zod@3.25.42)
optionalDependencies:
typescript: 5.8.3
zod: 3.25.32
zod: 3.25.42
'@tailwindcss/node@4.1.8':
dependencies:
@ -3178,7 +3186,7 @@ snapshots:
'@alloc/quick-lru': 5.2.0
'@tailwindcss/node': 4.1.8
'@tailwindcss/oxide': 4.1.8
postcss: 8.5.3
postcss: 8.5.4
tailwindcss: 4.1.8
'@tybys/wasm-util@0.9.0':
@ -3192,7 +3200,7 @@ snapshots:
'@types/json5@0.0.29': {}
'@types/node@20.17.51':
'@types/node@20.17.55':
dependencies:
undici-types: 6.19.8
@ -3208,7 +3216,7 @@ snapshots:
'@types/ws@8.18.1':
dependencies:
'@types/node': 20.17.51
'@types/node': 20.17.55
'@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)':
dependencies:
@ -3302,57 +3310,57 @@ snapshots:
'@typescript-eslint/types': 8.33.0
eslint-visitor-keys: 4.2.0
'@unrs/resolver-binding-darwin-arm64@1.7.5':
'@unrs/resolver-binding-darwin-arm64@1.7.8':
optional: true
'@unrs/resolver-binding-darwin-x64@1.7.5':
'@unrs/resolver-binding-darwin-x64@1.7.8':
optional: true
'@unrs/resolver-binding-freebsd-x64@1.7.5':
'@unrs/resolver-binding-freebsd-x64@1.7.8':
optional: true
'@unrs/resolver-binding-linux-arm-gnueabihf@1.7.5':
'@unrs/resolver-binding-linux-arm-gnueabihf@1.7.8':
optional: true
'@unrs/resolver-binding-linux-arm-musleabihf@1.7.5':
'@unrs/resolver-binding-linux-arm-musleabihf@1.7.8':
optional: true
'@unrs/resolver-binding-linux-arm64-gnu@1.7.5':
'@unrs/resolver-binding-linux-arm64-gnu@1.7.8':
optional: true
'@unrs/resolver-binding-linux-arm64-musl@1.7.5':
'@unrs/resolver-binding-linux-arm64-musl@1.7.8':
optional: true
'@unrs/resolver-binding-linux-ppc64-gnu@1.7.5':
'@unrs/resolver-binding-linux-ppc64-gnu@1.7.8':
optional: true
'@unrs/resolver-binding-linux-riscv64-gnu@1.7.5':
'@unrs/resolver-binding-linux-riscv64-gnu@1.7.8':
optional: true
'@unrs/resolver-binding-linux-riscv64-musl@1.7.5':
'@unrs/resolver-binding-linux-riscv64-musl@1.7.8':
optional: true
'@unrs/resolver-binding-linux-s390x-gnu@1.7.5':
'@unrs/resolver-binding-linux-s390x-gnu@1.7.8':
optional: true
'@unrs/resolver-binding-linux-x64-gnu@1.7.5':
'@unrs/resolver-binding-linux-x64-gnu@1.7.8':
optional: true
'@unrs/resolver-binding-linux-x64-musl@1.7.5':
'@unrs/resolver-binding-linux-x64-musl@1.7.8':
optional: true
'@unrs/resolver-binding-wasm32-wasi@1.7.5':
'@unrs/resolver-binding-wasm32-wasi@1.7.8':
dependencies:
'@napi-rs/wasm-runtime': 0.2.10
optional: true
'@unrs/resolver-binding-win32-arm64-msvc@1.7.5':
'@unrs/resolver-binding-win32-arm64-msvc@1.7.8':
optional: true
'@unrs/resolver-binding-win32-ia32-msvc@1.7.5':
'@unrs/resolver-binding-win32-ia32-msvc@1.7.8':
optional: true
'@unrs/resolver-binding-win32-x64-msvc@1.7.5':
'@unrs/resolver-binding-win32-x64-msvc@1.7.8':
optional: true
acorn-jsx@5.3.2(acorn@8.14.1):
@ -3389,7 +3397,7 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-object-atoms: 1.1.1
get-intrinsic: 1.3.0
is-string: 1.1.1
@ -3398,7 +3406,7 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-errors: 1.3.0
es-object-atoms: 1.1.1
es-shim-unscopables: 1.1.0
@ -3408,7 +3416,7 @@ snapshots:
call-bind: 1.0.8
call-bound: 1.0.4
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-errors: 1.3.0
es-object-atoms: 1.1.1
es-shim-unscopables: 1.1.0
@ -3417,21 +3425,21 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-shim-unscopables: 1.1.0
array.prototype.flatmap@1.3.3:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-shim-unscopables: 1.1.0
array.prototype.tosorted@1.1.4:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-errors: 1.3.0
es-shim-unscopables: 1.1.0
@ -3440,7 +3448,7 @@ snapshots:
array-buffer-byte-length: 1.0.2
call-bind: 1.0.8
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-errors: 1.3.0
get-intrinsic: 1.3.0
is-array-buffer: 3.0.5
@ -3495,7 +3503,7 @@ snapshots:
callsites@3.1.0: {}
caniuse-lite@1.0.30001718: {}
caniuse-lite@1.0.30001720: {}
chalk@4.1.2:
dependencies:
@ -3605,7 +3613,7 @@ snapshots:
graceful-fs: 4.2.11
tapable: 2.2.2
es-abstract@1.23.10:
es-abstract@1.24.0:
dependencies:
array-buffer-byte-length: 1.0.2
arraybuffer.prototype.slice: 1.0.4
@ -3634,7 +3642,9 @@ snapshots:
is-array-buffer: 3.0.5
is-callable: 1.2.7
is-data-view: 1.0.2
is-negative-zero: 2.0.3
is-regex: 1.2.1
is-set: 2.0.3
is-shared-array-buffer: 1.0.4
is-string: 1.1.1
is-typed-array: 1.1.15
@ -3649,6 +3659,7 @@ snapshots:
safe-push-apply: 1.0.0
safe-regex-test: 1.1.0
set-proto: 1.0.0
stop-iteration-iterator: 1.1.0
string.prototype.trim: 1.2.10
string.prototype.trimend: 1.0.9
string.prototype.trimstart: 1.0.8
@ -3668,7 +3679,7 @@ snapshots:
call-bind: 1.0.8
call-bound: 1.0.4
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-errors: 1.3.0
es-set-tostringtag: 2.1.0
function-bind: 1.1.2
@ -3705,9 +3716,9 @@ snapshots:
escape-string-regexp@4.0.0: {}
eslint-config-next@15.3.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3):
eslint-config-next@15.3.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3):
dependencies:
'@next/eslint-plugin-next': 15.3.2
'@next/eslint-plugin-next': 15.3.3
'@rushstack/eslint-patch': 1.11.0
'@typescript-eslint/eslint-plugin': 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)
'@typescript-eslint/parser': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)
@ -3742,7 +3753,7 @@ snapshots:
is-bun-module: 2.0.0
stable-hash: 0.0.5
tinyglobby: 0.2.14
unrs-resolver: 1.7.5
unrs-resolver: 1.7.8
optionalDependencies:
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.4.2))
transitivePeerDependencies:
@ -4125,6 +4136,8 @@ snapshots:
is-map@2.0.3: {}
is-negative-zero@2.0.3: {}
is-number-object@1.1.1:
dependencies:
call-bound: 1.0.4
@ -4327,26 +4340,26 @@ snapshots:
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
next@15.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
next@15.3.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
'@next/env': 15.3.2
'@next/env': 15.3.3
'@swc/counter': 0.1.3
'@swc/helpers': 0.5.15
busboy: 1.6.0
caniuse-lite: 1.0.30001718
caniuse-lite: 1.0.30001720
postcss: 8.4.31
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
styled-jsx: 5.1.6(react@19.1.0)
optionalDependencies:
'@next/swc-darwin-arm64': 15.3.2
'@next/swc-darwin-x64': 15.3.2
'@next/swc-linux-arm64-gnu': 15.3.2
'@next/swc-linux-arm64-musl': 15.3.2
'@next/swc-linux-x64-gnu': 15.3.2
'@next/swc-linux-x64-musl': 15.3.2
'@next/swc-win32-arm64-msvc': 15.3.2
'@next/swc-win32-x64-msvc': 15.3.2
'@next/swc-darwin-arm64': 15.3.3
'@next/swc-darwin-x64': 15.3.3
'@next/swc-linux-arm64-gnu': 15.3.3
'@next/swc-linux-arm64-musl': 15.3.3
'@next/swc-linux-x64-gnu': 15.3.3
'@next/swc-linux-x64-musl': 15.3.3
'@next/swc-win32-arm64-msvc': 15.3.3
'@next/swc-win32-x64-msvc': 15.3.3
sharp: 0.34.2
transitivePeerDependencies:
- '@babel/core'
@ -4378,14 +4391,14 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-object-atoms: 1.1.1
object.groupby@1.0.3:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
object.values@1.2.1:
dependencies:
@ -4441,7 +4454,7 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
postcss@8.5.3:
postcss@8.5.4:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
@ -4509,7 +4522,7 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-errors: 1.3.0
es-object-atoms: 1.1.1
get-intrinsic: 1.3.0
@ -4671,20 +4684,25 @@ snapshots:
stable-hash@0.0.5: {}
stop-iteration-iterator@1.1.0:
dependencies:
es-errors: 1.3.0
internal-slot: 1.1.0
streamsearch@1.1.0: {}
string.prototype.includes@2.0.1:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
string.prototype.matchall@4.0.12:
dependencies:
call-bind: 1.0.8
call-bound: 1.0.4
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-errors: 1.3.0
es-object-atoms: 1.1.1
get-intrinsic: 1.3.0
@ -4698,7 +4716,7 @@ snapshots:
string.prototype.repeat@1.0.0:
dependencies:
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
string.prototype.trim@1.2.10:
dependencies:
@ -4706,7 +4724,7 @@ snapshots:
call-bound: 1.0.4
define-data-property: 1.1.4
define-properties: 1.2.1
es-abstract: 1.23.10
es-abstract: 1.24.0
es-object-atoms: 1.1.1
has-property-descriptors: 1.0.2
@ -4781,7 +4799,7 @@ snapshots:
tslib@2.8.1: {}
tw-animate-css@1.3.0: {}
tw-animate-css@1.3.2: {}
type-check@0.4.0:
dependencies:
@ -4841,27 +4859,27 @@ snapshots:
undici-types@6.19.8: {}
unrs-resolver@1.7.5:
unrs-resolver@1.7.8:
dependencies:
napi-postinstall: 0.2.4
optionalDependencies:
'@unrs/resolver-binding-darwin-arm64': 1.7.5
'@unrs/resolver-binding-darwin-x64': 1.7.5
'@unrs/resolver-binding-freebsd-x64': 1.7.5
'@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.5
'@unrs/resolver-binding-linux-arm-musleabihf': 1.7.5
'@unrs/resolver-binding-linux-arm64-gnu': 1.7.5
'@unrs/resolver-binding-linux-arm64-musl': 1.7.5
'@unrs/resolver-binding-linux-ppc64-gnu': 1.7.5
'@unrs/resolver-binding-linux-riscv64-gnu': 1.7.5
'@unrs/resolver-binding-linux-riscv64-musl': 1.7.5
'@unrs/resolver-binding-linux-s390x-gnu': 1.7.5
'@unrs/resolver-binding-linux-x64-gnu': 1.7.5
'@unrs/resolver-binding-linux-x64-musl': 1.7.5
'@unrs/resolver-binding-wasm32-wasi': 1.7.5
'@unrs/resolver-binding-win32-arm64-msvc': 1.7.5
'@unrs/resolver-binding-win32-ia32-msvc': 1.7.5
'@unrs/resolver-binding-win32-x64-msvc': 1.7.5
'@unrs/resolver-binding-darwin-arm64': 1.7.8
'@unrs/resolver-binding-darwin-x64': 1.7.8
'@unrs/resolver-binding-freebsd-x64': 1.7.8
'@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.8
'@unrs/resolver-binding-linux-arm-musleabihf': 1.7.8
'@unrs/resolver-binding-linux-arm64-gnu': 1.7.8
'@unrs/resolver-binding-linux-arm64-musl': 1.7.8
'@unrs/resolver-binding-linux-ppc64-gnu': 1.7.8
'@unrs/resolver-binding-linux-riscv64-gnu': 1.7.8
'@unrs/resolver-binding-linux-riscv64-musl': 1.7.8
'@unrs/resolver-binding-linux-s390x-gnu': 1.7.8
'@unrs/resolver-binding-linux-x64-gnu': 1.7.8
'@unrs/resolver-binding-linux-x64-musl': 1.7.8
'@unrs/resolver-binding-wasm32-wasi': 1.7.8
'@unrs/resolver-binding-win32-arm64-msvc': 1.7.8
'@unrs/resolver-binding-win32-ia32-msvc': 1.7.8
'@unrs/resolver-binding-win32-x64-msvc': 1.7.8
uri-js@4.4.1:
dependencies:
@ -4946,4 +4964,4 @@ snapshots:
yocto-queue@0.1.0: {}
zod@3.25.32: {}
zod@3.25.42: {}

View File

@ -1,24 +1,77 @@
'use server';
import 'server-only';
import { createServerClient } from '@/utils/supabase';
import { NextResponse } from 'next/server';
export async function GET(request: Request) {
// The `/auth/callback` route is required for the server-side auth flow implemented
// by the SSR package. It exchanges an auth code for the user's session.
// https://supabase.com/docs/guides/auth/server-side/nextjs
export const GET = async (request: Request) => {
const requestUrl = new URL(request.url);
const code = requestUrl.searchParams.get('code');
const token = requestUrl.searchParams.get('token');
const type = requestUrl.searchParams.get('type');
const origin = requestUrl.origin;
const redirectTo = requestUrl.searchParams.get('redirect_to')?.toString();
const supabase = await createServerClient();
if (token && type) {
try {
if (type === 'signup') {
// Confirm email signup
const { error } = await supabase.auth.verifyOtp({
token_hash: token,
type: 'signup',
});
if (error) {
console.error('Email confirmation error:', error);
return NextResponse.redirect(`${origin}/sign-in?error=Invalid or expired confirmation link`);
}
} else if (type === 'recovery') {
// Handle password recovery
const { error } = await supabase.auth.verifyOtp({
token_hash: token,
type: 'recovery',
});
if (error) {
console.error('Password recovery error:', error);
return NextResponse.redirect(`${origin}/sign-in?error=Invalid or expired reset link`);
} else {
return NextResponse.redirect(`${origin}/reset-password`);
}
} else if (type === 'email_change') {
// Handle email change
const { error } = await supabase.auth.verifyOtp({
token_hash: token,
type: 'email_change',
});
if (error) {
console.error('Email change error:', error);
return NextResponse.redirect(`${origin}/profile?error=Invalid or expired email change link`);
}
}
} catch (error) {
console.error('Verification error:', error);
return NextResponse.redirect(`${origin}/sign-in?error=Verification failed`);
}
}
// Handle code-based flow (OAuth, etc.)
if (code) {
const supabase = await createServerClient();
await supabase.auth.exchangeCodeForSession(code);
}
// Handle redirect
if (redirectTo) {
return NextResponse.redirect(`${origin}${redirectTo}`);
try {
new URL(redirectTo);
return NextResponse.redirect(redirectTo);
} catch {
return NextResponse.redirect(`${origin}${redirectTo}`);
}
}
// URL to redirect to after sign up process completes
return NextResponse.redirect(origin);
}

View File

@ -0,0 +1,24 @@
import { createServerClient } from '@/utils/supabase';
import { NextResponse } from 'next/server';
export const GET = async (request: Request) => {
// The `/auth/callback` route is required for the server-side auth flow implemented
// by the SSR package. It exchanges an auth code for the user's session.
// https://supabase.com/docs/guides/auth/server-side/nextjs
const requestUrl = new URL(request.url);
const code = requestUrl.searchParams.get('code');
const origin = requestUrl.origin;
const redirectTo = requestUrl.searchParams.get('redirect_to')?.toString();
if (code) {
const supabase = await createServerClient();
await supabase.auth.exchangeCodeForSession(code);
}
if (redirectTo) {
return NextResponse.redirect(`${origin}${redirectTo}`);
}
// URL to redirect to after sign up process completes
return NextResponse.redirect(origin);
}

View File

@ -3,7 +3,6 @@ import { getUser, signIn } from '@/lib/actions';
import { FormMessage, type Message, SubmitButton } from '@/components/default';
import { Input, Label } from '@/components/ui';
import { redirect } from 'next/navigation';
import type { User } from '@/utils/supabase';
const Login = async (props: { searchParams: Promise<Message> }) => {
const searchParams = await props.searchParams;

View File

@ -2,7 +2,7 @@
import React, { createContext, useContext, useState, useEffect, type ReactNode } from 'react';
import { getUser, getProfile, updateProfile as updateProfileAction, getSignedUrl } from '@/lib/actions';
import type { User, Profile } from '@/utils/supabase';
import { type User, type Profile, createClient } from '@/utils/supabase';
import { toast } from 'sonner';
type AuthContextType = {
@ -72,15 +72,32 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => {
};
useEffect(() => {
const supabase = createClient();
fetchUserData().catch((error) => {
console.error('Error fetching user data:', error);
});
const {
data: { subscription },
} = supabase.auth.onAuthStateChange(async (event, session) => {
if (event === 'SIGNED_IN' || event === 'TOKEN_REFRESHED') {
await fetchUserData();
} else if (event === 'SIGNED_OUT') {
setUser(null);
setProfile(null);
setAvatarUrl(null);
setIsLoading(false);
}
});
const intervalId = setInterval(() => {
void fetchUserData();
}, 30 * 60 * 1000);
}, 1 * 60 * 1000);
return () => clearInterval(intervalId);
return () => {
subscription.unsubscribe();
clearInterval(intervalId);
};
}, []);
const updateProfile = async (data: {

View File

@ -3,17 +3,18 @@
import 'server-only';
import { encodedRedirect } from '@/utils/utils';
import { createServerClient } from '@/utils/supabase';
import type { User } from '@supabase/supabase-js';
import { headers } from 'next/headers';
import { redirect } from 'next/navigation';
import type { User } from '@/utils/supabase';
import type { Result } from './index';
import { revalidatePath } from 'next/cache';
export const signUp = async (formData: FormData) => {
const name = formData.get('name') as string;
const email = formData.get('email') as string;
const password = formData.get('password') as string;
const supabase = await createServerClient();
//const origin = (await headers()).get('origin');
const origin = (await headers()).get('origin');
if (!email || !password) {
return encodedRedirect(
@ -23,36 +24,26 @@ export const signUp = async (formData: FormData) => {
);
}
const { data, error } = await supabase.auth.signUp({
const { error } = await supabase.auth.signUp({
email,
password,
//options: {
//emailRedirectTo: `${origin}/auth/callback`,
//},
options: {
emailRedirectTo: `${origin}/auth/callback`,
data: {
full_name: name,
email,
provider: 'email',
},
},
});
if (error) {
return redirect('/');
//return encodedRedirect('error', '/sign-up',
//'Thanks for signing up! Please check your email for a verification link.');
return encodedRedirect('error', '/sign-up', error.message);
} else {
try {
if (!data.user) throw new Error('Could not sign up');
const { error } = await supabase
.from('profiles')
.update({
full_name: name,
provider: 'email',
})
.eq('id', data.user.id);
if (error) throw new Error('Could not update profile');
} catch (error) {
console.error('Error updating profile: ', error);
} finally {
return redirect('/');
//return encodedRedirect('success', '/',
//'Thanks for signing up! Please check your email for a verification link.);
}
return encodedRedirect(
'success',
'/sign-up',
'Thanks for signing up! Please check your email for a verification link.',
);
}
};
@ -68,8 +59,9 @@ export const signIn = async (formData: FormData) => {
if (error) {
return encodedRedirect('error', '/sign-in', error.message);
} else {
return redirect('/');
}
return redirect('/');
};
export const forgotPassword = async (formData: FormData) => {
@ -147,10 +139,8 @@ export const resetPassword = async (
export const resetPasswordFromEmail = async (formData: FormData) => {
const password = formData.get('password') as string;
const confirmPassword = formData.get('confirmPassword') as string;
if (!password || !confirmPassword) {
encodedRedirect(
'error',
@ -158,7 +148,6 @@ export const resetPasswordFromEmail = async (formData: FormData) => {
'Password and confirm password are required',
);
}
const supabase = await createServerClient();
if (password !== confirmPassword) {

View File

@ -45,7 +45,7 @@ export const resizeImage = async ({
(blob) => {
if (!blob) return;
const resizedFile = new File([blob], file.name, {
type: 'imgage/jpeg',
type: 'image/jpeg',
lastModified: Date.now(),
});
resolve(resizedFile);

View File

@ -76,8 +76,24 @@ create policy "Anyone can upload an avatar." on storage.objects
-- CREATE POLICY "Public statuses are viewable by everyone." ON statuses
-- FOR SELECT USING (true);
-- CREATE POLICY "Users can insert statuses for any user." ON statuses
-- FOR INSERT WITH CHECK (auth.role() = 'authenticated');
-- -- RECREATE it using the recommended sub-select form
-- CREATE POLICY "Authenticated users can insert statuses for any user."
-- ON public.statuses
-- FOR INSERT
-- WITH CHECK (
-- (SELECT auth.role()) = 'authenticated'
-- );
-- -- ADD an UPDATE policy so anyone signed-in can update *any* status
-- CREATE POLICY "Authenticated users can update statuses for any user."
-- ON public.statuses
-- FOR UPDATE
-- USING (
-- (SELECT auth.role()) = 'authenticated'
-- )
-- WITH CHECK (
-- (SELECT auth.role()) = 'authenticated'
-- );
-- -- Function to add first status
-- CREATE FUNCTION public.handle_first_status()

View File

@ -1,3 +1,5 @@
'use client';
import { createBrowserClient } from '@supabase/ssr';
import type { Database } from '@/utils/supabase/types';

View File

@ -1,3 +1,6 @@
'use server'
import 'server-only';
import { createServerClient as CreateServerClient } from '@supabase/ssr';
import type { Database } from '@/utils/supabase/types';
import { cookies } from 'next/headers';