vinext 1.0.0-beta.0 → 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 (305) hide show
  1. package/README.md +21 -2
  2. package/dist/build/assets-ignore.js +1 -1
  3. package/dist/build/clean-output.js +1 -1
  4. package/dist/build/client-build-config.js +7 -4
  5. package/dist/build/css-url-assets.js +3 -3
  6. package/dist/build/google-fonts/fallback-metrics.js +1 -1
  7. package/dist/build/google-fonts/font-metadata.js +1 -1
  8. package/dist/build/inject-pregenerated-paths.js +1 -1
  9. package/dist/build/inline-css.js +2 -5
  10. package/dist/build/module-dependency-cache.d.ts +4 -0
  11. package/dist/build/module-dependency-cache.js +13 -0
  12. package/dist/build/next-client-runtime-manifests.js +1 -1
  13. package/dist/build/pages-client-assets-module.js +1 -1
  14. package/dist/build/precompress.js +7 -7
  15. package/dist/build/prerender-paths.d.ts +2 -2
  16. package/dist/build/prerender-paths.js +10 -15
  17. package/dist/build/prerender-server-pool.js +2 -2
  18. package/dist/build/prerender.js +1 -1
  19. package/dist/build/preview-credentials.d.ts +11 -0
  20. package/dist/build/preview-credentials.js +19 -0
  21. package/dist/build/report.d.ts +8 -4
  22. package/dist/build/report.js +14 -6
  23. package/dist/build/run-prerender.d.ts +2 -11
  24. package/dist/build/run-prerender.js +2 -10
  25. package/dist/build/server-manifest.js +1 -1
  26. package/dist/build/ssr-manifest.d.ts +4 -0
  27. package/dist/build/ssr-manifest.js +10 -6
  28. package/dist/build/standalone.js +37 -37
  29. package/dist/cache/cache-adapters-virtual.d.ts +1 -17
  30. package/dist/cache/cache-adapters-virtual.js +20 -11
  31. package/dist/check.d.ts +0 -16
  32. package/dist/check.js +27 -36
  33. package/dist/cli.js +61 -55
  34. package/dist/client/instrumentation-client-inject.js +1 -1
  35. package/dist/client/pages-router-link-navigation.js +1 -1
  36. package/dist/config/config-matchers.d.ts +13 -37
  37. package/dist/config/config-matchers.js +33 -123
  38. package/dist/config/dotenv.js +1 -1
  39. package/dist/config/next-config.d.ts +7 -3
  40. package/dist/config/next-config.js +84 -15
  41. package/dist/config/prerender.d.ts +2 -2
  42. package/dist/config/prerender.js +7 -15
  43. package/dist/config/request-context.d.ts +14 -0
  44. package/dist/config/request-context.js +26 -0
  45. package/dist/config/server-external-packages.js +1 -1
  46. package/dist/config/tsconfig-paths.js +2 -2
  47. package/dist/{node_modules/.pnpm/am-i-vibing@0.5.0/node_modules → deps/.pnpm/am-i-vibing@0.5.0/deps}/am-i-vibing/dist/detector-1yx2Hoe0.js +2 -2
  48. package/dist/deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js +50 -0
  49. package/dist/entries/app-rsc-entry.js +39 -14
  50. package/dist/entries/app-rsc-manifest.js +21 -4
  51. package/dist/entries/pages-client-entry.js +6 -5
  52. package/dist/entries/pages-server-entry.js +18 -28
  53. package/dist/entries/runtime-entry-module.js +2 -2
  54. package/dist/index.js +314 -230
  55. package/dist/init-cloudflare.js +1 -1
  56. package/dist/init-platform.js +1 -1
  57. package/dist/init.d.ts +6 -4
  58. package/dist/init.js +25 -27
  59. package/dist/plugins/ast-utils.js +1 -1
  60. package/dist/plugins/dynamic-preload-metadata.js +7 -7
  61. package/dist/plugins/extensionless-dynamic-import.js +1 -1
  62. package/dist/plugins/fonts.js +3 -3
  63. package/dist/plugins/ignore-dynamic-requests.js +13 -8
  64. package/dist/plugins/import-meta-url.js +16 -17
  65. package/dist/plugins/middleware-export-validation.js +1 -1
  66. package/dist/plugins/middleware-server-only.js +2 -2
  67. package/dist/plugins/og-asset-ownership.js +7 -6
  68. package/dist/plugins/og-assets.js +5 -6
  69. package/dist/plugins/optimize-imports.js +12 -13
  70. package/dist/plugins/postcss.js +1 -1
  71. package/dist/plugins/remove-console.js +1 -1
  72. package/dist/plugins/require-context.js +1 -1
  73. package/dist/plugins/sass.js +2 -2
  74. package/dist/plugins/server-externals-manifest.js +1 -1
  75. package/dist/plugins/strip-server-exports.js +1 -1
  76. package/dist/plugins/styled-jsx.js +3 -2
  77. package/dist/plugins/typeof-window.js +1 -1
  78. package/dist/routing/app-route-graph.d.ts +16 -15
  79. package/dist/routing/app-route-graph.js +86 -88
  80. package/dist/routing/app-router.d.ts +0 -5
  81. package/dist/routing/app-router.js +12 -11
  82. package/dist/routing/file-matcher.d.ts +13 -28
  83. package/dist/routing/file-matcher.js +31 -44
  84. package/dist/routing/pages-router.js +26 -32
  85. package/dist/routing/route-matching.d.ts +14 -1
  86. package/dist/routing/route-matching.js +13 -1
  87. package/dist/routing/route-pattern.d.ts +2 -1
  88. package/dist/routing/route-pattern.js +7 -4
  89. package/dist/routing/route-trie.d.ts +5 -1
  90. package/dist/routing/route-trie.js +5 -2
  91. package/dist/server/api-handler.js +41 -33
  92. package/dist/server/app-browser-entry.js +18 -11
  93. package/dist/server/app-browser-history-controller.d.ts +1 -1
  94. package/dist/server/app-browser-history-controller.js +3 -3
  95. package/dist/server/app-browser-navigation-controller.js +4 -2
  96. package/dist/server/app-browser-server-action-client.js +1 -1
  97. package/dist/server/app-elements-wire.d.ts +2 -1
  98. package/dist/server/app-fallback-renderer.d.ts +11 -0
  99. package/dist/server/app-fallback-renderer.js +16 -2
  100. package/dist/server/app-middleware.js +2 -1
  101. package/dist/server/app-page-boundary-render.d.ts +26 -2
  102. package/dist/server/app-page-boundary-render.js +190 -55
  103. package/dist/server/app-page-cache-finalizer.d.ts +1 -1
  104. package/dist/server/app-page-cache.d.ts +1 -1
  105. package/dist/server/app-page-dispatch.d.ts +12 -2
  106. package/dist/server/app-page-dispatch.js +37 -51
  107. package/dist/server/app-page-element-builder.d.ts +8 -2
  108. package/dist/server/app-page-element-builder.js +112 -27
  109. package/dist/server/app-page-execution.d.ts +3 -1
  110. package/dist/server/app-page-execution.js +31 -39
  111. package/dist/server/app-page-head.d.ts +54 -2
  112. package/dist/server/app-page-head.js +164 -78
  113. package/dist/server/app-page-http-access-fallback-metadata.d.ts +29 -0
  114. package/dist/server/app-page-http-access-fallback-metadata.js +106 -0
  115. package/dist/server/app-page-render.d.ts +2 -2
  116. package/dist/server/app-page-render.js +1 -1
  117. package/dist/server/app-page-request.d.ts +12 -0
  118. package/dist/server/app-page-request.js +134 -14
  119. package/dist/server/app-page-route-wiring.d.ts +9 -0
  120. package/dist/server/app-page-route-wiring.js +44 -4
  121. package/dist/server/app-post-middleware-context.d.ts +1 -1
  122. package/dist/server/app-post-middleware-context.js +1 -1
  123. package/dist/server/app-route-handler-dispatch.js +31 -17
  124. package/dist/server/app-route-handler-execution.d.ts +6 -1
  125. package/dist/server/app-route-handler-execution.js +41 -15
  126. package/dist/server/app-route-handler-policy.d.ts +2 -0
  127. package/dist/server/app-route-handler-policy.js +3 -3
  128. package/dist/server/app-route-module-loader.d.ts +3 -1
  129. package/dist/server/app-route-module-loader.js +1 -0
  130. package/dist/server/app-route-tree-prefetch.js +1 -1
  131. package/dist/server/app-rsc-cache-busting.d.ts +1 -1
  132. package/dist/server/app-rsc-cache-busting.js +1 -1
  133. package/dist/server/app-rsc-errors.d.ts +1 -1
  134. package/dist/server/app-rsc-errors.js +12 -2
  135. package/dist/server/app-rsc-handler.d.ts +10 -5
  136. package/dist/server/app-rsc-handler.js +51 -23
  137. package/dist/server/app-rsc-redirect-flight.d.ts +66 -0
  138. package/dist/server/app-rsc-redirect-flight.js +71 -0
  139. package/dist/server/app-rsc-request-normalization.d.ts +3 -2
  140. package/dist/server/app-rsc-request-normalization.js +8 -2
  141. package/dist/server/app-rsc-response-finalizer.d.ts +2 -2
  142. package/dist/server/app-rsc-response-finalizer.js +5 -11
  143. package/dist/server/app-rsc-route-matching.d.ts +20 -0
  144. package/dist/server/app-rsc-route-matching.js +87 -11
  145. package/dist/server/app-segment-config.js +15 -5
  146. package/dist/server/app-server-action-execution.d.ts +3 -1
  147. package/dist/server/app-server-action-execution.js +8 -6
  148. package/dist/server/app-ssr-entry.js +4 -1
  149. package/dist/server/app-ssr-stream.d.ts +2 -7
  150. package/dist/server/app-ssr-stream.js +5 -10
  151. package/dist/server/cache-proof.js +1 -1
  152. package/dist/server/config-headers.d.ts +24 -0
  153. package/dist/server/config-headers.js +52 -0
  154. package/dist/server/default-global-error-module.d.ts +3 -1
  155. package/dist/server/default-not-found-module.d.ts +3 -1
  156. package/dist/server/dev-initial-server-error.d.ts +1 -1
  157. package/dist/server/dev-lockfile.js +2 -3
  158. package/dist/server/dev-route-files.js +1 -1
  159. package/dist/server/dev-server.js +281 -173
  160. package/dist/server/dev-stack-sourcemap.js +4 -3
  161. package/dist/server/headers.d.ts +3 -1
  162. package/dist/server/headers.js +3 -1
  163. package/dist/server/image-optimization.js +2 -2
  164. package/dist/server/implicit-tags.js +2 -1
  165. package/dist/server/instrumentation.js +2 -2
  166. package/dist/server/isr-cache.d.ts +1 -1
  167. package/dist/server/isr-cache.js +1 -1
  168. package/dist/server/metadata-routes.js +4 -4
  169. package/dist/server/middleware-matcher-pattern.d.ts +22 -0
  170. package/dist/server/middleware-matcher-pattern.js +219 -0
  171. package/dist/server/middleware-matcher.d.ts +2 -7
  172. package/dist/server/middleware-matcher.js +13 -60
  173. package/dist/server/middleware-path-to-regexp.d.ts +14 -0
  174. package/dist/server/middleware-path-to-regexp.js +228 -0
  175. package/dist/server/middleware-response-headers.js +1 -1
  176. package/dist/server/middleware-runtime.js +5 -4
  177. package/dist/server/middleware.d.ts +2 -1
  178. package/dist/server/middleware.js +3 -2
  179. package/dist/server/navigation-planner.d.ts +2 -0
  180. package/dist/server/navigation-planner.js +8 -2
  181. package/dist/server/next-error-digest.d.ts +9 -24
  182. package/dist/server/next-error-digest.js +23 -15
  183. package/dist/server/operation-token.js +1 -1
  184. package/dist/server/pages-body-parser-config.js +2 -1
  185. package/dist/server/pages-data-route.d.ts +11 -1
  186. package/dist/server/pages-data-route.js +16 -1
  187. package/dist/server/pages-dev-hydration.d.ts +14 -0
  188. package/dist/server/pages-dev-hydration.js +83 -0
  189. package/dist/server/pages-dev-module-url.js +2 -2
  190. package/dist/server/pages-get-initial-props.d.ts +15 -2
  191. package/dist/server/pages-get-initial-props.js +16 -6
  192. package/dist/server/pages-node-compat.d.ts +13 -6
  193. package/dist/server/pages-node-compat.js +44 -45
  194. package/dist/server/pages-page-data.d.ts +4 -2
  195. package/dist/server/pages-page-data.js +20 -10
  196. package/dist/server/pages-page-handler.d.ts +4 -2
  197. package/dist/server/pages-page-handler.js +74 -43
  198. package/dist/server/pages-page-response.d.ts +2 -2
  199. package/dist/server/pages-page-response.js +1 -1
  200. package/dist/server/pages-preview.d.ts +26 -0
  201. package/dist/server/pages-preview.js +165 -0
  202. package/dist/server/pages-readiness.d.ts +5 -4
  203. package/dist/server/pages-readiness.js +4 -2
  204. package/dist/server/pages-request-pipeline.d.ts +1 -0
  205. package/dist/server/pages-request-pipeline.js +25 -11
  206. package/dist/server/pages-router-entry.js +6 -0
  207. package/dist/server/prerender-route-params.js +2 -2
  208. package/dist/server/prod-server.d.ts +1 -4
  209. package/dist/server/prod-server.js +44 -30
  210. package/dist/server/request-pipeline.d.ts +15 -29
  211. package/dist/server/request-pipeline.js +25 -60
  212. package/dist/server/rsc-stream-hints.js +122 -18
  213. package/dist/server/seed-cache.js +1 -1
  214. package/dist/server/socket-error-backstop.js +1 -1
  215. package/dist/server/static-file-cache.js +7 -8
  216. package/dist/server/worker-utils.js +1 -1
  217. package/dist/shims/app.d.ts +1 -1
  218. package/dist/shims/cache-request-state.d.ts +27 -1
  219. package/dist/shims/cache-request-state.js +60 -1
  220. package/dist/shims/cache-runtime.d.ts +12 -1
  221. package/dist/shims/cache-runtime.js +22 -7
  222. package/dist/shims/cache.d.ts +5 -5
  223. package/dist/shims/cache.js +28 -11
  224. package/dist/shims/constants.js +1 -1
  225. package/dist/shims/document.d.ts +42 -83
  226. package/dist/shims/document.js +62 -53
  227. package/dist/shims/dynamic.d.ts +5 -25
  228. package/dist/shims/dynamic.js +29 -8
  229. package/dist/shims/error-boundary.d.ts +4 -4
  230. package/dist/shims/error.d.ts +22 -6
  231. package/dist/shims/error.js +53 -15
  232. package/dist/shims/fetch-cache.js +13 -4
  233. package/dist/shims/font-google-base.d.ts +11 -4
  234. package/dist/shims/font-local.d.ts +10 -3
  235. package/dist/shims/font-utils.js +1 -1
  236. package/dist/shims/form.d.ts +1 -1
  237. package/dist/shims/head.d.ts +13 -2
  238. package/dist/shims/head.js +6 -6
  239. package/dist/shims/headers.d.ts +28 -31
  240. package/dist/shims/headers.js +115 -53
  241. package/dist/shims/image.d.ts +27 -37
  242. package/dist/shims/image.js +21 -14
  243. package/dist/shims/internal/cookie-serialize.d.ts +3 -1
  244. package/dist/shims/internal/cookie-serialize.js +3 -1
  245. package/dist/shims/internal/hybrid-client-route-owner.js +3 -1
  246. package/dist/shims/internal/pages-data-fetch-dedup.js +5 -3
  247. package/dist/shims/internal/utils.d.ts +3 -3
  248. package/dist/shims/layout-segment-context.d.ts +1 -1
  249. package/dist/shims/legacy-image.d.ts +3 -37
  250. package/dist/shims/legacy-image.js +6 -16
  251. package/dist/shims/link.d.ts +16 -21
  252. package/dist/shims/link.js +25 -13
  253. package/dist/shims/navigation-context-state.d.ts +1 -1
  254. package/dist/shims/navigation-errors.d.ts +2 -1
  255. package/dist/shims/navigation-errors.js +9 -13
  256. package/dist/shims/navigation.d.ts +8 -4
  257. package/dist/shims/navigation.js +29 -18
  258. package/dist/shims/next-shims-augmentations.d.ts +1 -0
  259. package/dist/shims/next-shims-public.d.ts +1 -0
  260. package/dist/shims/public-shim-map.json.js +103 -0
  261. package/dist/shims/readonly-url-search-params.d.ts +3 -3
  262. package/dist/shims/readonly-url-search-params.js +3 -3
  263. package/dist/shims/request-state-types.d.ts +1 -1
  264. package/dist/shims/router-state.d.ts +1 -0
  265. package/dist/shims/router.d.ts +57 -22
  266. package/dist/shims/router.js +178 -46
  267. package/dist/shims/script.d.ts +6 -10
  268. package/dist/shims/script.js +7 -4
  269. package/dist/shims/server.d.ts +45 -22
  270. package/dist/shims/server.js +46 -7
  271. package/dist/shims/slot.d.ts +1 -1
  272. package/dist/shims/thenable-params.js +1 -1
  273. package/dist/shims/unified-request-context.d.ts +1 -1
  274. package/dist/shims/unified-request-context.js +2 -0
  275. package/dist/shims/url-safety.d.ts +1 -1
  276. package/dist/shims/url-safety.js +2 -2
  277. package/dist/typegen.d.ts +8 -2
  278. package/dist/typegen.js +84 -25
  279. package/dist/utils/client-build-manifest.js +2 -2
  280. package/dist/utils/client-entry-manifest.js +1 -1
  281. package/dist/utils/client-runtime-metadata.js +1 -1
  282. package/dist/utils/commonjs-loader.js +3 -3
  283. package/dist/utils/domain-locale.d.ts +2 -2
  284. package/dist/utils/external-url.d.ts +5 -0
  285. package/dist/utils/external-url.js +7 -0
  286. package/dist/utils/mdx-scan.js +1 -1
  287. package/dist/utils/path.d.ts +1 -13
  288. package/dist/utils/path.js +1 -15
  289. package/dist/utils/plugin-options.d.ts +4 -0
  290. package/dist/utils/plugin-options.js +8 -0
  291. package/dist/utils/project.d.ts +0 -6
  292. package/dist/utils/project.js +2 -8
  293. package/dist/utils/public-routes.js +2 -2
  294. package/dist/utils/react-version.js +1 -1
  295. package/dist/utils/redirect-digest.d.ts +9 -0
  296. package/dist/utils/redirect-digest.js +25 -0
  297. package/dist/utils/regex-safety.d.ts +8 -0
  298. package/dist/utils/regex-safety.js +737 -0
  299. package/dist/utils/vinext-root.js +1 -1
  300. package/dist/utils/vite-version.d.ts +5 -2
  301. package/dist/utils/vite-version.js +43 -17
  302. package/package.json +16 -4
  303. /package/dist/build/google-fonts/{fallback-metrics-data.js → fallback-metrics-data.json.js} +0 -0
  304. /package/dist/build/google-fonts/{font-data.js → font-data.json.js} +0 -0
  305. /package/dist/{node_modules/.pnpm/process-ancestry@0.1.0/node_modules → deps/.pnpm/process-ancestry@0.1.0/deps}/process-ancestry/dist/index.js +0 -0
@@ -114,6 +114,52 @@ function markDynamicUsage() {
114
114
  const state = _getState();
115
115
  if (state.headersContext?.forceStatic) return;
116
116
  state.dynamicUsageDetected = true;
117
+ forEachConnectionProbeTarget(state, (target) => {
118
+ target.dynamicUsageDetected = true;
119
+ });
120
+ }
121
+ function forEachConnectionProbeTarget(state, visit) {
122
+ let target = state.connectionProbe?.dynamicUsageTarget ?? null;
123
+ const seen = /* @__PURE__ */ new Set([state]);
124
+ while (target && !seen.has(target)) {
125
+ seen.add(target);
126
+ visit(target);
127
+ target = target.connectionProbe?.dynamicUsageTarget ?? null;
128
+ }
129
+ }
130
+ function propagateInvalidDynamicUsageError(state, error) {
131
+ forEachConnectionProbeTarget(state, (target) => {
132
+ if (target.invalidDynamicUsageError == null) target.invalidDynamicUsageError = error;
133
+ });
134
+ }
135
+ /**
136
+ * Measure dynamic usage in a child async scope without clearing the parent.
137
+ * Concurrent work that already belongs to the request (such as deferred
138
+ * metadata) keeps writing to the parent state and therefore remains visible
139
+ * to the final cache policy.
140
+ */
141
+ async function runWithIsolatedDynamicUsage(fn) {
142
+ const runInChildState = async (childState) => {
143
+ return {
144
+ result: await fn(),
145
+ dynamicDetected: childState.dynamicUsageDetected
146
+ };
147
+ };
148
+ if (isInsideUnifiedScope()) {
149
+ let childState = null;
150
+ return await runWithUnifiedStateMutation((context) => {
151
+ context.dynamicUsageDetected = false;
152
+ childState = context;
153
+ }, () => {
154
+ if (!childState) throw new Error("Dynamic usage scope was not initialized");
155
+ return runInChildState(childState);
156
+ });
157
+ }
158
+ const childState = {
159
+ ..._getState(),
160
+ dynamicUsageDetected: false
161
+ };
162
+ return await _als.run(childState, () => runInChildState(childState));
117
163
  }
118
164
  function markRenderRequestApiUsage(kind) {
119
165
  _getState().renderRequestApiUsage.add(kind);
@@ -123,13 +169,15 @@ function throwIfStaticGenerationAccessError() {
123
169
  if (accessError) throw accessError;
124
170
  }
125
171
  async function runWithConnectionProbe(fn) {
126
- const state = _getState();
127
- const previousProbe = state.connectionProbe;
172
+ const parentState = _getState();
173
+ const parentInvalidDynamicUsageError = parentState.invalidDynamicUsageError;
128
174
  let interruptProbe = () => {};
129
175
  const interrupted = new Promise((resolve) => {
130
176
  interruptProbe = () => resolve({ completed: false });
131
177
  });
132
178
  const probe = {
179
+ active: true,
180
+ dynamicUsageTarget: parentState,
133
181
  interrupted: false,
134
182
  interrupt() {
135
183
  if (probe.interrupted) return;
@@ -138,20 +186,39 @@ async function runWithConnectionProbe(fn) {
138
186
  },
139
187
  pending: new Promise(() => {})
140
188
  };
141
- state.connectionProbe = probe;
142
- try {
143
- const completed = Promise.resolve().then(fn).then((result) => ({
144
- completed: true,
145
- result
146
- }));
147
- return await Promise.race([completed, interrupted]);
148
- } finally {
149
- state.connectionProbe = previousProbe;
189
+ const runInChildState = async (childState) => {
190
+ try {
191
+ const completed = Promise.resolve().then(fn).then((result) => ({
192
+ completed: true,
193
+ result
194
+ }));
195
+ return await Promise.race([completed, interrupted]);
196
+ } finally {
197
+ probe.active = false;
198
+ childState.connectionProbe = parentState.connectionProbe ?? probe;
199
+ if (childState.dynamicUsageDetected) parentState.dynamicUsageDetected = true;
200
+ if (childState.invalidDynamicUsageError !== parentInvalidDynamicUsageError && parentState.invalidDynamicUsageError === parentInvalidDynamicUsageError) parentState.invalidDynamicUsageError = childState.invalidDynamicUsageError;
201
+ }
202
+ };
203
+ if (isInsideUnifiedScope()) {
204
+ let childState = null;
205
+ return await runWithUnifiedStateMutation((context) => {
206
+ context.connectionProbe = probe;
207
+ childState = context;
208
+ }, () => {
209
+ if (!childState) throw new Error("Connection probe scope was not initialized");
210
+ return runInChildState(childState);
211
+ });
150
212
  }
213
+ const childState = {
214
+ ...parentState,
215
+ connectionProbe: probe
216
+ };
217
+ return await _als.run(childState, () => runInChildState(childState));
151
218
  }
152
219
  function suspendConnectionProbe() {
153
220
  const probe = _getState().connectionProbe;
154
- if (!probe) return null;
221
+ if (!probe?.active) return null;
155
222
  probe.interrupt();
156
223
  return probe.pending;
157
224
  }
@@ -202,6 +269,7 @@ function throwIfInsideCacheScope(apiName) {
202
269
  if (cacheCtx) cacheCtx.invalidDynamicUsageError = error;
203
270
  const ctx = getRequestContext();
204
271
  if (ctx) ctx.invalidDynamicUsageError = error;
272
+ propagateInvalidDynamicUsageError(_getState(), error);
205
273
  } catch {}
206
274
  throw error;
207
275
  }
@@ -210,6 +278,7 @@ function throwIfInsideCacheScope(apiName) {
210
278
  try {
211
279
  const ctx = getRequestContext();
212
280
  if (ctx) ctx.invalidDynamicUsageError = error;
281
+ propagateInvalidDynamicUsageError(_getState(), error);
213
282
  } catch {}
214
283
  throw error;
215
284
  }
@@ -360,7 +429,7 @@ function applyMiddlewareRequestHeaders(middlewareResponseHeaders) {
360
429
  }
361
430
  }
362
431
  /** Methods on `Headers` that mutate state. Hoisted to module scope — static. */
363
- const _HEADERS_MUTATING_METHODS = new Set([
432
+ const _HEADERS_MUTATING_METHODS = /* @__PURE__ */ new Set([
364
433
  "set",
365
434
  "delete",
366
435
  "append"
@@ -395,7 +464,7 @@ function _decorateRequestApiPromise(promise, target) {
395
464
  return prop in promiseTarget || prop in target;
396
465
  },
397
466
  ownKeys(promiseTarget) {
398
- return Array.from(new Set([...Reflect.ownKeys(promiseTarget), ...Reflect.ownKeys(target)]));
467
+ return Array.from(/* @__PURE__ */ new Set([...Reflect.ownKeys(promiseTarget), ...Reflect.ownKeys(target)]));
399
468
  },
400
469
  getOwnPropertyDescriptor(promiseTarget, prop) {
401
470
  return Reflect.getOwnPropertyDescriptor(promiseTarget, prop) ?? Reflect.getOwnPropertyDescriptor(target, prop);
@@ -546,13 +615,14 @@ function headers() {
546
615
  markDynamicUsage();
547
616
  const fallbackShellPromise = createPprFallbackShellSuspensePromise("`headers()`");
548
617
  if (fallbackShellPromise) return _decorateSuspendingRequestApiPromise(fallbackShellPromise);
549
- return _getOrCreateDecoratedRequestApiPromise(_decoratedHeadersPromises, _getReadonlyHeaders(state.headersContext));
618
+ const readonlyHeaders = _getReadonlyHeaders(state.headersContext);
619
+ return _getOrCreateDecoratedRequestApiPromise(_decoratedHeadersPromises, readonlyHeaders);
550
620
  }
551
621
  /**
552
622
  * Cookie jar from the incoming request.
553
623
  * Returns a ReadonlyRequestCookies-like object.
554
624
  */
555
- function cookies() {
625
+ function cookiesImpl() {
556
626
  markRenderRequestApiUsage("cookies");
557
627
  try {
558
628
  throwIfInsideCacheScope("cookies()");
@@ -565,7 +635,11 @@ function cookies() {
565
635
  markDynamicUsage();
566
636
  const fallbackShellPromise = createPprFallbackShellSuspensePromise("`cookies()`");
567
637
  if (fallbackShellPromise) return _decorateSuspendingRequestApiPromise(fallbackShellPromise);
568
- return _getOrCreateDecoratedRequestApiPromise(_decoratedCookiesPromises, _areCookiesMutableInCurrentPhase() ? _getMutableCookies(state.headersContext) : _getReadonlyCookies(state.headersContext));
638
+ const cookieStore = _areCookiesMutableInCurrentPhase() ? _getMutableCookies(state.headersContext) : _getReadonlyCookies(state.headersContext);
639
+ return _getOrCreateDecoratedRequestApiPromise(_decoratedCookiesPromises, cookieStore);
640
+ }
641
+ function cookies() {
642
+ return cookiesImpl();
569
643
  }
570
644
  /** Accumulated Set-Cookie headers from cookies().set() / .delete() calls */
571
645
  /**
@@ -611,18 +685,26 @@ function isDraftModeRequest(request, draftModeSecret) {
611
685
  return parseEdgeRequestCookieHeader(cookieHeader).get(DRAFT_MODE_COOKIE) === validateDraftModeSecret(draftModeSecret);
612
686
  }
613
687
  /**
614
- * Read the active request's draft-mode state without recording request API usage.
615
- * Internal cache implementations use this to bypass persistent reads and writes,
616
- * matching Next.js's request-level `workStore.isDraftMode` guard.
688
+ * Read draft mode from the live request context without recording request API
689
+ * usage. `null` means there is no active request context, which lets framework
690
+ * callers fall back to an explicitly supplied request when needed.
617
691
  */
618
- function isDraftModeEnabled() {
692
+ function getActiveDraftModeState() {
619
693
  const context = _getState().headersContext;
620
- if (!context) return false;
694
+ if (!context) return null;
621
695
  if (context.draftModeEnabled !== void 0) return context.draftModeEnabled;
622
696
  const secret = context.draftModeSecret;
623
697
  if (secret === void 0) return false;
624
698
  return context.cookies.get(DRAFT_MODE_COOKIE) === validateDraftModeSecret(secret);
625
699
  }
700
+ /**
701
+ * Read the active request's draft-mode state without recording request API usage.
702
+ * Internal cache implementations use this to bypass persistent reads and writes,
703
+ * matching Next.js's request-level `workStore.isDraftMode` guard.
704
+ */
705
+ function isDraftModeEnabled() {
706
+ return getActiveDraftModeState() ?? false;
707
+ }
626
708
  function draftModeCookieAttributes() {
627
709
  if (typeof process !== "undefined" && process.env?.NODE_ENV === "development") return "Path=/; HttpOnly; SameSite=Lax";
628
710
  return "Path=/; HttpOnly; SameSite=None; Secure";
@@ -703,10 +785,6 @@ var RequestCookies = class {
703
785
  has(name) {
704
786
  return this._cookies.has(name);
705
787
  }
706
- /**
707
- * Set a cookie. In Route Handlers and Server Actions, this produces
708
- * a Set-Cookie header on the response.
709
- */
710
788
  set(nameOrOptions, value, options) {
711
789
  let cookieName;
712
790
  let cookieValue;
@@ -722,12 +800,14 @@ var RequestCookies = class {
722
800
  }
723
801
  validateCookieName(cookieName);
724
802
  this._cookies.set(cookieName, cookieValue);
725
- _getState().pendingSetCookies.push(serializeSetCookie(cookieName, cookieValue, opts));
803
+ const sameSite = opts?.sameSite === true ? "Strict" : typeof opts?.sameSite === "string" ? opts.sameSite[0].toUpperCase() + opts.sameSite.slice(1) : void 0;
804
+ _getState().pendingSetCookies.push(serializeSetCookie(cookieName, cookieValue, {
805
+ ...opts,
806
+ expires: typeof opts?.expires === "number" ? new Date(opts.expires) : opts?.expires,
807
+ sameSite
808
+ }));
726
809
  return this;
727
810
  }
728
- /**
729
- * Delete a cookie by emitting an expired Set-Cookie header.
730
- */
731
811
  delete(nameOrOptions) {
732
812
  const name = typeof nameOrOptions === "string" ? nameOrOptions : nameOrOptions.name;
733
813
  const path = typeof nameOrOptions === "string" ? "/" : nameOrOptions.path ?? "/";
@@ -746,28 +826,10 @@ var RequestCookies = class {
746
826
  return this._cookies.size;
747
827
  }
748
828
  [Symbol.iterator]() {
749
- const entries = this._cookies.entries();
750
- const iter = {
751
- [Symbol.iterator]() {
752
- return iter;
753
- },
754
- next() {
755
- const { value, done } = entries.next();
756
- if (done) return {
757
- value: void 0,
758
- done: true
759
- };
760
- const [name, val] = value;
761
- return {
762
- value: [name, {
763
- name,
764
- value: val
765
- }],
766
- done: false
767
- };
768
- }
769
- };
770
- return iter;
829
+ return new Map(Array.from(this._cookies, ([name, value]) => [name, {
830
+ name,
831
+ value
832
+ }])).entries();
771
833
  }
772
834
  toString() {
773
835
  const parts = [];
@@ -776,4 +838,4 @@ var RequestCookies = class {
776
838
  }
777
839
  };
778
840
  //#endregion
779
- export { 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 };
841
+ export { 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 };
@@ -1,40 +1,9 @@
1
1
  import React from "react";
2
+ import { ImageLoader, ImageProps as ImageProps$1, ImgProps, StaticImageData, StaticImport, StaticRequire } from "@vinext/types/next/upstream/dist/shared/lib/get-img-props";
2
3
 
3
4
  //#region src/shims/image.d.ts
4
- type StaticImageData = {
5
- src: string;
6
- height: number;
7
- width: number;
8
- blurDataURL?: string;
9
- };
10
- type ImageProps = {
11
- src: string | StaticImageData;
12
- alt: string;
13
- width?: number;
14
- height?: number;
15
- fill?: boolean;
16
- preload?: boolean;
17
- priority?: boolean;
18
- quality?: number;
19
- placeholder?: "blur" | "empty";
20
- blurDataURL?: string;
21
- loader?: (params: {
22
- src: string;
23
- width: number;
24
- quality?: number;
25
- }) => string;
26
- sizes?: string;
27
- className?: string;
28
- style?: React.CSSProperties;
29
- onLoad?: React.ReactEventHandler<HTMLImageElement>; /** @deprecated Use onLoad instead. Still supported for migration compat. */
30
- onLoadingComplete?: (img: HTMLImageElement) => void;
31
- onError?: React.ReactEventHandler<HTMLImageElement>;
32
- onClick?: React.MouseEventHandler<HTMLImageElement>;
33
- id?: string;
34
- unoptimized?: boolean;
35
- overrideSrc?: string;
36
- loading?: "lazy" | "eager";
37
- };
5
+ type ImageLoaderProps = Parameters<ImageLoader>[0];
6
+ type ImageProps = ImageProps$1;
38
7
  /**
39
8
  * Build a `/_next/image` optimization URL.
40
9
  *
@@ -43,13 +12,34 @@ type ImageProps = {
43
12
  * server handles it as a passthrough (serves the original file).
44
13
  */
45
14
  declare function imageOptimizationUrl(src: string, width: number, quality?: number): string;
46
- declare const Image: React.ForwardRefExoticComponent<ImageProps & React.RefAttributes<HTMLImageElement>>;
15
+ declare const Image: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "alt" | "height" | "loading" | "ref" | "src" | "srcSet" | "width"> & {
16
+ src: string | StaticImport;
17
+ alt: string;
18
+ width?: number | `${number}`;
19
+ height?: number | `${number}`;
20
+ fill?: boolean;
21
+ loader?: ImageLoader;
22
+ quality?: number | `${number}`;
23
+ preload?: boolean;
24
+ priority?: boolean;
25
+ loading?: "eager" | "lazy" | undefined;
26
+ placeholder?: import("@vinext/types/next/upstream/dist/shared/lib/get-img-props").PlaceholderValue;
27
+ blurDataURL?: string;
28
+ unoptimized?: boolean;
29
+ overrideSrc?: string;
30
+ onLoadingComplete?: import("@vinext/types/next/upstream/dist/shared/lib/get-img-props").OnLoadingComplete;
31
+ layout?: string;
32
+ objectFit?: string;
33
+ objectPosition?: string;
34
+ lazyBoundary?: string;
35
+ lazyRoot?: string;
36
+ } & React.RefAttributes<HTMLImageElement>>;
47
37
  /**
48
38
  * getImageProps — for advanced use cases (picture elements, background images).
49
39
  * Returns the props that would be passed to the underlying <img> element.
50
40
  */
51
41
  declare function getImageProps(props: ImageProps): {
52
- props: React.ImgHTMLAttributes<HTMLImageElement>;
42
+ props: ImgProps;
53
43
  };
54
44
  //#endregion
55
- export { StaticImageData, Image as default, getImageProps, imageOptimizationUrl };
45
+ export { type ImageLoader, ImageLoaderProps, ImageProps, type StaticImageData, type StaticRequire, Image as default, getImageProps, imageOptimizationUrl };
@@ -216,11 +216,15 @@ function getFillStyle(style, backgroundStyle) {
216
216
  * Shared by the Image component and getImageProps to keep behavior in sync.
217
217
  */
218
218
  function resolveImageSource(v) {
219
+ const staticData = typeof v.src === "object" && "default" in v.src ? v.src.default : v.src;
220
+ const src = typeof staticData === "string" ? staticData : staticData.src;
221
+ const sourceWidth = v.width ?? (typeof staticData === "object" ? staticData.width : void 0);
222
+ const sourceHeight = v.height ?? (typeof staticData === "object" ? staticData.height : void 0);
219
223
  return {
220
- src: typeof v.src === "string" ? v.src : v.src.src,
221
- width: v.width ?? (typeof v.src === "object" ? v.src.width : void 0),
222
- height: v.height ?? (typeof v.src === "object" ? v.src.height : void 0),
223
- blurDataURL: v.blurDataURL ?? (typeof v.src === "object" ? v.src.blurDataURL : void 0)
224
+ src,
225
+ width: typeof sourceWidth === "string" ? Number(sourceWidth) : sourceWidth,
226
+ height: typeof sourceHeight === "string" ? Number(sourceHeight) : sourceHeight,
227
+ blurDataURL: v.blurDataURL ?? (typeof staticData === "object" ? staticData.blurDataURL : void 0)
224
228
  };
225
229
  }
226
230
  /**
@@ -420,10 +424,11 @@ const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill
420
424
  });
421
425
  }
422
426
  if (loader) {
427
+ const resolvedQuality = typeof quality === "string" ? Number(quality) : quality ?? 75;
423
428
  const resolvedSrc = loader({
424
429
  src,
425
430
  width: imgWidth ?? 0,
426
- quality: quality ?? 75
431
+ quality: resolvedQuality
427
432
  });
428
433
  preloadImageResource({
429
434
  shouldPreload,
@@ -513,7 +518,7 @@ const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill
513
518
  });
514
519
  }
515
520
  }
516
- const imgQuality = quality ?? 75;
521
+ const imgQuality = typeof quality === "string" ? Number(quality) : quality ?? 75;
517
522
  const skipOptimization = isSvgUrl(src) && !__dangerouslyAllowSVG;
518
523
  const optimizedAttributes = imgWidth && !fill && !skipOptimization ? generateImageAttributes(src, imgWidth, imgQuality, sizes) : void 0;
519
524
  const srcSet = optimizedAttributes ? optimizedAttributes.srcSet : imgWidth && !fill ? RESPONSIVE_WIDTHS.filter((w) => w <= imgWidth * 2).map((w) => `${src} ${w}w`).join(", ") || `${src} ${imgWidth}w` : void 0;
@@ -577,7 +582,7 @@ function getImageProps(props) {
577
582
  backgroundRepeat: "no-repeat",
578
583
  backgroundPosition: "center"
579
584
  } : void 0;
580
- return { props: {
585
+ const imageProps = {
581
586
  src: renderedSrc,
582
587
  alt,
583
588
  width: fill ? void 0 : imgWidth,
@@ -586,13 +591,15 @@ function getImageProps(props) {
586
591
  fetchPriority: priority ? "high" : void 0,
587
592
  decoding: "async",
588
593
  className,
589
- "data-nimg": fill ? "fill" : "1",
590
594
  style: fill ? getFillStyle(style, blurStyle) : {
591
595
  ...blurStyle,
592
596
  ...style
593
597
  },
594
- ...rest
595
- } };
598
+ ...rest,
599
+ sizes: sizes ?? (fill ? "100vw" : void 0),
600
+ srcSet: void 0
601
+ };
602
+ return { props: Object.assign(imageProps, { "data-nimg": fill ? "fill" : "1" }) };
596
603
  }
597
604
  let blockedInProd = false;
598
605
  if (isRemoteUrl(src)) {
@@ -603,7 +610,7 @@ function getImageProps(props) {
603
610
  blockedInProd = true;
604
611
  }
605
612
  }
606
- const imgQuality = _quality ?? 75;
613
+ const imgQuality = typeof _quality === "string" ? Number(_quality) : _quality ?? 75;
607
614
  const resolvedSrc = blockedInProd ? "" : loader ? loader({
608
615
  src,
609
616
  width: imgWidth ?? 0,
@@ -620,7 +627,7 @@ function getImageProps(props) {
620
627
  backgroundRepeat: "no-repeat",
621
628
  backgroundPosition: "center"
622
629
  } : void 0;
623
- return { props: {
630
+ const imageProps = {
624
631
  src: optimizedSrc,
625
632
  alt,
626
633
  width: fill ? void 0 : imgWidth,
@@ -631,13 +638,13 @@ function getImageProps(props) {
631
638
  srcSet,
632
639
  sizes: sizes ?? (fill ? "100vw" : void 0),
633
640
  className,
634
- "data-nimg": fill ? "fill" : "1",
635
641
  style: fill ? getFillStyle(style, blurStyle) : {
636
642
  ...blurStyle,
637
643
  ...style
638
644
  },
639
645
  ...rest
640
- } };
646
+ };
647
+ return { props: Object.assign(imageProps, { "data-nimg": fill ? "fill" : "1" }) };
641
648
  }
642
649
  //#endregion
643
650
  export { Image as default, getImageProps, imageOptimizationUrl };
@@ -21,6 +21,8 @@ type SerializeSetCookieOptions = {
21
21
  httpOnly?: boolean;
22
22
  secure?: boolean;
23
23
  sameSite?: "Strict" | "Lax" | "None";
24
+ partitioned?: boolean;
25
+ priority?: "low" | "medium" | "high";
24
26
  };
25
27
  declare function validateCookieName(name: string): void;
26
28
  /**
@@ -35,7 +37,7 @@ declare function validateCookieAttributeValue(value: string, attributeName: stri
35
37
  * - Defaults `Path` to `/` (matching @edge-runtime/cookies and Next.js).
36
38
  * - Validates path/domain to reject control characters and semicolons.
37
39
  * - Emits attributes in the order: Path, Domain, Max-Age, Expires, HttpOnly,
38
- * Secure, SameSite.
40
+ * Secure, SameSite, Partitioned, Priority.
39
41
  *
40
42
  * The caller is responsible for validating the cookie name (typically before
41
43
  * mutating any internal state) via `validateCookieName`.
@@ -24,7 +24,7 @@ function validateCookieAttributeValue(value, attributeName) {
24
24
  * - Defaults `Path` to `/` (matching @edge-runtime/cookies and Next.js).
25
25
  * - Validates path/domain to reject control characters and semicolons.
26
26
  * - Emits attributes in the order: Path, Domain, Max-Age, Expires, HttpOnly,
27
- * Secure, SameSite.
27
+ * Secure, SameSite, Partitioned, Priority.
28
28
  *
29
29
  * The caller is responsible for validating the cookie name (typically before
30
30
  * mutating any internal state) via `validateCookieName`.
@@ -43,6 +43,8 @@ function serializeSetCookie(name, value, options) {
43
43
  if (options?.httpOnly) parts.push("HttpOnly");
44
44
  if (options?.secure) parts.push("Secure");
45
45
  if (options?.sameSite) parts.push(`SameSite=${options.sameSite}`);
46
+ if (options?.partitioned) parts.push("Partitioned");
47
+ if (options?.priority) parts.push(`Priority=${options.priority[0].toUpperCase()}${options.priority.slice(1)}`);
46
48
  return parts.join("; ");
47
49
  }
48
50
  //#endregion
@@ -1,4 +1,6 @@
1
- import { isExternalUrl, matchRewrite, parseCookies } from "../../config/config-matchers.js";
1
+ import { parseCookies } from "../../config/request-context.js";
2
+ import { isExternalUrl } from "../../utils/external-url.js";
3
+ import { matchRewrite } from "../../config/config-matchers.js";
2
4
  import { matchDirectHybridClientRoutes, resolveMatchedHybridClientRouteOwner, resolveSameOriginPathname } from "./hybrid-client-route-owner-direct.js";
3
5
  import { mergeRewriteQuery } from "../../utils/query.js";
4
6
  //#region src/shims/internal/hybrid-client-route-owner.ts
@@ -40,10 +40,11 @@ const staticDataCache = Object.create(null);
40
40
  const staticDataSources = /* @__PURE__ */ new Map();
41
41
  function getStaticDataKey(dataHref) {
42
42
  if (typeof window === "undefined") return dataHref;
43
+ const previewVariant = window.__NEXT_DATA__?.isPreview === true ? "preview" : "normal";
43
44
  try {
44
- return new URL(dataHref, window.location.href).href;
45
+ return `${new URL(dataHref, window.location.href).href}\n${previewVariant}`;
45
46
  } catch {
46
- return dataHref;
47
+ return `${dataHref}\n${previewVariant}`;
47
48
  }
48
49
  }
49
50
  function cloneStaticResponse(cached, signal) {
@@ -113,7 +114,8 @@ function getInflightKey(dataHref, init) {
113
114
  resolvedHref = new URL(dataHref, window.location.href).href;
114
115
  } catch {}
115
116
  const deploymentId = new Headers(init?.headers).get("x-deployment-id") ?? "";
116
- return `${resolvedHref}\n${deploymentId}`;
117
+ const previewVariant = typeof window !== "undefined" && window.__NEXT_DATA__?.isPreview === true ? "preview" : "normal";
118
+ return `${resolvedHref}\n${deploymentId}\n${previewVariant}`;
117
119
  }
118
120
  function cloneSharedResponse(key, entry, signal) {
119
121
  entry.waiters += 1;
@@ -30,11 +30,11 @@ type NEXT_DATA = {
30
30
  locale?: string;
31
31
  locales?: string[];
32
32
  defaultLocale?: string;
33
- domainLocales?: Array<{
33
+ domainLocales?: ReadonlyArray<{
34
34
  domain: string;
35
35
  defaultLocale: string;
36
- locales?: string[];
37
- http?: boolean;
36
+ locales?: readonly string[];
37
+ http?: true;
38
38
  }>;
39
39
  scriptLoader?: unknown[];
40
40
  isPreview?: boolean;
@@ -22,6 +22,6 @@ declare function LayoutSegmentProvider({
22
22
  providerId?: string;
23
23
  segmentMap: SegmentMap;
24
24
  children: ReactNode;
25
- }): string | number | bigint | boolean | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react").FunctionComponentElement<import("react").ProviderProps<SegmentMap>> | null | undefined;
25
+ }): string | number | bigint | boolean | import("react").FunctionComponentElement<import("react").ProviderProps<SegmentMap>> | Iterable<ReactNode> | Promise<string | number | bigint | boolean | Iterable<ReactNode> | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | import("react").ReactPortal | null | undefined> | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | null | undefined;
26
26
  //#endregion
27
27
  export { LayoutSegmentProvider, mergeLayoutSegmentMap };
@@ -1,41 +1,7 @@
1
1
  import React from "react";
2
+ import { ImageLoader, ImageLoaderProps, ImageProps } from "@vinext/types/next/upstream/dist/client/legacy/image";
2
3
 
3
4
  //#region src/shims/legacy-image.d.ts
4
- type LegacyImageProps = {
5
- src: string | {
6
- src: string;
7
- width: number;
8
- height: number;
9
- blurDataURL?: string;
10
- };
11
- alt: string;
12
- width?: number | string;
13
- height?: number | string; /** Legacy layout mode */
14
- layout?: "fixed" | "intrinsic" | "responsive" | "fill"; /** CSS object-fit (used with layout="fill") */
15
- objectFit?: React.CSSProperties["objectFit"]; /** CSS object-position (used with layout="fill") */
16
- objectPosition?: string;
17
- priority?: boolean;
18
- quality?: number;
19
- placeholder?: "blur" | "empty";
20
- blurDataURL?: string;
21
- loader?: (params: {
22
- src: string;
23
- width: number;
24
- quality?: number;
25
- }) => string;
26
- sizes?: string;
27
- className?: string;
28
- style?: React.CSSProperties;
29
- onLoad?: React.ReactEventHandler<HTMLImageElement>;
30
- onLoadingComplete?: (result: {
31
- naturalWidth: number;
32
- naturalHeight: number;
33
- }) => void;
34
- onError?: React.ReactEventHandler<HTMLImageElement>;
35
- loading?: "lazy" | "eager";
36
- unoptimized?: boolean;
37
- id?: string;
38
- };
39
- declare const LegacyImage: React.ForwardRefExoticComponent<LegacyImageProps & React.RefAttributes<HTMLImageElement>>;
5
+ declare function LegacyImage(props: ImageProps): React.ReactElement;
40
6
  //#endregion
41
- export { LegacyImage as default };
7
+ export { type ImageLoader, type ImageLoaderProps, type ImageProps, LegacyImage as default };
@@ -1,19 +1,9 @@
1
1
  import Image from "./image.js";
2
- import { forwardRef } from "react";
2
+ import "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/shims/legacy-image.tsx
5
- /**
6
- * next/legacy/image shim
7
- *
8
- * Provides the pre-Next.js 13 Image component API with layout prop.
9
- * Translates legacy props (layout, objectFit, objectPosition) to the
10
- * modern Image component's fill/style props.
11
- *
12
- * This module is used by apps that ran the `next-image-to-legacy-image`
13
- * codemod when upgrading from Next.js 12.
14
- */
15
- const LegacyImage = forwardRef(function LegacyImage(props, ref) {
16
- const { layout = "intrinsic", objectFit, objectPosition, onLoadingComplete, onLoad, width, height, style, ...rest } = props;
5
+ function LegacyImage(props) {
6
+ const { layout = "intrinsic", objectFit, objectPosition, onLoadingComplete, onLoad, alt, width, height, style, lazyRoot: _lazyRoot, lazyBoundary: _lazyBoundary, ...rest } = props;
17
7
  const modernStyle = { ...style };
18
8
  if (objectFit) modernStyle.objectFit = objectFit;
19
9
  if (objectPosition) modernStyle.objectPosition = objectPosition;
@@ -26,7 +16,7 @@ const LegacyImage = forwardRef(function LegacyImage(props, ref) {
26
16
  onLoad?.(e);
27
17
  } : onLoad;
28
18
  if (layout === "fill") return /* @__PURE__ */ jsx(Image, {
29
- ref,
19
+ alt: alt ?? "",
30
20
  fill: true,
31
21
  style: modernStyle,
32
22
  onLoad: handleLoad,
@@ -37,13 +27,13 @@ const LegacyImage = forwardRef(function LegacyImage(props, ref) {
37
27
  modernStyle.height = "auto";
38
28
  }
39
29
  return /* @__PURE__ */ jsx(Image, {
40
- ref,
30
+ alt: alt ?? "",
41
31
  width: typeof width === "string" ? parseInt(width, 10) : width,
42
32
  height: typeof height === "string" ? parseInt(height, 10) : height,
43
33
  style: modernStyle,
44
34
  onLoad: handleLoad,
45
35
  ...rest
46
36
  });
47
- });
37
+ }
48
38
  //#endregion
49
39
  export { LegacyImage as default };