vinext 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/README.md +22 -10
  2. package/dist/build/client-build-config.d.ts +10 -0
  3. package/dist/build/client-build-config.js +18 -2
  4. package/dist/build/output-root-externals.d.ts +21 -0
  5. package/dist/build/output-root-externals.js +40 -0
  6. package/dist/build/pages-client-assets-module.d.ts +8 -0
  7. package/dist/build/pages-client-assets-module.js +21 -1
  8. package/dist/build/prerender-paths.js +6 -4
  9. package/dist/build/prerender.js +1 -1
  10. package/dist/build/run-prerender.js +1 -1
  11. package/dist/build/ssr-manifest.d.ts +2 -0
  12. package/dist/build/ssr-manifest.js +6 -2
  13. package/dist/check.js +12 -12
  14. package/dist/cli-dev-config.js +3 -3
  15. package/dist/cli.js +3 -2
  16. package/dist/client/client-redirect-matcher.d.ts +14 -0
  17. package/dist/client/client-redirect-matcher.js +37 -0
  18. package/dist/client/client-redirects.d.ts +27 -0
  19. package/dist/client/client-redirects.js +28 -0
  20. package/dist/client/client-rewrites.d.ts +2 -1
  21. package/dist/client/client-rewrites.js +1 -1
  22. package/dist/config/config-matchers.d.ts +26 -11
  23. package/dist/config/config-matchers.js +90 -88
  24. package/dist/config/destination-params.d.ts +47 -0
  25. package/dist/config/destination-params.js +116 -0
  26. package/dist/config/next-config.d.ts +7 -0
  27. package/dist/config/next-config.js +3 -0
  28. package/dist/entries/app-rsc-entry.d.ts +4 -0
  29. package/dist/entries/app-rsc-entry.js +20 -6
  30. package/dist/entries/pages-client-entry.js +3 -1
  31. package/dist/entries/pages-server-entry.js +13 -37
  32. package/dist/index.d.ts +3 -1
  33. package/dist/index.js +246 -136
  34. package/dist/init-cloudflare.d.ts +9 -0
  35. package/dist/init-cloudflare.js +107 -31
  36. package/dist/init-platform.d.ts +4 -0
  37. package/dist/init-platform.js +27 -2
  38. package/dist/init.d.ts +2 -1
  39. package/dist/init.js +153 -9
  40. package/dist/plugins/ast-scope.d.ts +7 -0
  41. package/dist/plugins/ast-scope.js +59 -3
  42. package/dist/plugins/ast-utils.d.ts +53 -2
  43. package/dist/plugins/ast-utils.js +90 -2
  44. package/dist/plugins/cloudflare-dev-module-urls.d.ts +41 -0
  45. package/dist/plugins/cloudflare-dev-module-urls.js +271 -0
  46. package/dist/plugins/commonjs-esm-facade.js +2 -2
  47. package/dist/plugins/css-module-imports.js +13 -20
  48. package/dist/plugins/dynamic-preload-metadata.d.ts +1 -1
  49. package/dist/plugins/dynamic-preload-metadata.js +11 -11
  50. package/dist/plugins/extensionless-dynamic-import.js +2 -3
  51. package/dist/plugins/fonts.d.ts +1 -1
  52. package/dist/plugins/fonts.js +3 -3
  53. package/dist/plugins/ignore-dynamic-requests.d.ts +1 -1
  54. package/dist/plugins/ignore-dynamic-requests.js +5 -7
  55. package/dist/plugins/import-meta-url.js +3 -4
  56. package/dist/plugins/instrumentation-client.js +3 -2
  57. package/dist/plugins/middleware-export-validation.js +2 -3
  58. package/dist/plugins/middleware-server-only.d.ts +5 -4
  59. package/dist/plugins/middleware-server-only.js +8 -5
  60. package/dist/plugins/og-harfbuzz.js +2 -3
  61. package/dist/plugins/optimize-imports.js +3 -4
  62. package/dist/plugins/pages-node-externals.js +3 -4
  63. package/dist/plugins/remove-console.js +2 -18
  64. package/dist/plugins/require-condition-resolution.js +3 -3
  65. package/dist/plugins/require-context.js +2 -3
  66. package/dist/plugins/rsc-scan-glob-imports.d.ts +19 -0
  67. package/dist/plugins/rsc-scan-glob-imports.js +50 -0
  68. package/dist/plugins/strip-server-exports.js +265 -102
  69. package/dist/plugins/styled-jsx.js +2 -3
  70. package/dist/plugins/transform-result.d.ts +9 -5
  71. package/dist/plugins/transitive-externals.js +1 -1
  72. package/dist/plugins/typeof-window.d.ts +2 -2
  73. package/dist/plugins/use-cache-callable.d.ts +21 -2
  74. package/dist/plugins/use-cache-callable.js +84 -35
  75. package/dist/plugins/worker-image-imports.js +30 -33
  76. package/dist/plugins/worker-server-only-imports.d.ts +20 -0
  77. package/dist/plugins/worker-server-only-imports.js +31 -0
  78. package/dist/plugins/worker-use-server.d.ts +25 -0
  79. package/dist/plugins/worker-use-server.js +153 -0
  80. package/dist/server/api-handler.d.ts +1 -0
  81. package/dist/server/api-handler.js +3 -2
  82. package/dist/server/app-action-forwarding.js +2 -2
  83. package/dist/server/app-browser-action-result.d.ts +1 -1
  84. package/dist/server/app-browser-action-result.js +9 -2
  85. package/dist/server/app-browser-entry.js +3 -3
  86. package/dist/server/app-browser-interception-context.js +1 -1
  87. package/dist/server/app-browser-navigation-controller.js +1 -1
  88. package/dist/server/app-browser-prefetch-response.js +2 -2
  89. package/dist/server/app-browser-server-action-client.js +1 -1
  90. package/dist/server/app-browser-state.js +1 -1
  91. package/dist/server/app-browser-supplemental-refresh.js +1 -1
  92. package/dist/server/app-middleware.d.ts +11 -0
  93. package/dist/server/app-middleware.js +17 -2
  94. package/dist/server/app-optimistic-routing.js +1 -1
  95. package/dist/server/app-page-cache.d.ts +1 -1
  96. package/dist/server/app-page-cache.js +1 -1
  97. package/dist/server/app-page-dispatch.d.ts +3 -1
  98. package/dist/server/app-page-dispatch.js +5 -4
  99. package/dist/server/app-page-ppr-runtime.js +1 -1
  100. package/dist/server/app-page-render-observation.js +1 -1
  101. package/dist/server/app-page-render.js +1 -1
  102. package/dist/server/app-page-request.js +53 -15
  103. package/dist/server/app-page-route-wiring.js +2 -2
  104. package/dist/server/app-pages-bridge.d.ts +1 -1
  105. package/dist/server/app-pages-bridge.js +3 -4
  106. package/dist/server/app-prerender-endpoints.js +9 -6
  107. package/dist/server/app-render-abort-error.d.ts +19 -0
  108. package/dist/server/app-render-abort-error.js +31 -1
  109. package/dist/server/app-request-stage-dispatch.js +6 -2
  110. package/dist/server/app-request-stage-independent-entry.js +29 -9
  111. package/dist/server/app-response-stage-entry.js +11 -3
  112. package/dist/server/app-route-handler-cache.d.ts +1 -0
  113. package/dist/server/app-route-handler-cache.js +1 -0
  114. package/dist/server/app-route-handler-dispatch.d.ts +1 -0
  115. package/dist/server/app-route-handler-dispatch.js +5 -2
  116. package/dist/server/app-route-handler-execution.d.ts +1 -0
  117. package/dist/server/app-route-handler-execution.js +1 -0
  118. package/dist/server/app-route-handler-runtime.d.ts +4 -1
  119. package/dist/server/app-route-handler-runtime.js +46 -25
  120. package/dist/server/app-router-entry.js +29 -10
  121. package/dist/server/app-rsc-cache-busting.d.ts +16 -0
  122. package/dist/server/app-rsc-cache-busting.js +30 -13
  123. package/dist/server/app-rsc-errors.js +20 -16
  124. package/dist/server/app-rsc-handler.d.ts +7 -0
  125. package/dist/server/app-rsc-handler.js +89 -39
  126. package/dist/server/app-rsc-request-normalization.js +3 -3
  127. package/dist/server/app-rsc-response-stage.js +5 -3
  128. package/dist/server/app-segment-config.d.ts +2 -1
  129. package/dist/server/app-server-action-execution.d.ts +2 -1
  130. package/dist/server/app-server-action-execution.js +62 -23
  131. package/dist/server/app-ssr-entry.js +7 -5
  132. package/dist/server/app-visited-response-cache.js +2 -2
  133. package/dist/server/app-worker-stages.d.ts +5 -0
  134. package/dist/server/app-worker-stages.js +1 -1
  135. package/dist/server/cacheability-request.js +2 -2
  136. package/dist/server/client-build-files.d.ts +16 -0
  137. package/dist/server/client-build-files.js +36 -0
  138. package/dist/server/client-reuse-manifest.js +1 -1
  139. package/dist/server/config-headers.js +1 -1
  140. package/dist/server/defer-until-stream-consumed.d.ts +2 -1
  141. package/dist/server/defer-until-stream-consumed.js +3 -1
  142. package/dist/server/dev-server.js +39 -28
  143. package/dist/server/dev-stack-sourcemap.js +18 -23
  144. package/dist/server/document-initial-head.d.ts +0 -11
  145. package/dist/server/document-initial-head.js +1 -1
  146. package/dist/server/forwarded-middleware-context.d.ts +5 -0
  147. package/dist/server/forwarded-middleware-context.js +22 -0
  148. package/dist/server/headers.d.ts +4 -1
  149. package/dist/server/headers.js +4 -1
  150. package/dist/server/http-conditional.d.ts +11 -0
  151. package/dist/server/http-conditional.js +10 -1
  152. package/dist/server/http-error-responses.d.ts +1 -1
  153. package/dist/server/image-optimization.d.ts +38 -0
  154. package/dist/server/image-optimization.js +94 -4
  155. package/dist/server/isr-cache.d.ts +10 -0
  156. package/dist/server/isr-cache.js +41 -6
  157. package/dist/server/metadata-route-response.js +11 -10
  158. package/dist/server/middleware-matcher.d.ts +2 -0
  159. package/dist/server/middleware-matcher.js +23 -2
  160. package/dist/server/middleware-path-to-regexp.js +1 -1
  161. package/dist/server/middleware-runtime.d.ts +13 -0
  162. package/dist/server/middleware-runtime.js +38 -25
  163. package/dist/server/middleware.d.ts +1 -1
  164. package/dist/server/middleware.js +3 -1
  165. package/dist/server/multi-stage.d.ts +11 -0
  166. package/dist/server/navigation-planner.js +1 -1
  167. package/dist/server/normalize-path.d.ts +0 -13
  168. package/dist/server/normalize-path.js +1 -34
  169. package/dist/server/open-redirect.d.ts +11 -4
  170. package/dist/server/open-redirect.js +11 -4
  171. package/dist/server/pages-api-route.d.ts +3 -2
  172. package/dist/server/pages-api-route.js +6 -5
  173. package/dist/server/pages-cache-tag.d.ts +12 -0
  174. package/dist/server/pages-cache-tag.js +19 -0
  175. package/dist/server/pages-client-assets.d.ts +2 -0
  176. package/dist/server/pages-data-route.d.ts +10 -0
  177. package/dist/server/pages-data-route.js +21 -3
  178. package/dist/server/pages-document-asset-props.d.ts +5 -1
  179. package/dist/server/pages-document-asset-props.js +13 -5
  180. package/dist/server/pages-document-splice.d.ts +19 -0
  181. package/dist/server/pages-document-splice.js +55 -0
  182. package/dist/server/pages-i18n.d.ts +12 -1
  183. package/dist/server/pages-i18n.js +18 -4
  184. package/dist/server/pages-node-compat.d.ts +16 -5
  185. package/dist/server/pages-node-compat.js +20 -12
  186. package/dist/server/pages-page-data.d.ts +32 -24
  187. package/dist/server/pages-page-data.js +51 -121
  188. package/dist/server/pages-page-handler.d.ts +0 -6
  189. package/dist/server/pages-page-handler.js +189 -127
  190. package/dist/server/pages-page-response.d.ts +12 -6
  191. package/dist/server/pages-page-response.js +42 -35
  192. package/dist/server/pages-request-pipeline.d.ts +10 -2
  193. package/dist/server/pages-request-pipeline.js +41 -22
  194. package/dist/server/pages-request-stage-entry.d.ts +6 -0
  195. package/dist/server/pages-request-stage-entry.js +75 -16
  196. package/dist/server/pages-response-stage-entry.js +4 -0
  197. package/dist/server/pages-revalidate.js +3 -3
  198. package/dist/server/pages-router-entry.js +5 -4
  199. package/dist/server/prerender-manifest.d.ts +3 -3
  200. package/dist/server/prerender-manifest.js +4 -3
  201. package/dist/server/prerender-work-unit-setup.js +4 -0
  202. package/dist/server/prod-server.d.ts +12 -0
  203. package/dist/server/prod-server.js +204 -74
  204. package/dist/server/proper-error.d.ts +4 -0
  205. package/dist/server/proper-error.js +31 -0
  206. package/dist/server/request-pipeline.d.ts +4 -1
  207. package/dist/server/request-pipeline.js +3 -2
  208. package/dist/server/revalidation-request.d.ts +1 -0
  209. package/dist/server/revalidation-request.js +1 -1
  210. package/dist/server/rsc-stream-hints.d.ts +1 -1
  211. package/dist/server/rsc-stream-hints.js +52 -5
  212. package/dist/server/seed-cache.d.ts +1 -0
  213. package/dist/server/seed-cache.js +5 -4
  214. package/dist/server/server-reference-loader.d.ts +4 -0
  215. package/dist/server/server-reference-loader.js +29 -0
  216. package/dist/server/socket-error-backstop.d.ts +9 -1
  217. package/dist/server/socket-error-backstop.js +46 -17
  218. package/dist/server/static-file-signal.d.ts +15 -4
  219. package/dist/server/static-file-signal.js +46 -12
  220. package/dist/server/worker-image-optimization.d.ts +34 -0
  221. package/dist/server/worker-image-optimization.js +99 -0
  222. package/dist/server/worker-stages.d.ts +1 -1
  223. package/dist/server/worker-stages.js +2 -2
  224. package/dist/server/worker-utils.d.ts +8 -3
  225. package/dist/server/worker-utils.js +12 -7
  226. package/dist/shims/app-router-scroll.js +4 -1
  227. package/dist/shims/app-router-tree-context.d.ts +5 -0
  228. package/dist/shims/app-router-tree-context.js +27 -0
  229. package/dist/shims/cache-callable-runtime.d.ts +4 -2
  230. package/dist/shims/cache-callable-runtime.js +21 -12
  231. package/dist/shims/cache-handler.js +1 -9
  232. package/dist/shims/cache-runtime.d.ts +6 -1
  233. package/dist/shims/cache-runtime.js +2 -1
  234. package/dist/shims/cache.d.ts +2 -2
  235. package/dist/shims/cache.js +40 -13
  236. package/dist/shims/cdn-cache.d.ts +8 -0
  237. package/dist/shims/cdn-cache.js +17 -1
  238. package/dist/shims/disable-smooth-scroll.d.ts +3 -0
  239. package/dist/shims/disable-smooth-scroll.js +36 -0
  240. package/dist/shims/document-placeholders.d.ts +19 -0
  241. package/dist/shims/document-placeholders.js +45 -0
  242. package/dist/shims/document.js +21 -5
  243. package/dist/shims/dynamic-preload-chunks.d.ts +1 -0
  244. package/dist/shims/dynamic-preload-chunks.js +13 -9
  245. package/dist/shims/dynamic.d.ts +1 -1
  246. package/dist/shims/dynamic.js +60 -8
  247. package/dist/shims/fetch-cache-state.d.ts +66 -0
  248. package/dist/shims/fetch-cache-state.js +92 -0
  249. package/dist/shims/fetch-cache.d.ts +3 -67
  250. package/dist/shims/fetch-cache.js +160 -125
  251. package/dist/shims/head.d.ts +10 -6
  252. package/dist/shims/head.js +16 -14
  253. package/dist/shims/headers.js +2 -2
  254. package/dist/shims/image.js +2 -1
  255. package/dist/shims/internal/hybrid-client-route-owner-direct.js +1 -1
  256. package/dist/shims/internal/hybrid-client-route-owner.js +1 -0
  257. package/dist/shims/internal/work-store-scope.d.ts +5 -0
  258. package/dist/shims/internal/work-store-scope.js +24 -0
  259. package/dist/shims/link-prefetch.js +5 -4
  260. package/dist/shims/link.js +2 -2
  261. package/dist/shims/navigation.js +34 -9
  262. package/dist/shims/request-context.d.ts +2 -0
  263. package/dist/shims/request-state-types.d.ts +2 -1
  264. package/dist/shims/router.js +21 -32
  265. package/dist/shims/server.d.ts +27 -4
  266. package/dist/shims/server.js +65 -9
  267. package/dist/shims/unified-request-context.d.ts +1 -1
  268. package/dist/shims/url-utils.d.ts +9 -0
  269. package/dist/shims/url-utils.js +15 -4
  270. package/dist/utils/client-runtime-metadata.js +1 -1
  271. package/dist/utils/domain-locale.js +1 -1
  272. package/dist/utils/hash.d.ts +7 -0
  273. package/dist/utils/hash.js +11 -1
  274. package/dist/utils/package-name.d.ts +6 -0
  275. package/dist/utils/package-name.js +12 -1
  276. package/dist/utils/plugin-rsc-version.d.ts +6 -0
  277. package/dist/utils/plugin-rsc-version.js +41 -0
  278. package/dist/utils/prerender-output-paths.js +15 -4
  279. package/dist/utils/public-file-path.d.ts +10 -2
  280. package/dist/utils/public-file-path.js +13 -9
  281. package/dist/utils/public-routes.js +2 -2
  282. package/dist/utils/react-version.d.ts +10 -0
  283. package/dist/utils/react-version.js +39 -16
  284. package/package.json +11 -7
  285. package/dist/build/nitro-route-rules.d.ts +0 -47
  286. package/dist/build/nitro-route-rules.js +0 -79
  287. package/dist/plugins/cache-flight-codec.d.ts +0 -19
  288. package/dist/plugins/cache-flight-codec.js +0 -68
@@ -1,6 +1,6 @@
1
- import { getAstName } from "./ast-utils.js";
1
+ import { getAstName, parseProgram } from "./ast-utils.js";
2
2
  import { magicStringTransformResult } from "./transform-result.js";
3
- import { parseAst } from "vite";
3
+ import { findAstBindingScope, walkAstScopes } from "./ast-scope.js";
4
4
  import MagicString from "magic-string";
5
5
  //#region src/plugins/strip-server-exports.ts
6
6
  const SERVER_EXPORTS = /* @__PURE__ */ new Set([
@@ -12,6 +12,8 @@ const SERVER_EXPORTS = /* @__PURE__ */ new Set([
12
12
  "unstable_getStaticProps",
13
13
  "unstable_getStaticPaths"
14
14
  ]);
15
+ const UNUSED_LOOP_TARGET = "({ x: 0 }).x";
16
+ const CATCH_BOUND_NAME = "\0catch-bound";
15
17
  const SERVER_PROPS_SSG_CONFLICT = "You can not use getStaticProps or getStaticPaths with getServerSideProps. To use SSG, please remove getServerSideProps";
16
18
  const EXPORT_ALL_IN_PAGE_ERROR = "Using `export * from '...'` in a page is disallowed. Please use `export { default } from '...'` instead.\nRead more: https://nextjs.org/docs/messages/export-all-in-page";
17
19
  function hasServerExportCandidate(code) {
@@ -127,70 +129,102 @@ function renderExportDeclaration(code, statement, removed) {
127
129
  if (kept.length === 0) return "";
128
130
  return `export { ${kept.map((specifier) => code.slice(specifier.start, specifier.end)).join(", ")} }${statement.source ? ` from ${code.slice(statement.source.start, statement.end)}` : ";"}`;
129
131
  }
130
- function renderBindingPattern(code, pattern, removedNames) {
132
+ /**
133
+ * Render a binding or assignment pattern without the removed names. `slice`
134
+ * copies kept subexpressions (defaults, computed keys) so callers can apply
135
+ * edits nested inside them.
136
+ */
137
+ function renderBindingPattern(slice, pattern, removedNames) {
131
138
  if (pattern.type === "Identifier") return removedNames.has(pattern.name) ? null : pattern.name;
139
+ if (pattern.type === "MemberExpression") {
140
+ const root = assignmentTargetIdentifiers(pattern)[0];
141
+ return root && removedNames.has(root.name) ? null : slice(pattern.start, pattern.end);
142
+ }
132
143
  if (pattern.type === "RestElement") {
133
- const argument = renderBindingPattern(code, pattern.argument, removedNames);
144
+ const argument = renderBindingPattern(slice, pattern.argument, removedNames);
134
145
  return argument ? `...${argument}` : null;
135
146
  }
136
147
  if (pattern.type === "AssignmentPattern") {
137
- const left = renderBindingPattern(code, pattern.left, removedNames);
138
- return left ? `${left} = ${code.slice(pattern.right.start, pattern.right.end)}` : null;
148
+ const left = renderBindingPattern(slice, pattern.left, removedNames);
149
+ return left ? `${left} = ${slice(pattern.right.start, pattern.right.end)}` : null;
139
150
  }
140
151
  if (pattern.type === "ObjectPattern") {
141
152
  const properties = pattern.properties.flatMap((property) => {
142
153
  if (property.type === "RestElement") {
143
- const rendered = renderBindingPattern(code, property, removedNames);
154
+ const rendered = renderBindingPattern(slice, property, removedNames);
144
155
  return rendered ? [rendered] : [];
145
156
  }
146
- const value = renderBindingPattern(code, property.value, removedNames);
157
+ const value = renderBindingPattern(slice, property.value, removedNames);
147
158
  if (!value) return [];
148
159
  if (property.shorthand && property.value.type === "Identifier") return [value];
149
- const key = code.slice(property.key.start, property.key.end);
160
+ const key = slice(property.key.start, property.key.end);
150
161
  return [`${property.computed ? `[${key}]` : key}: ${value}`];
151
162
  });
152
163
  return properties.length > 0 ? `{ ${properties.join(", ")} }` : null;
153
164
  }
154
165
  if (pattern.type === "ArrayPattern") {
155
- const elements = pattern.elements.map((element) => element ? renderBindingPattern(code, element, removedNames) : null);
166
+ const elements = pattern.elements.map((element) => element ? renderBindingPattern(slice, element, removedNames) : null);
156
167
  while (elements.length > 0 && elements.at(-1) === null) elements.pop();
157
168
  return elements.length > 0 ? `[${elements.map((element) => element ?? "").join(", ")}]` : null;
158
169
  }
159
- return code.slice(pattern.start, pattern.end);
170
+ return slice(pattern.start, pattern.end);
160
171
  }
161
- function assignmentRootName(node) {
162
- if (node.type === "Identifier") return node.name;
163
- if (node.type === "MemberExpression") return assignmentRootName(node.object);
172
+ /** Edits pointing a loop head's removed targets at `UNUSED_LOOP_TARGET`. */
173
+ function throwawayTargetEdits(pattern, removedNames) {
174
+ if (pattern.type === "Identifier" || pattern.type === "MemberExpression") {
175
+ const root = assignmentTargetIdentifiers(pattern)[0];
176
+ return root && removedNames.has(root.name) ? [{
177
+ start: pattern.start,
178
+ end: pattern.end,
179
+ replacement: UNUSED_LOOP_TARGET
180
+ }] : [];
181
+ }
182
+ if (pattern.type === "RestElement") return throwawayTargetEdits(pattern.argument, removedNames);
183
+ if (pattern.type === "AssignmentPattern") return throwawayTargetEdits(pattern.left, removedNames);
184
+ if (pattern.type === "ArrayPattern") return pattern.elements.flatMap((element) => element ? throwawayTargetEdits(element, removedNames) : []);
185
+ if (pattern.type === "ObjectPattern") return pattern.properties.flatMap((property) => {
186
+ if (property.type === "RestElement") return throwawayTargetEdits(property, removedNames);
187
+ const edits = throwawayTargetEdits(property.value, removedNames);
188
+ if (!property.shorthand) return edits;
189
+ return edits.map((edit) => ({
190
+ ...edit,
191
+ replacement: `${property.key.name}: ${UNUSED_LOOP_TARGET}`
192
+ }));
193
+ });
194
+ return [];
164
195
  }
165
- function assignmentBindingNames(node) {
166
- if (node.type === "ArrayPattern" || node.type === "ObjectPattern") return bindingNames(node);
167
- const rootName = assignmentRootName(node);
168
- return rootName ? [rootName] : [];
196
+ /** Pattern parts `renderBindingPattern` drops, including their defaults and keys. */
197
+ function prunedPatternParts(pattern, removedNames) {
198
+ const isPruned = (part) => renderBindingPattern((start, end) => "".padEnd(end - start), part, removedNames) === null;
199
+ if (isPruned(pattern)) return [pattern];
200
+ if (pattern.type === "AssignmentPattern") return prunedPatternParts(pattern.left, removedNames);
201
+ if (pattern.type === "RestElement") return prunedPatternParts(pattern.argument, removedNames);
202
+ if (pattern.type === "ArrayPattern") return pattern.elements.flatMap((element) => element ? prunedPatternParts(element, removedNames) : []);
203
+ if (pattern.type === "ObjectPattern") return pattern.properties.flatMap((property) => {
204
+ if (property.type === "RestElement") return prunedPatternParts(property, removedNames);
205
+ return isPruned(property.value) ? [property] : prunedPatternParts(property.value, removedNames);
206
+ });
207
+ return [];
169
208
  }
170
- function isAssignmentTargetIdentifier(node, left) {
171
- if (left.type === "Identifier") return node.start === left.start;
172
- if (left.type === "ArrayPattern" || left.type === "ObjectPattern") return bindingIdentifiers(left).some((identifier) => identifier.start === node.start);
173
- if (left.type === "MemberExpression") {
174
- let object = left.object;
175
- while (object.type === "MemberExpression") object = object.object;
176
- return object.type === "Identifier" && object.start === node.start;
177
- }
178
- return false;
209
+ /** Identifiers an assignment target writes: pattern bindings and member roots. */
210
+ function assignmentTargetIdentifiers(node) {
211
+ if (!node) return [];
212
+ if (node.type === "Identifier") return [node];
213
+ if (node.type === "MemberExpression") return assignmentTargetIdentifiers(node.object);
214
+ if (node.type === "RestElement") return assignmentTargetIdentifiers(node.argument);
215
+ if (node.type === "AssignmentPattern") return assignmentTargetIdentifiers(node.left);
216
+ if (node.type === "ArrayPattern") return node.elements.flatMap((element) => assignmentTargetIdentifiers(element));
217
+ if (node.type === "ObjectPattern") return node.properties.flatMap((property) => assignmentTargetIdentifiers(property.type === "RestElement" ? property.argument : property.value));
218
+ return [];
179
219
  }
180
- function findLexicalScope(ancestors) {
181
- return [...ancestors].reverse().find((ancestor) => [
182
- "BlockStatement",
183
- "SwitchStatement",
184
- "ForStatement",
185
- "ForInStatement",
186
- "ForOfStatement"
187
- ].includes(ancestor.type));
220
+ function isAssignmentTargetIdentifier(node, left) {
221
+ return assignmentTargetIdentifiers(left).some((identifier) => identifier.start === node.start);
188
222
  }
189
223
  function validatePageExports(code) {
190
224
  if (!hasExportAllCandidate(code)) return;
191
225
  let ast;
192
226
  try {
193
- ast = parseAst(code);
227
+ ast = parseProgram(code);
194
228
  } catch {
195
229
  return;
196
230
  }
@@ -208,7 +242,7 @@ function stripServerExports(code) {
208
242
  if (!hasServerExportCandidate(code) && !hasExportAllCandidate(code)) return null;
209
243
  let ast;
210
244
  try {
211
- ast = parseAst(code);
245
+ ast = parseProgram(code);
212
246
  } catch {
213
247
  return null;
214
248
  }
@@ -227,14 +261,41 @@ function stripServerExports(code) {
227
261
  const forcedBindings = /* @__PURE__ */ new Set();
228
262
  const candidateBindings = /* @__PURE__ */ new Set();
229
263
  const bindings = /* @__PURE__ */ new Map();
264
+ const redeclarations = [];
265
+ const loopHeadDeclarations = /* @__PURE__ */ new Set();
266
+ const catchBoundNames = /* @__PURE__ */ new Map();
267
+ const iterationHeadDeclarators = /* @__PURE__ */ new Set();
268
+ const removedNamesFor = (declarator) => {
269
+ const catchBound = catchBoundNames.get(declarator);
270
+ const iterationHead = iterationHeadDeclarators.has(declarator);
271
+ if (!catchBound && !iterationHead) return deadBindings;
272
+ return new Set([...deadBindings].filter((name) => !catchBound?.has(name) && (!iterationHead || forcedBindings.has(name) || candidateBindings.has(name))));
273
+ };
274
+ const iterationHeadDeclarations = /* @__PURE__ */ new Set();
275
+ const declarationsOf = (name) => {
276
+ const binding = bindings.get(name);
277
+ return [...binding ? [binding] : [], ...redeclarations.filter((redeclaration) => redeclaration.name === name)];
278
+ };
279
+ const renderEdit = (edit) => typeof edit.replacement === "function" ? edit.replacement() : edit.replacement;
280
+ const renderRange = (start, end) => {
281
+ const nested = [...new Map(edits.filter((edit) => edit.start >= start && edit.end <= end).map((edit) => [`${edit.start}:${edit.end}`, edit])).values()].sort((left, right) => left.start - right.start || right.end - left.end);
282
+ let rendered = "";
283
+ let cursor = start;
284
+ for (const edit of nested) {
285
+ if (edit.start < cursor) continue;
286
+ rendered += code.slice(cursor, edit.start) + renderEdit(edit);
287
+ cursor = edit.end;
288
+ }
289
+ return rendered + code.slice(cursor, end);
290
+ };
230
291
  const bindingPositions = /* @__PURE__ */ new Set();
231
292
  const references = /* @__PURE__ */ new Map();
232
- const shadowRanges = /* @__PURE__ */ new Map();
293
+ const memberTargetReads = /* @__PURE__ */ new Map();
233
294
  const exportSpecifierRemovals = /* @__PURE__ */ new Map();
234
295
  const variableRemovals = /* @__PURE__ */ new Map();
235
296
  const importRemovals = /* @__PURE__ */ new Map();
236
- const assignmentStatements = [];
237
- const removedAssignments = /* @__PURE__ */ new Set();
297
+ const assignments = [];
298
+ const rewrittenAssignments = /* @__PURE__ */ new Map();
238
299
  for (const statement of statements) {
239
300
  const declaration = statement.type === "ExportNamedDeclaration" ? statement.declaration : statement;
240
301
  if (declaration?.type === "FunctionDeclaration" && declaration.id) {
@@ -282,48 +343,89 @@ function stripServerExports(code) {
282
343
  declaredNames: [name]
283
344
  });
284
345
  }
285
- else if (statement.type === "ExpressionStatement") {
286
- const expression = statement.expression;
287
- if (expression.type === "AssignmentExpression") {
288
- const left = expression.left;
289
- const names = assignmentBindingNames(left);
290
- if (names.length > 0) assignmentStatements.push({
291
- statement,
292
- left,
293
- bindingNames: names
294
- });
295
- }
296
- }
297
346
  }
298
- const addShadowRange = (name, range) => {
299
- if (!range || range.type === "Program") return;
300
- const ranges = shadowRanges.get(name) ?? [];
301
- ranges.push(range);
302
- shadowRanges.set(name, ranges);
303
- };
347
+ const localIdentifiers = /* @__PURE__ */ new Set();
348
+ walkAstScopes(ast, (node, scope) => {
349
+ if (node.type !== "Identifier") return;
350
+ if (findAstBindingScope(scope, node.name)?.parent) localIdentifiers.add(node.start);
351
+ });
352
+ const isLocal = (identifier) => localIdentifiers.has(identifier.start);
304
353
  walkAstWithAncestors(ast.body, (node, parent, ancestors = []) => {
305
- if (node.type === "FunctionDeclaration" || node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression") {
306
- for (const parameter of node.params) for (const name of bindingNames(parameter)) addShadowRange(name, node);
307
- if (node.type === "FunctionDeclaration" && node.id) addShadowRange(node.id.name, findLexicalScope(ancestors));
308
- else if (node.type === "FunctionExpression" && node.id) addShadowRange(node.id.name, node);
309
- } else if (node.type === "ClassDeclaration" && node.id) addShadowRange(node.id.name, findLexicalScope(ancestors));
310
- else if (node.type === "ClassExpression" && node.id) addShadowRange(node.id.name, node);
311
- else if (node.type === "CatchClause" && node.param) for (const name of bindingNames(node.param)) addShadowRange(name, node.body);
312
- else if (node.type === "VariableDeclarator" && parent?.type === "VariableDeclaration") {
313
- const scope = parent.kind === "var" ? [...ancestors].reverse().find((ancestor) => [
354
+ if (node.type === "VariableDeclarator" && parent?.type === "VariableDeclaration") {
355
+ const varScope = parent.kind === "var" ? [...ancestors].reverse().find((ancestor) => [
314
356
  "FunctionDeclaration",
315
357
  "FunctionExpression",
316
- "ArrowFunctionExpression"
317
- ].includes(ancestor.type)) : findLexicalScope(ancestors);
318
- for (const name of bindingNames(node.id)) addShadowRange(name, scope);
358
+ "ArrowFunctionExpression",
359
+ "StaticBlock"
360
+ ].includes(ancestor.type)) : void 0;
361
+ const owner = ancestors.at(-2);
362
+ if (parent.kind === "var" && !varScope && owner && owner.type !== "ExportNamedDeclaration") {
363
+ if (owner.init === parent || owner.left === parent) loopHeadDeclarations.add(parent);
364
+ if (owner.left === parent) {
365
+ iterationHeadDeclarations.add(parent);
366
+ iterationHeadDeclarators.add(node);
367
+ }
368
+ const identifiers = bindingIdentifiers(node.id);
369
+ for (const identifier of identifiers) bindingPositions.add(identifier.start);
370
+ const catchBound = new Set(identifiers.filter((identifier) => isLocal(identifier)).map((identifier) => identifier.name));
371
+ if (catchBound.size > 0) catchBoundNames.set(node, catchBound);
372
+ const declaredNames = identifiers.map((identifier) => catchBound.has(identifier.name) ? CATCH_BOUND_NAME : identifier.name);
373
+ for (const identifier of identifiers) {
374
+ const name = identifier.name;
375
+ if (catchBound.has(name)) continue;
376
+ const binding = {
377
+ name,
378
+ node,
379
+ parent,
380
+ kind: "variable",
381
+ implementation: iterationHeadDeclarators.has(node) ? identifier : node.init ?? node,
382
+ declaredNames
383
+ };
384
+ if (bindings.has(name)) redeclarations.push(binding);
385
+ else bindings.set(name, binding);
386
+ }
387
+ }
319
388
  }
320
389
  });
321
390
  walkAstWithAncestors(ast.body, (node, parent, ancestors = []) => {
391
+ if (node.type === "AssignmentExpression") {
392
+ const names = assignmentTargetIdentifiers(node.left).filter((identifier) => !isLocal(identifier)).map((identifier) => identifier.name);
393
+ if (names.length > 0) {
394
+ const statement = parent?.type === "ExpressionStatement" && parent.expression === node ? parent : void 0;
395
+ assignments.push({
396
+ expression: node,
397
+ statement,
398
+ topLevel: statement !== void 0 && ancestors.length === 1,
399
+ bindingNames: names
400
+ });
401
+ }
402
+ return;
403
+ }
404
+ if (node.type === "ForInStatement" || node.type === "ForOfStatement") {
405
+ const left = node.left;
406
+ const names = (left.type === "VariableDeclaration" ? bindingIdentifiers(left.declarations[0]?.id) : assignmentTargetIdentifiers(left)).filter((identifier) => !isLocal(identifier)).map((identifier) => identifier.name);
407
+ if (names.length > 0) assignments.push({
408
+ expression: node,
409
+ statement: node,
410
+ topLevel: ancestors.length === 0,
411
+ bindingNames: names,
412
+ loop: true
413
+ });
414
+ return;
415
+ }
322
416
  if (!isReferenceIdentifier(node, parent)) return;
323
417
  if (bindingPositions.has(node.start)) return;
324
- if (isInsideRanges(node.start, shadowRanges.get(node.name) ?? [])) return;
325
- const assignment = [...ancestors].reverse().find((ancestor) => ancestor.type === "AssignmentExpression");
326
- if (assignment && isAssignmentTargetIdentifier(node, assignment.left)) return;
418
+ if (isLocal(node)) return;
419
+ const writer = [...ancestors].reverse().find((ancestor) => ancestor.type === "AssignmentExpression" || (ancestor.type === "ForInStatement" || ancestor.type === "ForOfStatement") && node.start >= ancestor.left.start && node.end <= ancestor.left.end);
420
+ if (writer && isAssignmentTargetIdentifier(node, writer.left)) {
421
+ const left = writer.left;
422
+ if (node !== left && !bindingIdentifiers(left).some((target) => target.start === node.start) && !(writer.type === "AssignmentExpression" && left.type === "MemberExpression")) {
423
+ const positions = memberTargetReads.get(node.name) ?? [];
424
+ positions.push(node.start);
425
+ memberTargetReads.set(node.name, positions);
426
+ }
427
+ return;
428
+ }
327
429
  const positions = references.get(node.name) ?? [];
328
430
  positions.push(node.start);
329
431
  references.set(node.name, positions);
@@ -388,26 +490,76 @@ function stripServerExports(code) {
388
490
  let changed = true;
389
491
  while (changed) {
390
492
  changed = false;
391
- for (const { statement, left, bindingNames: names } of assignmentStatements) {
493
+ for (const { expression, statement, topLevel, bindingNames: names, loop } of assignments) {
392
494
  const removableNames = new Set(names.filter((name) => forcedBindings.has(name) || deadBindings.has(name)));
393
495
  if (removableNames.size === 0) continue;
394
- if (removedAssignments.has(statement)) continue;
395
- const expression = statement.expression;
396
- const renderedLeft = left.type === "ArrayPattern" || left.type === "ObjectPattern" ? renderBindingPattern(code, left, removableNames) : null;
397
- removedAssignments.add(statement);
496
+ if ((rewrittenAssignments.get(expression) ?? 0) >= removableNames.size) continue;
497
+ rewrittenAssignments.set(expression, removableNames.size);
498
+ if (loop) {
499
+ const head = expression.left;
500
+ const pattern = head.type === "VariableDeclaration" ? head.declarations[0].id : head;
501
+ if (![...removableNames].some((name) => forcedBindings.has(name) || candidateBindings.has(name))) {
502
+ if (head.type !== "VariableDeclaration") edits.push(...throwawayTargetEdits(head, removableNames));
503
+ continue;
504
+ }
505
+ const prunedNames = head.type === "VariableDeclaration" ? new Set([...removableNames].filter((name) => forcedBindings.has(name) || candidateBindings.has(name))) : removableNames;
506
+ if (renderBindingPattern((start, end) => code.slice(start, end), pattern, prunedNames)) {
507
+ for (const part of prunedPatternParts(pattern, prunedNames)) if (addDeadRange(part)) changed = true;
508
+ if (head.type !== "VariableDeclaration") edits.push({
509
+ start: head.start,
510
+ end: head.end,
511
+ replacement: () => renderBindingPattern(renderRange, head, removableNames)
512
+ });
513
+ continue;
514
+ }
515
+ edits.push({
516
+ start: expression.start,
517
+ end: expression.end,
518
+ replacement: topLevel ? "" : ";"
519
+ });
520
+ if (addDeadRange(expression)) changed = true;
521
+ continue;
522
+ }
523
+ const left = expression.left;
524
+ const renderedLeft = left.type === "ArrayPattern" || left.type === "ObjectPattern" ? renderBindingPattern((start, end) => code.slice(start, end), left, removableNames) : null;
525
+ const right = expression.right;
526
+ const renderRight = () => renderRange(right.start, right.end);
527
+ const target = statement ?? expression;
528
+ if (renderedLeft) {
529
+ for (const part of prunedPatternParts(left, removableNames)) if (addDeadRange(part)) changed = true;
530
+ edits.push({
531
+ start: target.start,
532
+ end: target.end,
533
+ replacement: () => {
534
+ const assignment = `${renderBindingPattern(renderRange, left, removableNames)} ${expression.operator} ${renderRight()}`;
535
+ if (!statement) return `(${assignment})`;
536
+ return left.type === "ObjectPattern" ? `(${assignment});` : `${assignment};`;
537
+ }
538
+ });
539
+ continue;
540
+ }
541
+ if (!statement && ![...removableNames].some((name) => forcedBindings.has(name) || candidateBindings.has(name))) {
542
+ edits.push({
543
+ start: target.start,
544
+ end: target.end,
545
+ replacement: () => `(${renderRight()})`
546
+ });
547
+ continue;
548
+ }
398
549
  edits.push({
399
- start: statement.start,
400
- end: statement.end,
401
- replacement: renderedLeft ? `${left.type === "ObjectPattern" ? `(${renderedLeft} ${expression.operator} ${code.slice(expression.right.start, expression.right.end)})` : `${renderedLeft} ${expression.operator} ${code.slice(expression.right.start, expression.right.end)}`};` : ""
550
+ start: target.start,
551
+ end: target.end,
552
+ replacement: statement ? topLevel ? "" : ";" : "void 0"
402
553
  });
403
- if (!renderedLeft && addDeadRange(statement)) changed = true;
554
+ if (addDeadRange(target)) changed = true;
404
555
  }
405
556
  const removableBindings = /* @__PURE__ */ new Set();
406
557
  for (const [name] of bindings) if (forcedBindings.has(name) || candidateBindings.has(name) || (references.get(name) ?? []).some((position) => isInsideRanges(position, deadRanges))) removableBindings.add(name);
558
+ const removableImplementations = (names, { shared }) => [...names].flatMap((name) => declarationsOf(name).filter((binding) => shared || binding.declaredNames.every((declared) => names.has(declared))).map((binding) => binding.implementation));
407
559
  let closureChanged = true;
408
560
  while (closureChanged) {
409
561
  closureChanged = false;
410
- const implementations = [...removableBindings].map((name) => bindings.get(name)?.implementation).filter((implementation) => Boolean(implementation));
562
+ const implementations = removableImplementations(removableBindings, { shared: true });
411
563
  for (const [name] of bindings) {
412
564
  if (removableBindings.has(name)) continue;
413
565
  if ((references.get(name) ?? []).some((position) => isInsideRanges(position, implementations))) {
@@ -419,10 +571,11 @@ function stripServerExports(code) {
419
571
  let pruneChanged = true;
420
572
  while (pruneChanged) {
421
573
  pruneChanged = false;
422
- const implementations = [...removableBindings].map((name) => bindings.get(name)?.implementation).filter((implementation) => Boolean(implementation));
574
+ const implementations = removableImplementations(removableBindings, { shared: false });
423
575
  for (const name of removableBindings) {
424
576
  if (forcedBindings.has(name)) continue;
425
- if ((references.get(name) ?? []).some((position) => !isInsideRanges(position, deadRanges) && !isInsideRanges(position, implementations))) {
577
+ const isLive = (position) => !isInsideRanges(position, deadRanges) && !isInsideRanges(position, implementations);
578
+ if ((references.get(name) ?? []).some(isLive) || !candidateBindings.has(name) && (memberTargetReads.get(name) ?? []).some(isLive)) {
426
579
  removableBindings.delete(name);
427
580
  pruneChanged = true;
428
581
  }
@@ -436,15 +589,18 @@ function stripServerExports(code) {
436
589
  changed = true;
437
590
  if (binding.kind === "function" || binding.kind === "class") addDeadRange(binding.implementation);
438
591
  }
439
- for (const binding of new Set(bindings.values())) {
592
+ for (const binding of /* @__PURE__ */ new Set([...bindings.values(), ...redeclarations])) {
440
593
  if (binding.kind !== "variable") continue;
441
- if (!binding.declaredNames.every((name) => deadBindings.has(name))) continue;
594
+ const removedNames = removedNamesFor(binding.node);
595
+ if (!binding.declaredNames.every((name) => removedNames.has(name))) {
596
+ for (const part of prunedPatternParts(binding.node.id, removedNames)) if (addDeadRange(part)) changed = true;
597
+ continue;
598
+ }
442
599
  if (addDeadRange(binding.implementation)) changed = true;
443
600
  }
444
601
  }
445
- for (const name of deadBindings) {
446
- const binding = bindings.get(name);
447
- if (!binding) continue;
602
+ for (const binding of [...deadBindings].flatMap(declarationsOf)) {
603
+ const name = binding.name;
448
604
  if (forcedBindings.has(name)) {
449
605
  if ((binding.kind === "function" || binding.kind === "class") && binding.parent.type !== "ExportNamedDeclaration") edits.push({
450
606
  start: binding.node.start,
@@ -482,17 +638,24 @@ function stripServerExports(code) {
482
638
  replacement: renderExportDeclaration(code, statement, removed)
483
639
  });
484
640
  for (const [declaration, removed] of variableRemovals) {
485
- const rendered = declaration.declarations.flatMap((declarator) => {
486
- if (!removed.has(declarator)) return [code.slice(declarator.start, declarator.end)];
487
- const pattern = renderBindingPattern(code, declarator.id, deadBindings);
488
- if (!pattern) return [];
489
- return [`${pattern}${declarator.init ? ` = ${code.slice(declarator.init.start, declarator.init.end)}` : ""}`];
490
- });
491
641
  const exportStatement = statements.find((statement) => statement.type === "ExportNamedDeclaration" && statement.declaration === declaration);
492
642
  edits.push({
493
643
  start: exportStatement?.start ?? declaration.start,
494
644
  end: declaration.end,
495
- replacement: rendered.length > 0 ? `${exportStatement ? "export " : ""}${declaration.kind} ${rendered.join(", ")};` : ""
645
+ replacement: () => {
646
+ const rendered = declaration.declarations.flatMap((declarator) => {
647
+ if (!removed.has(declarator)) return [renderRange(declarator.start, declarator.end)];
648
+ const pattern = renderBindingPattern(renderRange, declarator.id, removedNamesFor(declarator));
649
+ if (!pattern) return [];
650
+ return [`${pattern}${declarator.init ? ` = ${renderRange(declarator.init.start, declarator.init.end)}` : ""}`];
651
+ });
652
+ if (rendered.length > 0) {
653
+ const terminator = loopHeadDeclarations.has(declaration) ? "" : ";";
654
+ return `${exportStatement ? "export " : ""}${declaration.kind} ${rendered.join(", ")}${terminator}`;
655
+ }
656
+ if (iterationHeadDeclarations.has(declaration)) return UNUSED_LOOP_TARGET;
657
+ return exportStatement || statements.includes(declaration) || loopHeadDeclarations.has(declaration) ? "" : ";";
658
+ }
496
659
  });
497
660
  }
498
661
  for (const [statement, removed] of importRemovals) edits.push({
@@ -502,12 +665,12 @@ function stripServerExports(code) {
502
665
  });
503
666
  if (edits.length === 0) return null;
504
667
  const string = new MagicString(code);
505
- const uniqueEdits = [...new Map(edits.map((edit) => [`${edit.start}:${edit.end}`, edit])).values()].sort((left, right) => right.start - left.start || right.end - left.end);
506
- let lastStart = Number.POSITIVE_INFINITY;
668
+ const uniqueEdits = [...new Map(edits.map((edit) => [`${edit.start}:${edit.end}`, edit])).values()].sort((left, right) => left.start - right.start || right.end - left.end);
669
+ let lastEnd = Number.NEGATIVE_INFINITY;
507
670
  for (const edit of uniqueEdits) {
508
- if (edit.end > lastStart) continue;
509
- string.overwrite(edit.start, edit.end, edit.replacement);
510
- lastStart = edit.start;
671
+ if (edit.start < lastEnd) continue;
672
+ string.overwrite(edit.start, edit.end, renderEdit(edit));
673
+ lastEnd = edit.end;
511
674
  }
512
675
  return magicStringTransformResult(string);
513
676
  }
@@ -1,9 +1,8 @@
1
1
  import path from "../deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js";
2
- import { SCRIPT_MODULE_ID_RE, walkAst } from "./ast-utils.js";
2
+ import { SCRIPT_MODULE_ID_RE, parseProgram, walkAst } from "./ast-utils.js";
3
3
  import { NODE_MODULES_PATH_RE, stripViteModuleQuery } from "../utils/path.js";
4
4
  import { createRequire } from "node:module";
5
5
  import { pathToFileURL } from "node:url";
6
- import { parseAst } from "vite";
7
6
  //#region src/plugins/styled-jsx.ts
8
7
  const STYLED_JSX_IMPORT_RE = /^styled-jsx(?:\/.*)?$/;
9
8
  const STYLED_JSX_SOURCE_RE = /(?:<style\b|from\s+["']styled-jsx\/css["']|require\s*\(\s*["']styled-jsx\/css["']\s*\))/;
@@ -14,7 +13,7 @@ function hasStyledJsxTag(source, id) {
14
13
  const lang = extension === ".ts" || extension === ".mts" || extension === ".cts" ? "ts" : "tsx";
15
14
  let ast;
16
15
  try {
17
- ast = parseAst(source, { lang });
16
+ ast = parseProgram(source, { lang });
18
17
  } catch {
19
18
  return false;
20
19
  }
@@ -1,8 +1,12 @@
1
1
  import MagicString from "magic-string";
2
2
  //#region src/plugins/transform-result.d.ts
3
- export type MagicStringTransformResult = {
3
+ export type MagicStringTransformResult<TMap = ReturnType<MagicString["generateMap"]>> = {
4
4
  code: string;
5
- map: ReturnType<MagicString["generateMap"]>;
5
+ map: TMap;
6
+ };
7
+ type MagicStringOutput<TMap> = {
8
+ toString(): string;
9
+ generateMap(options: Parameters<MagicString["generateMap"]>[0]): TMap;
6
10
  };
7
11
  type SourcemapEnvironment = {
8
12
  mode?: string;
@@ -13,15 +17,15 @@ type SourcemapEnvironment = {
13
17
  };
14
18
  };
15
19
  /** Build the standard code + sourcemap result returned by source transforms. */
16
- export declare function magicStringTransformResult(output: MagicString, options?: Parameters<MagicString["generateMap"]>[0]): MagicStringTransformResult;
20
+ export declare function magicStringTransformResult<TMap = ReturnType<MagicString["generateMap"]>>(output: MagicStringOutput<TMap>, options?: Parameters<MagicString["generateMap"]>[0]): MagicStringTransformResult<TMap>;
17
21
  /**
18
22
  * Drop the sourcemap from a transform result when the build environment
19
23
  * discards it, mirroring Vite's own transforms
20
24
  * (`config.build.sourcemap ? s.generateMap(...) : null`). Dev and builds with
21
25
  * sourcemaps enabled keep the result unchanged.
22
26
  */
23
- export declare function omitUnusedBuildSourcemap(environment: SourcemapEnvironment | undefined, result: MagicStringTransformResult | null): {
27
+ export declare function omitUnusedBuildSourcemap<TMap = ReturnType<MagicString["generateMap"]>>(environment: SourcemapEnvironment | undefined, result: MagicStringTransformResult<TMap> | null): {
24
28
  code: string;
25
- map: MagicStringTransformResult["map"] | null;
29
+ map: TMap | null;
26
30
  } | null;
27
31
  //#endregion
@@ -1,7 +1,7 @@
1
1
  import path from "../deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js";
2
2
  import { canonicalizeFilePath, stripViteModuleQuery } from "../utils/path.js";
3
- import { BARE_PACKAGE_SPECIFIER_RE, packageNameFromSpecifier } from "../utils/package-name.js";
4
3
  import { isServerEnvironment } from "./environment.js";
4
+ import { BARE_PACKAGE_SPECIFIER_RE, packageNameFromSpecifier } from "../utils/package-name.js";
5
5
  import { createRequire } from "node:module";
6
6
  import { createIdResolver } from "vite";
7
7
  //#region src/plugins/transitive-externals.ts
@@ -23,6 +23,6 @@ export declare function getTypeofWindowReplacement(environment: EnvironmentLike)
23
23
  * parser's module record in {@link moduleRecordHasScannedFoldTargets} is exact.
24
24
  */
25
25
  export declare function mayFoldChangeScannedImports(code: string): boolean;
26
- export declare function replaceTypeofWindow(code: string, replacement: WindowType, id?: string): MagicStringTransformResult | null;
27
- export declare function replaceConsumerEnvironmentConditions(code: string, replacements: ConsumerEnvironmentReplacements, id?: string): MagicStringTransformResult | null;
26
+ export declare function replaceTypeofWindow(code: string, replacement: WindowType, id?: string): MagicStringTransformResult<import("magic-string").SourceMap> | null;
27
+ export declare function replaceConsumerEnvironmentConditions(code: string, replacements: ConsumerEnvironmentReplacements, id?: string): MagicStringTransformResult<import("magic-string").SourceMap> | null;
28
28
  //#endregion
@@ -1,9 +1,28 @@
1
1
  import { Plugin } from "vite";
2
2
  //#region src/plugins/use-cache-callable.d.ts
3
+ type RscTransforms = typeof import("@vitejs/plugin-rsc/transforms");
3
4
  type Options = {
4
5
  projectRoot: string;
5
6
  cacheRuntime: string;
6
7
  allowMissingRsc?: boolean;
7
8
  };
8
- export declare function createUseCacheCallablePlugin(options: Options): Promise<Plugin>;
9
- //#endregion
9
+ type BrowserTransformOptions = {
10
+ environmentName: string;
11
+ reference: {
12
+ referenceKey: string;
13
+ };
14
+ secureExportName: (name: string) => string;
15
+ createReference: (referenceId: string, name: string) => string;
16
+ };
17
+ type BrowserTransformOutput = NonNullable<ReturnType<RscTransforms["transformDirectiveProxyExport"]>>;
18
+ export type UseCacheCallableApi = {
19
+ /**
20
+ * Compile a browser Web Worker module like the client environment does,
21
+ * with the same reference ids, without claiming references.
22
+ */
23
+ transformWorkerModule(code: string, id: string, createReference: BrowserTransformOptions["createReference"]): Promise<BrowserTransformOutput["output"] | undefined>;
24
+ };
25
+ declare const PLUGIN_NAME = "vinext:server-function-directives";
26
+ export declare function createUseCacheCallablePlugin(options: Options): Promise<Plugin<UseCacheCallableApi>>;
27
+ //#endregion
28
+ export { PLUGIN_NAME as USE_CACHE_PLUGIN_NAME };