@wular/pnext 0.0.4 → 0.0.6

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 (392) hide show
  1. package/README.md +11 -11
  2. package/bin/pnext +1 -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 +1 -1
  8. package/reference/config.md +2 -2
  9. package/reference/css.md +13 -9
  10. package/reference/dev.md +1 -1
  11. package/reference/metadata.md +7 -7
  12. package/reference/navigation.md +35 -28
  13. package/reference/performance.md +70 -70
  14. package/reference/rendering.md +17 -17
  15. package/reference/routing.md +17 -17
  16. package/reference/typegen.md +12 -8
  17. package/src/api/cache.ts +36 -37
  18. package/src/api/client-cache.ts +2 -2
  19. package/src/api/client-navigation.ts +113 -109
  20. package/src/api/dynamic.tsx +58 -55
  21. package/src/api/link.tsx +49 -52
  22. package/src/api/navigation.ts +59 -58
  23. package/src/api/server.ts +152 -144
  24. package/src/api/suspense.ts +4 -4
  25. package/src/cli/adapters/vercel-warm.ts +126 -121
  26. package/src/cli/adapters/vercel.ts +437 -443
  27. package/src/cli/analyze.ts +333 -144
  28. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  29. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  30. package/src/cli/build.ts +976 -978
  31. package/src/cli/create.ts +71 -63
  32. package/src/cli/dev.ts +116 -116
  33. package/src/cli/index.ts +88 -85
  34. package/src/cli/migrate/package-json.ts +73 -71
  35. package/src/cli/migrate/report.ts +32 -33
  36. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  37. package/src/cli/migrate/scan.ts +46 -46
  38. package/src/cli/migrate/spinner.ts +9 -9
  39. package/src/cli/migrate/tsconfig.ts +35 -35
  40. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  41. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  42. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  43. package/src/cli/start.ts +65 -66
  44. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  45. package/src/client/build.ts +794 -768
  46. package/src/client/chunk-fold.ts +245 -240
  47. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  48. package/src/client/entry.ts +162 -147
  49. package/src/client/prebuilt.ts +231 -223
  50. package/src/client/profile.ts +29 -29
  51. package/src/client/react-compiler.ts +20 -15
  52. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  53. package/src/client/reference-stub.ts +51 -51
  54. package/src/client/reference.ts +19 -19
  55. package/src/{api → client}/router/events.ts +17 -17
  56. package/src/{api → client}/router/history.ts +16 -16
  57. package/src/{api → client}/router/hub.ts +52 -53
  58. package/src/{api/router.ts → client/router/index.ts} +61 -60
  59. package/src/{api → client}/router/policies.ts +24 -24
  60. package/src/{api → client}/router/runtime.ts +1988 -1992
  61. package/src/{api → client}/router/types.ts +93 -98
  62. package/src/compat/actions/client-plugin.ts +42 -43
  63. package/src/compat/actions/client-stub.ts +14 -14
  64. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  65. package/src/compat/actions/config.ts +63 -64
  66. package/src/compat/actions/detect.ts +68 -68
  67. package/src/compat/actions/discovery.ts +105 -105
  68. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  69. package/src/compat/actions/early-submit.ts +1 -1
  70. package/src/compat/actions/endpoint.ts +198 -198
  71. package/src/compat/actions/extensions.ts +811 -0
  72. package/src/compat/actions/flight.ts +23 -23
  73. package/src/compat/actions/form-state.ts +34 -34
  74. package/src/compat/actions/hoist.ts +382 -236
  75. package/src/compat/actions/ids.ts +7 -12
  76. package/src/compat/actions/index.ts +8 -8
  77. package/src/compat/actions/instances.ts +46 -46
  78. package/src/compat/actions/origin.ts +47 -48
  79. package/src/compat/actions/protocol.ts +22 -22
  80. package/src/compat/actions/registry.ts +19 -19
  81. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  82. package/src/compat/actions/rewrite.ts +125 -125
  83. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  84. package/src/compat/actions/serve.ts +132 -136
  85. package/src/compat/actions/server-tag.ts +4 -4
  86. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  87. package/src/compat/actions/unrecognized-error.ts +4 -4
  88. package/src/compat/{index.ts → aliases.ts} +112 -109
  89. package/src/compat/bundler/bun-externals.ts +18 -18
  90. package/src/compat/bundler/cjs-exports.ts +271 -223
  91. package/src/compat/bundler/config.ts +116 -111
  92. package/src/compat/bundler/externals.ts +12 -12
  93. package/src/compat/bundler/import-meta-url.ts +19 -19
  94. package/src/compat/bundler/modularize-imports.ts +36 -33
  95. package/src/compat/bundler/new-url-asset.ts +22 -24
  96. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  97. package/src/compat/bundler/polyfill.ts +28 -28
  98. package/src/compat/bundler/react-compiler.ts +35 -29
  99. package/src/compat/bundler/react-profiler.tsx +11 -11
  100. package/src/compat/bundler/relay-transform.ts +48 -47
  101. package/src/compat/bundler/require-context.ts +119 -113
  102. package/src/compat/bundler/resolve-extensions.ts +19 -19
  103. package/src/compat/bundler/source-cache.ts +25 -25
  104. package/src/compat/bundler/static-imports.ts +7 -7
  105. package/src/compat/bundler/symlink-imports.ts +46 -46
  106. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  107. package/src/compat/bundler/wasm.ts +58 -60
  108. package/src/compat/bundler/webpack-loaders.ts +254 -241
  109. package/src/compat/bundler/worker.ts +101 -104
  110. package/src/compat/cache/build-flags.ts +29 -29
  111. package/src/compat/cache/build-prerender-errors.ts +40 -44
  112. package/src/compat/cache/custom-handler.ts +60 -53
  113. package/src/compat/cache/fetch-patch.ts +240 -240
  114. package/src/compat/cache/handler.ts +27 -31
  115. package/src/compat/cache/modern-handler.ts +148 -126
  116. package/src/compat/cache/resume-data-cache.ts +47 -45
  117. package/src/compat/cache/revalidate.ts +233 -232
  118. package/src/compat/cache/runtime-error.ts +35 -35
  119. package/src/compat/cache/use-cache-transform.ts +442 -417
  120. package/src/compat/cache/use-cache.ts +650 -614
  121. package/src/compat/cache-control.ts +140 -142
  122. package/src/compat/client/base-path.ts +21 -20
  123. package/src/compat/client/css-order.ts +18 -18
  124. package/src/compat/client/errors/bare-boundary.ts +11 -11
  125. package/src/compat/client/errors/control-flow.ts +23 -23
  126. package/src/compat/client/errors/error-boundary.ts +61 -61
  127. package/src/compat/client/errors/global-error.ts +101 -91
  128. package/src/compat/client/errors/install.ts +71 -72
  129. package/src/compat/client/errors/lazy.ts +23 -23
  130. package/src/compat/client/errors/primitive-throw.ts +47 -45
  131. package/src/compat/client/errors/soft-refresh.ts +4 -4
  132. package/src/compat/client/link-status.ts +33 -33
  133. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  134. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  135. package/src/compat/client/navigation-scroll.ts +63 -63
  136. package/src/compat/client/optimistic-routing.ts +93 -88
  137. package/src/compat/client/prefetch-cache.ts +23 -24
  138. package/src/compat/client/route-announcer.ts +35 -35
  139. package/src/compat/client/segment-cache-policy.ts +20 -20
  140. package/src/compat/client/segment-cache.ts +309 -315
  141. package/src/compat/client/segment-prefetch.ts +127 -132
  142. package/src/compat/client/trailing-slash.ts +5 -4
  143. package/src/compat/css/chunking.ts +113 -116
  144. package/src/compat/css/inline-css.ts +21 -21
  145. package/src/compat/css/lightningcss.ts +37 -38
  146. package/src/compat/css/modules.ts +161 -175
  147. package/src/compat/css/nonce.ts +7 -7
  148. package/src/compat/css/sass-plugin.ts +18 -21
  149. package/src/compat/css/sass.ts +150 -152
  150. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  151. package/src/compat/css/styled-jsx.ts +21 -21
  152. package/src/compat/edge-runtime.ts +27 -27
  153. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  154. package/src/compat/export/client.ts +29 -31
  155. package/src/compat/export/{index.ts → emit.ts} +111 -110
  156. package/src/compat/export/standalone.ts +62 -54
  157. package/src/compat/image-optimizer/cache.ts +51 -49
  158. package/src/compat/image-optimizer/detect.ts +52 -52
  159. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  160. package/src/compat/image-optimizer/source.ts +77 -80
  161. package/src/compat/lifecycle/after-scope.ts +26 -26
  162. package/src/compat/lifecycle/after.ts +48 -45
  163. package/src/compat/lifecycle/error-funnel.ts +98 -102
  164. package/src/compat/lifecycle/error-serialize.ts +30 -26
  165. package/src/compat/lifecycle/error-ui.ts +67 -32
  166. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  167. package/src/compat/lifecycle/instrumentation.ts +85 -85
  168. package/src/compat/lifecycle/node-console.ts +11 -11
  169. package/src/compat/lifecycle/testmode.ts +160 -132
  170. package/src/compat/mdx/compile.ts +60 -57
  171. package/src/compat/mdx/plugin.ts +11 -11
  172. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  173. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  174. package/src/compat/metadata.ts +75 -81
  175. package/src/compat/next/cache.ts +68 -69
  176. package/src/compat/next/canonical-url.ts +9 -9
  177. package/src/compat/next/client-cache.ts +19 -19
  178. package/src/compat/next/client-navigation.ts +112 -116
  179. package/src/compat/next/client-only.ts +1 -1
  180. package/src/compat/next/client-script.tsx +99 -93
  181. package/src/compat/next/client-server.ts +10 -10
  182. package/src/compat/next/config-loader.ts +176 -173
  183. package/src/compat/next/config.ts +7 -7
  184. package/src/compat/next/constants.cjs +6 -6
  185. package/src/compat/next/constants.ts +6 -6
  186. package/src/compat/next/custom-server.ts +26 -24
  187. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  188. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  189. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  190. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  191. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  192. package/src/compat/next/dynamic.tsx +21 -18
  193. package/src/compat/next/error.tsx +52 -52
  194. package/src/compat/next/font/cache.ts +74 -74
  195. package/src/compat/next/font/google.ts +2 -2
  196. package/src/compat/next/font/index.ts +1 -1
  197. package/src/compat/next/font/local.ts +3 -3
  198. package/src/compat/next/font/runtime-client.ts +17 -15
  199. package/src/compat/next/font/runtime.ts +443 -408
  200. package/src/compat/next/font/shared.ts +120 -108
  201. package/src/compat/next/form.tsx +63 -63
  202. package/src/compat/next/head.tsx +2 -2
  203. package/src/compat/next/headers.ts +103 -95
  204. package/src/compat/next/image/client.tsx +220 -0
  205. package/src/compat/next/image/config.ts +56 -58
  206. package/src/compat/next/image/optimizer.ts +40 -36
  207. package/src/compat/next/image/patterns.ts +37 -40
  208. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  209. package/src/compat/next/image/shared.ts +65 -57
  210. package/src/compat/next/image/static-metadata.ts +98 -107
  211. package/src/compat/next/image/validate.ts +79 -88
  212. package/src/compat/next/image.tsx +19 -23
  213. package/src/compat/next/index.ts +1 -1
  214. package/src/compat/next/legacy-image.tsx +59 -60
  215. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  216. package/src/compat/next/link.tsx +158 -158
  217. package/src/compat/next/navigation.cjs +12 -3
  218. package/src/compat/next/navigation.ts +48 -50
  219. package/src/compat/next/offline.ts +27 -27
  220. package/src/compat/next/og.ts +121 -124
  221. package/src/compat/next/preferred-region.ts +13 -14
  222. package/src/compat/next/redirects.ts +58 -56
  223. package/src/compat/next/resource-hints.ts +73 -76
  224. package/src/compat/next/rewrites.ts +130 -133
  225. package/src/compat/next/root-params.ts +45 -45
  226. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  227. package/src/compat/next/router.cjs +4 -2
  228. package/src/compat/next/router.ts +58 -61
  229. package/src/compat/next/script.tsx +108 -108
  230. package/src/compat/next/server-only.ts +1 -1
  231. package/src/compat/next/server.ts +19 -19
  232. package/src/compat/next/svgr.ts +18 -17
  233. package/src/compat/next/telemetry.ts +24 -24
  234. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  235. package/src/compat/next/user-agent.ts +53 -49
  236. package/src/compat/next/web-vitals.ts +22 -24
  237. package/src/compat/otel/api.ts +41 -41
  238. package/src/compat/otel/client-trace-metadata.ts +25 -27
  239. package/src/compat/otel/fetch-span.ts +29 -29
  240. package/src/compat/otel/tracer.ts +331 -331
  241. package/src/compat/pages/api.ts +456 -0
  242. package/src/compat/pages/client-plugin.ts +36 -36
  243. package/src/compat/pages/router-state.ts +34 -34
  244. package/src/compat/pages/{index.ts → router.ts} +130 -135
  245. package/src/compat/ppr/io.ts +12 -12
  246. package/src/compat/ppr/missing-root-params.ts +34 -38
  247. package/src/compat/ppr/root-params-scan.ts +66 -66
  248. package/src/compat/ppr/root-params-transform.ts +24 -26
  249. package/src/compat/ppr/root-params.ts +30 -30
  250. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  251. package/src/compat/protocol.ts +71 -70
  252. package/src/compat/react/action-state.ts +47 -48
  253. package/src/compat/react/client-lite.ts +15 -15
  254. package/src/compat/react/client.ts +4 -4
  255. package/src/compat/react/compiler-runtime.ts +11 -11
  256. package/src/compat/react/dom-client.ts +44 -44
  257. package/src/compat/react/dom-react-server.ts +10 -16
  258. package/src/compat/react/dom-server.ts +10 -10
  259. package/src/compat/react/dom.ts +52 -52
  260. package/src/compat/react/hooks-extra.ts +34 -35
  261. package/src/compat/react/parity.ts +64 -61
  262. package/src/compat/react/preact.ts +81 -82
  263. package/src/compat/react/react-server.ts +28 -28
  264. package/src/compat/react/router-shim.ts +1 -1
  265. package/src/compat/react/server-component-use.ts +8 -8
  266. package/src/compat/react/server-inserted-html.ts +30 -31
  267. package/src/compat/react/server.ts +53 -55
  268. package/src/compat/react/use.ts +32 -32
  269. package/src/compat/react/view-transition.ts +20 -20
  270. package/src/compat/register/actions.ts +35 -824
  271. package/src/compat/register/boot.ts +41 -41
  272. package/src/compat/register/build-tier.ts +5 -5
  273. package/src/compat/register/build.ts +74 -70
  274. package/src/compat/register/bundler.ts +161 -156
  275. package/src/compat/register/cache.ts +20 -20
  276. package/src/compat/register/client-errors.ts +3 -3
  277. package/src/compat/register/config.ts +6 -6
  278. package/src/compat/register/css-extras.ts +30 -34
  279. package/src/compat/register/edge-runtime.ts +3 -3
  280. package/src/compat/register/errors.ts +10 -12
  281. package/src/compat/register/export.ts +16 -16
  282. package/src/compat/register/font.ts +11 -11
  283. package/src/compat/register/hooks.ts +2 -2
  284. package/src/compat/register/image.ts +40 -40
  285. package/src/compat/register/index.ts +59 -62
  286. package/src/compat/register/instrumentation-client.ts +10 -10
  287. package/src/compat/register/lifecycle.ts +25 -28
  288. package/src/compat/register/mdx.ts +10 -10
  289. package/src/compat/register/middleware.ts +226 -16
  290. package/src/compat/register/otel.ts +80 -88
  291. package/src/compat/register/pages-api.ts +10 -463
  292. package/src/compat/register/ppr.ts +16 -16
  293. package/src/compat/register/protocol.ts +17 -18
  294. package/src/compat/register/proxy.ts +49 -51
  295. package/src/compat/register/render.ts +79 -76
  296. package/src/compat/register/routing.ts +162 -159
  297. package/src/compat/register/segment.ts +24 -1897
  298. package/src/compat/register/static-image.ts +3 -3
  299. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  300. package/src/compat/register/typed-routes.ts +14 -14
  301. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  302. package/src/compat/register/validation.ts +18 -18
  303. package/src/compat/segment/loading-boundary.ts +43 -45
  304. package/src/compat/segment/page-slot.ts +69 -69
  305. package/src/compat/segment/serve.ts +1884 -0
  306. package/src/compat/segment/tree.ts +113 -112
  307. package/src/compat/segment/vary-key.ts +38 -38
  308. package/src/compat/segment/vary-params.ts +138 -142
  309. package/src/compat/static-params.ts +14 -12
  310. package/src/compat/tsconfig-defaults.ts +87 -91
  311. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  312. package/src/compat/typecheck/worker.ts +15 -12
  313. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  314. package/src/compat/typed-routes/manifest.ts +174 -170
  315. package/src/compat/typed-routes/typegen.ts +127 -110
  316. package/src/compat/validation/errors.ts +16 -19
  317. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  318. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  319. package/src/compat-bootstrap.ts +16 -16
  320. package/src/config.ts +69 -69
  321. package/src/css/build.ts +230 -227
  322. package/src/css/postcss.ts +79 -80
  323. package/src/css/worker.ts +14 -15
  324. package/src/dev/client-actions.ts +10 -10
  325. package/src/dev/client-chunk-store.ts +27 -27
  326. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  327. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  328. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  329. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  330. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  331. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  332. package/src/dev/server.ts +804 -820
  333. package/src/env.ts +46 -43
  334. package/src/extensions.ts +491 -478
  335. package/src/index.ts +8 -8
  336. package/src/internal.ts +20 -23
  337. package/src/{islands → render}/boundary-error.ts +3 -3
  338. package/src/render/hooks.ts +71 -71
  339. package/src/render/island-context.ts +14 -14
  340. package/src/render/metadata.ts +310 -310
  341. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  342. package/src/{ppr.ts → render/ppr.ts} +244 -245
  343. package/src/render/renderer.ts +2076 -2082
  344. package/src/render/resource-hints.ts +16 -17
  345. package/src/render/slots.tsx +224 -235
  346. package/src/{islands → render}/static-children.ts +9 -12
  347. package/src/{islands → render}/static-slots.ts +37 -37
  348. package/src/{cache/context.ts → request/cache.ts} +20 -20
  349. package/src/request/context.ts +107 -107
  350. package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +318 -296
  354. package/src/resolve/source-text.ts +37 -37
  355. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  356. package/src/routing/forwarded.ts +19 -19
  357. package/src/routing/handler.ts +84 -91
  358. package/src/routing/href.ts +69 -70
  359. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  360. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  361. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  362. package/src/routing/routes.ts +827 -815
  363. package/src/routing/slots.ts +164 -160
  364. package/src/runtime/loader.ts +952 -0
  365. package/src/{dev → runtime}/module-cache.ts +309 -287
  366. package/src/{dev → runtime}/module-generations.ts +9 -9
  367. package/src/{dev → runtime}/module-transform.ts +81 -72
  368. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  369. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  370. package/src/runtime/vendor.ts +425 -404
  371. package/src/styles.d.ts +9 -0
  372. package/src/types.ts +320 -335
  373. package/src/utils/ansi.ts +5 -5
  374. package/src/utils/{source.ts → code.ts} +15 -12
  375. package/src/utils/content-type.ts +3 -3
  376. package/src/utils/decode.ts +2 -2
  377. package/src/utils/dev-profile.ts +13 -13
  378. package/src/utils/error-log.ts +6 -6
  379. package/src/utils/esbuild.ts +18 -18
  380. package/src/utils/fs-cache.ts +13 -13
  381. package/src/utils/fs.ts +57 -49
  382. package/src/utils/html.ts +20 -24
  383. package/src/utils/native-require.ts +8 -8
  384. package/src/utils/serialize.ts +139 -146
  385. package/src/utils/verbose.ts +18 -18
  386. package/src/cli/analyze-print.ts +0 -181
  387. package/src/compat/middleware/manifest.ts +0 -210
  388. package/src/compat/next/image-client.tsx +0 -215
  389. package/src/compat/next/link-usage.ts +0 -29
  390. package/src/css/index.ts +0 -2
  391. package/src/render/index.ts +0 -1
  392. package/src/style-modules.d.ts +0 -9
@@ -2,17 +2,17 @@
2
2
  // on the CSS worker thread (./worker.ts) rather than the event loop:
3
3
  // Tailwind v4's postcss plugin is synchronous CPU work — its oxide scan and
4
4
  // compile starved every concurrent request while it ran in-process.
5
- import { createRequire } from 'node:module';
6
- import { existsSync, readFileSync } from 'node:fs';
7
- import { writeFile } from 'node:fs/promises';
8
- import path from 'node:path';
9
- import { pathToFileURL } from 'node:url';
10
- import { readText } from '../utils/fs';
5
+ import { createRequire } from 'node:module'
6
+ import { existsSync, readFileSync } from 'node:fs'
7
+ import { writeFile } from 'node:fs/promises'
8
+ import path from 'node:path'
9
+ import { pathToFileURL } from 'node:url'
10
+ import { readText } from '../utils/fs'
11
11
 
12
12
  export interface PostcssOptions {
13
- dev?: boolean;
13
+ dev?: boolean
14
14
  /** pnext's output directory — kept out of Tailwind's content scan. */
15
- outDir?: string;
15
+ outDir?: string
16
16
  }
17
17
 
18
18
  // One long-lived processor per root+mode. Keeping it alive is what makes dev fast: Tailwind v4's postcss
@@ -20,45 +20,45 @@ export interface PostcssOptions {
20
20
  // instead of a CLI spawn plus a full project re-scan. It also means other plugins in the config actually
21
21
  // execute - the old CLI path treated postcss.config purely as a Tailwind trigger. Config-file edits need a
22
22
  // dev-server restart; Tailwind tracks its own dependencies and refreshes them itself.
23
- const postcssProcessors = new Map<string, Promise<LoadedPostcss | undefined>>();
23
+ const postcssProcessors = new Map<string, Promise<LoadedPostcss | undefined>>()
24
24
 
25
25
  interface PostcssProcessor {
26
- process(css: string, options: { from: string; to: string }): PromiseLike<{ css: string }>;
26
+ process(css: string, options: { from: string; to: string }): PromiseLike<{ css: string }>
27
27
  }
28
28
 
29
29
  /** A processor plus the `@source not` directives to append for it (if any). */
30
30
  interface LoadedPostcss {
31
- processor: PostcssProcessor;
32
- sources: string;
31
+ processor: PostcssProcessor
32
+ sources: string
33
33
  }
34
34
 
35
- type PostcssPluginFactory = (options?: unknown) => unknown;
35
+ type PostcssPluginFactory = (options?: unknown) => unknown
36
36
 
37
37
  interface PostcssConfig {
38
- plugins?: Record<string, unknown> | unknown[];
38
+ plugins?: Record<string, unknown> | unknown[]
39
39
  }
40
40
 
41
41
  export function postcssConfigFile(root: string) {
42
42
  for (const file of ['postcss.config.cjs', 'postcss.config.js', 'postcss.config.mjs']) {
43
- const full = path.join(root, file);
44
- if (existsSync(full)) return full;
43
+ const full = path.join(root, file)
44
+ if (existsSync(full)) return full
45
45
  }
46
- return undefined;
46
+ return undefined
47
47
  }
48
48
 
49
49
  /** Build (or reuse) the processor for this root+mode without processing a file. */
50
50
  export function loadPostcss(root: string, options: PostcssOptions) {
51
- const key = `${root}\0${options.dev ? 'dev' : 'build'}\0${options.outDir ?? ''}`;
52
- let processor = postcssProcessors.get(key);
51
+ const key = `${root}\0${options.dev ? 'dev' : 'build'}\0${options.outDir ?? ''}`
52
+ let processor = postcssProcessors.get(key)
53
53
  if (!processor) {
54
54
  processor = createPostcssProcessor(root, options).catch((error: unknown) => {
55
55
  // Drop failed setups so a fixed config or install is retried.
56
- postcssProcessors.delete(key);
57
- throw error;
58
- });
59
- postcssProcessors.set(key, processor);
56
+ postcssProcessors.delete(key)
57
+ throw error
58
+ })
59
+ postcssProcessors.set(key, processor)
60
60
  }
61
- return processor;
61
+ return processor
62
62
  }
63
63
 
64
64
  export async function runPostcss(
@@ -67,43 +67,42 @@ export async function runPostcss(
67
67
  options: PostcssOptions,
68
68
  fromSource?: string,
69
69
  ) {
70
- const loaded = await loadPostcss(root, options);
71
- if (!loaded) return;
70
+ const loaded = await loadPostcss(root, options)
71
+ if (!loaded) return
72
72
  // `from` labels the input for postcss plugins' diagnostics/source maps. Point
73
73
  // it at the original CSS source (not the synthesized bundle outfile) so
74
74
  // plugins like `@tailwindcss/postcss` report the real path (e.g. its
75
75
  // `DEBUG=tailwindcss` marker keys off `result.opts.from`). We still write the
76
76
  // processed output back to the bundle outfile via `to`.
77
- const from = fromSource ?? cssFile;
77
+ const from = fromSource ?? cssFile
78
78
  // The scan directives go last so they don't shift the line numbers plugins
79
79
  // report against the real source; `@source` is order-independent to Tailwind.
80
80
  const result = await loaded.processor.process((await readText(cssFile)) + loaded.sources, {
81
81
  from,
82
82
  to: cssFile,
83
- });
84
- await writeFile(cssFile, result.css);
83
+ })
84
+ await writeFile(cssFile, result.css)
85
85
  }
86
86
 
87
87
  async function createPostcssProcessor(root: string, options: PostcssOptions) {
88
- const configFile = postcssConfigFile(root);
89
- if (!configFile) return undefined;
88
+ const configFile = postcssConfigFile(root)
89
+ if (!configFile) return undefined
90
90
  const loaded = (await import(pathToFileURL(configFile).href)) as
91
- | PostcssConfig
92
- | { default: PostcssConfig };
93
- const config = 'default' in loaded && loaded.default ? loaded.default : loaded;
94
- const plugins = postcssPlugins(root, config as PostcssConfig, options);
95
- if (plugins.length === 0) return undefined;
96
- const appRequire = createRequire(path.join(root, 'package.json'));
91
+ PostcssConfig | { default: PostcssConfig }
92
+ const config = 'default' in loaded && loaded.default ? loaded.default : loaded
93
+ const plugins = postcssPlugins(root, config as PostcssConfig, options)
94
+ if (plugins.length === 0) return undefined
95
+ const appRequire = createRequire(path.join(root, 'package.json'))
97
96
  const postcss = interopDefault(resolvePostcss(appRequire)) as (
98
97
  plugins: unknown[],
99
- ) => PostcssProcessor;
98
+ ) => PostcssProcessor
100
99
  const tailwind = pluginEntries(config as PostcssConfig).some(
101
100
  ([specifier, pluginOptions]) => specifier === '@tailwindcss/postcss' && pluginOptions !== false,
102
- );
101
+ )
103
102
  return {
104
103
  processor: postcss(plugins),
105
104
  sources: tailwind ? scanExclusions(root, appRequire, options) : '',
106
- };
105
+ }
107
106
  }
108
107
 
109
108
  /**
@@ -116,32 +115,32 @@ async function createPostcssProcessor(root: string, options: PostcssOptions) {
116
115
  */
117
116
  function scanExclusions(root: string, appRequire: NodeJS.Require, options: PostcssOptions) {
118
117
  // eslint-disable-next-line turbo/no-undeclared-env-vars
119
- if (process.env.PNEXT_TAILWIND_SCAN_ALL) return '';
118
+ if (process.env.PNEXT_TAILWIND_SCAN_ALL) return ''
120
119
  // `@source not` landed in Tailwind 4.1; older versions error on the at-rule.
121
- const [major, minor] = packageVersion(appRequire, '@tailwindcss/postcss');
122
- if (major < 4 || (major === 4 && minor < 1)) return '';
123
- const dirs = ['node_modules', '.next', options.outDir ?? '.pnext'];
120
+ const [major, minor] = packageVersion(appRequire, '@tailwindcss/postcss')
121
+ if (major < 4 || (major === 4 && minor < 1)) return ''
122
+ const dirs = ['node_modules', '.next', options.outDir ?? '.pnext']
124
123
  const excluded = [...new Set(dirs.map(dir => path.resolve(root, dir)))].filter(
125
124
  dir => dir.startsWith(root + path.sep) && existsSync(dir),
126
- );
127
- if (excluded.length === 0) return '';
125
+ )
126
+ if (excluded.length === 0) return ''
128
127
  // Leading and trailing newlines keep the stylesheet's own first and last
129
128
  // lines exactly as they were, so the emitted CSS stays byte-identical.
130
129
  return `\n${excluded
131
130
  .map(dir => `@source not ${JSON.stringify(dir.split(path.sep).join('/'))};`)
132
- .join('\n')}\n`;
131
+ .join('\n')}\n`
133
132
  }
134
133
 
135
134
  /** `[major, minor]` of a resolvable package, or `[0, 0]` when unknown. */
136
135
  function packageVersion(req: NodeJS.Require, name: string): [number, number] {
137
136
  try {
138
137
  const pkg = JSON.parse(readFileSync(req.resolve(`${name}/package.json`), 'utf8')) as {
139
- version?: string;
140
- };
141
- const [major, minor] = (pkg.version ?? '').split('.');
142
- return [Number.parseInt(major ?? '', 10) || 0, Number.parseInt(minor ?? '', 10) || 0];
138
+ version?: string
139
+ }
140
+ const [major, minor] = (pkg.version ?? '').split('.')
141
+ return [Number.parseInt(major ?? '', 10) || 0, Number.parseInt(minor ?? '', 10) || 0]
143
142
  } catch {
144
- return [0, 0];
143
+ return [0, 0]
145
144
  }
146
145
  }
147
146
 
@@ -152,28 +151,28 @@ function pluginEntries(config: PostcssConfig): [unknown, unknown][] {
152
151
  ? ([entry[0], entry[1]] as [unknown, unknown])
153
152
  : ([entry, undefined] as [unknown, unknown]),
154
153
  )
155
- : Object.entries(config.plugins ?? {});
154
+ : Object.entries(config.plugins ?? {})
156
155
  }
157
156
 
158
157
  function postcssPlugins(root: string, config: PostcssConfig, options: PostcssOptions) {
159
- const appRequire = createRequire(path.join(root, 'package.json'));
160
- const entries = pluginEntries(config);
158
+ const appRequire = createRequire(path.join(root, 'package.json'))
159
+ const entries = pluginEntries(config)
161
160
 
162
- const plugins: unknown[] = [];
161
+ const plugins: unknown[] = []
163
162
  for (const [specifier, pluginOptions] of entries) {
164
- if (pluginOptions === false) continue;
163
+ if (pluginOptions === false) continue
165
164
  if (typeof specifier !== 'string') {
166
165
  // Already-instantiated plugin object or factory in an array config.
167
- if (specifier) plugins.push(specifier);
168
- continue;
166
+ if (specifier) plugins.push(specifier)
167
+ continue
169
168
  }
170
- const factory = interopDefault(appRequire(specifier) as unknown);
171
- const resolvedOptions = pluginOptionsFor(root, specifier, pluginOptions, options);
169
+ const factory = interopDefault(appRequire(specifier) as unknown)
170
+ const resolvedOptions = pluginOptionsFor(root, specifier, pluginOptions, options)
172
171
  plugins.push(
173
172
  typeof factory === 'function' ? (factory as PostcssPluginFactory)(resolvedOptions) : factory,
174
- );
173
+ )
175
174
  }
176
- return plugins;
175
+ return plugins
177
176
  }
178
177
 
179
178
  function pluginOptionsFor(
@@ -182,14 +181,14 @@ function pluginOptionsFor(
182
181
  userOptions: unknown,
183
182
  options: PostcssOptions,
184
183
  ) {
185
- if (specifier !== '@tailwindcss/postcss') return userOptions;
184
+ if (specifier !== '@tailwindcss/postcss') return userOptions
186
185
  // Scan candidates from the app root — the bundled css Tailwind reads lives
187
186
  // under .pnext, where a default input-relative scan would find nothing.
188
187
  return {
189
188
  base: root,
190
189
  optimize: options.dev ? false : { minify: true },
191
190
  ...(typeof userOptions === 'object' && userOptions !== null ? userOptions : {}),
192
- };
191
+ }
193
192
  }
194
193
 
195
194
  function resolvePostcss(appRequire: NodeJS.Require): unknown {
@@ -198,39 +197,39 @@ function resolvePostcss(appRequire: NodeJS.Require): unknown {
198
197
  // dependency, which the package manager hoists to the app's top-level node_modules, so requiring
199
198
  // 'postcss' from the app would return PostCSS 7 and a modern app plugin using the v8 API throws. Prefer
200
199
  // the app's postcss only when it is already v8+, otherwise fall back to pnext's own.
201
- let appPostcss: unknown;
200
+ let appPostcss: unknown
202
201
  try {
203
- appPostcss = appRequire('postcss');
204
- if (packageVersion(appRequire, 'postcss')[0] >= 8) return appPostcss;
202
+ appPostcss = appRequire('postcss')
203
+ if (packageVersion(appRequire, 'postcss')[0] >= 8) return appPostcss
205
204
  } catch {
206
205
  // App has no resolvable postcss; fall through to pnext's own / plugin copy.
207
206
  }
208
- const ownPostcss = resolveOwnPostcss();
209
- if (ownPostcss) return ownPostcss;
207
+ const ownPostcss = resolveOwnPostcss()
208
+ if (ownPostcss) return ownPostcss
210
209
  try {
211
210
  // A Tailwind-based app ships a v8 postcss under its plugin package.
212
- const pluginPackage = appRequire.resolve('@tailwindcss/postcss/package.json');
213
- return createRequire(pluginPackage)('postcss');
211
+ const pluginPackage = appRequire.resolve('@tailwindcss/postcss/package.json')
212
+ return createRequire(pluginPackage)('postcss')
214
213
  } catch {
215
214
  // Last resort: whatever the app resolved (even if <8) — better than nothing.
216
- if (appPostcss) return appPostcss;
217
- throw new Error('Could not resolve a PostCSS installation for the CSS pipeline.');
215
+ if (appPostcss) return appPostcss
216
+ throw new Error('Could not resolve a PostCSS installation for the CSS pipeline.')
218
217
  }
219
218
  }
220
219
 
221
220
  /** pnext's own PostCSS 8 (mirrors Next's bundled copy), or undefined. */
222
221
  function resolveOwnPostcss(): unknown {
223
222
  try {
224
- const ownRequire = createRequire(import.meta.url);
225
- if (packageVersion(ownRequire, 'postcss')[0] >= 8) return ownRequire('postcss');
223
+ const ownRequire = createRequire(import.meta.url)
224
+ if (packageVersion(ownRequire, 'postcss')[0] >= 8) return ownRequire('postcss')
226
225
  } catch {
227
226
  // pnext's install carries no resolvable postcss; caller falls back.
228
227
  }
229
- return undefined;
228
+ return undefined
230
229
  }
231
230
 
232
231
  function interopDefault(mod: unknown): unknown {
233
- if (typeof mod === 'function') return mod;
234
- if (mod && typeof mod === 'object' && 'default' in mod && mod.default) return mod.default;
235
- return mod;
232
+ if (typeof mod === 'function') return mod
233
+ if (mod && typeof mod === 'object' && 'default' in mod && mod.default) return mod.default
234
+ return mod
236
235
  }
package/src/css/worker.ts CHANGED
@@ -1,27 +1,26 @@
1
1
  // CSS worker entry — runs the postcss/Tailwind pipeline off the event loop.
2
2
  // One message per built stylesheet; the processor cache in ./postcss.ts lives
3
3
  // here for the worker's lifetime, so Tailwind stays incremental across rebuilds.
4
- import { loadPostcss, runPostcss } from './postcss';
4
+ import { loadPostcss, runPostcss } from './postcss'
5
5
  export type CssWorkerRequest = { id: number; root: string; dev: boolean; outDir?: string } & (
6
- | { kind: 'warm' }
7
- | { kind: 'process'; cssFile: string; from?: string }
8
- );
6
+ { kind: 'warm' } | { kind: 'process'; cssFile: string; from?: string }
7
+ )
9
8
 
10
9
  export interface CssWorkerResponse {
11
- id: number;
12
- error?: { name: string; message: string; stack?: string };
10
+ id: number
11
+ error?: { name: string; message: string; stack?: string }
13
12
  }
14
13
 
15
- declare const self: Worker;
14
+ declare const self: Worker
16
15
 
17
16
  self.onmessage = async (event: MessageEvent<CssWorkerRequest>) => {
18
- const request = event.data;
19
- const reply = (response: CssWorkerResponse) => postMessage(response);
17
+ const request = event.data
18
+ const reply = (response: CssWorkerResponse) => postMessage(response)
20
19
  try {
21
- const options = { dev: request.dev, outDir: request.outDir };
22
- if (request.kind === 'warm') await loadPostcss(request.root, options);
23
- else await runPostcss(request.root, request.cssFile, options, request.from);
24
- reply({ id: request.id });
20
+ const options = { dev: request.dev, outDir: request.outDir }
21
+ if (request.kind === 'warm') await loadPostcss(request.root, options)
22
+ else await runPostcss(request.root, request.cssFile, options, request.from)
23
+ reply({ id: request.id })
25
24
  } catch (error) {
26
25
  reply({
27
26
  id: request.id,
@@ -29,6 +28,6 @@ self.onmessage = async (event: MessageEvent<CssWorkerRequest>) => {
29
28
  error instanceof Error
30
29
  ? { name: error.name, message: error.message, stack: error.stack }
31
30
  : { name: 'Error', message: String(error) },
32
- });
31
+ })
33
32
  }
34
- };
33
+ }
@@ -2,34 +2,34 @@
2
2
  //
3
3
  // The dev route-client bundle resolves every module into its own `pnext-route-client` esbuild namespace, so
4
4
  // a standalone esbuild plugin cannot intercept that graph the way it can a plain client build. This holder
5
- // is the extension point dev/imports reads to turn a client-side import of a `'use server'` module into the
5
+ // is the extension point runtime/modules reads to turn a client-side import of a `'use server'` module into the
6
6
  // RPC stub, without core statically importing compat/actions.
7
7
  //
8
- // Compat populates it; a pure-core app leaves it unset, and dev/imports treats every module as a normal
9
- // source module. Mirrors the routing/request-runtime.ts holder pattern.
8
+ // Compat populates it; a pure-core app leaves it unset, and runtime/modules treats every module as a normal
9
+ // source module. Mirrors the routing/request-environment.ts holder pattern.
10
10
 
11
- /** Compat client-action bundler surface dev/imports consults. */
11
+ /** Compat client-action bundler surface runtime/modules consults. */
12
12
  export interface ClientActionBundler {
13
13
  /**
14
14
  * Ensure the client-action module set is discovered for the active dev import version (a dev reload bumps
15
15
  * it). Awaited before a route-client build so the stub check below sees the current set - the discovery
16
16
  * that used to run inline at startup/reload now happens lazily here. Idempotent per version.
17
17
  */
18
- ensureArmed: () => Promise<void>;
18
+ ensureArmed: () => Promise<void>
19
19
  /** True when `file` is a discovered `'use server'` module (stub it on the client). */
20
- isClientActionModule: (file: string) => boolean;
20
+ isClientActionModule: (file: string) => boolean
21
21
  /** Generate the client fetch-stub source for an action module file. */
22
- stubSource: (file: string) => Promise<string>;
22
+ stubSource: (file: string) => Promise<string>
23
23
  }
24
24
 
25
- let bundler: ClientActionBundler | undefined;
25
+ let bundler: ClientActionBundler | undefined
26
26
 
27
27
  /** Publish the compat client-action bundler (register-actions). */
28
28
  export function setClientActionBundler(next: ClientActionBundler): void {
29
- bundler = next;
29
+ bundler = next
30
30
  }
31
31
 
32
32
  /** The compat client-action bundler, or undefined for a pure-core app. */
33
33
  export function getClientActionBundler(): ClientActionBundler | undefined {
34
- return bundler;
34
+ return bundler
35
35
  }
@@ -5,17 +5,17 @@
5
5
  // duplicates to one inode while every generation dir keeps a normal-looking
6
6
  // path; eviction of one generation just drops its link, leaving the others
7
7
  // (and the store's own link) intact.
8
- import { createHash } from 'node:crypto';
9
- import { link, mkdir, readFile, readdir, rm, stat, unlink } from 'node:fs/promises';
10
- import path from 'node:path';
11
- import { listFiles } from '../utils/fs';
8
+ import { createHash } from 'node:crypto'
9
+ import { link, mkdir, readFile, readdir, rm, stat, unlink } from 'node:fs/promises'
10
+ import path from 'node:path'
11
+ import { listFiles } from '../utils/fs'
12
12
 
13
13
  export function clientChunkStoreDir(outPath: string) {
14
- return path.join(outPath, 'cache', 'client-store');
14
+ return path.join(outPath, 'cache', 'client-store')
15
15
  }
16
16
 
17
17
  function contentHash(data: Buffer) {
18
- return createHash('sha1').update(data).digest('hex');
18
+ return createHash('sha1').update(data).digest('hex')
19
19
  }
20
20
 
21
21
  /**
@@ -25,31 +25,31 @@ function contentHash(data: Buffer) {
25
25
  * file always ends up in place either way.
26
26
  */
27
27
  export async function contentAddressDir(dir: string, storeDir: string) {
28
- await mkdir(storeDir, { recursive: true });
29
- const files = await listFiles(dir);
30
- await Promise.all(files.map(file => contentAddressFile(file, storeDir)));
28
+ await mkdir(storeDir, { recursive: true })
29
+ const files = await listFiles(dir)
30
+ await Promise.all(files.map(file => contentAddressFile(file, storeDir)))
31
31
  }
32
32
 
33
33
  async function contentAddressFile(file: string, storeDir: string) {
34
- const data = await readFile(file);
35
- const storePath = path.join(storeDir, `${contentHash(data)}${path.extname(file)}`);
34
+ const data = await readFile(file)
35
+ const storePath = path.join(storeDir, `${contentHash(data)}${path.extname(file)}`)
36
36
  if (!(await pathExists(storePath))) {
37
37
  // Claim the store slot from this file's own bytes: link first (cheap, same
38
38
  // device), and only fall back to a copy if that's impossible. Either way the
39
39
  // original file stays at `file` — nothing below needs to re-link it there.
40
40
  try {
41
- await link(file, storePath);
42
- return;
41
+ await link(file, storePath)
42
+ return
43
43
  } catch {
44
- await copyFileFallback(file, storePath);
45
- return;
44
+ await copyFileFallback(file, storePath)
45
+ return
46
46
  }
47
47
  }
48
48
  // Store already holds this content: swap the freshly-written file for a link
49
49
  // to the shared inode so duplicate bytes stop being duplicate on disk.
50
50
  try {
51
- await unlink(file);
52
- await link(storePath, file);
51
+ await unlink(file)
52
+ await link(storePath, file)
53
53
  } catch {
54
54
  // Cross-device or racing unlink: leave the original file in place, it is
55
55
  // already correct content, just not deduped this time.
@@ -58,8 +58,8 @@ async function contentAddressFile(file: string, storeDir: string) {
58
58
 
59
59
  async function copyFileFallback(file: string, storePath: string) {
60
60
  try {
61
- const data = await readFile(file);
62
- await Bun.write(storePath, data);
61
+ const data = await readFile(file)
62
+ await Bun.write(storePath, data)
63
63
  } catch {
64
64
  // Best-effort: dedup is an optimization, not a correctness requirement.
65
65
  }
@@ -68,7 +68,7 @@ async function copyFileFallback(file: string, storePath: string) {
68
68
  async function pathExists(target: string) {
69
69
  return stat(target)
70
70
  .then(() => true)
71
- .catch(() => false);
71
+ .catch(() => false)
72
72
  }
73
73
 
74
74
  /**
@@ -76,17 +76,17 @@ async function pathExists(target: string) {
76
76
  * store's own hardlink is the only one left - every generation that once pointed at it has been evicted.
77
77
  */
78
78
  export async function sweepClientChunkStore(storeDir: string) {
79
- let entries: string[];
79
+ let entries: string[]
80
80
  try {
81
- entries = await readdir(storeDir);
81
+ entries = await readdir(storeDir)
82
82
  } catch {
83
- return;
83
+ return
84
84
  }
85
85
  await Promise.allSettled(
86
86
  entries.map(async entry => {
87
- const full = path.join(storeDir, entry);
88
- const info = await stat(full).catch(() => null);
89
- if (info && info.nlink <= 1) await rm(full, { force: true });
87
+ const full = path.join(storeDir, entry)
88
+ const info = await stat(full).catch(() => null)
89
+ if (info && info.nlink <= 1) await rm(full, { force: true })
90
90
  }),
91
- );
91
+ )
92
92
  }