vinext 1.0.0-beta.1 → 1.0.0-beta.2

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.
Files changed (175) hide show
  1. package/README.md +4 -1
  2. package/dist/build/client-build-config.js +1 -0
  3. package/dist/build/report.d.ts +8 -1
  4. package/dist/build/report.js +12 -2
  5. package/dist/check.js +15 -2
  6. package/dist/cli.js +3 -2
  7. package/dist/config/config-matchers.d.ts +13 -37
  8. package/dist/config/config-matchers.js +31 -121
  9. package/dist/config/next-config.d.ts +3 -2
  10. package/dist/config/next-config.js +3 -1
  11. package/dist/config/request-context.d.ts +14 -0
  12. package/dist/config/request-context.js +26 -0
  13. package/dist/entries/app-rsc-entry.js +27 -9
  14. package/dist/entries/app-rsc-manifest.js +17 -0
  15. package/dist/entries/pages-server-entry.js +3 -2
  16. package/dist/index.js +82 -58
  17. package/dist/init.d.ts +6 -4
  18. package/dist/init.js +20 -22
  19. package/dist/plugins/og-assets.js +1 -1
  20. package/dist/routing/app-route-graph.d.ts +13 -5
  21. package/dist/routing/app-route-graph.js +59 -13
  22. package/dist/routing/app-router.js +12 -6
  23. package/dist/routing/file-matcher.d.ts +11 -22
  24. package/dist/routing/file-matcher.js +21 -33
  25. package/dist/routing/pages-router.js +23 -29
  26. package/dist/routing/route-matching.d.ts +14 -1
  27. package/dist/routing/route-matching.js +13 -1
  28. package/dist/routing/route-pattern.d.ts +2 -1
  29. package/dist/routing/route-pattern.js +7 -4
  30. package/dist/routing/route-trie.d.ts +5 -1
  31. package/dist/routing/route-trie.js +5 -2
  32. package/dist/server/app-browser-entry.js +7 -6
  33. package/dist/server/app-browser-history-controller.d.ts +1 -1
  34. package/dist/server/app-browser-history-controller.js +3 -3
  35. package/dist/server/app-browser-navigation-controller.js +1 -1
  36. package/dist/server/app-browser-state.js +1 -1
  37. package/dist/server/app-browser-visible-commit.js +1 -1
  38. package/dist/server/app-fallback-renderer.d.ts +3 -0
  39. package/dist/server/app-fallback-renderer.js +4 -2
  40. package/dist/server/app-middleware.js +2 -1
  41. package/dist/server/app-page-boundary-render.d.ts +12 -1
  42. package/dist/server/app-page-boundary-render.js +84 -2
  43. package/dist/server/app-page-cache-finalizer.d.ts +1 -1
  44. package/dist/server/app-page-cache.d.ts +1 -1
  45. package/dist/server/app-page-dispatch.d.ts +11 -2
  46. package/dist/server/app-page-dispatch.js +14 -17
  47. package/dist/server/app-page-element-builder.d.ts +7 -2
  48. package/dist/server/app-page-element-builder.js +112 -27
  49. package/dist/server/app-page-head.d.ts +54 -2
  50. package/dist/server/app-page-head.js +164 -78
  51. package/dist/server/app-page-http-access-fallback-metadata.d.ts +29 -0
  52. package/dist/server/app-page-http-access-fallback-metadata.js +106 -0
  53. package/dist/server/app-page-render.d.ts +2 -2
  54. package/dist/server/app-page-render.js +1 -1
  55. package/dist/server/app-page-request.d.ts +12 -0
  56. package/dist/server/app-page-request.js +133 -13
  57. package/dist/server/app-page-route-wiring.d.ts +9 -0
  58. package/dist/server/app-page-route-wiring.js +43 -3
  59. package/dist/server/app-post-middleware-context.d.ts +1 -1
  60. package/dist/server/app-post-middleware-context.js +1 -1
  61. package/dist/server/app-route-handler-dispatch.js +31 -17
  62. package/dist/server/app-route-handler-execution.d.ts +6 -1
  63. package/dist/server/app-route-handler-execution.js +42 -16
  64. package/dist/server/app-route-handler-policy.d.ts +2 -0
  65. package/dist/server/app-route-handler-policy.js +3 -3
  66. package/dist/server/app-route-module-loader.d.ts +3 -1
  67. package/dist/server/app-route-module-loader.js +1 -0
  68. package/dist/server/app-rsc-cache-busting.d.ts +1 -1
  69. package/dist/server/app-rsc-errors.d.ts +1 -1
  70. package/dist/server/app-rsc-errors.js +12 -2
  71. package/dist/server/app-rsc-handler.d.ts +10 -5
  72. package/dist/server/app-rsc-handler.js +52 -24
  73. package/dist/server/app-rsc-request-normalization.d.ts +3 -2
  74. package/dist/server/app-rsc-request-normalization.js +8 -2
  75. package/dist/server/app-rsc-response-finalizer.d.ts +2 -2
  76. package/dist/server/app-rsc-response-finalizer.js +5 -11
  77. package/dist/server/app-rsc-route-matching.d.ts +20 -0
  78. package/dist/server/app-rsc-route-matching.js +87 -11
  79. package/dist/server/app-segment-config.js +13 -3
  80. package/dist/server/app-server-action-execution.d.ts +3 -1
  81. package/dist/server/app-server-action-execution.js +9 -7
  82. package/dist/server/app-ssr-entry.js +2 -2
  83. package/dist/server/app-ssr-stream.d.ts +1 -7
  84. package/dist/server/app-ssr-stream.js +2 -10
  85. package/dist/server/config-headers.d.ts +24 -0
  86. package/dist/server/config-headers.js +52 -0
  87. package/dist/server/dev-initial-server-error.d.ts +1 -1
  88. package/dist/server/dev-server.js +29 -13
  89. package/dist/server/isr-cache.d.ts +1 -1
  90. package/dist/server/middleware-matcher-pattern.d.ts +22 -0
  91. package/dist/server/middleware-matcher-pattern.js +219 -0
  92. package/dist/server/middleware-matcher.d.ts +2 -7
  93. package/dist/server/middleware-matcher.js +13 -60
  94. package/dist/server/middleware-path-to-regexp.d.ts +14 -0
  95. package/dist/server/middleware-path-to-regexp.js +228 -0
  96. package/dist/server/middleware-runtime.js +4 -3
  97. package/dist/server/middleware.d.ts +1 -1
  98. package/dist/server/middleware.js +2 -1
  99. package/dist/server/pages-data-route.d.ts +11 -1
  100. package/dist/server/pages-data-route.js +16 -1
  101. package/dist/server/pages-get-initial-props.d.ts +15 -2
  102. package/dist/server/pages-get-initial-props.js +16 -6
  103. package/dist/server/pages-page-data.d.ts +3 -1
  104. package/dist/server/pages-page-data.js +16 -7
  105. package/dist/server/pages-page-handler.d.ts +4 -2
  106. package/dist/server/pages-page-handler.js +16 -17
  107. package/dist/server/pages-page-response.js +1 -1
  108. package/dist/server/pages-readiness.d.ts +3 -3
  109. package/dist/server/pages-request-pipeline.d.ts +1 -0
  110. package/dist/server/pages-request-pipeline.js +25 -11
  111. package/dist/server/pages-router-entry.js +6 -0
  112. package/dist/server/prerender-route-params.js +2 -2
  113. package/dist/server/prod-server.d.ts +1 -4
  114. package/dist/server/prod-server.js +36 -23
  115. package/dist/server/request-pipeline.d.ts +15 -29
  116. package/dist/server/request-pipeline.js +24 -59
  117. package/dist/server/rsc-stream-hints.js +122 -18
  118. package/dist/shims/app.d.ts +1 -1
  119. package/dist/shims/cache-request-state.d.ts +27 -1
  120. package/dist/shims/cache-request-state.js +60 -1
  121. package/dist/shims/cache-runtime.d.ts +12 -1
  122. package/dist/shims/cache-runtime.js +22 -7
  123. package/dist/shims/cache.d.ts +5 -5
  124. package/dist/shims/cache.js +26 -10
  125. package/dist/shims/document.d.ts +42 -83
  126. package/dist/shims/document.js +62 -53
  127. package/dist/shims/dynamic.d.ts +5 -25
  128. package/dist/shims/dynamic.js +29 -8
  129. package/dist/shims/error.d.ts +1 -1
  130. package/dist/shims/error.js +1 -1
  131. package/dist/shims/fetch-cache.js +12 -3
  132. package/dist/shims/font-google-base.d.ts +11 -4
  133. package/dist/shims/font-local.d.ts +10 -3
  134. package/dist/shims/head.d.ts +13 -2
  135. package/dist/shims/head.js +3 -3
  136. package/dist/shims/headers.d.ts +28 -31
  137. package/dist/shims/headers.js +109 -49
  138. package/dist/shims/image.d.ts +27 -37
  139. package/dist/shims/image.js +21 -14
  140. package/dist/shims/internal/cookie-serialize.d.ts +3 -1
  141. package/dist/shims/internal/cookie-serialize.js +3 -1
  142. package/dist/shims/internal/hybrid-client-route-owner.js +3 -1
  143. package/dist/shims/internal/utils.d.ts +3 -3
  144. package/dist/shims/legacy-image.d.ts +3 -37
  145. package/dist/shims/legacy-image.js +6 -16
  146. package/dist/shims/link.d.ts +15 -22
  147. package/dist/shims/link.js +20 -11
  148. package/dist/shims/navigation-context-state.d.ts +1 -1
  149. package/dist/shims/navigation.d.ts +7 -3
  150. package/dist/shims/navigation.js +24 -13
  151. package/dist/shims/navigation.react-server.js +1 -1
  152. package/dist/shims/next-shims-augmentations.d.ts +1 -0
  153. package/dist/shims/next-shims-public.d.ts +1 -0
  154. package/dist/shims/public-shim-map.json.js +103 -0
  155. package/dist/shims/readonly-url-search-params.d.ts +3 -3
  156. package/dist/shims/readonly-url-search-params.js +3 -3
  157. package/dist/shims/request-state-types.d.ts +1 -1
  158. package/dist/shims/router.d.ts +55 -21
  159. package/dist/shims/router.js +162 -37
  160. package/dist/shims/script.d.ts +6 -10
  161. package/dist/shims/script.js +6 -3
  162. package/dist/shims/server.d.ts +45 -22
  163. package/dist/shims/server.js +44 -5
  164. package/dist/shims/unified-request-context.d.ts +1 -1
  165. package/dist/shims/unified-request-context.js +2 -0
  166. package/dist/shims/url-safety.d.ts +1 -1
  167. package/dist/shims/url-safety.js +2 -2
  168. package/dist/typegen.d.ts +8 -2
  169. package/dist/typegen.js +76 -15
  170. package/dist/utils/domain-locale.d.ts +2 -2
  171. package/dist/utils/external-url.d.ts +5 -0
  172. package/dist/utils/external-url.js +7 -0
  173. package/dist/utils/regex-safety.d.ts +8 -0
  174. package/dist/utils/regex-safety.js +737 -0
  175. package/package.json +13 -2
@@ -1,28 +1,7 @@
1
- import { ComponentType } from "react";
1
+ import React, { ComponentType } from "react";
2
+ import { DynamicOptions, DynamicOptionsLoadingProps, LoadableComponent, LoadableFn, LoadableGeneratedOptions, LoadableOptions, Loader, LoaderComponent, LoaderMap } from "@vinext/types/next/upstream/dynamic";
2
3
 
3
4
  //#region src/shims/dynamic.d.ts
4
- type DynamicLoadingProps = {
5
- error?: Error | null;
6
- isLoading?: boolean;
7
- pastDelay?: boolean;
8
- retry?: () => void;
9
- timedOut?: boolean;
10
- };
11
- type ComponentModule<P> = {
12
- default: ComponentType<P>;
13
- };
14
- type LoaderComponent<P> = Promise<ComponentModule<P> | ComponentType<P>>;
15
- type LoaderFn<P> = () => LoaderComponent<P>;
16
- type DynamicOptions<P> = {
17
- loading?: ComponentType<DynamicLoadingProps>;
18
- loader?: Loader<P>;
19
- loadableGenerated?: {
20
- modules?: readonly string[];
21
- };
22
- modules?: readonly string[];
23
- ssr?: boolean;
24
- };
25
- type Loader<P> = LoaderFn<P> | LoaderComponent<P>;
26
5
  type DynamicInput<P> = DynamicOptions<P> | Loader<P>;
27
6
  /**
28
7
  * Wait for all pending dynamic() preloads to resolve, then clear the queue.
@@ -30,6 +9,7 @@ type DynamicInput<P> = DynamicOptions<P> | Loader<P>;
30
9
  * No-op for the App Router path which uses React.lazy + Suspense.
31
10
  */
32
11
  declare function flushPreloads(): Promise<void[]>;
33
- declare function dynamic<P extends object = object>(dynamicInput: DynamicInput<P>, options?: DynamicOptions<P>): ComponentType<P>;
12
+ declare function dynamic<P = {}>(dynamicInput: DynamicInput<P>, options?: DynamicOptions<P>): ComponentType<P>;
13
+ declare function noSSR<P = {}>(LoadableInitializer: LoadableFn<P>, loadableOptions: DynamicOptions<P>): React.ComponentType<P>;
34
14
  //#endregion
35
- export { dynamic as default, flushPreloads };
15
+ export { type DynamicOptions, type DynamicOptionsLoadingProps, type LoadableComponent, type LoadableFn, type LoadableGeneratedOptions, type LoadableOptions, type Loader, type LoaderComponent, type LoaderMap, dynamic as default, flushPreloads, noSSR };
@@ -68,6 +68,9 @@ function useRetryableLazyComponent(loader, initialLazyComponent) {
68
68
  retryKey
69
69
  };
70
70
  }
71
+ function createElementWithProps(Component, props) {
72
+ return React.createElement(Component, props);
73
+ }
71
74
  /**
72
75
  * Lightweight error boundary that renders the loading component with the error
73
76
  * when a dynamic() loader rejects. Without this, loader failures would propagate
@@ -122,9 +125,14 @@ function flushPreloads() {
122
125
  return Promise.all(pending);
123
126
  }
124
127
  function dynamic(dynamicInput, options) {
125
- const { loader: dynamicLoader, loadableGenerated, loading: LoadingComponent, modules, ssr = true } = normalizeDynamicOptions(dynamicInput, options);
128
+ const normalizedOptions = normalizeDynamicOptions(dynamicInput, options);
129
+ const { loader: dynamicLoader, loadableGenerated, loading: LoadingComponent, ssr = true } = normalizedOptions;
130
+ if (dynamicLoader && typeof dynamicLoader === "object" && !(dynamicLoader instanceof Promise)) throw new Error("next/dynamic loader maps are not supported by vinext");
126
131
  const loader = dynamicLoader ? normalizeLoader(dynamicLoader) : () => Promise.resolve(() => null);
127
- const preloadModuleIds = loadableGenerated?.modules ?? modules;
132
+ const generatedModules = loadableGenerated?.modules;
133
+ const optionModules = normalizedOptions.modules;
134
+ const configuredModules = generatedModules ?? optionModules;
135
+ const preloadModuleIds = typeof configuredModules === "function" ? Object.keys(configuredModules()) : configuredModules;
128
136
  if (!ssr) {
129
137
  if (isServer) {
130
138
  const SSRFalse = (_props) => LoadingComponent ? React.createElement(LoadingComponent, createDynamicLoadingProps()) : null;
@@ -138,7 +146,7 @@ function dynamic(dynamicInput, options) {
138
146
  React.useEffect(() => setMounted(true), []);
139
147
  if (!mounted) return LoadingComponent ? React.createElement(LoadingComponent, createDynamicLoadingProps({ retry })) : null;
140
148
  const fallback = LoadingComponent ? React.createElement(LoadingComponent, createDynamicLoadingProps({ retry })) : null;
141
- const lazyElement = React.createElement(LazyComponent, props);
149
+ const lazyElement = createElementWithProps(LazyComponent, props);
142
150
  let content = lazyElement;
143
151
  if (LoadingComponent) {
144
152
  const ErrorBoundary = getDynamicErrorBoundary();
@@ -157,8 +165,7 @@ function dynamic(dynamicInput, options) {
157
165
  if (typeof React.lazy !== "function") {
158
166
  const AsyncServerDynamic = async (props) => {
159
167
  const mod = await loader();
160
- const Component = "default" in mod ? mod.default : mod;
161
- return React.createElement(Component, props);
168
+ return createElementWithProps("default" in mod ? mod.default : mod, props);
162
169
  };
163
170
  AsyncServerDynamic.displayName = "DynamicAsyncServer";
164
171
  return AsyncServerDynamic;
@@ -166,7 +173,7 @@ function dynamic(dynamicInput, options) {
166
173
  const LazyServer = createLazyComponent(loader);
167
174
  const ServerDynamic = (props) => {
168
175
  const fallback = LoadingComponent ? React.createElement(LoadingComponent, createDynamicLoadingProps()) : null;
169
- const lazyElement = React.createElement(LazyServer, props);
176
+ const lazyElement = createElementWithProps(LazyServer, props);
170
177
  let content = lazyElement;
171
178
  if (LoadingComponent) {
172
179
  const ErrorBoundary = getDynamicErrorBoundary();
@@ -185,7 +192,7 @@ function dynamic(dynamicInput, options) {
185
192
  const ClientDynamic = (props) => {
186
193
  const { LazyComponent, retry, retryKey } = useRetryableLazyComponent(loader, InitialLazyComponent);
187
194
  const fallback = LoadingComponent ? React.createElement(LoadingComponent, createDynamicLoadingProps({ retry })) : null;
188
- const lazyElement = React.createElement(LazyComponent, props);
195
+ const lazyElement = createElementWithProps(LazyComponent, props);
189
196
  let content = lazyElement;
190
197
  if (LoadingComponent) {
191
198
  const ErrorBoundary = getDynamicErrorBoundary();
@@ -200,5 +207,19 @@ function dynamic(dynamicInput, options) {
200
207
  ClientDynamic.displayName = "DynamicClient";
201
208
  return ClientDynamic;
202
209
  }
210
+ function noSSR(LoadableInitializer, loadableOptions) {
211
+ delete loadableOptions.webpack;
212
+ delete loadableOptions.modules;
213
+ if (!isServer) return LoadableInitializer(loadableOptions);
214
+ const Loading = loadableOptions.loading;
215
+ const NoSSR = () => React.createElement(Loading, {
216
+ error: null,
217
+ isLoading: true,
218
+ pastDelay: false,
219
+ timedOut: false
220
+ });
221
+ NoSSR.displayName = "NoSSR";
222
+ return NoSSR;
223
+ }
203
224
  //#endregion
204
- export { dynamic as default, flushPreloads };
225
+ export { dynamic as default, flushPreloads, noSSR };
@@ -27,7 +27,7 @@ declare class ErrorComponent<P = {}> extends React.Component<P & ErrorProps> {
27
27
  render(): React.ReactElement;
28
28
  }
29
29
  type ErrorInfo = {
30
- error: unknown;
30
+ error: Error;
31
31
  reset: () => void;
32
32
  unstable_retry: () => void;
33
33
  };
@@ -119,7 +119,7 @@ var _CatchError = class extends React.Component {
119
119
  if (this.state.error) {
120
120
  const Fallback = this.props.fallback;
121
121
  const errorInfo = {
122
- error: this.state.error.thrownValue,
122
+ error: this.state.error.thrownValue instanceof Error ? this.state.error.thrownValue : new Error(String(this.state.error.thrownValue)),
123
123
  reset: this.reset,
124
124
  unstable_retry: this.unstable_retry
125
125
  };
@@ -3,7 +3,7 @@ import { getRequestContext, isInsideUnifiedScope, runWithUnifiedStateMutation }
3
3
  import { getRequestExecutionContext } from "./request-context.js";
4
4
  import { getDataCacheHandler } from "./cache-handler.js";
5
5
  import { markDynamicUsage } from "./headers.js";
6
- import { _setRequestScopedCacheLife } from "./cache-request-state.js";
6
+ import { _hasPendingRevalidatedTag, _setRequestScopedCacheLife } from "./cache-request-state.js";
7
7
  import { encodeCacheTags } from "../utils/encode-cache-tag.js";
8
8
  //#region src/shims/fetch-cache.ts
9
9
  /**
@@ -639,13 +639,22 @@ function createPatchedFetch() {
639
639
  throw err;
640
640
  }
641
641
  const handler = getDataCacheHandler();
642
+ let mustBypassPendingRevalidation = _hasPendingRevalidatedTag([...tags, ...softTags]);
642
643
  try {
643
- const cached = await handler.get(cacheKey, {
644
+ let cached = mustBypassPendingRevalidation ? null : await handler.get(cacheKey, {
644
645
  kind: "FETCH",
645
646
  tags,
646
647
  softTags,
647
648
  revalidate: revalidateSeconds
648
649
  });
650
+ if (cached?.value?.kind === "FETCH" && _hasPendingRevalidatedTag([
651
+ ...cached.value.tags ?? [],
652
+ ...tags,
653
+ ...softTags
654
+ ])) {
655
+ mustBypassPendingRevalidation = true;
656
+ cached = null;
657
+ }
649
658
  if (cached?.value && cached.value.kind === "FETCH" && cached.cacheState !== "stale") {
650
659
  await lowerFetchCacheRevalidateIfNeeded(handler, cacheKey, cached.value, tags, revalidateSeconds);
651
660
  const cachedData = cached.value.data;
@@ -679,7 +688,7 @@ function createPatchedFetch() {
679
688
  } catch (cacheErr) {
680
689
  console.error("[vinext] fetch cache read error:", cacheErr);
681
690
  }
682
- const response = await dedupeFetch(input, fetchInit);
691
+ const response = await (mustBypassPendingRevalidation ? originalFetch(input, fetchInit) : dedupeFetch(input, fetchInit));
683
692
  const cacheValue = await buildFetchCacheValue(response, tags, revalidateSeconds);
684
693
  if (cacheValue) handler.set(cacheKey, cacheValue, {
685
694
  fetchCache: true,
@@ -1,7 +1,8 @@
1
1
  import { FontStyle } from "./font-utils.js";
2
2
 
3
3
  //#region src/shims/font-google-base.d.ts
4
- type FontOptions = {
4
+ type CssVariable = `--${string}`;
5
+ type FontOptions<T extends CssVariable | undefined = CssVariable | undefined> = {
5
6
  weight?: string | string[];
6
7
  style?: string | string[];
7
8
  subsets?: string[];
@@ -9,7 +10,7 @@ type FontOptions = {
9
10
  preload?: boolean;
10
11
  fallback?: string[];
11
12
  adjustFontFallback?: boolean | string;
12
- variable?: string;
13
+ variable?: T;
13
14
  axes?: string[];
14
15
  };
15
16
  type FontResult = {
@@ -24,7 +25,7 @@ type InternalGoogleFontRuntimeOptions = {
24
25
  fontWeight?: number;
25
26
  fontStyle?: "normal" | "italic";
26
27
  };
27
- type FontLoaderOptions = FontOptions & {
28
+ type FontLoaderOptions<T extends CssVariable | undefined = CssVariable | undefined> = FontOptions<T> & {
28
29
  /**
29
30
  * Internal payload injected by the vinext:google-fonts transform after
30
31
  * metadata validation. Runtime must prefer these values over user options
@@ -76,7 +77,13 @@ declare function getSSRFontPreloads(): Array<{
76
77
  href: string;
77
78
  type: string;
78
79
  }>;
79
- type FontLoader = (options?: FontLoaderOptions) => FontResult;
80
+ type NextFont = Omit<FontResult, "variable"> & {
81
+ variable?: undefined;
82
+ };
83
+ type NextFontWithVariable = Omit<NextFont, "variable"> & {
84
+ variable: string;
85
+ };
86
+ type FontLoader = <T extends CssVariable | undefined = undefined>(options?: FontLoaderOptions<T>) => T extends undefined ? NextFont : NextFontWithVariable;
80
87
  declare function createFontLoader(family: string): FontLoader;
81
88
  declare const googleFonts: Record<string, FontLoader>;
82
89
  //#endregion
@@ -6,14 +6,15 @@ type LocalFontSrc = {
6
6
  weight?: string;
7
7
  style?: string;
8
8
  };
9
- type LocalFontOptions = {
9
+ type CssVariable = `--${string}`;
10
+ type LocalFontOptions<T extends CssVariable | undefined = CssVariable | undefined> = {
10
11
  src: string | LocalFontSrc | LocalFontSrc[];
11
12
  display?: string;
12
13
  weight?: string;
13
14
  style?: string;
14
15
  fallback?: string[];
15
16
  preload?: boolean;
16
- variable?: string;
17
+ variable?: T;
17
18
  adjustFontFallback?: boolean | string;
18
19
  declarations?: Array<{
19
20
  prop: string;
@@ -30,6 +31,12 @@ type FontResult = {
30
31
  style: FontStyle;
31
32
  variable?: string;
32
33
  };
34
+ type NextFont = Omit<FontResult, "variable"> & {
35
+ variable?: undefined;
36
+ };
37
+ type NextFontWithVariable = Omit<NextFont, "variable"> & {
38
+ variable: string;
39
+ };
33
40
  /**
34
41
  * Get collected SSR font styles (used by the renderer).
35
42
  * Note: We don't clear the arrays because fonts are loaded at module import
@@ -45,6 +52,6 @@ declare function getSSRFontPreloads(): Array<{
45
52
  href: string;
46
53
  type: string;
47
54
  }>;
48
- declare function localFont(options: LocalFontOptions): FontResult;
55
+ declare function localFont<T extends CssVariable | undefined = undefined>(options: LocalFontOptions<T>): T extends undefined ? NextFont : NextFontWithVariable;
49
56
  //#endregion
50
57
  export { localFont as default, getSSRFontPreloads, getSSRFontStyles };
@@ -28,6 +28,17 @@ declare function resetSSRHead(): void;
28
28
  * Pass an empty array (or simply don't call this) to skip the merge.
29
29
  */
30
30
  declare function setDocumentInitialHead(head: React.ReactNode[]): void;
31
+ /**
32
+ * Default head tags emitted alongside every Pages Router render — charset
33
+ * first, then viewport. Mirrors Next.js's `defaultHead()` in
34
+ * `packages/next/src/shared/lib/head.tsx`, which seeds the head array used
35
+ * by `HeadManagerContext` before any user `<Head>` reduces over it.
36
+ *
37
+ * The canonical Next.js order is `<meta charset>` then `<meta viewport>`
38
+ * then user tags, all with `data-next-head=""`. See assertion in
39
+ * `test/e2e/next-head/index.test.ts`.
40
+ */
41
+ declare function defaultHead(): React.ReactElement[];
31
42
  /** Get collected head HTML. Call after render. */
32
43
  declare function getSSRHeadHTML(): string;
33
44
  type HeadDOMElement = Pick<HTMLElement, "innerHTML" | "setAttribute" | "textContent">;
@@ -68,6 +79,6 @@ declare function _applyHeadPropsToElement(domEl: HeadDOMElement, props: Record<s
68
79
  declare function _syncClientHead(): void;
69
80
  declare function Head({
70
81
  children
71
- }: HeadProps): null;
82
+ }: HeadProps): React.ReactElement;
72
83
  //#endregion
73
- export { _applyHeadPropsToElement, _clientHeadChildren, _registerHeadStateAccessors, _syncClientHead, Head as default, escapeAttr, escapeInlineContent, getSSRHeadHTML, isSafeAttrName, reduceHeadChildren, resetSSRHead, setDocumentInitialHead };
84
+ export { _applyHeadPropsToElement, _clientHeadChildren, _registerHeadStateAccessors, _syncClientHead, Head as default, defaultHead, escapeAttr, escapeInlineContent, getSSRHeadHTML, isSafeAttrName, reduceHeadChildren, resetSSRHead, setDocumentInitialHead };
@@ -323,7 +323,7 @@ function Head({ children }) {
323
323
  if (headInstanceIdRef.current === null) headInstanceIdRef.current = Symbol("vinext-head");
324
324
  if (typeof window === "undefined") {
325
325
  _getSSRHeadChildren().push(children);
326
- return null;
326
+ return React.createElement(React.Fragment);
327
327
  }
328
328
  useEffect(() => {
329
329
  const instanceId = headInstanceIdRef.current;
@@ -334,7 +334,7 @@ function Head({ children }) {
334
334
  _syncClientHead();
335
335
  };
336
336
  }, [children]);
337
- return null;
337
+ return React.createElement(React.Fragment);
338
338
  }
339
339
  //#endregion
340
- export { _applyHeadPropsToElement, _clientHeadChildren, _registerHeadStateAccessors, _syncClientHead, Head as default, escapeAttr, escapeInlineContent, getSSRHeadHTML, isSafeAttrName, reduceHeadChildren, resetSSRHead, setDocumentInitialHead };
340
+ export { _applyHeadPropsToElement, _clientHeadChildren, _registerHeadStateAccessors, _syncClientHead, Head as default, defaultHead, escapeAttr, escapeInlineContent, getSSRHeadHTML, isSafeAttrName, reduceHeadChildren, resetSSRHead, setDocumentInitialHead };
@@ -1,4 +1,6 @@
1
1
  import { RenderRequestApiKind } from "../server/cache-proof.js";
2
+ import { ReadonlyRequestCookies } from "@vinext/types/next/upstream/dist/server/web/spec-extension/adapters/request-cookies";
3
+ import { ResponseCookie } from "@vinext/types/next/upstream/dist/compiled/@edge-runtime/cookies/index";
2
4
 
3
5
  //#region src/shims/headers.d.ts
4
6
  type HeadersContext = {
@@ -27,6 +29,8 @@ type VinextHeadersShimState = {
27
29
  phase: HeadersAccessPhase;
28
30
  };
29
31
  type ConnectionProbeState = {
32
+ active: boolean;
33
+ dynamicUsageTarget: VinextHeadersShimState;
30
34
  interrupted: boolean;
31
35
  interrupt: () => void;
32
36
  pending: Promise<never>;
@@ -47,6 +51,16 @@ type ConnectionProbeResult<T> = {
47
51
  * Called by connection(), cookies(), headers(), and noStore().
48
52
  */
49
53
  declare function markDynamicUsage(): void;
54
+ /**
55
+ * Measure dynamic usage in a child async scope without clearing the parent.
56
+ * Concurrent work that already belongs to the request (such as deferred
57
+ * metadata) keeps writing to the parent state and therefore remains visible
58
+ * to the final cache policy.
59
+ */
60
+ declare function runWithIsolatedDynamicUsage<T>(fn: () => T | Promise<T>): Promise<{
61
+ result: T;
62
+ dynamicDetected: boolean;
63
+ }>;
50
64
  declare function markRenderRequestApiUsage(kind: RenderRequestApiKind): void;
51
65
  declare function throwIfStaticGenerationAccessError(): void;
52
66
  declare function runWithConnectionProbe<T>(fn: () => T | Promise<T>): Promise<ConnectionProbeResult<T>>;
@@ -162,11 +176,8 @@ declare function headersContextFromRequest(request: Request, options?: HeadersCo
162
176
  * the context is already available).
163
177
  */
164
178
  declare function headers(): Promise<Headers> & Headers;
165
- /**
166
- * Cookie jar from the incoming request.
167
- * Returns a ReadonlyRequestCookies-like object.
168
- */
169
- declare function cookies(): Promise<RequestCookies> & RequestCookies;
179
+ type VinextReadonlyRequestCookies = Omit<ReadonlyRequestCookies, keyof RequestCookies> & RequestCookies;
180
+ declare function cookies(): Promise<VinextReadonlyRequestCookies> & VinextReadonlyRequestCookies;
170
181
  /** Accumulated Set-Cookie headers from cookies().set() / .delete() calls */
171
182
  /**
172
183
  * Get and clear all pending Set-Cookie headers generated by cookies().set()/delete().
@@ -179,6 +190,12 @@ declare function getAndClearPendingCookies(): string[];
179
190
  */
180
191
  declare function getDraftModeCookieHeader(): string | null;
181
192
  declare function isDraftModeRequest(request: Request, draftModeSecret: string): boolean;
193
+ /**
194
+ * Read draft mode from the live request context without recording request API
195
+ * usage. `null` means there is no active request context, which lets framework
196
+ * callers fall back to an explicitly supplied request when needed.
197
+ */
198
+ declare function getActiveDraftModeState(): boolean | null;
182
199
  /**
183
200
  * Read the active request's draft-mode state without recording request API usage.
184
201
  * Internal cache implementations use this to bypass persistent reads and writes,
@@ -223,39 +240,19 @@ declare class RequestCookies {
223
240
  * Set a cookie. In Route Handlers and Server Actions, this produces
224
241
  * a Set-Cookie header on the response.
225
242
  */
226
- set(nameOrOptions: string | {
227
- name: string;
228
- value: string;
229
- path?: string;
230
- domain?: string;
231
- maxAge?: number;
232
- expires?: Date;
233
- httpOnly?: boolean;
234
- secure?: boolean;
235
- sameSite?: "Strict" | "Lax" | "None";
236
- }, value?: string, options?: {
237
- path?: string;
238
- domain?: string;
239
- maxAge?: number;
240
- expires?: Date;
241
- httpOnly?: boolean;
242
- secure?: boolean;
243
- sameSite?: "Strict" | "Lax" | "None";
244
- }): this;
243
+ set(options: ResponseCookie): this;
244
+ set(key: string, value: string, cookie?: Partial<ResponseCookie>): this;
245
245
  /**
246
246
  * Delete a cookie by emitting an expired Set-Cookie header.
247
247
  */
248
- delete(nameOrOptions: string | {
249
- name: string;
250
- path?: string;
251
- domain?: string;
252
- }): this;
248
+ delete(name: string): this;
249
+ delete(options: Omit<ResponseCookie, "value" | "expires">): this;
253
250
  get size(): number;
254
- [Symbol.iterator](): IterableIterator<[string, {
251
+ [Symbol.iterator](): MapIterator<[string, {
255
252
  name: string;
256
253
  value: string;
257
254
  }]>;
258
255
  toString(): string;
259
256
  }
260
257
  //#endregion
261
- export { HeadersAccessPhase, HeadersContext, type RequestCookies, VinextHeadersShimState, applyMiddlewareRequestHeaders, consumeDynamicUsage, consumeInvalidDynamicUsageError, consumeRenderRequestApiUsage, cookies, draftMode, getAndClearPendingCookies, getDraftModeCookieHeader, getHeadersAccessPhase, getHeadersContext, headers, headersContextFromRequest, isDraftModeEnabled, isDraftModeRequest, markDynamicUsage, markRenderRequestApiUsage, peekDynamicUsage, peekRenderRequestApiUsage, runWithConnectionProbe, runWithHeadersContext, setHeadersAccessPhase, setHeadersContext, suspendConnectionProbe, throwIfInsideCacheScope, throwIfStaticGenerationAccessError };
258
+ export { HeadersAccessPhase, HeadersContext, type RequestCookies, VinextHeadersShimState, applyMiddlewareRequestHeaders, consumeDynamicUsage, consumeInvalidDynamicUsageError, consumeRenderRequestApiUsage, cookies, draftMode, getActiveDraftModeState, getAndClearPendingCookies, getDraftModeCookieHeader, getHeadersAccessPhase, getHeadersContext, headers, headersContextFromRequest, isDraftModeEnabled, isDraftModeRequest, markDynamicUsage, markRenderRequestApiUsage, peekDynamicUsage, peekRenderRequestApiUsage, runWithConnectionProbe, runWithHeadersContext, runWithIsolatedDynamicUsage, setHeadersAccessPhase, setHeadersContext, suspendConnectionProbe, throwIfInsideCacheScope, throwIfStaticGenerationAccessError };