@wular/pnext 0.0.4 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/README.md +22 -16
  2. package/bin/pnext +6 -1
  3. package/config/lint/base.js +7 -7
  4. package/config/ts/base.json +2 -4
  5. package/config/ts/react.json +2 -6
  6. package/package.json +23 -2
  7. package/reference/compat.md +87 -22
  8. package/reference/config.md +40 -93
  9. package/reference/css.md +42 -33
  10. package/reference/dev.md +26 -33
  11. package/reference/env.md +18 -20
  12. package/reference/getting-started.md +132 -0
  13. package/reference/metadata.md +31 -46
  14. package/reference/navigation.md +65 -105
  15. package/reference/performance.md +21 -142
  16. package/reference/rendering.md +78 -75
  17. package/reference/routing.md +97 -107
  18. package/reference/typegen.md +27 -29
  19. package/src/api/cache.ts +36 -37
  20. package/src/api/client-cache.ts +2 -2
  21. package/src/api/client-navigation.ts +121 -114
  22. package/src/api/dynamic.tsx +58 -55
  23. package/src/api/link.tsx +52 -53
  24. package/src/api/navigation.ts +59 -58
  25. package/src/api/server.ts +152 -144
  26. package/src/api/suspense.ts +4 -4
  27. package/src/cli/adapters/vercel-warm.ts +126 -121
  28. package/src/cli/adapters/vercel.ts +437 -443
  29. package/src/cli/analyze.ts +333 -144
  30. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  31. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  32. package/src/cli/build.ts +976 -978
  33. package/src/cli/create.ts +72 -64
  34. package/src/cli/dev.ts +116 -116
  35. package/src/cli/index.ts +94 -85
  36. package/src/cli/migrate/package-json.ts +73 -71
  37. package/src/cli/migrate/report.ts +32 -33
  38. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  39. package/src/cli/migrate/scan.ts +46 -46
  40. package/src/cli/migrate/spinner.ts +9 -9
  41. package/src/cli/migrate/tsconfig.ts +35 -35
  42. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  43. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  44. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  45. package/src/cli/start.ts +65 -66
  46. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  47. package/src/client/build.ts +802 -768
  48. package/src/client/chunk-fold.ts +245 -240
  49. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  50. package/src/client/entry.ts +162 -147
  51. package/src/client/prebuilt.ts +231 -223
  52. package/src/client/profile.ts +29 -29
  53. package/src/client/react-compiler.ts +20 -15
  54. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  55. package/src/client/reference-stub.ts +51 -51
  56. package/src/client/reference.ts +19 -19
  57. package/src/{api → client}/router/events.ts +32 -17
  58. package/src/{api → client}/router/history.ts +16 -16
  59. package/src/{api → client}/router/hub.ts +52 -53
  60. package/src/{api/router.ts → client/router/index.ts} +61 -60
  61. package/src/{api → client}/router/policies.ts +24 -24
  62. package/src/{api → client}/router/runtime.ts +2022 -1995
  63. package/src/{api → client}/router/types.ts +98 -98
  64. package/src/compat/actions/client-plugin.ts +42 -43
  65. package/src/compat/actions/client-stub.ts +14 -14
  66. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  67. package/src/compat/actions/config.ts +63 -64
  68. package/src/compat/actions/detect.ts +68 -68
  69. package/src/compat/actions/discovery.ts +105 -105
  70. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  71. package/src/compat/actions/early-submit.ts +1 -1
  72. package/src/compat/actions/endpoint.ts +198 -198
  73. package/src/compat/actions/extensions.ts +811 -0
  74. package/src/compat/actions/flight.ts +23 -23
  75. package/src/compat/actions/form-state.ts +34 -34
  76. package/src/compat/actions/hoist.ts +382 -236
  77. package/src/compat/actions/ids.ts +7 -12
  78. package/src/compat/actions/index.ts +8 -8
  79. package/src/compat/actions/instances.ts +46 -46
  80. package/src/compat/actions/origin.ts +47 -48
  81. package/src/compat/actions/protocol.ts +22 -22
  82. package/src/compat/actions/registry.ts +19 -19
  83. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  84. package/src/compat/actions/rewrite.ts +125 -125
  85. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  86. package/src/compat/actions/serve.ts +132 -136
  87. package/src/compat/actions/server-tag.ts +4 -4
  88. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  89. package/src/compat/actions/unrecognized-error.ts +4 -4
  90. package/src/compat/{index.ts → aliases.ts} +112 -109
  91. package/src/compat/bundler/bun-externals.ts +18 -18
  92. package/src/compat/bundler/cjs-exports.ts +271 -223
  93. package/src/compat/bundler/config.ts +116 -111
  94. package/src/compat/bundler/externals.ts +12 -12
  95. package/src/compat/bundler/import-meta-url.ts +19 -19
  96. package/src/compat/bundler/modularize-imports.ts +36 -33
  97. package/src/compat/bundler/new-url-asset.ts +22 -24
  98. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  99. package/src/compat/bundler/polyfill.ts +28 -28
  100. package/src/compat/bundler/react-compiler.ts +35 -29
  101. package/src/compat/bundler/react-profiler.tsx +11 -11
  102. package/src/compat/bundler/relay-transform.ts +48 -47
  103. package/src/compat/bundler/require-context.ts +119 -113
  104. package/src/compat/bundler/resolve-extensions.ts +19 -19
  105. package/src/compat/bundler/source-cache.ts +25 -25
  106. package/src/compat/bundler/static-imports.ts +7 -7
  107. package/src/compat/bundler/symlink-imports.ts +46 -46
  108. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  109. package/src/compat/bundler/wasm.ts +58 -60
  110. package/src/compat/bundler/webpack-loaders.ts +254 -241
  111. package/src/compat/bundler/worker.ts +101 -104
  112. package/src/compat/cache/build-flags.ts +29 -29
  113. package/src/compat/cache/build-prerender-errors.ts +40 -44
  114. package/src/compat/cache/custom-handler.ts +60 -53
  115. package/src/compat/cache/fetch-patch.ts +240 -240
  116. package/src/compat/cache/handler.ts +27 -31
  117. package/src/compat/cache/modern-handler.ts +148 -126
  118. package/src/compat/cache/resume-data-cache.ts +47 -45
  119. package/src/compat/cache/revalidate.ts +233 -232
  120. package/src/compat/cache/runtime-error.ts +35 -35
  121. package/src/compat/cache/use-cache-transform.ts +442 -417
  122. package/src/compat/cache/use-cache.ts +650 -614
  123. package/src/compat/cache-control.ts +140 -142
  124. package/src/compat/client/base-path.ts +21 -20
  125. package/src/compat/client/css-order.ts +18 -18
  126. package/src/compat/client/errors/bare-boundary.ts +11 -11
  127. package/src/compat/client/errors/control-flow.ts +23 -23
  128. package/src/compat/client/errors/error-boundary.ts +61 -61
  129. package/src/compat/client/errors/global-error.ts +101 -91
  130. package/src/compat/client/errors/install.ts +71 -72
  131. package/src/compat/client/errors/lazy.ts +23 -23
  132. package/src/compat/client/errors/primitive-throw.ts +47 -45
  133. package/src/compat/client/errors/soft-refresh.ts +4 -4
  134. package/src/compat/client/link-status.ts +33 -33
  135. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  136. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  137. package/src/compat/client/navigation-scroll.ts +63 -63
  138. package/src/compat/client/optimistic-routing.ts +93 -88
  139. package/src/compat/client/prefetch-cache.ts +23 -24
  140. package/src/compat/client/route-announcer.ts +35 -35
  141. package/src/compat/client/segment-cache-policy.ts +20 -20
  142. package/src/compat/client/segment-cache.ts +309 -315
  143. package/src/compat/client/segment-prefetch.ts +127 -132
  144. package/src/compat/client/trailing-slash.ts +5 -4
  145. package/src/compat/css/chunking.ts +113 -116
  146. package/src/compat/css/inline-css.ts +21 -21
  147. package/src/compat/css/lightningcss.ts +37 -38
  148. package/src/compat/css/modules.ts +161 -175
  149. package/src/compat/css/nonce.ts +7 -7
  150. package/src/compat/css/sass-plugin.ts +18 -21
  151. package/src/compat/css/sass.ts +150 -152
  152. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  153. package/src/compat/css/styled-jsx.ts +21 -21
  154. package/src/compat/edge-runtime.ts +27 -27
  155. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  156. package/src/compat/export/client.ts +29 -31
  157. package/src/compat/export/{index.ts → emit.ts} +111 -110
  158. package/src/compat/export/standalone.ts +62 -54
  159. package/src/compat/image-optimizer/cache.ts +51 -49
  160. package/src/compat/image-optimizer/detect.ts +52 -52
  161. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  162. package/src/compat/image-optimizer/source.ts +77 -80
  163. package/src/compat/lifecycle/after-scope.ts +26 -26
  164. package/src/compat/lifecycle/after.ts +48 -45
  165. package/src/compat/lifecycle/error-funnel.ts +98 -102
  166. package/src/compat/lifecycle/error-serialize.ts +30 -26
  167. package/src/compat/lifecycle/error-ui.ts +67 -32
  168. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  169. package/src/compat/lifecycle/instrumentation.ts +85 -85
  170. package/src/compat/lifecycle/node-console.ts +11 -11
  171. package/src/compat/lifecycle/testmode.ts +160 -132
  172. package/src/compat/mdx/compile.ts +60 -57
  173. package/src/compat/mdx/plugin.ts +11 -11
  174. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  175. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  176. package/src/compat/metadata.ts +75 -81
  177. package/src/compat/next/cache.ts +68 -69
  178. package/src/compat/next/canonical-url.ts +9 -9
  179. package/src/compat/next/client-cache.ts +19 -19
  180. package/src/compat/next/client-navigation.ts +112 -116
  181. package/src/compat/next/client-only.ts +1 -1
  182. package/src/compat/next/client-script.tsx +99 -93
  183. package/src/compat/next/client-server.ts +10 -10
  184. package/src/compat/next/config-loader.ts +176 -173
  185. package/src/compat/next/config.ts +7 -7
  186. package/src/compat/next/constants.cjs +6 -6
  187. package/src/compat/next/constants.ts +6 -6
  188. package/src/compat/next/custom-server.ts +26 -24
  189. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  190. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  191. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  192. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  193. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  194. package/src/compat/next/dynamic.tsx +21 -18
  195. package/src/compat/next/error.tsx +52 -52
  196. package/src/compat/next/font/cache.ts +74 -74
  197. package/src/compat/next/font/google.ts +2 -2
  198. package/src/compat/next/font/index.ts +1 -1
  199. package/src/compat/next/font/local.ts +3 -3
  200. package/src/compat/next/font/runtime-client.ts +17 -15
  201. package/src/compat/next/font/runtime.ts +443 -408
  202. package/src/compat/next/font/shared.ts +120 -108
  203. package/src/compat/next/form.tsx +63 -63
  204. package/src/compat/next/head.tsx +2 -2
  205. package/src/compat/next/headers.ts +103 -95
  206. package/src/compat/next/image/client.tsx +220 -0
  207. package/src/compat/next/image/config.ts +56 -58
  208. package/src/compat/next/image/optimizer.ts +40 -36
  209. package/src/compat/next/image/patterns.ts +37 -40
  210. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  211. package/src/compat/next/image/shared.ts +65 -57
  212. package/src/compat/next/image/static-metadata.ts +98 -107
  213. package/src/compat/next/image/validate.ts +79 -88
  214. package/src/compat/next/image.tsx +19 -23
  215. package/src/compat/next/index.ts +1 -1
  216. package/src/compat/next/legacy-image.tsx +59 -60
  217. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  218. package/src/compat/next/link.tsx +158 -158
  219. package/src/compat/next/navigation.cjs +12 -3
  220. package/src/compat/next/navigation.ts +48 -50
  221. package/src/compat/next/offline.ts +27 -27
  222. package/src/compat/next/og.ts +121 -124
  223. package/src/compat/next/preferred-region.ts +13 -14
  224. package/src/compat/next/redirects.ts +58 -56
  225. package/src/compat/next/resource-hints.ts +73 -76
  226. package/src/compat/next/rewrites.ts +130 -133
  227. package/src/compat/next/root-params.ts +45 -45
  228. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  229. package/src/compat/next/router.cjs +4 -2
  230. package/src/compat/next/router.ts +58 -61
  231. package/src/compat/next/script.tsx +108 -108
  232. package/src/compat/next/server-only.ts +1 -1
  233. package/src/compat/next/server.ts +19 -19
  234. package/src/compat/next/svgr.ts +18 -17
  235. package/src/compat/next/telemetry.ts +24 -24
  236. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  237. package/src/compat/next/user-agent.ts +53 -49
  238. package/src/compat/next/web-vitals.ts +22 -24
  239. package/src/compat/otel/api.ts +41 -41
  240. package/src/compat/otel/client-trace-metadata.ts +25 -27
  241. package/src/compat/otel/fetch-span.ts +29 -29
  242. package/src/compat/otel/tracer.ts +331 -331
  243. package/src/compat/pages/api.ts +456 -0
  244. package/src/compat/pages/client-plugin.ts +36 -36
  245. package/src/compat/pages/router-state.ts +34 -34
  246. package/src/compat/pages/{index.ts → router.ts} +130 -135
  247. package/src/compat/ppr/io.ts +12 -12
  248. package/src/compat/ppr/missing-root-params.ts +34 -38
  249. package/src/compat/ppr/root-params-scan.ts +66 -66
  250. package/src/compat/ppr/root-params-transform.ts +24 -26
  251. package/src/compat/ppr/root-params.ts +30 -30
  252. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  253. package/src/compat/protocol.ts +71 -70
  254. package/src/compat/react/action-state.ts +47 -48
  255. package/src/compat/react/client-lite.ts +15 -15
  256. package/src/compat/react/client.ts +4 -4
  257. package/src/compat/react/compiler-runtime.ts +11 -11
  258. package/src/compat/react/dom-client.ts +44 -44
  259. package/src/compat/react/dom-react-server.ts +10 -16
  260. package/src/compat/react/dom-server.ts +10 -10
  261. package/src/compat/react/dom.ts +52 -52
  262. package/src/compat/react/hooks-extra.ts +34 -35
  263. package/src/compat/react/parity.ts +64 -61
  264. package/src/compat/react/preact.ts +81 -82
  265. package/src/compat/react/react-server.ts +28 -28
  266. package/src/compat/react/router-shim.ts +1 -1
  267. package/src/compat/react/server-component-use.ts +8 -8
  268. package/src/compat/react/server-inserted-html.ts +30 -31
  269. package/src/compat/react/server.ts +53 -55
  270. package/src/compat/react/use.ts +32 -32
  271. package/src/compat/react/view-transition.ts +20 -20
  272. package/src/compat/register/actions.ts +35 -824
  273. package/src/compat/register/boot.ts +41 -41
  274. package/src/compat/register/build-tier.ts +5 -5
  275. package/src/compat/register/build.ts +74 -70
  276. package/src/compat/register/bundler.ts +161 -156
  277. package/src/compat/register/cache.ts +20 -20
  278. package/src/compat/register/client-errors.ts +3 -3
  279. package/src/compat/register/config.ts +6 -6
  280. package/src/compat/register/css-extras.ts +30 -34
  281. package/src/compat/register/edge-runtime.ts +3 -3
  282. package/src/compat/register/errors.ts +10 -12
  283. package/src/compat/register/export.ts +16 -16
  284. package/src/compat/register/font.ts +11 -11
  285. package/src/compat/register/hooks.ts +2 -2
  286. package/src/compat/register/image.ts +40 -40
  287. package/src/compat/register/index.ts +59 -62
  288. package/src/compat/register/instrumentation-client.ts +10 -10
  289. package/src/compat/register/lifecycle.ts +25 -28
  290. package/src/compat/register/mdx.ts +10 -10
  291. package/src/compat/register/middleware.ts +226 -16
  292. package/src/compat/register/otel.ts +80 -88
  293. package/src/compat/register/pages-api.ts +10 -463
  294. package/src/compat/register/ppr.ts +16 -16
  295. package/src/compat/register/protocol.ts +17 -18
  296. package/src/compat/register/proxy.ts +49 -51
  297. package/src/compat/register/render.ts +79 -76
  298. package/src/compat/register/routing.ts +162 -159
  299. package/src/compat/register/segment.ts +24 -1897
  300. package/src/compat/register/static-image.ts +3 -3
  301. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  302. package/src/compat/register/typed-routes.ts +14 -14
  303. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  304. package/src/compat/register/validation.ts +18 -18
  305. package/src/compat/segment/loading-boundary.ts +43 -45
  306. package/src/compat/segment/page-slot.ts +69 -69
  307. package/src/compat/segment/serve.ts +1884 -0
  308. package/src/compat/segment/tree.ts +113 -112
  309. package/src/compat/segment/vary-key.ts +38 -38
  310. package/src/compat/segment/vary-params.ts +138 -142
  311. package/src/compat/static-params.ts +14 -12
  312. package/src/compat/tsconfig-defaults.ts +87 -91
  313. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  314. package/src/compat/typecheck/worker.ts +15 -12
  315. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  316. package/src/compat/typed-routes/manifest.ts +174 -170
  317. package/src/compat/typed-routes/typegen.ts +127 -110
  318. package/src/compat/validation/errors.ts +16 -19
  319. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  320. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  321. package/src/compat-bootstrap.ts +16 -16
  322. package/src/config.ts +86 -69
  323. package/src/css/build.ts +230 -227
  324. package/src/css/postcss.ts +79 -80
  325. package/src/css/worker.ts +14 -15
  326. package/src/dev/client-actions.ts +10 -10
  327. package/src/dev/client-chunk-store.ts +27 -27
  328. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  329. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  330. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  331. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  332. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  333. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  334. package/src/dev/server.ts +804 -820
  335. package/src/env.ts +46 -43
  336. package/src/extensions.ts +491 -478
  337. package/src/index.ts +8 -8
  338. package/src/internal.ts +20 -23
  339. package/src/{islands → render}/boundary-error.ts +3 -3
  340. package/src/render/hooks.ts +71 -71
  341. package/src/render/island-context.ts +14 -14
  342. package/src/render/metadata.ts +310 -310
  343. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  344. package/src/{ppr.ts → render/ppr.ts} +244 -245
  345. package/src/render/renderer.ts +2087 -2082
  346. package/src/render/resource-hints.ts +16 -17
  347. package/src/render/slots.tsx +224 -235
  348. package/src/{islands → render}/static-children.ts +9 -12
  349. package/src/{islands → render}/static-slots.ts +37 -37
  350. package/src/{cache/context.ts → request/cache.ts} +20 -20
  351. package/src/request/context.ts +107 -107
  352. package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
  353. package/src/resolve/engine.ts +90 -77
  354. package/src/resolve/imports.ts +475 -463
  355. package/src/resolve/scan-facts.ts +318 -296
  356. package/src/resolve/source-text.ts +37 -37
  357. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  358. package/src/routing/forwarded.ts +19 -19
  359. package/src/routing/handler.ts +84 -91
  360. package/src/routing/href.ts +87 -70
  361. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  362. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  363. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  364. package/src/routing/routes.ts +827 -815
  365. package/src/routing/slots.ts +164 -160
  366. package/src/runtime/loader.ts +954 -0
  367. package/src/{dev → runtime}/module-cache.ts +309 -287
  368. package/src/{dev → runtime}/module-generations.ts +9 -9
  369. package/src/{dev → runtime}/module-transform.ts +81 -72
  370. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  371. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  372. package/src/runtime/vendor.ts +428 -406
  373. package/src/styles.d.ts +9 -0
  374. package/src/types.ts +324 -335
  375. package/src/utils/ansi.ts +5 -5
  376. package/src/utils/{source.ts → code.ts} +15 -12
  377. package/src/utils/content-type.ts +3 -3
  378. package/src/utils/decode.ts +2 -2
  379. package/src/utils/dev-profile.ts +13 -13
  380. package/src/utils/error-log.ts +6 -6
  381. package/src/utils/esbuild.ts +18 -18
  382. package/src/utils/fs-cache.ts +13 -13
  383. package/src/utils/fs.ts +57 -49
  384. package/src/utils/html.ts +20 -24
  385. package/src/utils/native-require.ts +8 -8
  386. package/src/utils/serialize.ts +139 -146
  387. package/src/utils/verbose.ts +18 -18
  388. package/reference/overview.md +0 -35
  389. package/src/cli/analyze-print.ts +0 -181
  390. package/src/compat/middleware/manifest.ts +0 -210
  391. package/src/compat/next/image-client.tsx +0 -215
  392. package/src/compat/next/link-usage.ts +0 -29
  393. package/src/css/index.ts +0 -2
  394. package/src/render/index.ts +0 -1
  395. package/src/style-modules.d.ts +0 -9
@@ -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
  }