vinext 0.0.49 → 0.0.51

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 (506) hide show
  1. package/dist/build/client-build-config.js.map +1 -1
  2. package/dist/build/google-fonts/build-url.js.map +1 -1
  3. package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
  4. package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
  5. package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
  6. package/dist/build/google-fonts/fallback-metrics.js +46 -0
  7. package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
  8. package/dist/build/google-fonts/get-axes.js.map +1 -1
  9. package/dist/build/google-fonts/sort-variants.js.map +1 -1
  10. package/dist/build/google-fonts/validate.js.map +1 -1
  11. package/dist/build/layout-classification.js.map +1 -1
  12. package/dist/build/nitro-route-rules.js.map +1 -1
  13. package/dist/build/precompress.d.ts +13 -2
  14. package/dist/build/precompress.js +12 -3
  15. package/dist/build/precompress.js.map +1 -1
  16. package/dist/build/prerender.d.ts +17 -1
  17. package/dist/build/prerender.js +114 -23
  18. package/dist/build/prerender.js.map +1 -1
  19. package/dist/build/report.d.ts +5 -4
  20. package/dist/build/report.js +196 -348
  21. package/dist/build/report.js.map +1 -1
  22. package/dist/build/route-classification-injector.js.map +1 -1
  23. package/dist/build/route-classification-manifest.js.map +1 -1
  24. package/dist/build/run-prerender.js.map +1 -1
  25. package/dist/build/server-manifest.js.map +1 -1
  26. package/dist/build/ssr-manifest.js.map +1 -1
  27. package/dist/build/standalone.js.map +1 -1
  28. package/dist/build/static-export.js.map +1 -1
  29. package/dist/check.js +2 -1
  30. package/dist/check.js.map +1 -1
  31. package/dist/cli-args.js.map +1 -1
  32. package/dist/cli.js +68 -7
  33. package/dist/cli.js.map +1 -1
  34. package/dist/client/instrumentation-client-state.js.map +1 -1
  35. package/dist/client/validate-module-path.js.map +1 -1
  36. package/dist/client/vinext-next-data.d.ts +5 -1
  37. package/dist/client/window-next.d.ts +151 -0
  38. package/dist/client/window-next.js +48 -0
  39. package/dist/client/window-next.js.map +1 -0
  40. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  41. package/dist/cloudflare/tpr.js +2 -1
  42. package/dist/cloudflare/tpr.js.map +1 -1
  43. package/dist/config/config-matchers.d.ts +3 -1
  44. package/dist/config/config-matchers.js +5 -4
  45. package/dist/config/config-matchers.js.map +1 -1
  46. package/dist/config/dotenv.d.ts +11 -1
  47. package/dist/config/dotenv.js.map +1 -1
  48. package/dist/config/next-config.d.ts +93 -6
  49. package/dist/config/next-config.js +233 -6
  50. package/dist/config/next-config.js.map +1 -1
  51. package/dist/config/tsconfig-paths.d.ts +13 -0
  52. package/dist/config/tsconfig-paths.js +117 -0
  53. package/dist/config/tsconfig-paths.js.map +1 -0
  54. package/dist/deploy.js +16 -7
  55. package/dist/deploy.js.map +1 -1
  56. package/dist/entries/app-browser-entry.d.ts +3 -1
  57. package/dist/entries/app-browser-entry.js +36 -2
  58. package/dist/entries/app-browser-entry.js.map +1 -1
  59. package/dist/entries/app-rsc-entry.d.ts +19 -1
  60. package/dist/entries/app-rsc-entry.js +49 -12
  61. package/dist/entries/app-rsc-entry.js.map +1 -1
  62. package/dist/entries/app-rsc-manifest.d.ts +9 -0
  63. package/dist/entries/app-rsc-manifest.js +8 -1
  64. package/dist/entries/app-rsc-manifest.js.map +1 -1
  65. package/dist/entries/app-ssr-entry.js.map +1 -1
  66. package/dist/entries/pages-client-entry.js +3 -5
  67. package/dist/entries/pages-client-entry.js.map +1 -1
  68. package/dist/entries/pages-entry-helpers.js.map +1 -1
  69. package/dist/entries/pages-server-entry.js +34 -1
  70. package/dist/entries/pages-server-entry.js.map +1 -1
  71. package/dist/entries/runtime-entry-module.js.map +1 -1
  72. package/dist/index.js +204 -53
  73. package/dist/index.js.map +1 -1
  74. package/dist/init.js.map +1 -1
  75. package/dist/plugins/async-hooks-stub.js.map +1 -1
  76. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  77. package/dist/plugins/client-reference-dedup.js +138 -16
  78. package/dist/plugins/client-reference-dedup.js.map +1 -1
  79. package/dist/plugins/fonts.d.ts +2 -2
  80. package/dist/plugins/fonts.js +15 -6
  81. package/dist/plugins/fonts.js.map +1 -1
  82. package/dist/plugins/instrumentation-client.js.map +1 -1
  83. package/dist/plugins/og-assets.js.map +1 -1
  84. package/dist/plugins/optimize-imports.js.map +1 -1
  85. package/dist/plugins/postcss.js.map +1 -1
  86. package/dist/plugins/rsc-client-reference-loaders.d.ts +7 -0
  87. package/dist/plugins/rsc-client-reference-loaders.js +48 -0
  88. package/dist/plugins/rsc-client-reference-loaders.js.map +1 -0
  89. package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
  90. package/dist/plugins/sass.d.ts +34 -0
  91. package/dist/plugins/sass.js +22 -0
  92. package/dist/plugins/sass.js.map +1 -0
  93. package/dist/plugins/server-externals-manifest.js.map +1 -1
  94. package/dist/plugins/strip-server-exports.js.map +1 -1
  95. package/dist/routing/app-route-graph.d.ts +78 -6
  96. package/dist/routing/app-route-graph.js +241 -25
  97. package/dist/routing/app-route-graph.js.map +1 -1
  98. package/dist/routing/app-router.js.map +1 -1
  99. package/dist/routing/file-matcher.js.map +1 -1
  100. package/dist/routing/pages-router.js.map +1 -1
  101. package/dist/routing/route-matching.js.map +1 -1
  102. package/dist/routing/route-pattern.d.ts +56 -1
  103. package/dist/routing/route-pattern.js +60 -1
  104. package/dist/routing/route-pattern.js.map +1 -1
  105. package/dist/routing/route-trie.js.map +1 -1
  106. package/dist/routing/route-validation.js.map +1 -1
  107. package/dist/routing/utils.js.map +1 -1
  108. package/dist/server/api-handler.js.map +1 -1
  109. package/dist/server/app-browser-action-result.d.ts +44 -0
  110. package/dist/server/app-browser-action-result.js +79 -0
  111. package/dist/server/app-browser-action-result.js.map +1 -0
  112. package/dist/server/app-browser-entry.js +330 -133
  113. package/dist/server/app-browser-entry.js.map +1 -1
  114. package/dist/server/app-browser-error.js.map +1 -1
  115. package/dist/server/app-browser-hydration.d.ts +31 -0
  116. package/dist/server/app-browser-hydration.js +30 -0
  117. package/dist/server/app-browser-hydration.js.map +1 -0
  118. package/dist/server/app-browser-navigation-controller.d.ts +20 -4
  119. package/dist/server/app-browser-navigation-controller.js +90 -23
  120. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  121. package/dist/server/app-browser-popstate.d.ts +16 -0
  122. package/dist/server/app-browser-popstate.js +17 -0
  123. package/dist/server/app-browser-popstate.js.map +1 -0
  124. package/dist/server/app-browser-rsc-redirect.d.ts +28 -0
  125. package/dist/server/app-browser-rsc-redirect.js +37 -0
  126. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  127. package/dist/server/app-browser-state.d.ts +27 -23
  128. package/dist/server/app-browser-state.js +158 -54
  129. package/dist/server/app-browser-state.js.map +1 -1
  130. package/dist/server/app-browser-stream.d.ts +9 -4
  131. package/dist/server/app-browser-stream.js +29 -8
  132. package/dist/server/app-browser-stream.js.map +1 -1
  133. package/dist/server/app-browser-visible-commit.d.ts +11 -1
  134. package/dist/server/app-browser-visible-commit.js +69 -21
  135. package/dist/server/app-browser-visible-commit.js.map +1 -1
  136. package/dist/server/app-client-reference-preloader.js.map +1 -1
  137. package/dist/server/app-elements-wire.d.ts +43 -6
  138. package/dist/server/app-elements-wire.js +121 -5
  139. package/dist/server/app-elements-wire.js.map +1 -1
  140. package/dist/server/app-elements.d.ts +2 -2
  141. package/dist/server/app-elements.js +2 -2
  142. package/dist/server/app-elements.js.map +1 -1
  143. package/dist/server/app-fallback-renderer.d.ts +10 -1
  144. package/dist/server/app-fallback-renderer.js +37 -1
  145. package/dist/server/app-fallback-renderer.js.map +1 -1
  146. package/dist/server/app-history-state.d.ts +26 -0
  147. package/dist/server/app-history-state.js +53 -0
  148. package/dist/server/app-history-state.js.map +1 -0
  149. package/dist/server/app-hook-warning-suppression.js.map +1 -1
  150. package/dist/server/app-middleware.d.ts +1 -1
  151. package/dist/server/app-middleware.js +4 -9
  152. package/dist/server/app-middleware.js.map +1 -1
  153. package/dist/server/app-mounted-slots-header.js.map +1 -1
  154. package/dist/server/app-page-boundary-render.d.ts +11 -1
  155. package/dist/server/app-page-boundary-render.js +27 -19
  156. package/dist/server/app-page-boundary-render.js.map +1 -1
  157. package/dist/server/app-page-boundary.d.ts +1 -0
  158. package/dist/server/app-page-boundary.js +10 -7
  159. package/dist/server/app-page-boundary.js.map +1 -1
  160. package/dist/server/app-page-cache.d.ts +23 -3
  161. package/dist/server/app-page-cache.js +63 -27
  162. package/dist/server/app-page-cache.js.map +1 -1
  163. package/dist/server/app-page-dispatch.d.ts +11 -1
  164. package/dist/server/app-page-dispatch.js +85 -14
  165. package/dist/server/app-page-dispatch.js.map +1 -1
  166. package/dist/server/app-page-element-builder.d.ts +10 -1
  167. package/dist/server/app-page-element-builder.js +38 -6
  168. package/dist/server/app-page-element-builder.js.map +1 -1
  169. package/dist/server/app-page-execution.js +2 -3
  170. package/dist/server/app-page-execution.js.map +1 -1
  171. package/dist/server/app-page-head.d.ts +7 -0
  172. package/dist/server/app-page-head.js +6 -1
  173. package/dist/server/app-page-head.js.map +1 -1
  174. package/dist/server/app-page-method.js.map +1 -1
  175. package/dist/server/app-page-params.js.map +1 -1
  176. package/dist/server/app-page-probe.d.ts +23 -1
  177. package/dist/server/app-page-probe.js +29 -1
  178. package/dist/server/app-page-probe.js.map +1 -1
  179. package/dist/server/app-page-render-observation.d.ts +35 -0
  180. package/dist/server/app-page-render-observation.js +68 -0
  181. package/dist/server/app-page-render-observation.js.map +1 -0
  182. package/dist/server/app-page-render.d.ts +12 -2
  183. package/dist/server/app-page-render.js +90 -7
  184. package/dist/server/app-page-render.js.map +1 -1
  185. package/dist/server/app-page-request.d.ts +1 -0
  186. package/dist/server/app-page-request.js +2 -1
  187. package/dist/server/app-page-request.js.map +1 -1
  188. package/dist/server/app-page-response.d.ts +2 -0
  189. package/dist/server/app-page-response.js +18 -7
  190. package/dist/server/app-page-response.js.map +1 -1
  191. package/dist/server/app-page-route-wiring.d.ts +9 -3
  192. package/dist/server/app-page-route-wiring.js +91 -62
  193. package/dist/server/app-page-route-wiring.js.map +1 -1
  194. package/dist/server/app-page-segment-state.d.ts +10 -0
  195. package/dist/server/app-page-segment-state.js +87 -0
  196. package/dist/server/app-page-segment-state.js.map +1 -0
  197. package/dist/server/app-page-stream.d.ts +9 -2
  198. package/dist/server/app-page-stream.js +4 -1
  199. package/dist/server/app-page-stream.js.map +1 -1
  200. package/dist/server/app-post-middleware-context.js.map +1 -1
  201. package/dist/server/app-prerender-endpoints.js.map +1 -1
  202. package/dist/server/app-prerender-static-params.js.map +1 -1
  203. package/dist/server/app-render-dependency.js.map +1 -1
  204. package/dist/server/app-request-context.js.map +1 -1
  205. package/dist/server/app-route-handler-cache.js.map +1 -1
  206. package/dist/server/app-route-handler-dispatch.js +3 -1
  207. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  208. package/dist/server/app-route-handler-execution.js.map +1 -1
  209. package/dist/server/app-route-handler-policy.js +1 -0
  210. package/dist/server/app-route-handler-policy.js.map +1 -1
  211. package/dist/server/app-route-handler-response.js +4 -3
  212. package/dist/server/app-route-handler-response.js.map +1 -1
  213. package/dist/server/app-route-handler-runtime.js.map +1 -1
  214. package/dist/server/app-router-entry.js +7 -15
  215. package/dist/server/app-router-entry.js.map +1 -1
  216. package/dist/server/app-rsc-cache-busting.d.ts +23 -2
  217. package/dist/server/app-rsc-cache-busting.js +75 -19
  218. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  219. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  220. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  221. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  222. package/dist/server/app-rsc-error-handler.js.map +1 -1
  223. package/dist/server/app-rsc-errors.d.ts +4 -1
  224. package/dist/server/app-rsc-errors.js +1 -1
  225. package/dist/server/app-rsc-errors.js.map +1 -1
  226. package/dist/server/app-rsc-handler.d.ts +18 -1
  227. package/dist/server/app-rsc-handler.js +55 -16
  228. package/dist/server/app-rsc-handler.js.map +1 -1
  229. package/dist/server/app-rsc-render-mode.d.ts +11 -0
  230. package/dist/server/app-rsc-render-mode.js +21 -0
  231. package/dist/server/app-rsc-render-mode.js.map +1 -0
  232. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  233. package/dist/server/app-rsc-request-normalization.js +7 -2
  234. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  235. package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
  236. package/dist/server/app-rsc-response-finalizer.js +6 -1
  237. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  238. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  239. package/dist/server/app-rsc-route-matching.js +45 -23
  240. package/dist/server/app-rsc-route-matching.js.map +1 -1
  241. package/dist/server/app-segment-config.js.map +1 -1
  242. package/dist/server/app-server-action-execution.d.ts +51 -5
  243. package/dist/server/app-server-action-execution.js +161 -51
  244. package/dist/server/app-server-action-execution.js.map +1 -1
  245. package/dist/server/app-ssr-entry.d.ts +7 -0
  246. package/dist/server/app-ssr-entry.js +44 -14
  247. package/dist/server/app-ssr-entry.js.map +1 -1
  248. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  249. package/dist/server/app-ssr-error-meta.js +50 -0
  250. package/dist/server/app-ssr-error-meta.js.map +1 -0
  251. package/dist/server/app-ssr-stream.d.ts +1 -1
  252. package/dist/server/app-ssr-stream.js +9 -12
  253. package/dist/server/app-ssr-stream.js.map +1 -1
  254. package/dist/server/app-static-generation.js.map +1 -1
  255. package/dist/server/artifact-compatibility.d.ts +12 -2
  256. package/dist/server/artifact-compatibility.js +12 -8
  257. package/dist/server/artifact-compatibility.js.map +1 -1
  258. package/dist/server/cache-control.js +1 -0
  259. package/dist/server/cache-control.js.map +1 -1
  260. package/dist/server/cache-proof.d.ts +124 -5
  261. package/dist/server/cache-proof.js +416 -18
  262. package/dist/server/cache-proof.js.map +1 -1
  263. package/dist/server/csp.js.map +1 -1
  264. package/dist/server/dev-error-overlay-store.js.map +1 -1
  265. package/dist/server/dev-error-overlay.js +5 -0
  266. package/dist/server/dev-error-overlay.js.map +1 -1
  267. package/dist/server/dev-lockfile.d.ts +110 -0
  268. package/dist/server/dev-lockfile.js +180 -0
  269. package/dist/server/dev-lockfile.js.map +1 -0
  270. package/dist/server/dev-module-runner.js.map +1 -1
  271. package/dist/server/dev-origin-check.js.map +1 -1
  272. package/dist/server/dev-route-files.js.map +1 -1
  273. package/dist/server/dev-server.js +23 -10
  274. package/dist/server/dev-server.js.map +1 -1
  275. package/dist/server/file-based-metadata.d.ts +13 -0
  276. package/dist/server/file-based-metadata.js +49 -2
  277. package/dist/server/file-based-metadata.js.map +1 -1
  278. package/dist/server/headers.d.ts +81 -0
  279. package/dist/server/headers.js +104 -0
  280. package/dist/server/headers.js.map +1 -0
  281. package/dist/server/html.js +1 -1
  282. package/dist/server/html.js.map +1 -1
  283. package/dist/server/http-error-responses.d.ts +10 -0
  284. package/dist/server/http-error-responses.js +11 -1
  285. package/dist/server/http-error-responses.js.map +1 -1
  286. package/dist/server/image-optimization.d.ts +11 -1
  287. package/dist/server/image-optimization.js.map +1 -1
  288. package/dist/server/implicit-tags.js +2 -1
  289. package/dist/server/implicit-tags.js.map +1 -1
  290. package/dist/server/instrumentation-runtime.js.map +1 -1
  291. package/dist/server/instrumentation.js.map +1 -1
  292. package/dist/server/isr-cache.d.ts +12 -2
  293. package/dist/server/isr-cache.js +16 -5
  294. package/dist/server/isr-cache.js.map +1 -1
  295. package/dist/server/metadata-route-build-data.js.map +1 -1
  296. package/dist/server/metadata-route-response.js +22 -5
  297. package/dist/server/metadata-route-response.js.map +1 -1
  298. package/dist/server/metadata-routes.js +27 -8
  299. package/dist/server/metadata-routes.js.map +1 -1
  300. package/dist/server/middleware-matcher.js.map +1 -1
  301. package/dist/server/middleware-request-headers.d.ts +4 -1
  302. package/dist/server/middleware-request-headers.js +15 -8
  303. package/dist/server/middleware-request-headers.js.map +1 -1
  304. package/dist/server/middleware-response-headers.d.ts +2 -1
  305. package/dist/server/middleware-response-headers.js +1 -1
  306. package/dist/server/middleware-response-headers.js.map +1 -1
  307. package/dist/server/middleware-runtime.d.ts +1 -0
  308. package/dist/server/middleware-runtime.js +7 -3
  309. package/dist/server/middleware-runtime.js.map +1 -1
  310. package/dist/server/middleware.d.ts +12 -0
  311. package/dist/server/middleware.js +12 -0
  312. package/dist/server/middleware.js.map +1 -1
  313. package/dist/server/navigation-planner.d.ts +133 -0
  314. package/dist/server/navigation-planner.js +432 -0
  315. package/dist/server/navigation-planner.js.map +1 -0
  316. package/dist/server/navigation-trace.d.ts +19 -2
  317. package/dist/server/navigation-trace.js +20 -1
  318. package/dist/server/navigation-trace.js.map +1 -1
  319. package/dist/server/next-error-digest.d.ts +3 -2
  320. package/dist/server/next-error-digest.js +4 -2
  321. package/dist/server/next-error-digest.js.map +1 -1
  322. package/dist/server/normalize-path.d.ts +2 -1
  323. package/dist/server/normalize-path.js +4 -1
  324. package/dist/server/normalize-path.js.map +1 -1
  325. package/dist/server/pages-api-route.js +1 -0
  326. package/dist/server/pages-api-route.js.map +1 -1
  327. package/dist/server/pages-i18n.js.map +1 -1
  328. package/dist/server/pages-media-type.js.map +1 -1
  329. package/dist/server/pages-node-compat.js.map +1 -1
  330. package/dist/server/pages-page-data.d.ts +3 -2
  331. package/dist/server/pages-page-data.js +27 -5
  332. package/dist/server/pages-page-data.js.map +1 -1
  333. package/dist/server/pages-page-response.js +2 -1
  334. package/dist/server/pages-page-response.js.map +1 -1
  335. package/dist/server/prerender-work-unit-setup.js +1 -1
  336. package/dist/server/prerender-work-unit-setup.js.map +1 -1
  337. package/dist/server/prod-server.d.ts +28 -1
  338. package/dist/server/prod-server.js +97 -22
  339. package/dist/server/prod-server.js.map +1 -1
  340. package/dist/server/request-log.js.map +1 -1
  341. package/dist/server/request-pipeline.d.ts +1 -13
  342. package/dist/server/request-pipeline.js +3 -25
  343. package/dist/server/request-pipeline.js.map +1 -1
  344. package/dist/server/rsc-stream-hints.js.map +1 -1
  345. package/dist/server/seed-cache.js.map +1 -1
  346. package/dist/server/server-action-not-found.d.ts +16 -3
  347. package/dist/server/server-action-not-found.js +22 -4
  348. package/dist/server/server-action-not-found.js.map +1 -1
  349. package/dist/server/server-globals.d.ts +5 -0
  350. package/dist/server/server-globals.js +37 -0
  351. package/dist/server/server-globals.js.map +1 -0
  352. package/dist/server/socket-error-backstop.js.map +1 -1
  353. package/dist/server/static-file-cache.js +1 -1
  354. package/dist/server/static-file-cache.js.map +1 -1
  355. package/dist/server/worker-utils.d.ts +0 -7
  356. package/dist/server/worker-utils.js +3 -2
  357. package/dist/server/worker-utils.js.map +1 -1
  358. package/dist/shims/amp.js.map +1 -1
  359. package/dist/shims/app.d.ts +37 -4
  360. package/dist/shims/app.js +50 -1
  361. package/dist/shims/app.js.map +1 -0
  362. package/dist/shims/cache-for-request.js.map +1 -1
  363. package/dist/shims/cache-runtime.d.ts +19 -2
  364. package/dist/shims/cache-runtime.js +87 -19
  365. package/dist/shims/cache-runtime.js.map +1 -1
  366. package/dist/shims/cache.d.ts +20 -21
  367. package/dist/shims/cache.js +101 -15
  368. package/dist/shims/cache.js.map +1 -1
  369. package/dist/shims/client-hook-error.js.map +1 -1
  370. package/dist/shims/compat-router.js.map +1 -1
  371. package/dist/shims/config.js.map +1 -1
  372. package/dist/shims/constants.js.map +1 -1
  373. package/dist/shims/document.js.map +1 -1
  374. package/dist/shims/dynamic.d.ts +18 -10
  375. package/dist/shims/dynamic.js +107 -51
  376. package/dist/shims/dynamic.js.map +1 -1
  377. package/dist/shims/error-boundary.d.ts +35 -6
  378. package/dist/shims/error-boundary.js +116 -33
  379. package/dist/shims/error-boundary.js.map +1 -1
  380. package/dist/shims/error.d.ts +18 -1
  381. package/dist/shims/error.js +56 -1
  382. package/dist/shims/error.js.map +1 -1
  383. package/dist/shims/fetch-cache.d.ts +25 -1
  384. package/dist/shims/fetch-cache.js +159 -13
  385. package/dist/shims/fetch-cache.js.map +1 -1
  386. package/dist/shims/font-google-base.d.ts +22 -8
  387. package/dist/shims/font-google-base.js +41 -71
  388. package/dist/shims/font-google-base.js.map +1 -1
  389. package/dist/shims/font-local.d.ts +3 -20
  390. package/dist/shims/font-local.js +23 -75
  391. package/dist/shims/font-local.js.map +1 -1
  392. package/dist/shims/font-utils.d.ts +51 -0
  393. package/dist/shims/font-utils.js +97 -0
  394. package/dist/shims/font-utils.js.map +1 -0
  395. package/dist/shims/form.js +3 -1
  396. package/dist/shims/form.js.map +1 -1
  397. package/dist/shims/hash-scroll.d.ts +7 -0
  398. package/dist/shims/hash-scroll.js +30 -0
  399. package/dist/shims/hash-scroll.js.map +1 -0
  400. package/dist/shims/head-state.js.map +1 -1
  401. package/dist/shims/head.d.ts +3 -1
  402. package/dist/shims/head.js +28 -16
  403. package/dist/shims/head.js.map +1 -1
  404. package/dist/shims/headers.d.ts +11 -12
  405. package/dist/shims/headers.js +45 -8
  406. package/dist/shims/headers.js.map +1 -1
  407. package/dist/shims/i18n-context.js.map +1 -1
  408. package/dist/shims/i18n-state.js.map +1 -1
  409. package/dist/shims/image-config.d.ts +14 -1
  410. package/dist/shims/image-config.js +24 -1
  411. package/dist/shims/image-config.js.map +1 -1
  412. package/dist/shims/image.d.ts +1 -0
  413. package/dist/shims/image.js +159 -80
  414. package/dist/shims/image.js.map +1 -1
  415. package/dist/shims/internal/als-registry.js.map +1 -1
  416. package/dist/shims/internal/app-router-context.d.ts +7 -6
  417. package/dist/shims/internal/app-router-context.js +17 -6
  418. package/dist/shims/internal/app-router-context.js.map +1 -1
  419. package/dist/shims/internal/cookie-serialize.js.map +1 -1
  420. package/dist/shims/internal/make-hanging-promise.d.ts +1 -1
  421. package/dist/shims/internal/make-hanging-promise.js +1 -1
  422. package/dist/shims/internal/make-hanging-promise.js.map +1 -1
  423. package/dist/shims/internal/parse-cookie-header.js.map +1 -1
  424. package/dist/shims/internal/utils.js.map +1 -1
  425. package/dist/shims/internal/work-unit-async-storage.js +2 -2
  426. package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
  427. package/dist/shims/layout-segment-context.js.map +1 -1
  428. package/dist/shims/legacy-image.js.map +1 -1
  429. package/dist/shims/link-prefetch.d.ts +42 -0
  430. package/dist/shims/link-prefetch.js +45 -0
  431. package/dist/shims/link-prefetch.js.map +1 -0
  432. package/dist/shims/link.d.ts +37 -4
  433. package/dist/shims/link.js +156 -46
  434. package/dist/shims/link.js.map +1 -1
  435. package/dist/shims/metadata.d.ts +16 -30
  436. package/dist/shims/metadata.js +87 -28
  437. package/dist/shims/metadata.js.map +1 -1
  438. package/dist/shims/navigation-state.js.map +1 -1
  439. package/dist/shims/navigation.d.ts +172 -10
  440. package/dist/shims/navigation.js +335 -70
  441. package/dist/shims/navigation.js.map +1 -1
  442. package/dist/shims/navigation.react-server.d.ts +3 -2
  443. package/dist/shims/navigation.react-server.js +5 -2
  444. package/dist/shims/navigation.react-server.js.map +1 -1
  445. package/dist/shims/offline.js.map +1 -1
  446. package/dist/shims/pages-router-runtime.d.ts +7 -0
  447. package/dist/shims/pages-router-runtime.js +16 -0
  448. package/dist/shims/pages-router-runtime.js.map +1 -0
  449. package/dist/shims/readonly-url-search-params.js.map +1 -1
  450. package/dist/shims/request-context.js.map +1 -1
  451. package/dist/shims/root-params.js.map +1 -1
  452. package/dist/shims/router-state.js.map +1 -1
  453. package/dist/shims/router.d.ts +69 -7
  454. package/dist/shims/router.js +232 -249
  455. package/dist/shims/router.js.map +1 -1
  456. package/dist/shims/script-nonce-context.js.map +1 -1
  457. package/dist/shims/script.js +110 -32
  458. package/dist/shims/script.js.map +1 -1
  459. package/dist/shims/server.js +12 -15
  460. package/dist/shims/server.js.map +1 -1
  461. package/dist/shims/slot.d.ts +7 -1
  462. package/dist/shims/slot.js +60 -7
  463. package/dist/shims/slot.js.map +1 -1
  464. package/dist/shims/thenable-params.js.map +1 -1
  465. package/dist/shims/unified-request-context.js +5 -0
  466. package/dist/shims/unified-request-context.js.map +1 -1
  467. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  468. package/dist/shims/unrecognized-action-error.js +41 -0
  469. package/dist/shims/unrecognized-action-error.js.map +1 -0
  470. package/dist/shims/url-safety.js.map +1 -1
  471. package/dist/shims/url-utils.d.ts +22 -1
  472. package/dist/shims/url-utils.js +76 -3
  473. package/dist/shims/url-utils.js.map +1 -1
  474. package/dist/shims/use-merged-ref.js.map +1 -1
  475. package/dist/shims/web-vitals.d.ts +4 -21
  476. package/dist/shims/web-vitals.js +19 -6
  477. package/dist/shims/web-vitals.js.map +1 -1
  478. package/dist/utils/asset-prefix.d.ts +69 -0
  479. package/dist/utils/asset-prefix.js +91 -0
  480. package/dist/utils/asset-prefix.js.map +1 -0
  481. package/dist/utils/base-path.d.ts +7 -1
  482. package/dist/utils/base-path.js +10 -1
  483. package/dist/utils/base-path.js.map +1 -1
  484. package/dist/utils/cache-control-metadata.js.map +1 -1
  485. package/dist/utils/domain-locale.js.map +1 -1
  486. package/dist/utils/encode-cache-tag.d.ts +31 -0
  487. package/dist/utils/encode-cache-tag.js +38 -0
  488. package/dist/utils/encode-cache-tag.js.map +1 -0
  489. package/dist/utils/error-cause.js.map +1 -1
  490. package/dist/utils/hash.js.map +1 -1
  491. package/dist/utils/lazy-chunks.js.map +1 -1
  492. package/dist/utils/manifest-paths.js.map +1 -1
  493. package/dist/utils/mdx-scan.js.map +1 -1
  494. package/dist/utils/navigation-signal.d.ts +5 -0
  495. package/dist/utils/navigation-signal.js +14 -0
  496. package/dist/utils/navigation-signal.js.map +1 -0
  497. package/dist/utils/project.js.map +1 -1
  498. package/dist/utils/public-routes.js.map +1 -1
  499. package/dist/utils/query.js.map +1 -1
  500. package/dist/utils/safe-json-file.js.map +1 -1
  501. package/dist/utils/sorted-array.d.ts +9 -0
  502. package/dist/utils/sorted-array.js +22 -0
  503. package/dist/utils/sorted-array.js.map +1 -0
  504. package/dist/utils/text-stream.js.map +1 -1
  505. package/dist/utils/vinext-root.js.map +1 -1
  506. package/package.json +8 -6
@@ -1,8 +1,9 @@
1
1
  "use client";
2
- import { hasRemoteMatch } from "./image-config.js";
2
+ import { hasRemoteMatch, isPrivateIp } from "./image-config.js";
3
3
  import { useMergedRef } from "./use-merged-ref.js";
4
- import { forwardRef, useEffect, useLayoutEffect, useRef } from "react";
4
+ import { forwardRef, useEffect, useLayoutEffect, useRef, useState } from "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
+ import * as ReactDOM from "react-dom";
6
7
  import { Image as Image$1 } from "@unpic/react";
7
8
  //#region src/shims/image.tsx
8
9
  /**
@@ -62,6 +63,12 @@ const __imageDeviceSizes = (() => {
62
63
  */
63
64
  const __dangerouslyAllowSVG = process.env.__VINEXT_IMAGE_DANGEROUSLY_ALLOW_SVG === "true";
64
65
  /**
66
+ * Whether dangerouslyAllowLocalIP is enabled in next.config.js.
67
+ * When false (default), remote image URLs with literal private-IP hostnames
68
+ * are blocked to mitigate SSRF risk.
69
+ */
70
+ const __dangerouslyAllowLocalIP = process.env.__VINEXT_IMAGE_DANGEROUSLY_ALLOW_LOCAL_IP === "true";
71
+ /**
65
72
  * Validate that a remote URL is allowed by the configured remote patterns.
66
73
  * Returns true if the URL is allowed, false otherwise.
67
74
  *
@@ -71,9 +78,11 @@ const __dangerouslyAllowSVG = process.env.__VINEXT_IMAGE_DANGEROUSLY_ALLOW_SVG =
71
78
  * When patterns ARE configured, only matching URLs are allowed.
72
79
  * In development, non-matching URLs produce a console warning.
73
80
  * In production, non-matching URLs are blocked (src replaced with empty string).
81
+ *
82
+ * Private-IP hostnames are additionally rejected unless dangerouslyAllowLocalIP
83
+ * is set, mirroring Next.js's fetchExternalImage guard.
74
84
  */
75
85
  function validateRemoteUrl(src) {
76
- if (!__hasImageConfig) return { allowed: true };
77
86
  let url;
78
87
  try {
79
88
  url = new URL(src, "http://n");
@@ -83,6 +92,11 @@ function validateRemoteUrl(src) {
83
92
  reason: `Invalid URL: ${src}`
84
93
  };
85
94
  }
95
+ if (!__dangerouslyAllowLocalIP && isPrivateIp(url.hostname)) return {
96
+ allowed: false,
97
+ reason: `Image URL "${src}" resolved to private IP. If this is expected and you understand SSRF risk, use images.dangerouslyAllowLocalIP = true to continue.`
98
+ };
99
+ if (!__hasImageConfig) return { allowed: true };
86
100
  if (hasRemoteMatch(__imageDomains, __imageRemotePatterns, url)) return { allowed: true };
87
101
  return {
88
102
  allowed: false,
@@ -161,6 +175,17 @@ function sanitizeBlurDataURL(url) {
161
175
  function isRemoteUrl(src) {
162
176
  return src.startsWith("http://") || src.startsWith("https://") || src.startsWith("//");
163
177
  }
178
+ function getFillStyle(style, backgroundStyle) {
179
+ return {
180
+ position: "absolute",
181
+ inset: 0,
182
+ width: "100%",
183
+ height: "100%",
184
+ objectFit: "cover",
185
+ ...backgroundStyle,
186
+ ...style
187
+ };
188
+ }
164
189
  /**
165
190
  * Resolve src, width, height, blurDataURL from Image props (string or StaticImageData).
166
191
  * Shared by the Image component and getImageProps to keep behavior in sync.
@@ -189,6 +214,16 @@ const RESPONSIVE_WIDTHS = __imageDeviceSizes;
189
214
  function imageOptimizationUrl(src, width, quality = 75) {
190
215
  return `/_vinext/image?url=${encodeURIComponent(src)}&w=${width}&q=${quality}`;
191
216
  }
217
+ function preloadImageResource(input) {
218
+ if (!input.shouldPreload) return;
219
+ if (typeof ReactDOM.preload !== "function") return;
220
+ ReactDOM.preload(input.src, {
221
+ as: "image",
222
+ imageSrcSet: input.srcSet,
223
+ imageSizes: input.sizes,
224
+ fetchPriority: input.fetchPriority
225
+ });
226
+ }
192
227
  /**
193
228
  * Generate a srcSet string for responsive images.
194
229
  *
@@ -201,7 +236,7 @@ function generateSrcSet(src, originalWidth, quality = 75) {
201
236
  if (widths.length === 0) return `${imageOptimizationUrl(src, originalWidth, quality)} ${originalWidth}w`;
202
237
  return widths.map((w) => `${imageOptimizationUrl(src, w, quality)} ${w}w`).join(", ");
203
238
  }
204
- const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill, priority, quality, placeholder, blurDataURL, loader, sizes, className, style, onLoad, onLoadingComplete, onError, unoptimized: _unoptimized, overrideSrc: _overrideSrc, loading, ...rest }, ref) {
239
+ const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill, preload, priority, quality, placeholder, blurDataURL, loader, sizes, className, style, onLoad, onLoadingComplete, onError, unoptimized: _unoptimized, overrideSrc: _overrideSrc, loading, ...rest }, ref) {
205
240
  const lastLoadedSrcRef = useRef(void 0);
206
241
  const lastErrorSrcRef = useRef(void 0);
207
242
  const didInsertRef = useRef(false);
@@ -225,11 +260,21 @@ const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill
225
260
  height,
226
261
  blurDataURL
227
262
  });
263
+ const shouldPreload = preload === true || priority === true;
264
+ const priorityFetchPriority = priority ? "high" : void 0;
265
+ const imageLoading = priority ? "eager" : shouldPreload ? loading : loading ?? "lazy";
266
+ const [completedBlurSrc, setCompletedBlurSrc] = useState(void 0);
267
+ const blurComplete = completedBlurSrc === src;
268
+ const markBlurComplete = () => {
269
+ if (placeholder !== "blur") return;
270
+ setCompletedBlurSrc((current) => current === src ? current : src);
271
+ };
228
272
  useNonWarningLayoutEffect(() => {
229
273
  if (!didInsertRef.current && imgElementRef.current !== null) {
230
274
  const img = imgElementRef.current;
231
275
  if (onErrorRef.current) img.src = img.src;
232
276
  if (img.complete && img.naturalWidth > 0) {
277
+ markBlurComplete();
233
278
  const currentOnLoad = onLoadRef.current;
234
279
  const currentOnLoadingComplete = onLoadingCompleteRef.current;
235
280
  if (currentOnLoad || currentOnLoadingComplete) {
@@ -251,118 +296,159 @@ const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill
251
296
  const handleLoad = onLoadingComplete ? (e) => {
252
297
  if (lastLoadedSrcRef.current === src) return;
253
298
  lastLoadedSrcRef.current = src;
299
+ markBlurComplete();
254
300
  onLoad?.(e);
255
301
  onLoadingComplete(e.currentTarget);
256
302
  } : onLoad ? (e) => {
257
303
  if (lastLoadedSrcRef.current === src) return;
258
304
  lastLoadedSrcRef.current = src;
305
+ markBlurComplete();
259
306
  onLoad(e);
307
+ } : placeholder === "blur" ? () => {
308
+ if (lastLoadedSrcRef.current === src) return;
309
+ lastLoadedSrcRef.current = src;
310
+ markBlurComplete();
260
311
  } : void 0;
261
312
  const handleError = onError ? (e) => {
262
313
  if (lastErrorSrcRef.current === src) return;
263
314
  lastErrorSrcRef.current = src;
315
+ markBlurComplete();
264
316
  onError(e);
317
+ } : placeholder === "blur" ? () => {
318
+ if (lastErrorSrcRef.current === src) return;
319
+ lastErrorSrcRef.current = src;
320
+ markBlurComplete();
265
321
  } : void 0;
266
- if (loader) return /* @__PURE__ */ jsx("img", {
267
- ref: mergedRef,
268
- src: loader({
322
+ if (loader) {
323
+ const resolvedSrc = loader({
269
324
  src,
270
325
  width: imgWidth ?? 0,
271
326
  quality: quality ?? 75
272
- }),
273
- alt,
274
- width: fill ? void 0 : imgWidth,
275
- height: fill ? void 0 : imgHeight,
276
- loading: priority ? "eager" : loading ?? "lazy",
277
- decoding: "async",
278
- sizes,
279
- className,
280
- onLoad: handleLoad,
281
- onError: handleError,
282
- style: fill ? {
283
- position: "absolute",
284
- inset: 0,
285
- width: "100%",
286
- height: "100%",
287
- objectFit: "cover",
288
- ...style
289
- } : style,
290
- ...rest
291
- });
292
- if (isRemoteUrl(src)) {
293
- const validation = validateRemoteUrl(src);
294
- if (!validation.allowed) if (__isDev) console.warn(`[next/image] ${validation.reason}`);
295
- else {
296
- console.error(`[next/image] ${validation.reason}`);
297
- return null;
298
- }
299
- const sanitizedBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : void 0;
300
- const bg = placeholder === "blur" && sanitizedBlur ? `url(${sanitizedBlur})` : void 0;
301
- if (fill) return /* @__PURE__ */ jsx(Image$1, {
302
- src,
303
- alt,
304
- layout: "fullWidth",
305
- loading: priority ? "eager" : loading ?? "lazy",
306
- fetchPriority: priority ? "high" : void 0,
327
+ });
328
+ preloadImageResource({
329
+ shouldPreload,
330
+ src: resolvedSrc,
307
331
  sizes,
308
- className,
309
- background: bg,
310
- onLoad: handleLoad,
311
- onError: handleError,
312
- ref: mergedRef
332
+ fetchPriority: priorityFetchPriority
313
333
  });
314
- if (imgWidth && imgHeight) return /* @__PURE__ */ jsx(Image$1, {
315
- src,
334
+ return /* @__PURE__ */ jsx("img", {
335
+ ref: mergedRef,
336
+ src: resolvedSrc,
316
337
  alt,
317
- width: imgWidth,
318
- height: imgHeight,
319
- layout: "constrained",
320
- loading: priority ? "eager" : loading ?? "lazy",
321
- fetchPriority: priority ? "high" : void 0,
338
+ width: fill ? void 0 : imgWidth,
339
+ height: fill ? void 0 : imgHeight,
340
+ loading: imageLoading,
341
+ decoding: "async",
322
342
  sizes,
323
343
  className,
324
- background: bg,
325
344
  onLoad: handleLoad,
326
345
  onError: handleError,
327
- ref: mergedRef
346
+ style: fill ? getFillStyle(style) : style,
347
+ ...rest
328
348
  });
329
349
  }
350
+ if (isRemoteUrl(src)) {
351
+ const validation = validateRemoteUrl(src);
352
+ if (!validation.allowed) if (__isDev) console.warn(`[next/image] ${validation.reason}`);
353
+ else {
354
+ console.error(`[next/image] ${validation.reason}`);
355
+ return null;
356
+ }
357
+ const sanitizedBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : void 0;
358
+ const showBlur = !blurComplete && placeholder === "blur" && sanitizedBlur;
359
+ const blurStyle = showBlur ? {
360
+ backgroundImage: `url(${sanitizedBlur})`,
361
+ backgroundSize: "cover",
362
+ backgroundRepeat: "no-repeat",
363
+ backgroundPosition: "center"
364
+ } : void 0;
365
+ const bg = showBlur ? `url(${sanitizedBlur})` : void 0;
366
+ if (fill) {
367
+ const fillSizes = sizes ?? "100vw";
368
+ preloadImageResource({
369
+ shouldPreload,
370
+ src,
371
+ sizes: fillSizes,
372
+ fetchPriority: priorityFetchPriority
373
+ });
374
+ return /* @__PURE__ */ jsx("img", {
375
+ ref: mergedRef,
376
+ src,
377
+ alt,
378
+ loading: imageLoading,
379
+ fetchPriority: priorityFetchPriority,
380
+ decoding: "async",
381
+ sizes: fillSizes,
382
+ className,
383
+ "data-nimg": "fill",
384
+ onLoad: handleLoad,
385
+ onError: handleError,
386
+ style: getFillStyle(style, blurStyle),
387
+ ...rest
388
+ });
389
+ }
390
+ if (imgWidth && imgHeight) {
391
+ const unpicRuntimeStyleProps = { style };
392
+ preloadImageResource({
393
+ shouldPreload,
394
+ src,
395
+ sizes,
396
+ fetchPriority: priorityFetchPriority
397
+ });
398
+ return /* @__PURE__ */ jsx(Image$1, {
399
+ src,
400
+ alt,
401
+ width: imgWidth,
402
+ height: imgHeight,
403
+ layout: "constrained",
404
+ loading: imageLoading,
405
+ fetchPriority: priorityFetchPriority,
406
+ sizes,
407
+ className,
408
+ ...unpicRuntimeStyleProps,
409
+ background: bg,
410
+ onLoad: handleLoad,
411
+ onError: handleError,
412
+ ref: mergedRef
413
+ });
414
+ }
415
+ }
330
416
  const imgQuality = quality ?? 75;
331
417
  const isSvg = src.endsWith(".svg");
332
418
  const skipOptimization = _unoptimized === true || isSvg && !__dangerouslyAllowSVG;
333
419
  const srcSet = imgWidth && !fill && !skipOptimization ? generateSrcSet(src, imgWidth, imgQuality) : imgWidth && !fill ? RESPONSIVE_WIDTHS.filter((w) => w <= imgWidth * 2).map((w) => `${src} ${w}w`).join(", ") || `${src} ${imgWidth}w` : void 0;
334
420
  const optimizedSrc = skipOptimization ? src : imgWidth ? imageOptimizationUrl(src, imgWidth, imgQuality) : imageOptimizationUrl(src, RESPONSIVE_WIDTHS[0], imgQuality);
335
421
  const sanitizedLocalBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : void 0;
336
- const blurStyle = placeholder === "blur" && sanitizedLocalBlur ? {
422
+ const blurStyle = !blurComplete && placeholder === "blur" && sanitizedLocalBlur ? {
337
423
  backgroundImage: `url(${sanitizedLocalBlur})`,
338
424
  backgroundSize: "cover",
339
425
  backgroundRepeat: "no-repeat",
340
426
  backgroundPosition: "center"
341
427
  } : void 0;
428
+ const imageSizes = sizes ?? (fill ? "100vw" : void 0);
429
+ preloadImageResource({
430
+ shouldPreload,
431
+ src: optimizedSrc,
432
+ srcSet,
433
+ sizes: imageSizes,
434
+ fetchPriority: priorityFetchPriority
435
+ });
342
436
  return /* @__PURE__ */ jsx("img", {
343
437
  ref: mergedRef,
344
438
  src: optimizedSrc,
345
439
  alt,
346
440
  width: fill ? void 0 : imgWidth,
347
441
  height: fill ? void 0 : imgHeight,
348
- loading: priority ? "eager" : loading ?? "lazy",
349
- fetchPriority: priority ? "high" : void 0,
442
+ loading: imageLoading,
443
+ fetchPriority: priorityFetchPriority,
350
444
  decoding: "async",
351
445
  srcSet,
352
- sizes: sizes ?? (fill ? "100vw" : void 0),
446
+ sizes: imageSizes,
353
447
  className,
354
448
  "data-nimg": fill ? "fill" : "1",
355
449
  onLoad: handleLoad,
356
450
  onError: handleError,
357
- style: fill ? {
358
- position: "absolute",
359
- inset: 0,
360
- width: "100%",
361
- height: "100%",
362
- objectFit: "cover",
363
- ...blurStyle,
364
- ...style
365
- } : {
451
+ style: fill ? getFillStyle(style, blurStyle) : {
366
452
  ...blurStyle,
367
453
  ...style
368
454
  },
@@ -374,13 +460,14 @@ const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill
374
460
  * Returns the props that would be passed to the underlying <img> element.
375
461
  */
376
462
  function getImageProps(props) {
377
- const { src: srcProp, alt, width, height, fill, priority, quality: _quality, placeholder, blurDataURL: blurDataURLProp, loader, sizes, className, style, onLoad: _onLoad, onLoadingComplete: _onLoadingComplete, unoptimized: _unoptimized, overrideSrc: _overrideSrc, loading, ...rest } = props;
463
+ const { src: srcProp, alt, width, height, fill, preload: _preload, priority, quality: _quality, placeholder, blurDataURL: blurDataURLProp, loader, sizes, className, style, onLoad: _onLoad, onLoadingComplete: _onLoadingComplete, unoptimized: _unoptimized, overrideSrc: _overrideSrc, loading, ...rest } = props;
378
464
  const { src, width: imgWidth, height: imgHeight, blurDataURL: imgBlurDataURL } = resolveImageSource({
379
465
  src: srcProp,
380
466
  width,
381
467
  height,
382
468
  blurDataURL: blurDataURLProp
383
469
  });
470
+ const shouldPreload = _preload === true || priority === true;
384
471
  let blockedInProd = false;
385
472
  if (isRemoteUrl(src)) {
386
473
  const validation = validateRemoteUrl(src);
@@ -412,22 +499,14 @@ function getImageProps(props) {
412
499
  alt,
413
500
  width: fill ? void 0 : imgWidth,
414
501
  height: fill ? void 0 : imgHeight,
415
- loading: priority ? "eager" : loading ?? "lazy",
502
+ loading: priority ? "eager" : shouldPreload ? loading : loading ?? "lazy",
416
503
  fetchPriority: priority ? "high" : void 0,
417
504
  decoding: "async",
418
505
  srcSet,
419
506
  sizes: sizes ?? (fill ? "100vw" : void 0),
420
507
  className,
421
508
  "data-nimg": fill ? "fill" : "1",
422
- style: fill ? {
423
- position: "absolute",
424
- inset: 0,
425
- width: "100%",
426
- height: "100%",
427
- objectFit: "cover",
428
- ...blurStyle,
429
- ...style
430
- } : {
509
+ style: fill ? getFillStyle(style, blurStyle) : {
431
510
  ...blurStyle,
432
511
  ...style
433
512
  },
@@ -1 +1 @@
1
- {"version":3,"file":"image.js","names":["UnpicImage"],"sources":["../../src/shims/image.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * next/image shim\n *\n * Translates Next.js Image props to @unpic/react Image component.\n * @unpic/react auto-detects CDN from URL and uses native transforms.\n * For local images (relative paths), routes through `/_vinext/image`\n * for server-side optimization (resize, format negotiation, quality).\n *\n * Remote images are validated against `images.remotePatterns` and\n * `images.domains` from next.config.js. Unmatched URLs are blocked\n * in production and warn in development, matching Next.js behavior.\n */\nimport React, { forwardRef, useEffect, useLayoutEffect, useRef } from \"react\";\nimport { Image as UnpicImage } from \"@unpic/react\";\nimport { hasRemoteMatch, type RemotePattern } from \"./image-config.js\";\nimport { useMergedRef } from \"./use-merged-ref.js\";\n\nexport type StaticImageData = {\n src: string;\n height: number;\n width: number;\n blurDataURL?: string;\n};\n\n/**\n * Image config injected at build time via Vite define.\n * Serialized as JSON — parsed once at module level.\n */\nconst __imageRemotePatterns: RemotePattern[] = (() => {\n try {\n return JSON.parse(process.env.__VINEXT_IMAGE_REMOTE_PATTERNS ?? \"[]\");\n } catch {\n return [];\n }\n})();\nconst __imageDomains: string[] = (() => {\n try {\n return JSON.parse(process.env.__VINEXT_IMAGE_DOMAINS ?? \"[]\");\n } catch {\n return [];\n }\n})();\nconst __hasImageConfig = __imageRemotePatterns.length > 0 || __imageDomains.length > 0;\nconst __isDev = process.env.NODE_ENV !== \"production\";\nconst __imageDeviceSizes: number[] = (() => {\n try {\n return JSON.parse(\n process.env.__VINEXT_IMAGE_DEVICE_SIZES ?? \"[640,750,828,1080,1200,1920,2048,3840]\",\n );\n } catch {\n return [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\n }\n})();\n/**\n * Whether dangerouslyAllowSVG is enabled in next.config.js.\n * When false (default), .svg sources auto-skip the optimization endpoint\n * and are served directly, matching Next.js behavior.\n * When true, .svg sources are routed through the optimizer (served as-is\n * with security headers).\n */\nconst __dangerouslyAllowSVG = process.env.__VINEXT_IMAGE_DANGEROUSLY_ALLOW_SVG === \"true\";\n/**\n * Validate that a remote URL is allowed by the configured remote patterns.\n * Returns true if the URL is allowed, false otherwise.\n *\n * When no remotePatterns/domains are configured, all remote URLs are allowed\n * (backwards-compatible — user hasn't opted into restriction).\n *\n * When patterns ARE configured, only matching URLs are allowed.\n * In development, non-matching URLs produce a console warning.\n * In production, non-matching URLs are blocked (src replaced with empty string).\n */\nfunction validateRemoteUrl(src: string): { allowed: boolean; reason?: string } {\n if (!__hasImageConfig) {\n // No image config — allow everything (backwards-compatible)\n return { allowed: true };\n }\n\n let url: URL;\n try {\n url = new URL(src, \"http://n\");\n } catch {\n return { allowed: false, reason: `Invalid URL: ${src}` };\n }\n\n if (hasRemoteMatch(__imageDomains, __imageRemotePatterns, url)) {\n return { allowed: true };\n }\n\n return {\n allowed: false,\n reason: `Image URL \"${src}\" is not configured in images.remotePatterns or images.domains in next.config.js. See: https://nextjs.org/docs/messages/next-image-unconfigured-host`,\n };\n}\n\n/**\n * A version of useLayoutEffect that doesn't warn during SSR.\n * Do not rename this to \"isomorphic layout effect\". There is no such thing as\n * an isomorphic Layout Effect since there is no Layout on the server.\n * Ported from Next.js: https://github.com/vercel/next.js/pull/93209\n */\nconst useNonWarningLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\n/**\n * Create a synthetic React load event for replaying onLoad/onLoadingComplete\n * during hydration when the image already completed loading.\n *\n * This function creates a native Event(\"load\") via the DOM Event constructor\n * and must only be called in a browser context (client-side layout effect).\n * It mirrors the pattern used in Next.js `handleLoading`.\n */\nfunction createSyntheticLoadEvent(img: HTMLImageElement): React.SyntheticEvent<HTMLImageElement> {\n const nativeEvent = new Event(\"load\");\n Object.defineProperty(nativeEvent, \"target\", { writable: false, value: img });\n let prevented = false;\n let stopped = false;\n return {\n bubbles: nativeEvent.bubbles,\n cancelable: nativeEvent.cancelable,\n currentTarget: img,\n defaultPrevented: false,\n eventPhase: nativeEvent.eventPhase,\n isTrusted: false,\n nativeEvent,\n target: img,\n timeStamp: nativeEvent.timeStamp,\n type: \"load\",\n isDefaultPrevented: () => prevented,\n isPropagationStopped: () => stopped,\n persist: () => {},\n preventDefault: () => {\n prevented = true;\n nativeEvent.preventDefault();\n },\n stopPropagation: () => {\n stopped = true;\n nativeEvent.stopPropagation();\n },\n };\n}\n\ntype ImageProps = {\n src: string | StaticImageData;\n alt: string;\n width?: number;\n height?: number;\n fill?: boolean;\n priority?: boolean;\n quality?: number;\n placeholder?: \"blur\" | \"empty\";\n blurDataURL?: string;\n loader?: (params: { src: string; width: number; quality?: number }) => string;\n sizes?: string;\n className?: string;\n style?: React.CSSProperties;\n onLoad?: React.ReactEventHandler<HTMLImageElement>;\n /** @deprecated Use onLoad instead. Still supported for migration compat. */\n onLoadingComplete?: (img: HTMLImageElement) => void;\n onError?: React.ReactEventHandler<HTMLImageElement>;\n onClick?: React.MouseEventHandler<HTMLImageElement>;\n id?: string;\n // Accept and ignore Next.js-specific props that don't apply\n unoptimized?: boolean;\n overrideSrc?: string;\n loading?: \"lazy\" | \"eager\";\n};\n\n/**\n * Sanitize a blurDataURL to prevent CSS injection.\n *\n * A crafted data URL containing `)` can break out of the `url()` CSS function,\n * allowing injection of arbitrary CSS properties or rules. Characters like `{`,\n * `}`, and `\\` can also assist in crafting injection payloads.\n *\n * This validates the URL starts with `data:image/` and rejects characters that\n * could escape the `url()` context. Semicolons are allowed since they're part\n * of valid data URLs (`data:image/png;base64,...`) and harmless inside `url()`.\n *\n * Returns undefined for invalid URLs, which causes the blur placeholder to be\n * skipped gracefully.\n */\nfunction sanitizeBlurDataURL(url: string): string | undefined {\n // Must be a data: image URL\n if (!url.startsWith(\"data:image/\")) return undefined;\n // Reject characters that can break out of CSS url():\n // ) - closes url()\n // ( - could open nested functions\n // { } - CSS rule boundaries\n // \\ - CSS escape sequences\n // newlines - break CSS parsing\n if (/[)(}{\\\\'\"\\n\\r]/.test(url)) return undefined;\n return url;\n}\n\n/**\n * Determine if a src is a remote URL (CDN-optimizable) or local.\n */\nfunction isRemoteUrl(src: string): boolean {\n return src.startsWith(\"http://\") || src.startsWith(\"https://\") || src.startsWith(\"//\");\n}\n\n/**\n * Resolve src, width, height, blurDataURL from Image props (string or StaticImageData).\n * Shared by the Image component and getImageProps to keep behavior in sync.\n */\nfunction resolveImageSource(v: {\n src: string | StaticImageData;\n width?: number;\n height?: number;\n blurDataURL?: string;\n}): { src: string; width?: number; height?: number; blurDataURL?: string } {\n const src = typeof v.src === \"string\" ? v.src : v.src.src;\n const imgWidth = v.width ?? (typeof v.src === \"object\" ? v.src.width : undefined);\n const imgHeight = v.height ?? (typeof v.src === \"object\" ? v.src.height : undefined);\n const imgBlurDataURL =\n v.blurDataURL ?? (typeof v.src === \"object\" ? v.src.blurDataURL : undefined);\n return { src, width: imgWidth, height: imgHeight, blurDataURL: imgBlurDataURL };\n}\n\n/**\n * Responsive image widths matching Next.js's device sizes config.\n * These are the breakpoints used for srcSet generation.\n * Configurable via `images.deviceSizes` in next.config.js.\n */\nconst RESPONSIVE_WIDTHS = __imageDeviceSizes;\n\n/**\n * Build a `/_vinext/image` optimization URL.\n *\n * In production (Cloudflare Workers), the worker intercepts this path and uses\n * the Images binding to resize/transcode on the fly. In dev, the Vite dev\n * server handles it as a passthrough (serves the original file).\n */\nexport function imageOptimizationUrl(src: string, width: number, quality: number = 75): string {\n return `/_vinext/image?url=${encodeURIComponent(src)}&w=${width}&q=${quality}`;\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * Each width points to the `/_vinext/image` optimization endpoint so the\n * server can resize and transcode the image. Only includes widths that are\n * <= 2x the original image width to avoid pointless upscaling.\n */\nfunction generateSrcSet(src: string, originalWidth: number, quality: number = 75): string {\n const widths = RESPONSIVE_WIDTHS.filter((w) => w <= originalWidth * 2);\n if (widths.length === 0)\n return `${imageOptimizationUrl(src, originalWidth, quality)} ${originalWidth}w`;\n return widths.map((w) => `${imageOptimizationUrl(src, w, quality)} ${w}w`).join(\", \");\n}\n\nconst Image = forwardRef<HTMLImageElement, ImageProps>(function Image(\n {\n src: srcProp,\n alt,\n width,\n height,\n fill,\n priority,\n quality,\n placeholder,\n blurDataURL,\n loader,\n sizes,\n className,\n style,\n onLoad,\n onLoadingComplete,\n onError,\n unoptimized: _unoptimized,\n overrideSrc: _overrideSrc,\n loading,\n ...rest\n },\n ref,\n) {\n // Dedup refs: ensure onLoad and onError fire at most once per src per mount.\n // Matches Next.js behavior — prevents double-firing from React re-renders,\n // strict-mode double-invocation, or state updates inside the handler itself.\n // Ported from Next.js: https://github.com/vercel/next.js/pull/93209\n const lastLoadedSrcRef = useRef<string | undefined>(undefined);\n const lastErrorSrcRef = useRef<string | undefined>(undefined);\n\n // Hydration-level onError replay: when an image fails to load during SSR\n // streaming or initial HTML parse (before React hydrates), the native browser\n // error event is lost. Re-trigger it via `img.src = img.src` in a layout\n // effect once hydration completes, mirroring the upstream Next.js fix.\n // Ported from Next.js: https://github.com/vercel/next.js/pull/93209\n const didInsertRef = useRef(false);\n const imgElementRef = useRef<HTMLImageElement | null>(null);\n\n // Merge forwarded ref with internal img ref for layout effect access.\n const mergedRef = useMergedRef(ref, imgElementRef);\n\n // Stable refs for onLoad / onError / onLoadingComplete so the layout effect\n // does not re-run (and re-assign img.src) when handler identity changes.\n // Ported from Next.js: https://github.com/vercel/next.js/pull/93209\n //\n // IMPORTANT: The useRef+useEffect sync pattern has a subtle timing gap:\n // during the first render, onLoadRef.current holds the initial value from\n // useRef(onLoad), and the useEffect to sync it runs AFTER the layout effect.\n // This means on first mount the layout effect reads the correct initial\n // value (passed to useRef). If someone changes useRef(onLoad) to\n // useRef(undefined), the layout effect would read undefined on first mount.\n const onLoadRef = useRef(onLoad);\n useEffect(() => {\n onLoadRef.current = onLoad;\n }, [onLoad]);\n const onErrorRef = useRef(onError);\n useEffect(() => {\n onErrorRef.current = onError;\n }, [onError]);\n const onLoadingCompleteRef = useRef(onLoadingComplete);\n useEffect(() => {\n onLoadingCompleteRef.current = onLoadingComplete;\n }, [onLoadingComplete]);\n\n const {\n src,\n width: imgWidth,\n height: imgHeight,\n blurDataURL: imgBlurDataURL,\n } = resolveImageSource({ src: srcProp, width, height, blurDataURL });\n\n useNonWarningLayoutEffect(() => {\n if (!didInsertRef.current && imgElementRef.current !== null) {\n const img = imgElementRef.current;\n // Replay error events lost during SSR/hydration.\n if (onErrorRef.current) {\n // eslint-disable-next-line no-self-assign\n img.src = img.src;\n }\n // Replay onLoad for images that completed loading before React hydrated\n // (e.g. SSR streaming where the image arrives and renders before hydration\n // finishes). Without this, onLoad never fires for those images.\n //\n // img.complete is true for both successfully-loaded and errored images\n // (the HTML spec defines complete as true when the browser finished\n // fetching, regardless of outcome). We must check naturalWidth > 0 to\n // distinguish success from error — a failed image has naturalWidth === 0.\n // Ported from Next.js: https://github.com/vercel/next.js/pull/93209\n if (img.complete && img.naturalWidth > 0) {\n const currentOnLoad = onLoadRef.current;\n const currentOnLoadingComplete = onLoadingCompleteRef.current;\n if (currentOnLoad || currentOnLoadingComplete) {\n // Dedup — fire at most once per src per mount, matching onLoad dedup\n if (lastLoadedSrcRef.current !== src) {\n lastLoadedSrcRef.current = src;\n // Create a synthetic React event with the expected shape.\n // next/image uses a similar pattern in `handleLoading`.\n const syntheticEvent = createSyntheticLoadEvent(img);\n currentOnLoad?.(syntheticEvent);\n currentOnLoadingComplete?.(img);\n }\n }\n }\n didInsertRef.current = true;\n }\n }, [placeholder, sizes, _unoptimized]);\n\n // Wire onLoadingComplete (deprecated) into onLoad — matches Next.js behavior.\n // onLoad fires first, then onLoadingComplete receives the HTMLImageElement.\n const handleLoad = onLoadingComplete\n ? (e: React.SyntheticEvent<HTMLImageElement>) => {\n if (lastLoadedSrcRef.current === src) return;\n lastLoadedSrcRef.current = src;\n onLoad?.(e);\n onLoadingComplete(e.currentTarget);\n }\n : onLoad\n ? (e: React.SyntheticEvent<HTMLImageElement>) => {\n if (lastLoadedSrcRef.current === src) return;\n lastLoadedSrcRef.current = src;\n onLoad(e);\n }\n : undefined;\n\n const handleError = onError\n ? (e: React.SyntheticEvent<HTMLImageElement>) => {\n if (lastErrorSrcRef.current === src) return;\n lastErrorSrcRef.current = src;\n onError(e);\n }\n : undefined;\n\n // If a custom loader is provided, use basic img with loader URL\n if (loader) {\n const resolvedSrc = loader({ src, width: imgWidth ?? 0, quality: quality ?? 75 });\n return (\n <img\n ref={mergedRef}\n src={resolvedSrc}\n alt={alt}\n width={fill ? undefined : imgWidth}\n height={fill ? undefined : imgHeight}\n loading={priority ? \"eager\" : (loading ?? \"lazy\")}\n decoding=\"async\"\n sizes={sizes}\n className={className}\n onLoad={handleLoad}\n onError={handleError}\n style={\n fill\n ? {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n ...style,\n }\n : style\n }\n {...rest}\n />\n );\n }\n\n // For remote URLs, validate against remotePatterns then use @unpic/react\n if (isRemoteUrl(src)) {\n const validation = validateRemoteUrl(src);\n if (!validation.allowed) {\n if (__isDev) {\n console.warn(`[next/image] ${validation.reason}`);\n // In dev, render the image but with a warning — matches Next.js dev behavior\n } else {\n // In production, block the image entirely\n console.error(`[next/image] ${validation.reason}`);\n return null;\n }\n }\n\n const sanitizedBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const bg = placeholder === \"blur\" && sanitizedBlur ? `url(${sanitizedBlur})` : undefined;\n\n if (fill) {\n return (\n <UnpicImage\n src={src}\n alt={alt}\n layout=\"fullWidth\"\n // `priority` is a Next.js concept — translate it to HTML attributes so\n // it is never forwarded to the DOM as a non-boolean attribute, which\n // would trigger React's \"Received `true` for a non-boolean attribute\"\n // warning.\n loading={priority ? \"eager\" : (loading ?? \"lazy\")}\n fetchPriority={priority ? \"high\" : undefined}\n sizes={sizes}\n className={className}\n background={bg}\n onLoad={handleLoad}\n onError={handleError}\n ref={mergedRef}\n />\n );\n }\n // constrained layout requires width+height or aspectRatio\n if (imgWidth && imgHeight) {\n return (\n <UnpicImage\n src={src}\n alt={alt}\n width={imgWidth}\n height={imgHeight}\n layout=\"constrained\"\n // Same translation as above — never pass `priority` to the DOM.\n loading={priority ? \"eager\" : (loading ?? \"lazy\")}\n fetchPriority={priority ? \"high\" : undefined}\n sizes={sizes}\n className={className}\n background={bg}\n onLoad={handleLoad}\n onError={handleError}\n ref={mergedRef}\n />\n );\n }\n // Fall through to basic <img> if dimensions not provided\n // (unpic requires them for constrained layout)\n }\n\n // Route local images through the /_vinext/image optimization endpoint.\n // In production on Cloudflare Workers, this resizes and transcodes via\n // the Images binding. In dev, it serves the original file as a passthrough.\n // When `unoptimized` is true, bypass the endpoint entirely (Next.js compat).\n // SVG sources auto-skip unless dangerouslyAllowSVG is enabled, matching\n // Next.js behavior where .svg triggers unoptimized=true by default.\n const imgQuality = quality ?? 75;\n const isSvg = src.endsWith(\".svg\");\n const skipOptimization = _unoptimized === true || (isSvg && !__dangerouslyAllowSVG);\n\n // Build srcSet for responsive local images (common breakpoints).\n // Each entry points to /_vinext/image with the appropriate width.\n const srcSet =\n imgWidth && !fill && !skipOptimization\n ? generateSrcSet(src, imgWidth, imgQuality)\n : imgWidth && !fill\n ? RESPONSIVE_WIDTHS.filter((w) => w <= imgWidth * 2)\n .map((w) => `${src} ${w}w`)\n .join(\", \") || `${src} ${imgWidth}w`\n : undefined;\n\n // The main `src` also goes through the optimization endpoint. Use the\n // declared width (or the first responsive width as fallback).\n const optimizedSrc = skipOptimization\n ? src\n : imgWidth\n ? imageOptimizationUrl(src, imgWidth, imgQuality)\n : imageOptimizationUrl(src, RESPONSIVE_WIDTHS[0], imgQuality);\n\n // Blur placeholder: show a low-quality background while the image loads.\n // Sanitize blurDataURL to prevent CSS injection via crafted data URLs.\n const sanitizedLocalBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const blurStyle =\n placeholder === \"blur\" && sanitizedLocalBlur\n ? {\n backgroundImage: `url(${sanitizedLocalBlur})`,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: \"center\",\n }\n : undefined;\n\n // For local images, render a standard <img> tag with srcSet and blur support.\n // The src and srcSet point to the /_vinext/image optimization endpoint.\n return (\n <img\n ref={mergedRef}\n src={optimizedSrc}\n alt={alt}\n width={fill ? undefined : imgWidth}\n height={fill ? undefined : imgHeight}\n loading={priority ? \"eager\" : (loading ?? \"lazy\")}\n fetchPriority={priority ? \"high\" : undefined}\n decoding=\"async\"\n srcSet={srcSet}\n sizes={sizes ?? (fill ? \"100vw\" : undefined)}\n className={className}\n data-nimg={fill ? \"fill\" : \"1\"}\n onLoad={handleLoad}\n onError={handleError}\n style={\n fill\n ? {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n ...blurStyle,\n ...style,\n }\n : { ...blurStyle, ...style }\n }\n {...rest}\n />\n );\n});\n\n/**\n * getImageProps — for advanced use cases (picture elements, background images).\n * Returns the props that would be passed to the underlying <img> element.\n */\nexport function getImageProps(props: ImageProps): {\n props: React.ImgHTMLAttributes<HTMLImageElement>;\n} {\n const {\n src: srcProp,\n alt,\n width,\n height,\n fill,\n priority,\n quality: _quality,\n placeholder,\n blurDataURL: blurDataURLProp,\n loader,\n sizes,\n className,\n style,\n onLoad: _onLoad,\n onLoadingComplete: _onLoadingComplete,\n unoptimized: _unoptimized,\n overrideSrc: _overrideSrc,\n loading,\n ...rest\n } = props;\n\n const {\n src,\n width: imgWidth,\n height: imgHeight,\n blurDataURL: imgBlurDataURL,\n } = resolveImageSource({ src: srcProp, width, height, blurDataURL: blurDataURLProp });\n\n // Validate remote URLs against configured patterns\n let blockedInProd = false;\n if (isRemoteUrl(src)) {\n const validation = validateRemoteUrl(src);\n if (!validation.allowed) {\n if (__isDev) {\n console.warn(`[next/image] ${validation.reason}`);\n } else {\n console.error(`[next/image] ${validation.reason}`);\n blockedInProd = true;\n }\n }\n }\n\n // Resolve src through custom loader if provided\n const imgQuality = _quality ?? 75;\n const resolvedSrc = blockedInProd\n ? \"\"\n : loader\n ? loader({ src, width: imgWidth ?? 0, quality: imgQuality })\n : src;\n\n // For local images (no loader, not remote), route through optimization endpoint.\n // When `unoptimized` is true, bypass the endpoint entirely (Next.js compat).\n // SVG sources auto-skip unless dangerouslyAllowSVG is enabled.\n const isSvg = resolvedSrc.endsWith(\".svg\");\n const skipOpt =\n _unoptimized === true ||\n (isSvg && !__dangerouslyAllowSVG) ||\n blockedInProd ||\n !!loader ||\n isRemoteUrl(resolvedSrc);\n const optimizedSrc = skipOpt\n ? resolvedSrc\n : imgWidth\n ? imageOptimizationUrl(resolvedSrc, imgWidth, imgQuality)\n : imageOptimizationUrl(resolvedSrc, RESPONSIVE_WIDTHS[0], imgQuality);\n\n // Build srcSet for local images — each width points to /_vinext/image\n const srcSet =\n imgWidth && !fill && !isRemoteUrl(resolvedSrc) && !loader && !skipOpt\n ? generateSrcSet(resolvedSrc, imgWidth, imgQuality)\n : undefined;\n\n // Blur placeholder styles — sanitize to prevent CSS injection\n const sanitizedBlurURL = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const blurStyle =\n placeholder === \"blur\" && sanitizedBlurURL\n ? {\n backgroundImage: `url(${sanitizedBlurURL})`,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\" as const,\n backgroundPosition: \"center\" as const,\n }\n : undefined;\n\n return {\n props: {\n src: optimizedSrc,\n alt,\n width: fill ? undefined : imgWidth,\n height: fill ? undefined : imgHeight,\n loading: priority ? \"eager\" : (loading ?? \"lazy\"),\n fetchPriority: priority ? (\"high\" as const) : undefined,\n decoding: \"async\" as const,\n srcSet,\n sizes: sizes ?? (fill ? \"100vw\" : undefined),\n className,\n \"data-nimg\": fill ? \"fill\" : \"1\",\n style: fill\n ? {\n position: \"absolute\" as const,\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\" as const,\n ...blurStyle,\n ...style,\n }\n : { ...blurStyle, ...style },\n ...rest,\n } as React.ImgHTMLAttributes<HTMLImageElement>,\n };\n}\n\nexport default Image;\n"],"mappings":"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"}
1
+ {"version":3,"file":"image.js","names":["UnpicImage"],"sources":["../../src/shims/image.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * next/image shim\n *\n * Translates Next.js Image props to @unpic/react Image component.\n * @unpic/react auto-detects CDN from URL and uses native transforms.\n * For local images (relative paths), routes through `/_vinext/image`\n * for server-side optimization (resize, format negotiation, quality).\n *\n * Remote images are validated against `images.remotePatterns` and\n * `images.domains` from next.config.js. Unmatched URLs are blocked\n * in production and warn in development, matching Next.js behavior.\n */\nimport React, { forwardRef, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { Image as UnpicImage } from \"@unpic/react\";\nimport { hasRemoteMatch, isPrivateIp, type RemotePattern } from \"./image-config.js\";\nimport { useMergedRef } from \"./use-merged-ref.js\";\n\nexport type StaticImageData = {\n src: string;\n height: number;\n width: number;\n blurDataURL?: string;\n};\n\n/**\n * Image config injected at build time via Vite define.\n * Serialized as JSON — parsed once at module level.\n */\nconst __imageRemotePatterns: RemotePattern[] = (() => {\n try {\n return JSON.parse(process.env.__VINEXT_IMAGE_REMOTE_PATTERNS ?? \"[]\");\n } catch {\n return [];\n }\n})();\nconst __imageDomains: string[] = (() => {\n try {\n return JSON.parse(process.env.__VINEXT_IMAGE_DOMAINS ?? \"[]\");\n } catch {\n return [];\n }\n})();\nconst __hasImageConfig = __imageRemotePatterns.length > 0 || __imageDomains.length > 0;\nconst __isDev = process.env.NODE_ENV !== \"production\";\nconst __imageDeviceSizes: number[] = (() => {\n try {\n return JSON.parse(\n process.env.__VINEXT_IMAGE_DEVICE_SIZES ?? \"[640,750,828,1080,1200,1920,2048,3840]\",\n );\n } catch {\n return [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\n }\n})();\n/**\n * Whether dangerouslyAllowSVG is enabled in next.config.js.\n * When false (default), .svg sources auto-skip the optimization endpoint\n * and are served directly, matching Next.js behavior.\n * When true, .svg sources are routed through the optimizer (served as-is\n * with security headers).\n */\nconst __dangerouslyAllowSVG = process.env.__VINEXT_IMAGE_DANGEROUSLY_ALLOW_SVG === \"true\";\n/**\n * Whether dangerouslyAllowLocalIP is enabled in next.config.js.\n * When false (default), remote image URLs with literal private-IP hostnames\n * are blocked to mitigate SSRF risk.\n */\nconst __dangerouslyAllowLocalIP = process.env.__VINEXT_IMAGE_DANGEROUSLY_ALLOW_LOCAL_IP === \"true\";\n\n/**\n * Validate that a remote URL is allowed by the configured remote patterns.\n * Returns true if the URL is allowed, false otherwise.\n *\n * When no remotePatterns/domains are configured, all remote URLs are allowed\n * (backwards-compatible — user hasn't opted into restriction).\n *\n * When patterns ARE configured, only matching URLs are allowed.\n * In development, non-matching URLs produce a console warning.\n * In production, non-matching URLs are blocked (src replaced with empty string).\n *\n * Private-IP hostnames are additionally rejected unless dangerouslyAllowLocalIP\n * is set, mirroring Next.js's fetchExternalImage guard.\n */\nfunction validateRemoteUrl(src: string): { allowed: boolean; reason?: string } {\n let url: URL;\n try {\n url = new URL(src, \"http://n\");\n } catch {\n return { allowed: false, reason: `Invalid URL: ${src}` };\n }\n\n if (!__dangerouslyAllowLocalIP && isPrivateIp(url.hostname)) {\n // Best-effort guard for literal-IP hostnames only. Domain names resolving\n // to private IPs cannot be caught without server-side DNS resolution.\n // See: Next.js fetchExternalImage in packages/next/src/server/image-optimizer.ts\n return {\n allowed: false,\n reason: `Image URL \"${src}\" resolved to private IP. If this is expected and you understand SSRF risk, use images.dangerouslyAllowLocalIP = true to continue.`,\n };\n }\n\n if (!__hasImageConfig) {\n // No image config — allow everything (backwards-compatible)\n return { allowed: true };\n }\n\n if (hasRemoteMatch(__imageDomains, __imageRemotePatterns, url)) {\n return { allowed: true };\n }\n\n return {\n allowed: false,\n reason: `Image URL \"${src}\" is not configured in images.remotePatterns or images.domains in next.config.js. See: https://nextjs.org/docs/messages/next-image-unconfigured-host`,\n };\n}\n\n/**\n * A version of useLayoutEffect that doesn't warn during SSR.\n * Do not rename this to \"isomorphic layout effect\". There is no such thing as\n * an isomorphic Layout Effect since there is no Layout on the server.\n * Ported from Next.js: https://github.com/vercel/next.js/pull/93209\n */\nconst useNonWarningLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\n/**\n * Create a synthetic React load event for replaying onLoad/onLoadingComplete\n * during hydration when the image already completed loading.\n *\n * This function creates a native Event(\"load\") via the DOM Event constructor\n * and must only be called in a browser context (client-side layout effect).\n * It mirrors the pattern used in Next.js `handleLoading`.\n */\nfunction createSyntheticLoadEvent(img: HTMLImageElement): React.SyntheticEvent<HTMLImageElement> {\n const nativeEvent = new Event(\"load\");\n Object.defineProperty(nativeEvent, \"target\", { writable: false, value: img });\n let prevented = false;\n let stopped = false;\n return {\n bubbles: nativeEvent.bubbles,\n cancelable: nativeEvent.cancelable,\n currentTarget: img,\n defaultPrevented: false,\n eventPhase: nativeEvent.eventPhase,\n isTrusted: false,\n nativeEvent,\n target: img,\n timeStamp: nativeEvent.timeStamp,\n type: \"load\",\n isDefaultPrevented: () => prevented,\n isPropagationStopped: () => stopped,\n persist: () => {},\n preventDefault: () => {\n prevented = true;\n nativeEvent.preventDefault();\n },\n stopPropagation: () => {\n stopped = true;\n nativeEvent.stopPropagation();\n },\n };\n}\n\ntype ImageProps = {\n src: string | StaticImageData;\n alt: string;\n width?: number;\n height?: number;\n fill?: boolean;\n preload?: boolean;\n priority?: boolean;\n quality?: number;\n placeholder?: \"blur\" | \"empty\";\n blurDataURL?: string;\n loader?: (params: { src: string; width: number; quality?: number }) => string;\n sizes?: string;\n className?: string;\n style?: React.CSSProperties;\n onLoad?: React.ReactEventHandler<HTMLImageElement>;\n /** @deprecated Use onLoad instead. Still supported for migration compat. */\n onLoadingComplete?: (img: HTMLImageElement) => void;\n onError?: React.ReactEventHandler<HTMLImageElement>;\n onClick?: React.MouseEventHandler<HTMLImageElement>;\n id?: string;\n // Accept and ignore Next.js-specific props that don't apply\n unoptimized?: boolean;\n overrideSrc?: string;\n loading?: \"lazy\" | \"eager\";\n};\n\n/**\n * Sanitize a blurDataURL to prevent CSS injection.\n *\n * A crafted data URL containing `)` can break out of the `url()` CSS function,\n * allowing injection of arbitrary CSS properties or rules. Characters like `{`,\n * `}`, and `\\` can also assist in crafting injection payloads.\n *\n * This validates the URL starts with `data:image/` and rejects characters that\n * could escape the `url()` context. Semicolons are allowed since they're part\n * of valid data URLs (`data:image/png;base64,...`) and harmless inside `url()`.\n *\n * Returns undefined for invalid URLs, which causes the blur placeholder to be\n * skipped gracefully.\n */\nfunction sanitizeBlurDataURL(url: string): string | undefined {\n // Must be a data: image URL\n if (!url.startsWith(\"data:image/\")) return undefined;\n // Reject characters that can break out of CSS url():\n // ) - closes url()\n // ( - could open nested functions\n // { } - CSS rule boundaries\n // \\ - CSS escape sequences\n // newlines - break CSS parsing\n if (/[)(}{\\\\'\"\\n\\r]/.test(url)) return undefined;\n return url;\n}\n\n/**\n * Determine if a src is a remote URL (CDN-optimizable) or local.\n */\nfunction isRemoteUrl(src: string): boolean {\n return src.startsWith(\"http://\") || src.startsWith(\"https://\") || src.startsWith(\"//\");\n}\n\nfunction getFillStyle(\n style?: React.CSSProperties,\n backgroundStyle?: React.CSSProperties,\n): React.CSSProperties {\n return {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n ...backgroundStyle,\n ...style,\n };\n}\n\n/**\n * Resolve src, width, height, blurDataURL from Image props (string or StaticImageData).\n * Shared by the Image component and getImageProps to keep behavior in sync.\n */\nfunction resolveImageSource(v: {\n src: string | StaticImageData;\n width?: number;\n height?: number;\n blurDataURL?: string;\n}): { src: string; width?: number; height?: number; blurDataURL?: string } {\n const src = typeof v.src === \"string\" ? v.src : v.src.src;\n const imgWidth = v.width ?? (typeof v.src === \"object\" ? v.src.width : undefined);\n const imgHeight = v.height ?? (typeof v.src === \"object\" ? v.src.height : undefined);\n const imgBlurDataURL =\n v.blurDataURL ?? (typeof v.src === \"object\" ? v.src.blurDataURL : undefined);\n return { src, width: imgWidth, height: imgHeight, blurDataURL: imgBlurDataURL };\n}\n\n/**\n * Responsive image widths matching Next.js's device sizes config.\n * These are the breakpoints used for srcSet generation.\n * Configurable via `images.deviceSizes` in next.config.js.\n */\nconst RESPONSIVE_WIDTHS = __imageDeviceSizes;\n\n/**\n * Build a `/_vinext/image` optimization URL.\n *\n * In production (Cloudflare Workers), the worker intercepts this path and uses\n * the Images binding to resize/transcode on the fly. In dev, the Vite dev\n * server handles it as a passthrough (serves the original file).\n */\nexport function imageOptimizationUrl(src: string, width: number, quality: number = 75): string {\n return `/_vinext/image?url=${encodeURIComponent(src)}&w=${width}&q=${quality}`;\n}\n\nfunction preloadImageResource(input: {\n shouldPreload: boolean;\n src: string;\n srcSet?: string;\n sizes?: string;\n fetchPriority?: ReactDOM.PreloadOptions[\"fetchPriority\"];\n}): void {\n if (!input.shouldPreload) return;\n if (typeof ReactDOM.preload !== \"function\") return;\n ReactDOM.preload(input.src, {\n as: \"image\",\n imageSrcSet: input.srcSet,\n imageSizes: input.sizes,\n fetchPriority: input.fetchPriority,\n });\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * Each width points to the `/_vinext/image` optimization endpoint so the\n * server can resize and transcode the image. Only includes widths that are\n * <= 2x the original image width to avoid pointless upscaling.\n */\nfunction generateSrcSet(src: string, originalWidth: number, quality: number = 75): string {\n const widths = RESPONSIVE_WIDTHS.filter((w) => w <= originalWidth * 2);\n if (widths.length === 0)\n return `${imageOptimizationUrl(src, originalWidth, quality)} ${originalWidth}w`;\n return widths.map((w) => `${imageOptimizationUrl(src, w, quality)} ${w}w`).join(\", \");\n}\n\nconst Image = forwardRef<HTMLImageElement, ImageProps>(function Image(\n {\n src: srcProp,\n alt,\n width,\n height,\n fill,\n preload,\n priority,\n quality,\n placeholder,\n blurDataURL,\n loader,\n sizes,\n className,\n style,\n onLoad,\n onLoadingComplete,\n onError,\n unoptimized: _unoptimized,\n overrideSrc: _overrideSrc,\n loading,\n ...rest\n },\n ref,\n) {\n // Dedup refs: ensure onLoad and onError fire at most once per src per mount.\n // Matches Next.js behavior — prevents double-firing from React re-renders,\n // strict-mode double-invocation, or state updates inside the handler itself.\n // Ported from Next.js: https://github.com/vercel/next.js/pull/93209\n const lastLoadedSrcRef = useRef<string | undefined>(undefined);\n const lastErrorSrcRef = useRef<string | undefined>(undefined);\n\n // Hydration-level onError replay: when an image fails to load during SSR\n // streaming or initial HTML parse (before React hydrates), the native browser\n // error event is lost. Re-trigger it via `img.src = img.src` in a layout\n // effect once hydration completes, mirroring the upstream Next.js fix.\n // Ported from Next.js: https://github.com/vercel/next.js/pull/93209\n const didInsertRef = useRef(false);\n const imgElementRef = useRef<HTMLImageElement | null>(null);\n\n // Merge forwarded ref with internal img ref for layout effect access.\n const mergedRef = useMergedRef(ref, imgElementRef);\n\n // Stable refs for onLoad / onError / onLoadingComplete so the layout effect\n // does not re-run (and re-assign img.src) when handler identity changes.\n // Ported from Next.js: https://github.com/vercel/next.js/pull/93209\n //\n // IMPORTANT: The useRef+useEffect sync pattern has a subtle timing gap:\n // during the first render, onLoadRef.current holds the initial value from\n // useRef(onLoad), and the useEffect to sync it runs AFTER the layout effect.\n // This means on first mount the layout effect reads the correct initial\n // value (passed to useRef). If someone changes useRef(onLoad) to\n // useRef(undefined), the layout effect would read undefined on first mount.\n const onLoadRef = useRef(onLoad);\n useEffect(() => {\n onLoadRef.current = onLoad;\n }, [onLoad]);\n const onErrorRef = useRef(onError);\n useEffect(() => {\n onErrorRef.current = onError;\n }, [onError]);\n const onLoadingCompleteRef = useRef(onLoadingComplete);\n useEffect(() => {\n onLoadingCompleteRef.current = onLoadingComplete;\n }, [onLoadingComplete]);\n\n const {\n src,\n width: imgWidth,\n height: imgHeight,\n blurDataURL: imgBlurDataURL,\n } = resolveImageSource({ src: srcProp, width, height, blurDataURL });\n const shouldPreload = preload === true || priority === true;\n const priorityFetchPriority = priority ? \"high\" : undefined;\n const imageLoading = priority ? \"eager\" : shouldPreload ? loading : (loading ?? \"lazy\");\n\n const [completedBlurSrc, setCompletedBlurSrc] = useState<string | undefined>(undefined);\n const blurComplete = completedBlurSrc === src;\n\n const markBlurComplete = () => {\n if (placeholder !== \"blur\") return;\n setCompletedBlurSrc((current) => (current === src ? current : src));\n };\n\n useNonWarningLayoutEffect(() => {\n if (!didInsertRef.current && imgElementRef.current !== null) {\n const img = imgElementRef.current;\n // Replay error events lost during SSR/hydration.\n if (onErrorRef.current) {\n // eslint-disable-next-line no-self-assign\n img.src = img.src;\n }\n // Replay onLoad for images that completed loading before React hydrated\n // (e.g. SSR streaming where the image arrives and renders before hydration\n // finishes). Without this, onLoad never fires for those images.\n //\n // img.complete is true for both successfully-loaded and errored images\n // (the HTML spec defines complete as true when the browser finished\n // fetching, regardless of outcome). We must check naturalWidth > 0 to\n // distinguish success from error — a failed image has naturalWidth === 0.\n // Ported from Next.js: https://github.com/vercel/next.js/pull/93209\n if (img.complete && img.naturalWidth > 0) {\n markBlurComplete();\n const currentOnLoad = onLoadRef.current;\n const currentOnLoadingComplete = onLoadingCompleteRef.current;\n if (currentOnLoad || currentOnLoadingComplete) {\n // Dedup — fire at most once per src per mount, matching onLoad dedup\n if (lastLoadedSrcRef.current !== src) {\n lastLoadedSrcRef.current = src;\n // Create a synthetic React event with the expected shape.\n // next/image uses a similar pattern in `handleLoading`.\n const syntheticEvent = createSyntheticLoadEvent(img);\n currentOnLoad?.(syntheticEvent);\n currentOnLoadingComplete?.(img);\n }\n }\n }\n didInsertRef.current = true;\n }\n }, [placeholder, sizes, _unoptimized]);\n\n // Wire onLoadingComplete (deprecated) into onLoad — matches Next.js behavior.\n // onLoad fires first, then onLoadingComplete receives the HTMLImageElement.\n const handleLoad = onLoadingComplete\n ? (e: React.SyntheticEvent<HTMLImageElement>) => {\n if (lastLoadedSrcRef.current === src) return;\n lastLoadedSrcRef.current = src;\n markBlurComplete();\n onLoad?.(e);\n onLoadingComplete(e.currentTarget);\n }\n : onLoad\n ? (e: React.SyntheticEvent<HTMLImageElement>) => {\n if (lastLoadedSrcRef.current === src) return;\n lastLoadedSrcRef.current = src;\n markBlurComplete();\n onLoad(e);\n }\n : placeholder === \"blur\"\n ? () => {\n if (lastLoadedSrcRef.current === src) return;\n lastLoadedSrcRef.current = src;\n markBlurComplete();\n }\n : undefined;\n\n const handleError = onError\n ? (e: React.SyntheticEvent<HTMLImageElement>) => {\n if (lastErrorSrcRef.current === src) return;\n lastErrorSrcRef.current = src;\n markBlurComplete();\n onError(e);\n }\n : placeholder === \"blur\"\n ? () => {\n if (lastErrorSrcRef.current === src) return;\n lastErrorSrcRef.current = src;\n markBlurComplete();\n }\n : undefined;\n\n // If a custom loader is provided, use basic img with loader URL\n if (loader) {\n const resolvedSrc = loader({ src, width: imgWidth ?? 0, quality: quality ?? 75 });\n preloadImageResource({\n shouldPreload,\n src: resolvedSrc,\n sizes,\n fetchPriority: priorityFetchPriority,\n });\n return (\n <img\n ref={mergedRef}\n src={resolvedSrc}\n alt={alt}\n width={fill ? undefined : imgWidth}\n height={fill ? undefined : imgHeight}\n loading={imageLoading}\n decoding=\"async\"\n sizes={sizes}\n className={className}\n onLoad={handleLoad}\n onError={handleError}\n style={fill ? getFillStyle(style) : style}\n {...rest}\n />\n );\n }\n\n // For remote URLs, validate against remotePatterns. Non-fill images use\n // @unpic/react for CDN URL transforms; fill uses a plain img so the DOM\n // element keeps Next.js's absolute-positioned fill contract.\n if (isRemoteUrl(src)) {\n const validation = validateRemoteUrl(src);\n if (!validation.allowed) {\n if (__isDev) {\n console.warn(`[next/image] ${validation.reason}`);\n // In dev, render the image but with a warning — matches Next.js dev behavior\n } else {\n // In production, block the image entirely\n console.error(`[next/image] ${validation.reason}`);\n return null;\n }\n }\n\n const sanitizedBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const showBlur = !blurComplete && placeholder === \"blur\" && sanitizedBlur;\n const blurStyle = showBlur\n ? {\n backgroundImage: `url(${sanitizedBlur})`,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: \"center\",\n }\n : undefined;\n const bg = showBlur ? `url(${sanitizedBlur})` : undefined;\n\n if (fill) {\n const fillSizes = sizes ?? \"100vw\";\n preloadImageResource({\n shouldPreload,\n src,\n sizes: fillSizes,\n fetchPriority: priorityFetchPriority,\n });\n return (\n <img\n ref={mergedRef}\n src={src}\n alt={alt}\n // `priority` is a Next.js concept — translate it to HTML attributes so\n // it is never forwarded to the DOM as a non-boolean attribute, which\n // would trigger React's \"Received `true` for a non-boolean attribute\"\n // warning.\n loading={imageLoading}\n fetchPriority={priorityFetchPriority}\n decoding=\"async\"\n sizes={fillSizes}\n className={className}\n data-nimg=\"fill\"\n onLoad={handleLoad}\n onError={handleError}\n style={getFillStyle(style, blurStyle)}\n {...rest}\n />\n );\n }\n // constrained layout requires width+height or aspectRatio\n if (imgWidth && imgHeight) {\n // @unpic/react forwards additional image props through transformProps and\n // merges `style` with generated layout styles at runtime, but its public\n // React type omits `style`.\n const unpicRuntimeStyleProps: { style?: React.CSSProperties } = { style };\n preloadImageResource({\n shouldPreload,\n src,\n sizes,\n fetchPriority: priorityFetchPriority,\n });\n return (\n <UnpicImage\n src={src}\n alt={alt}\n width={imgWidth}\n height={imgHeight}\n layout=\"constrained\"\n // Same translation as above — never pass `priority` to the DOM.\n loading={imageLoading}\n fetchPriority={priorityFetchPriority}\n sizes={sizes}\n className={className}\n {...unpicRuntimeStyleProps}\n background={bg}\n onLoad={handleLoad}\n onError={handleError}\n ref={mergedRef}\n />\n );\n }\n // Fall through to basic <img> if dimensions not provided\n // (unpic requires them for constrained layout)\n }\n\n // Route local images through the /_vinext/image optimization endpoint.\n // In production on Cloudflare Workers, this resizes and transcodes via\n // the Images binding. In dev, it serves the original file as a passthrough.\n // When `unoptimized` is true, bypass the endpoint entirely (Next.js compat).\n // SVG sources auto-skip unless dangerouslyAllowSVG is enabled, matching\n // Next.js behavior where .svg triggers unoptimized=true by default.\n const imgQuality = quality ?? 75;\n const isSvg = src.endsWith(\".svg\");\n const skipOptimization = _unoptimized === true || (isSvg && !__dangerouslyAllowSVG);\n\n // Build srcSet for responsive local images (common breakpoints).\n // Each entry points to /_vinext/image with the appropriate width.\n const srcSet =\n imgWidth && !fill && !skipOptimization\n ? generateSrcSet(src, imgWidth, imgQuality)\n : imgWidth && !fill\n ? RESPONSIVE_WIDTHS.filter((w) => w <= imgWidth * 2)\n .map((w) => `${src} ${w}w`)\n .join(\", \") || `${src} ${imgWidth}w`\n : undefined;\n\n // The main `src` also goes through the optimization endpoint. Use the\n // declared width (or the first responsive width as fallback).\n const optimizedSrc = skipOptimization\n ? src\n : imgWidth\n ? imageOptimizationUrl(src, imgWidth, imgQuality)\n : imageOptimizationUrl(src, RESPONSIVE_WIDTHS[0], imgQuality);\n\n // Blur placeholder: show a low-quality background while the image loads.\n // Sanitize blurDataURL to prevent CSS injection via crafted data URLs.\n const sanitizedLocalBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const blurStyle =\n !blurComplete && placeholder === \"blur\" && sanitizedLocalBlur\n ? {\n backgroundImage: `url(${sanitizedLocalBlur})`,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: \"center\",\n }\n : undefined;\n\n const imageSizes = sizes ?? (fill ? \"100vw\" : undefined);\n preloadImageResource({\n shouldPreload,\n src: optimizedSrc,\n srcSet,\n sizes: imageSizes,\n fetchPriority: priorityFetchPriority,\n });\n\n // For local images, render a standard <img> tag with srcSet and blur support.\n // The src and srcSet point to the /_vinext/image optimization endpoint.\n return (\n <img\n ref={mergedRef}\n src={optimizedSrc}\n alt={alt}\n width={fill ? undefined : imgWidth}\n height={fill ? undefined : imgHeight}\n loading={imageLoading}\n fetchPriority={priorityFetchPriority}\n decoding=\"async\"\n srcSet={srcSet}\n sizes={imageSizes}\n className={className}\n data-nimg={fill ? \"fill\" : \"1\"}\n onLoad={handleLoad}\n onError={handleError}\n style={fill ? getFillStyle(style, blurStyle) : { ...blurStyle, ...style }}\n {...rest}\n />\n );\n});\n\n/**\n * getImageProps — for advanced use cases (picture elements, background images).\n * Returns the props that would be passed to the underlying <img> element.\n */\nexport function getImageProps(props: ImageProps): {\n props: React.ImgHTMLAttributes<HTMLImageElement>;\n} {\n const {\n src: srcProp,\n alt,\n width,\n height,\n fill,\n preload: _preload,\n priority,\n quality: _quality,\n placeholder,\n blurDataURL: blurDataURLProp,\n loader,\n sizes,\n className,\n style,\n onLoad: _onLoad,\n onLoadingComplete: _onLoadingComplete,\n unoptimized: _unoptimized,\n overrideSrc: _overrideSrc,\n loading,\n ...rest\n } = props;\n\n const {\n src,\n width: imgWidth,\n height: imgHeight,\n blurDataURL: imgBlurDataURL,\n } = resolveImageSource({ src: srcProp, width, height, blurDataURL: blurDataURLProp });\n const shouldPreload = _preload === true || priority === true;\n\n // Validate remote URLs against configured patterns\n let blockedInProd = false;\n if (isRemoteUrl(src)) {\n const validation = validateRemoteUrl(src);\n if (!validation.allowed) {\n if (__isDev) {\n console.warn(`[next/image] ${validation.reason}`);\n } else {\n console.error(`[next/image] ${validation.reason}`);\n blockedInProd = true;\n }\n }\n }\n\n // Resolve src through custom loader if provided\n const imgQuality = _quality ?? 75;\n const resolvedSrc = blockedInProd\n ? \"\"\n : loader\n ? loader({ src, width: imgWidth ?? 0, quality: imgQuality })\n : src;\n\n // For local images (no loader, not remote), route through optimization endpoint.\n // When `unoptimized` is true, bypass the endpoint entirely (Next.js compat).\n // SVG sources auto-skip unless dangerouslyAllowSVG is enabled.\n const isSvg = resolvedSrc.endsWith(\".svg\");\n const skipOpt =\n _unoptimized === true ||\n (isSvg && !__dangerouslyAllowSVG) ||\n blockedInProd ||\n !!loader ||\n isRemoteUrl(resolvedSrc);\n const optimizedSrc = skipOpt\n ? resolvedSrc\n : imgWidth\n ? imageOptimizationUrl(resolvedSrc, imgWidth, imgQuality)\n : imageOptimizationUrl(resolvedSrc, RESPONSIVE_WIDTHS[0], imgQuality);\n\n // Build srcSet for local images — each width points to /_vinext/image\n const srcSet =\n imgWidth && !fill && !isRemoteUrl(resolvedSrc) && !loader && !skipOpt\n ? generateSrcSet(resolvedSrc, imgWidth, imgQuality)\n : undefined;\n\n // Blur placeholder styles — sanitize to prevent CSS injection\n const sanitizedBlurURL = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const blurStyle =\n placeholder === \"blur\" && sanitizedBlurURL\n ? {\n backgroundImage: `url(${sanitizedBlurURL})`,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\" as const,\n backgroundPosition: \"center\" as const,\n }\n : undefined;\n\n return {\n props: {\n src: optimizedSrc,\n alt,\n width: fill ? undefined : imgWidth,\n height: fill ? undefined : imgHeight,\n loading: priority ? \"eager\" : shouldPreload ? loading : (loading ?? \"lazy\"),\n fetchPriority: priority ? (\"high\" as const) : undefined,\n decoding: \"async\" as const,\n srcSet,\n sizes: sizes ?? (fill ? \"100vw\" : undefined),\n className,\n \"data-nimg\": fill ? \"fill\" : \"1\",\n style: fill ? getFillStyle(style, blurStyle) : { ...blurStyle, ...style },\n ...rest,\n } as React.ImgHTMLAttributes<HTMLImageElement>,\n };\n}\n\nexport default Image;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"als-registry.js","names":[],"sources":["../../../src/shims/internal/als-registry.ts"],"sourcesContent":["/**\n * Shared helper for registering AsyncLocalStorage instances on `globalThis`\n * via `Symbol.for(...)` so that they survive multiple module instances.\n *\n * Why this helper exists\n * ----------------------\n * Vite's multi-environment setup (RSC / SSR / client) and HMR can load a\n * single source module under several different specifiers, producing more\n * than one module instance at runtime. If each instance kept its own\n * module-local `new AsyncLocalStorage()`, request-scoped state would silently\n * fork across instances — `headers()` in one environment wouldn't see what\n * `connection()` registered in another, concurrent requests would stomp each\n * other, etc.\n *\n * The fix every shim was applying inline:\n *\n * const _ALS_KEY = Symbol.for(\"vinext.foo.als\");\n * const _g = globalThis as unknown as Record<PropertyKey, unknown>;\n * const _als = (_g[_ALS_KEY] ??=\n * new AsyncLocalStorage<T>()) as AsyncLocalStorage<T>;\n *\n * This helper packages that pattern.\n *\n * Cross-bundle singleton property — preserved\n * -------------------------------------------\n * - `Symbol.for(key)` consults the global symbol registry and returns the\n * same symbol regardless of which module instance calls it.\n * - `globalThis[sym]` is a single slot shared by every module instance.\n * - `??=` only assigns when the slot is empty, so the first caller wins and\n * every subsequent caller (in any module instance) reads the same ALS.\n *\n * The helper module itself never holds the ALS by reference — it always\n * round-trips through `globalThis`. So even if this helper file is itself\n * loaded under multiple module instances, every copy still hands back the\n * one true ALS for a given key.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\n\n/**\n * Get (or lazily create) the AsyncLocalStorage registered on `globalThis`\n * under `Symbol.for(key)`. Multiple callers — including callers in different\n * module instances — that pass the same `key` receive the same ALS instance.\n *\n * @param key - String key fed to `Symbol.for(...)`. By convention vinext\n * shims use a dotted namespace such as `\"vinext.cache.als\"`.\n */\nexport function getOrCreateAls<T>(key: string): AsyncLocalStorage<T> {\n const sym = Symbol.for(key);\n return (_g[sym] ??= new AsyncLocalStorage<T>()) as AsyncLocalStorage<T>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,MAAM,KAAK;;;;;;;;;AAUX,SAAgB,eAAkB,KAAmC;CACnE,MAAM,MAAM,OAAO,IAAI,IAAI;AAC3B,QAAQ,GAAG,SAAS,IAAI,mBAAsB"}
1
+ {"version":3,"file":"als-registry.js","names":[],"sources":["../../../src/shims/internal/als-registry.ts"],"sourcesContent":["/**\n * Shared helper for registering AsyncLocalStorage instances on `globalThis`\n * via `Symbol.for(...)` so that they survive multiple module instances.\n *\n * Why this helper exists\n * ----------------------\n * Vite's multi-environment setup (RSC / SSR / client) and HMR can load a\n * single source module under several different specifiers, producing more\n * than one module instance at runtime. If each instance kept its own\n * module-local `new AsyncLocalStorage()`, request-scoped state would silently\n * fork across instances — `headers()` in one environment wouldn't see what\n * `connection()` registered in another, concurrent requests would stomp each\n * other, etc.\n *\n * The fix every shim was applying inline:\n *\n * const _ALS_KEY = Symbol.for(\"vinext.foo.als\");\n * const _g = globalThis as unknown as Record<PropertyKey, unknown>;\n * const _als = (_g[_ALS_KEY] ??=\n * new AsyncLocalStorage<T>()) as AsyncLocalStorage<T>;\n *\n * This helper packages that pattern.\n *\n * Cross-bundle singleton property — preserved\n * -------------------------------------------\n * - `Symbol.for(key)` consults the global symbol registry and returns the\n * same symbol regardless of which module instance calls it.\n * - `globalThis[sym]` is a single slot shared by every module instance.\n * - `??=` only assigns when the slot is empty, so the first caller wins and\n * every subsequent caller (in any module instance) reads the same ALS.\n *\n * The helper module itself never holds the ALS by reference — it always\n * round-trips through `globalThis`. So even if this helper file is itself\n * loaded under multiple module instances, every copy still hands back the\n * one true ALS for a given key.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\n\n/**\n * Get (or lazily create) the AsyncLocalStorage registered on `globalThis`\n * under `Symbol.for(key)`. Multiple callers — including callers in different\n * module instances — that pass the same `key` receive the same ALS instance.\n *\n * @param key - String key fed to `Symbol.for(...)`. By convention vinext\n * shims use a dotted namespace such as `\"vinext.cache.als\"`.\n */\nexport function getOrCreateAls<T>(key: string): AsyncLocalStorage<T> {\n const sym = Symbol.for(key);\n return (_g[sym] ??= new AsyncLocalStorage<T>()) as AsyncLocalStorage<T>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,MAAM,KAAK;;;;;;;;;AAUX,SAAgB,eAAkB,KAAmC;CACnE,MAAM,MAAM,OAAO,IAAI,IAAI;CAC3B,OAAQ,GAAG,SAAS,IAAI,mBAAsB"}
@@ -1,4 +1,4 @@
1
- import * as _$react from "react";
1
+ import * as React$1 from "react";
2
2
 
3
3
  //#region src/shims/internal/app-router-context.d.ts
4
4
  type NavigateOptions = {
@@ -9,6 +9,7 @@ type PrefetchOptions = {
9
9
  onInvalidate?: () => void;
10
10
  };
11
11
  type AppRouterInstance = {
12
+ bfcacheId: string;
12
13
  back(): void;
13
14
  forward(): void;
14
15
  refresh(): void;
@@ -16,11 +17,11 @@ type AppRouterInstance = {
16
17
  replace(href: string, options?: NavigateOptions): void;
17
18
  prefetch(href: string, options?: PrefetchOptions): void;
18
19
  };
19
- declare const AppRouterContext: _$react.Context<AppRouterInstance | null>;
20
- declare const GlobalLayoutRouterContext: _$react.Context<unknown>;
21
- declare const LayoutRouterContext: _$react.Context<unknown>;
22
- declare const MissingSlotContext: _$react.Context<Set<string>>;
23
- declare const TemplateContext: _$react.Context<unknown>;
20
+ declare const AppRouterContext: React$1.Context<AppRouterInstance | null> | null;
21
+ declare const GlobalLayoutRouterContext: React$1.Context<unknown> | null;
22
+ declare const LayoutRouterContext: React$1.Context<unknown> | null;
23
+ declare const MissingSlotContext: React$1.Context<Set<string>> | null;
24
+ declare const TemplateContext: React$1.Context<unknown> | null;
24
25
  //#endregion
25
26
  export { AppRouterContext, AppRouterInstance, GlobalLayoutRouterContext, LayoutRouterContext, MissingSlotContext, NavigateOptions, PrefetchOptions, TemplateContext };
26
27
  //# sourceMappingURL=app-router-context.d.ts.map
@@ -1,4 +1,4 @@
1
- import { createContext } from "react";
1
+ import * as React$1 from "react";
2
2
  //#region src/shims/internal/app-router-context.ts
3
3
  /**
4
4
  * Shim for next/dist/shared/lib/app-router-context.shared-runtime
@@ -8,11 +8,22 @@ import { createContext } from "react";
8
8
  *
9
9
  * We export the types and minimal context objects so these libraries resolve.
10
10
  */
11
- const AppRouterContext = createContext(null);
12
- const GlobalLayoutRouterContext = createContext(null);
13
- const LayoutRouterContext = createContext(null);
14
- const MissingSlotContext = createContext(/* @__PURE__ */ new Set());
15
- const TemplateContext = createContext(null);
11
+ const APP_ROUTER_CONTEXT_KEY = Symbol.for("vinext.appRouterContext");
12
+ const GLOBAL_LAYOUT_ROUTER_CONTEXT_KEY = Symbol.for("vinext.globalLayoutRouterContext");
13
+ const LAYOUT_ROUTER_CONTEXT_KEY = Symbol.for("vinext.layoutRouterContext");
14
+ const MISSING_SLOT_CONTEXT_KEY = Symbol.for("vinext.missingSlotContext");
15
+ const TEMPLATE_CONTEXT_KEY = Symbol.for("vinext.templateContext");
16
+ function getOrCreateContext(key, defaultValue) {
17
+ if (typeof React$1.createContext !== "function") return null;
18
+ const globalState = globalThis;
19
+ if (!globalState[key]) globalState[key] = React$1.createContext(defaultValue);
20
+ return globalState[key] ?? null;
21
+ }
22
+ const AppRouterContext = getOrCreateContext(APP_ROUTER_CONTEXT_KEY, null);
23
+ const GlobalLayoutRouterContext = getOrCreateContext(GLOBAL_LAYOUT_ROUTER_CONTEXT_KEY, null);
24
+ const LayoutRouterContext = getOrCreateContext(LAYOUT_ROUTER_CONTEXT_KEY, null);
25
+ const MissingSlotContext = getOrCreateContext(MISSING_SLOT_CONTEXT_KEY, /* @__PURE__ */ new Set());
26
+ const TemplateContext = getOrCreateContext(TEMPLATE_CONTEXT_KEY, null);
16
27
  //#endregion
17
28
  export { AppRouterContext, GlobalLayoutRouterContext, LayoutRouterContext, MissingSlotContext, TemplateContext };
18
29
 
@@ -1 +1 @@
1
- {"version":3,"file":"app-router-context.js","names":[],"sources":["../../../src/shims/internal/app-router-context.ts"],"sourcesContent":["/**\n * Shim for next/dist/shared/lib/app-router-context.shared-runtime\n *\n * Used by: @clerk/nextjs, next-intl, next-nprogress-bar, nextjs-toploader,\n * next-view-transitions. Mostly type-only imports in published .d.ts files.\n *\n * We export the types and minimal context objects so these libraries resolve.\n */\nimport { createContext } from \"react\";\n\nexport type NavigateOptions = {\n scroll?: boolean;\n};\n\nexport type PrefetchOptions = {\n kind?: unknown;\n onInvalidate?: () => void;\n};\n\nexport type AppRouterInstance = {\n back(): void;\n forward(): void;\n refresh(): void;\n push(href: string, options?: NavigateOptions): void;\n replace(href: string, options?: NavigateOptions): void;\n prefetch(href: string, options?: PrefetchOptions): void;\n};\n\nexport const AppRouterContext = createContext<AppRouterInstance | null>(null);\nexport const GlobalLayoutRouterContext = createContext<unknown>(null);\nexport const LayoutRouterContext = createContext<unknown>(null);\nexport const MissingSlotContext = createContext<Set<string>>(new Set());\nexport const TemplateContext = createContext<unknown>(null);\n"],"mappings":";;;;;;;;;;AA4BA,MAAa,mBAAmB,cAAwC,KAAK;AAC7E,MAAa,4BAA4B,cAAuB,KAAK;AACrE,MAAa,sBAAsB,cAAuB,KAAK;AAC/D,MAAa,qBAAqB,8BAA2B,IAAI,KAAK,CAAC;AACvE,MAAa,kBAAkB,cAAuB,KAAK"}
1
+ {"version":3,"file":"app-router-context.js","names":["React"],"sources":["../../../src/shims/internal/app-router-context.ts"],"sourcesContent":["/**\n * Shim for next/dist/shared/lib/app-router-context.shared-runtime\n *\n * Used by: @clerk/nextjs, next-intl, next-nprogress-bar, nextjs-toploader,\n * next-view-transitions. Mostly type-only imports in published .d.ts files.\n *\n * We export the types and minimal context objects so these libraries resolve.\n */\nimport * as React from \"react\";\n\nexport type NavigateOptions = {\n scroll?: boolean;\n};\n\nexport type PrefetchOptions = {\n kind?: unknown;\n onInvalidate?: () => void;\n};\n\nexport type AppRouterInstance = {\n bfcacheId: string;\n back(): void;\n forward(): void;\n refresh(): void;\n push(href: string, options?: NavigateOptions): void;\n replace(href: string, options?: NavigateOptions): void;\n prefetch(href: string, options?: PrefetchOptions): void;\n};\n\nconst APP_ROUTER_CONTEXT_KEY = Symbol.for(\"vinext.appRouterContext\");\nconst GLOBAL_LAYOUT_ROUTER_CONTEXT_KEY = Symbol.for(\"vinext.globalLayoutRouterContext\");\nconst LAYOUT_ROUTER_CONTEXT_KEY = Symbol.for(\"vinext.layoutRouterContext\");\nconst MISSING_SLOT_CONTEXT_KEY = Symbol.for(\"vinext.missingSlotContext\");\nconst TEMPLATE_CONTEXT_KEY = Symbol.for(\"vinext.templateContext\");\n\ntype AppRouterContextGlobal = typeof globalThis & {\n [APP_ROUTER_CONTEXT_KEY]?: React.Context<AppRouterInstance | null> | null;\n [GLOBAL_LAYOUT_ROUTER_CONTEXT_KEY]?: React.Context<unknown> | null;\n [LAYOUT_ROUTER_CONTEXT_KEY]?: React.Context<unknown> | null;\n [MISSING_SLOT_CONTEXT_KEY]?: React.Context<Set<string>> | null;\n [TEMPLATE_CONTEXT_KEY]?: React.Context<unknown> | null;\n};\n\nfunction getOrCreateContext<T>(key: symbol, defaultValue: T): React.Context<T> | null {\n if (typeof React.createContext !== \"function\") return null;\n\n // Boundary assertion: symbol-keyed global storage preserves context identity\n // across duplicate module instances while keeping the public exports typed.\n const globalState = globalThis as AppRouterContextGlobal & {\n [key]?: React.Context<T> | null;\n };\n if (!globalState[key]) {\n globalState[key] = React.createContext(defaultValue);\n }\n return globalState[key] ?? null;\n}\n\nexport const AppRouterContext: React.Context<AppRouterInstance | null> | null =\n getOrCreateContext<AppRouterInstance | null>(APP_ROUTER_CONTEXT_KEY, null);\nexport const GlobalLayoutRouterContext: React.Context<unknown> | null = getOrCreateContext<unknown>(\n GLOBAL_LAYOUT_ROUTER_CONTEXT_KEY,\n null,\n);\nexport const LayoutRouterContext: React.Context<unknown> | null = getOrCreateContext<unknown>(\n LAYOUT_ROUTER_CONTEXT_KEY,\n null,\n);\nexport const MissingSlotContext: React.Context<Set<string>> | null = getOrCreateContext(\n MISSING_SLOT_CONTEXT_KEY,\n new Set(),\n);\nexport const TemplateContext: React.Context<unknown> | null = getOrCreateContext<unknown>(\n TEMPLATE_CONTEXT_KEY,\n null,\n);\n"],"mappings":";;;;;;;;;;AA6BA,MAAM,yBAAyB,OAAO,IAAI,0BAA0B;AACpE,MAAM,mCAAmC,OAAO,IAAI,mCAAmC;AACvF,MAAM,4BAA4B,OAAO,IAAI,6BAA6B;AAC1E,MAAM,2BAA2B,OAAO,IAAI,4BAA4B;AACxE,MAAM,uBAAuB,OAAO,IAAI,yBAAyB;AAUjE,SAAS,mBAAsB,KAAa,cAA0C;CACpF,IAAI,OAAOA,QAAM,kBAAkB,YAAY,OAAO;CAItD,MAAM,cAAc;CAGpB,IAAI,CAAC,YAAY,MACf,YAAY,OAAOA,QAAM,cAAc,aAAa;CAEtD,OAAO,YAAY,QAAQ;;AAG7B,MAAa,mBACX,mBAA6C,wBAAwB,KAAK;AAC5E,MAAa,4BAA2D,mBACtE,kCACA,KACD;AACD,MAAa,sBAAqD,mBAChE,2BACA,KACD;AACD,MAAa,qBAAwD,mBACnE,0CACA,IAAI,KAAK,CACV;AACD,MAAa,kBAAiD,mBAC5D,sBACA,KACD"}