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.
- package/README.md +22 -10
- package/dist/build/client-build-config.d.ts +10 -0
- package/dist/build/client-build-config.js +18 -2
- package/dist/build/output-root-externals.d.ts +21 -0
- package/dist/build/output-root-externals.js +40 -0
- package/dist/build/pages-client-assets-module.d.ts +8 -0
- package/dist/build/pages-client-assets-module.js +21 -1
- package/dist/build/prerender-paths.js +6 -4
- package/dist/build/prerender.js +1 -1
- package/dist/build/run-prerender.js +1 -1
- package/dist/build/ssr-manifest.d.ts +2 -0
- package/dist/build/ssr-manifest.js +6 -2
- package/dist/check.js +12 -12
- package/dist/cli-dev-config.js +3 -3
- package/dist/cli.js +3 -2
- package/dist/client/client-redirect-matcher.d.ts +14 -0
- package/dist/client/client-redirect-matcher.js +37 -0
- package/dist/client/client-redirects.d.ts +27 -0
- package/dist/client/client-redirects.js +28 -0
- package/dist/client/client-rewrites.d.ts +2 -1
- package/dist/client/client-rewrites.js +1 -1
- package/dist/config/config-matchers.d.ts +26 -11
- package/dist/config/config-matchers.js +90 -88
- package/dist/config/destination-params.d.ts +47 -0
- package/dist/config/destination-params.js +116 -0
- package/dist/config/next-config.d.ts +7 -0
- package/dist/config/next-config.js +3 -0
- package/dist/entries/app-rsc-entry.d.ts +4 -0
- package/dist/entries/app-rsc-entry.js +20 -6
- package/dist/entries/pages-client-entry.js +3 -1
- package/dist/entries/pages-server-entry.js +13 -37
- package/dist/index.d.ts +3 -1
- package/dist/index.js +246 -136
- package/dist/init-cloudflare.d.ts +9 -0
- package/dist/init-cloudflare.js +107 -31
- package/dist/init-platform.d.ts +4 -0
- package/dist/init-platform.js +27 -2
- package/dist/init.d.ts +2 -1
- package/dist/init.js +153 -9
- package/dist/plugins/ast-scope.d.ts +7 -0
- package/dist/plugins/ast-scope.js +59 -3
- package/dist/plugins/ast-utils.d.ts +53 -2
- package/dist/plugins/ast-utils.js +90 -2
- package/dist/plugins/cloudflare-dev-module-urls.d.ts +41 -0
- package/dist/plugins/cloudflare-dev-module-urls.js +271 -0
- package/dist/plugins/commonjs-esm-facade.js +2 -2
- package/dist/plugins/css-module-imports.js +13 -20
- package/dist/plugins/dynamic-preload-metadata.d.ts +1 -1
- package/dist/plugins/dynamic-preload-metadata.js +11 -11
- package/dist/plugins/extensionless-dynamic-import.js +2 -3
- package/dist/plugins/fonts.d.ts +1 -1
- package/dist/plugins/fonts.js +3 -3
- package/dist/plugins/ignore-dynamic-requests.d.ts +1 -1
- package/dist/plugins/ignore-dynamic-requests.js +5 -7
- package/dist/plugins/import-meta-url.js +3 -4
- package/dist/plugins/instrumentation-client.js +3 -2
- package/dist/plugins/middleware-export-validation.js +2 -3
- package/dist/plugins/middleware-server-only.d.ts +5 -4
- package/dist/plugins/middleware-server-only.js +8 -5
- package/dist/plugins/og-harfbuzz.js +2 -3
- package/dist/plugins/optimize-imports.js +3 -4
- package/dist/plugins/pages-node-externals.js +3 -4
- package/dist/plugins/remove-console.js +2 -18
- package/dist/plugins/require-condition-resolution.js +3 -3
- package/dist/plugins/require-context.js +2 -3
- package/dist/plugins/rsc-scan-glob-imports.d.ts +19 -0
- package/dist/plugins/rsc-scan-glob-imports.js +50 -0
- package/dist/plugins/strip-server-exports.js +265 -102
- package/dist/plugins/styled-jsx.js +2 -3
- package/dist/plugins/transform-result.d.ts +9 -5
- package/dist/plugins/transitive-externals.js +1 -1
- package/dist/plugins/typeof-window.d.ts +2 -2
- package/dist/plugins/use-cache-callable.d.ts +21 -2
- package/dist/plugins/use-cache-callable.js +84 -35
- package/dist/plugins/worker-image-imports.js +30 -33
- package/dist/plugins/worker-server-only-imports.d.ts +20 -0
- package/dist/plugins/worker-server-only-imports.js +31 -0
- package/dist/plugins/worker-use-server.d.ts +25 -0
- package/dist/plugins/worker-use-server.js +153 -0
- package/dist/server/api-handler.d.ts +1 -0
- package/dist/server/api-handler.js +3 -2
- package/dist/server/app-action-forwarding.js +2 -2
- package/dist/server/app-browser-action-result.d.ts +1 -1
- package/dist/server/app-browser-action-result.js +9 -2
- package/dist/server/app-browser-entry.js +3 -3
- package/dist/server/app-browser-interception-context.js +1 -1
- package/dist/server/app-browser-navigation-controller.js +1 -1
- package/dist/server/app-browser-prefetch-response.js +2 -2
- package/dist/server/app-browser-server-action-client.js +1 -1
- package/dist/server/app-browser-state.js +1 -1
- package/dist/server/app-browser-supplemental-refresh.js +1 -1
- package/dist/server/app-middleware.d.ts +11 -0
- package/dist/server/app-middleware.js +17 -2
- package/dist/server/app-optimistic-routing.js +1 -1
- package/dist/server/app-page-cache.d.ts +1 -1
- package/dist/server/app-page-cache.js +1 -1
- package/dist/server/app-page-dispatch.d.ts +3 -1
- package/dist/server/app-page-dispatch.js +5 -4
- package/dist/server/app-page-ppr-runtime.js +1 -1
- package/dist/server/app-page-render-observation.js +1 -1
- package/dist/server/app-page-render.js +1 -1
- package/dist/server/app-page-request.js +53 -15
- package/dist/server/app-page-route-wiring.js +2 -2
- package/dist/server/app-pages-bridge.d.ts +1 -1
- package/dist/server/app-pages-bridge.js +3 -4
- package/dist/server/app-prerender-endpoints.js +9 -6
- package/dist/server/app-render-abort-error.d.ts +19 -0
- package/dist/server/app-render-abort-error.js +31 -1
- package/dist/server/app-request-stage-dispatch.js +6 -2
- package/dist/server/app-request-stage-independent-entry.js +29 -9
- package/dist/server/app-response-stage-entry.js +11 -3
- package/dist/server/app-route-handler-cache.d.ts +1 -0
- package/dist/server/app-route-handler-cache.js +1 -0
- package/dist/server/app-route-handler-dispatch.d.ts +1 -0
- package/dist/server/app-route-handler-dispatch.js +5 -2
- package/dist/server/app-route-handler-execution.d.ts +1 -0
- package/dist/server/app-route-handler-execution.js +1 -0
- package/dist/server/app-route-handler-runtime.d.ts +4 -1
- package/dist/server/app-route-handler-runtime.js +46 -25
- package/dist/server/app-router-entry.js +29 -10
- package/dist/server/app-rsc-cache-busting.d.ts +16 -0
- package/dist/server/app-rsc-cache-busting.js +30 -13
- package/dist/server/app-rsc-errors.js +20 -16
- package/dist/server/app-rsc-handler.d.ts +7 -0
- package/dist/server/app-rsc-handler.js +89 -39
- package/dist/server/app-rsc-request-normalization.js +3 -3
- package/dist/server/app-rsc-response-stage.js +5 -3
- package/dist/server/app-segment-config.d.ts +2 -1
- package/dist/server/app-server-action-execution.d.ts +2 -1
- package/dist/server/app-server-action-execution.js +62 -23
- package/dist/server/app-ssr-entry.js +7 -5
- package/dist/server/app-visited-response-cache.js +2 -2
- package/dist/server/app-worker-stages.d.ts +5 -0
- package/dist/server/app-worker-stages.js +1 -1
- package/dist/server/cacheability-request.js +2 -2
- package/dist/server/client-build-files.d.ts +16 -0
- package/dist/server/client-build-files.js +36 -0
- package/dist/server/client-reuse-manifest.js +1 -1
- package/dist/server/config-headers.js +1 -1
- package/dist/server/defer-until-stream-consumed.d.ts +2 -1
- package/dist/server/defer-until-stream-consumed.js +3 -1
- package/dist/server/dev-server.js +39 -28
- package/dist/server/dev-stack-sourcemap.js +18 -23
- package/dist/server/document-initial-head.d.ts +0 -11
- package/dist/server/document-initial-head.js +1 -1
- package/dist/server/forwarded-middleware-context.d.ts +5 -0
- package/dist/server/forwarded-middleware-context.js +22 -0
- package/dist/server/headers.d.ts +4 -1
- package/dist/server/headers.js +4 -1
- package/dist/server/http-conditional.d.ts +11 -0
- package/dist/server/http-conditional.js +10 -1
- package/dist/server/http-error-responses.d.ts +1 -1
- package/dist/server/image-optimization.d.ts +38 -0
- package/dist/server/image-optimization.js +94 -4
- package/dist/server/isr-cache.d.ts +10 -0
- package/dist/server/isr-cache.js +41 -6
- package/dist/server/metadata-route-response.js +11 -10
- package/dist/server/middleware-matcher.d.ts +2 -0
- package/dist/server/middleware-matcher.js +23 -2
- package/dist/server/middleware-path-to-regexp.js +1 -1
- package/dist/server/middleware-runtime.d.ts +13 -0
- package/dist/server/middleware-runtime.js +38 -25
- package/dist/server/middleware.d.ts +1 -1
- package/dist/server/middleware.js +3 -1
- package/dist/server/multi-stage.d.ts +11 -0
- package/dist/server/navigation-planner.js +1 -1
- package/dist/server/normalize-path.d.ts +0 -13
- package/dist/server/normalize-path.js +1 -34
- package/dist/server/open-redirect.d.ts +11 -4
- package/dist/server/open-redirect.js +11 -4
- package/dist/server/pages-api-route.d.ts +3 -2
- package/dist/server/pages-api-route.js +6 -5
- package/dist/server/pages-cache-tag.d.ts +12 -0
- package/dist/server/pages-cache-tag.js +19 -0
- package/dist/server/pages-client-assets.d.ts +2 -0
- package/dist/server/pages-data-route.d.ts +10 -0
- package/dist/server/pages-data-route.js +21 -3
- package/dist/server/pages-document-asset-props.d.ts +5 -1
- package/dist/server/pages-document-asset-props.js +13 -5
- package/dist/server/pages-document-splice.d.ts +19 -0
- package/dist/server/pages-document-splice.js +55 -0
- package/dist/server/pages-i18n.d.ts +12 -1
- package/dist/server/pages-i18n.js +18 -4
- package/dist/server/pages-node-compat.d.ts +16 -5
- package/dist/server/pages-node-compat.js +20 -12
- package/dist/server/pages-page-data.d.ts +32 -24
- package/dist/server/pages-page-data.js +51 -121
- package/dist/server/pages-page-handler.d.ts +0 -6
- package/dist/server/pages-page-handler.js +189 -127
- package/dist/server/pages-page-response.d.ts +12 -6
- package/dist/server/pages-page-response.js +42 -35
- package/dist/server/pages-request-pipeline.d.ts +10 -2
- package/dist/server/pages-request-pipeline.js +41 -22
- package/dist/server/pages-request-stage-entry.d.ts +6 -0
- package/dist/server/pages-request-stage-entry.js +75 -16
- package/dist/server/pages-response-stage-entry.js +4 -0
- package/dist/server/pages-revalidate.js +3 -3
- package/dist/server/pages-router-entry.js +5 -4
- package/dist/server/prerender-manifest.d.ts +3 -3
- package/dist/server/prerender-manifest.js +4 -3
- package/dist/server/prerender-work-unit-setup.js +4 -0
- package/dist/server/prod-server.d.ts +12 -0
- package/dist/server/prod-server.js +204 -74
- package/dist/server/proper-error.d.ts +4 -0
- package/dist/server/proper-error.js +31 -0
- package/dist/server/request-pipeline.d.ts +4 -1
- package/dist/server/request-pipeline.js +3 -2
- package/dist/server/revalidation-request.d.ts +1 -0
- package/dist/server/revalidation-request.js +1 -1
- package/dist/server/rsc-stream-hints.d.ts +1 -1
- package/dist/server/rsc-stream-hints.js +52 -5
- package/dist/server/seed-cache.d.ts +1 -0
- package/dist/server/seed-cache.js +5 -4
- package/dist/server/server-reference-loader.d.ts +4 -0
- package/dist/server/server-reference-loader.js +29 -0
- package/dist/server/socket-error-backstop.d.ts +9 -1
- package/dist/server/socket-error-backstop.js +46 -17
- package/dist/server/static-file-signal.d.ts +15 -4
- package/dist/server/static-file-signal.js +46 -12
- package/dist/server/worker-image-optimization.d.ts +34 -0
- package/dist/server/worker-image-optimization.js +99 -0
- package/dist/server/worker-stages.d.ts +1 -1
- package/dist/server/worker-stages.js +2 -2
- package/dist/server/worker-utils.d.ts +8 -3
- package/dist/server/worker-utils.js +12 -7
- package/dist/shims/app-router-scroll.js +4 -1
- package/dist/shims/app-router-tree-context.d.ts +5 -0
- package/dist/shims/app-router-tree-context.js +27 -0
- package/dist/shims/cache-callable-runtime.d.ts +4 -2
- package/dist/shims/cache-callable-runtime.js +21 -12
- package/dist/shims/cache-handler.js +1 -9
- package/dist/shims/cache-runtime.d.ts +6 -1
- package/dist/shims/cache-runtime.js +2 -1
- package/dist/shims/cache.d.ts +2 -2
- package/dist/shims/cache.js +40 -13
- package/dist/shims/cdn-cache.d.ts +8 -0
- package/dist/shims/cdn-cache.js +17 -1
- package/dist/shims/disable-smooth-scroll.d.ts +3 -0
- package/dist/shims/disable-smooth-scroll.js +36 -0
- package/dist/shims/document-placeholders.d.ts +19 -0
- package/dist/shims/document-placeholders.js +45 -0
- package/dist/shims/document.js +21 -5
- package/dist/shims/dynamic-preload-chunks.d.ts +1 -0
- package/dist/shims/dynamic-preload-chunks.js +13 -9
- package/dist/shims/dynamic.d.ts +1 -1
- package/dist/shims/dynamic.js +60 -8
- package/dist/shims/fetch-cache-state.d.ts +66 -0
- package/dist/shims/fetch-cache-state.js +92 -0
- package/dist/shims/fetch-cache.d.ts +3 -67
- package/dist/shims/fetch-cache.js +160 -125
- package/dist/shims/head.d.ts +10 -6
- package/dist/shims/head.js +16 -14
- package/dist/shims/headers.js +2 -2
- package/dist/shims/image.js +2 -1
- package/dist/shims/internal/hybrid-client-route-owner-direct.js +1 -1
- package/dist/shims/internal/hybrid-client-route-owner.js +1 -0
- package/dist/shims/internal/work-store-scope.d.ts +5 -0
- package/dist/shims/internal/work-store-scope.js +24 -0
- package/dist/shims/link-prefetch.js +5 -4
- package/dist/shims/link.js +2 -2
- package/dist/shims/navigation.js +34 -9
- package/dist/shims/request-context.d.ts +2 -0
- package/dist/shims/request-state-types.d.ts +2 -1
- package/dist/shims/router.js +21 -32
- package/dist/shims/server.d.ts +27 -4
- package/dist/shims/server.js +65 -9
- package/dist/shims/unified-request-context.d.ts +1 -1
- package/dist/shims/url-utils.d.ts +9 -0
- package/dist/shims/url-utils.js +15 -4
- package/dist/utils/client-runtime-metadata.js +1 -1
- package/dist/utils/domain-locale.js +1 -1
- package/dist/utils/hash.d.ts +7 -0
- package/dist/utils/hash.js +11 -1
- package/dist/utils/package-name.d.ts +6 -0
- package/dist/utils/package-name.js +12 -1
- package/dist/utils/plugin-rsc-version.d.ts +6 -0
- package/dist/utils/plugin-rsc-version.js +41 -0
- package/dist/utils/prerender-output-paths.js +15 -4
- package/dist/utils/public-file-path.d.ts +10 -2
- package/dist/utils/public-file-path.js +13 -9
- package/dist/utils/public-routes.js +2 -2
- package/dist/utils/react-version.d.ts +10 -0
- package/dist/utils/react-version.js +39 -16
- package/package.json +11 -7
- package/dist/build/nitro-route-rules.d.ts +0 -47
- package/dist/build/nitro-route-rules.js +0 -79
- package/dist/plugins/cache-flight-codec.d.ts +0 -19
- 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 {
|
|
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
|
-
|
|
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(
|
|
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(
|
|
138
|
-
return left ? `${left} = ${
|
|
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(
|
|
154
|
+
const rendered = renderBindingPattern(slice, property, removedNames);
|
|
144
155
|
return rendered ? [rendered] : [];
|
|
145
156
|
}
|
|
146
|
-
const value = renderBindingPattern(
|
|
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 =
|
|
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(
|
|
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
|
|
170
|
+
return slice(pattern.start, pattern.end);
|
|
160
171
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
if (
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
const
|
|
168
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
if (
|
|
173
|
-
if (
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
return
|
|
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
|
|
181
|
-
return
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
237
|
-
const
|
|
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
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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 === "
|
|
306
|
-
|
|
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
|
-
|
|
318
|
-
|
|
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 (
|
|
325
|
-
const
|
|
326
|
-
if (
|
|
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,
|
|
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 (
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
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:
|
|
400
|
-
end:
|
|
401
|
-
replacement:
|
|
550
|
+
start: target.start,
|
|
551
|
+
end: target.end,
|
|
552
|
+
replacement: statement ? topLevel ? "" : ";" : "void 0"
|
|
402
553
|
});
|
|
403
|
-
if (
|
|
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 =
|
|
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 =
|
|
574
|
+
const implementations = removableImplementations(removableBindings, { shared: false });
|
|
423
575
|
for (const name of removableBindings) {
|
|
424
576
|
if (forcedBindings.has(name)) continue;
|
|
425
|
-
|
|
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
|
-
|
|
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
|
|
446
|
-
const
|
|
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:
|
|
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) =>
|
|
506
|
-
let
|
|
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.
|
|
509
|
-
string.overwrite(edit.start, edit.end, edit
|
|
510
|
-
|
|
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 =
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
9
|
-
|
|
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 };
|