| Server IP : 159.203.156.69 / Your IP : 216.73.217.172 Web Server : nginx/1.24.0 System : Linux main-ubuntu 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64 User : root ( 0) PHP Version : 8.3.6 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/tanviranik.com/node_modules/vinext/dist/server/ |
Upload File : |
{"version":3,"file":"app-route-handler-runtime.js","names":[],"sources":["../../src/server/app-route-handler-runtime.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport {\n NextRequest,\n RequestCookies,\n sealRequestCookies,\n sealRequestHeaders,\n type NextURL,\n} from \"vinext/shims/server\";\nimport { buildRequestHeadersFromMiddlewareResponse } from \"./middleware-request-headers.js\";\n\nconst ROUTE_HANDLER_HTTP_METHODS = [\n \"GET\",\n \"HEAD\",\n \"POST\",\n \"PUT\",\n \"DELETE\",\n \"PATCH\",\n \"OPTIONS\",\n] as const;\n\nexport type RouteHandlerHttpMethod = (typeof ROUTE_HANDLER_HTTP_METHODS)[number];\n\nexport type RouteHandlerModule = Partial<Record<RouteHandlerHttpMethod | \"default\", unknown>>;\n\n/**\n * Checks whether a string is a recognized HTTP method for App Router route\n * handlers. Invalid methods must be rejected with 400 before any auto-OPTIONS\n * or 405 logic runs.\n *\n * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/server/web/http.ts\n */\nexport function isValidHTTPMethod(maybeMethod: string): maybeMethod is RouteHandlerHttpMethod {\n return (ROUTE_HANDLER_HTTP_METHODS as readonly string[]).includes(maybeMethod);\n}\n\nexport function collectRouteHandlerMethods(handler: RouteHandlerModule): RouteHandlerHttpMethod[] {\n const methods = ROUTE_HANDLER_HTTP_METHODS.filter(\n (method) => typeof handler[method] === \"function\",\n );\n\n if (methods.includes(\"GET\") && !methods.includes(\"HEAD\")) {\n methods.push(\"HEAD\");\n }\n\n return methods;\n}\n\nexport function buildRouteHandlerAllowHeader(exportedMethods: readonly string[]): string {\n const allow = new Set(exportedMethods);\n allow.add(\"OPTIONS\");\n return Array.from(allow).sort().join(\", \");\n}\n\nconst _KNOWN_DYNAMIC_APP_ROUTE_HANDLERS_KEY = Symbol.for(\n \"vinext.appRouteHandlerRuntime.knownDynamicHandlers\",\n);\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\n\n// NOTE: This set starts empty on cold start. The first request may serve a\n// stale ISR cache entry before the handler runs and signals dynamic usage.\n// Next.js avoids this by determining dynamism statically at build time; vinext\n// learns it at runtime and remembers the result for the process lifetime.\nconst knownDynamicAppRouteHandlers = (_g[_KNOWN_DYNAMIC_APP_ROUTE_HANDLERS_KEY] ??=\n new Set<string>()) as Set<string>;\n\nexport function isKnownDynamicAppRoute(pattern: string): boolean {\n return knownDynamicAppRouteHandlers.has(pattern);\n}\n\nexport function markKnownDynamicAppRoute(pattern: string): void {\n knownDynamicAppRouteHandlers.add(pattern);\n}\n\ntype RequestDynamicAccess =\n | \"request.headers\"\n | \"request.cookies\"\n | \"request.ip\"\n | \"request.geo\"\n | \"request.url\"\n | \"request.body\"\n | \"request.blob\"\n | \"request.json\"\n | \"request.text\"\n | \"request.arrayBuffer\"\n | \"request.formData\";\n\ntype NextUrlDynamicAccess =\n | \"nextUrl.search\"\n | \"nextUrl.searchParams\"\n | \"nextUrl.url\"\n | \"nextUrl.href\"\n | \"nextUrl.toJSON\"\n | \"nextUrl.toString\"\n | \"nextUrl.origin\";\n\ntype AppRouteDynamicRequestAccess = RequestDynamicAccess | NextUrlDynamicAccess;\ntype AppRouteRequestMode = \"auto\" | \"force-static\" | \"error\";\n\ntype TrackedAppRouteRequestOptions = {\n basePath?: string;\n i18n?: NextI18nConfig | null;\n middlewareHeaders?: Headers | null;\n onDynamicAccess?: (access: AppRouteDynamicRequestAccess) => void;\n requestMode?: AppRouteRequestMode;\n staticGenerationErrorMessage?: (expression?: string) => string;\n};\n\ntype TrackedAppRouteRequest = {\n request: NextRequest;\n didAccessDynamicRequest(): boolean;\n};\n\nfunction bindMethodIfNeeded<T>(value: T, target: object): T {\n return typeof value === \"function\" ? (value.bind(target) as T) : value;\n}\n\nfunction buildNextConfig(options: TrackedAppRouteRequestOptions): {\n basePath?: string;\n i18n?: NextI18nConfig;\n} | null {\n if (!options.basePath && !options.i18n) {\n return null;\n }\n\n return {\n basePath: options.basePath,\n i18n: options.i18n ?? undefined,\n };\n}\n\nfunction rebuildRequestWithHeaders(input: Request, headers: Headers): Request {\n const method = input.method;\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n cache: input.cache,\n credentials: input.credentials,\n integrity: input.integrity,\n keepalive: input.keepalive,\n mode: input.mode,\n redirect: input.redirect,\n referrer: input.referrer,\n referrerPolicy: input.referrerPolicy,\n signal: input.signal,\n };\n\n if (hasBody && input.body) {\n init.body = input.body;\n init.duplex = \"half\";\n }\n\n return new Request(input.url, init);\n}\n\nfunction cleanStaticUrl(url: string): string {\n const cleanUrl = new URL(url);\n cleanUrl.protocol = \"http:\";\n cleanUrl.host = \"localhost:3000\";\n cleanUrl.username = \"\";\n cleanUrl.password = \"\";\n cleanUrl.search = \"\";\n cleanUrl.hash = \"\";\n return cleanUrl.href;\n}\n\nfunction readEmptyBodyAsArrayBuffer(): Promise<ArrayBuffer> {\n return new Response(null).arrayBuffer();\n}\n\nfunction readEmptyBodyAsBlob(): Promise<Blob> {\n return new Response(null).blob();\n}\n\n// Empty JSON/form-data parses reject naturally; that keeps force-static body\n// stubs aligned with a bodyless request instead of inventing synthetic data.\nfunction readEmptyBodyAsFormData(): Promise<FormData> {\n return new Response(null).formData();\n}\n\nfunction readEmptyBodyAsJson(): Promise<unknown> {\n return new Response(null).json();\n}\n\nfunction readEmptyBodyAsText(): Promise<string> {\n return new Response(null).text();\n}\n\nexport function createTrackedAppRouteRequest(\n request: Request,\n options: TrackedAppRouteRequestOptions = {},\n): TrackedAppRouteRequest {\n let didAccessDynamicRequest = false;\n const requestMode = options.requestMode ?? \"auto\";\n const nextConfig = buildNextConfig(options);\n\n const markDynamicAccess = (access: AppRouteDynamicRequestAccess): void => {\n didAccessDynamicRequest = true;\n options.onDynamicAccess?.(access);\n };\n\n // Mirror the dynamic request reads that Next.js tracks inside\n // packages/next/src/server/route-modules/app-route/module.ts\n // via proxyNextRequest(), but keep the logic in a normal typed module.\n const wrapNextUrl = (nextUrl: NextURL): NextURL => {\n const nextUrlHandler: ProxyHandler<NextURL> = {\n get(target, prop): unknown {\n switch (prop) {\n case \"search\":\n case \"searchParams\":\n case \"url\":\n case \"href\":\n case \"toJSON\":\n case \"toString\":\n case \"origin\":\n markDynamicAccess(`nextUrl.${String(prop)}` as NextUrlDynamicAccess);\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n case \"clone\":\n return () => wrapNextUrl(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextUrl, nextUrlHandler);\n };\n\n const wrapForceStaticNextUrl = (nextUrl: NextURL): NextURL => {\n const emptySearchParams = new URLSearchParams();\n const staticHref = cleanStaticUrl(nextUrl.href);\n const nextUrlHandler: ProxyHandler<NextURL> = {\n get(target, prop): unknown {\n switch (prop) {\n case \"search\":\n return \"\";\n case \"searchParams\":\n return emptySearchParams;\n case \"href\":\n return staticHref;\n case \"url\":\n return undefined;\n case \"toJSON\":\n case \"toString\":\n return () => staticHref;\n case \"clone\":\n return () => wrapForceStaticNextUrl(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextUrl, nextUrlHandler);\n };\n\n const throwStaticGenerationError = (expression: string): never => {\n throw new Error(\n options.staticGenerationErrorMessage?.(expression) ??\n `Route handler with \\`dynamic = \"error\"\\` used ${expression}.`,\n );\n };\n\n const wrapRequireStaticNextUrl = (nextUrl: NextURL): NextURL => {\n const nextUrlHandler: ProxyHandler<NextURL> = {\n get(target, prop): unknown {\n switch (prop) {\n case \"search\":\n case \"searchParams\":\n case \"url\":\n case \"href\":\n case \"toJSON\":\n case \"toString\":\n case \"origin\":\n return throwStaticGenerationError(`nextUrl.${String(prop)}`);\n case \"clone\":\n return () => wrapRequireStaticNextUrl(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextUrl, nextUrlHandler);\n };\n\n const wrapRequest = (input: Request): NextRequest => {\n const requestHeaders = options.middlewareHeaders\n ? buildRequestHeadersFromMiddlewareResponse(input.headers, options.middlewareHeaders)\n : null;\n const requestWithOverrides = requestHeaders\n ? rebuildRequestWithHeaders(input, requestHeaders)\n : input;\n const nextRequest =\n requestWithOverrides instanceof NextRequest\n ? requestWithOverrides\n : new NextRequest(requestWithOverrides, { nextConfig: nextConfig ?? undefined });\n let proxiedNextUrl: NextURL | null = null;\n let forceStaticNextUrl: NextURL | null = null;\n let requireStaticNextUrl: NextURL | null = null;\n let forceStaticHeaders: Headers | null = null;\n let forceStaticCookies: RequestCookies | null = null;\n\n const requestHandler: ProxyHandler<NextRequest> = {\n get(target, prop): unknown {\n if (requestMode === \"force-static\") {\n switch (prop) {\n case \"nextUrl\":\n forceStaticNextUrl ??= wrapForceStaticNextUrl(target.nextUrl);\n return forceStaticNextUrl;\n case \"headers\":\n forceStaticHeaders ??= sealRequestHeaders(new Headers());\n return forceStaticHeaders;\n case \"cookies\":\n forceStaticCookies ??= sealRequestCookies(new RequestCookies(new Headers()));\n return forceStaticCookies;\n case \"url\":\n return cleanStaticUrl(target.nextUrl.href);\n case \"ip\":\n case \"geo\":\n return undefined;\n case \"body\":\n return null;\n case \"arrayBuffer\":\n return readEmptyBodyAsArrayBuffer;\n case \"blob\":\n return readEmptyBodyAsBlob;\n case \"formData\":\n return readEmptyBodyAsFormData;\n case \"json\":\n return readEmptyBodyAsJson;\n case \"text\":\n return readEmptyBodyAsText;\n case \"clone\":\n return () => wrapRequest(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n }\n\n if (requestMode === \"error\") {\n switch (prop) {\n case \"nextUrl\":\n requireStaticNextUrl ??= wrapRequireStaticNextUrl(target.nextUrl);\n return requireStaticNextUrl;\n case \"headers\":\n case \"cookies\":\n case \"url\":\n // Deliberate vinext divergence from Next.js: ip/geo are exposed\n // on NextRequest for Cloudflare compatibility, so require-static\n // treats them as dynamic request APIs instead of falling through.\n case \"ip\":\n case \"geo\":\n case \"body\":\n case \"blob\":\n case \"json\":\n case \"text\":\n case \"arrayBuffer\":\n case \"formData\":\n return throwStaticGenerationError(`request.${String(prop)}`);\n case \"clone\":\n return () => wrapRequest(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n }\n\n switch (prop) {\n case \"nextUrl\":\n proxiedNextUrl ??= wrapNextUrl(target.nextUrl);\n return proxiedNextUrl;\n case \"headers\":\n case \"cookies\":\n case \"ip\":\n case \"geo\":\n case \"url\":\n case \"body\":\n case \"blob\":\n case \"json\":\n case \"text\":\n case \"arrayBuffer\":\n case \"formData\":\n markDynamicAccess(`request.${String(prop)}` as RequestDynamicAccess);\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n case \"clone\":\n return () => wrapRequest(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextRequest, requestHandler);\n };\n\n return {\n request: wrapRequest(request),\n didAccessDynamicRequest() {\n return didAccessDynamicRequest;\n },\n };\n}\n"],"mappings":"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"}