@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
@@ -13,17 +13,17 @@
13
13
  // resolution. Namespace, default and mixed-default imports of the specifier are left untouched - Next
14
14
  // bails on those too.
15
15
 
16
- import { rewriteFacts, type ImportBinding } from '../../resolve/scan-facts';
17
- import { spliceSource } from '../../dev/module-transform';
18
- import { withSniff, type ServerSourceTransform } from '../../extensions';
19
- import { specifierSniffTokens } from '../../utils/source';
16
+ import { rewriteFacts, type ImportBinding } from '../../resolve/scan-facts'
17
+ import { spliceSource } from '../../runtime/module-transform'
18
+ import { withSniff, type ServerSourceTransform } from '../../extensions'
19
+ import { specifierSniffTokens } from '../../utils/code'
20
20
 
21
21
  /** A normalized `modularizeImports[specifier]` entry (string-template form). */
22
22
  export interface ModularizeRule {
23
23
  /** The output-path template, e.g. `'#/design-system/icons/{{ kebabCase member }}'`. */
24
- transform: string;
24
+ transform: string
25
25
  /** `true` => named import of the member from the target; otherwise a default import. */
26
- skipDefaultConversion?: boolean;
26
+ skipDefaultConversion?: boolean
27
27
  }
28
28
 
29
29
  /** Split an identifier into words on camelCase / digit / `_` / `-` boundaries. */
@@ -34,7 +34,7 @@ function splitWords(value: string): string[] {
34
34
  .replace(/[_-]+/g, ' ')
35
35
  .trim()
36
36
  .split(/\s+/)
37
- .filter(Boolean);
37
+ .filter(Boolean)
38
38
  }
39
39
 
40
40
  /** Apply a template helper (`kebabCase`/`camelCase`/`lowerCase`/`upperCase`) to a member name. */
@@ -43,19 +43,19 @@ function applyHelper(helper: string, member: string): string {
43
43
  case 'kebabCase':
44
44
  return splitWords(member)
45
45
  .map(word => word.toLowerCase())
46
- .join('-');
46
+ .join('-')
47
47
  case 'camelCase':
48
48
  return splitWords(member)
49
49
  .map((word, index) =>
50
50
  index === 0 ? word.toLowerCase() : word[0]!.toUpperCase() + word.slice(1).toLowerCase(),
51
51
  )
52
- .join('');
52
+ .join('')
53
53
  case 'lowerCase':
54
- return member.toLowerCase();
54
+ return member.toLowerCase()
55
55
  case 'upperCase':
56
- return member.toUpperCase();
56
+ return member.toUpperCase()
57
57
  default:
58
- return member;
58
+ return member
59
59
  }
60
60
  }
61
61
 
@@ -63,7 +63,7 @@ function applyHelper(helper: string, member: string): string {
63
63
  function applyTemplate(template: string, member: string): string {
64
64
  return template.replace(/\{\{\s*(?:(\w+)\s+)?member\s*\}\}/g, (_full, helper?: string) =>
65
65
  helper ? applyHelper(helper, member) : member,
66
- );
66
+ )
67
67
  }
68
68
 
69
69
  /**
@@ -71,23 +71,26 @@ function applyTemplate(template: string, member: string): string {
71
71
  * statements. Returns `undefined` (leaving the original import untouched) for a
72
72
  * clause the rewrite does not own: no members, or a `type` import.
73
73
  */
74
- function expandMembers(bindings: readonly ImportBinding[], rule: ModularizeRule): string | undefined {
75
- if (bindings.length === 0) return undefined;
74
+ function expandMembers(
75
+ bindings: readonly ImportBinding[],
76
+ rule: ModularizeRule,
77
+ ): string | undefined {
78
+ if (bindings.length === 0) return undefined
76
79
 
77
- const statements: string[] = [];
80
+ const statements: string[] = []
78
81
  for (const binding of bindings) {
79
- if (binding.type || binding.imported === 'default' || binding.imported === '*') return undefined;
80
- const original = binding.imported;
81
- const local = binding.local;
82
- const target = JSON.stringify(applyTemplate(rule.transform, original));
82
+ if (binding.type || binding.imported === 'default' || binding.imported === '*') return undefined
83
+ const original = binding.imported
84
+ const local = binding.local
85
+ const target = JSON.stringify(applyTemplate(rule.transform, original))
83
86
  if (rule.skipDefaultConversion) {
84
- const named = original === local ? original : `${original} as ${local}`;
85
- statements.push(`import { ${named} } from ${target};`);
87
+ const named = original === local ? original : `${original} as ${local}`
88
+ statements.push(`import { ${named} } from ${target};`)
86
89
  } else {
87
- statements.push(`import ${local} from ${target};`);
90
+ statements.push(`import ${local} from ${target};`)
88
91
  }
89
92
  }
90
- return statements.join(' ');
93
+ return statements.join(' ')
91
94
  }
92
95
 
93
96
  /**
@@ -98,22 +101,22 @@ function expandMembers(bindings: readonly ImportBinding[], rule: ModularizeRule)
98
101
  export function createModularizeImportsTransform(
99
102
  rules: Record<string, ModularizeRule>,
100
103
  ): ServerSourceTransform {
101
- if (Object.keys(rules).length === 0) return withSniff([], source => source);
104
+ if (Object.keys(rules).length === 0) return withSniff([], source => source)
102
105
 
103
106
  // Folded onto the module record: one memoized parse instead
104
107
  // of a per-rule import regex, and a configured specifier quoted in a string or
105
108
  // a comment no longer expands.
106
109
  return withSniff(specifierSniffTokens(Object.keys(rules)), (source, file) => {
107
- if (!source.includes('import')) return source;
108
- const edits: { start: number; end: number; value: string }[] = [];
110
+ if (!source.includes('import')) return source
111
+ const edits: { start: number; end: number; value: string }[] = []
109
112
  for (const statement of rewriteFacts(file, source).imports) {
110
- const rule = rules[statement.specifier];
111
- if (!rule) continue;
112
- const expanded = expandMembers(statement.bindings, rule);
113
+ const rule = rules[statement.specifier]
114
+ if (!rule) continue
115
+ const expanded = expandMembers(statement.bindings, rule)
113
116
  if (expanded !== undefined) {
114
- edits.push({ start: statement.start, end: statement.end, value: expanded });
117
+ edits.push({ start: statement.start, end: statement.end, value: expanded })
115
118
  }
116
119
  }
117
- return edits.length > 0 ? spliceSource(source, edits) : source;
118
- });
120
+ return edits.length > 0 ? spliceSource(source, edits) : source
121
+ })
119
122
  }
@@ -12,22 +12,22 @@
12
12
  //
13
13
  // Applied to both graphs as a registered source transform.
14
14
 
15
- import { rewriteReactProfilerServerSource } from './react-compiler';
15
+ import { rewriteReactProfilerServerSource } from './react-compiler'
16
16
 
17
17
  // A `new URL('<image>', import.meta.url)` call whose first argument is a string
18
18
  // literal ending in a static-image extension (optional ?query/#hash) and whose
19
19
  // second argument is exactly `import.meta.url`. Non-asset `new URL(...)` calls
20
20
  // (e.g. `new URL(request.url)`) never match.
21
- const IMAGE_EXT = 'png|jpe?g|gif|webp|avif|svg|ico|bmp';
21
+ const IMAGE_EXT = 'png|jpe?g|gif|webp|avif|svg|ico|bmp'
22
22
  const newUrlAssetPattern = () =>
23
23
  new RegExp(
24
24
  `new\\s+URL\\(\\s*(['"])([^'"]+?\\.(?:${IMAGE_EXT})(?:[?#][^'"]*)?)\\1\\s*,\\s*import\\.meta\\.url\\s*\\)`,
25
25
  'g',
26
- );
26
+ )
27
27
 
28
28
  /** Cheap gate: does the source contain any candidate `new URL(...import.meta.url)`? */
29
29
  export function sourceHasNewUrlAsset(source: string): boolean {
30
- return source.includes('import.meta.url') && newUrlAssetPattern().test(source);
30
+ return source.includes('import.meta.url') && newUrlAssetPattern().test(source)
31
31
  }
32
32
 
33
33
  /**
@@ -36,11 +36,11 @@ export function sourceHasNewUrlAsset(source: string): boolean {
36
36
  * Returns the source unchanged when there is nothing to rewrite.
37
37
  */
38
38
  export function rewriteNewUrlAssetSource(source: string, filePath?: string): string {
39
- const rewritten = rewriteReactProfilerServerSource(source, filePath);
39
+ const rewritten = rewriteReactProfilerServerSource(source, filePath)
40
40
  return rewriteNewUrlAssets(
41
41
  rewritten,
42
42
  typeof filePath === 'string' && filePath.includes('middleware'),
43
- );
43
+ )
44
44
  }
45
45
 
46
46
  /**
@@ -49,28 +49,28 @@ export function rewriteNewUrlAssetSource(source: string, filePath?: string): str
49
49
  * - that one is registered as its own client transform.
50
50
  */
51
51
  export function rewriteNewUrlAssetClientSource(source: string): string {
52
- return rewriteNewUrlAssets(source, false);
52
+ return rewriteNewUrlAssets(source, false)
53
53
  }
54
54
 
55
55
  function rewriteNewUrlAssets(source: string, isMiddleware: boolean): string {
56
- if (!source.includes('import.meta.url')) return source;
57
- const bindings = new Map<string, string>();
56
+ if (!source.includes('import.meta.url')) return source
57
+ const bindings = new Map<string, string>()
58
58
  const replaced = source.replace(newUrlAssetPattern(), (_match, _quote, spec: string) => {
59
- let binding = bindings.get(spec);
59
+ let binding = bindings.get(spec)
60
60
  if (!binding) {
61
- binding = `__pnext_new_url_${bindings.size}`;
62
- bindings.set(spec, binding);
61
+ binding = `__pnext_new_url_${bindings.size}`
62
+ bindings.set(spec, binding)
63
63
  }
64
64
  if (isMiddleware) {
65
- return `('blob:' + ${binding}.src.split('/').pop())`;
65
+ return `('blob:' + ${binding}.src.split('/').pop())`
66
66
  }
67
- return `(${binding}.src)`;
68
- });
69
- if (bindings.size === 0) return source;
67
+ return `(${binding}.src)`
68
+ })
69
+ if (bindings.size === 0) return source
70
70
  const imports = [...bindings]
71
71
  .map(([spec, binding]) => `import ${binding} from ${JSON.stringify(spec)};`)
72
- .join('\n');
73
- return injectAfterDirectives(replaced, imports);
72
+ .join('\n')
73
+ return injectAfterDirectives(replaced, imports)
74
74
  }
75
75
 
76
76
  // Insert injected imports after any leading directive prologue ('use client' /
@@ -78,10 +78,8 @@ function rewriteNewUrlAssets(source: string, isMiddleware: boolean): string {
78
78
  // `'use client'` stays the first statement (otherwise the directive is demoted
79
79
  // to a plain expression and the module is treated as server-only).
80
80
  function injectAfterDirectives(source: string, injection: string): string {
81
- const prologue = /^(\uFEFF?(?:#![^\n]*\n)?(?:[ \t]*(['"])use [\w-]+\2[ \t]*;?[ \t]*(?:\r?\n|$))*)/.exec(
82
- source,
83
- );
84
- const index = prologue ? prologue[0].length : 0;
85
- return `${source.slice(0, index)}${injection}\n${source.slice(index)}`;
81
+ const prologue =
82
+ /^(\uFEFF?(?:#![^\n]*\n)?(?:[ \t]*(['"])use [\w-]+\2[ \t]*;?[ \t]*(?:\r?\n|$))*)/.exec(source)
83
+ const index = prologue ? prologue[0].length : 0
84
+ return `${source.slice(0, index)}${injection}\n${source.slice(index)}`
86
85
  }
87
-
@@ -12,18 +12,18 @@
12
12
  // the entry must be re-exports and nothing else - no declarations, no side effects - or the package
13
13
  // is left alone, which is why an over-broad list cannot produce wrong code.
14
14
 
15
- import path from 'node:path';
16
- import { readFileSync } from 'node:fs';
15
+ import path from 'node:path'
16
+ import { readFileSync } from 'node:fs'
17
17
  // Lazy: the oxc-parser native binding costs ~12.6 MB RSS; load it only when a parse happens.
18
18
  const parseSync: typeof import('oxc-parser').parseSync = (...args) =>
19
19
  // eslint-disable-next-line @typescript-eslint/no-require-imports
20
- loadNative(() => require('oxc-parser') as typeof import('oxc-parser')).parseSync(...args);
21
- import { loadNative } from '../../utils/native-require';
22
- import { rewriteFacts, type ImportBinding } from '../../resolve/scan-facts';
23
- import { spliceSource } from '../../dev/module-transform';
24
- import { resolvePackageSpecifier, resolveVendorPackageSpecifier } from '../../resolve/imports';
25
- import { withSniff, type ServerSourceTransform } from '../../extensions';
26
- import { specifierSniffTokens } from '../../utils/source';
20
+ loadNative(() => require('oxc-parser') as typeof import('oxc-parser')).parseSync(...args)
21
+ import { loadNative } from '../../utils/native-require'
22
+ import { rewriteFacts, type ImportBinding } from '../../resolve/scan-facts'
23
+ import { spliceSource } from '../../runtime/module-transform'
24
+ import { resolvePackageSpecifier, resolveVendorPackageSpecifier } from '../../resolve/imports'
25
+ import { withSniff, type ServerSourceTransform } from '../../extensions'
26
+ import { specifierSniffTokens } from '../../utils/code'
27
27
 
28
28
  /**
29
29
  * Next's default `optimizePackageImports` set - the barrels big enough that compiling the entry is the
@@ -55,29 +55,29 @@ const DEFAULT_OPTIMIZED_PACKAGES = [
55
55
  'react-use',
56
56
  'recharts',
57
57
  'rxjs',
58
- ];
58
+ ]
59
59
 
60
60
  export function optimizedPackageSet(configured: readonly string[]): string[] {
61
61
  // Rewriting a barrel changes what the vendor pipeline compiles, so it is also
62
62
  // what a slow or wrong artifact has to be bisected against — and how the
63
63
  // bench A/Bs it (same seam shape as `PNEXT_VENDOR_GROUP=0`).
64
64
  // eslint-disable-next-line turbo/no-undeclared-env-vars
65
- if (process.env.PNEXT_OPTIMIZE_PACKAGE_IMPORTS === '0') return [];
66
- return [...new Set([...DEFAULT_OPTIMIZED_PACKAGES, ...configured])];
65
+ if (process.env.PNEXT_OPTIMIZE_PACKAGE_IMPORTS === '0') return []
66
+ return [...new Set([...DEFAULT_OPTIMIZED_PACKAGES, ...configured])]
67
67
  }
68
68
 
69
69
  /** Where one exported name really lives: the barrel's re-export target. */
70
70
  interface BarrelMember {
71
71
  /** The leaf module, relative to the barrel entry. */
72
- source: string;
72
+ source: string
73
73
  /** The name to take from it: `default`, `*`, or an export name. */
74
- imported: string;
74
+ imported: string
75
75
  }
76
76
 
77
77
  /** The exported names a pure re-export barrel publishes, and their leaves. */
78
- type BarrelMap = ReadonlyMap<string, BarrelMember>;
78
+ type BarrelMap = ReadonlyMap<string, BarrelMember>
79
79
 
80
- const barrelMaps = new Map<string, BarrelMap | undefined>();
80
+ const barrelMaps = new Map<string, BarrelMap | undefined>()
81
81
 
82
82
  /**
83
83
  * The leaf map of a barrel entry, or undefined when the entry is not a pure
@@ -85,67 +85,67 @@ const barrelMaps = new Map<string, BarrelMap | undefined>();
85
85
  * however many modules import it.
86
86
  */
87
87
  function barrelMap(entry: string): BarrelMap | undefined {
88
- if (barrelMaps.has(entry)) return barrelMaps.get(entry);
89
- let map: BarrelMap | undefined;
88
+ if (barrelMaps.has(entry)) return barrelMaps.get(entry)
89
+ let map: BarrelMap | undefined
90
90
  try {
91
- map = parseBarrel(entry);
91
+ map = parseBarrel(entry)
92
92
  } catch {
93
- map = undefined;
93
+ map = undefined
94
94
  }
95
- barrelMaps.set(entry, map);
96
- return map;
95
+ barrelMaps.set(entry, map)
96
+ return map
97
97
  }
98
98
 
99
99
  function parseBarrel(entry: string): BarrelMap | undefined {
100
- const source = readFileSync(entry, 'utf8');
101
- const parsed = parseSync(entry, source, { lang: 'js' });
102
- if (parsed.errors.length > 0) return undefined;
100
+ const source = readFileSync(entry, 'utf8')
101
+ const parsed = parseSync(entry, source, { lang: 'js' })
102
+ if (parsed.errors.length > 0) return undefined
103
103
 
104
104
  // A namespace re-export (`import * as icons from './icons/index.js'; export
105
105
  // { icons }`) is two statements; the local binding is only allowed to leave
106
106
  // the module through that export, or the barrel is doing something else.
107
- const namespaces = new Map<string, string>();
107
+ const namespaces = new Map<string, string>()
108
108
  for (const node of parsed.program.body) {
109
109
  if (node.type === 'ImportDeclaration') {
110
- const specifiers = node.specifiers ?? [];
111
- const only = specifiers[0];
112
- if (specifiers.length !== 1 || only?.type !== 'ImportNamespaceSpecifier') return undefined;
113
- namespaces.set(only.local.name, node.source.value);
114
- continue;
110
+ const specifiers = node.specifiers ?? []
111
+ const only = specifiers[0]
112
+ if (specifiers.length !== 1 || only?.type !== 'ImportNamespaceSpecifier') return undefined
113
+ namespaces.set(only.local.name, node.source.value)
114
+ continue
115
115
  }
116
116
  if (node.type === 'ExportNamedDeclaration') {
117
117
  // `export const x = …` is a definition, not a re-export: not a barrel.
118
- if (node.declaration) return undefined;
119
- continue;
118
+ if (node.declaration) return undefined
119
+ continue
120
120
  }
121
121
  // `export * from` hides its names in the target, so a demanded name cannot
122
122
  // be attributed to a leaf; anything else is code with a side effect.
123
- return undefined;
123
+ return undefined
124
124
  }
125
125
 
126
- const members = new Map<string, BarrelMember>();
126
+ const members = new Map<string, BarrelMember>()
127
127
  for (const statement of parsed.module.staticExports) {
128
128
  for (const record of statement.entries) {
129
- if (record.isType) continue;
130
- const exported = record.exportName.name;
131
- if (!exported) return undefined;
132
- const request = record.moduleRequest?.value;
129
+ if (record.isType) continue
130
+ const exported = record.exportName.name
131
+ if (!exported) return undefined
132
+ const request = record.moduleRequest?.value
133
133
  if (request) {
134
- const kind: string = record.importName.kind;
135
- if (kind === 'AllButDefault') return undefined;
134
+ const kind: string = record.importName.kind
135
+ if (kind === 'AllButDefault') return undefined
136
136
  const imported =
137
- kind === 'Default' ? 'default' : kind === 'All' ? '*' : record.importName.name;
138
- if (!imported) return undefined;
139
- members.set(exported, { source: request, imported });
140
- continue;
137
+ kind === 'Default' ? 'default' : kind === 'All' ? '*' : record.importName.name
138
+ if (!imported) return undefined
139
+ members.set(exported, { source: request, imported })
140
+ continue
141
141
  }
142
- const local = record.localName.name;
143
- const namespace = local === null ? undefined : namespaces.get(local);
144
- if (!namespace) return undefined;
145
- members.set(exported, { source: namespace, imported: '*' });
142
+ const local = record.localName.name
143
+ const namespace = local === null ? undefined : namespaces.get(local)
144
+ if (!namespace) return undefined
145
+ members.set(exported, { source: namespace, imported: '*' })
146
146
  }
147
147
  }
148
- return members.size > 0 ? members : undefined;
148
+ return members.size > 0 ? members : undefined
149
149
  }
150
150
 
151
151
  /**
@@ -154,11 +154,11 @@ function parseBarrel(entry: string): BarrelMap | undefined {
154
154
  * catalogue per layer, and one rewritten source is compiled for both.
155
155
  */
156
156
  function barrelEntry(root: string, file: string, specifier: string) {
157
- const client = resolveVendorPackageSpecifier(root, file, specifier, CLIENT_CONDITIONS);
158
- if (!client) return undefined;
157
+ const client = resolveVendorPackageSpecifier(root, file, specifier, CLIENT_CONDITIONS)
158
+ if (!client) return undefined
159
159
  return resolveVendorPackageSpecifier(root, file, specifier, SERVER_CONDITIONS) === client
160
160
  ? client
161
- : undefined;
161
+ : undefined
162
162
  }
163
163
 
164
164
  /**
@@ -169,48 +169,51 @@ function barrelEntry(root: string, file: string, specifier: string) {
169
169
  * because one rewritten source is compiled for both.
170
170
  */
171
171
  function leafSpecifier(root: string, entry: string, member: BarrelMember): string | undefined {
172
- const key = `${entry}\0${member.source}`;
173
- if (leafSpecifiers.has(key)) return leafSpecifiers.get(key);
174
- const specifier = resolveLeafSpecifier(root, entry, member);
175
- leafSpecifiers.set(key, specifier);
176
- return specifier;
172
+ const key = `${entry}\0${member.source}`
173
+ if (leafSpecifiers.has(key)) return leafSpecifiers.get(key)
174
+ const specifier = resolveLeafSpecifier(root, entry, member)
175
+ leafSpecifiers.set(key, specifier)
176
+ return specifier
177
177
  }
178
178
 
179
- const leafSpecifiers = new Map<string, string | undefined>();
179
+ const leafSpecifiers = new Map<string, string | undefined>()
180
180
 
181
- const CLIENT_CONDITIONS = ['module', 'import'];
182
- const SERVER_CONDITIONS = ['react-server', 'node', 'module', 'import'];
181
+ const CLIENT_CONDITIONS = ['module', 'import']
182
+ const SERVER_CONDITIONS = ['react-server', 'node', 'module', 'import']
183
183
 
184
184
  function resolveLeafSpecifier(root: string, entry: string, member: BarrelMember) {
185
- if (!member.source.startsWith('.')) return undefined;
186
- const file = path.resolve(path.dirname(entry), member.source);
187
- const packageDir = packageDirOf(entry);
188
- if (!packageDir) return undefined;
189
- const name = packageNameOfDir(packageDir);
190
- const relative = path.relative(packageDir, file);
191
- if (!name || relative.startsWith('..') || path.isAbsolute(relative)) return undefined;
192
- const specifier = `${name}/${relative.split(path.sep).join('/')}`;
185
+ if (!member.source.startsWith('.')) return undefined
186
+ const file = path.resolve(path.dirname(entry), member.source)
187
+ const packageDir = packageDirOf(entry)
188
+ if (!packageDir) return undefined
189
+ const name = packageNameOfDir(packageDir)
190
+ const relative = path.relative(packageDir, file)
191
+ if (!name || relative.startsWith('..') || path.isAbsolute(relative)) return undefined
192
+ const specifier = `${name}/${relative.split(path.sep).join('/')}`
193
193
  for (const conditions of [CLIENT_CONDITIONS, SERVER_CONDITIONS]) {
194
- if (resolvePackageSpecifier(root, entry, specifier, conditions) !== file) return undefined;
194
+ if (resolvePackageSpecifier(root, entry, specifier, conditions) !== file) return undefined
195
195
  }
196
- return specifier;
196
+ return specifier
197
197
  }
198
198
 
199
199
  /** The installed package a barrel entry belongs to, by its `node_modules` segment. */
200
200
  function packageDirOf(entry: string) {
201
- const marker = `${path.sep}node_modules${path.sep}`;
202
- const index = entry.lastIndexOf(marker);
203
- if (index < 0) return undefined;
204
- const rest = entry.slice(index + marker.length).split(path.sep);
205
- const segments = rest[0]?.startsWith('@') ? rest.slice(0, 2) : rest.slice(0, 1);
206
- return path.join(entry.slice(0, index + marker.length), ...segments);
201
+ const marker = `${path.sep}node_modules${path.sep}`
202
+ const index = entry.lastIndexOf(marker)
203
+ if (index < 0) return undefined
204
+ const rest = entry.slice(index + marker.length).split(path.sep)
205
+ const segments = rest[0]?.startsWith('@') ? rest.slice(0, 2) : rest.slice(0, 1)
206
+ return path.join(entry.slice(0, index + marker.length), ...segments)
207
207
  }
208
208
 
209
209
  function packageNameOfDir(packageDir: string) {
210
- const marker = `${path.sep}node_modules${path.sep}`;
211
- const index = packageDir.lastIndexOf(marker);
212
- if (index < 0) return undefined;
213
- return packageDir.slice(index + marker.length).split(path.sep).join('/');
210
+ const marker = `${path.sep}node_modules${path.sep}`
211
+ const index = packageDir.lastIndexOf(marker)
212
+ if (index < 0) return undefined
213
+ return packageDir
214
+ .slice(index + marker.length)
215
+ .split(path.sep)
216
+ .join('/')
214
217
  }
215
218
 
216
219
  /**
@@ -224,28 +227,29 @@ function expandBarrelImport(
224
227
  root: string,
225
228
  entry: string,
226
229
  ): string | undefined {
227
- if (bindings.length === 0) return undefined;
228
- const statements: string[] = [];
230
+ if (bindings.length === 0) return undefined
231
+ const statements: string[] = []
229
232
  for (const binding of bindings) {
230
233
  // A barrel publishes its types off the same entry, so `{ Icon, type Props }`
231
234
  // is the common shape. The type binding is erased before anything resolves
232
235
  // it, so dropping it is what lets the value bindings split at all.
233
- if (binding.type) continue;
234
- if (binding.imported === 'default' || binding.imported === '*') return undefined;
235
- const member = map.get(binding.imported);
236
- if (!member) return undefined;
237
- const specifier = leafSpecifier(root, entry, member);
238
- if (!specifier) return undefined;
239
- const target = JSON.stringify(specifier);
240
- if (member.imported === 'default') statements.push(`import ${binding.local} from ${target};`);
241
- else if (member.imported === '*') statements.push(`import * as ${binding.local} from ${target};`);
236
+ if (binding.type) continue
237
+ if (binding.imported === 'default' || binding.imported === '*') return undefined
238
+ const member = map.get(binding.imported)
239
+ if (!member) return undefined
240
+ const specifier = leafSpecifier(root, entry, member)
241
+ if (!specifier) return undefined
242
+ const target = JSON.stringify(specifier)
243
+ if (member.imported === 'default') statements.push(`import ${binding.local} from ${target};`)
244
+ else if (member.imported === '*')
245
+ statements.push(`import * as ${binding.local} from ${target};`)
242
246
  else {
243
247
  const named =
244
- member.imported === binding.local ? binding.local : `${member.imported} as ${binding.local}`;
245
- statements.push(`import { ${named} } from ${target};`);
248
+ member.imported === binding.local ? binding.local : `${member.imported} as ${binding.local}`
249
+ statements.push(`import { ${named} } from ${target};`)
246
250
  }
247
251
  }
248
- return statements.length > 0 ? statements.join(' ') : undefined;
252
+ return statements.length > 0 ? statements.join(' ') : undefined
249
253
  }
250
254
 
251
255
  /**
@@ -257,21 +261,21 @@ export function createOptimizePackageImportsTransform(
257
261
  packages: readonly string[],
258
262
  root: string,
259
263
  ): ServerSourceTransform {
260
- if (packages.length === 0) return withSniff([], source => source);
261
- const optimized = new Set(packages);
264
+ if (packages.length === 0) return withSniff([], source => source)
265
+ const optimized = new Set(packages)
262
266
  return withSniff(specifierSniffTokens(packages), (source, file) => {
263
- if (!source.includes('import')) return source;
264
- const edits: { start: number; end: number; value: string }[] = [];
267
+ if (!source.includes('import')) return source
268
+ const edits: { start: number; end: number; value: string }[] = []
265
269
  for (const statement of rewriteFacts(file, source).imports) {
266
- if (!optimized.has(statement.specifier)) continue;
267
- const entry = barrelEntry(root, file, statement.specifier);
268
- const map = entry && barrelMap(entry);
269
- if (!map || !entry) continue;
270
- const expanded = expandBarrelImport(statement.bindings, map, root, entry);
270
+ if (!optimized.has(statement.specifier)) continue
271
+ const entry = barrelEntry(root, file, statement.specifier)
272
+ const map = entry && barrelMap(entry)
273
+ if (!map || !entry) continue
274
+ const expanded = expandBarrelImport(statement.bindings, map, root, entry)
271
275
  if (expanded !== undefined) {
272
- edits.push({ start: statement.start, end: statement.end, value: expanded });
276
+ edits.push({ start: statement.start, end: statement.end, value: expanded })
273
277
  }
274
278
  }
275
- return edits.length > 0 ? spliceSource(source, edits) : source;
276
- });
279
+ return edits.length > 0 ? spliceSource(source, edits) : source
280
+ })
277
281
  }