vinextauth 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/cloudflare-kv.d.ts +28 -0
- package/dist/adapters/cloudflare-kv.js +51 -0
- package/dist/adapters/cloudflare-kv.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +628 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/index.d.ts +24 -0
- package/dist/middleware/index.js +147 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/providers/github.d.ts +12 -0
- package/dist/providers/github.js +41 -0
- package/dist/providers/github.js.map +1 -0
- package/dist/providers/google.d.ts +12 -0
- package/dist/providers/google.js +43 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/react/index.d.ts +38 -0
- package/dist/react/index.js +113 -0
- package/dist/react/index.js.map +1 -0
- package/dist/server/index.d.ts +24 -0
- package/dist/server/index.js +245 -0
- package/dist/server/index.js.map +1 -0
- package/dist/types-G_m6Z3Iz.d.ts +180 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cookies/strategy.ts","../src/core/config.ts","../src/cookies/index.ts","../src/handlers/signin.ts","../src/jwt/keys.ts","../src/jwt/index.ts","../src/core/session.ts","../src/handlers/callback.ts","../src/core/csrf.ts","../src/handlers/signout.ts","../src/handlers/session-route.ts","../src/handlers/csrf-route.ts","../src/handlers/index.ts"],"names":["isAbsoluteUrl","token"],"mappings":"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","file":"index.js","sourcesContent":["import type { CookiesConfig } from \"../types.js\";\n\nexport const SESSION_TOKEN_COOKIE = \"vinextauth.session-token\";\nexport const CALLBACK_URL_COOKIE = \"vinextauth.callback-url\";\nexport const CSRF_TOKEN_COOKIE = \"vinextauth.csrf-token\";\nexport const STATE_COOKIE = \"vinextauth.state\";\nexport const NONCE_COOKIE = \"vinextauth.nonce\";\n\n// Secure prefix for HTTPS\nconst SECURE_PREFIX = \"__Secure-\";\n\nexport function buildCookieNames(useSecure: boolean): CookiesConfig {\n const prefix = useSecure ? SECURE_PREFIX : \"\";\n\n return {\n sessionToken: {\n name: `${prefix}${SESSION_TOKEN_COOKIE}`,\n options: {\n httpOnly: true,\n sameSite: \"lax\",\n path: \"/\",\n secure: useSecure,\n },\n },\n callbackUrl: {\n name: `${prefix}${CALLBACK_URL_COOKIE}`,\n options: {\n httpOnly: true,\n sameSite: \"lax\",\n path: \"/\",\n secure: useSecure,\n },\n },\n csrfToken: {\n name: `${CSRF_TOKEN_COOKIE}`,\n options: {\n httpOnly: true,\n sameSite: \"lax\",\n path: \"/\",\n secure: useSecure,\n },\n },\n state: {\n name: `${prefix}${STATE_COOKIE}`,\n options: {\n httpOnly: true,\n sameSite: \"lax\",\n path: \"/\",\n secure: useSecure,\n maxAge: 60 * 15, // 15 minutes\n },\n },\n nonce: {\n name: `${prefix}${NONCE_COOKIE}`,\n options: {\n httpOnly: true,\n sameSite: \"lax\",\n path: \"/\",\n secure: useSecure,\n maxAge: 60 * 15,\n },\n },\n };\n}\n\nexport function serializeCookie(name: string, value: string, options: CookiesConfig[keyof CookiesConfig][\"options\"] & { maxAge?: number }): string {\n let cookie = `${name}=${encodeURIComponent(value)}`;\n\n if (options.httpOnly) cookie += \"; HttpOnly\";\n if (options.secure) cookie += \"; Secure\";\n if (options.sameSite) cookie += `; SameSite=${capitalize(options.sameSite)}`;\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;\n if (options.domain) cookie += `; Domain=${options.domain}`;\n\n return cookie;\n}\n\nexport function deleteCookieString(name: string, options: CookiesConfig[keyof CookiesConfig][\"options\"]): string {\n return serializeCookie(name, \"\", { ...options, maxAge: 0 });\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import type { VinextAuthConfig, ResolvedConfig } from \"../types.js\";\nimport { buildCookieNames } from \"../cookies/strategy.js\";\n\nconst DEFAULT_MAX_AGE = 30 * 24 * 60 * 60; // 30 days\n\nexport function resolveConfig(config: VinextAuthConfig): ResolvedConfig {\n const secret =\n config.secret ??\n (typeof process !== \"undefined\"\n ? process.env.NEXTAUTH_SECRET ?? process.env.VINEXTAUTH_SECRET\n : undefined);\n\n if (!secret) {\n throw new Error(\n \"[VinextAuth] No secret provided. Set NEXTAUTH_SECRET or VINEXTAUTH_SECRET env var, or pass `secret` to VinextAuth().\"\n );\n }\n\n const baseUrl =\n (typeof process !== \"undefined\"\n ? process.env.NEXTAUTH_URL ?? process.env.VINEXTAUTH_URL ?? process.env.VERCEL_URL\n : undefined) ?? \"http://localhost:3000\";\n\n const normalizedBaseUrl = baseUrl.startsWith(\"http\") ? baseUrl : `https://${baseUrl}`;\n\n const useSecureCookies =\n config.useSecureCookies ?? normalizedBaseUrl.startsWith(\"https://\");\n\n const sessionMaxAge = config.session?.maxAge ?? DEFAULT_MAX_AGE;\n\n return {\n providers: config.providers,\n secret,\n baseUrl: normalizedBaseUrl,\n basePath: \"/api/auth\",\n callbacks: config.callbacks ?? {},\n pages: {\n signIn: \"/api/auth/signin\",\n signOut: \"/api/auth/signout\",\n error: \"/api/auth/error\",\n verifyRequest: \"/api/auth/verify-request\",\n newUser: \"/\",\n ...config.pages,\n },\n session: {\n strategy: config.session?.strategy ?? \"jwt\",\n maxAge: sessionMaxAge,\n updateAge: config.session?.updateAge ?? 24 * 60 * 60,\n },\n jwt: {\n secret,\n maxAge: sessionMaxAge,\n encode: config.jwt?.encode as ResolvedConfig[\"jwt\"][\"encode\"],\n decode: config.jwt?.decode as ResolvedConfig[\"jwt\"][\"decode\"],\n },\n debug: config.debug ?? false,\n useSecureCookies,\n cookies: {\n ...buildCookieNames(useSecureCookies),\n ...config.cookies,\n },\n adapter: config.adapter,\n };\n}\n","import type { ResolvedConfig, Session } from \"../types.js\";\nimport { serializeCookie, deleteCookieString } from \"./strategy.js\";\n\n// ─── Read ─────────────────────────────────────────────────────────────────────\n\nexport function getSessionToken(request: Request, config: ResolvedConfig): string | null {\n return getCookieValue(request, config.cookies.sessionToken.name);\n}\n\nexport function getCallbackUrl(request: Request, config: ResolvedConfig): string | null {\n return getCookieValue(request, config.cookies.callbackUrl.name);\n}\n\nexport function getCsrfCookie(request: Request, config: ResolvedConfig): string | null {\n return getCookieValue(request, config.cookies.csrfToken.name);\n}\n\nexport function getStateCookie(request: Request, config: ResolvedConfig): string | null {\n return getCookieValue(request, config.cookies.state.name);\n}\n\nfunction getCookieValue(request: Request, name: string): string | null {\n const cookieHeader = request.headers.get(\"cookie\") ?? \"\";\n for (const part of cookieHeader.split(\";\")) {\n const [key, ...val] = part.trim().split(\"=\");\n if (key.trim() === name) {\n return decodeURIComponent(val.join(\"=\"));\n }\n }\n return null;\n}\n\n// ─── Set ──────────────────────────────────────────────────────────────────────\n\nexport function applySessionCookie(headers: Headers, token: string, config: ResolvedConfig): void {\n const { name, options } = config.cookies.sessionToken;\n headers.append(\n \"Set-Cookie\",\n serializeCookie(name, token, { ...options, maxAge: config.session.maxAge })\n );\n}\n\nexport function applyCallbackUrlCookie(headers: Headers, url: string, config: ResolvedConfig): void {\n const { name, options } = config.cookies.callbackUrl;\n headers.append(\"Set-Cookie\", serializeCookie(name, url, { ...options, maxAge: 60 * 10 }));\n}\n\nexport function applyCsrfCookie(headers: Headers, value: string, config: ResolvedConfig): void {\n const { name, options } = config.cookies.csrfToken;\n headers.append(\"Set-Cookie\", serializeCookie(name, value, options));\n}\n\nexport function applyStateCookie(headers: Headers, state: string, config: ResolvedConfig): void {\n const { name, options } = config.cookies.state;\n headers.append(\"Set-Cookie\", serializeCookie(name, state, options));\n}\n\n// ─── Delete ───────────────────────────────────────────────────────────────────\n\nexport function clearSessionCookie(headers: Headers, config: ResolvedConfig): void {\n const { name, options } = config.cookies.sessionToken;\n headers.append(\"Set-Cookie\", deleteCookieString(name, options));\n}\n\nexport function clearStateCookie(headers: Headers, config: ResolvedConfig): void {\n const { name, options } = config.cookies.state;\n headers.append(\"Set-Cookie\", deleteCookieString(name, options));\n}\n\nexport function clearCallbackUrlCookie(headers: Headers, config: ResolvedConfig): void {\n const { name, options } = config.cookies.callbackUrl;\n headers.append(\"Set-Cookie\", deleteCookieString(name, options));\n}\n\n// ─── Session cookie helpers ───────────────────────────────────────────────────\n\nexport function sessionToExpires(maxAge: number): string {\n return new Date(Date.now() + maxAge * 1000).toISOString();\n}\n\nexport function buildSessionFromJWT(\n jwt: Record<string, unknown>,\n maxAge: number\n): Session {\n return {\n user: {\n id: (jwt.sub as string) ?? \"\",\n name: (jwt.name as string | null) ?? null,\n email: (jwt.email as string | null) ?? null,\n image: (jwt.picture as string | null) ?? null,\n },\n expires: sessionToExpires(maxAge),\n };\n}\n","import type { ResolvedConfig } from \"../types.js\";\nimport { applyStateCookie, applyCallbackUrlCookie } from \"../cookies/index.js\";\n\nfunction randomBase64url(bytes: number): string {\n const arr = new Uint8Array(bytes);\n crypto.getRandomValues(arr);\n const binary = String.fromCharCode(...arr);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\n\nexport async function handleSignIn(\n request: Request,\n providerId: string,\n config: ResolvedConfig\n): Promise<Response> {\n const provider = config.providers.find((p) => p.id === providerId);\n\n if (!provider) {\n return new Response(`Unknown provider: ${providerId}`, { status: 404 });\n }\n\n const url = new URL(request.url);\n const callbackUrl =\n url.searchParams.get(\"callbackUrl\") ??\n config.pages.newUser ??\n \"/\";\n\n const state = randomBase64url(32);\n const redirectUri = `${config.baseUrl}${config.basePath}/callback/${providerId}`;\n\n const authUrl = new URL(provider.authorization.url);\n authUrl.searchParams.set(\"client_id\", provider.clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"state\", state);\n\n // Merge provider default params\n const params = provider.authorization.params ?? {};\n for (const [key, value] of Object.entries(params)) {\n authUrl.searchParams.set(key, value);\n }\n\n const headers = new Headers();\n applyStateCookie(headers, state, config);\n applyCallbackUrlCookie(headers, callbackUrl, config);\n headers.set(\"Location\", authUrl.toString());\n\n return new Response(null, { status: 302, headers });\n}\n","// Key cache to avoid re-importing on every request\nconst keyCache = new Map<string, CryptoKey>();\n\nexport async function deriveKey(secret: string): Promise<CryptoKey> {\n const cached = keyCache.get(secret);\n if (cached) return cached;\n\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret);\n\n const key = await crypto.subtle.importKey(\n \"raw\",\n keyData,\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\", \"verify\"]\n );\n\n keyCache.set(secret, key);\n return key;\n}\n","import type { JWT } from \"../types.js\";\nimport { deriveKey } from \"./keys.js\";\n\n// ─── Base64url helpers ────────────────────────────────────────────────────────\n\nfunction base64urlEncode(data: ArrayBuffer): string {\n const bytes = new Uint8Array(data);\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\n\nfunction base64urlDecode(str: string): Uint8Array {\n const base64 = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), \"=\");\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction encodeJson(obj: unknown): string {\n return base64urlEncode(new TextEncoder().encode(JSON.stringify(obj)).buffer as ArrayBuffer);\n}\n\nfunction decodeJson(str: string): unknown {\n return JSON.parse(new TextDecoder().decode(base64urlDecode(str)));\n}\n\n// ─── JWT operations ───────────────────────────────────────────────────────────\n\nconst HEADER = encodeJson({ alg: \"HS256\", typ: \"JWT\" });\n\nexport async function sign(payload: JWT, secret: string): Promise<string> {\n const encodedPayload = encodeJson(payload);\n const message = `${HEADER}.${encodedPayload}`;\n\n const key = await deriveKey(secret);\n const signature = await crypto.subtle.sign(\n \"HMAC\",\n key,\n new TextEncoder().encode(message)\n );\n\n return `${message}.${base64urlEncode(signature)}`;\n}\n\nexport async function verify(token: string, secret: string): Promise<JWT | null> {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n\n const [header, payload, sig] = parts;\n const message = `${header}.${payload}`;\n\n const key = await deriveKey(secret);\n const signatureBytes = base64urlDecode(sig);\n\n const valid = await crypto.subtle.verify(\n \"HMAC\",\n key,\n signatureBytes,\n new TextEncoder().encode(message)\n );\n\n if (!valid) return null;\n\n const decoded = decodeJson(payload) as JWT;\n\n // Check expiry\n if (decoded.exp && decoded.exp < Math.floor(Date.now() / 1000)) {\n return null;\n }\n\n return decoded;\n } catch {\n return null;\n }\n}\n\nexport function decode(token: string): JWT | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n return decodeJson(parts[1]) as JWT;\n } catch {\n return null;\n }\n}\n","import type { JWT, Session, ResolvedConfig } from \"../types.js\";\nimport * as jwtLib from \"../jwt/index.js\";\nimport { buildSessionFromJWT } from \"../cookies/index.js\";\n\nexport async function encodeSession(\n payload: JWT,\n config: ResolvedConfig\n): Promise<string> {\n if (config.jwt.encode) {\n return config.jwt.encode({\n token: payload,\n secret: config.secret,\n maxAge: config.session.maxAge,\n });\n }\n return jwtLib.sign(payload, config.secret);\n}\n\nexport async function decodeSession(\n token: string,\n config: ResolvedConfig\n): Promise<JWT | null> {\n if (config.jwt.decode) {\n return config.jwt.decode({ token, secret: config.secret });\n }\n return jwtLib.verify(token, config.secret);\n}\n\nexport async function buildSession(\n jwt: JWT,\n config: ResolvedConfig\n): Promise<Session> {\n const baseSession = buildSessionFromJWT(jwt, config.session.maxAge);\n\n if (config.callbacks.session) {\n return config.callbacks.session({ session: baseSession, token: jwt });\n }\n\n return baseSession;\n}\n\nexport async function buildJWT(\n user: { id: string; name?: string | null; email?: string | null; image?: string | null },\n account: Parameters<NonNullable<ResolvedConfig[\"callbacks\"][\"jwt\"]>>[0][\"account\"],\n profile: Record<string, unknown> | undefined,\n config: ResolvedConfig\n): Promise<JWT> {\n const now = Math.floor(Date.now() / 1000);\n\n let token: JWT = {\n sub: user.id,\n name: user.name,\n email: user.email,\n picture: user.image,\n iat: now,\n exp: now + config.session.maxAge,\n jti: generateId(),\n };\n\n if (config.callbacks.jwt) {\n token = await config.callbacks.jwt({\n token,\n user,\n account,\n profile,\n trigger: \"signIn\",\n });\n }\n\n return token;\n}\n\nfunction generateId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n","import type { ResolvedConfig, SignInCallbackParams } from \"../types.js\";\nimport {\n getStateCookie,\n getCallbackUrl,\n applySessionCookie,\n clearStateCookie,\n clearCallbackUrlCookie,\n} from \"../cookies/index.js\";\nimport { buildJWT, buildSession, encodeSession } from \"../core/session.js\";\n\nexport async function handleCallback(\n request: Request,\n providerId: string,\n config: ResolvedConfig\n): Promise<Response> {\n const provider = config.providers.find((p) => p.id === providerId);\n if (!provider) return new Response(\"Unknown provider\", { status: 404 });\n\n const url = new URL(request.url);\n const code = url.searchParams.get(\"code\");\n const stateParam = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n\n if (error) {\n const errorUrl = new URL(`${config.baseUrl}${config.pages.error}`);\n errorUrl.searchParams.set(\"error\", error);\n return Response.redirect(errorUrl.toString(), 302);\n }\n\n if (!code) {\n return new Response(\"Missing code\", { status: 400 });\n }\n\n // Verify state\n const storedState = getStateCookie(request, config);\n if (provider.checks?.includes(\"state\")) {\n if (!storedState || storedState !== stateParam) {\n const errorUrl = new URL(`${config.baseUrl}${config.pages.error}`);\n errorUrl.searchParams.set(\"error\", \"OAuthStateError\");\n return Response.redirect(errorUrl.toString(), 302);\n }\n }\n\n // Exchange code for tokens\n const redirectUri = `${config.baseUrl}${config.basePath}/callback/${providerId}`;\n let tokenData: Record<string, unknown>;\n\n try {\n const tokenResponse = await fetch(provider.token.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n code,\n redirect_uri: redirectUri,\n client_id: provider.clientId,\n client_secret: provider.clientSecret,\n }).toString(),\n });\n\n if (!tokenResponse.ok) {\n throw new Error(`Token exchange failed: ${tokenResponse.status}`);\n }\n\n tokenData = await tokenResponse.json() as Record<string, unknown>;\n } catch (err) {\n if (config.debug) console.error(\"[VinextAuth] Token exchange error:\", err);\n const errorUrl = new URL(`${config.baseUrl}${config.pages.error}`);\n errorUrl.searchParams.set(\"error\", \"OAuthCallbackError\");\n return Response.redirect(errorUrl.toString(), 302);\n }\n\n // Fetch user profile\n let rawProfile: Record<string, unknown>;\n try {\n const userInfoResponse = await fetch(provider.userinfo.url, {\n headers: {\n Authorization: `Bearer ${tokenData.access_token}`,\n Accept: \"application/json\",\n },\n });\n\n if (!userInfoResponse.ok) {\n throw new Error(`UserInfo fetch failed: ${userInfoResponse.status}`);\n }\n\n rawProfile = await userInfoResponse.json() as Record<string, unknown>;\n } catch (err) {\n if (config.debug) console.error(\"[VinextAuth] UserInfo error:\", err);\n const errorUrl = new URL(`${config.baseUrl}${config.pages.error}`);\n errorUrl.searchParams.set(\"error\", \"OAuthCallbackError\");\n return Response.redirect(errorUrl.toString(), 302);\n }\n\n const user = provider.profile(rawProfile);\n\n const account: SignInCallbackParams[\"account\"] = {\n provider: providerId,\n type: \"oauth\",\n providerAccountId: user.id,\n access_token: tokenData.access_token as string | undefined,\n refresh_token: tokenData.refresh_token as string | undefined,\n expires_at: tokenData.expires_in\n ? Math.floor(Date.now() / 1000) + (tokenData.expires_in as number)\n : undefined,\n token_type: tokenData.token_type as string | undefined,\n scope: tokenData.scope as string | undefined,\n id_token: tokenData.id_token as string | undefined,\n };\n\n // signIn callback\n if (config.callbacks.signIn) {\n const result = await config.callbacks.signIn({ user, account, profile: rawProfile });\n if (result === false) {\n const errorUrl = new URL(`${config.baseUrl}${config.pages.error}`);\n errorUrl.searchParams.set(\"error\", \"AccessDenied\");\n return Response.redirect(errorUrl.toString(), 302);\n }\n if (typeof result === \"string\") {\n return Response.redirect(result, 302);\n }\n }\n\n // Build JWT and session\n const jwtPayload = await buildJWT(user, account, rawProfile, config);\n const sessionToken = await encodeSession(jwtPayload, config);\n const session = await buildSession(jwtPayload, config);\n\n // Redirect destination\n const callbackUrl = getCallbackUrl(request, config) ?? config.pages.newUser ?? \"/\";\n const redirectUrl = isAbsoluteUrl(callbackUrl)\n ? callbackUrl\n : `${config.baseUrl}${callbackUrl}`;\n\n const headers = new Headers();\n applySessionCookie(headers, sessionToken, config);\n clearStateCookie(headers, config);\n clearCallbackUrlCookie(headers, config);\n headers.set(\"Location\", redirectUrl);\n\n if (config.debug) {\n console.log(\"[VinextAuth] Signed in:\", session.user.email);\n }\n\n return new Response(null, { status: 302, headers });\n}\n\nfunction isAbsoluteUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n","import { deriveKey } from \"../jwt/keys.js\";\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nfunction randomHex(bytes: number): string {\n const arr = new Uint8Array(bytes);\n crypto.getRandomValues(arr);\n return bytesToHex(arr);\n}\n\nasync function hmacHex(secret: string, value: string): Promise<string> {\n const key = await deriveKey(secret);\n const sig = await crypto.subtle.sign(\"HMAC\", key, new TextEncoder().encode(value));\n return bytesToHex(new Uint8Array(sig));\n}\n\n/**\n * Generates a CSRF token and the cookie value to store.\n * Cookie value format: \"{token}|{hmac(token, secret)}\"\n */\nexport async function generateCsrfToken(secret: string): Promise<{ token: string; cookieValue: string }> {\n const token = randomHex(32);\n const hash = await hmacHex(secret, token);\n return { token, cookieValue: `${token}|${hash}` };\n}\n\n/**\n * Verifies that the submitted token matches the stored cookie value.\n */\nexport async function verifyCsrfToken(\n submittedToken: string,\n cookieValue: string,\n secret: string\n): Promise<boolean> {\n const [storedToken] = cookieValue.split(\"|\");\n if (storedToken !== submittedToken) return false;\n\n const expectedHash = await hmacHex(secret, storedToken);\n const expectedCookieValue = `${storedToken}|${expectedHash}`;\n\n // Constant-time comparison\n if (cookieValue.length !== expectedCookieValue.length) return false;\n\n let diff = 0;\n for (let i = 0; i < cookieValue.length; i++) {\n diff |= cookieValue.charCodeAt(i) ^ expectedCookieValue.charCodeAt(i);\n }\n return diff === 0;\n}\n","import type { ResolvedConfig } from \"../types.js\";\nimport { clearSessionCookie, clearCallbackUrlCookie } from \"../cookies/index.js\";\nimport { getCsrfCookie } from \"../cookies/index.js\";\nimport { verifyCsrfToken } from \"../core/csrf.js\";\n\nexport async function handleSignOut(\n request: Request,\n config: ResolvedConfig\n): Promise<Response> {\n let callbackUrl = config.baseUrl;\n\n if (request.method === \"POST\") {\n let body: Record<string, string> = {};\n try {\n const contentType = request.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n body = await request.json() as Record<string, string>;\n } else if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n const text = await request.text();\n body = Object.fromEntries(new URLSearchParams(text));\n }\n } catch {\n // ignore parse errors\n }\n\n // Verify CSRF\n const csrfCookie = getCsrfCookie(request, config);\n const submittedToken = body.csrfToken ?? \"\";\n if (csrfCookie) {\n const valid = await verifyCsrfToken(submittedToken, csrfCookie, config.secret);\n if (!valid && config.debug) {\n console.warn(\"[VinextAuth] CSRF verification failed on signout\");\n }\n }\n\n callbackUrl = body.callbackUrl ?? config.baseUrl;\n }\n\n const headers = new Headers();\n clearSessionCookie(headers, config);\n clearCallbackUrlCookie(headers, config);\n\n const redirectUrl = isAbsoluteUrl(callbackUrl)\n ? callbackUrl\n : `${config.baseUrl}${callbackUrl}`;\n\n headers.set(\"Location\", redirectUrl);\n\n return new Response(null, { status: 302, headers });\n}\n\nfunction isAbsoluteUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n","import type { ResolvedConfig } from \"../types.js\";\nimport { getSessionToken } from \"../cookies/index.js\";\nimport { decodeSession, buildSession } from \"../core/session.js\";\n\nexport async function handleSessionRoute(\n request: Request,\n config: ResolvedConfig\n): Promise<Response> {\n const token = getSessionToken(request, config);\n\n if (!token) {\n return Response.json({});\n }\n\n const jwt = await decodeSession(token, config);\n if (!jwt) {\n return Response.json({});\n }\n\n const session = await buildSession(jwt, config);\n\n return Response.json(session, {\n headers: {\n \"Cache-Control\": \"no-store, max-age=0\",\n },\n });\n}\n","import type { ResolvedConfig } from \"../types.js\";\nimport { getCsrfCookie, applyCsrfCookie } from \"../cookies/index.js\";\nimport { generateCsrfToken } from \"../core/csrf.js\";\n\nexport async function handleCsrfRoute(\n request: Request,\n config: ResolvedConfig\n): Promise<Response> {\n // Reuse existing CSRF cookie if present and valid\n const existing = getCsrfCookie(request, config);\n if (existing) {\n const token = existing.split(\"|\")[0];\n return Response.json({ csrfToken: token });\n }\n\n const { token, cookieValue } = await generateCsrfToken(config.secret);\n const headers = new Headers();\n applyCsrfCookie(headers, cookieValue, config);\n\n return Response.json({ csrfToken: token }, { headers });\n}\n","import type { VinextAuthConfig, VinextAuthHandlers } from \"../types.js\";\nimport { resolveConfig } from \"../core/config.js\";\nimport { handleSignIn } from \"./signin.js\";\nimport { handleCallback } from \"./callback.js\";\nimport { handleSignOut } from \"./signout.js\";\nimport { handleSessionRoute } from \"./session-route.js\";\nimport { handleCsrfRoute } from \"./csrf-route.js\";\n\n// Module-level config storage for server-side helpers (getServerSession)\nlet _resolvedConfig: ReturnType<typeof resolveConfig> | null = null;\n\nexport function getResolvedConfig() {\n return _resolvedConfig;\n}\n\n/**\n * VinextAuth — main factory function.\n *\n * Usage (identical to NextAuth v4):\n * ```ts\n * const handler = VinextAuth(authOptions)\n * export { handler as GET, handler as POST }\n * ```\n */\nexport function VinextAuth(config: VinextAuthConfig): VinextAuthHandlers {\n const resolved = resolveConfig(config);\n _resolvedConfig = resolved;\n\n async function handler(request: Request): Promise<Response> {\n const url = new URL(request.url);\n\n // Extract path segments after /api/auth/\n const basePath = resolved.basePath; // \"/api/auth\"\n const pathname = url.pathname;\n\n if (!pathname.startsWith(basePath)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const action = pathname.slice(basePath.length).replace(/^\\//, \"\");\n // action examples: \"signin/google\", \"callback/google\", \"signout\", \"session\", \"csrf\", \"error\"\n\n const parts = action.split(\"/\");\n const verb = parts[0];\n const param = parts[1]; // provider id, if any\n\n // Route\n if (verb === \"signin\" && param) {\n return handleSignIn(request, param, resolved);\n }\n\n if (verb === \"signin\" && !param) {\n // Show built-in signin page (list providers)\n return handleSignInPage(resolved);\n }\n\n if (verb === \"callback\" && param) {\n return handleCallback(request, param, resolved);\n }\n\n if (verb === \"signout\") {\n if (request.method === \"POST\") {\n return handleSignOut(request, resolved);\n }\n // GET signout — show confirmation page or just do it\n return handleSignOut(request, resolved);\n }\n\n if (verb === \"session\") {\n return handleSessionRoute(request, resolved);\n }\n\n if (verb === \"csrf\") {\n return handleCsrfRoute(request, resolved);\n }\n\n if (verb === \"error\") {\n const error = url.searchParams.get(\"error\") ?? \"Unknown\";\n return new Response(\n `<!DOCTYPE html><html><body><h1>Authentication Error</h1><p>${error}</p><a href=\"${resolved.pages.signIn}\">Try again</a></body></html>`,\n { status: 400, headers: { \"Content-Type\": \"text/html\" } }\n );\n }\n\n return new Response(\"Not Found\", { status: 404 });\n }\n\n return { GET: handler, POST: handler };\n}\n\nfunction handleSignInPage(config: ReturnType<typeof resolveConfig>): Response {\n const providers = config.providers.map((p) => `\n <a href=\"${config.basePath}/signin/${p.id}\" style=\"display:block;margin:8px 0;padding:12px 24px;border:1px solid #ccc;border-radius:6px;text-decoration:none;color:#000;\">\n Sign in with ${p.name}\n </a>\n `).join(\"\");\n\n return new Response(\n `<!DOCTYPE html><html><body style=\"font-family:sans-serif;max-width:400px;margin:80px auto;padding:24px\">\n <h1>Sign In</h1>${providers}\n </body></html>`,\n { headers: { \"Content-Type\": \"text/html\" } }\n );\n}\n\nexport default VinextAuth;\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { W as WithAuthOptions } from '../types-G_m6Z3Iz.js';
|
|
2
|
+
|
|
3
|
+
type NextRequest = Request & {
|
|
4
|
+
cookies?: {
|
|
5
|
+
get?: (name: string) => {
|
|
6
|
+
value: string;
|
|
7
|
+
} | undefined;
|
|
8
|
+
};
|
|
9
|
+
nextUrl?: URL;
|
|
10
|
+
};
|
|
11
|
+
type NextMiddlewareResult = Response | null | undefined;
|
|
12
|
+
type NextMiddleware = (request: NextRequest) => NextMiddlewareResult | Promise<NextMiddlewareResult>;
|
|
13
|
+
/**
|
|
14
|
+
* withAuth — Edge-compatible middleware, drop-in for NextAuth's withAuth.
|
|
15
|
+
*
|
|
16
|
+
* Usage (identical to NextAuth v4):
|
|
17
|
+
* ```ts
|
|
18
|
+
* export default withAuth({ pages: { signIn: "/login" } })
|
|
19
|
+
* export const config = { matcher: ["/dashboard/:path*"] }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare function withAuth(middlewareOrOptions?: NextMiddleware | WithAuthOptions, options?: WithAuthOptions): NextMiddleware;
|
|
23
|
+
|
|
24
|
+
export { withAuth as default, withAuth };
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// src/jwt/keys.ts
|
|
2
|
+
var keyCache = /* @__PURE__ */ new Map();
|
|
3
|
+
async function deriveKey(secret) {
|
|
4
|
+
const cached = keyCache.get(secret);
|
|
5
|
+
if (cached) return cached;
|
|
6
|
+
const encoder = new TextEncoder();
|
|
7
|
+
const keyData = encoder.encode(secret);
|
|
8
|
+
const key = await crypto.subtle.importKey(
|
|
9
|
+
"raw",
|
|
10
|
+
keyData,
|
|
11
|
+
{ name: "HMAC", hash: "SHA-256" },
|
|
12
|
+
false,
|
|
13
|
+
["sign", "verify"]
|
|
14
|
+
);
|
|
15
|
+
keyCache.set(secret, key);
|
|
16
|
+
return key;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// src/jwt/index.ts
|
|
20
|
+
function base64urlEncode(data) {
|
|
21
|
+
const bytes = new Uint8Array(data);
|
|
22
|
+
let binary = "";
|
|
23
|
+
for (const byte of bytes) {
|
|
24
|
+
binary += String.fromCharCode(byte);
|
|
25
|
+
}
|
|
26
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
27
|
+
}
|
|
28
|
+
function base64urlDecode(str) {
|
|
29
|
+
const base64 = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
30
|
+
const padded = base64.padEnd(base64.length + (4 - base64.length % 4) % 4, "=");
|
|
31
|
+
const binary = atob(padded);
|
|
32
|
+
const bytes = new Uint8Array(binary.length);
|
|
33
|
+
for (let i = 0; i < binary.length; i++) {
|
|
34
|
+
bytes[i] = binary.charCodeAt(i);
|
|
35
|
+
}
|
|
36
|
+
return bytes;
|
|
37
|
+
}
|
|
38
|
+
function encodeJson(obj) {
|
|
39
|
+
return base64urlEncode(new TextEncoder().encode(JSON.stringify(obj)).buffer);
|
|
40
|
+
}
|
|
41
|
+
function decodeJson(str) {
|
|
42
|
+
return JSON.parse(new TextDecoder().decode(base64urlDecode(str)));
|
|
43
|
+
}
|
|
44
|
+
encodeJson({ alg: "HS256", typ: "JWT" });
|
|
45
|
+
async function verify(token, secret) {
|
|
46
|
+
try {
|
|
47
|
+
const parts = token.split(".");
|
|
48
|
+
if (parts.length !== 3) return null;
|
|
49
|
+
const [header, payload, sig] = parts;
|
|
50
|
+
const message = `${header}.${payload}`;
|
|
51
|
+
const key = await deriveKey(secret);
|
|
52
|
+
const signatureBytes = base64urlDecode(sig);
|
|
53
|
+
const valid = await crypto.subtle.verify(
|
|
54
|
+
"HMAC",
|
|
55
|
+
key,
|
|
56
|
+
signatureBytes,
|
|
57
|
+
new TextEncoder().encode(message)
|
|
58
|
+
);
|
|
59
|
+
if (!valid) return null;
|
|
60
|
+
const decoded = decodeJson(payload);
|
|
61
|
+
if (decoded.exp && decoded.exp < Math.floor(Date.now() / 1e3)) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return decoded;
|
|
65
|
+
} catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/cookies/strategy.ts
|
|
71
|
+
var SESSION_TOKEN_COOKIE = "vinextauth.session-token";
|
|
72
|
+
|
|
73
|
+
// src/middleware/index.ts
|
|
74
|
+
function getNextResponse() {
|
|
75
|
+
return {
|
|
76
|
+
redirect: (url, status = 302) => new Response(null, { status, headers: { Location: url.toString() } }),
|
|
77
|
+
next: () => void 0
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function withAuth(middlewareOrOptions, options) {
|
|
81
|
+
let innerMiddleware;
|
|
82
|
+
let opts;
|
|
83
|
+
if (typeof middlewareOrOptions === "function") {
|
|
84
|
+
innerMiddleware = middlewareOrOptions;
|
|
85
|
+
opts = options ?? {};
|
|
86
|
+
} else {
|
|
87
|
+
opts = middlewareOrOptions ?? {};
|
|
88
|
+
}
|
|
89
|
+
const signInPage = opts.pages?.signIn ?? "/api/auth/signin";
|
|
90
|
+
return async (request) => {
|
|
91
|
+
const secret = opts.secret ?? (typeof process !== "undefined" ? process.env.NEXTAUTH_SECRET ?? process.env.VINEXTAUTH_SECRET : void 0);
|
|
92
|
+
if (!secret) {
|
|
93
|
+
console.error("[VinextAuth] withAuth: No secret configured.");
|
|
94
|
+
return getNextResponse().redirect(signInPage);
|
|
95
|
+
}
|
|
96
|
+
const token = getTokenFromRequest(request);
|
|
97
|
+
let jwt = null;
|
|
98
|
+
if (token) {
|
|
99
|
+
jwt = await verify(token, secret);
|
|
100
|
+
}
|
|
101
|
+
if (opts.callbacks?.authorized) {
|
|
102
|
+
const authorized = await opts.callbacks.authorized({ token: jwt, req: request });
|
|
103
|
+
if (!authorized) {
|
|
104
|
+
return redirectToSignIn(request, signInPage);
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
if (!jwt) {
|
|
108
|
+
return redirectToSignIn(request, signInPage);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (innerMiddleware) {
|
|
112
|
+
return innerMiddleware(request);
|
|
113
|
+
}
|
|
114
|
+
return getNextResponse().next();
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function getTokenFromRequest(request) {
|
|
118
|
+
if (request.cookies?.get) {
|
|
119
|
+
const secure = request.cookies.get(`__Secure-${SESSION_TOKEN_COOKIE}`)?.value;
|
|
120
|
+
if (secure) return secure;
|
|
121
|
+
const plain = request.cookies.get(SESSION_TOKEN_COOKIE)?.value;
|
|
122
|
+
if (plain) return plain;
|
|
123
|
+
}
|
|
124
|
+
const cookieHeader = request.headers.get("cookie") ?? "";
|
|
125
|
+
for (const part of cookieHeader.split(";")) {
|
|
126
|
+
const [key, ...val] = part.trim().split("=");
|
|
127
|
+
const name = key.trim();
|
|
128
|
+
if (name === `__Secure-${SESSION_TOKEN_COOKIE}` || name === SESSION_TOKEN_COOKIE) {
|
|
129
|
+
return decodeURIComponent(val.join("="));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
function redirectToSignIn(request, signInPage) {
|
|
135
|
+
const url = request.nextUrl ?? new URL(request.url);
|
|
136
|
+
const callbackUrl = url.pathname + url.search;
|
|
137
|
+
const redirectUrl = `${signInPage}?callbackUrl=${encodeURIComponent(callbackUrl)}`;
|
|
138
|
+
return new Response(null, {
|
|
139
|
+
status: 302,
|
|
140
|
+
headers: { Location: redirectUrl }
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
var middleware_default = withAuth;
|
|
144
|
+
|
|
145
|
+
export { middleware_default as default, withAuth };
|
|
146
|
+
//# sourceMappingURL=index.js.map
|
|
147
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/jwt/keys.ts","../../src/jwt/index.ts","../../src/cookies/strategy.ts","../../src/middleware/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Key cache to avoid re-importing on every request\nconst keyCache = new Map<string, CryptoKey>();\n\nexport async function deriveKey(secret: string): Promise<CryptoKey> {\n const cached = keyCache.get(secret);\n if (cached) return cached;\n\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret);\n\n const key = await crypto.subtle.importKey(\n \"raw\",\n keyData,\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\", \"verify\"]\n );\n\n keyCache.set(secret, key);\n return key;\n}\n","import type { JWT } from \"../types.js\";\nimport { deriveKey } from \"./keys.js\";\n\n// ─── Base64url helpers ────────────────────────────────────────────────────────\n\nfunction base64urlEncode(data: ArrayBuffer): string {\n const bytes = new Uint8Array(data);\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\n\nfunction base64urlDecode(str: string): Uint8Array {\n const base64 = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), \"=\");\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction encodeJson(obj: unknown): string {\n return base64urlEncode(new TextEncoder().encode(JSON.stringify(obj)).buffer as ArrayBuffer);\n}\n\nfunction decodeJson(str: string): unknown {\n return JSON.parse(new TextDecoder().decode(base64urlDecode(str)));\n}\n\n// ─── JWT operations ───────────────────────────────────────────────────────────\n\nconst HEADER = encodeJson({ alg: \"HS256\", typ: \"JWT\" });\n\nexport async function sign(payload: JWT, secret: string): Promise<string> {\n const encodedPayload = encodeJson(payload);\n const message = `${HEADER}.${encodedPayload}`;\n\n const key = await deriveKey(secret);\n const signature = await crypto.subtle.sign(\n \"HMAC\",\n key,\n new TextEncoder().encode(message)\n );\n\n return `${message}.${base64urlEncode(signature)}`;\n}\n\nexport async function verify(token: string, secret: string): Promise<JWT | null> {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n\n const [header, payload, sig] = parts;\n const message = `${header}.${payload}`;\n\n const key = await deriveKey(secret);\n const signatureBytes = base64urlDecode(sig);\n\n const valid = await crypto.subtle.verify(\n \"HMAC\",\n key,\n signatureBytes,\n new TextEncoder().encode(message)\n );\n\n if (!valid) return null;\n\n const decoded = decodeJson(payload) as JWT;\n\n // Check expiry\n if (decoded.exp && decoded.exp < Math.floor(Date.now() / 1000)) {\n return null;\n }\n\n return decoded;\n } catch {\n return null;\n }\n}\n\nexport function decode(token: string): JWT | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n return decodeJson(parts[1]) as JWT;\n } catch {\n return null;\n }\n}\n","import type { CookiesConfig } from \"../types.js\";\n\nexport const SESSION_TOKEN_COOKIE = \"vinextauth.session-token\";\nexport const CALLBACK_URL_COOKIE = \"vinextauth.callback-url\";\nexport const CSRF_TOKEN_COOKIE = \"vinextauth.csrf-token\";\nexport const STATE_COOKIE = \"vinextauth.state\";\nexport const NONCE_COOKIE = \"vinextauth.nonce\";\n\n// Secure prefix for HTTPS\nconst SECURE_PREFIX = \"__Secure-\";\n\nexport function buildCookieNames(useSecure: boolean): CookiesConfig {\n const prefix = useSecure ? SECURE_PREFIX : \"\";\n\n return {\n sessionToken: {\n name: `${prefix}${SESSION_TOKEN_COOKIE}`,\n options: {\n httpOnly: true,\n sameSite: \"lax\",\n path: \"/\",\n secure: useSecure,\n },\n },\n callbackUrl: {\n name: `${prefix}${CALLBACK_URL_COOKIE}`,\n options: {\n httpOnly: true,\n sameSite: \"lax\",\n path: \"/\",\n secure: useSecure,\n },\n },\n csrfToken: {\n name: `${CSRF_TOKEN_COOKIE}`,\n options: {\n httpOnly: true,\n sameSite: \"lax\",\n path: \"/\",\n secure: useSecure,\n },\n },\n state: {\n name: `${prefix}${STATE_COOKIE}`,\n options: {\n httpOnly: true,\n sameSite: \"lax\",\n path: \"/\",\n secure: useSecure,\n maxAge: 60 * 15, // 15 minutes\n },\n },\n nonce: {\n name: `${prefix}${NONCE_COOKIE}`,\n options: {\n httpOnly: true,\n sameSite: \"lax\",\n path: \"/\",\n secure: useSecure,\n maxAge: 60 * 15,\n },\n },\n };\n}\n\nexport function serializeCookie(name: string, value: string, options: CookiesConfig[keyof CookiesConfig][\"options\"] & { maxAge?: number }): string {\n let cookie = `${name}=${encodeURIComponent(value)}`;\n\n if (options.httpOnly) cookie += \"; HttpOnly\";\n if (options.secure) cookie += \"; Secure\";\n if (options.sameSite) cookie += `; SameSite=${capitalize(options.sameSite)}`;\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;\n if (options.domain) cookie += `; Domain=${options.domain}`;\n\n return cookie;\n}\n\nexport function deleteCookieString(name: string, options: CookiesConfig[keyof CookiesConfig][\"options\"]): string {\n return serializeCookie(name, \"\", { ...options, maxAge: 0 });\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import type { WithAuthOptions, JWT } from \"../types.js\";\nimport * as jwtLib from \"../jwt/index.js\";\nimport { SESSION_TOKEN_COOKIE } from \"../cookies/strategy.js\";\n\ntype NextRequest = Request & {\n cookies?: { get?: (name: string) => { value: string } | undefined };\n nextUrl?: URL;\n};\n\ntype NextMiddlewareResult = Response | null | undefined;\ntype NextMiddleware = (request: NextRequest) => NextMiddlewareResult | Promise<NextMiddlewareResult>;\n\nfunction getNextResponse() {\n // Compatibility: return a simple redirect builder\n return {\n redirect: (url: string | URL, status = 302) =>\n new Response(null, { status, headers: { Location: url.toString() } }),\n next: () => undefined as NextMiddlewareResult,\n };\n}\n\n/**\n * withAuth — Edge-compatible middleware, drop-in for NextAuth's withAuth.\n *\n * Usage (identical to NextAuth v4):\n * ```ts\n * export default withAuth({ pages: { signIn: \"/login\" } })\n * export const config = { matcher: [\"/dashboard/:path*\"] }\n * ```\n */\nexport function withAuth(\n middlewareOrOptions?: NextMiddleware | WithAuthOptions,\n options?: WithAuthOptions\n): NextMiddleware {\n let innerMiddleware: NextMiddleware | undefined;\n let opts: WithAuthOptions;\n\n if (typeof middlewareOrOptions === \"function\") {\n innerMiddleware = middlewareOrOptions;\n opts = options ?? {};\n } else {\n opts = middlewareOrOptions ?? {};\n }\n\n const signInPage = opts.pages?.signIn ?? \"/api/auth/signin\";\n\n return async (request: NextRequest): Promise<NextMiddlewareResult> => {\n const secret =\n opts.secret ??\n (typeof process !== \"undefined\"\n ? process.env.NEXTAUTH_SECRET ?? process.env.VINEXTAUTH_SECRET\n : undefined);\n\n if (!secret) {\n console.error(\"[VinextAuth] withAuth: No secret configured.\");\n return getNextResponse().redirect(signInPage);\n }\n\n const token = getTokenFromRequest(request);\n let jwt: JWT | null = null;\n\n if (token) {\n jwt = await jwtLib.verify(token, secret);\n }\n\n // Custom authorized callback\n if (opts.callbacks?.authorized) {\n const authorized = await opts.callbacks.authorized({ token: jwt, req: request });\n if (!authorized) {\n return redirectToSignIn(request, signInPage);\n }\n } else {\n // Default: just require a valid token\n if (!jwt) {\n return redirectToSignIn(request, signInPage);\n }\n }\n\n // Pass through to inner middleware if provided\n if (innerMiddleware) {\n return innerMiddleware(request);\n }\n\n return getNextResponse().next();\n };\n}\n\nfunction getTokenFromRequest(request: NextRequest): string | null {\n // Try next.js cookies API (NextRequest)\n if (request.cookies?.get) {\n const secure = request.cookies.get(`__Secure-${SESSION_TOKEN_COOKIE}`)?.value;\n if (secure) return secure;\n const plain = request.cookies.get(SESSION_TOKEN_COOKIE)?.value;\n if (plain) return plain;\n }\n\n // Fallback: parse Cookie header manually\n const cookieHeader = request.headers.get(\"cookie\") ?? \"\";\n for (const part of cookieHeader.split(\";\")) {\n const [key, ...val] = part.trim().split(\"=\");\n const name = key.trim();\n if (name === `__Secure-${SESSION_TOKEN_COOKIE}` || name === SESSION_TOKEN_COOKIE) {\n return decodeURIComponent(val.join(\"=\"));\n }\n }\n\n return null;\n}\n\nfunction redirectToSignIn(request: NextRequest, signInPage: string): Response {\n const url = request.nextUrl ?? new URL(request.url);\n const callbackUrl = url.pathname + url.search;\n const redirectUrl = `${signInPage}?callbackUrl=${encodeURIComponent(callbackUrl)}`;\n return new Response(null, {\n status: 302,\n headers: { Location: redirectUrl },\n });\n}\n\nexport default withAuth;\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { O as OAuthProvider } from '../types-G_m6Z3Iz.js';
|
|
2
|
+
|
|
3
|
+
interface GitHubProviderConfig {
|
|
4
|
+
clientId: string;
|
|
5
|
+
clientSecret: string;
|
|
6
|
+
authorization?: {
|
|
7
|
+
params?: Record<string, string>;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
declare function GitHubProvider(config: GitHubProviderConfig): OAuthProvider;
|
|
11
|
+
|
|
12
|
+
export { GitHubProvider, type GitHubProviderConfig, GitHubProvider as default };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// src/providers/github.ts
|
|
2
|
+
function GitHubProvider(config) {
|
|
3
|
+
const clientId = config.clientId ?? process.env.GITHUB_CLIENT_ID ?? "";
|
|
4
|
+
const clientSecret = config.clientSecret ?? process.env.GITHUB_CLIENT_SECRET ?? "";
|
|
5
|
+
return {
|
|
6
|
+
id: "github",
|
|
7
|
+
name: "GitHub",
|
|
8
|
+
type: "oauth",
|
|
9
|
+
clientId,
|
|
10
|
+
clientSecret,
|
|
11
|
+
authorization: {
|
|
12
|
+
url: "https://github.com/login/oauth/authorize",
|
|
13
|
+
params: {
|
|
14
|
+
response_type: "code",
|
|
15
|
+
scope: "read:user user:email",
|
|
16
|
+
...config.authorization?.params
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
token: {
|
|
20
|
+
url: "https://github.com/login/oauth/access_token"
|
|
21
|
+
},
|
|
22
|
+
userinfo: {
|
|
23
|
+
url: "https://api.github.com/user"
|
|
24
|
+
},
|
|
25
|
+
profile(profile) {
|
|
26
|
+
return {
|
|
27
|
+
id: String(profile.id),
|
|
28
|
+
name: profile.name ?? profile.login,
|
|
29
|
+
email: profile.email,
|
|
30
|
+
image: profile.avatar_url
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
checks: ["state"],
|
|
34
|
+
scope: "read:user user:email"
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
var github_default = GitHubProvider;
|
|
38
|
+
|
|
39
|
+
export { GitHubProvider, github_default as default };
|
|
40
|
+
//# sourceMappingURL=github.js.map
|
|
41
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/providers/github.ts"],"names":[],"mappings":";AAUO,SAAS,eAAe,MAAA,EAA6C;AAC1E,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,OAAA,CAAQ,IAAI,gBAAA,IAAoB,EAAA;AACpE,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,OAAA,CAAQ,IAAI,oBAAA,IAAwB,EAAA;AAEhF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,QAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA,EAAe;AAAA,MACb,GAAA,EAAK,0CAAA;AAAA,MACL,MAAA,EAAQ;AAAA,QACN,aAAA,EAAe,MAAA;AAAA,QACf,KAAA,EAAO,sBAAA;AAAA,QACP,GAAG,OAAO,aAAA,EAAe;AAAA;AAC3B,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AAAA,IACA,QAAA,EAAU;AAAA,MACR,GAAA,EAAK;AAAA,KACP;AAAA,IACA,QAAQ,OAAA,EAAwC;AAC9C,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,QACrB,IAAA,EAAO,OAAA,CAAQ,IAAA,IAA2B,OAAA,CAAQ,KAAA;AAAA,QAClD,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,IACF,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,OAAO,CAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AACF;AAEA,IAAO,cAAA,GAAQ","file":"github.js","sourcesContent":["import type { OAuthProvider, User } from \"../types.js\";\n\nexport interface GitHubProviderConfig {\n clientId: string;\n clientSecret: string;\n authorization?: {\n params?: Record<string, string>;\n };\n}\n\nexport function GitHubProvider(config: GitHubProviderConfig): OAuthProvider {\n const clientId = config.clientId ?? process.env.GITHUB_CLIENT_ID ?? \"\";\n const clientSecret = config.clientSecret ?? process.env.GITHUB_CLIENT_SECRET ?? \"\";\n\n return {\n id: \"github\",\n name: \"GitHub\",\n type: \"oauth\",\n clientId,\n clientSecret,\n authorization: {\n url: \"https://github.com/login/oauth/authorize\",\n params: {\n response_type: \"code\",\n scope: \"read:user user:email\",\n ...config.authorization?.params,\n },\n },\n token: {\n url: \"https://github.com/login/oauth/access_token\",\n },\n userinfo: {\n url: \"https://api.github.com/user\",\n },\n profile(profile: Record<string, unknown>): User {\n return {\n id: String(profile.id),\n name: (profile.name as string | null) ?? (profile.login as string | null),\n email: profile.email as string | null,\n image: profile.avatar_url as string | null,\n };\n },\n checks: [\"state\"],\n scope: \"read:user user:email\",\n };\n}\n\nexport default GitHubProvider;\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { O as OAuthProvider } from '../types-G_m6Z3Iz.js';
|
|
2
|
+
|
|
3
|
+
interface GoogleProviderConfig {
|
|
4
|
+
clientId: string;
|
|
5
|
+
clientSecret: string;
|
|
6
|
+
authorization?: {
|
|
7
|
+
params?: Record<string, string>;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
declare function GoogleProvider(config: GoogleProviderConfig): OAuthProvider;
|
|
11
|
+
|
|
12
|
+
export { GoogleProvider, type GoogleProviderConfig, GoogleProvider as default };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// src/providers/google.ts
|
|
2
|
+
function GoogleProvider(config) {
|
|
3
|
+
const clientId = config.clientId ?? process.env.GOOGLE_CLIENT_ID ?? "";
|
|
4
|
+
const clientSecret = config.clientSecret ?? process.env.GOOGLE_CLIENT_SECRET ?? "";
|
|
5
|
+
return {
|
|
6
|
+
id: "google",
|
|
7
|
+
name: "Google",
|
|
8
|
+
type: "oauth",
|
|
9
|
+
clientId,
|
|
10
|
+
clientSecret,
|
|
11
|
+
authorization: {
|
|
12
|
+
url: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
13
|
+
params: {
|
|
14
|
+
response_type: "code",
|
|
15
|
+
scope: "openid email profile",
|
|
16
|
+
access_type: "offline",
|
|
17
|
+
prompt: "select_account",
|
|
18
|
+
...config.authorization?.params
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
token: {
|
|
22
|
+
url: "https://oauth2.googleapis.com/token"
|
|
23
|
+
},
|
|
24
|
+
userinfo: {
|
|
25
|
+
url: "https://www.googleapis.com/oauth2/v2/userinfo"
|
|
26
|
+
},
|
|
27
|
+
profile(profile) {
|
|
28
|
+
return {
|
|
29
|
+
id: profile.id,
|
|
30
|
+
name: profile.name,
|
|
31
|
+
email: profile.email,
|
|
32
|
+
image: profile.picture
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
checks: ["state"],
|
|
36
|
+
scope: "openid email profile"
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
var google_default = GoogleProvider;
|
|
40
|
+
|
|
41
|
+
export { GoogleProvider, google_default as default };
|
|
42
|
+
//# sourceMappingURL=google.js.map
|
|
43
|
+
//# sourceMappingURL=google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/providers/google.ts"],"names":[],"mappings":";AAUO,SAAS,eAAe,MAAA,EAA6C;AAC1E,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,OAAA,CAAQ,IAAI,gBAAA,IAAoB,EAAA;AACpE,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,OAAA,CAAQ,IAAI,oBAAA,IAAwB,EAAA;AAEhF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,QAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA,EAAe;AAAA,MACb,GAAA,EAAK,8CAAA;AAAA,MACL,MAAA,EAAQ;AAAA,QACN,aAAA,EAAe,MAAA;AAAA,QACf,KAAA,EAAO,sBAAA;AAAA,QACP,WAAA,EAAa,SAAA;AAAA,QACb,MAAA,EAAQ,gBAAA;AAAA,QACR,GAAG,OAAO,aAAA,EAAe;AAAA;AAC3B,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AAAA,IACA,QAAA,EAAU;AAAA,MACR,GAAA,EAAK;AAAA,KACP;AAAA,IACA,QAAQ,OAAA,EAAwC;AAC9C,MAAA,OAAO;AAAA,QACL,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,IACF,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,OAAO,CAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AACF;AAGA,IAAO,cAAA,GAAQ","file":"google.js","sourcesContent":["import type { OAuthProvider, User } from \"../types.js\";\n\nexport interface GoogleProviderConfig {\n clientId: string;\n clientSecret: string;\n authorization?: {\n params?: Record<string, string>;\n };\n}\n\nexport function GoogleProvider(config: GoogleProviderConfig): OAuthProvider {\n const clientId = config.clientId ?? process.env.GOOGLE_CLIENT_ID ?? \"\";\n const clientSecret = config.clientSecret ?? process.env.GOOGLE_CLIENT_SECRET ?? \"\";\n\n return {\n id: \"google\",\n name: \"Google\",\n type: \"oauth\",\n clientId,\n clientSecret,\n authorization: {\n url: \"https://accounts.google.com/o/oauth2/v2/auth\",\n params: {\n response_type: \"code\",\n scope: \"openid email profile\",\n access_type: \"offline\",\n prompt: \"select_account\",\n ...config.authorization?.params,\n },\n },\n token: {\n url: \"https://oauth2.googleapis.com/token\",\n },\n userinfo: {\n url: \"https://www.googleapis.com/oauth2/v2/userinfo\",\n },\n profile(profile: Record<string, unknown>): User {\n return {\n id: profile.id as string,\n name: profile.name as string | null,\n email: profile.email as string | null,\n image: profile.picture as string | null,\n };\n },\n checks: [\"state\"],\n scope: \"openid email profile\",\n };\n}\n\n// Default export for convenience: GoogleProvider({ clientId, clientSecret })\nexport default GoogleProvider;\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { S as Session, j as SignInOptions, k as SignOutOptions, g as SessionContextValue } from '../types-G_m6Z3Iz.js';
|
|
4
|
+
|
|
5
|
+
interface SessionProviderProps {
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
/** Pass server-side session to avoid client waterfall */
|
|
8
|
+
session?: Session | null;
|
|
9
|
+
basePath?: string;
|
|
10
|
+
refetchInterval?: number;
|
|
11
|
+
refetchOnWindowFocus?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare function SessionProvider({ children, session: initialSession, basePath, refetchInterval, refetchOnWindowFocus, }: SessionProviderProps): react_jsx_runtime.JSX.Element;
|
|
14
|
+
|
|
15
|
+
declare function useSession(): SessionContextValue;
|
|
16
|
+
/**
|
|
17
|
+
* signIn — redirect to OAuth provider or sign-in page.
|
|
18
|
+
*
|
|
19
|
+
* Usage (identical to NextAuth v4):
|
|
20
|
+
* ```ts
|
|
21
|
+
* signIn("google")
|
|
22
|
+
* signIn("google", { callbackUrl: "/dashboard" })
|
|
23
|
+
* signIn() // goes to /api/auth/signin (provider list)
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
declare function signIn(provider?: string, options?: SignInOptions, basePath?: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* signOut — POST to signout endpoint, then redirect.
|
|
29
|
+
*
|
|
30
|
+
* Usage (identical to NextAuth v4):
|
|
31
|
+
* ```ts
|
|
32
|
+
* signOut()
|
|
33
|
+
* signOut({ callbackUrl: "/login" })
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
declare function signOut(options?: SignOutOptions, basePath?: string): Promise<void>;
|
|
37
|
+
|
|
38
|
+
export { SessionContextValue, SessionProvider, SignInOptions, SignOutOptions, signIn, signOut, useSession };
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { createContext, useState, useCallback, useEffect, useContext } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/react/provider.tsx
|
|
5
|
+
var SessionContext = createContext({
|
|
6
|
+
data: null,
|
|
7
|
+
status: "loading",
|
|
8
|
+
update: async () => null
|
|
9
|
+
});
|
|
10
|
+
function useSessionContext() {
|
|
11
|
+
return useContext(SessionContext);
|
|
12
|
+
}
|
|
13
|
+
var fetchPromise = null;
|
|
14
|
+
async function fetchSession(basePath = "/api/auth") {
|
|
15
|
+
if (fetchPromise) return fetchPromise;
|
|
16
|
+
fetchPromise = fetch(`${basePath}/session`, {
|
|
17
|
+
credentials: "same-origin",
|
|
18
|
+
headers: { "Content-Type": "application/json" }
|
|
19
|
+
}).then(async (res) => {
|
|
20
|
+
if (!res.ok) return null;
|
|
21
|
+
const data = await res.json();
|
|
22
|
+
if (!data || !data.user) return null;
|
|
23
|
+
return data;
|
|
24
|
+
}).catch(() => null).finally(() => {
|
|
25
|
+
fetchPromise = null;
|
|
26
|
+
});
|
|
27
|
+
return fetchPromise;
|
|
28
|
+
}
|
|
29
|
+
async function fetchCsrfToken(basePath = "/api/auth") {
|
|
30
|
+
const res = await fetch(`${basePath}/csrf`, { credentials: "same-origin" });
|
|
31
|
+
const data = await res.json();
|
|
32
|
+
return data.csrfToken ?? "";
|
|
33
|
+
}
|
|
34
|
+
function SessionProvider({
|
|
35
|
+
children,
|
|
36
|
+
session: initialSession,
|
|
37
|
+
basePath = "/api/auth",
|
|
38
|
+
refetchInterval,
|
|
39
|
+
refetchOnWindowFocus = true
|
|
40
|
+
}) {
|
|
41
|
+
const [session, setSession] = useState(initialSession ?? null);
|
|
42
|
+
const [status, setStatus] = useState(
|
|
43
|
+
initialSession !== void 0 ? initialSession ? "authenticated" : "unauthenticated" : "loading"
|
|
44
|
+
);
|
|
45
|
+
const loadSession = useCallback(async () => {
|
|
46
|
+
setStatus("loading");
|
|
47
|
+
const data = await fetchSession(basePath);
|
|
48
|
+
setSession(data);
|
|
49
|
+
setStatus(data ? "authenticated" : "unauthenticated");
|
|
50
|
+
}, [basePath]);
|
|
51
|
+
const update = useCallback(async (data) => {
|
|
52
|
+
if (data) {
|
|
53
|
+
const updated = session ? { ...session, ...data } : null;
|
|
54
|
+
setSession(updated);
|
|
55
|
+
return updated;
|
|
56
|
+
}
|
|
57
|
+
await loadSession();
|
|
58
|
+
return session;
|
|
59
|
+
}, [session, loadSession]);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (initialSession !== void 0) {
|
|
62
|
+
setSession(initialSession);
|
|
63
|
+
setStatus(initialSession ? "authenticated" : "unauthenticated");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
loadSession();
|
|
67
|
+
}, [initialSession, loadSession]);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (!refetchOnWindowFocus) return;
|
|
70
|
+
const onFocus = () => {
|
|
71
|
+
if (document.visibilityState === "visible") {
|
|
72
|
+
loadSession();
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
document.addEventListener("visibilitychange", onFocus);
|
|
76
|
+
return () => document.removeEventListener("visibilitychange", onFocus);
|
|
77
|
+
}, [refetchOnWindowFocus, loadSession]);
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
if (!refetchInterval) return;
|
|
80
|
+
const interval = setInterval(loadSession, refetchInterval * 1e3);
|
|
81
|
+
return () => clearInterval(interval);
|
|
82
|
+
}, [refetchInterval, loadSession]);
|
|
83
|
+
return /* @__PURE__ */ jsx(SessionContext.Provider, { value: { data: session, status, update }, children });
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/react/hooks.ts
|
|
87
|
+
function useSession() {
|
|
88
|
+
return useSessionContext();
|
|
89
|
+
}
|
|
90
|
+
function signIn(provider, options, basePath = "/api/auth") {
|
|
91
|
+
const callbackUrl = options?.callbackUrl ?? window.location.href;
|
|
92
|
+
if (provider) {
|
|
93
|
+
const url = `${basePath}/signin/${provider}?callbackUrl=${encodeURIComponent(callbackUrl)}`;
|
|
94
|
+
window.location.href = url;
|
|
95
|
+
} else {
|
|
96
|
+
window.location.href = `${basePath}/signin?callbackUrl=${encodeURIComponent(callbackUrl)}`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function signOut(options, basePath = "/api/auth") {
|
|
100
|
+
const callbackUrl = options?.callbackUrl ?? window.location.origin;
|
|
101
|
+
const csrfToken = await fetchCsrfToken(basePath);
|
|
102
|
+
await fetch(`${basePath}/signout`, {
|
|
103
|
+
method: "POST",
|
|
104
|
+
headers: { "Content-Type": "application/json" },
|
|
105
|
+
credentials: "same-origin",
|
|
106
|
+
body: JSON.stringify({ csrfToken, callbackUrl })
|
|
107
|
+
});
|
|
108
|
+
window.location.href = callbackUrl;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export { SessionProvider, signIn, signOut, useSession };
|
|
112
|
+
//# sourceMappingURL=index.js.map
|
|
113
|
+
//# sourceMappingURL=index.js.map
|