@wular/pnext 0.0.3 → 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 -1961
  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 -1887
  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} +152 -143
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +442 -186
  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 +833 -848
  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
@@ -1,41 +1,36 @@
1
- import { existsSync, lstatSync, readdirSync, readFileSync, symlinkSync } from 'node:fs';
2
- import { createRequire } from 'node:module';
3
- import path from 'node:path';
4
- import type { Plugin } from 'esbuild';
5
- import type { ResolvedConfig } from '../../config';
6
- import { resolveImport } from '../../resolve/imports';
7
- import { maybeLightningcssTransform } from './lightningcss';
1
+ import { existsSync, lstatSync, readdirSync, readFileSync, symlinkSync } from 'node:fs'
2
+ import { createRequire } from 'node:module'
3
+ import path from 'node:path'
4
+ import type { Plugin } from 'esbuild'
5
+ import type { ResolvedConfig } from '../../config'
6
+ import { resolveImport } from '../../resolve/imports'
7
+ import { maybeLightningcssTransform } from './lightningcss'
8
+ import { escapeRegex } from '../../utils/code'
8
9
 
9
10
  interface ComposeRef {
10
- names: string[];
11
- from?: string;
11
+ names: string[]
12
+ from?: string
12
13
  }
13
14
 
14
15
  interface CssModuleInfo {
15
- classes: Set<string>;
16
- composes: Map<string, ComposeRef[]>;
17
- dependencies: string[];
16
+ classes: Set<string>
17
+ composes: Map<string, ComposeRef[]>
18
+ dependencies: string[]
18
19
  }
19
20
 
20
- const pagesCompatIgnoredSourceEntries = new Set([
21
- '.next',
22
- '.pnext',
23
- 'app',
24
- 'node_modules',
25
- 'pages',
26
- ]);
21
+ const pagesCompatIgnoredSourceEntries = new Set(['.next', '.pnext', 'app', 'node_modules', 'pages'])
27
22
 
28
23
  export function materializeNextCssSources(config: ResolvedConfig) {
29
- const generatedRoot = path.dirname(config.appPath);
30
- if (path.basename(path.dirname(generatedRoot)) !== 'pnext-pages-compat') return;
24
+ const generatedRoot = path.dirname(config.appPath)
25
+ if (path.basename(path.dirname(generatedRoot)) !== 'pnext-pages-compat') return
31
26
 
32
27
  for (const entry of readdirSync(config.root)) {
33
- if (pagesCompatIgnoredSourceEntries.has(entry)) continue;
34
- const source = path.join(config.root, entry);
35
- const target = path.join(generatedRoot, entry);
36
- if (existsSync(target)) continue;
28
+ if (pagesCompatIgnoredSourceEntries.has(entry)) continue
29
+ const source = path.join(config.root, entry)
30
+ const target = path.join(generatedRoot, entry)
31
+ if (existsSync(target)) continue
37
32
  try {
38
- symlinkSync(source, target, lstatSync(source).isDirectory() ? 'dir' : 'file');
33
+ symlinkSync(source, target, lstatSync(source).isDirectory() ? 'dir' : 'file')
39
34
  } catch {
40
35
  // A concurrent materialization may have linked the same source already.
41
36
  }
@@ -47,86 +42,86 @@ export function nextCssModuleChunkPlugin(config: ResolvedConfig): Plugin {
47
42
  name: 'pnext-compat-css-modules',
48
43
  setup(build) {
49
44
  build.onLoad({ filter: /\.css$/ }, ({ path: file }) => {
50
- const source = nextCssSource(file, config.root);
45
+ const source = nextCssSource(file, config.root)
51
46
  const contents = file.endsWith('.module.css')
52
47
  ? transformCssModule(readFileSync(source, 'utf8'), source, config.root)
53
- : rewriteTransparentBodyChildren(readFileSync(source, 'utf8'));
48
+ : rewriteTransparentBodyChildren(readFileSync(source, 'utf8'))
54
49
  return {
55
50
  // No-op unless next.config enables experimental.useLightningcss.
56
51
  contents: maybeLightningcssTransform(contents, source, config.root),
57
52
  loader: 'css',
58
53
  resolveDir: path.dirname(source),
59
- };
60
- });
54
+ }
55
+ })
61
56
  },
62
- };
57
+ }
63
58
  }
64
59
 
65
60
  export function nextCssResolveModule(config: ResolvedConfig) {
66
61
  return (file: string): Record<string, string> | undefined =>
67
- isCssModuleFile(file) ? cssModuleMapping(file, config.root) : undefined;
62
+ isCssModuleFile(file) ? cssModuleMapping(file, config.root) : undefined
68
63
  }
69
64
 
70
65
  export function nextCssLoadModuleForClient(config: ResolvedConfig) {
71
66
  return (file: string): string | undefined =>
72
67
  isCssModuleFile(file)
73
68
  ? `export default ${JSON.stringify(cssModuleMapping(file, config.root))};`
74
- : undefined;
69
+ : undefined
75
70
  }
76
71
 
77
72
  export function nextCssResolveDependency(config: ResolvedConfig) {
78
- const requires = new Map<string, NodeJS.Require>();
73
+ const requires = new Map<string, NodeJS.Require>()
79
74
  return (_root: string, fromFile: string, specifier: string): string | undefined => {
80
- if (specifier.startsWith('.') || path.isAbsolute(specifier)) return undefined;
81
- const source = nextCssSource(fromFile, config.root);
82
- let require = requires.get(source);
75
+ if (specifier.startsWith('.') || path.isAbsolute(specifier)) return undefined
76
+ const source = nextCssSource(fromFile, config.root)
77
+ let require = requires.get(source)
83
78
  if (!require) {
84
- require = createRequire(source);
85
- requires.set(source, require);
79
+ require = createRequire(source)
80
+ requires.set(source, require)
86
81
  }
87
82
  try {
88
- const resolved = require.resolve(specifier);
89
- return isCssDependency(resolved) ? resolved : undefined;
83
+ const resolved = require.resolve(specifier)
84
+ return isCssDependency(resolved) ? resolved : undefined
90
85
  } catch {
91
- return undefined;
86
+ return undefined
92
87
  }
93
- };
88
+ }
94
89
  }
95
90
 
96
91
  function isCssModuleFile(file: string) {
97
- return file.endsWith('.module.css');
92
+ return file.endsWith('.module.css')
98
93
  }
99
94
 
100
95
  function isCssDependency(file: string) {
101
- return /\.(?:css|scss|sass)$/.test(file);
96
+ return /\.(?:css|scss|sass)$/.test(file)
102
97
  }
103
98
 
104
99
  function cssModuleMapping(file: string, root: string) {
105
- file = nextCssSource(file, root);
106
- const cache = new Map<string, CssModuleInfo>();
107
- const info = moduleInfo(file, root, cache);
100
+ file = nextCssSource(file, root)
101
+ const cache = new Map<string, CssModuleInfo>()
102
+ const info = moduleInfo(file, root, cache)
108
103
  return Object.fromEntries(
109
104
  [...info.classes].map(className => [
110
105
  className,
111
106
  classValue(file, className, root, cache, new Set()),
112
107
  ]),
113
- );
108
+ )
114
109
  }
115
110
 
116
111
  export function nextCssSource(file: string, root: string) {
117
- const resolved = path.resolve(file);
118
- const parts = resolved.split(path.sep);
112
+ const resolved = path.resolve(file)
113
+ const parts = resolved.split(path.sep)
119
114
  // Matched on the cache segments alone: the out dir above them is configurable
120
115
  // (distDir) and gains a `dev/` level under a dev server.
121
116
  const buildClientIndex = parts.findIndex(
122
117
  (_, index) => parts.slice(index, index + 3).join('/') === 'cache/server/build-client',
123
- );
118
+ )
124
119
  if (buildClientIndex !== -1) {
125
- const source = path.join(root, ...parts.slice(buildClientIndex + 3));
126
- if (existsSync(source)) return source;
120
+ const source = path.join(root, ...parts.slice(buildClientIndex + 3))
121
+ if (existsSync(source)) return source
127
122
  }
128
- const generatedIndex = parts.lastIndexOf('pnext-pages-compat');
129
- const relative = generatedIndex === -1 ? undefined : parts.slice(generatedIndex + 2);
123
+ const generatedIndex = parts.lastIndexOf('pnext-pages-compat')
124
+ const relative = generatedIndex === -1 ? undefined : parts.slice(generatedIndex + 2)
130
125
  if (relative?.length) {
131
126
  const source = path.join(
132
127
  root,
@@ -135,70 +130,65 @@ export function nextCssSource(file: string, root: string) {
135
130
  : relative[0] === 'source-pages'
136
131
  ? ['pages', ...relative.slice(1)]
137
132
  : relative),
138
- );
139
- if (existsSync(source)) return source;
133
+ )
134
+ if (existsSync(source)) return source
140
135
  }
141
136
 
142
- return resolved;
137
+ return resolved
143
138
  }
144
139
 
145
140
  function rewriteTransparentBodyChildren(source: string) {
146
141
  return source.replace(
147
142
  /body\s*>\s*(-?[_a-zA-Z][\w-]*)/g,
148
- (_, element: string) =>
149
- `:is(body>${element},body :where(pnext-layout,#pnext-page)>${element})`,
150
- );
143
+ (_, element: string) => `:is(body>${element},body :where(pnext-layout,#pnext-page)>${element})`,
144
+ )
151
145
  }
152
146
 
153
147
  function transformCssModule(source: string, file: string, root: string) {
154
- const info = moduleInfoFromSource(source, file, root);
155
- const imports = info.dependencies.map(dep => `@import ${JSON.stringify(dep)};`).join('\n');
156
- const css = scopeKeyframes(rewriteModuleSelectors(stripComposes(source), file), file);
157
- return [imports, css].filter(Boolean).join('\n');
148
+ const info = moduleInfoFromSource(source, file, root)
149
+ const imports = info.dependencies.map(dep => `@import ${JSON.stringify(dep)};`).join('\n')
150
+ const css = scopeKeyframes(rewriteModuleSelectors(stripComposes(source), file), file)
151
+ return [imports, css].filter(Boolean).join('\n')
158
152
  }
159
153
 
160
- function moduleInfo(
161
- file: string,
162
- root: string,
163
- cache: Map<string, CssModuleInfo>,
164
- ): CssModuleInfo {
165
- const key = path.resolve(file);
166
- const cached = cache.get(key);
167
- if (cached) return cached;
168
- const info = moduleInfoFromSource(readFileSync(key, 'utf8'), key, root);
169
- cache.set(key, info);
170
- return info;
154
+ function moduleInfo(file: string, root: string, cache: Map<string, CssModuleInfo>): CssModuleInfo {
155
+ const key = path.resolve(file)
156
+ const cached = cache.get(key)
157
+ if (cached) return cached
158
+ const info = moduleInfoFromSource(readFileSync(key, 'utf8'), key, root)
159
+ cache.set(key, info)
160
+ return info
171
161
  }
172
162
 
173
163
  function moduleInfoFromSource(source: string, file: string, root: string): CssModuleInfo {
174
- const classes = cssClassNames(source);
175
- const composes = new Map<string, ComposeRef[]>();
176
- const dependencies: string[] = [];
177
- const seenDependencies = new Set<string>();
178
- const rulePattern = /(^|})([^{}]+)\{([^{}]*)\}/g;
179
- let match: RegExpExecArray | null;
164
+ const classes = cssClassNames(source)
165
+ const composes = new Map<string, ComposeRef[]>()
166
+ const dependencies: string[] = []
167
+ const seenDependencies = new Set<string>()
168
+ const rulePattern = /(^|})([^{}]+)\{([^{}]*)\}/g
169
+ let match: RegExpExecArray | null
180
170
 
181
171
  while ((match = rulePattern.exec(source))) {
182
- const [, , selector, body] = match;
183
- if (!selector || !body) continue;
184
- const localClasses = selectorClassNames(selector).filter(className => classes.has(className));
185
- if (localClasses.length === 0) continue;
172
+ const [, , selector, body] = match
173
+ if (!selector || !body) continue
174
+ const localClasses = selectorClassNames(selector).filter(className => classes.has(className))
175
+ if (localClasses.length === 0) continue
186
176
 
187
177
  for (const ref of composeRefs(body)) {
188
178
  for (const localClass of localClasses) {
189
- const refs = composes.get(localClass) ?? [];
190
- refs.push(ref);
191
- composes.set(localClass, refs);
179
+ const refs = composes.get(localClass) ?? []
180
+ refs.push(ref)
181
+ composes.set(localClass, refs)
192
182
  }
193
- if (!ref.from || ref.from === 'global') continue;
194
- const dependency = resolveCssModuleImport(root, file, ref.from);
195
- if (!dependency || seenDependencies.has(dependency)) continue;
196
- dependencies.push(dependency);
197
- seenDependencies.add(dependency);
183
+ if (!ref.from || ref.from === 'global') continue
184
+ const dependency = resolveCssModuleImport(root, file, ref.from)
185
+ if (!dependency || seenDependencies.has(dependency)) continue
186
+ dependencies.push(dependency)
187
+ seenDependencies.add(dependency)
198
188
  }
199
189
  }
200
190
 
201
- return { classes, composes, dependencies };
191
+ return { classes, composes, dependencies }
202
192
  }
203
193
 
204
194
  function classValue(
@@ -208,72 +198,72 @@ function classValue(
208
198
  cache: Map<string, CssModuleInfo>,
209
199
  stack: Set<string>,
210
200
  ): string {
211
- const key = `${path.resolve(file)}\0${className}`;
212
- if (stack.has(key)) return cssModuleClassName(file, className);
213
- stack.add(key);
201
+ const key = `${path.resolve(file)}\0${className}`
202
+ if (stack.has(key)) return cssModuleClassName(file, className)
203
+ stack.add(key)
214
204
 
215
- const info = moduleInfo(file, root, cache);
216
- const parts = [cssModuleClassName(file, className)];
205
+ const info = moduleInfo(file, root, cache)
206
+ const parts = [cssModuleClassName(file, className)]
217
207
  for (const ref of info.composes.get(className) ?? []) {
218
208
  if (ref.from === 'global') {
219
- parts.push(...ref.names);
220
- continue;
209
+ parts.push(...ref.names)
210
+ continue
221
211
  }
222
- const refFile = ref.from ? resolveCssModuleImport(root, file, ref.from) : file;
223
- if (!refFile) continue;
224
- const refInfo = moduleInfo(refFile, root, cache);
212
+ const refFile = ref.from ? resolveCssModuleImport(root, file, ref.from) : file
213
+ if (!refFile) continue
214
+ const refInfo = moduleInfo(refFile, root, cache)
225
215
  for (const name of ref.names) {
226
- if (!refInfo.classes.has(name)) continue;
227
- parts.push(...classValue(refFile, name, root, cache, stack).split(/\s+/));
216
+ if (!refInfo.classes.has(name)) continue
217
+ parts.push(...classValue(refFile, name, root, cache, stack).split(/\s+/))
228
218
  }
229
219
  }
230
220
 
231
- stack.delete(key);
232
- return [...new Set(parts)].join(' ');
221
+ stack.delete(key)
222
+ return [...new Set(parts)].join(' ')
233
223
  }
234
224
 
235
225
  function composeRefs(body: string): ComposeRef[] {
236
- const refs: ComposeRef[] = [];
237
- const pattern = /\bcomposes\s*:\s*([^;]+);/g;
238
- let match: RegExpExecArray | null;
226
+ const refs: ComposeRef[] = []
227
+ const pattern = /\bcomposes\s*:\s*([^;]+);/g
228
+ let match: RegExpExecArray | null
239
229
 
240
230
  while ((match = pattern.exec(body))) {
241
- const value = match[1]?.trim();
242
- if (!value) continue;
243
- const fromMatch = /^(.+?)\s+from\s+(['"]?)([^'"]+)\2$/.exec(value);
244
- const names = (fromMatch?.[1] ?? value).split(/\s+/).filter(Boolean);
245
- if (names.length === 0) continue;
246
- refs.push({ names, ...(fromMatch?.[3] ? { from: fromMatch[3] } : {}) });
231
+ const value = match[1]?.trim()
232
+ if (!value) continue
233
+ const fromMatch = /^(.+?)\s+from\s+(['"]?)([^'"]+)\2$/.exec(value)
234
+ const names = (fromMatch?.[1] ?? value).split(/\s+/).filter(Boolean)
235
+ if (names.length === 0) continue
236
+ refs.push({ names, ...(fromMatch?.[3] ? { from: fromMatch[3] } : {}) })
247
237
  }
248
238
 
249
- return refs;
239
+ return refs
250
240
  }
251
241
 
252
242
  function resolveCssModuleImport(root: string, fromFile: string, specifier: string) {
253
- const resolved = resolveImport(root, fromFile, specifier);
254
- if (resolved && isCssModuleFile(resolved)) return path.resolve(resolved);
255
- if (specifier.startsWith('.') || path.isAbsolute(specifier)) return undefined;
243
+ const resolved = resolveImport(root, fromFile, specifier)
244
+ if (resolved && isCssModuleFile(resolved)) return path.resolve(resolved)
245
+ if (specifier.startsWith('.') || path.isAbsolute(specifier)) return undefined
256
246
 
257
- const sibling = path.resolve(path.dirname(fromFile), specifier);
258
- return existsSync(sibling) && isCssModuleFile(sibling) ? sibling : undefined;
247
+ const sibling = path.resolve(path.dirname(fromFile), specifier)
248
+ return existsSync(sibling) && isCssModuleFile(sibling) ? sibling : undefined
259
249
  }
260
250
 
261
251
  function stripComposes(source: string) {
262
- return source.replace(/\s*composes\s*:[^;{}]+;/g, '');
252
+ return source.replace(/\s*composes\s*:[^;{}]+;/g, '')
263
253
  }
264
254
 
265
255
  function cssClassNames(source: string) {
266
- return new Set(selectorClassNames(source.replace(/\{[^{}]*\}/g, '{')));
256
+ return new Set(selectorClassNames(source.replace(/\{[^{}]*\}/g, '{')))
267
257
  }
268
258
 
269
259
  function selectorClassNames(selector: string) {
270
- const classes: string[] = [];
271
- const pattern = /(^|[\s,>+~])\.(-?[_a-zA-Z][\w-]*)/g;
272
- let match: RegExpExecArray | null;
260
+ const classes: string[] = []
261
+ const pattern = /(^|[\s,>+~])\.(-?[_a-zA-Z][\w-]*)/g
262
+ let match: RegExpExecArray | null
273
263
  while ((match = pattern.exec(selector))) {
274
- if (match[2]) classes.push(match[2]);
264
+ if (match[2]) classes.push(match[2])
275
265
  }
276
- return classes;
266
+ return classes
277
267
  }
278
268
 
279
269
  function rewriteModuleSelectors(css: string, file: string) {
@@ -285,90 +275,86 @@ function rewriteModuleSelectors(css: string, file: string) {
285
275
  // Scanned by hand rather than with a regex: on a stylesheet whose tail holds no brace, the obvious
286
276
  // pattern re-consumes the whole tail from every offset and backtracks it away again, which is
287
277
  // quadratic and can cost minutes of build time on a large module.
288
- let out = '';
289
- let runStart = 0;
278
+ let out = ''
279
+ let runStart = 0
290
280
  for (let index = 0; index < css.length; index++) {
291
- const char = css[index];
281
+ const char = css[index]
292
282
  if (char === '{') {
293
- out += `${rewriteSelectorRun(css.slice(runStart, index), file)}{`;
294
- runStart = index + 1;
283
+ out += `${rewriteSelectorRun(css.slice(runStart, index), file)}{`
284
+ runStart = index + 1
295
285
  } else if (char === '}' || char === ';') {
296
- out += css.slice(runStart, index + 1);
297
- runStart = index + 1;
286
+ out += css.slice(runStart, index + 1)
287
+ runStart = index + 1
298
288
  }
299
289
  }
300
- return out + css.slice(runStart);
290
+ return out + css.slice(runStart)
301
291
  }
302
292
 
303
293
  function rewriteSelectorRun(selector: string, file: string) {
304
- if (selector.trimStart().startsWith('@')) return selector;
305
- let out = selector;
294
+ if (selector.trimStart().startsWith('@')) return selector
295
+ let out = selector
306
296
  for (const className of selectorClassNames(selector)) {
307
- out = rewriteClassSelector(out, cssModuleClassName(file, className), className);
297
+ out = rewriteClassSelector(out, cssModuleClassName(file, className), className)
308
298
  }
309
- return out.replace(/:global\(((?:[^()]|\([^()]*\))*)\)/g, '$1');
299
+ return out.replace(/:global\(((?:[^()]|\([^()]*\))*)\)/g, '$1')
310
300
  }
311
301
 
312
302
  function scopeKeyframes(css: string, file: string) {
313
- let out = css;
303
+ let out = css
314
304
  for (const name of keyframeNames(css)) {
315
- const scoped = cssModuleClassName(file, name);
305
+ const scoped = cssModuleClassName(file, name)
316
306
  out = out.replace(
317
307
  new RegExp(`(@(?:-webkit-)?keyframes\\s+)${escapeRegex(name)}(?![-_a-zA-Z0-9])`, 'g'),
318
308
  `$1${scoped}`,
319
- );
309
+ )
320
310
  out = out.replace(
321
- new RegExp(
322
- `(animation-name\\s*:\\s*)${escapeRegex(name)}(?![-_a-zA-Z0-9])`,
323
- 'g',
324
- ),
311
+ new RegExp(`(animation-name\\s*:\\s*)${escapeRegex(name)}(?![-_a-zA-Z0-9])`, 'g'),
325
312
  `$1${scoped}`,
326
- );
313
+ )
327
314
  out = out.replace(
328
315
  new RegExp(
329
316
  `(animation\\s*:[^;{}]*?(?<![-_a-zA-Z0-9]))${escapeRegex(name)}(?![-_a-zA-Z0-9])`,
330
317
  'g',
331
318
  ),
332
319
  `$1${scoped}`,
333
- );
320
+ )
334
321
  }
335
- return out;
322
+ return out
336
323
  }
337
324
 
338
325
  function keyframeNames(css: string) {
339
- const names = new Set<string>();
340
- const pattern = /@(?:-webkit-)?keyframes\s+(-?[_a-zA-Z][\w-]*)/g;
341
- let match: RegExpExecArray | null;
326
+ const names = new Set<string>()
327
+ const pattern = /@(?:-webkit-)?keyframes\s+(-?[_a-zA-Z][\w-]*)/g
328
+ let match: RegExpExecArray | null
342
329
  while ((match = pattern.exec(css))) {
343
- if (match[1]) names.add(match[1]);
330
+ if (match[1]) names.add(match[1])
344
331
  }
345
- return names;
332
+ return names
346
333
  }
347
334
 
348
335
  function cssModuleClassName(file: string, className: string) {
349
- const base = path.basename(file).replace(/\.module\.css$/, '').replace(/[^_a-zA-Z0-9]/g, '_');
350
- const hash = pathHash(cssModuleScopePath(file));
351
- return `${base}_${className}_${hash}`;
336
+ const base = path
337
+ .basename(file)
338
+ .replace(/\.module\.css$/, '')
339
+ .replace(/[^_a-zA-Z0-9]/g, '_')
340
+ const hash = pathHash(cssModuleScopePath(file))
341
+ return `${base}_${className}_${hash}`
352
342
  }
353
343
 
354
344
  function cssModuleScopePath(file: string) {
355
- const normalized = file.split(path.sep).join('/');
356
- const appIndex = normalized.lastIndexOf('/app/');
357
- if (appIndex !== -1) return normalized.slice(appIndex + 1);
358
- return normalized.split('/').slice(-3).join('/');
345
+ const normalized = file.split(path.sep).join('/')
346
+ const appIndex = normalized.lastIndexOf('/app/')
347
+ if (appIndex !== -1) return normalized.slice(appIndex + 1)
348
+ return normalized.split('/').slice(-3).join('/')
359
349
  }
360
350
 
361
351
  function rewriteClassSelector(css: string, scopedClassName: string, originalClassName: string) {
362
- const pattern = new RegExp(`\\.${escapeRegex(originalClassName)}(?![-_a-zA-Z0-9])`, 'g');
363
- return css.replace(pattern, `.${scopedClassName}`);
352
+ const pattern = new RegExp(`\\.${escapeRegex(originalClassName)}(?![-_a-zA-Z0-9])`, 'g')
353
+ return css.replace(pattern, `.${scopedClassName}`)
364
354
  }
365
355
 
366
356
  function pathHash(file: string) {
367
- let hash = 5381;
368
- for (const char of file) hash = ((hash << 5) + hash) ^ char.charCodeAt(0);
369
- return (hash >>> 0).toString(36).slice(0, 5);
370
- }
371
-
372
- function escapeRegex(value: string) {
373
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
357
+ let hash = 5381
358
+ for (const char of file) hash = ((hash << 5) + hash) ^ char.charCodeAt(0)
359
+ return (hash >>> 0).toString(36).slice(0, 5)
374
360
  }
@@ -10,21 +10,21 @@
10
10
 
11
11
  /** Extract the CSP nonce from a Content-Security-Policy header value, if any. */
12
12
  export function nonceFromCsp(csp: string | null | undefined): string | undefined {
13
- if (!csp) return undefined;
13
+ if (!csp) return undefined
14
14
  // A directive looks like `script-src 'self' 'nonce-abc123=='`. Sources are
15
15
  // whitespace-separated; the nonce token is single-quoted `'nonce-<value>'`.
16
- const directives = csp.split(';');
16
+ const directives = csp.split(';')
17
17
  for (const directive of directives) {
18
18
  for (const token of directive.trim().split(/\s+/)) {
19
- const match = /^'nonce-([^']+)'$/.exec(token);
20
- if (match?.[1]) return match[1];
19
+ const match = /^'nonce-([^']+)'$/.exec(token)
20
+ if (match?.[1]) return match[1]
21
21
  }
22
22
  }
23
- return undefined;
23
+ return undefined
24
24
  }
25
25
 
26
26
  /** Extract the CSP nonce from a request's headers. */
27
27
  export function nonceFromRequest(request: Request | undefined): string | undefined {
28
- if (!request) return undefined;
29
- return nonceFromCsp(request.headers.get('content-security-policy'));
28
+ if (!request) return undefined
29
+ return nonceFromCsp(request.headers.get('content-security-policy'))
30
30
  }
@@ -9,22 +9,19 @@
9
9
  // includePaths come from next.config `sassOptions.includePaths`. All fields degrade to core's empty
10
10
  // behavior when `sass` is not installed.
11
11
 
12
- import type { Plugin } from 'esbuild';
13
- import type { ResolvedConfig } from '../../config';
14
- import { getNextConfig } from '../next/config-loader';
15
- import {
16
- compileSassCss,
17
- isSassFile,
18
- isSassModuleFile,
19
- sassModuleMapping,
20
- } from './sass';
12
+ import type { Plugin } from 'esbuild'
13
+ import type { ResolvedConfig } from '../../config'
14
+ import { getNextConfig } from '../next/config-loader'
15
+ import { compileSassCss, isSassFile, isSassModuleFile, sassModuleMapping } from './sass'
21
16
 
22
17
  /** Read `sassOptions.includePaths` from the loaded next.config. */
23
18
  function sassIncludePaths(): string[] {
24
- const config = getNextConfig();
25
- const sassOptions = config.sassOptions as { includePaths?: unknown } | undefined;
26
- const includePaths = sassOptions?.includePaths;
27
- return Array.isArray(includePaths) ? includePaths.filter((p): p is string => typeof p === 'string') : [];
19
+ const config = getNextConfig()
20
+ const sassOptions = config.sassOptions as { includePaths?: unknown } | undefined
21
+ const includePaths = sassOptions?.includePaths
22
+ return Array.isArray(includePaths)
23
+ ? includePaths.filter((p): p is string => typeof p === 'string')
24
+ : []
28
25
  }
29
26
 
30
27
  /**
@@ -39,27 +36,27 @@ export function sassChunkPlugin(config: ResolvedConfig): Plugin {
39
36
  build.onLoad({ filter: /\.(?:scss|sass)$/ }, ({ path: file }) => ({
40
37
  contents: compileSassCss(file, config.root, sassIncludePaths()),
41
38
  loader: 'css',
42
- }));
39
+ }))
43
40
  },
44
- };
41
+ }
45
42
  }
46
43
 
47
44
  /** Bun render-time loader / class-map resolver for `*.module.{scss,sass}`. */
48
45
  export function sassResolveCssModule(config: ResolvedConfig) {
49
46
  return (file: string): Record<string, string> | undefined =>
50
- isSassModuleFile(file) ? sassModuleMapping(file, config.root, sassIncludePaths()) : undefined;
47
+ isSassModuleFile(file) ? sassModuleMapping(file, config.root, sassIncludePaths()) : undefined
51
48
  }
52
49
 
53
50
  /** Client-bundle ESM text for a `.scss`/`.sass` import. */
54
51
  export function sassLoadCssModuleForClient(config: ResolvedConfig) {
55
52
  return (file: string): string | undefined => {
56
- if (!isSassFile(file)) return undefined;
53
+ if (!isSassFile(file)) return undefined
57
54
  if (isSassModuleFile(file)) {
58
- const map = sassModuleMapping(file, config.root, sassIncludePaths());
59
- return `export default ${JSON.stringify(map)};`;
55
+ const map = sassModuleMapping(file, config.root, sassIncludePaths())
56
+ return `export default ${JSON.stringify(map)};`
60
57
  }
61
58
  // Global (non-module) sass carries no class map; the css bytes ship via the
62
59
  // CSS chunk, so the client import is a side-effect-only empty module.
63
- return 'export default undefined;';
64
- };
60
+ return 'export default undefined;'
61
+ }
65
62
  }