@superblocksteam/sdk 2.0.141-next.0 → 2.0.141-next.2
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/.turbo/turbo-build.log +1 -1
- package/dist/cli-replacement/dependency-install-classifier.d.mts +2 -6
- package/dist/cli-replacement/dependency-install-classifier.d.mts.map +1 -1
- package/dist/cli-replacement/dependency-install-classifier.mjs +1 -1
- package/dist/cli-replacement/dependency-install-classifier.mjs.map +1 -1
- package/dist/cli-replacement/dev.d.mts.map +1 -1
- package/dist/cli-replacement/dev.mjs +74 -27
- package/dist/cli-replacement/dev.mjs.map +1 -1
- package/dist/cli-replacement/disk-space.d.mts +7 -19
- package/dist/cli-replacement/disk-space.d.mts.map +1 -1
- package/dist/cli-replacement/disk-space.mjs +2 -2
- package/dist/cli-replacement/disk-space.mjs.map +1 -1
- package/dist/cli-replacement/home-npmrc.d.mts +4 -3
- package/dist/cli-replacement/home-npmrc.d.mts.map +1 -1
- package/dist/cli-replacement/normalize-workspace-protocol.d.ts +1 -1
- package/dist/cli-replacement/normalize-workspace-protocol.d.ts.map +1 -1
- package/dist/cli-replacement/package-json-snapshot.d.mts +0 -1
- package/dist/cli-replacement/package-json-snapshot.d.mts.map +1 -1
- package/dist/cli-replacement/package-json-snapshot.mjs +1 -1
- package/dist/cli-replacement/package-json-snapshot.mjs.map +1 -1
- package/dist/cli-replacement/post-upgrade-lockfile-strip.d.mts +3 -2
- package/dist/cli-replacement/post-upgrade-lockfile-strip.d.mts.map +1 -1
- package/dist/cli-replacement/version-detection.d.ts +2 -1
- package/dist/cli-replacement/version-detection.d.ts.map +1 -1
- package/dist/client.d.ts +6 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/collect-sdk-apis.d.mts +4 -3
- package/dist/collect-sdk-apis.d.mts.map +1 -1
- package/dist/dev-utils/dedupe-async.d.ts +2 -1
- package/dist/dev-utils/dedupe-async.d.ts.map +1 -1
- package/dist/dev-utils/dev-server-metrics.d.mts +4 -3
- package/dist/dev-utils/dev-server-metrics.d.mts.map +1 -1
- package/dist/dev-utils/dev-server-metrics.mjs +3 -2
- package/dist/dev-utils/dev-server-metrics.mjs.map +1 -1
- package/dist/dev-utils/dev-server.d.mts +5 -1
- package/dist/dev-utils/dev-server.d.mts.map +1 -1
- package/dist/dev-utils/dev-server.mjs +12 -18
- package/dist/dev-utils/dev-server.mjs.map +1 -1
- package/dist/dev-utils/dev-server.optimize-deps.test.d.mts +2 -0
- package/dist/dev-utils/dev-server.optimize-deps.test.d.mts.map +1 -0
- package/dist/dev-utils/dev-server.optimize-deps.test.mjs +490 -0
- package/dist/dev-utils/dev-server.optimize-deps.test.mjs.map +1 -0
- package/dist/dev-utils/fatal-exit.d.mts +3 -2
- package/dist/dev-utils/fatal-exit.d.mts.map +1 -1
- package/dist/dev-utils/optimize-deps-config.d.mts +16 -0
- package/dist/dev-utils/optimize-deps-config.d.mts.map +1 -0
- package/dist/dev-utils/optimize-deps-config.mjs +95 -0
- package/dist/dev-utils/optimize-deps-config.mjs.map +1 -0
- package/dist/dev-utils/prepare-in-place-restart.d.mts +4 -3
- package/dist/dev-utils/prepare-in-place-restart.d.mts.map +1 -1
- package/dist/dev-utils/vite-dev-server-diagnostics.d.mts +1 -1
- package/dist/dev-utils/vite-dev-server-diagnostics.d.mts.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/parse-sdk-registry.d.mts +2 -2
- package/dist/parse-sdk-registry.d.mts.map +1 -1
- package/dist/parse-sdk-registry.mjs.map +1 -1
- package/dist/sdk.d.ts +0 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +0 -1
- package/dist/sdk.js.map +1 -1
- package/dist/telemetry/attributes.d.ts +0 -1
- package/dist/telemetry/attributes.d.ts.map +1 -1
- package/dist/telemetry/attributes.js +0 -2
- package/dist/telemetry/attributes.js.map +1 -1
- package/dist/telemetry/local-obs.d.ts +0 -30
- package/dist/telemetry/local-obs.d.ts.map +1 -1
- package/dist/telemetry/local-obs.js +1 -1
- package/dist/telemetry/local-obs.js.map +1 -1
- package/dist/telemetry/logging.d.ts +2 -1
- package/dist/telemetry/logging.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/cli-replacement/dependency-install-classifier.mts +2 -2
- package/src/cli-replacement/dev.mts +118 -34
- package/src/cli-replacement/disk-space.mts +8 -9
- package/src/cli-replacement/home-npmrc.mts +3 -3
- package/src/cli-replacement/normalize-workspace-protocol.ts +1 -1
- package/src/cli-replacement/package-json-snapshot.mts +1 -1
- package/src/cli-replacement/post-upgrade-lockfile-strip.mts +2 -2
- package/src/cli-replacement/version-detection.ts +1 -1
- package/src/client.ts +6 -6
- package/src/collect-sdk-apis.mts +3 -3
- package/src/dev-utils/dedupe-async.ts +1 -1
- package/src/dev-utils/dev-server-metrics.mts +4 -2
- package/src/dev-utils/dev-server.mts +23 -17
- package/src/dev-utils/dev-server.optimize-deps.test.mts +671 -0
- package/src/dev-utils/fatal-exit.mts +2 -2
- package/src/dev-utils/optimize-deps-config.mts +96 -0
- package/src/dev-utils/prepare-in-place-restart.mts +3 -3
- package/src/dev-utils/vite-dev-server-diagnostics.mts +1 -1
- package/src/index.ts +0 -7
- package/src/parse-sdk-registry.mts +1 -2
- package/src/sdk.ts +0 -5
- package/src/telemetry/attributes.ts +0 -2
- package/src/telemetry/local-obs.ts +2 -2
- package/src/telemetry/logging.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { mkdtemp, mkdir, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { optimizeDeps, resolveConfig } from "vite";
|
|
5
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
6
|
+
// Import the *real* dev-server optimizeDeps config (the same constant the
|
|
7
|
+
// pre-warm and activation servers use) so this test reflects production and not
|
|
8
|
+
// a duplicated copy. It lives in its own module so importing it here does not
|
|
9
|
+
// drag in the heavy `dev-server.mjs` graph (vite + express + file-sync), which
|
|
10
|
+
// would make a transitive load failure surface as an opaque import error rather
|
|
11
|
+
// than a meaningful assertion.
|
|
12
|
+
import { OPTIMIZE_DEPS_CONFIG } from "./optimize-deps-config.mjs";
|
|
13
|
+
/**
|
|
14
|
+
* Behavioral regression repro for APPS-4576.
|
|
15
|
+
*
|
|
16
|
+
* Production symptom: on a freshly-provisioned warm-pool dev box, Clark sits on
|
|
17
|
+
* "Thinking..." and the editor canvas shows "reconnecting" mid-generation. The
|
|
18
|
+
* Datadog trail across Connor's repro sessions was always the same sequence:
|
|
19
|
+
* peer connect -> Vite `✨ optimized dependencies changed. reloading` -> the
|
|
20
|
+
* editor websocket closes with code 1001 ("going away" / page navigated away)
|
|
21
|
+
* -> the in-flight prompt is orphaned.
|
|
22
|
+
*
|
|
23
|
+
* Mechanism: Vite's cold-start dependency scan only crawls what is statically
|
|
24
|
+
* reachable from the HTML entry. A generated app reaches its heavy deps
|
|
25
|
+
* (`@radix-ui/*`, `lucide-react/*` icons) only through app component files that
|
|
26
|
+
* the scanner cannot statically follow (router/code-split with non-literal
|
|
27
|
+
* specifiers). Those deps are therefore missed at startup and discovered at
|
|
28
|
+
* runtime, which forces a full-page reload — the reload is what drops the
|
|
29
|
+
* websocket.
|
|
30
|
+
*
|
|
31
|
+
* This test reproduces that mechanism with Vite's real optimizer (the same scan
|
|
32
|
+
* + optimize that `vite optimize` runs) against a tiny fixture app whose only
|
|
33
|
+
* dependency is reachable solely through a component file the scanner cannot
|
|
34
|
+
* follow. It asserts the *behavior we need* — the dep is pre-bundled at startup
|
|
35
|
+
* so no runtime re-optimization (and no reload) ever happens. It is fix-agnostic:
|
|
36
|
+
* any production-config change that makes the cold-start scan reach app source
|
|
37
|
+
* (an `entries` glob, an `include` list, etc.) turns it green.
|
|
38
|
+
*
|
|
39
|
+
* RED until the dev-server `OPTIMIZE_DEPS_CONFIG` is fixed.
|
|
40
|
+
*/
|
|
41
|
+
describe("dev server optimizeDeps cold-start pre-bundling (APPS-4576)", () => {
|
|
42
|
+
let fixtureRoot;
|
|
43
|
+
const LAZY_DEP = "fake-lazy-dep";
|
|
44
|
+
// A second dep reachable only from a pure `.ts` module (no JSX). Guards the
|
|
45
|
+
// entries glob covering `.ts`, not just `.tsx`/`.jsx` (APPS-4576 F-01).
|
|
46
|
+
const LAZY_DEP_TS = "fake-lazy-dep-ts";
|
|
47
|
+
// A dep imported only from a source file planted *inside* node_modules. Guards
|
|
48
|
+
// that the broad source glob never crawls node_modules (the scan stays bounded
|
|
49
|
+
// even though `**/*.{js,ts,jsx,tsx}` would match the planted file by extension).
|
|
50
|
+
const NODE_MODULES_ONLY_DEP = "fake-nm-only-dep";
|
|
51
|
+
beforeAll(async () => {
|
|
52
|
+
fixtureRoot = await mkdtemp(join(tmpdir(), "apps-4576-optimize-deps-"));
|
|
53
|
+
// index.html -> /src/main.tsx is the only statically reachable graph.
|
|
54
|
+
await writeFile(join(fixtureRoot, "package.json"), JSON.stringify({
|
|
55
|
+
name: "apps-4576-fixture",
|
|
56
|
+
private: true,
|
|
57
|
+
version: "0.0.0",
|
|
58
|
+
type: "module",
|
|
59
|
+
}));
|
|
60
|
+
await writeFile(join(fixtureRoot, "index.html"), `<!doctype html><html><head></head><body><div id="root"></div>` +
|
|
61
|
+
`<script type="module" src="/src/main.tsx"></script></body></html>`);
|
|
62
|
+
const srcDir = join(fixtureRoot, "src");
|
|
63
|
+
await mkdir(join(srcDir, "pages"), { recursive: true });
|
|
64
|
+
// main.tsx reaches the page only through a computed (non-literal) dynamic
|
|
65
|
+
// import, so Vite's scanner cannot follow it -- exactly how generated apps
|
|
66
|
+
// code-split their routes. The scanner therefore never sees Heavy.tsx.
|
|
67
|
+
await writeFile(join(srcDir, "main.tsx"), `const lazyPath = "./pages/Heavy.tsx";\n` +
|
|
68
|
+
`const lazyUtilPath = "./lib/heavy-util.ts";\n` +
|
|
69
|
+
`export const load = () => import(/* @vite-ignore */ lazyPath);\n` +
|
|
70
|
+
`export const loadUtil = () => import(/* @vite-ignore */ lazyUtilPath);\n`);
|
|
71
|
+
// Heavy.tsx is the only importer of the heavy dependency (stand-in for
|
|
72
|
+
// @radix-ui/* / lucide-react). Reachable on disk, not via the import graph.
|
|
73
|
+
await writeFile(join(srcDir, "pages", "Heavy.tsx"), `import value from "${LAZY_DEP}";\n` +
|
|
74
|
+
`export default function Heavy() {\n return value;\n}\n`);
|
|
75
|
+
// heavy-util.ts is a pure `.ts` module (no JSX) importing a TS-only heavy
|
|
76
|
+
// dep. It is reached only through main.tsx's non-literal dynamic import, so
|
|
77
|
+
// the scanner cannot follow it from the graph -- it is discoverable solely
|
|
78
|
+
// as a scan *entry*. A `.tsx`/`.jsx`-only entries glob never makes it an
|
|
79
|
+
// entry, so the dep is missed; the widened `.ts` glob (F-01) makes it an
|
|
80
|
+
// entry and pre-bundles the dep. This is the exact case the narrow glob
|
|
81
|
+
// regressed on.
|
|
82
|
+
await mkdir(join(srcDir, "lib"), { recursive: true });
|
|
83
|
+
await writeFile(join(srcDir, "lib", "heavy-util.ts"), `import value from "${LAZY_DEP_TS}";\n` + `export default value;\n`);
|
|
84
|
+
// Minimal installed bare dependency so Vite has something to pre-bundle.
|
|
85
|
+
const depDir = join(fixtureRoot, "node_modules", LAZY_DEP);
|
|
86
|
+
await mkdir(depDir, { recursive: true });
|
|
87
|
+
await writeFile(join(depDir, "package.json"), JSON.stringify({
|
|
88
|
+
name: LAZY_DEP,
|
|
89
|
+
version: "1.0.0",
|
|
90
|
+
type: "module",
|
|
91
|
+
main: "index.js",
|
|
92
|
+
module: "index.js",
|
|
93
|
+
exports: "./index.js",
|
|
94
|
+
}));
|
|
95
|
+
await writeFile(join(depDir, "index.js"), `const value = 42;\nexport default value;\n`);
|
|
96
|
+
// Second installed bare dep, imported only from the pure `.ts` module above.
|
|
97
|
+
const depTsDir = join(fixtureRoot, "node_modules", LAZY_DEP_TS);
|
|
98
|
+
await mkdir(depTsDir, { recursive: true });
|
|
99
|
+
await writeFile(join(depTsDir, "package.json"), JSON.stringify({
|
|
100
|
+
name: LAZY_DEP_TS,
|
|
101
|
+
version: "1.0.0",
|
|
102
|
+
type: "module",
|
|
103
|
+
main: "index.js",
|
|
104
|
+
module: "index.js",
|
|
105
|
+
exports: "./index.js",
|
|
106
|
+
}));
|
|
107
|
+
await writeFile(join(depTsDir, "index.js"), `const value = 7;\nexport default value;\n`);
|
|
108
|
+
// Plant a source file *inside* node_modules whose extension matches the
|
|
109
|
+
// broad entries glob and which imports its own dep. If Vite's scanner ever
|
|
110
|
+
// stopped excluding node_modules, this file would become a scan entry and
|
|
111
|
+
// pull NODE_MODULES_ONLY_DEP into the optimized set -- the regression the
|
|
112
|
+
// node_modules-exclusion guard below catches.
|
|
113
|
+
const plantedDir = join(fixtureRoot, "node_modules", "planted-app-src");
|
|
114
|
+
await mkdir(plantedDir, { recursive: true });
|
|
115
|
+
await writeFile(join(plantedDir, "index.tsx"), `import value from "${NODE_MODULES_ONLY_DEP}";\n` +
|
|
116
|
+
`export default function Planted() {\n return value;\n}\n`);
|
|
117
|
+
const depNmDir = join(fixtureRoot, "node_modules", NODE_MODULES_ONLY_DEP);
|
|
118
|
+
await mkdir(depNmDir, { recursive: true });
|
|
119
|
+
await writeFile(join(depNmDir, "package.json"), JSON.stringify({
|
|
120
|
+
name: NODE_MODULES_ONLY_DEP,
|
|
121
|
+
version: "1.0.0",
|
|
122
|
+
type: "module",
|
|
123
|
+
main: "index.js",
|
|
124
|
+
module: "index.js",
|
|
125
|
+
exports: "./index.js",
|
|
126
|
+
}));
|
|
127
|
+
await writeFile(join(depNmDir, "index.js"), `const value = 99;\nexport default value;\n`);
|
|
128
|
+
});
|
|
129
|
+
afterAll(async () => {
|
|
130
|
+
if (fixtureRoot) {
|
|
131
|
+
await rm(fixtureRoot, { recursive: true, force: true });
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
// Runs Vite's real cold-start dep optimizer against the fixture with the given
|
|
135
|
+
// optimizeDeps config and returns the resulting metadata.
|
|
136
|
+
//
|
|
137
|
+
// optimizeDeps(config, force, asCommand):
|
|
138
|
+
// force=true — ignore any prior cache and run a clean cold-start scan
|
|
139
|
+
// + optimize, mirroring a freshly-provisioned warm-pool box.
|
|
140
|
+
// asCommand=false — not invoked via the `vite optimize` CLI (suppresses the
|
|
141
|
+
// CLI-only logging/exit behavior; we just want the metadata).
|
|
142
|
+
async function optimizeFixture(optimizeDepsConfig) {
|
|
143
|
+
const config = await resolveConfig({
|
|
144
|
+
root: fixtureRoot,
|
|
145
|
+
configFile: false,
|
|
146
|
+
logLevel: "silent",
|
|
147
|
+
optimizeDeps: optimizeDepsConfig,
|
|
148
|
+
}, "serve");
|
|
149
|
+
return optimizeDeps(config, true, false);
|
|
150
|
+
}
|
|
151
|
+
it("pre-bundles deps reachable only through app source so no runtime reload is forced", async () => {
|
|
152
|
+
const metadata = await optimizeFixture(OPTIMIZE_DEPS_CONFIG);
|
|
153
|
+
const optimized = Object.keys(metadata.optimized);
|
|
154
|
+
expect(optimized, `Vite's cold-start scan missed "${LAZY_DEP}" (optimized: ` +
|
|
155
|
+
`[${optimized.join(", ")}]). It is reachable only through app source, ` +
|
|
156
|
+
`so it will be discovered at runtime and force an "optimized dependencies ` +
|
|
157
|
+
`changed. reloading" full-page reload that drops the editor websocket ` +
|
|
158
|
+
`(close 1001) mid Clark generation. The dev-server OPTIMIZE_DEPS_CONFIG ` +
|
|
159
|
+
`must make the cold-start scan reach app source (e.g. optimizeDeps.entries).`).toContain(LAZY_DEP);
|
|
160
|
+
}, 30_000);
|
|
161
|
+
it("pre-bundles deps reachable only through a pure .ts module (entries glob covers .ts)", async () => {
|
|
162
|
+
const metadata = await optimizeFixture(OPTIMIZE_DEPS_CONFIG);
|
|
163
|
+
const optimized = Object.keys(metadata.optimized);
|
|
164
|
+
// Regression guard for APPS-4576 F-01: the entries glob was originally
|
|
165
|
+
// `**/*.{jsx,tsx}`, which never makes a pure `.ts` module a scan entry. Since
|
|
166
|
+
// heavy-util.ts is reachable only via a non-literal dynamic import (the
|
|
167
|
+
// scanner cannot follow it), the narrow glob misses "${LAZY_DEP_TS}" and it
|
|
168
|
+
// is discovered at runtime -- the same reload-then-drop-websocket failure as
|
|
169
|
+
// the `.tsx` case. The widened `**/*.{js,ts,jsx,tsx}` glob makes the `.ts`
|
|
170
|
+
// module an entry and pre-bundles the dep.
|
|
171
|
+
expect(optimized, `Vite's cold-start scan missed the .ts-only dep "${LAZY_DEP_TS}" ` +
|
|
172
|
+
`(optimized: [${optimized.join(", ")}]). The optimizeDeps.entries glob ` +
|
|
173
|
+
`must cover .ts source, not just .tsx/.jsx, or pure .ts modules behind ` +
|
|
174
|
+
`code-splits force a runtime re-optimization reload mid Clark generation.`).toContain(LAZY_DEP_TS);
|
|
175
|
+
}, 30_000);
|
|
176
|
+
it("entries is not part of Vite's dep-cache config hash (pre-warm/activation cannot desync)", async () => {
|
|
177
|
+
// The whole fix relies on pre-warm and activation sharing one dep cache.
|
|
178
|
+
// Vite invalidates that cache when `getConfigHash` changes, so if `entries`
|
|
179
|
+
// ever entered the config hash, the two servers (which scan the same source
|
|
180
|
+
// here but could differ in production) would discard the pre-warmed cache on
|
|
181
|
+
// activation and re-run optimization -- the exact "optimized dependencies
|
|
182
|
+
// changed. reloading" reload this fix removes.
|
|
183
|
+
//
|
|
184
|
+
// This pins that invariant programmatically rather than by source comment:
|
|
185
|
+
// two configs identical except for `entries` must produce the same
|
|
186
|
+
// `configHash`. Verified against Vite 6.4.2, where `getConfigHash` hashes
|
|
187
|
+
// only optimizeDeps.{include,exclude,esbuildOptions}. If a Vite upgrade ever
|
|
188
|
+
// moves `entries` into the hash, this goes RED -- the signal to re-evaluate
|
|
189
|
+
// the pre-warm/activation cache-sharing contract before shipping the bump.
|
|
190
|
+
const wide = await optimizeFixture(OPTIMIZE_DEPS_CONFIG);
|
|
191
|
+
const narrowed = await optimizeFixture({
|
|
192
|
+
...OPTIMIZE_DEPS_CONFIG,
|
|
193
|
+
entries: ["**/*.html", "**/*.{jsx,tsx}"],
|
|
194
|
+
});
|
|
195
|
+
// Sanity check that `entries` actually changed the scan result, so equal
|
|
196
|
+
// config hashes below are meaningful and not an artifact of identical input.
|
|
197
|
+
expect(Object.keys(wide.optimized)).toContain(LAZY_DEP_TS);
|
|
198
|
+
expect(Object.keys(narrowed.optimized)).not.toContain(LAZY_DEP_TS);
|
|
199
|
+
expect(narrowed.configHash, `Vite's optimizeDeps configHash changed when only \`entries\` differed ` +
|
|
200
|
+
`(${narrowed.configHash} vs ${wide.configHash}). \`entries\` has entered ` +
|
|
201
|
+
`the dep-cache config hash, so the pre-warm and activation servers will ` +
|
|
202
|
+
`discard the pre-warmed cache and re-optimize on activation, forcing the ` +
|
|
203
|
+
`reload that drops the editor websocket (APPS-4576). Re-evaluate the ` +
|
|
204
|
+
`cache-sharing contract before upgrading Vite.`).toBe(wide.configHash);
|
|
205
|
+
}, 30_000);
|
|
206
|
+
it("keeps the broad source glob bounded: node_modules is never scanned", async () => {
|
|
207
|
+
// The widened `**/*.{js,ts,jsx,tsx}` glob would match source files anywhere,
|
|
208
|
+
// including under node_modules. Vite's scanner always excludes
|
|
209
|
+
// `**/node_modules/**` (and the build outDir) from glob entries, so the scan
|
|
210
|
+
// stays bounded to app source and cannot blow up cold-start on a huge
|
|
211
|
+
// node_modules tree. Verified against Vite 6.4.2 `globEntries`; this guard
|
|
212
|
+
// goes RED if a future Vite upgrade stops excluding node_modules.
|
|
213
|
+
const metadata = await optimizeFixture(OPTIMIZE_DEPS_CONFIG);
|
|
214
|
+
const optimized = Object.keys(metadata.optimized);
|
|
215
|
+
expect(optimized, `Vite optimized "${NODE_MODULES_ONLY_DEP}", which is imported only from a ` +
|
|
216
|
+
`source file planted inside node_modules (optimized: ` +
|
|
217
|
+
`[${optimized.join(", ")}]). The cold-start scan is crawling node_modules, ` +
|
|
218
|
+
`so the broad entries glob is no longer bounded -- a real app's ` +
|
|
219
|
+
`node_modules could make the scan slow to a crawl or fail. Vite's ` +
|
|
220
|
+
`node_modules exclusion has regressed; pin/patch it before shipping.`).not.toContain(NODE_MODULES_ONLY_DEP);
|
|
221
|
+
}, 30_000);
|
|
222
|
+
});
|
|
223
|
+
/**
|
|
224
|
+
* Regression repro for the APPS-4576 cold-start crash.
|
|
225
|
+
*
|
|
226
|
+
* The widened `entries` glob makes the cold-start dep scan crawl *all* app
|
|
227
|
+
* source, including Node-side files at the app root (`vite.config.ts`,
|
|
228
|
+
* `server/**`). A generated fullstack app's `vite.config.ts` imports
|
|
229
|
+
* `@tailwindcss/vite`, which depends on the native `@tailwindcss/oxide`
|
|
230
|
+
* (`tailwindcss-oxide.<platform>.node`). esbuild's dep optimizer has no loader
|
|
231
|
+
* for `.node`, so bundling that dep fails the whole optimize:
|
|
232
|
+
*
|
|
233
|
+
* Error from vite-plugin-file-sync ... Build failed with 1 error:
|
|
234
|
+
* .../tailwindcss-oxide.linux-x64-gnu.node
|
|
235
|
+
*
|
|
236
|
+
* When optimize fails, Vite never serves and the editor websocket never
|
|
237
|
+
* (re)connects -- the `queue-survives-disconnect` mock e2e saw the socket stay
|
|
238
|
+
* "released" after a dev-server respawn (PR #19858 CI). A native `.node` addon
|
|
239
|
+
* reached during the *browser* dep scan is always build-time-only and never
|
|
240
|
+
* executed in the browser, so the optimizer must tolerate it rather than crash.
|
|
241
|
+
*
|
|
242
|
+
* This fixture is isolated from the suite above: a dep containing a `.node`
|
|
243
|
+
* addon would crash *every* `optimizeFixture` call under the buggy config, so it
|
|
244
|
+
* gets its own fixture root and optimizer rather than polluting the shared one.
|
|
245
|
+
*/
|
|
246
|
+
describe("dev server optimizeDeps tolerates native .node addons (APPS-4576)", () => {
|
|
247
|
+
let fixtureRoot;
|
|
248
|
+
// Stand-in for `@tailwindcss/oxide`: a dep whose entry pulls in a native
|
|
249
|
+
// `.node` binary, reached only from a Node-side config file at the app root.
|
|
250
|
+
const NATIVE_DEP = "fake-native-dep";
|
|
251
|
+
beforeAll(async () => {
|
|
252
|
+
fixtureRoot = await mkdtemp(join(tmpdir(), "apps-4576-native-node-"));
|
|
253
|
+
await writeFile(join(fixtureRoot, "package.json"), JSON.stringify({
|
|
254
|
+
name: "apps-4576-native-fixture",
|
|
255
|
+
private: true,
|
|
256
|
+
version: "0.0.0",
|
|
257
|
+
type: "module",
|
|
258
|
+
}));
|
|
259
|
+
await writeFile(join(fixtureRoot, "index.html"), `<!doctype html><html><head></head><body><div id="root"></div>` +
|
|
260
|
+
`<script type="module" src="/src/main.tsx"></script></body></html>`);
|
|
261
|
+
const srcDir = join(fixtureRoot, "src");
|
|
262
|
+
await mkdir(srcDir, { recursive: true });
|
|
263
|
+
await writeFile(join(srcDir, "main.tsx"), `export const root = "app";\n`);
|
|
264
|
+
// A Node-side config file at the app root (stand-in for `vite.config.ts`)
|
|
265
|
+
// that imports the native-addon dep. The widened entries glob makes the
|
|
266
|
+
// browser dep scan treat this file as an entry and follow the import into
|
|
267
|
+
// the native dep -- exactly the production path through `@tailwindcss/vite`.
|
|
268
|
+
await writeFile(join(fixtureRoot, "build.config.ts"), `import native from "${NATIVE_DEP}";\n` + `export default native;\n`);
|
|
269
|
+
// The native-addon dep: its entry imports a `.node` binary, which esbuild
|
|
270
|
+
// cannot bundle (no `.node` loader) -- the crash this test guards against.
|
|
271
|
+
const depDir = join(fixtureRoot, "node_modules", NATIVE_DEP);
|
|
272
|
+
await mkdir(depDir, { recursive: true });
|
|
273
|
+
await writeFile(join(depDir, "package.json"), JSON.stringify({
|
|
274
|
+
name: NATIVE_DEP,
|
|
275
|
+
version: "1.0.0",
|
|
276
|
+
type: "module",
|
|
277
|
+
main: "index.js",
|
|
278
|
+
module: "index.js",
|
|
279
|
+
exports: "./index.js",
|
|
280
|
+
}));
|
|
281
|
+
await writeFile(join(depDir, "index.js"), `import "./prebuilt.linux-x64-gnu.node";\n` + `export default 1;\n`);
|
|
282
|
+
// Minimal stand-in for the platform-specific native binary.
|
|
283
|
+
await writeFile(join(depDir, "prebuilt.linux-x64-gnu.node"), Buffer.from([0x7f, 0x45, 0x4c, 0x46]));
|
|
284
|
+
});
|
|
285
|
+
afterAll(async () => {
|
|
286
|
+
if (fixtureRoot) {
|
|
287
|
+
await rm(fixtureRoot, { recursive: true, force: true });
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
it("completes cold-start optimize when app source pulls in a native .node addon", async () => {
|
|
291
|
+
const config = await resolveConfig({
|
|
292
|
+
root: fixtureRoot,
|
|
293
|
+
configFile: false,
|
|
294
|
+
logLevel: "silent",
|
|
295
|
+
optimizeDeps: OPTIMIZE_DEPS_CONFIG,
|
|
296
|
+
}, "serve");
|
|
297
|
+
// Under the buggy config this rejects with esbuild "Build failed with 1
|
|
298
|
+
// error: ...node" -- which in production aborts the dev server's vite start
|
|
299
|
+
// so the editor websocket never reconnects (APPS-4576). The optimizer must
|
|
300
|
+
// tolerate the unbundlable native addon and finish the cold-start scan.
|
|
301
|
+
await expect(optimizeDeps(config, true, false)).resolves.toBeDefined();
|
|
302
|
+
}, 30_000);
|
|
303
|
+
});
|
|
304
|
+
/**
|
|
305
|
+
* Regression repro for the APPS-4576 cold-start crash on real tailwind-v4 apps.
|
|
306
|
+
*
|
|
307
|
+
* The widened `entries` glob (`**\/*.{js,ts,jsx,tsx}`) matches Node-side files
|
|
308
|
+
* at the app root -- most importantly `vite.config.ts`, which a generated app
|
|
309
|
+
* uses to load `@tailwindcss/vite`. When `vite.config.ts` is a browser dep-scan
|
|
310
|
+
* entry, Vite treats its bare imports as deps to pre-bundle, so esbuild bundles
|
|
311
|
+
* `@tailwindcss/vite` and follows it into `lightningcss/node/index.js`, whose
|
|
312
|
+
*
|
|
313
|
+
* module.exports = require(`../pkg`);
|
|
314
|
+
*
|
|
315
|
+
* esbuild cannot statically resolve -> "Could not resolve \"../pkg\"" -> the
|
|
316
|
+
* whole cold-start optimize aborts. That is distinct from the native `.node`
|
|
317
|
+
* case above (the `.node: empty` loader does NOT help a bare directory require),
|
|
318
|
+
* and it crashes `preWarmViteCache` on *every* tailwind-v4 app -- verified
|
|
319
|
+
* against the real `packages/demo-apps/shadcn-demo-app` and `app-fullstack`.
|
|
320
|
+
*
|
|
321
|
+
* The config must therefore keep Node-side config files (and the `server/**`
|
|
322
|
+
* tree of fullstack apps) out of the browser dep-scan entries. This fixture
|
|
323
|
+
* reproduces the crash shape with a fake config-only dep that mirrors
|
|
324
|
+
* lightningcss's `require("../pkg")`, and pins that the shipped config no longer
|
|
325
|
+
* scans it -- while a RED control (config-file negations removed) still crashes,
|
|
326
|
+
* so the assertion is meaningful and not an artifact of a resolvable fixture.
|
|
327
|
+
*/
|
|
328
|
+
describe("dev server optimizeDeps keeps Node-side config files out of the browser scan (APPS-4576)", () => {
|
|
329
|
+
let fixtureRoot;
|
|
330
|
+
// Stand-in for `@tailwindcss/vite`/`lightningcss`: a dep reached only from a
|
|
331
|
+
// root `vite.config.ts`, whose entry does an unresolvable `require("../pkg")`.
|
|
332
|
+
const CONFIG_ONLY_DEP = "fake-config-only-dep";
|
|
333
|
+
beforeAll(async () => {
|
|
334
|
+
fixtureRoot = await mkdtemp(join(tmpdir(), "apps-4576-config-scan-"));
|
|
335
|
+
await writeFile(join(fixtureRoot, "package.json"), JSON.stringify({
|
|
336
|
+
name: "apps-4576-config-fixture",
|
|
337
|
+
private: true,
|
|
338
|
+
version: "0.0.0",
|
|
339
|
+
type: "module",
|
|
340
|
+
}));
|
|
341
|
+
await writeFile(join(fixtureRoot, "index.html"), `<!doctype html><html><head></head><body><div id="root"></div>` +
|
|
342
|
+
`<script type="module" src="/src/main.tsx"></script></body></html>`);
|
|
343
|
+
const srcDir = join(fixtureRoot, "src");
|
|
344
|
+
await mkdir(srcDir, { recursive: true });
|
|
345
|
+
await writeFile(join(srcDir, "main.tsx"), `export const root = "app";\n`);
|
|
346
|
+
// Root `vite.config.ts` (Node-side) importing the crash-inducing dep --
|
|
347
|
+
// exactly how a generated app's vite.config.ts pulls in @tailwindcss/vite.
|
|
348
|
+
await writeFile(join(fixtureRoot, "vite.config.ts"), `import cfg from "${CONFIG_ONLY_DEP}";\n` + `export default cfg;\n`);
|
|
349
|
+
// The dep esbuild cannot bundle: its entry requires a bare `../pkg` path
|
|
350
|
+
// that does not exist (mirrors lightningcss/node/index.js). Bundling it
|
|
351
|
+
// fails the whole optimize with "Could not resolve \"../pkg\"".
|
|
352
|
+
const depDir = join(fixtureRoot, "node_modules", CONFIG_ONLY_DEP);
|
|
353
|
+
await mkdir(depDir, { recursive: true });
|
|
354
|
+
await writeFile(join(depDir, "package.json"), JSON.stringify({
|
|
355
|
+
name: CONFIG_ONLY_DEP,
|
|
356
|
+
version: "1.0.0",
|
|
357
|
+
type: "commonjs",
|
|
358
|
+
main: "index.js",
|
|
359
|
+
}));
|
|
360
|
+
await writeFile(join(depDir, "index.js"), `module.exports = require("../pkg");\n`);
|
|
361
|
+
});
|
|
362
|
+
afterAll(async () => {
|
|
363
|
+
if (fixtureRoot) {
|
|
364
|
+
await rm(fixtureRoot, { recursive: true, force: true });
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
async function optimizeWith(optimizeDepsConfig) {
|
|
368
|
+
const config = await resolveConfig({
|
|
369
|
+
root: fixtureRoot,
|
|
370
|
+
configFile: false,
|
|
371
|
+
logLevel: "silent",
|
|
372
|
+
optimizeDeps: optimizeDepsConfig,
|
|
373
|
+
}, "serve");
|
|
374
|
+
return optimizeDeps(config, true, false);
|
|
375
|
+
}
|
|
376
|
+
it("does not crash cold-start optimize when a root config file imports an unbundlable dep", async () => {
|
|
377
|
+
// RED control: the pre-fix glob (no config-file negations) treats
|
|
378
|
+
// vite.config.ts as a scan entry, follows its import into the unresolvable
|
|
379
|
+
// dep, and aborts -- the exact production crash. If this ever stops
|
|
380
|
+
// rejecting, the fixture no longer reproduces the bug and the GREEN
|
|
381
|
+
// assertion below would be meaningless.
|
|
382
|
+
await expect(optimizeWith({
|
|
383
|
+
...OPTIMIZE_DEPS_CONFIG,
|
|
384
|
+
entries: [
|
|
385
|
+
"**/*.html",
|
|
386
|
+
"**/*.{js,ts,jsx,tsx}",
|
|
387
|
+
"!custom/**",
|
|
388
|
+
"!.superblocks/**",
|
|
389
|
+
],
|
|
390
|
+
})).rejects.toThrow();
|
|
391
|
+
// GREEN: the shipped config excludes Node-side config files from the scan,
|
|
392
|
+
// so vite.config.ts is never an entry, the crash-inducing import is never
|
|
393
|
+
// followed, and cold-start optimize completes.
|
|
394
|
+
await expect(optimizeWith(OPTIMIZE_DEPS_CONFIG)).resolves.toBeDefined();
|
|
395
|
+
}, 30_000);
|
|
396
|
+
});
|
|
397
|
+
/**
|
|
398
|
+
* Regression repro for the APPS-4576 residual reloads found on an EE warm-pool
|
|
399
|
+
* box: even with the widened `entries` scan, a freshly-generated app still
|
|
400
|
+
* reloaded once for `@superblocksteam/library/jsx-dev-runtime` (first render)
|
|
401
|
+
* and once for `@superblocksteam/sdk-api` (after generated code imported it).
|
|
402
|
+
* Neither is reachable by the source scan:
|
|
403
|
+
*
|
|
404
|
+
* - The scan's esbuild uses the default (react) JSX runtime, so it emits
|
|
405
|
+
* `react/jsx-runtime` and never `@superblocksteam/library/jsx-dev-runtime`,
|
|
406
|
+
* even though every generated app sets that `jsxImportSource`. `include`
|
|
407
|
+
* force-bundles it.
|
|
408
|
+
* - `@superblocksteam/sdk-api` is a virtual module served by a plugin, not a
|
|
409
|
+
* real package; it can't be pre-bundled, so it must be `exclude`d or the
|
|
410
|
+
* optimizer re-optimizes (and reloads) when it first appears at runtime.
|
|
411
|
+
*
|
|
412
|
+
* This pins both: the shipped config force-includes the JSX runtime even when
|
|
413
|
+
* no source imports it, and keeps sdk-api out of the optimized set even when a
|
|
414
|
+
* source file DOES import it.
|
|
415
|
+
*/
|
|
416
|
+
describe("dev server optimizeDeps includes the JSX runtime and excludes the virtual sdk-api (APPS-4576)", () => {
|
|
417
|
+
let fixtureRoot;
|
|
418
|
+
const JSX_RUNTIME = "@superblocksteam/library/jsx-dev-runtime";
|
|
419
|
+
const SDK_API = "@superblocksteam/sdk-api";
|
|
420
|
+
beforeAll(async () => {
|
|
421
|
+
fixtureRoot = await mkdtemp(join(tmpdir(), "apps-4576-include-exclude-"));
|
|
422
|
+
await writeFile(join(fixtureRoot, "package.json"), JSON.stringify({
|
|
423
|
+
name: "apps-4576-inc-exc-fixture",
|
|
424
|
+
private: true,
|
|
425
|
+
version: "0.0.0",
|
|
426
|
+
type: "module",
|
|
427
|
+
}));
|
|
428
|
+
await writeFile(join(fixtureRoot, "index.html"), `<!doctype html><html><head></head><body><div id="root"></div>` +
|
|
429
|
+
`<script type="module" src="/src/main.tsx"></script></body></html>`);
|
|
430
|
+
const srcDir = join(fixtureRoot, "src");
|
|
431
|
+
await mkdir(srcDir, { recursive: true });
|
|
432
|
+
// main.tsx imports sdk-api (so the scan DOES discover it) but never imports
|
|
433
|
+
// the JSX runtime (so only `include` can pull that in).
|
|
434
|
+
await writeFile(join(srcDir, "main.tsx"), `import { thing } from "${SDK_API}";\nexport const root = thing;\n`);
|
|
435
|
+
// `@superblocksteam/library` with a `./jsx-dev-runtime` subpath export, so
|
|
436
|
+
// `include: ["@superblocksteam/library/jsx-dev-runtime"]` resolves like the
|
|
437
|
+
// real package (which exposes the JSX runtime via that subpath).
|
|
438
|
+
const libDir = join(fixtureRoot, "node_modules", "@superblocksteam", "library");
|
|
439
|
+
await mkdir(libDir, { recursive: true });
|
|
440
|
+
await writeFile(join(libDir, "package.json"), JSON.stringify({
|
|
441
|
+
name: "@superblocksteam/library",
|
|
442
|
+
version: "1.0.0",
|
|
443
|
+
type: "module",
|
|
444
|
+
exports: {
|
|
445
|
+
".": "./index.js",
|
|
446
|
+
"./jsx-dev-runtime": "./jsx-dev-runtime.js",
|
|
447
|
+
},
|
|
448
|
+
}));
|
|
449
|
+
await writeFile(join(libDir, "index.js"), `export default 1;\n`);
|
|
450
|
+
await writeFile(join(libDir, "jsx-dev-runtime.js"), `export const jsxDEV = () => null;\nexport const Fragment = "fragment";\n`);
|
|
451
|
+
// Real `@superblocksteam/sdk-api` package so main.tsx's import resolves at
|
|
452
|
+
// scan time — the exclude is what must keep it out of the optimized set.
|
|
453
|
+
const sdkApiDir = join(fixtureRoot, "node_modules", "@superblocksteam", "sdk-api");
|
|
454
|
+
await mkdir(sdkApiDir, { recursive: true });
|
|
455
|
+
await writeFile(join(sdkApiDir, "package.json"), JSON.stringify({
|
|
456
|
+
name: SDK_API,
|
|
457
|
+
version: "1.0.0",
|
|
458
|
+
type: "module",
|
|
459
|
+
main: "index.js",
|
|
460
|
+
module: "index.js",
|
|
461
|
+
exports: "./index.js",
|
|
462
|
+
}));
|
|
463
|
+
await writeFile(join(sdkApiDir, "index.js"), `export const thing = 2;\nexport default 2;\n`);
|
|
464
|
+
});
|
|
465
|
+
afterAll(async () => {
|
|
466
|
+
if (fixtureRoot) {
|
|
467
|
+
await rm(fixtureRoot, { recursive: true, force: true });
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
it("force-includes the JSX runtime and excludes the virtual sdk-api module", async () => {
|
|
471
|
+
const config = await resolveConfig({
|
|
472
|
+
root: fixtureRoot,
|
|
473
|
+
configFile: false,
|
|
474
|
+
logLevel: "silent",
|
|
475
|
+
optimizeDeps: OPTIMIZE_DEPS_CONFIG,
|
|
476
|
+
}, "serve");
|
|
477
|
+
const metadata = await optimizeDeps(config, true, false);
|
|
478
|
+
const optimized = Object.keys(metadata.optimized);
|
|
479
|
+
// include: pre-bundled even though nothing in source imports it.
|
|
480
|
+
expect(optimized, `"${JSX_RUNTIME}" must be force-included so a generated app does not ` +
|
|
481
|
+
`reload on first render to optimize the JSX runtime (optimized: ` +
|
|
482
|
+
`[${optimized.join(", ")}]).`).toContain(JSX_RUNTIME);
|
|
483
|
+
// exclude: kept out even though main.tsx imports it, so its first runtime
|
|
484
|
+
// appearance never triggers a re-optimize/reload.
|
|
485
|
+
expect(optimized, `"${SDK_API}" is a virtual plugin-served module and must be excluded from ` +
|
|
486
|
+
`optimization; optimizing it forces a runtime reload (optimized: ` +
|
|
487
|
+
`[${optimized.join(", ")}]).`).not.toContain(SDK_API);
|
|
488
|
+
}, 30_000);
|
|
489
|
+
});
|
|
490
|
+
//# sourceMappingURL=dev-server.optimize-deps.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-server.optimize-deps.test.mjs","sourceRoot":"","sources":["../../src/dev-utils/dev-server.optimize-deps.test.mts"],"names":[],"mappings":"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"}
|
|
@@ -49,10 +49,10 @@
|
|
|
49
49
|
* value. They cannot import this module,
|
|
50
50
|
* so they repeat the same string.
|
|
51
51
|
*/
|
|
52
|
-
|
|
52
|
+
type FatalExitHandler = "uncaughtException" | "unhandledRejection" | "containerExit";
|
|
53
53
|
/** Fixed token so a log-based metric or a log search can pick out these lines. */
|
|
54
54
|
export declare const FATAL_EXIT_EVENT = "dev_server_fatal_exit";
|
|
55
|
-
|
|
55
|
+
interface FatalExitFields {
|
|
56
56
|
/** Where the fatal exit came from. */
|
|
57
57
|
handler: FatalExitHandler;
|
|
58
58
|
/**
|
|
@@ -85,4 +85,5 @@ export declare function parseIsWarm(value: string | undefined): boolean;
|
|
|
85
85
|
*/
|
|
86
86
|
export declare function buildFatalExitLog(fields: FatalExitFields): string;
|
|
87
87
|
export declare function isRecoverableShutdownError(reason: unknown): boolean;
|
|
88
|
+
export {};
|
|
88
89
|
//# sourceMappingURL=fatal-exit.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fatal-exit.d.mts","sourceRoot":"","sources":["../../src/dev-utils/fatal-exit.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH;;;;;;;;;;;;GAYG;AACH,
|
|
1
|
+
{"version":3,"file":"fatal-exit.d.mts","sourceRoot":"","sources":["../../src/dev-utils/fatal-exit.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH;;;;;;;;;;;;GAYG;AACH,KAAK,gBAAgB,GACjB,mBAAmB,GACnB,oBAAoB,GACpB,eAAe,CAAC;AAEpB,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAExD,UAAU,eAAe;IACvB,sCAAsC;IACtC,OAAO,EAAE,gBAAgB,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gFAAgF;IAChF,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAU9D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CASjE;AA0CD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CASnE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { UserConfig } from "vite";
|
|
2
|
+
/**
|
|
3
|
+
* Shared `optimizeDeps` config for both the pre-warm and activation Vite
|
|
4
|
+
* servers (see `dev-server.mts`).
|
|
5
|
+
*
|
|
6
|
+
* Vite includes the stringified `optimizeDeps` config in its dep cache hash, so
|
|
7
|
+
* both servers must use identical config or activation will discard the
|
|
8
|
+
* pre-warmed cache and re-run full dependency optimization.
|
|
9
|
+
*
|
|
10
|
+
* Lives in its own module (rather than inline in `dev-server.mts`) so the
|
|
11
|
+
* dep-pre-bundling contract can be asserted in tests without importing the
|
|
12
|
+
* entire dev-server module graph (vite + express + file-sync + telemetry).
|
|
13
|
+
* See `dev-server.optimize-deps.test.mts`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const OPTIMIZE_DEPS_CONFIG: UserConfig["optimizeDeps"];
|
|
16
|
+
//# sourceMappingURL=optimize-deps-config.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize-deps-config.d.mts","sourceRoot":"","sources":["../../src/dev-utils/optimize-deps-config.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEvC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAAU,CAAC,cAAc,CAgF3D,CAAC"}
|