diff --git a/apps/web/app/(auth)/auth/callback/route.ts b/apps/web/app/(auth)/auth/callback/route.ts new file mode 100644 index 0000000..6aaa860 --- /dev/null +++ b/apps/web/app/(auth)/auth/callback/route.ts @@ -0,0 +1,29 @@ +import { createClient } from '@ultra-reporter/supabase/server'; +import { NextResponse } from 'next/server'; + +export async function GET(request: Request) { + const { searchParams, origin } = new URL(request.url); + const code = searchParams.get('code'); + // if "next" is in param, use it as the redirect URL + const next = searchParams.get('next') ?? '/'; + + if (code) { + const supabase = await createClient(); + const { error } = await supabase.auth.exchangeCodeForSession(code); + if (!error) { + const forwardedHost = request.headers.get('x-forwarded-host'); // original origin before load balancer + const isLocalEnv = process.env.NODE_ENV === 'development'; + if (isLocalEnv) { + // we can be sure that there is no load balancer in between, so no need to watch for X-Forwarded-Host + return NextResponse.redirect(`${origin}${next}`); + } else if (forwardedHost) { + return NextResponse.redirect(`https://${forwardedHost}${next}`); + } else { + return NextResponse.redirect(`${origin}${next}`); + } + } + } + + // return the user to an error page with instructions + return NextResponse.redirect(`${origin}/auth/auth-code-error`); +} diff --git a/apps/web/app/api/auth/sign-up/route.ts b/apps/web/app/api/auth/sign-up/route.ts new file mode 100644 index 0000000..fb1581b --- /dev/null +++ b/apps/web/app/api/auth/sign-up/route.ts @@ -0,0 +1,40 @@ +import { logger } from '@ultra-reporter/logger'; +import { createClient } from '@ultra-reporter/supabase/server'; +import { NextResponse } from 'next/server'; + +export async function POST(req: Request) { + const supabase = await createClient(); + + const origin = req.headers.get('origin'); + + const { provider } = await req.json(); + const { error, data } = await supabase.auth.signInWithOAuth({ + provider, + options: { + redirectTo: `${origin}/auth/callback`, + }, + }); + + if (error) { + logger.error('Sign up failed', error); + return new NextResponse('Error while signing up', { + status: 500, + }); + } + + const { + data: { user }, + } = await supabase.auth.getUser(); + + if (!user) { + logger.error('User not found'); + return new NextResponse('Error while signing up', { + status: 500, + }); + } + + logger.info('Sign up successful', data); + return NextResponse.json(user, { + status: 201, + }); +} diff --git a/package.json b/package.json index 03c37aa..7f050f1 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@release-it-plugins/lerna-changelog": "^7.0.0", "@stylistic/eslint-plugin-js": "^2.12.1", "@stylistic/eslint-plugin-ts": "^2.12.1", - "@types/node": "^22.10.3", + "@types/node": "^22.10.4", "@typescript-eslint/eslint-plugin": "^8.19.0", "@typescript-eslint/parser": "^8.19.0", "@vercel/style-guide": "^6.0.0", diff --git a/packages/feature-toggle/package.json b/packages/feature-toggle/package.json index d2a5cdb..d94a7e6 100644 --- a/packages/feature-toggle/package.json +++ b/packages/feature-toggle/package.json @@ -20,6 +20,6 @@ "react-dom": "^19.0" }, "dependencies": { - "flagsmith": "^8.0.1" + "flagsmith": "^8.0.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc1117f..75e992b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^2.12.1 version: 2.12.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) '@types/node': - specifier: ^22.10.3 - version: 22.10.3 + specifier: ^22.10.4 + version: 22.10.4 '@typescript-eslint/eslint-plugin': specifier: ^8.19.0 version: 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) @@ -183,8 +183,8 @@ importers: packages/feature-toggle: dependencies: flagsmith: - specifier: ^8.0.1 - version: 8.0.1 + specifier: ^8.0.2 + version: 8.0.2 react: specifier: ^19.0 version: 19.0.0 @@ -1672,8 +1672,8 @@ packages: '@types/node@22.10.2': resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} - '@types/node@22.10.3': - resolution: {integrity: sha512-DifAyw4BkrufCILvD3ucnuN8eydUfc/C1GlyrnI+LK6543w5/L3VeVgf05o3B4fqSXP1dKYLOZsKfutpxPzZrw==} + '@types/node@22.10.4': + resolution: {integrity: sha512-99l6wv4HEzBQhvaU/UGoeBoCK61SCROQaCCGyQSgX2tEQ3rKkNZ2S7CEWnS/4s1LV+8ODdK21UeyR1fHP2mXug==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -3049,8 +3049,8 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flagsmith@8.0.1: - resolution: {integrity: sha512-cwW5v1EzwpEitQRPDRofSE+1q1fedxxCnfQwesHrRu4i62Erm2bvkuXfHvrTzB1k+6XA9GQmiNNb9br+8+iW5w==} + flagsmith@8.0.2: + resolution: {integrity: sha512-7NtsJuNAL1hGcezcWOpwfQOZWMwlFBEGRpKwbA8JMEUnx5zsm99LU8psVa3ne72uIVgDABcpdZnp7ep0fhRHRA==} flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} @@ -6741,7 +6741,7 @@ snapshots: dependencies: undici-types: 6.20.0 - '@types/node@22.10.3': + '@types/node@22.10.4': dependencies: undici-types: 6.20.0 @@ -6765,7 +6765,7 @@ snapshots: '@types/ws@8.5.13': dependencies: - '@types/node': 22.10.3 + '@types/node': 22.10.4 '@types/xml2js@0.4.14': dependencies: @@ -7020,7 +7020,7 @@ snapshots: eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.31.0) eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) eslint-plugin-eslint-comments: 3.2.0(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)) eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.17.0(jiti@2.4.2)) eslint-plugin-playwright: 1.8.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2)) @@ -8013,7 +8013,7 @@ snapshots: eslint: 9.17.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.17.0(jiti@2.4.2)) eslint-plugin-react: 7.37.3(eslint@9.17.0(jiti@2.4.2)) eslint-plugin-react-hooks: 5.1.0(eslint@9.17.0(jiti@2.4.2)) @@ -8061,24 +8061,25 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/parser': 7.18.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) eslint: 9.17.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) eslint: 9.17.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color @@ -8088,7 +8089,7 @@ snapshots: eslint: 9.17.0(jiti@2.4.2) ignore: 5.3.2 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -8099,7 +8100,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.17.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.0 is-glob: 4.0.3 @@ -8111,7 +8112,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/parser': 7.18.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -8128,7 +8129,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.17.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.0 is-glob: 4.0.3 @@ -8517,7 +8518,7 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flagsmith@8.0.1: {} + flagsmith@8.0.2: {} flat-cache@4.0.1: dependencies: