@wular/pnext 0.0.4 → 0.0.7

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 (395) hide show
  1. package/README.md +22 -16
  2. package/bin/pnext +6 -1
  3. package/config/lint/base.js +7 -7
  4. package/config/ts/base.json +2 -4
  5. package/config/ts/react.json +2 -6
  6. package/package.json +23 -2
  7. package/reference/compat.md +87 -22
  8. package/reference/config.md +40 -93
  9. package/reference/css.md +42 -33
  10. package/reference/dev.md +26 -33
  11. package/reference/env.md +18 -20
  12. package/reference/getting-started.md +132 -0
  13. package/reference/metadata.md +31 -46
  14. package/reference/navigation.md +65 -105
  15. package/reference/performance.md +21 -142
  16. package/reference/rendering.md +78 -75
  17. package/reference/routing.md +97 -107
  18. package/reference/typegen.md +27 -29
  19. package/src/api/cache.ts +36 -37
  20. package/src/api/client-cache.ts +2 -2
  21. package/src/api/client-navigation.ts +121 -114
  22. package/src/api/dynamic.tsx +58 -55
  23. package/src/api/link.tsx +52 -53
  24. package/src/api/navigation.ts +59 -58
  25. package/src/api/server.ts +152 -144
  26. package/src/api/suspense.ts +4 -4
  27. package/src/cli/adapters/vercel-warm.ts +126 -121
  28. package/src/cli/adapters/vercel.ts +437 -443
  29. package/src/cli/analyze.ts +333 -144
  30. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  31. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  32. package/src/cli/build.ts +976 -978
  33. package/src/cli/create.ts +72 -64
  34. package/src/cli/dev.ts +116 -116
  35. package/src/cli/index.ts +94 -85
  36. package/src/cli/migrate/package-json.ts +73 -71
  37. package/src/cli/migrate/report.ts +32 -33
  38. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  39. package/src/cli/migrate/scan.ts +46 -46
  40. package/src/cli/migrate/spinner.ts +9 -9
  41. package/src/cli/migrate/tsconfig.ts +35 -35
  42. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  43. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  44. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  45. package/src/cli/start.ts +65 -66
  46. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  47. package/src/client/build.ts +802 -768
  48. package/src/client/chunk-fold.ts +245 -240
  49. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  50. package/src/client/entry.ts +162 -147
  51. package/src/client/prebuilt.ts +231 -223
  52. package/src/client/profile.ts +29 -29
  53. package/src/client/react-compiler.ts +20 -15
  54. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  55. package/src/client/reference-stub.ts +51 -51
  56. package/src/client/reference.ts +19 -19
  57. package/src/{api → client}/router/events.ts +32 -17
  58. package/src/{api → client}/router/history.ts +16 -16
  59. package/src/{api → client}/router/hub.ts +52 -53
  60. package/src/{api/router.ts → client/router/index.ts} +61 -60
  61. package/src/{api → client}/router/policies.ts +24 -24
  62. package/src/{api → client}/router/runtime.ts +2022 -1995
  63. package/src/{api → client}/router/types.ts +98 -98
  64. package/src/compat/actions/client-plugin.ts +42 -43
  65. package/src/compat/actions/client-stub.ts +14 -14
  66. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  67. package/src/compat/actions/config.ts +63 -64
  68. package/src/compat/actions/detect.ts +68 -68
  69. package/src/compat/actions/discovery.ts +105 -105
  70. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  71. package/src/compat/actions/early-submit.ts +1 -1
  72. package/src/compat/actions/endpoint.ts +198 -198
  73. package/src/compat/actions/extensions.ts +811 -0
  74. package/src/compat/actions/flight.ts +23 -23
  75. package/src/compat/actions/form-state.ts +34 -34
  76. package/src/compat/actions/hoist.ts +382 -236
  77. package/src/compat/actions/ids.ts +7 -12
  78. package/src/compat/actions/index.ts +8 -8
  79. package/src/compat/actions/instances.ts +46 -46
  80. package/src/compat/actions/origin.ts +47 -48
  81. package/src/compat/actions/protocol.ts +22 -22
  82. package/src/compat/actions/registry.ts +19 -19
  83. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  84. package/src/compat/actions/rewrite.ts +125 -125
  85. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  86. package/src/compat/actions/serve.ts +132 -136
  87. package/src/compat/actions/server-tag.ts +4 -4
  88. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  89. package/src/compat/actions/unrecognized-error.ts +4 -4
  90. package/src/compat/{index.ts → aliases.ts} +112 -109
  91. package/src/compat/bundler/bun-externals.ts +18 -18
  92. package/src/compat/bundler/cjs-exports.ts +271 -223
  93. package/src/compat/bundler/config.ts +116 -111
  94. package/src/compat/bundler/externals.ts +12 -12
  95. package/src/compat/bundler/import-meta-url.ts +19 -19
  96. package/src/compat/bundler/modularize-imports.ts +36 -33
  97. package/src/compat/bundler/new-url-asset.ts +22 -24
  98. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  99. package/src/compat/bundler/polyfill.ts +28 -28
  100. package/src/compat/bundler/react-compiler.ts +35 -29
  101. package/src/compat/bundler/react-profiler.tsx +11 -11
  102. package/src/compat/bundler/relay-transform.ts +48 -47
  103. package/src/compat/bundler/require-context.ts +119 -113
  104. package/src/compat/bundler/resolve-extensions.ts +19 -19
  105. package/src/compat/bundler/source-cache.ts +25 -25
  106. package/src/compat/bundler/static-imports.ts +7 -7
  107. package/src/compat/bundler/symlink-imports.ts +46 -46
  108. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  109. package/src/compat/bundler/wasm.ts +58 -60
  110. package/src/compat/bundler/webpack-loaders.ts +254 -241
  111. package/src/compat/bundler/worker.ts +101 -104
  112. package/src/compat/cache/build-flags.ts +29 -29
  113. package/src/compat/cache/build-prerender-errors.ts +40 -44
  114. package/src/compat/cache/custom-handler.ts +60 -53
  115. package/src/compat/cache/fetch-patch.ts +240 -240
  116. package/src/compat/cache/handler.ts +27 -31
  117. package/src/compat/cache/modern-handler.ts +148 -126
  118. package/src/compat/cache/resume-data-cache.ts +47 -45
  119. package/src/compat/cache/revalidate.ts +233 -232
  120. package/src/compat/cache/runtime-error.ts +35 -35
  121. package/src/compat/cache/use-cache-transform.ts +442 -417
  122. package/src/compat/cache/use-cache.ts +650 -614
  123. package/src/compat/cache-control.ts +140 -142
  124. package/src/compat/client/base-path.ts +21 -20
  125. package/src/compat/client/css-order.ts +18 -18
  126. package/src/compat/client/errors/bare-boundary.ts +11 -11
  127. package/src/compat/client/errors/control-flow.ts +23 -23
  128. package/src/compat/client/errors/error-boundary.ts +61 -61
  129. package/src/compat/client/errors/global-error.ts +101 -91
  130. package/src/compat/client/errors/install.ts +71 -72
  131. package/src/compat/client/errors/lazy.ts +23 -23
  132. package/src/compat/client/errors/primitive-throw.ts +47 -45
  133. package/src/compat/client/errors/soft-refresh.ts +4 -4
  134. package/src/compat/client/link-status.ts +33 -33
  135. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  136. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  137. package/src/compat/client/navigation-scroll.ts +63 -63
  138. package/src/compat/client/optimistic-routing.ts +93 -88
  139. package/src/compat/client/prefetch-cache.ts +23 -24
  140. package/src/compat/client/route-announcer.ts +35 -35
  141. package/src/compat/client/segment-cache-policy.ts +20 -20
  142. package/src/compat/client/segment-cache.ts +309 -315
  143. package/src/compat/client/segment-prefetch.ts +127 -132
  144. package/src/compat/client/trailing-slash.ts +5 -4
  145. package/src/compat/css/chunking.ts +113 -116
  146. package/src/compat/css/inline-css.ts +21 -21
  147. package/src/compat/css/lightningcss.ts +37 -38
  148. package/src/compat/css/modules.ts +161 -175
  149. package/src/compat/css/nonce.ts +7 -7
  150. package/src/compat/css/sass-plugin.ts +18 -21
  151. package/src/compat/css/sass.ts +150 -152
  152. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  153. package/src/compat/css/styled-jsx.ts +21 -21
  154. package/src/compat/edge-runtime.ts +27 -27
  155. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  156. package/src/compat/export/client.ts +29 -31
  157. package/src/compat/export/{index.ts → emit.ts} +111 -110
  158. package/src/compat/export/standalone.ts +62 -54
  159. package/src/compat/image-optimizer/cache.ts +51 -49
  160. package/src/compat/image-optimizer/detect.ts +52 -52
  161. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  162. package/src/compat/image-optimizer/source.ts +77 -80
  163. package/src/compat/lifecycle/after-scope.ts +26 -26
  164. package/src/compat/lifecycle/after.ts +48 -45
  165. package/src/compat/lifecycle/error-funnel.ts +98 -102
  166. package/src/compat/lifecycle/error-serialize.ts +30 -26
  167. package/src/compat/lifecycle/error-ui.ts +67 -32
  168. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  169. package/src/compat/lifecycle/instrumentation.ts +85 -85
  170. package/src/compat/lifecycle/node-console.ts +11 -11
  171. package/src/compat/lifecycle/testmode.ts +160 -132
  172. package/src/compat/mdx/compile.ts +60 -57
  173. package/src/compat/mdx/plugin.ts +11 -11
  174. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  175. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  176. package/src/compat/metadata.ts +75 -81
  177. package/src/compat/next/cache.ts +68 -69
  178. package/src/compat/next/canonical-url.ts +9 -9
  179. package/src/compat/next/client-cache.ts +19 -19
  180. package/src/compat/next/client-navigation.ts +112 -116
  181. package/src/compat/next/client-only.ts +1 -1
  182. package/src/compat/next/client-script.tsx +99 -93
  183. package/src/compat/next/client-server.ts +10 -10
  184. package/src/compat/next/config-loader.ts +176 -173
  185. package/src/compat/next/config.ts +7 -7
  186. package/src/compat/next/constants.cjs +6 -6
  187. package/src/compat/next/constants.ts +6 -6
  188. package/src/compat/next/custom-server.ts +26 -24
  189. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  190. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  191. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  192. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  193. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  194. package/src/compat/next/dynamic.tsx +21 -18
  195. package/src/compat/next/error.tsx +52 -52
  196. package/src/compat/next/font/cache.ts +74 -74
  197. package/src/compat/next/font/google.ts +2 -2
  198. package/src/compat/next/font/index.ts +1 -1
  199. package/src/compat/next/font/local.ts +3 -3
  200. package/src/compat/next/font/runtime-client.ts +17 -15
  201. package/src/compat/next/font/runtime.ts +443 -408
  202. package/src/compat/next/font/shared.ts +120 -108
  203. package/src/compat/next/form.tsx +63 -63
  204. package/src/compat/next/head.tsx +2 -2
  205. package/src/compat/next/headers.ts +103 -95
  206. package/src/compat/next/image/client.tsx +220 -0
  207. package/src/compat/next/image/config.ts +56 -58
  208. package/src/compat/next/image/optimizer.ts +40 -36
  209. package/src/compat/next/image/patterns.ts +37 -40
  210. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  211. package/src/compat/next/image/shared.ts +65 -57
  212. package/src/compat/next/image/static-metadata.ts +98 -107
  213. package/src/compat/next/image/validate.ts +79 -88
  214. package/src/compat/next/image.tsx +19 -23
  215. package/src/compat/next/index.ts +1 -1
  216. package/src/compat/next/legacy-image.tsx +59 -60
  217. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  218. package/src/compat/next/link.tsx +158 -158
  219. package/src/compat/next/navigation.cjs +12 -3
  220. package/src/compat/next/navigation.ts +48 -50
  221. package/src/compat/next/offline.ts +27 -27
  222. package/src/compat/next/og.ts +121 -124
  223. package/src/compat/next/preferred-region.ts +13 -14
  224. package/src/compat/next/redirects.ts +58 -56
  225. package/src/compat/next/resource-hints.ts +73 -76
  226. package/src/compat/next/rewrites.ts +130 -133
  227. package/src/compat/next/root-params.ts +45 -45
  228. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  229. package/src/compat/next/router.cjs +4 -2
  230. package/src/compat/next/router.ts +58 -61
  231. package/src/compat/next/script.tsx +108 -108
  232. package/src/compat/next/server-only.ts +1 -1
  233. package/src/compat/next/server.ts +19 -19
  234. package/src/compat/next/svgr.ts +18 -17
  235. package/src/compat/next/telemetry.ts +24 -24
  236. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  237. package/src/compat/next/user-agent.ts +53 -49
  238. package/src/compat/next/web-vitals.ts +22 -24
  239. package/src/compat/otel/api.ts +41 -41
  240. package/src/compat/otel/client-trace-metadata.ts +25 -27
  241. package/src/compat/otel/fetch-span.ts +29 -29
  242. package/src/compat/otel/tracer.ts +331 -331
  243. package/src/compat/pages/api.ts +456 -0
  244. package/src/compat/pages/client-plugin.ts +36 -36
  245. package/src/compat/pages/router-state.ts +34 -34
  246. package/src/compat/pages/{index.ts → router.ts} +130 -135
  247. package/src/compat/ppr/io.ts +12 -12
  248. package/src/compat/ppr/missing-root-params.ts +34 -38
  249. package/src/compat/ppr/root-params-scan.ts +66 -66
  250. package/src/compat/ppr/root-params-transform.ts +24 -26
  251. package/src/compat/ppr/root-params.ts +30 -30
  252. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  253. package/src/compat/protocol.ts +71 -70
  254. package/src/compat/react/action-state.ts +47 -48
  255. package/src/compat/react/client-lite.ts +15 -15
  256. package/src/compat/react/client.ts +4 -4
  257. package/src/compat/react/compiler-runtime.ts +11 -11
  258. package/src/compat/react/dom-client.ts +44 -44
  259. package/src/compat/react/dom-react-server.ts +10 -16
  260. package/src/compat/react/dom-server.ts +10 -10
  261. package/src/compat/react/dom.ts +52 -52
  262. package/src/compat/react/hooks-extra.ts +34 -35
  263. package/src/compat/react/parity.ts +64 -61
  264. package/src/compat/react/preact.ts +81 -82
  265. package/src/compat/react/react-server.ts +28 -28
  266. package/src/compat/react/router-shim.ts +1 -1
  267. package/src/compat/react/server-component-use.ts +8 -8
  268. package/src/compat/react/server-inserted-html.ts +30 -31
  269. package/src/compat/react/server.ts +53 -55
  270. package/src/compat/react/use.ts +32 -32
  271. package/src/compat/react/view-transition.ts +20 -20
  272. package/src/compat/register/actions.ts +35 -824
  273. package/src/compat/register/boot.ts +41 -41
  274. package/src/compat/register/build-tier.ts +5 -5
  275. package/src/compat/register/build.ts +74 -70
  276. package/src/compat/register/bundler.ts +161 -156
  277. package/src/compat/register/cache.ts +20 -20
  278. package/src/compat/register/client-errors.ts +3 -3
  279. package/src/compat/register/config.ts +6 -6
  280. package/src/compat/register/css-extras.ts +30 -34
  281. package/src/compat/register/edge-runtime.ts +3 -3
  282. package/src/compat/register/errors.ts +10 -12
  283. package/src/compat/register/export.ts +16 -16
  284. package/src/compat/register/font.ts +11 -11
  285. package/src/compat/register/hooks.ts +2 -2
  286. package/src/compat/register/image.ts +40 -40
  287. package/src/compat/register/index.ts +59 -62
  288. package/src/compat/register/instrumentation-client.ts +10 -10
  289. package/src/compat/register/lifecycle.ts +25 -28
  290. package/src/compat/register/mdx.ts +10 -10
  291. package/src/compat/register/middleware.ts +226 -16
  292. package/src/compat/register/otel.ts +80 -88
  293. package/src/compat/register/pages-api.ts +10 -463
  294. package/src/compat/register/ppr.ts +16 -16
  295. package/src/compat/register/protocol.ts +17 -18
  296. package/src/compat/register/proxy.ts +49 -51
  297. package/src/compat/register/render.ts +79 -76
  298. package/src/compat/register/routing.ts +162 -159
  299. package/src/compat/register/segment.ts +24 -1897
  300. package/src/compat/register/static-image.ts +3 -3
  301. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  302. package/src/compat/register/typed-routes.ts +14 -14
  303. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  304. package/src/compat/register/validation.ts +18 -18
  305. package/src/compat/segment/loading-boundary.ts +43 -45
  306. package/src/compat/segment/page-slot.ts +69 -69
  307. package/src/compat/segment/serve.ts +1884 -0
  308. package/src/compat/segment/tree.ts +113 -112
  309. package/src/compat/segment/vary-key.ts +38 -38
  310. package/src/compat/segment/vary-params.ts +138 -142
  311. package/src/compat/static-params.ts +14 -12
  312. package/src/compat/tsconfig-defaults.ts +87 -91
  313. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  314. package/src/compat/typecheck/worker.ts +15 -12
  315. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  316. package/src/compat/typed-routes/manifest.ts +174 -170
  317. package/src/compat/typed-routes/typegen.ts +127 -110
  318. package/src/compat/validation/errors.ts +16 -19
  319. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  320. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  321. package/src/compat-bootstrap.ts +16 -16
  322. package/src/config.ts +86 -69
  323. package/src/css/build.ts +230 -227
  324. package/src/css/postcss.ts +79 -80
  325. package/src/css/worker.ts +14 -15
  326. package/src/dev/client-actions.ts +10 -10
  327. package/src/dev/client-chunk-store.ts +27 -27
  328. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  329. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  330. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  331. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  332. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  333. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  334. package/src/dev/server.ts +804 -820
  335. package/src/env.ts +46 -43
  336. package/src/extensions.ts +491 -478
  337. package/src/index.ts +8 -8
  338. package/src/internal.ts +20 -23
  339. package/src/{islands → render}/boundary-error.ts +3 -3
  340. package/src/render/hooks.ts +71 -71
  341. package/src/render/island-context.ts +14 -14
  342. package/src/render/metadata.ts +310 -310
  343. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  344. package/src/{ppr.ts → render/ppr.ts} +244 -245
  345. package/src/render/renderer.ts +2087 -2082
  346. package/src/render/resource-hints.ts +16 -17
  347. package/src/render/slots.tsx +224 -235
  348. package/src/{islands → render}/static-children.ts +9 -12
  349. package/src/{islands → render}/static-slots.ts +37 -37
  350. package/src/{cache/context.ts → request/cache.ts} +20 -20
  351. package/src/request/context.ts +107 -107
  352. package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
  353. package/src/resolve/engine.ts +90 -77
  354. package/src/resolve/imports.ts +475 -463
  355. package/src/resolve/scan-facts.ts +318 -296
  356. package/src/resolve/source-text.ts +37 -37
  357. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  358. package/src/routing/forwarded.ts +19 -19
  359. package/src/routing/handler.ts +84 -91
  360. package/src/routing/href.ts +87 -70
  361. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  362. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  363. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  364. package/src/routing/routes.ts +827 -815
  365. package/src/routing/slots.ts +164 -160
  366. package/src/runtime/loader.ts +954 -0
  367. package/src/{dev → runtime}/module-cache.ts +309 -287
  368. package/src/{dev → runtime}/module-generations.ts +9 -9
  369. package/src/{dev → runtime}/module-transform.ts +81 -72
  370. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  371. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  372. package/src/runtime/vendor.ts +428 -406
  373. package/src/styles.d.ts +9 -0
  374. package/src/types.ts +324 -335
  375. package/src/utils/ansi.ts +5 -5
  376. package/src/utils/{source.ts → code.ts} +15 -12
  377. package/src/utils/content-type.ts +3 -3
  378. package/src/utils/decode.ts +2 -2
  379. package/src/utils/dev-profile.ts +13 -13
  380. package/src/utils/error-log.ts +6 -6
  381. package/src/utils/esbuild.ts +18 -18
  382. package/src/utils/fs-cache.ts +13 -13
  383. package/src/utils/fs.ts +57 -49
  384. package/src/utils/html.ts +20 -24
  385. package/src/utils/native-require.ts +8 -8
  386. package/src/utils/serialize.ts +139 -146
  387. package/src/utils/verbose.ts +18 -18
  388. package/reference/overview.md +0 -35
  389. package/src/cli/analyze-print.ts +0 -181
  390. package/src/compat/middleware/manifest.ts +0 -210
  391. package/src/compat/next/image-client.tsx +0 -215
  392. package/src/compat/next/link-usage.ts +0 -29
  393. package/src/css/index.ts +0 -2
  394. package/src/render/index.ts +0 -1
  395. package/src/style-modules.d.ts +0 -9
@@ -2,101 +2,94 @@
2
2
  // block (and the assetPrefix URL check) - the image-optimizer e2e suite asserts these exact strings in
3
3
  // the build output of an invalid config. Only the rules Next enforces are checked.
4
4
 
5
- import fs from 'node:fs';
6
- import path from 'node:path';
5
+ import fs from 'node:fs'
6
+ import path from 'node:path'
7
7
 
8
- const LOADERS = ['default', 'imgix', 'cloudinary', 'akamai', 'custom'] as const;
9
- const FORMATS = ['image/avif', 'image/webp'] as const;
10
- const DISPOSITIONS = ['inline', 'attachment'] as const;
11
- const REMOTE_PATTERN_KEYS = new Set(['protocol', 'hostname', 'port', 'pathname', 'search']);
12
- const LOCAL_PATTERN_KEYS = new Set(['pathname', 'search']);
8
+ const LOADERS = ['default', 'imgix', 'cloudinary', 'akamai', 'custom'] as const
9
+ const FORMATS = ['image/avif', 'image/webp'] as const
10
+ const DISPOSITIONS = ['inline', 'attachment'] as const
11
+ const REMOTE_PATTERN_KEYS = new Set(['protocol', 'hostname', 'port', 'pathname', 'search'])
12
+ const LOCAL_PATTERN_KEYS = new Set(['pathname', 'search'])
13
13
 
14
14
  function hasDefaultExport(file: string): boolean {
15
- let source: string;
15
+ let source: string
16
16
  try {
17
- source = fs.readFileSync(file, 'utf8');
17
+ source = fs.readFileSync(file, 'utf8')
18
18
  } catch {
19
- return false;
19
+ return false
20
20
  }
21
- return /\bexport\s+default\b/.test(source) || /\bmodule\.exports\s*=/.test(source);
21
+ return /\bexport\s+default\b/.test(source) || /\bmodule\.exports\s*=/.test(source)
22
22
  }
23
23
 
24
24
  function received(value: unknown): string {
25
- if (value === null) return 'null';
26
- if (Array.isArray(value)) return 'array';
27
- return typeof value;
25
+ if (value === null) return 'null'
26
+ if (Array.isArray(value)) return 'array'
27
+ return typeof value
28
28
  }
29
29
 
30
30
  function quotedUnion(options: readonly string[]): string {
31
- return options.map(option => `'${option}'`).join(' | ');
31
+ return options.map(option => `'${option}'`).join(' | ')
32
32
  }
33
33
 
34
34
  /**
35
35
  * Validate the images/assetPrefix portions of a next.config object. Returns
36
36
  * Next's exact error strings (empty array when valid).
37
37
  */
38
- export function collectImagesConfigErrors(
39
- config: Record<string, unknown>,
40
- root: string,
41
- ): string[] {
42
- const errors: string[] = [];
38
+ export function collectImagesConfigErrors(config: Record<string, unknown>, root: string): string[] {
39
+ const errors: string[] = []
43
40
 
44
- const assetPrefix = config.assetPrefix;
41
+ const assetPrefix = config.assetPrefix
45
42
  if (typeof assetPrefix === 'string' && assetPrefix !== '' && !assetPrefix.startsWith('/')) {
46
43
  try {
47
- new URL(assetPrefix);
44
+ new URL(assetPrefix)
48
45
  } catch {
49
46
  // Bun's URL error text differs from Node's; emit Node's exact phrasing.
50
- errors.push('Invalid assetPrefix provided. Original error: TypeError: Invalid URL');
47
+ errors.push('Invalid assetPrefix provided. Original error: TypeError: Invalid URL')
51
48
  }
52
49
  }
53
50
 
54
- const images = config.images;
55
- if (images === undefined || images === null) return errors;
51
+ const images = config.images
52
+ if (images === undefined || images === null) return errors
56
53
  if (typeof images !== 'object' || Array.isArray(images)) {
57
- errors.push(`Expected object, received ${received(images)} at "images"`);
58
- return errors;
54
+ errors.push(`Expected object, received ${received(images)} at "images"`)
55
+ return errors
59
56
  }
60
- const img = images as Record<string, unknown>;
57
+ const img = images as Record<string, unknown>
61
58
 
62
- validateSizeArray(errors, img.deviceSizes, 'images.deviceSizes');
63
- validateSizeArray(errors, img.imageSizes, 'images.imageSizes');
59
+ validateSizeArray(errors, img.deviceSizes, 'images.deviceSizes')
60
+ validateSizeArray(errors, img.imageSizes, 'images.imageSizes')
64
61
 
65
62
  if (img.domains !== undefined) {
66
63
  if (!Array.isArray(img.domains)) {
67
- errors.push(`Expected array, received ${received(img.domains)} at "images.domains"`);
64
+ errors.push(`Expected array, received ${received(img.domains)} at "images.domains"`)
68
65
  } else if (img.domains.length > 50) {
69
- errors.push('Array must contain at most 50 element(s) at "images.domains"');
66
+ errors.push('Array must contain at most 50 element(s) at "images.domains"')
70
67
  }
71
68
  }
72
69
 
73
70
  if (img.qualities !== undefined) {
74
71
  if (!Array.isArray(img.qualities)) {
75
- errors.push(`Expected array, received ${received(img.qualities)} at "images.qualities"`);
72
+ errors.push(`Expected array, received ${received(img.qualities)} at "images.qualities"`)
76
73
  } else {
77
74
  if (img.qualities.length < 1) {
78
- errors.push('Array must contain at least 1 element(s) at "images.qualities"');
75
+ errors.push('Array must contain at least 1 element(s) at "images.qualities"')
79
76
  }
80
77
  if (img.qualities.length > 20) {
81
- errors.push('Array must contain at most 20 element(s) at "images.qualities"');
78
+ errors.push('Array must contain at most 20 element(s) at "images.qualities"')
82
79
  }
83
80
  img.qualities.forEach((quality, index) => {
84
81
  if (typeof quality !== 'number') {
85
82
  errors.push(
86
83
  `Expected number, received ${received(quality)} at "images.qualities[${index}]"`,
87
- );
84
+ )
88
85
  } else if (!Number.isInteger(quality)) {
89
- errors.push(`Expected integer, received float at "images.qualities[${index}]"`);
86
+ errors.push(`Expected integer, received float at "images.qualities[${index}]"`)
90
87
  } else if (quality < 1) {
91
- errors.push(
92
- `Number must be greater than or equal to 1 at "images.qualities[${index}]"`,
93
- );
88
+ errors.push(`Number must be greater than or equal to 1 at "images.qualities[${index}]"`)
94
89
  } else if (quality > 100) {
95
- errors.push(
96
- `Number must be less than or equal to 100 at "images.qualities[${index}]"`,
97
- );
90
+ errors.push(`Number must be less than or equal to 100 at "images.qualities[${index}]"`)
98
91
  }
99
- });
92
+ })
100
93
  }
101
94
  }
102
95
 
@@ -104,22 +97,22 @@ export function collectImagesConfigErrors(
104
97
  if (!Array.isArray(img.localPatterns)) {
105
98
  errors.push(
106
99
  `Expected array, received ${received(img.localPatterns)} at "images.localPatterns"`,
107
- );
100
+ )
108
101
  } else {
109
102
  if (img.localPatterns.length > 25) {
110
- errors.push('Array must contain at most 25 element(s) at "images.localPatterns"');
103
+ errors.push('Array must contain at most 25 element(s) at "images.localPatterns"')
111
104
  }
112
105
  img.localPatterns.forEach((pattern, index) => {
113
- if (!pattern || typeof pattern !== 'object') return;
106
+ if (!pattern || typeof pattern !== 'object') return
114
107
  const unknown = Object.keys(pattern as Record<string, unknown>).filter(
115
108
  key => !LOCAL_PATTERN_KEYS.has(key),
116
- );
109
+ )
117
110
  if (unknown.length > 0) {
118
111
  errors.push(
119
112
  `Unrecognized key(s) in object: ${unknown.map(key => `'${key}'`).join(', ')} at "images.localPatterns[${index}]"`,
120
- );
113
+ )
121
114
  }
122
- });
115
+ })
123
116
  }
124
117
  }
125
118
 
@@ -127,40 +120,38 @@ export function collectImagesConfigErrors(
127
120
  if (!Array.isArray(img.remotePatterns)) {
128
121
  errors.push(
129
122
  `Expected array, received ${received(img.remotePatterns)} at "images.remotePatterns"`,
130
- );
123
+ )
131
124
  } else {
132
125
  if (img.remotePatterns.length > 50) {
133
- errors.push('Array must contain at most 50 element(s) at "images.remotePatterns"');
126
+ errors.push('Array must contain at most 50 element(s) at "images.remotePatterns"')
134
127
  }
135
128
  img.remotePatterns.forEach((pattern, index) => {
136
129
  if (pattern instanceof URL) {
137
- const protocol = pattern.protocol.replace(/:$/, '');
130
+ const protocol = pattern.protocol.replace(/:$/, '')
138
131
  if (protocol !== 'http' && protocol !== 'https') {
139
132
  errors.push(
140
133
  `Specified images.remotePatterns must have protocol "http" or "https" received "${protocol}"`,
141
- );
134
+ )
142
135
  }
143
- return;
136
+ return
144
137
  }
145
138
  if (!pattern || typeof pattern !== 'object') {
146
139
  errors.push(
147
140
  `Expected object, received ${received(pattern)} at "images.remotePatterns[${index}]"`,
148
- );
149
- return;
141
+ )
142
+ return
150
143
  }
151
- const obj = pattern as Record<string, unknown>;
152
- const unknown = Object.keys(obj).filter(key => !REMOTE_PATTERN_KEYS.has(key));
144
+ const obj = pattern as Record<string, unknown>
145
+ const unknown = Object.keys(obj).filter(key => !REMOTE_PATTERN_KEYS.has(key))
153
146
  if (unknown.length > 0) {
154
147
  errors.push(
155
148
  `Unrecognized key(s) in object: ${unknown.map(key => `'${key}'`).join(', ')} at "images.remotePatterns[${index}]"`,
156
- );
149
+ )
157
150
  }
158
151
  if (typeof obj.hostname !== 'string') {
159
- errors.push(
160
- `"images.remotePatterns[${index}].hostname" is missing, expected string`,
161
- );
152
+ errors.push(`"images.remotePatterns[${index}].hostname" is missing, expected string`)
162
153
  }
163
- });
154
+ })
164
155
  }
165
156
  }
166
157
 
@@ -168,18 +159,18 @@ export function collectImagesConfigErrors(
168
159
  if (typeof img.loader !== 'string' || !LOADERS.includes(img.loader as never)) {
169
160
  errors.push(
170
161
  `Expected ${quotedUnion(LOADERS)}, received '${received(img.loader) === 'string' ? (img.loader as string) : received(img.loader)}' at "images.loader"`,
171
- );
162
+ )
172
163
  } else if (img.loader !== 'default' && img.loader !== 'custom') {
173
- const loader = img.loader;
164
+ const loader = img.loader
174
165
  if (typeof img.path !== 'string' || img.path === '' || img.path === '/_next/image') {
175
166
  errors.push(
176
167
  `Specified images.loader property (${loader}) also requires images.path property to be assigned to a URL prefix.`,
177
- );
168
+ )
178
169
  }
179
170
  if (typeof img.loaderFile === 'string' && img.loaderFile !== '') {
180
171
  errors.push(
181
172
  `Specified images.loader property (${loader}) cannot be used with images.loaderFile property. Please set images.loader to "custom".`,
182
- );
173
+ )
183
174
  }
184
175
  }
185
176
  }
@@ -189,28 +180,28 @@ export function collectImagesConfigErrors(
189
180
  // absolute filesystem path — resolve it against the config root.
190
181
  const absolute = img.loaderFile.startsWith('/')
191
182
  ? path.join(root, img.loaderFile)
192
- : path.resolve(root, img.loaderFile);
183
+ : path.resolve(root, img.loaderFile)
193
184
  if (!fs.existsSync(absolute)) {
194
- errors.push(`Specified images.loaderFile does not exist at "${absolute}".`);
185
+ errors.push(`Specified images.loaderFile does not exist at "${absolute}".`)
195
186
  } else if (!hasDefaultExport(absolute)) {
196
187
  errors.push(
197
188
  'images.loaderFile detected but the file is missing default export.\n' +
198
189
  'Read more: https://nextjs.org/docs/messages/invalid-images-config',
199
- );
190
+ )
200
191
  }
201
192
  }
202
193
 
203
194
  if (img.formats !== undefined) {
204
195
  if (!Array.isArray(img.formats)) {
205
- errors.push(`Expected array, received ${received(img.formats)} at "images.formats"`);
196
+ errors.push(`Expected array, received ${received(img.formats)} at "images.formats"`)
206
197
  } else {
207
198
  img.formats.forEach((format, index) => {
208
199
  if (!FORMATS.includes(format as never)) {
209
200
  errors.push(
210
201
  `Expected ${quotedUnion(FORMATS)}, received '${String(format)}' at "images.formats[${index}]"`,
211
- );
202
+ )
212
203
  }
213
- });
204
+ })
214
205
  }
215
206
  }
216
207
 
@@ -220,50 +211,50 @@ export function collectImagesConfigErrors(
220
211
  ) {
221
212
  errors.push(
222
213
  `Expected ${quotedUnion(DISPOSITIONS)}, received '${typeof img.contentDispositionType === 'string' ? img.contentDispositionType : received(img.contentDispositionType)}' at "images.contentDispositionType"`,
223
- );
214
+ )
224
215
  }
225
216
 
226
217
  if (img.contentSecurityPolicy !== undefined && typeof img.contentSecurityPolicy !== 'string') {
227
218
  errors.push(
228
219
  `Expected string, received ${received(img.contentSecurityPolicy)} at "images.contentSecurityPolicy"`,
229
- );
220
+ )
230
221
  }
231
222
 
232
223
  if (img.minimumCacheTTL !== undefined) {
233
224
  if (typeof img.minimumCacheTTL !== 'number') {
234
225
  errors.push(
235
226
  `Expected number, received ${received(img.minimumCacheTTL)} at "images.minimumCacheTTL"`,
236
- );
227
+ )
237
228
  } else if (img.minimumCacheTTL < 0) {
238
- errors.push('Number must be greater than or equal to 0 at "images.minimumCacheTTL"');
229
+ errors.push('Number must be greater than or equal to 0 at "images.minimumCacheTTL"')
239
230
  }
240
231
  }
241
232
 
242
233
  for (const key of ['dangerouslyAllowSVG', 'unoptimized', 'disableStaticImages'] as const) {
243
234
  if (img[key] !== undefined && typeof img[key] !== 'boolean') {
244
- errors.push(`Expected boolean, received ${received(img[key])} at "images.${key}"`);
235
+ errors.push(`Expected boolean, received ${received(img[key])} at "images.${key}"`)
245
236
  }
246
237
  }
247
238
 
248
- return errors;
239
+ return errors
249
240
  }
250
241
 
251
242
  function validateSizeArray(errors: string[], value: unknown, label: string): void {
252
- if (value === undefined) return;
243
+ if (value === undefined) return
253
244
  if (!Array.isArray(value)) {
254
- errors.push(`Expected array, received ${received(value)} at "${label}"`);
255
- return;
245
+ errors.push(`Expected array, received ${received(value)} at "${label}"`)
246
+ return
256
247
  }
257
248
  if (value.length > 25) {
258
- errors.push(`Array must contain at most 25 element(s) at "${label}"`);
249
+ errors.push(`Array must contain at most 25 element(s) at "${label}"`)
259
250
  }
260
251
  value.forEach((size, index) => {
261
252
  if (typeof size !== 'number') {
262
- errors.push(`Expected number, received ${received(size)} at "${label}[${index}]"`);
253
+ errors.push(`Expected number, received ${received(size)} at "${label}[${index}]"`)
263
254
  } else if (size < 1) {
264
- errors.push(`Number must be greater than or equal to 1 at "${label}[${index}]"`);
255
+ errors.push(`Number must be greater than or equal to 1 at "${label}[${index}]"`)
265
256
  } else if (size > 10000) {
266
- errors.push(`Number must be less than or equal to 10000 at "${label}[${index}]"`);
257
+ errors.push(`Number must be less than or equal to 10000 at "${label}[${index}]"`)
267
258
  }
268
- });
259
+ })
269
260
  }
@@ -1,17 +1,17 @@
1
- import { registerResourceHint } from '../../render/resource-hints';
2
- import { forwardRef } from 'preact/compat';
3
- import ClientImage from './image-client';
4
- import { getImagesConfig, resolveImageProps } from './image-props';
5
- import type { ImageProps } from './image-props';
1
+ import { registerResourceHint } from '../../render/resource-hints'
2
+ import { forwardRef } from 'preact/compat'
3
+ import ClientImage from './image/client'
4
+ import { getImagesConfig, resolveImageProps } from './image/props'
5
+ import type { ImageProps } from './image/props'
6
6
 
7
7
  const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(imageProps, forwardedRef) {
8
- const config = getImagesConfig();
9
- const { props, meta } = resolveImageProps(imageProps, config);
8
+ const config = getImagesConfig()
9
+ const { props, meta } = resolveImageProps(imageProps, config)
10
10
  const extra = imageProps as ImageProps & {
11
- crossOrigin?: string;
12
- referrerPolicy?: string;
13
- fetchPriority?: string;
14
- };
11
+ crossOrigin?: string
12
+ referrerPolicy?: string
13
+ fetchPriority?: string
14
+ }
15
15
 
16
16
  if (meta.preload) {
17
17
  registerResourceHint({
@@ -25,7 +25,7 @@ const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(imageProps
25
25
  ...(extra.referrerPolicy ? { referrerpolicy: extra.referrerPolicy } : {}),
26
26
  ...(extra.fetchPriority ? { fetchpriority: extra.fetchPriority } : {}),
27
27
  },
28
- });
28
+ })
29
29
  }
30
30
 
31
31
  if (!process.browser && typeof window === 'undefined') {
@@ -40,17 +40,13 @@ const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(imageProps
40
40
  {...(meta.loadedStyle !== undefined ? { 'data-nimg-ph': meta.loadedStyle } : {})}
41
41
  ref={forwardedRef}
42
42
  />
43
- );
43
+ )
44
44
  }
45
45
 
46
- return <ClientImage {...imageProps} ref={forwardedRef} __pnextConfig={config} />;
47
- });
46
+ return <ClientImage {...imageProps} ref={forwardedRef} __pnextConfig={config} />
47
+ })
48
48
 
49
- export default Image;
50
- export { Image };
51
- export {
52
- findClosestQuality,
53
- getImageProps,
54
- unstable_getImgProps,
55
- } from './image-props';
56
- export type { ImageLoader, ImageProps, StaticImageData } from './image-props';
49
+ export default Image
50
+ export { Image }
51
+ export { findClosestQuality, getImageProps, unstable_getImgProps } from './image/props'
52
+ export type { ImageLoader, ImageProps, StaticImageData } from './image/props'
@@ -1 +1 @@
1
- export type { Metadata, MetadataLink, Viewport } from '../../types';
1
+ export type { Metadata, MetadataLink, Viewport } from '../../types'
@@ -1,7 +1,7 @@
1
- import { forwardRef } from 'preact/compat';
2
- import { registerResourceHint } from '../../render/resource-hints';
3
- import { getImagesConfig, resolveImageProps } from './image-props';
4
- import type { ImageProps } from './image-props';
1
+ import { forwardRef } from 'preact/compat'
2
+ import { registerResourceHint } from '../../render/resource-hints'
3
+ import { getImagesConfig, resolveImageProps } from './image/props'
4
+ import type { ImageProps } from './image/props'
5
5
 
6
6
  // next/legacy/image (the pre-13 component).
7
7
  //
@@ -18,9 +18,9 @@ import type { ImageProps } from './image-props';
18
18
  // still maps to the same styles next/image applies and lands in `data-nimg`.
19
19
 
20
20
  const EMPTY_DATA_URL =
21
- 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
21
+ 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
22
22
 
23
- const LEGACY_SRC_ATTR = 'data-pnext-legacy-src';
23
+ const LEGACY_SRC_ATTR = 'data-pnext-legacy-src'
24
24
 
25
25
  // Swaps every blanked legacy image to its real attributes when it nears the
26
26
  // viewport (falling back to an immediate swap without IntersectionObserver).
@@ -35,63 +35,62 @@ const LAZY_SWAP_SCRIPT =
35
35
  `if(!("IntersectionObserver"in window)){for(i=0;i<l.length;i++)s(l[i]);return}` +
36
36
  `var o=new IntersectionObserver(function(es){for(var k=0;k<es.length;k++){if(es[k].isIntersecting){s(es[k].target);o.unobserve(es[k].target)}}},{rootMargin:"200px"});` +
37
37
  `for(i=0;i<l.length;i++)o.observe(l[i])}` +
38
- `if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",b);else b()}catch(e){}}());`;
38
+ `if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",b);else b()}catch(e){}}());`
39
39
 
40
- const LegacyImage = forwardRef<HTMLImageElement, ImageProps>(function LegacyImage(
41
- imageProps,
42
- forwardedRef,
43
- ) {
44
- const config = getImagesConfig();
45
- // `intrinsic` is the legacy default layout (next/image has no default).
46
- const layout = imageProps.layout ?? 'intrinsic';
47
- const { props, meta } = resolveImageProps({ ...imageProps, layout }, config);
40
+ const LegacyImage = forwardRef<HTMLImageElement, ImageProps>(
41
+ function LegacyImage(imageProps, forwardedRef) {
42
+ const config = getImagesConfig()
43
+ // `intrinsic` is the legacy default layout (next/image has no default).
44
+ const layout = imageProps.layout ?? 'intrinsic'
45
+ const { props, meta } = resolveImageProps({ ...imageProps, layout }, config)
48
46
 
49
- if (meta.preload) {
50
- registerResourceHint({
51
- rel: 'preload',
52
- as: 'image',
53
- ...(meta.imgAttributes.srcSet ? {} : { url: meta.imgAttributes.src }),
54
- attributes: {
55
- ...(meta.imgAttributes.srcSet ? { imagesrcset: meta.imgAttributes.srcSet } : {}),
56
- ...(meta.imgAttributes.sizes ? { imagesizes: meta.imgAttributes.sizes } : {}),
57
- },
58
- });
59
- }
47
+ if (meta.preload) {
48
+ registerResourceHint({
49
+ rel: 'preload',
50
+ as: 'image',
51
+ ...(meta.imgAttributes.srcSet ? {} : { url: meta.imgAttributes.src }),
52
+ attributes: {
53
+ ...(meta.imgAttributes.srcSet ? { imagesrcset: meta.imgAttributes.srcSet } : {}),
54
+ ...(meta.imgAttributes.sizes ? { imagesizes: meta.imgAttributes.sizes } : {}),
55
+ },
56
+ })
57
+ }
60
58
 
61
- const eager = props.loading === 'eager' || Boolean(imageProps.priority);
62
- const nimgAttrs = {
63
- 'data-nimg': layout,
64
- ...(meta.loadedStyle !== undefined ? { 'data-nimg-ph': meta.loadedStyle } : {}),
65
- };
59
+ const eager = props.loading === 'eager' || Boolean(imageProps.priority)
60
+ const nimgAttrs = {
61
+ 'data-nimg': layout,
62
+ ...(meta.loadedStyle !== undefined ? { 'data-nimg-ph': meta.loadedStyle } : {}),
63
+ }
66
64
 
67
- // On the client the component renders its real attributes directly — the
68
- // browser's own `loading="lazy"` covers deferral there.
69
- if (eager || (process.browser || typeof window !== 'undefined')) {
70
- return <img {...props} {...nimgAttrs} ref={forwardedRef} />;
71
- }
65
+ // On the client the component renders its real attributes directly — the
66
+ // browser's own `loading="lazy"` covers deferral there.
67
+ if (eager || process.browser || typeof window !== 'undefined') {
68
+ return <img {...props} {...nimgAttrs} ref={forwardedRef} />
69
+ }
72
70
 
73
- const { src, srcSet, sizes, ...blanked } = props;
74
- return (
75
- <>
76
- <img
77
- {...blanked}
78
- src={EMPTY_DATA_URL}
79
- loading="lazy"
80
- {...nimgAttrs}
81
- {...(typeof src === 'string' ? { [LEGACY_SRC_ATTR]: src } : {})}
82
- {...(typeof srcSet === 'string' ? { [`${LEGACY_SRC_ATTR}set`]: srcSet } : {})}
83
- {...(typeof sizes === 'string' ? { [`${LEGACY_SRC_ATTR}sizes`]: sizes } : {})}
84
- ref={forwardedRef}
85
- />
86
- <noscript>
87
- <img {...props} loading="lazy" {...nimgAttrs} />
88
- </noscript>
89
- <script dangerouslySetInnerHTML={{ __html: LAZY_SWAP_SCRIPT }} />
90
- </>
91
- );
92
- });
71
+ const { src, srcSet, sizes, ...blanked } = props
72
+ return (
73
+ <>
74
+ <img
75
+ {...blanked}
76
+ src={EMPTY_DATA_URL}
77
+ loading="lazy"
78
+ {...nimgAttrs}
79
+ {...(typeof src === 'string' ? { [LEGACY_SRC_ATTR]: src } : {})}
80
+ {...(typeof srcSet === 'string' ? { [`${LEGACY_SRC_ATTR}set`]: srcSet } : {})}
81
+ {...(typeof sizes === 'string' ? { [`${LEGACY_SRC_ATTR}sizes`]: sizes } : {})}
82
+ ref={forwardedRef}
83
+ />
84
+ <noscript>
85
+ <img {...props} loading="lazy" {...nimgAttrs} />
86
+ </noscript>
87
+ <script dangerouslySetInnerHTML={{ __html: LAZY_SWAP_SCRIPT }} />
88
+ </>
89
+ )
90
+ },
91
+ )
93
92
 
94
- export default LegacyImage;
95
- export { LegacyImage as Image };
96
- export { getImageProps, unstable_getImgProps } from './image-props';
97
- export type { ImageLoader, ImageProps, StaticImageData } from './image-props';
93
+ export default LegacyImage
94
+ export { LegacyImage as Image }
95
+ export { getImageProps, unstable_getImgProps } from './image/props'
96
+ export type { ImageLoader, ImageProps, StaticImageData } from './image/props'