diff --git a/apps/web/app/(auth)/browser/page.tsx b/apps/web/app/(auth)/browser/page.tsx new file mode 100644 index 0000000..0599986 --- /dev/null +++ b/apps/web/app/(auth)/browser/page.tsx @@ -0,0 +1,42 @@ +/* eslint-disable promise/prefer-await-to-then */ +'use client'; +import { getTelegramUser } from '@/mocks/get-telegram-user'; +import { signIn, useSession } from 'next-auth/react'; +import { redirect } from 'next/navigation'; +import { useEffect } from 'react'; + +export default function Auth() { + const { data: session, status } = useSession(); + + useEffect(() => { + if (status === 'authenticated') { + redirect('/profile'); + } + + if (status === 'unauthenticated' && process.env.NODE_ENV === 'development') { + getTelegramUser().then((user) => { + signIn('telegram', { + callbackUrl: '/profile', + redirect: false, + telegramId: String(user?.id), + }); + }); + } + }, [status]); + + if (status === 'loading') { + return
Loading Browser Auth...
; + } + + return ( +
+ {session ? ( +
+ Browser Hello, {JSON.stringify(session)}
+
+ ) : ( +
Not authenticated
+ )} +
+ ); +} diff --git a/apps/web/app/(auth)/page.tsx b/apps/web/app/(auth)/page.tsx index 32d357a..ce86f35 100644 --- a/apps/web/app/(auth)/page.tsx +++ b/apps/web/app/(auth)/page.tsx @@ -1,42 +1,16 @@ 'use client'; -import { initData, isMiniAppDark, useSignal } from '@telegram-apps/sdk-react'; -import { signIn, useSession } from 'next-auth/react'; +import { useClientOnce } from '@/hooks/telegram'; +import { isTMA } from '@telegram-apps/sdk-react'; import { redirect } from 'next/navigation'; -import { useEffect } from 'react'; +import { useState } from 'react'; -export default function Auth() { - const initDataState = useSignal(initData.state); - const isDark = isMiniAppDark(); - const { data: session, status } = useSession(); +export default function Page() { + const [isTG, setIsTG] = useState(false); + useClientOnce(() => { + setIsTG(isTMA('simple')); - useEffect(() => { - if (status === 'authenticated') { - redirect('/profile'); - } + redirect(isTG ? '/telegram' : '/browser'); + }); - if (status === 'unauthenticated' && initDataState?.user?.id) { - signIn('telegram', { - callbackUrl: '/profile', - redirect: false, - telegramId: String(initDataState.user.id), - }); - } - }, [initDataState, status]); - - if (status === 'loading') { - return
Loading Auth...
; - } - - return ( -
- {session ? ( -
- Hello, {JSON.stringify(session)}
- Dark: {JSON.stringify(isDark)} -
- ) : ( -
Not authenticated
- )} -
- ); + return
{isTG ? 'Telegram Mode' : 'Browser Mode'}
; } diff --git a/apps/web/app/(auth)/layout.tsx b/apps/web/app/(auth)/telegram/layout.tsx similarity index 64% rename from apps/web/app/(auth)/layout.tsx rename to apps/web/app/(auth)/telegram/layout.tsx index 6225cd2..eed2cc2 100644 --- a/apps/web/app/(auth)/layout.tsx +++ b/apps/web/app/(auth)/telegram/layout.tsx @@ -1,6 +1,6 @@ import { TelegramProvider } from '@/providers'; import { type PropsWithChildren } from 'react'; -export default async function RootLayout({ children }: Readonly) { +export default async function Layout({ children }: Readonly) { return {children}; } diff --git a/apps/web/app/(auth)/telegram/page.tsx b/apps/web/app/(auth)/telegram/page.tsx new file mode 100644 index 0000000..b57a263 --- /dev/null +++ b/apps/web/app/(auth)/telegram/page.tsx @@ -0,0 +1,42 @@ +'use client'; +import { initData, isMiniAppDark, useSignal } from '@telegram-apps/sdk-react'; +import { signIn, useSession } from 'next-auth/react'; +import { redirect } from 'next/navigation'; +import { useEffect } from 'react'; + +export default function Auth() { + const initDataUser = useSignal(initData.user); + const isDark = isMiniAppDark(); + const { data: session, status } = useSession(); + + useEffect(() => { + if (status === 'authenticated') { + redirect('/profile'); + } + + if (status === 'unauthenticated' && initDataUser?.id) { + signIn('telegram', { + callbackUrl: '/profile', + redirect: false, + telegramId: String(initDataUser.id), + }); + } + }, [initDataUser, status]); + + if (status === 'loading') { + return
Loading Auth...
; + } + + return ( +
+ {session ? ( +
+ Hello, {JSON.stringify(session)}
+ Dark: {JSON.stringify(isDark)} +
+ ) : ( +
Not authenticated
+ )} +
+ ); +} diff --git a/apps/web/config/env.ts b/apps/web/config/env.ts index c3ccf3b..4c88620 100644 --- a/apps/web/config/env.ts +++ b/apps/web/config/env.ts @@ -2,7 +2,6 @@ import { z } from 'zod'; export const envSchema = z.object({ - NEXTAUTH_SECRET: z.string(), + __DEV_TELEGRAM_ID: z.string(), }); - export const env = envSchema.parse(process.env); diff --git a/apps/web/mocks/get-telegram-user.ts b/apps/web/mocks/get-telegram-user.ts new file mode 100644 index 0000000..1516fd5 --- /dev/null +++ b/apps/web/mocks/get-telegram-user.ts @@ -0,0 +1,12 @@ +'use server'; + +import { env } from '@/config/env'; + +export async function getTelegramUser() { + if (process.env.NODE_ENV !== 'production') + return { + id: env.__DEV_TELEGRAM_ID, + }; + + return null; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e83d2b..f2cb3ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -303,13 +303,13 @@ importers: version: 5.1.4(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.8)) vitest: specifier: 'catalog:' - version: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1) + version: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2)) packages/eslint-config: devDependencies: '@vchikalkin/eslint-config-awesome': specifier: 'catalog:' - version: 2.0.6(@babel/core@7.26.0)(@next/eslint-plugin-next@15.0.3)(@types/node@20.17.8)(eslint-plugin-canonical@5.0.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)) + version: 2.0.6(@babel/core@7.26.0)(@next/eslint-plugin-next@15.0.3)(@types/node@20.17.8)(eslint-plugin-canonical@5.0.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))) eslint: specifier: 'catalog:' version: 9.15.0(jiti@2.4.1) @@ -361,7 +361,7 @@ importers: version: 5.1.4(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.8)) vitest: specifier: 'catalog:' - version: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1) + version: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2)) packages/lint-staged-config: {} @@ -1075,6 +1075,15 @@ packages: resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} + '@bundled-es-modules/cookie@2.0.1': + resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} + + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + + '@bundled-es-modules/tough-cookie@0.1.6': + resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} @@ -1846,6 +1855,26 @@ packages: cpu: [x64] os: [win32] + '@inquirer/confirm@5.1.1': + resolution: {integrity: sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/core@10.1.2': + resolution: {integrity: sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==} + engines: {node: '>=18'} + + '@inquirer/figures@1.0.9': + resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.2': + resolution: {integrity: sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1871,6 +1900,10 @@ packages: '@kamilkisiela/fast-url-parser@1.1.4': resolution: {integrity: sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==} + '@mswjs/interceptors@0.37.3': + resolution: {integrity: sha512-USvgCL/uOGFtVa6SVyRrC8kIAedzRohxIXN5LISlg5C5vLZCn7dgMFVSNhSF9cuBEFrm/O2spDWEZeMnw4ZXYg==} + engines: {node: '>=18'} + '@next/env@15.1.0': resolution: {integrity: sha512-UcCO481cROsqJuszPPXJnb7GGuLq617ve4xuAyyNG4VSSocJNtMU5Fsx+Lp6mlN8c7W58aZLc5y6D/2xNmaK+w==} @@ -1947,6 +1980,15 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} @@ -2238,6 +2280,9 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -2265,6 +2310,12 @@ packages: '@types/react@19.0.1': resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} + '@types/statuses@2.0.5': + resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/ws@8.5.13': resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} @@ -2820,6 +2871,10 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -3810,6 +3865,9 @@ packages: header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -3998,6 +4056,9 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -4418,9 +4479,23 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msw@2.7.0: + resolution: {integrity: sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -4604,6 +4679,9 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -4698,6 +4776,9 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -4861,6 +4942,9 @@ packages: resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} engines: {node: '>=4'} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -4875,6 +4959,9 @@ packages: resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} engines: {node: '>=6.0.0'} + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -5012,6 +5099,9 @@ packages: resolution: {integrity: sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==} engines: {node: '>=0.10.5'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5243,6 +5333,10 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + std-env@3.8.0: resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} @@ -5250,6 +5344,9 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -5433,6 +5530,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + tough-cookie@5.0.0: resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} engines: {node: '>=16'} @@ -5544,6 +5645,10 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@4.30.2: + resolution: {integrity: sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==} + engines: {node: '>=16'} + typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -5595,6 +5700,10 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + unixify@1.0.0: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} @@ -5614,6 +5723,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + urlpattern-polyfill@10.0.0: resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} @@ -5879,6 +5991,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + zen-observable-ts@1.2.5: resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} @@ -6736,6 +6852,22 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@bundled-es-modules/cookie@2.0.1': + dependencies: + cookie: 0.7.2 + optional: true + + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.1 + optional: true + + '@bundled-es-modules/tough-cookie@0.1.6': + dependencies: + '@types/tough-cookie': 4.0.5 + tough-cookie: 4.1.4 + optional: true + '@emnapi/runtime@1.3.1': dependencies: tslib: 2.8.1 @@ -7666,6 +7798,36 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@inquirer/confirm@5.1.1(@types/node@20.17.8)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@20.17.8) + '@inquirer/type': 3.0.2(@types/node@20.17.8) + '@types/node': 20.17.8 + optional: true + + '@inquirer/core@10.1.2(@types/node@20.17.8)': + dependencies: + '@inquirer/figures': 1.0.9 + '@inquirer/type': 3.0.2(@types/node@20.17.8) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + transitivePeerDependencies: + - '@types/node' + optional: true + + '@inquirer/figures@1.0.9': + optional: true + + '@inquirer/type@3.0.2(@types/node@20.17.8)': + dependencies: + '@types/node': 20.17.8 + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -7694,6 +7856,16 @@ snapshots: '@kamilkisiela/fast-url-parser@1.1.4': {} + '@mswjs/interceptors@0.37.3': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + optional: true + '@next/env@15.1.0': {} '@next/eslint-plugin-next@14.2.18': @@ -7746,6 +7918,18 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@open-draft/deferred-promise@2.2.0': + optional: true + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + optional: true + + '@open-draft/until@2.1.0': + optional: true + '@panva/hkdf@1.2.1': {} '@peculiar/asn1-schema@2.3.13': @@ -8000,6 +8184,9 @@ snapshots: dependencies: '@babel/types': 7.26.0 + '@types/cookie@0.6.0': + optional: true + '@types/estree@1.0.6': {} '@types/js-yaml@4.0.9': {} @@ -8026,6 +8213,12 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/statuses@2.0.5': + optional: true + + '@types/tough-cookie@4.0.5': + optional: true + '@types/ws@8.5.13': dependencies: '@types/node': 20.17.8 @@ -8189,10 +8382,10 @@ snapshots: '@typescript-eslint/types': 8.17.0 eslint-visitor-keys: 4.2.0 - '@vchikalkin/eslint-config-awesome@2.0.6(@babel/core@7.26.0)(@next/eslint-plugin-next@15.0.3)(@types/node@20.17.8)(eslint-plugin-canonical@5.0.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1))': + '@vchikalkin/eslint-config-awesome@2.0.6(@babel/core@7.26.0)(@next/eslint-plugin-next@15.0.3)(@types/node@20.17.8)(eslint-plugin-canonical@5.0.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2)))': dependencies: '@next/eslint-plugin-next': 15.0.3 - eslint-config-canonical: 44.3.33(@babel/core@7.26.0)(@types/node@20.17.8)(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)) + eslint-config-canonical: 44.3.33(@babel/core@7.26.0)(@types/node@20.17.8)(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))) eslint-plugin-canonical: 5.0.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2) eslint-plugin-sonarjs: 3.0.1(eslint@9.15.0(jiti@2.4.1)) transitivePeerDependencies: @@ -8231,12 +8424,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@20.17.8))': + '@vitest/mocker@2.1.8(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))(vite@5.4.11(@types/node@20.17.8))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.15 optionalDependencies: + msw: 2.7.0(@types/node@20.17.8)(typescript@5.7.2) vite: 5.4.11(@types/node@20.17.8) '@vitest/pretty-format@2.1.8': @@ -8735,6 +8929,9 @@ snapshots: cli-width@3.0.0: {} + cli-width@4.1.0: + optional: true + client-only@0.0.1: {} cliui@6.0.0: @@ -9163,7 +9360,7 @@ snapshots: eslint: 9.15.0(jiti@2.4.1) semver: 7.6.3 - eslint-config-canonical@44.3.33(@babel/core@7.26.0)(@types/node@20.17.8)(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)): + eslint-config-canonical@44.3.33(@babel/core@7.26.0)(@types/node@20.17.8)(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))): dependencies: '@graphql-eslint/eslint-plugin': 3.20.1(@babel/core@7.26.0)(@types/node@20.17.8)(graphql@16.9.0) '@next/eslint-plugin-next': 14.2.18 @@ -9194,7 +9391,7 @@ snapshots: eslint-plugin-react-hooks: 5.1.0-rc-fb9a90fa48-20240614(eslint@9.15.0(jiti@2.4.1)) eslint-plugin-regexp: 2.7.0(eslint@9.15.0(jiti@2.4.1)) eslint-plugin-unicorn: 56.0.1(eslint@9.15.0(jiti@2.4.1)) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)) + eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))) eslint-plugin-yml: 1.16.0(eslint@9.15.0(jiti@2.4.1)) eslint-plugin-zod: 1.4.0(eslint@9.15.0(jiti@2.4.1)) globals: 15.12.0 @@ -9551,13 +9748,13 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)): + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2) eslint: 9.15.0(jiti@2.4.1) optionalDependencies: '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2) - vitest: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1) + vitest: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2)) transitivePeerDependencies: - supports-color - typescript @@ -10016,6 +10213,9 @@ snapshots: capital-case: 1.0.4 tslib: 2.8.1 + headers-polyfill@4.0.3: + optional: true + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -10208,6 +10408,9 @@ snapshots: is-negative-zero@2.0.3: {} + is-node-process@1.2.0: + optional: true + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -10622,8 +10825,37 @@ snapshots: ms@2.1.3: {} + msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.1.1(@types/node@20.17.8) + '@mswjs/interceptors': 0.37.3 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 + graphql: 16.9.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + strict-event-emitter: 0.5.1 + type-fest: 4.30.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - '@types/node' + optional: true + mute-stream@0.0.8: {} + mute-stream@2.0.0: + optional: true + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -10818,6 +11050,9 @@ snapshots: os-tmpdir@1.0.2: {} + outvariant@1.4.3: + optional: true + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -10911,6 +11146,9 @@ snapshots: lru-cache: 11.0.2 minipass: 7.1.2 + path-to-regexp@6.3.0: + optional: true + path-type@4.0.0: {} pathe@1.1.2: {} @@ -11034,6 +11272,11 @@ snapshots: proto-props@2.0.0: {} + psl@1.15.0: + dependencies: + punycode: 2.3.1 + optional: true + punycode@1.4.1: {} punycode@2.3.1: {} @@ -11044,6 +11287,9 @@ snapshots: pvutils@1.1.3: {} + querystringify@2.2.0: + optional: true + queue-microtask@1.2.3: {} rambda@7.5.0: {} @@ -11184,6 +11430,9 @@ snapshots: requireindex@1.1.0: {} + requires-port@1.0.0: + optional: true + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -11456,10 +11705,16 @@ snapshots: stackback@0.0.2: {} + statuses@2.0.1: + optional: true + std-env@3.8.0: {} streamsearch@1.1.0: {} + strict-event-emitter@0.5.1: + optional: true + string-argv@0.3.2: {} string-env-interpolation@1.0.1: {} @@ -11678,6 +11933,14 @@ snapshots: dependencies: is-number: 7.0.0 + tough-cookie@4.1.4: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + optional: true + tough-cookie@5.0.0: dependencies: tldts: 6.1.66 @@ -11767,6 +12030,9 @@ snapshots: type-fest@0.8.1: {} + type-fest@4.30.2: + optional: true + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -11826,6 +12092,9 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} + universalify@0.2.0: + optional: true + unixify@1.0.0: dependencies: normalize-path: 2.1.1 @@ -11848,6 +12117,12 @@ snapshots: dependencies: punycode: 2.3.1 + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + optional: true + urlpattern-polyfill@10.0.0: {} urlpattern-polyfill@8.0.2: {} @@ -11907,10 +12182,10 @@ snapshots: '@types/node': 20.17.8 fsevents: 2.3.3 - vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1): + vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2)): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@20.17.8)) + '@vitest/mocker': 2.1.8(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))(vite@5.4.11(@types/node@20.17.8)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -12124,6 +12399,9 @@ snapshots: yocto-queue@0.1.0: {} + yoctocolors-cjs@2.1.2: + optional: true + zen-observable-ts@1.2.5: dependencies: zen-observable: 0.8.15