vinext 0.0.27 → 0.0.29
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/build/report.d.ts +117 -0
- package/dist/build/report.d.ts.map +1 -0
- package/dist/build/report.js +303 -0
- package/dist/build/report.js.map +1 -0
- package/dist/build/static-export.d.ts +1 -1
- package/dist/build/static-export.d.ts.map +1 -1
- package/dist/build/static-export.js +2 -1
- package/dist/build/static-export.js.map +1 -1
- package/dist/cli.js +106 -9
- package/dist/cli.js.map +1 -1
- package/dist/cloudflare/kv-cache-handler.d.ts +28 -17
- package/dist/cloudflare/kv-cache-handler.d.ts.map +1 -1
- package/dist/cloudflare/kv-cache-handler.js +109 -42
- package/dist/cloudflare/kv-cache-handler.js.map +1 -1
- package/dist/cloudflare/tpr.d.ts +10 -0
- package/dist/cloudflare/tpr.d.ts.map +1 -1
- package/dist/cloudflare/tpr.js +36 -41
- package/dist/cloudflare/tpr.js.map +1 -1
- package/dist/config/config-matchers.d.ts +1 -0
- package/dist/config/config-matchers.d.ts.map +1 -1
- package/dist/config/config-matchers.js +51 -23
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/next-config.d.ts.map +1 -1
- package/dist/config/next-config.js +16 -0
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.d.ts +1 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +48 -32
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-rsc-entry.d.ts +3 -1
- package/dist/entries/app-rsc-entry.d.ts.map +1 -1
- package/dist/entries/app-rsc-entry.js +514 -99
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.d.ts.map +1 -1
- package/dist/entries/pages-server-entry.js +154 -58
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/index.d.ts +40 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +239 -79
- package/dist/index.js.map +1 -1
- package/dist/plugins/client-reference-dedup.d.ts +19 -0
- package/dist/plugins/client-reference-dedup.d.ts.map +1 -0
- package/dist/plugins/client-reference-dedup.js +96 -0
- package/dist/plugins/client-reference-dedup.js.map +1 -0
- package/dist/routing/app-router.d.ts +2 -0
- package/dist/routing/app-router.d.ts.map +1 -1
- package/dist/routing/app-router.js +145 -161
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/pages-router.d.ts +1 -1
- package/dist/routing/pages-router.d.ts.map +1 -1
- package/dist/routing/pages-router.js +37 -65
- package/dist/routing/pages-router.js.map +1 -1
- package/dist/routing/route-trie.d.ts +57 -0
- package/dist/routing/route-trie.d.ts.map +1 -0
- package/dist/routing/route-trie.js +160 -0
- package/dist/routing/route-trie.js.map +1 -0
- package/dist/routing/route-validation.d.ts +8 -0
- package/dist/routing/route-validation.d.ts.map +1 -0
- package/dist/routing/route-validation.js +136 -0
- package/dist/routing/route-validation.js.map +1 -0
- package/dist/routing/utils.d.ts +19 -0
- package/dist/routing/utils.d.ts.map +1 -1
- package/dist/routing/utils.js +47 -0
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.d.ts.map +1 -1
- package/dist/server/api-handler.js +52 -20
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/dev-server.d.ts.map +1 -1
- package/dist/server/dev-server.js +67 -9
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/image-optimization.d.ts.map +1 -1
- package/dist/server/image-optimization.js +1 -1
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/instrumentation.d.ts.map +1 -1
- package/dist/server/instrumentation.js +17 -8
- package/dist/server/instrumentation.js.map +1 -1
- package/dist/server/isr-cache.d.ts +5 -13
- package/dist/server/isr-cache.d.ts.map +1 -1
- package/dist/server/isr-cache.js +13 -12
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/metadata-routes.d.ts +8 -2
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-routes.js +73 -28
- package/dist/server/metadata-routes.js.map +1 -1
- package/dist/server/middleware-codegen.d.ts +11 -1
- package/dist/server/middleware-codegen.d.ts.map +1 -1
- package/dist/server/middleware-codegen.js +204 -12
- package/dist/server/middleware-codegen.js.map +1 -1
- package/dist/server/middleware.d.ts +9 -8
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +76 -14
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/prod-server.d.ts +8 -2
- package/dist/server/prod-server.d.ts.map +1 -1
- package/dist/server/prod-server.js +144 -74
- package/dist/server/prod-server.js.map +1 -1
- package/dist/shims/cache.d.ts +2 -0
- package/dist/shims/cache.d.ts.map +1 -1
- package/dist/shims/cache.js +20 -8
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/fetch-cache.d.ts.map +1 -1
- package/dist/shims/fetch-cache.js +5 -2
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/form.d.ts.map +1 -1
- package/dist/shims/form.js +103 -8
- package/dist/shims/form.js.map +1 -1
- package/dist/shims/headers.d.ts +11 -3
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/headers.js +182 -30
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/internal/parse-cookie-header.d.ts +12 -0
- package/dist/shims/internal/parse-cookie-header.d.ts.map +1 -0
- package/dist/shims/internal/parse-cookie-header.js +32 -0
- package/dist/shims/internal/parse-cookie-header.js.map +1 -0
- package/dist/shims/link.d.ts +2 -1
- package/dist/shims/link.d.ts.map +1 -1
- package/dist/shims/link.js +19 -45
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +56 -0
- package/dist/shims/metadata.d.ts.map +1 -1
- package/dist/shims/metadata.js +66 -0
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation.d.ts +5 -7
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/shims/navigation.js +61 -39
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/readonly-url-search-params.d.ts +11 -0
- package/dist/shims/readonly-url-search-params.d.ts.map +1 -0
- package/dist/shims/readonly-url-search-params.js +24 -0
- package/dist/shims/readonly-url-search-params.js.map +1 -0
- package/dist/shims/router.d.ts +4 -3
- package/dist/shims/router.d.ts.map +1 -1
- package/dist/shims/router.js +55 -48
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/server.d.ts +1 -1
- package/dist/shims/server.d.ts.map +1 -1
- package/dist/shims/server.js +7 -13
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/url-utils.d.ts +20 -6
- package/dist/shims/url-utils.d.ts.map +1 -1
- package/dist/shims/url-utils.js +79 -0
- package/dist/shims/url-utils.js.map +1 -1
- package/dist/utils/manifest-paths.d.ts +4 -0
- package/dist/utils/manifest-paths.d.ts.map +1 -0
- package/dist/utils/manifest-paths.js +20 -0
- package/dist/utils/manifest-paths.js.map +1 -0
- package/dist/utils/query.d.ts +9 -0
- package/dist/utils/query.d.ts.map +1 -1
- package/dist/utils/query.js +59 -9
- package/dist/utils/query.js.map +1 -1
- package/package.json +2 -2
package/dist/shims/form.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/shims/form.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * next/form shim\n *\n * Progressive enhancement form component. In Next.js, this replaces\n * the standard <form> element with one that intercepts submissions\n * and performs client-side navigation for GET forms (search forms).\n *\n * For POST forms with server actions, it delegates to React's built-in\n * form action handling.\n *\n * Usage:\n * import Form from 'next/form';\n * <Form action=\"/search\">\n * <input name=\"q\" />\n * <button type=\"submit\">Search</button>\n * </Form>\n */\n\nimport { forwardRef, useActionState, type FormHTMLAttributes, type ForwardedRef } from \"react\";\nimport { isDangerousScheme } from \"./url-safety.js\";\n\n// Re-export useActionState from React 19 to match Next.js's next/form module\nexport { useActionState };\n\nfunction isSafeAction(action: string): boolean {\n // Block dangerous URI schemes\n if (isDangerousScheme(action)) return false;\n // Block protocol-relative URLs (//evil.com/...)\n if (action.startsWith(\"//\")) return false;\n // Block absolute URLs to external origins (client-side: compare origins)\n if (/^https?:\\/\\//i.test(action)) {\n if (typeof window !== \"undefined\") {\n try {\n const actionUrl = new URL(action);\n return actionUrl.origin === window.location.origin;\n } catch {\n return false;\n }\n }\n // Server-side: block all absolute URLs (can't compare origins)\n return false;\n }\n return true;\n}\n\ninterface FormProps extends FormHTMLAttributes<HTMLFormElement> {\n /** Target URL for GET forms, or server action for POST forms */\n action: string | ((formData: FormData) => void | Promise<void>);\n /** Replace instead of push in history (default: false) */\n replace?: boolean;\n /** Scroll to top after navigation (default: true) */\n scroll?: boolean;\n}\n\nconst Form = forwardRef(function Form(props: FormProps, ref: ForwardedRef<HTMLFormElement>) {\n const { action, replace = false, scroll = true, onSubmit, ...rest } = props;\n\n // If action is a function (server action), pass it directly to React\n if (typeof action === \"function\") {\n return <form ref={ref} action={action as any} onSubmit={onSubmit as any} {...rest} />;\n }\n\n // Block dangerous action URLs. Render <form> without action attribute\n // so it submits to the current page (safe default).\n if (!isSafeAction(action)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`<Form> blocked unsafe action: ${action}`);\n }\n return <form ref={ref} onSubmit={onSubmit as any} {...rest} />;\n }\n\n async function handleSubmit(e: any) {\n // Call user's onSubmit first\n if (onSubmit) {\n (onSubmit as any)(e);\n if (e.defaultPrevented) return;\n }\n\n // Only intercept GET forms for client-side navigation\n const method = (rest.method ?? \"GET\").toUpperCase();\n if (method !== \"GET\") return;\n\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n const params = new URLSearchParams();\n for (const [key, value] of formData) {\n if (typeof value === \"string\") {\n params.append(key, value);\n }\n }\n\n const url = `${action as string}?${params.toString()}`;\n\n // Navigate client-side\n if (typeof window.__VINEXT_RSC_NAVIGATE__ === \"function\") {\n // App Router: RSC navigation. Await so scroll happens after new content renders.\n if (replace) {\n window.history.replaceState(null, \"\", url);\n } else {\n window.history.pushState(null, \"\", url);\n }\n await window.__VINEXT_RSC_NAVIGATE__(url);\n } else {\n // Pages Router: use router or fallback\n if (replace) {\n window.history.replaceState({}, \"\", url);\n } else {\n window.history.pushState({}, \"\", url);\n }\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n\n if (scroll) {\n window.scrollTo(0, 0);\n }\n }\n\n return <form ref={ref} action={action} onSubmit={handleSubmit} {...rest} />;\n});\n\nexport default Form;\n"]}
|
|
1
|
+
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/shims/form.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * next/form shim\n *\n * Progressive enhancement form component. In Next.js, this replaces\n * the standard <form> element with one that intercepts submissions\n * and performs client-side navigation for GET forms (search forms).\n *\n * For POST forms with server actions, it delegates to React's built-in\n * form action handling.\n *\n * Usage:\n * import Form from 'next/form';\n * <Form action=\"/search\">\n * <input name=\"q\" />\n * <button type=\"submit\">Search</button>\n * </Form>\n */\n\nimport { forwardRef, useActionState, type FormHTMLAttributes, type ForwardedRef } from \"react\";\nimport { isDangerousScheme } from \"./url-safety.js\";\nimport { toSameOriginPath } from \"./url-utils.js\";\n\n// Re-export useActionState from React 19 to match Next.js's next/form module\nexport { useActionState };\n\ntype FormSubmitter = HTMLButtonElement | HTMLInputElement;\nconst SUPPORTED_FORM_ENCTYPE = \"application/x-www-form-urlencoded\";\nconst SUPPORTED_FORM_METHOD = \"GET\";\nconst SUPPORTED_FORM_TARGET = \"_self\";\n\nfunction isSafeAction(action: string): boolean {\n // Block dangerous URI schemes\n if (isDangerousScheme(action)) return false;\n // Block protocol-relative URLs (//evil.com/...)\n if (action.startsWith(\"//\")) return false;\n // Block absolute URLs to external origins (client-side: compare origins)\n if (/^https?:\\/\\//i.test(action)) {\n if (typeof window !== \"undefined\") {\n try {\n const actionUrl = new URL(action);\n return actionUrl.origin === window.location.origin;\n } catch {\n return false;\n }\n }\n // Server-side: block all absolute URLs (can't compare origins)\n return false;\n }\n return true;\n}\n\nfunction getSubmitter(nativeEvent: unknown): FormSubmitter | null {\n const submitter =\n nativeEvent &&\n typeof nativeEvent === \"object\" &&\n \"submitter\" in nativeEvent &&\n nativeEvent.submitter instanceof Element\n ? nativeEvent.submitter\n : null;\n\n if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) {\n return submitter;\n }\n return null;\n}\n\nfunction getEffectiveMethod(\n submitter: FormSubmitter | null,\n formMethod: FormHTMLAttributes<HTMLFormElement>[\"method\"],\n): string {\n const override = submitter?.getAttribute(\"formmethod\");\n return (override ?? formMethod ?? \"GET\").toUpperCase();\n}\n\nfunction getEffectiveAction(submitter: FormSubmitter | null, formAction: string): string {\n return submitter?.getAttribute(\"formaction\") ?? formAction;\n}\n\nfunction checkFormActionUrl(action: string, source: \"action\" | \"formAction\"): void {\n const aPropName = source === \"action\" ? \"an `action`\" : \"a `formAction`\";\n\n let testUrl: URL;\n try {\n testUrl = new URL(action, \"http://n\");\n } catch {\n console.error(`<Form> received ${aPropName} that cannot be parsed as a URL: \"${action}\".`);\n return;\n }\n\n if (testUrl.searchParams.size) {\n console.warn(\n `<Form> received ${aPropName} that contains search params: \"${action}\". This is not supported, and they will be ignored. ` +\n `If you need to pass in additional search params, use an \\`<input type=\"hidden\" />\\` instead.`,\n );\n }\n}\n\nfunction hasUnsupportedSubmitterAttributes(submitter: FormSubmitter): boolean {\n const formEncType = submitter.getAttribute(\"formenctype\");\n if (formEncType !== null && formEncType !== SUPPORTED_FORM_ENCTYPE) {\n console.error(\n `<Form>'s \\`encType\\` was set to an unsupported value via \\`formEncType=\"${formEncType}\"\\`. ` +\n `This will disable <Form>'s navigation functionality. If you need this, use a native <form> element instead.`,\n );\n return true;\n }\n\n const formMethod = submitter.getAttribute(\"formmethod\");\n if (formMethod !== null && formMethod.toUpperCase() !== SUPPORTED_FORM_METHOD) {\n console.error(\n `<Form>'s \\`method\\` was set to an unsupported value via \\`formMethod=\"${formMethod}\"\\`. ` +\n `This will disable <Form>'s navigation functionality. If you need this, use a native <form> element instead.`,\n );\n return true;\n }\n\n const formTarget = submitter.getAttribute(\"formtarget\");\n if (formTarget !== null && formTarget !== SUPPORTED_FORM_TARGET) {\n console.error(\n `<Form>'s \\`target\\` was set to an unsupported value via \\`formTarget=\"${formTarget}\"\\`. ` +\n `This will disable <Form>'s navigation functionality. If you need this, use a native <form> element instead.`,\n );\n return true;\n }\n\n return false;\n}\n\nfunction createFormSubmitDestinationUrl(\n action: string,\n form: HTMLFormElement,\n submitter: FormSubmitter | null,\n): string {\n const targetUrl = new URL(action, window.location.href);\n if (targetUrl.searchParams.size) {\n targetUrl.search = \"\";\n }\n\n const formData = buildFormData(form, submitter);\n for (const [name, value] of formData) {\n targetUrl.searchParams.append(name, typeof value === \"string\" ? value : value.name);\n }\n\n return toSameOriginPath(targetUrl.href) ?? targetUrl.href;\n}\n\nfunction buildFormData(form: HTMLFormElement, submitter: FormSubmitter | null): FormData {\n if (!submitter) return new FormData(form);\n\n try {\n return new FormData(form, submitter);\n } catch {\n const formData = new FormData(form);\n if (!submitter.disabled && submitter.name) {\n formData.append(submitter.name, submitter.value);\n }\n return formData;\n }\n}\n\ninterface FormProps extends FormHTMLAttributes<HTMLFormElement> {\n /** Target URL for GET forms, or server action for POST forms */\n action: string | ((formData: FormData) => void | Promise<void>);\n /** Replace instead of push in history (default: false) */\n replace?: boolean;\n /** Scroll to top after navigation (default: true) */\n scroll?: boolean;\n}\n\nconst Form = forwardRef(function Form(props: FormProps, ref: ForwardedRef<HTMLFormElement>) {\n const { action, replace = false, scroll = true, onSubmit, ...rest } = props;\n\n // If action is a function (server action), pass it directly to React\n if (typeof action === \"function\") {\n return <form ref={ref} action={action as any} onSubmit={onSubmit as any} {...rest} />;\n }\n\n // Block dangerous action URLs. Render <form> without action attribute\n // so it submits to the current page (safe default).\n if (process.env.NODE_ENV !== \"production\") {\n checkFormActionUrl(action, \"action\");\n }\n\n if (!isSafeAction(action)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`<Form> blocked unsafe action: ${action}`);\n }\n return <form ref={ref} onSubmit={onSubmit as any} {...rest} />;\n }\n\n async function handleSubmit(e: any) {\n // Call user's onSubmit first\n if (onSubmit) {\n (onSubmit as any)(e);\n if (e.defaultPrevented) return;\n }\n\n const submitter = getSubmitter(e.nativeEvent);\n if (submitter && hasUnsupportedSubmitterAttributes(submitter)) {\n return;\n }\n\n // Only intercept GET forms for client-side navigation\n const method = getEffectiveMethod(submitter, rest.method);\n if (method !== \"GET\") return;\n\n const effectiveAction = getEffectiveAction(submitter, action as string);\n if (process.env.NODE_ENV !== \"production\" && submitter?.getAttribute(\"formaction\") !== null) {\n checkFormActionUrl(effectiveAction, \"formAction\");\n }\n if (!isSafeAction(effectiveAction)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`<Form> blocked unsafe action: ${effectiveAction}`);\n }\n e.preventDefault();\n return;\n }\n\n e.preventDefault();\n const url = createFormSubmitDestinationUrl(effectiveAction, e.currentTarget, submitter);\n\n // Navigate client-side\n if (typeof window.__VINEXT_RSC_NAVIGATE__ === \"function\") {\n // App Router: RSC navigation. Await so scroll happens after new content renders.\n if (replace) {\n window.history.replaceState(null, \"\", url);\n } else {\n window.history.pushState(null, \"\", url);\n }\n await window.__VINEXT_RSC_NAVIGATE__(url);\n } else {\n // Pages Router: use router or fallback\n if (replace) {\n window.history.replaceState({}, \"\", url);\n } else {\n window.history.pushState({}, \"\", url);\n }\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n\n if (scroll) {\n window.scrollTo(0, 0);\n }\n }\n\n return <form ref={ref} action={action} onSubmit={handleSubmit} {...rest} />;\n});\n\nexport default Form;\n"]}
|
package/dist/shims/headers.d.ts
CHANGED
|
@@ -10,7 +10,12 @@
|
|
|
10
10
|
interface HeadersContext {
|
|
11
11
|
headers: Headers;
|
|
12
12
|
cookies: Map<string, string>;
|
|
13
|
+
accessError?: Error;
|
|
14
|
+
mutableCookies?: RequestCookies;
|
|
15
|
+
readonlyCookies?: RequestCookies;
|
|
16
|
+
readonlyHeaders?: Headers;
|
|
13
17
|
}
|
|
18
|
+
export type HeadersAccessPhase = "render" | "action" | "route-handler";
|
|
14
19
|
/**
|
|
15
20
|
* Dynamic usage flag — set when a component calls connection(), cookies(),
|
|
16
21
|
* headers(), or noStore() during rendering. When true, ISR caching is
|
|
@@ -34,6 +39,7 @@ export declare function throwIfInsideCacheScope(apiName: string): void;
|
|
|
34
39
|
* Called by the server after rendering to decide on caching.
|
|
35
40
|
*/
|
|
36
41
|
export declare function consumeDynamicUsage(): boolean;
|
|
42
|
+
export declare function setHeadersAccessPhase(phase: HeadersAccessPhase): HeadersAccessPhase;
|
|
37
43
|
/**
|
|
38
44
|
* Set the headers/cookies context for the current RSC render.
|
|
39
45
|
* Called by the framework's RSC entry before rendering each request.
|
|
@@ -98,12 +104,12 @@ export declare function headersContextFromRequest(request: Request): HeadersCont
|
|
|
98
104
|
* Returns a Promise in Next.js 15+ style (but resolves synchronously since
|
|
99
105
|
* the context is already available).
|
|
100
106
|
*/
|
|
101
|
-
export declare function headers(): Promise<Headers
|
|
107
|
+
export declare function headers(): Promise<Headers> & Headers;
|
|
102
108
|
/**
|
|
103
109
|
* Cookie jar from the incoming request.
|
|
104
110
|
* Returns a ReadonlyRequestCookies-like object.
|
|
105
111
|
*/
|
|
106
|
-
export declare function cookies(): Promise<RequestCookies
|
|
112
|
+
export declare function cookies(): Promise<RequestCookies> & RequestCookies;
|
|
107
113
|
/** Accumulated Set-Cookie headers from cookies().set() / .delete() calls */
|
|
108
114
|
/**
|
|
109
115
|
* Get and clear all pending Set-Cookie headers generated by cookies().set()/delete().
|
|
@@ -135,7 +141,9 @@ declare class RequestCookies {
|
|
|
135
141
|
name: string;
|
|
136
142
|
value: string;
|
|
137
143
|
} | undefined;
|
|
138
|
-
getAll(
|
|
144
|
+
getAll(nameOrOptions?: string | {
|
|
145
|
+
name: string;
|
|
146
|
+
}): Array<{
|
|
139
147
|
name: string;
|
|
140
148
|
value: string;
|
|
141
149
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/shims/headers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/shims/headers.ts"],"names":[],"mappings":"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"}
|
package/dist/shims/headers.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
11
11
|
import { buildRequestHeadersFromMiddlewareResponse } from "../server/middleware-request-headers.js";
|
|
12
|
+
import { parseCookieHeader } from "./internal/parse-cookie-header.js";
|
|
12
13
|
// NOTE:
|
|
13
14
|
// - This shim can be loaded under multiple module specifiers in Vite's
|
|
14
15
|
// multi-environment setup (RSC/SSR). Store the AsyncLocalStorage on
|
|
@@ -26,6 +27,7 @@ const _fallbackState = (_g[_FALLBACK_KEY] ??= {
|
|
|
26
27
|
dynamicUsageDetected: false,
|
|
27
28
|
pendingSetCookies: [],
|
|
28
29
|
draftModeCookieHeader: null,
|
|
30
|
+
phase: "render",
|
|
29
31
|
});
|
|
30
32
|
function _getState() {
|
|
31
33
|
const state = _als.getStore();
|
|
@@ -92,6 +94,18 @@ export function consumeDynamicUsage() {
|
|
|
92
94
|
state.dynamicUsageDetected = false;
|
|
93
95
|
return used;
|
|
94
96
|
}
|
|
97
|
+
function _setStatePhase(state, phase) {
|
|
98
|
+
const previous = state.phase;
|
|
99
|
+
state.phase = phase;
|
|
100
|
+
return previous;
|
|
101
|
+
}
|
|
102
|
+
function _areCookiesMutableInCurrentPhase() {
|
|
103
|
+
const phase = _getState().phase;
|
|
104
|
+
return phase === "action" || phase === "route-handler";
|
|
105
|
+
}
|
|
106
|
+
export function setHeadersAccessPhase(phase) {
|
|
107
|
+
return _setStatePhase(_getState(), phase);
|
|
108
|
+
}
|
|
95
109
|
/**
|
|
96
110
|
* Set the headers/cookies context for the current RSC render.
|
|
97
111
|
* Called by the framework's RSC entry before rendering each request.
|
|
@@ -120,12 +134,14 @@ export function setHeadersContext(ctx) {
|
|
|
120
134
|
existing.dynamicUsageDetected = false;
|
|
121
135
|
existing.pendingSetCookies = [];
|
|
122
136
|
existing.draftModeCookieHeader = null;
|
|
137
|
+
existing.phase = "render";
|
|
123
138
|
}
|
|
124
139
|
else {
|
|
125
140
|
_fallbackState.headersContext = ctx;
|
|
126
141
|
_fallbackState.dynamicUsageDetected = false;
|
|
127
142
|
_fallbackState.pendingSetCookies = [];
|
|
128
143
|
_fallbackState.draftModeCookieHeader = null;
|
|
144
|
+
_fallbackState.phase = "render";
|
|
129
145
|
}
|
|
130
146
|
return;
|
|
131
147
|
}
|
|
@@ -134,9 +150,11 @@ export function setHeadersContext(ctx) {
|
|
|
134
150
|
const state = _als.getStore();
|
|
135
151
|
if (state) {
|
|
136
152
|
state.headersContext = null;
|
|
153
|
+
state.phase = "render";
|
|
137
154
|
}
|
|
138
155
|
else {
|
|
139
156
|
_fallbackState.headersContext = null;
|
|
157
|
+
_fallbackState.phase = "render";
|
|
140
158
|
}
|
|
141
159
|
}
|
|
142
160
|
/**
|
|
@@ -155,6 +173,7 @@ export function runWithHeadersContext(ctx, fn) {
|
|
|
155
173
|
dynamicUsageDetected: false,
|
|
156
174
|
pendingSetCookies: [],
|
|
157
175
|
draftModeCookieHeader: null,
|
|
176
|
+
phase: "render",
|
|
158
177
|
};
|
|
159
178
|
return _als.run(state, fn);
|
|
160
179
|
}
|
|
@@ -183,16 +202,126 @@ export function applyMiddlewareRequestHeaders(middlewareResponseHeaders) {
|
|
|
183
202
|
// If middleware modified the cookie header, rebuild the cookies map.
|
|
184
203
|
ctx.cookies.clear();
|
|
185
204
|
if (nextCookieHeader !== null) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
ctx.cookies.set(k.trim(), rest.join("=").trim());
|
|
190
|
-
}
|
|
205
|
+
const nextCookies = parseCookieHeader(nextCookieHeader);
|
|
206
|
+
for (const [name, value] of nextCookies) {
|
|
207
|
+
ctx.cookies.set(name, value);
|
|
191
208
|
}
|
|
192
209
|
}
|
|
193
210
|
}
|
|
194
211
|
/** Methods on `Headers` that mutate state. Hoisted to module scope — static. */
|
|
195
212
|
const _HEADERS_MUTATING_METHODS = new Set(["set", "delete", "append"]);
|
|
213
|
+
class ReadonlyHeadersError extends Error {
|
|
214
|
+
constructor() {
|
|
215
|
+
super("Headers cannot be modified. Read more: https://nextjs.org/docs/app/api-reference/functions/headers");
|
|
216
|
+
}
|
|
217
|
+
static callable() {
|
|
218
|
+
throw new ReadonlyHeadersError();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
class ReadonlyRequestCookiesError extends Error {
|
|
222
|
+
constructor() {
|
|
223
|
+
super("Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options");
|
|
224
|
+
}
|
|
225
|
+
static callable() {
|
|
226
|
+
throw new ReadonlyRequestCookiesError();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function _decorateRequestApiPromise(promise, target) {
|
|
230
|
+
return new Proxy(promise, {
|
|
231
|
+
get(promiseTarget, prop) {
|
|
232
|
+
if (prop in promiseTarget) {
|
|
233
|
+
const value = Reflect.get(promiseTarget, prop, promiseTarget);
|
|
234
|
+
return typeof value === "function" ? value.bind(promiseTarget) : value;
|
|
235
|
+
}
|
|
236
|
+
const value = Reflect.get(target, prop, target);
|
|
237
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
238
|
+
},
|
|
239
|
+
has(promiseTarget, prop) {
|
|
240
|
+
return prop in promiseTarget || prop in target;
|
|
241
|
+
},
|
|
242
|
+
ownKeys(promiseTarget) {
|
|
243
|
+
return Array.from(new Set([...Reflect.ownKeys(promiseTarget), ...Reflect.ownKeys(target)]));
|
|
244
|
+
},
|
|
245
|
+
getOwnPropertyDescriptor(promiseTarget, prop) {
|
|
246
|
+
return (Reflect.getOwnPropertyDescriptor(promiseTarget, prop) ??
|
|
247
|
+
Reflect.getOwnPropertyDescriptor(target, prop));
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
function _decorateRejectedRequestApiPromise(error) {
|
|
252
|
+
const normalizedError = error instanceof Error ? error : new Error(String(error));
|
|
253
|
+
const promise = Promise.reject(normalizedError);
|
|
254
|
+
// Mark the rejection as handled so legacy sync access does not trigger
|
|
255
|
+
// spurious unhandled rejection noise before callers await/catch it.
|
|
256
|
+
promise.catch(() => { });
|
|
257
|
+
const throwingTarget = new Proxy({}, {
|
|
258
|
+
get(_target, prop) {
|
|
259
|
+
if (prop === "then" || prop === "catch" || prop === "finally") {
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
throw normalizedError;
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
return _decorateRequestApiPromise(promise, throwingTarget);
|
|
266
|
+
}
|
|
267
|
+
function _sealHeaders(headers) {
|
|
268
|
+
return new Proxy(headers, {
|
|
269
|
+
get(target, prop) {
|
|
270
|
+
if (typeof prop === "string" && _HEADERS_MUTATING_METHODS.has(prop)) {
|
|
271
|
+
throw new ReadonlyHeadersError();
|
|
272
|
+
}
|
|
273
|
+
const value = Reflect.get(target, prop, target);
|
|
274
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
function _wrapMutableCookies(cookies) {
|
|
279
|
+
return new Proxy(cookies, {
|
|
280
|
+
get(target, prop) {
|
|
281
|
+
if (prop === "set" || prop === "delete") {
|
|
282
|
+
return (...args) => {
|
|
283
|
+
if (!_areCookiesMutableInCurrentPhase()) {
|
|
284
|
+
throw new ReadonlyRequestCookiesError();
|
|
285
|
+
}
|
|
286
|
+
return Reflect.get(target, prop, target).apply(target, args);
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const value = Reflect.get(target, prop, target);
|
|
290
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
function _sealCookies(cookies) {
|
|
295
|
+
return new Proxy(cookies, {
|
|
296
|
+
get(target, prop) {
|
|
297
|
+
if (prop === "set" || prop === "delete") {
|
|
298
|
+
throw new ReadonlyRequestCookiesError();
|
|
299
|
+
}
|
|
300
|
+
const value = Reflect.get(target, prop, target);
|
|
301
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
function _getMutableCookies(ctx) {
|
|
306
|
+
if (!ctx.mutableCookies) {
|
|
307
|
+
ctx.mutableCookies = _wrapMutableCookies(new RequestCookies(ctx.cookies));
|
|
308
|
+
}
|
|
309
|
+
return ctx.mutableCookies;
|
|
310
|
+
}
|
|
311
|
+
function _getReadonlyCookies(ctx) {
|
|
312
|
+
if (!ctx.readonlyCookies) {
|
|
313
|
+
// Keep a separate readonly wrapper so render-path reads avoid the
|
|
314
|
+
// mutable phase-checking proxy while still reflecting the shared cookie map.
|
|
315
|
+
ctx.readonlyCookies = _sealCookies(new RequestCookies(ctx.cookies));
|
|
316
|
+
}
|
|
317
|
+
return ctx.readonlyCookies;
|
|
318
|
+
}
|
|
319
|
+
function _getReadonlyHeaders(ctx) {
|
|
320
|
+
if (!ctx.readonlyHeaders) {
|
|
321
|
+
ctx.readonlyHeaders = _sealHeaders(ctx.headers);
|
|
322
|
+
}
|
|
323
|
+
return ctx.readonlyHeaders;
|
|
324
|
+
}
|
|
196
325
|
/**
|
|
197
326
|
* Create a HeadersContext from a standard Request object.
|
|
198
327
|
*
|
|
@@ -221,14 +350,11 @@ export function headersContextFromRequest(request) {
|
|
|
221
350
|
// `_mutable` holds the materialised copy once a write is needed.
|
|
222
351
|
let _mutable = null;
|
|
223
352
|
const headersProxy = new Proxy(request.headers, {
|
|
224
|
-
get(target, prop
|
|
353
|
+
get(target, prop) {
|
|
225
354
|
// Route to the materialised copy if it exists.
|
|
226
355
|
const src = _mutable ?? target;
|
|
227
|
-
if (typeof prop !== "string") {
|
|
228
|
-
return Reflect.get(src, prop, receiver);
|
|
229
|
-
}
|
|
230
356
|
// Intercept mutating methods: materialise on first write.
|
|
231
|
-
if (_HEADERS_MUTATING_METHODS.has(prop)) {
|
|
357
|
+
if (typeof prop === "string" && _HEADERS_MUTATING_METHODS.has(prop)) {
|
|
232
358
|
return (...args) => {
|
|
233
359
|
if (!_mutable) {
|
|
234
360
|
_mutable = new Headers(target);
|
|
@@ -250,15 +376,9 @@ export function headersContextFromRequest(request) {
|
|
|
250
376
|
function getCookies() {
|
|
251
377
|
if (_cookies)
|
|
252
378
|
return _cookies;
|
|
253
|
-
_cookies = new Map();
|
|
254
379
|
// Read from the proxy so middleware-modified cookie headers are respected.
|
|
255
380
|
const cookieHeader = headersProxy.get("cookie") || "";
|
|
256
|
-
|
|
257
|
-
const [key, ...rest] = part.split("=");
|
|
258
|
-
if (key) {
|
|
259
|
-
_cookies.set(key.trim(), rest.join("=").trim());
|
|
260
|
-
}
|
|
261
|
-
}
|
|
381
|
+
_cookies = parseCookieHeader(cookieHeader);
|
|
262
382
|
return _cookies;
|
|
263
383
|
}
|
|
264
384
|
// Expose cookies as a lazy getter that memoises on first access.
|
|
@@ -278,28 +398,48 @@ export function headersContextFromRequest(request) {
|
|
|
278
398
|
* Returns a Promise in Next.js 15+ style (but resolves synchronously since
|
|
279
399
|
* the context is already available).
|
|
280
400
|
*/
|
|
281
|
-
export
|
|
282
|
-
|
|
401
|
+
export function headers() {
|
|
402
|
+
try {
|
|
403
|
+
throwIfInsideCacheScope("headers()");
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
return _decorateRejectedRequestApiPromise(error);
|
|
407
|
+
}
|
|
283
408
|
const state = _getState();
|
|
284
409
|
if (!state.headersContext) {
|
|
285
|
-
|
|
286
|
-
"or Server Action. Make sure you're not calling it from a Client Component.");
|
|
410
|
+
return _decorateRejectedRequestApiPromise(new Error("headers() can only be called from a Server Component, Route Handler, " +
|
|
411
|
+
"or Server Action. Make sure you're not calling it from a Client Component."));
|
|
412
|
+
}
|
|
413
|
+
if (state.headersContext.accessError) {
|
|
414
|
+
return _decorateRejectedRequestApiPromise(state.headersContext.accessError);
|
|
287
415
|
}
|
|
288
416
|
markDynamicUsage();
|
|
289
|
-
|
|
417
|
+
const readonlyHeaders = _getReadonlyHeaders(state.headersContext);
|
|
418
|
+
return _decorateRequestApiPromise(Promise.resolve(readonlyHeaders), readonlyHeaders);
|
|
290
419
|
}
|
|
291
420
|
/**
|
|
292
421
|
* Cookie jar from the incoming request.
|
|
293
422
|
* Returns a ReadonlyRequestCookies-like object.
|
|
294
423
|
*/
|
|
295
|
-
export
|
|
296
|
-
|
|
424
|
+
export function cookies() {
|
|
425
|
+
try {
|
|
426
|
+
throwIfInsideCacheScope("cookies()");
|
|
427
|
+
}
|
|
428
|
+
catch (error) {
|
|
429
|
+
return _decorateRejectedRequestApiPromise(error);
|
|
430
|
+
}
|
|
297
431
|
const state = _getState();
|
|
298
432
|
if (!state.headersContext) {
|
|
299
|
-
|
|
433
|
+
return _decorateRejectedRequestApiPromise(new Error("cookies() can only be called from a Server Component, Route Handler, or Server Action."));
|
|
434
|
+
}
|
|
435
|
+
if (state.headersContext.accessError) {
|
|
436
|
+
return _decorateRejectedRequestApiPromise(state.headersContext.accessError);
|
|
300
437
|
}
|
|
301
438
|
markDynamicUsage();
|
|
302
|
-
|
|
439
|
+
const cookieStore = _areCookiesMutableInCurrentPhase()
|
|
440
|
+
? _getMutableCookies(state.headersContext)
|
|
441
|
+
: _getReadonlyCookies(state.headersContext);
|
|
442
|
+
return _decorateRequestApiPromise(Promise.resolve(cookieStore), cookieStore);
|
|
303
443
|
}
|
|
304
444
|
// ---------------------------------------------------------------------------
|
|
305
445
|
// Writable cookie accumulator for Route Handlers / Server Actions
|
|
@@ -350,8 +490,11 @@ export function getDraftModeCookieHeader() {
|
|
|
350
490
|
*/
|
|
351
491
|
export async function draftMode() {
|
|
352
492
|
throwIfInsideCacheScope("draftMode()");
|
|
353
|
-
markDynamicUsage();
|
|
354
493
|
const state = _getState();
|
|
494
|
+
if (state.headersContext?.accessError) {
|
|
495
|
+
throw state.headersContext.accessError;
|
|
496
|
+
}
|
|
497
|
+
markDynamicUsage();
|
|
355
498
|
const secret = getDraftSecret();
|
|
356
499
|
const isEnabled = state.headersContext
|
|
357
500
|
? state.headersContext.cookies.get(DRAFT_MODE_COOKIE) === secret
|
|
@@ -359,6 +502,9 @@ export async function draftMode() {
|
|
|
359
502
|
return {
|
|
360
503
|
isEnabled,
|
|
361
504
|
enable() {
|
|
505
|
+
if (state.headersContext?.accessError) {
|
|
506
|
+
throw state.headersContext.accessError;
|
|
507
|
+
}
|
|
362
508
|
if (state.headersContext) {
|
|
363
509
|
state.headersContext.cookies.set(DRAFT_MODE_COOKIE, secret);
|
|
364
510
|
}
|
|
@@ -366,6 +512,9 @@ export async function draftMode() {
|
|
|
366
512
|
state.draftModeCookieHeader = `${DRAFT_MODE_COOKIE}=${secret}; Path=/; HttpOnly; SameSite=Lax${secure}`;
|
|
367
513
|
},
|
|
368
514
|
disable() {
|
|
515
|
+
if (state.headersContext?.accessError) {
|
|
516
|
+
throw state.headersContext.accessError;
|
|
517
|
+
}
|
|
369
518
|
if (state.headersContext) {
|
|
370
519
|
state.headersContext.cookies.delete(DRAFT_MODE_COOKIE);
|
|
371
520
|
}
|
|
@@ -413,10 +562,13 @@ class RequestCookies {
|
|
|
413
562
|
return undefined;
|
|
414
563
|
return { name, value };
|
|
415
564
|
}
|
|
416
|
-
getAll() {
|
|
565
|
+
getAll(nameOrOptions) {
|
|
566
|
+
const name = typeof nameOrOptions === "string" ? nameOrOptions : nameOrOptions?.name;
|
|
417
567
|
const result = [];
|
|
418
|
-
for (const [
|
|
419
|
-
|
|
568
|
+
for (const [cookieName, value] of this._cookies) {
|
|
569
|
+
if (name === undefined || cookieName === name) {
|
|
570
|
+
result.push({ name: cookieName, value });
|
|
571
|
+
}
|
|
420
572
|
}
|
|
421
573
|
return result;
|
|
422
574
|
}
|