@wular/pnext 0.0.1

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 (371) hide show
  1. package/README.md +153 -0
  2. package/bin/pnext +67 -0
  3. package/config/lint/base.js +48 -0
  4. package/config/ts/base.json +26 -0
  5. package/config/ts/react.json +13 -0
  6. package/package.json +70 -0
  7. package/reference/compat.md +63 -0
  8. package/reference/config.md +120 -0
  9. package/reference/css.md +58 -0
  10. package/reference/dev.md +69 -0
  11. package/reference/env.md +40 -0
  12. package/reference/metadata.md +86 -0
  13. package/reference/navigation.md +149 -0
  14. package/reference/overview.md +35 -0
  15. package/reference/performance.md +97 -0
  16. package/reference/rendering.md +127 -0
  17. package/reference/routing.md +167 -0
  18. package/reference/typegen.md +64 -0
  19. package/src/api/cache.ts +80 -0
  20. package/src/api/client-cache.ts +9 -0
  21. package/src/api/client-navigation.ts +279 -0
  22. package/src/api/dynamic.tsx +102 -0
  23. package/src/api/link.tsx +119 -0
  24. package/src/api/navigation.ts +198 -0
  25. package/src/api/router/events.ts +53 -0
  26. package/src/api/router/history.ts +70 -0
  27. package/src/api/router/hub.ts +194 -0
  28. package/src/api/router/policies.ts +107 -0
  29. package/src/api/router/runtime.ts +5238 -0
  30. package/src/api/router/types.ts +299 -0
  31. package/src/api/router.ts +167 -0
  32. package/src/api/server.ts +323 -0
  33. package/src/api/suspense.ts +16 -0
  34. package/src/cache/context.ts +61 -0
  35. package/src/cli/adapters/vercel-warm.ts +375 -0
  36. package/src/cli/adapters/vercel.ts +1310 -0
  37. package/src/cli/analyze-print.ts +181 -0
  38. package/src/cli/analyze.ts +328 -0
  39. package/src/cli/boot-trace.ts +29 -0
  40. package/src/cli/build.ts +3114 -0
  41. package/src/cli/dev.ts +276 -0
  42. package/src/cli/index.ts +196 -0
  43. package/src/cli/named-bin.ts +119 -0
  44. package/src/cli/serve-ui.ts +160 -0
  45. package/src/cli/start.ts +1425 -0
  46. package/src/client/build.ts +2136 -0
  47. package/src/client/chunk-fold.ts +526 -0
  48. package/src/client/entry.ts +1525 -0
  49. package/src/client/paths.ts +22 -0
  50. package/src/client/prebuilt.ts +621 -0
  51. package/src/client/profile.ts +75 -0
  52. package/src/client/react-compiler.ts +94 -0
  53. package/src/client/reference-stub.ts +145 -0
  54. package/src/client/reference.ts +47 -0
  55. package/src/compat/actions/action-client.ts +531 -0
  56. package/src/compat/actions/action-dispatch.ts +676 -0
  57. package/src/compat/actions/action-router.ts +40 -0
  58. package/src/compat/actions/action-shared.ts +95 -0
  59. package/src/compat/actions/client-plugin.ts +135 -0
  60. package/src/compat/actions/client-stub.ts +65 -0
  61. package/src/compat/actions/config.ts +164 -0
  62. package/src/compat/actions/detect.ts +208 -0
  63. package/src/compat/actions/discovery.ts +244 -0
  64. package/src/compat/actions/early-submit.ts +40 -0
  65. package/src/compat/actions/endpoint.ts +602 -0
  66. package/src/compat/actions/flight.ts +52 -0
  67. package/src/compat/actions/form-state.ts +73 -0
  68. package/src/compat/actions/hoist.ts +485 -0
  69. package/src/compat/actions/ids.ts +39 -0
  70. package/src/compat/actions/index.ts +41 -0
  71. package/src/compat/actions/instances.ts +144 -0
  72. package/src/compat/actions/origin.ts +109 -0
  73. package/src/compat/actions/protocol.ts +125 -0
  74. package/src/compat/actions/registry.ts +74 -0
  75. package/src/compat/actions/rewrite.ts +282 -0
  76. package/src/compat/actions/serve.ts +414 -0
  77. package/src/compat/actions/server-tag.ts +21 -0
  78. package/src/compat/actions/unrecognized-error.ts +30 -0
  79. package/src/compat/adapter/build-complete.ts +257 -0
  80. package/src/compat/bundler/bun-externals.ts +53 -0
  81. package/src/compat/bundler/cjs-exports.ts +542 -0
  82. package/src/compat/bundler/config.ts +363 -0
  83. package/src/compat/bundler/externals.ts +34 -0
  84. package/src/compat/bundler/import-meta-url.ts +60 -0
  85. package/src/compat/bundler/modularize-imports.ts +119 -0
  86. package/src/compat/bundler/new-url-asset.ts +87 -0
  87. package/src/compat/bundler/optimize-package-imports.ts +273 -0
  88. package/src/compat/bundler/polyfill.ts +88 -0
  89. package/src/compat/bundler/react-compiler.ts +61 -0
  90. package/src/compat/bundler/react-profiler.tsx +25 -0
  91. package/src/compat/bundler/relay-transform.ts +116 -0
  92. package/src/compat/bundler/require-context.ts +281 -0
  93. package/src/compat/bundler/resolve-extensions.ts +75 -0
  94. package/src/compat/bundler/source-cache.ts +61 -0
  95. package/src/compat/bundler/static-imports.ts +25 -0
  96. package/src/compat/bundler/symlink-imports.ts +119 -0
  97. package/src/compat/bundler/tsconfig-paths.ts +50 -0
  98. package/src/compat/bundler/wasm.ts +153 -0
  99. package/src/compat/bundler/webpack-loaders.ts +685 -0
  100. package/src/compat/bundler/worker.ts +278 -0
  101. package/src/compat/cache/build-flags.ts +81 -0
  102. package/src/compat/cache/build-prerender-errors.ts +163 -0
  103. package/src/compat/cache/custom-handler.ts +159 -0
  104. package/src/compat/cache/fetch-patch.ts +745 -0
  105. package/src/compat/cache/handler.ts +100 -0
  106. package/src/compat/cache/modern-handler.ts +275 -0
  107. package/src/compat/cache/resume-data-cache.ts +143 -0
  108. package/src/compat/cache/revalidate.ts +759 -0
  109. package/src/compat/cache/runtime-error.ts +124 -0
  110. package/src/compat/cache/use-cache-transform.ts +961 -0
  111. package/src/compat/cache/use-cache.ts +1695 -0
  112. package/src/compat/cache-control.ts +269 -0
  113. package/src/compat/client/base-path.ts +64 -0
  114. package/src/compat/client/css-order.ts +36 -0
  115. package/src/compat/client/errors/control-flow.ts +92 -0
  116. package/src/compat/client/errors/error-boundary.ts +222 -0
  117. package/src/compat/client/errors/global-error.ts +238 -0
  118. package/src/compat/client/errors/install.ts +217 -0
  119. package/src/compat/client/errors/lazy.ts +53 -0
  120. package/src/compat/client/errors/primitive-throw.ts +126 -0
  121. package/src/compat/client/errors/soft-refresh.ts +14 -0
  122. package/src/compat/client/link-status.ts +86 -0
  123. package/src/compat/client/nav-compat-runtime.ts +57 -0
  124. package/src/compat/client/nav-compat.ts +42 -0
  125. package/src/compat/client/navigation-scroll.ts +154 -0
  126. package/src/compat/client/optimistic-routing.ts +206 -0
  127. package/src/compat/client/prefetch-cache.ts +111 -0
  128. package/src/compat/client/route-announcer.ts +72 -0
  129. package/src/compat/client/segment-cache-policy.ts +159 -0
  130. package/src/compat/client/segment-cache.ts +1077 -0
  131. package/src/compat/client/segment-prefetch.ts +375 -0
  132. package/src/compat/client/trailing-slash.ts +24 -0
  133. package/src/compat/css/chunking.ts +254 -0
  134. package/src/compat/css/inline-css.ts +73 -0
  135. package/src/compat/css/lightningcss.ts +90 -0
  136. package/src/compat/css/modules.ts +373 -0
  137. package/src/compat/css/nonce.ts +30 -0
  138. package/src/compat/css/sass-plugin.ts +65 -0
  139. package/src/compat/css/sass.ts +392 -0
  140. package/src/compat/css/styled-jsx-runtime.ts +80 -0
  141. package/src/compat/css/styled-jsx.ts +49 -0
  142. package/src/compat/edge-runtime.ts +71 -0
  143. package/src/compat/export/client.ts +112 -0
  144. package/src/compat/export/index.ts +272 -0
  145. package/src/compat/export/standalone.ts +207 -0
  146. package/src/compat/image-optimizer/cache.ts +119 -0
  147. package/src/compat/image-optimizer/detect.ts +143 -0
  148. package/src/compat/image-optimizer/index.ts +601 -0
  149. package/src/compat/image-optimizer/source.ts +243 -0
  150. package/src/compat/index.ts +458 -0
  151. package/src/compat/lifecycle/after-scope.ts +86 -0
  152. package/src/compat/lifecycle/after.ts +173 -0
  153. package/src/compat/lifecycle/error-funnel.ts +306 -0
  154. package/src/compat/lifecycle/error-serialize.ts +87 -0
  155. package/src/compat/lifecycle/error-ui.ts +167 -0
  156. package/src/compat/lifecycle/instrumentation-client.ts +138 -0
  157. package/src/compat/lifecycle/instrumentation.ts +277 -0
  158. package/src/compat/lifecycle/node-console.ts +19 -0
  159. package/src/compat/lifecycle/testmode.ts +263 -0
  160. package/src/compat/mdx/compile.ts +219 -0
  161. package/src/compat/mdx/next-mdx-stub.ts +46 -0
  162. package/src/compat/mdx/plugin.ts +37 -0
  163. package/src/compat/metadata-route-artifacts.ts +458 -0
  164. package/src/compat/metadata.ts +295 -0
  165. package/src/compat/middleware/manifest.ts +210 -0
  166. package/src/compat/misc/action-return.ts +173 -0
  167. package/src/compat/next/cache.ts +211 -0
  168. package/src/compat/next/canonical-url.ts +35 -0
  169. package/src/compat/next/client-cache.ts +57 -0
  170. package/src/compat/next/client-navigation.ts +313 -0
  171. package/src/compat/next/client-only.ts +3 -0
  172. package/src/compat/next/client-script.tsx +215 -0
  173. package/src/compat/next/client-server.ts +39 -0
  174. package/src/compat/next/config-loader.ts +569 -0
  175. package/src/compat/next/config.ts +29 -0
  176. package/src/compat/next/constants.cjs +6 -0
  177. package/src/compat/next/constants.ts +6 -0
  178. package/src/compat/next/custom-server.ts +236 -0
  179. package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
  180. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
  181. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
  182. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
  183. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
  184. package/src/compat/next/dynamic.tsx +46 -0
  185. package/src/compat/next/error.tsx +148 -0
  186. package/src/compat/next/font/cache.ts +171 -0
  187. package/src/compat/next/font/google.ts +2 -0
  188. package/src/compat/next/font/index.ts +8 -0
  189. package/src/compat/next/font/local.ts +5 -0
  190. package/src/compat/next/font/runtime-client.ts +71 -0
  191. package/src/compat/next/font/runtime.ts +974 -0
  192. package/src/compat/next/font/shared.ts +281 -0
  193. package/src/compat/next/form.tsx +156 -0
  194. package/src/compat/next/head.tsx +10 -0
  195. package/src/compat/next/headers.ts +247 -0
  196. package/src/compat/next/image/config.ts +196 -0
  197. package/src/compat/next/image/optimizer.ts +96 -0
  198. package/src/compat/next/image/patterns.ts +103 -0
  199. package/src/compat/next/image/shared.ts +141 -0
  200. package/src/compat/next/image/static-metadata.ts +283 -0
  201. package/src/compat/next/image/validate.ts +269 -0
  202. package/src/compat/next/image-client.tsx +215 -0
  203. package/src/compat/next/image-props.ts +575 -0
  204. package/src/compat/next/image-usage.ts +102 -0
  205. package/src/compat/next/image.tsx +56 -0
  206. package/src/compat/next/index.ts +1 -0
  207. package/src/compat/next/legacy-image.tsx +97 -0
  208. package/src/compat/next/link-usage.ts +29 -0
  209. package/src/compat/next/link-validation-transform.ts +200 -0
  210. package/src/compat/next/link.tsx +466 -0
  211. package/src/compat/next/navigation.cjs +21 -0
  212. package/src/compat/next/navigation.ts +188 -0
  213. package/src/compat/next/offline.ts +51 -0
  214. package/src/compat/next/og.ts +324 -0
  215. package/src/compat/next/optimistic-route-state.ts +188 -0
  216. package/src/compat/next/preferred-region.ts +39 -0
  217. package/src/compat/next/redirects.ts +131 -0
  218. package/src/compat/next/resource-hints.ts +136 -0
  219. package/src/compat/next/rewrites.ts +350 -0
  220. package/src/compat/next/root-params.ts +142 -0
  221. package/src/compat/next/router.cjs +49 -0
  222. package/src/compat/next/router.ts +143 -0
  223. package/src/compat/next/script.tsx +355 -0
  224. package/src/compat/next/server-only.ts +3 -0
  225. package/src/compat/next/server.ts +28 -0
  226. package/src/compat/next/svgr.ts +58 -0
  227. package/src/compat/next/telemetry.ts +77 -0
  228. package/src/compat/next/user-agent.ts +100 -0
  229. package/src/compat/next/web-vitals.ts +56 -0
  230. package/src/compat/otel/api.ts +95 -0
  231. package/src/compat/otel/client-trace-metadata.ts +71 -0
  232. package/src/compat/otel/fetch-span.ts +77 -0
  233. package/src/compat/otel/tracer.ts +944 -0
  234. package/src/compat/pages/client-plugin.ts +108 -0
  235. package/src/compat/pages/index.ts +527 -0
  236. package/src/compat/pages/router-state.ts +94 -0
  237. package/src/compat/ppr/io.ts +38 -0
  238. package/src/compat/ppr/missing-root-params.ts +105 -0
  239. package/src/compat/ppr/root-params-scan.ts +164 -0
  240. package/src/compat/ppr/root-params-transform.ts +75 -0
  241. package/src/compat/ppr/root-params.ts +129 -0
  242. package/src/compat/ppr/segment-config-incompat.ts +34 -0
  243. package/src/compat/protocol.ts +202 -0
  244. package/src/compat/react/client.ts +59 -0
  245. package/src/compat/react/compiler-runtime.ts +60 -0
  246. package/src/compat/react/dom-client.ts +115 -0
  247. package/src/compat/react/dom-react-server.ts +20 -0
  248. package/src/compat/react/dom-server.ts +40 -0
  249. package/src/compat/react/dom.ts +154 -0
  250. package/src/compat/react/preact.ts +522 -0
  251. package/src/compat/react/react-server.ts +84 -0
  252. package/src/compat/react/router-shim.ts +26 -0
  253. package/src/compat/react/server-component-use.ts +48 -0
  254. package/src/compat/react/server-inserted-html.ts +87 -0
  255. package/src/compat/react/server.ts +156 -0
  256. package/src/compat/react/view-transition.ts +60 -0
  257. package/src/compat/register/actions.ts +875 -0
  258. package/src/compat/register/boot.ts +141 -0
  259. package/src/compat/register/build-tier.ts +11 -0
  260. package/src/compat/register/build.ts +182 -0
  261. package/src/compat/register/bundler.ts +587 -0
  262. package/src/compat/register/cache.ts +85 -0
  263. package/src/compat/register/client-errors.ts +18 -0
  264. package/src/compat/register/config.ts +17 -0
  265. package/src/compat/register/css-extras.ts +120 -0
  266. package/src/compat/register/edge-runtime.ts +6 -0
  267. package/src/compat/register/errors.ts +46 -0
  268. package/src/compat/register/export.ts +23 -0
  269. package/src/compat/register/font.ts +36 -0
  270. package/src/compat/register/hooks.ts +34 -0
  271. package/src/compat/register/image.ts +133 -0
  272. package/src/compat/register/index.ts +111 -0
  273. package/src/compat/register/instrumentation-client.ts +35 -0
  274. package/src/compat/register/lifecycle.ts +86 -0
  275. package/src/compat/register/mdx.ts +48 -0
  276. package/src/compat/register/middleware.ts +36 -0
  277. package/src/compat/register/misc.ts +44 -0
  278. package/src/compat/register/otel.ts +288 -0
  279. package/src/compat/register/pages-api.ts +473 -0
  280. package/src/compat/register/ppr.ts +56 -0
  281. package/src/compat/register/protocol.ts +57 -0
  282. package/src/compat/register/proxy.ts +127 -0
  283. package/src/compat/register/render.ts +268 -0
  284. package/src/compat/register/routing.ts +410 -0
  285. package/src/compat/register/segment.ts +1903 -0
  286. package/src/compat/register/static-image.ts +21 -0
  287. package/src/compat/register/typed-routes.ts +35 -0
  288. package/src/compat/register/usecache.ts +131 -0
  289. package/src/compat/register/validation.ts +56 -0
  290. package/src/compat/segment/loading-boundary.ts +113 -0
  291. package/src/compat/segment/page-slot.ts +200 -0
  292. package/src/compat/segment/tree.ts +481 -0
  293. package/src/compat/segment/vary-key.ts +102 -0
  294. package/src/compat/segment/vary-params.ts +551 -0
  295. package/src/compat/static-params.ts +33 -0
  296. package/src/compat/tsconfig-defaults.ts +301 -0
  297. package/src/compat/typecheck/index.ts +1481 -0
  298. package/src/compat/typecheck/worker.ts +26 -0
  299. package/src/compat/typed-routes/index.ts +92 -0
  300. package/src/compat/typed-routes/manifest.ts +356 -0
  301. package/src/compat/typed-routes/typegen.ts +566 -0
  302. package/src/compat/validation/errors.ts +159 -0
  303. package/src/compat/validation/index.ts +1770 -0
  304. package/src/compat/validation/prerender-diagnostics.ts +1508 -0
  305. package/src/compat-bootstrap.ts +67 -0
  306. package/src/config.ts +218 -0
  307. package/src/css/build.ts +697 -0
  308. package/src/css/index.ts +2 -0
  309. package/src/css/postcss.ts +236 -0
  310. package/src/css/worker.ts +34 -0
  311. package/src/dev/client-actions.ts +35 -0
  312. package/src/dev/client-chunk-store.ts +92 -0
  313. package/src/dev/client-key-cache.ts +178 -0
  314. package/src/dev/global-css-cache.ts +212 -0
  315. package/src/dev/imports.ts +2430 -0
  316. package/src/dev/module-cache.ts +721 -0
  317. package/src/dev/module-generations.ts +38 -0
  318. package/src/dev/module-transform.ts +188 -0
  319. package/src/dev/node-module-bundle-cache.ts +63 -0
  320. package/src/dev/restart-cache.ts +10 -0
  321. package/src/dev/route-bundle-key-cache.ts +154 -0
  322. package/src/dev/route-facts-cache.ts +223 -0
  323. package/src/dev/server.ts +1710 -0
  324. package/src/dynamic/source.ts +307 -0
  325. package/src/dynamic/tree-shake.ts +262 -0
  326. package/src/env.ts +92 -0
  327. package/src/extensions.ts +1898 -0
  328. package/src/index.ts +34 -0
  329. package/src/internal.ts +43 -0
  330. package/src/islands/boundary-error.ts +8 -0
  331. package/src/islands/static-children.ts +37 -0
  332. package/src/islands/static-slots.ts +106 -0
  333. package/src/ppr-postpone.ts +24 -0
  334. package/src/ppr.ts +784 -0
  335. package/src/proxy.ts +752 -0
  336. package/src/render/hooks.ts +384 -0
  337. package/src/render/index.ts +1 -0
  338. package/src/render/island-context.ts +47 -0
  339. package/src/render/metadata.ts +857 -0
  340. package/src/render/renderer.ts +7391 -0
  341. package/src/render/resource-hints.ts +44 -0
  342. package/src/render/slots.tsx +679 -0
  343. package/src/request/context.ts +396 -0
  344. package/src/resolve/engine.ts +219 -0
  345. package/src/resolve/imports.ts +1104 -0
  346. package/src/resolve/scan-facts.ts +474 -0
  347. package/src/resolve/source-text.ts +86 -0
  348. package/src/routing/forwarded.ts +41 -0
  349. package/src/routing/handler.ts +271 -0
  350. package/src/routing/href.ts +203 -0
  351. package/src/routing/metadata.ts +1018 -0
  352. package/src/routing/request-runtime.ts +43 -0
  353. package/src/routing/routes.ts +2560 -0
  354. package/src/routing/slots.ts +432 -0
  355. package/src/runtime/server.ts +3453 -0
  356. package/src/runtime/vendor.ts +1160 -0
  357. package/src/style-modules.d.ts +9 -0
  358. package/src/typegen.ts +151 -0
  359. package/src/types.ts +725 -0
  360. package/src/utils/ansi.ts +9 -0
  361. package/src/utils/content-type.ts +31 -0
  362. package/src/utils/decode.ts +7 -0
  363. package/src/utils/dev-profile.ts +31 -0
  364. package/src/utils/error-log.ts +29 -0
  365. package/src/utils/fs-cache.ts +31 -0
  366. package/src/utils/fs.ts +119 -0
  367. package/src/utils/html.ts +46 -0
  368. package/src/utils/serialize.ts +378 -0
  369. package/src/utils/source.ts +35 -0
  370. package/src/utils/verbose.ts +39 -0
  371. package/tsconfig.json +10 -0
@@ -0,0 +1,56 @@
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
+
7
+ const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(imageProps, forwardedRef) {
8
+ const config = getImagesConfig();
9
+ const { props, meta } = resolveImageProps(imageProps, config);
10
+ const extra = imageProps as ImageProps & {
11
+ crossOrigin?: string;
12
+ referrerPolicy?: string;
13
+ fetchPriority?: string;
14
+ };
15
+
16
+ if (meta.preload) {
17
+ registerResourceHint({
18
+ rel: 'preload',
19
+ as: 'image',
20
+ ...(meta.imgAttributes.srcSet ? {} : { url: meta.imgAttributes.src }),
21
+ attributes: {
22
+ ...(meta.imgAttributes.srcSet ? { imagesrcset: meta.imgAttributes.srcSet } : {}),
23
+ ...(meta.imgAttributes.sizes ? { imagesizes: meta.imgAttributes.sizes } : {}),
24
+ ...(extra.crossOrigin ? { crossorigin: extra.crossOrigin } : {}),
25
+ ...(extra.referrerPolicy ? { referrerpolicy: extra.referrerPolicy } : {}),
26
+ ...(extra.fetchPriority ? { fetchpriority: extra.fetchPriority } : {}),
27
+ },
28
+ });
29
+ }
30
+
31
+ if (!process.browser && typeof window === 'undefined') {
32
+ // `data-nimg-ph` carries the loaded (placeholder-free) style so the inline
33
+ // placeholder script (register-image) can restore it on load for images
34
+ // that never hydrate (next/image used directly in a server component).
35
+ // Hydrating islands strip/ignore it — ClientImage owns the placeholder there.
36
+ return (
37
+ <img
38
+ {...props}
39
+ data-nimg={meta.fill ? 'fill' : '1'}
40
+ {...(meta.loadedStyle !== undefined ? { 'data-nimg-ph': meta.loadedStyle } : {})}
41
+ ref={forwardedRef}
42
+ />
43
+ );
44
+ }
45
+
46
+ return <ClientImage {...imageProps} ref={forwardedRef} __pnextConfig={config} />;
47
+ });
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';
@@ -0,0 +1 @@
1
+ export type { Metadata, MetadataLink, Viewport } from '../../types';
@@ -0,0 +1,97 @@
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
+
6
+ // next/legacy/image (the pre-13 component).
7
+ //
8
+ // Same optimizer/loader pipeline as next/image (resolveImageProps), with the one behavioral difference
9
+ // the legacy component is defined by: a LAZY image server-renders a blank 1x1 gif as `src` (no
10
+ // srcSet/sizes) and only swaps in the real, optimized attributes once it scrolls near the viewport.
11
+ // `priority` / `loading="eager"` images render their real attributes straight away.
12
+ //
13
+ // The legacy component did that swap from its own client bundle; a pnext page need not hydrate at all,
14
+ // so the swap rides on a small idempotent inline script emitted next to the image. Without JS the
15
+ // `<noscript>` copy carries the real image, exactly like Next's.
16
+ //
17
+ // Deliberately minimal: the legacy wrapper/sizer span layout scaffolding is not reproduced - `layout`
18
+ // still maps to the same styles next/image applies and lands in `data-nimg`.
19
+
20
+ const EMPTY_DATA_URL =
21
+ 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
22
+
23
+ const LEGACY_SRC_ATTR = 'data-pnext-legacy-src';
24
+
25
+ // Swaps every blanked legacy image to its real attributes when it nears the
26
+ // viewport (falling back to an immediate swap without IntersectionObserver).
27
+ // Guarded by a window flag so N images on a page still install it once, and
28
+ // wrapped in try/catch so it can never throw into the document.
29
+ const LAZY_SWAP_SCRIPT =
30
+ `window.__pnextLegacyImg||(window.__pnextLegacyImg=1,function(){try{` +
31
+ `function s(i){var a=i.getAttribute("${LEGACY_SRC_ATTR}set"),z=i.getAttribute("${LEGACY_SRC_ATTR}sizes"),u=i.getAttribute("${LEGACY_SRC_ATTR}");` +
32
+ `if(z)i.sizes=z;if(a)i.srcset=a;if(u)i.src=u;` +
33
+ `i.removeAttribute("${LEGACY_SRC_ATTR}");i.removeAttribute("${LEGACY_SRC_ATTR}set");i.removeAttribute("${LEGACY_SRC_ATTR}sizes")}` +
34
+ `function b(){var l=document.querySelectorAll("img[${LEGACY_SRC_ATTR}]"),i;` +
35
+ `if(!("IntersectionObserver"in window)){for(i=0;i<l.length;i++)s(l[i]);return}` +
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
+ `for(i=0;i<l.length;i++)o.observe(l[i])}` +
38
+ `if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",b);else b()}catch(e){}}());`;
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);
48
+
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
+ }
60
+
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
+ };
66
+
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
+ }
72
+
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
+ });
93
+
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';
@@ -0,0 +1,29 @@
1
+ import { scanFirstPartySource } from './image-usage';
2
+
3
+ /**
4
+ * Build-time app fact: can any first-party source render `<Link legacyBehavior>`? The legacy child path
5
+ * (child validation, the deprecation notice, the server/lazy child diagnostics, cloneElement) is a
6
+ * meaningful slice of `next/link`, and next/link is initial on every page that links anywhere.
7
+ *
8
+ * One-sided like the blur gate: every unreadable case answers "yes". A wrong "no" renders the legacy
9
+ * child shape on the server and a plain anchor on the client - a hydration mismatch. The scan sees the
10
+ * app and its workspace packages, not registry dependencies.
11
+ */
12
+ const legacyProp = /\blegacyBehavior\b/;
13
+
14
+ /** A Link re-exported from here can be rendered by a file this scan can't tie
15
+ * back to `next/link`, so treat the re-export itself as usage. */
16
+ const reexportedLink = /export\s[^;]*from\s*['"]next\/link['"]/;
17
+
18
+ const cache = new Map<string, boolean>();
19
+
20
+ export function appUsesLegacyLink(root: string) {
21
+ const cached = cache.get(root);
22
+ if (cached !== undefined) return cached;
23
+ const used = scanFirstPartySource(
24
+ root,
25
+ source => legacyProp.test(source) || reexportedLink.test(source),
26
+ );
27
+ cache.set(root, used);
28
+ return used;
29
+ }
@@ -0,0 +1,200 @@
1
+ // Legacy `<Link legacyBehavior>` child validation (COMPAT): annotate the single child of a Link-shaped
2
+ // element with what it is (a server sync/async component, a lazy one), so the runtime can report Next's
3
+ // legacy-behavior errors.
4
+ //
5
+ // Folded off `typescript` onto oxc: the old path required the typescript package on first fire, a
6
+ // build-time-only dependency that also shipped into the deployed function. The gate is
7
+ // module-record-shaped (does this file import next/link at all), so the AST is only ever materialized
8
+ // for a file that really uses one.
9
+ import { parseSync } from 'oxc-parser';
10
+ import { rewriteFacts } from '../../resolve/scan-facts';
11
+
12
+ const marker = '__pnextLegacyChildKind';
13
+
14
+ interface Node {
15
+ type: string;
16
+ start: number;
17
+ end: number;
18
+ [key: string]: unknown;
19
+ }
20
+
21
+ interface JsxName {
22
+ type: string;
23
+ name?: string;
24
+ start: number;
25
+ end: number;
26
+ }
27
+
28
+ interface JsxOpeningElement extends Node {
29
+ name: JsxName;
30
+ attributes: Node[];
31
+ selfClosing: boolean;
32
+ }
33
+
34
+ interface JsxElement extends Node {
35
+ openingElement: JsxOpeningElement;
36
+ children: Node[];
37
+ closingElement: Node | null;
38
+ }
39
+
40
+ export function rewriteLegacyLinkValidation(source: string, file: string): string {
41
+ if (!source.includes('Link') && !source.includes('legacyBehavior')) return source;
42
+ const imports = rewriteFacts(file, source).imports;
43
+ const directLink =
44
+ imports.some(statement => statement.specifier === 'next/link') &&
45
+ source.includes('legacyBehavior');
46
+ const asyncLinkWrapper =
47
+ imports.some(statement =>
48
+ statement.bindings.some(binding => !binding.type && binding.local.endsWith('Link')),
49
+ ) &&
50
+ /<[A-Za-z_$][\w$]*Link\b/.test(source) &&
51
+ /\basync\s+function\b/.test(source);
52
+ if (!directLink && !asyncLinkWrapper) return source;
53
+
54
+ const program = parseSync(file, source, { lang: langForFile(file) }).program as unknown as {
55
+ body: Node[];
56
+ };
57
+ const linkNames = new Set<string>();
58
+ const asyncNames = new Set<string>();
59
+ const functionNames = new Set<string>();
60
+ const lazyNames = new Set<string>();
61
+ const edits: { at: number; text: string }[] = [];
62
+ const isClient = program.body.some(
63
+ statement =>
64
+ statement.type === 'ExpressionStatement' && statement.directive === 'use client',
65
+ );
66
+
67
+ for (const statement of program.body) {
68
+ if (statement.type === 'ImportDeclaration' && sourceValue(statement) === 'next/link') {
69
+ for (const specifier of (statement.specifiers as Node[] | undefined) ?? []) {
70
+ const local = identifierName(specifier.local);
71
+ if (!local) continue;
72
+ if (specifier.type === 'ImportDefaultSpecifier') linkNames.add(local);
73
+ else if (identifierName(specifier.imported) === 'Link') linkNames.add(local);
74
+ }
75
+ }
76
+ if (statement.type === 'FunctionDeclaration') {
77
+ const name = identifierName(statement.id);
78
+ if (name) {
79
+ functionNames.add(name);
80
+ if (statement.async === true) asyncNames.add(name);
81
+ }
82
+ }
83
+ if (statement.type === 'VariableDeclaration') {
84
+ for (const declarator of (statement.declarations as Node[] | undefined) ?? []) {
85
+ const name = identifierName(declarator.id);
86
+ const init = declarator.init as Node | null;
87
+ if (!name || !init) continue;
88
+ if (init.type === 'ArrowFunctionExpression' || init.type === 'FunctionExpression') {
89
+ functionNames.add(name);
90
+ if (init.async === true) asyncNames.add(name);
91
+ }
92
+ if (isLazyCall(init)) lazyNames.add(name);
93
+ }
94
+ }
95
+ }
96
+
97
+ // Only elements with a body can have the single child this annotates.
98
+ walk(program.body, node => {
99
+ if (node.type !== 'JSXElement') return;
100
+ const element = node as unknown as JsxElement;
101
+ if (element.closingElement === null) return;
102
+ annotate(element);
103
+ });
104
+
105
+ function annotate(element: JsxElement): void {
106
+ const opening = element.openingElement;
107
+ if (opening.name.type !== 'JSXIdentifier' || hasMarker(opening)) return;
108
+ const parent = opening.name.name ?? '';
109
+ const isLink = linkNames.has(parent);
110
+ if (!isLink && !parent.endsWith('Link')) return;
111
+ const children = element.children.filter(isMeaningfulChild);
112
+ if (children.length !== 1) return;
113
+ const kind = childKind(children[0]!);
114
+ if (!kind || (!isLink && kind !== 'server-async')) return;
115
+ const annotatedKind = !isLink
116
+ ? 'server-async-through-client'
117
+ : isClient && kind === 'lazy'
118
+ ? 'client-lazy'
119
+ : kind;
120
+ edits.push({ at: opening.name.end, text: ` ${marker}="${annotatedKind}"` });
121
+ }
122
+
123
+ function childKind(child: Node): 'server-sync' | 'server-async' | 'lazy' | undefined {
124
+ let name: string | undefined;
125
+ if (child.type === 'JSXElement') {
126
+ const opening = (child as unknown as JsxElement).openingElement;
127
+ if (opening.name.type === 'JSXIdentifier') name = opening.name.name;
128
+ } else if (child.type === 'JSXExpressionContainer') {
129
+ const expression = child.expression as Node | undefined;
130
+ if (expression?.type === 'Identifier') name = expression.name as string;
131
+ }
132
+ if (!name) return undefined;
133
+ if (lazyNames.has(name)) return 'lazy';
134
+ if (asyncNames.has(name)) return 'server-async';
135
+ if (!isClient && functionNames.has(name)) return 'server-sync';
136
+ return undefined;
137
+ }
138
+
139
+ if (edits.length === 0) return source;
140
+ let output = source;
141
+ for (const edit of edits.sort((a, b) => b.at - a.at)) {
142
+ output = output.slice(0, edit.at) + edit.text + output.slice(edit.at);
143
+ }
144
+ return output;
145
+ }
146
+
147
+ function isMeaningfulChild(child: Node): boolean {
148
+ if (child.type === 'JSXText') {
149
+ return typeof child.value === 'string' && child.value.trim().length > 0;
150
+ }
151
+ if (child.type === 'JSXExpressionContainer') {
152
+ return (child.expression as Node | undefined)?.type !== 'JSXEmptyExpression';
153
+ }
154
+ return true;
155
+ }
156
+
157
+ function hasMarker(opening: JsxOpeningElement): boolean {
158
+ return opening.attributes.some(
159
+ attribute =>
160
+ attribute.type === 'JSXAttribute' && (attribute.name as JsxName | undefined)?.name === marker,
161
+ );
162
+ }
163
+
164
+ function isLazyCall(expression: Node): boolean {
165
+ if (expression.type !== 'CallExpression') return false;
166
+ const callee = expression.callee as Node | undefined;
167
+ if (!callee) return false;
168
+ if (callee.type === 'Identifier') return callee.name === 'lazy';
169
+ return callee.type === 'MemberExpression' && identifierName(callee.property) === 'lazy';
170
+ }
171
+
172
+ function identifierName(node: unknown): string | undefined {
173
+ const named = node as { type?: string; name?: unknown } | null | undefined;
174
+ return typeof named?.name === 'string' ? named.name : undefined;
175
+ }
176
+
177
+ function sourceValue(statement: Node): string | undefined {
178
+ const literal = statement.source as { value?: unknown } | undefined;
179
+ return typeof literal?.value === 'string' ? literal.value : undefined;
180
+ }
181
+
182
+ /** Depth-first over every AST node — this only runs for a file that uses Link. */
183
+ function walk(node: unknown, visit: (node: Node) => void): void {
184
+ if (Array.isArray(node)) {
185
+ for (const item of node) walk(item, visit);
186
+ return;
187
+ }
188
+ if (!node || typeof node !== 'object') return;
189
+ const candidate = node as Node;
190
+ if (typeof candidate.type === 'string') visit(candidate);
191
+ for (const key in candidate) {
192
+ if (key !== 'type') walk(candidate[key], visit);
193
+ }
194
+ }
195
+
196
+ // `.ts` forbids JSX (`<T>value` is a type assertion); everything else parses as
197
+ // the tsx superset, matching the scan-facts language rule.
198
+ function langForFile(file: string): 'ts' | 'tsx' {
199
+ return /\.[cm]?ts$/.test(file) ? 'ts' : 'tsx';
200
+ }