@somewhere-tech/cli 0.28.5 → 0.29.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 +58 -13
- package/dist/commands/deploy.js +33 -8
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.js +298 -43
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/env.js +1 -1
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/project.js +2 -1
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/promote.js +11 -12
- package/dist/commands/promote.js.map +1 -1
- package/dist/commands/rollback.js +1 -1
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/status.js +2 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/lib/envfile-write.js +1 -1
- package/dist/lib/envfile-write.js.map +1 -1
- package/dist/lib/output.js +2 -2
- package/dist/lib/output.js.map +1 -1
- package/dist/local/compiler-core.js +24 -0
- package/dist/local/compiler-core.js.map +1 -0
- package/dist/local/compiler.js +444 -0
- package/dist/local/compiler.js.map +1 -0
- package/dist/local/dev-server.js +487 -0
- package/dist/local/dev-server.js.map +1 -0
- package/dist/local/loader.js +70 -9
- package/dist/local/loader.js.map +1 -1
- package/dist/local/loopback.js +54 -0
- package/dist/local/loopback.js.map +1 -0
- package/dist/local/runtime.js +1 -1
- package/dist/local/runtime.js.map +1 -1
- package/dist/local/server.js +12 -22
- package/dist/local/server.js.map +1 -1
- package/node_modules/esbuild-wasm/LICENSE.md +21 -0
- package/node_modules/esbuild-wasm/README.md +3 -0
- package/node_modules/esbuild-wasm/bin/esbuild +91 -0
- package/node_modules/esbuild-wasm/esbuild.wasm +0 -0
- package/node_modules/esbuild-wasm/esm/browser.d.ts +705 -0
- package/node_modules/esbuild-wasm/esm/browser.js +2393 -0
- package/node_modules/esbuild-wasm/esm/browser.min.js +20 -0
- package/node_modules/esbuild-wasm/lib/browser.d.ts +705 -0
- package/node_modules/esbuild-wasm/lib/browser.js +2438 -0
- package/node_modules/esbuild-wasm/lib/browser.min.js +22 -0
- package/node_modules/esbuild-wasm/lib/main.d.ts +705 -0
- package/node_modules/esbuild-wasm/lib/main.js +2051 -0
- package/node_modules/esbuild-wasm/package.json +19 -0
- package/node_modules/esbuild-wasm/wasm_exec.js +561 -0
- package/node_modules/esbuild-wasm/wasm_exec_node.js +39 -0
- package/npm-shrinkwrap.json +17 -2
- package/package.json +7 -5
- package/runtime/VENDOR.json +7 -0
- package/runtime/compiler/VENDOR.json +27 -0
- package/runtime/compiler/compile-core.cjs +1775 -0
- package/runtime/compiler/graph-contract.cjs +124 -0
- package/runtime/compiler/typed-functions.cjs +545 -0
- package/runtime/platform-context.mjs +5422 -1802
- package/runtime/sw-init.mjs +51 -5
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The platform's compiler, running on your machine.
|
|
3
|
+
*
|
|
4
|
+
* `somewhere dev` does not build your app with a second toolchain that
|
|
5
|
+
* resembles the platform's. It runs the SAME compiler the compile container
|
|
6
|
+
* runs on deploy — `runtime/compiler/compile-core.cjs`, vendored verbatim out
|
|
7
|
+
* of the monorepo with a drift guard (scripts/extract-runtime.mjs,
|
|
8
|
+
* test/compiler-vendor.test.mjs) — so what renders on localhost is the deploy
|
|
9
|
+
* artifact, not an approximation of it. The parity fixture
|
|
10
|
+
* (test/compiler-parity.test.mjs) asserts that byte for byte.
|
|
11
|
+
*
|
|
12
|
+
* The compiler is host-parameterized: everything that differs between the
|
|
13
|
+
* container and this machine goes in one `host` object. Concretely, three
|
|
14
|
+
* things differ.
|
|
15
|
+
*
|
|
16
|
+
* esbuild. The container runs native esbuild; the CLI runs esbuild-wasm at
|
|
17
|
+
* the SAME pinned version. Not a preference — the published CLI's
|
|
18
|
+
* supply-chain rule is that every production dependency sits inside the
|
|
19
|
+
* signed artifact, and native esbuild ships 24 optional platform packages of
|
|
20
|
+
* which only the build machine's own can ever be installed. esbuild-wasm is
|
|
21
|
+
* one platform-independent package. Same version in, same bytes out; the
|
|
22
|
+
* parity fixture proves it every run.
|
|
23
|
+
*
|
|
24
|
+
* Where the app's dependencies come from. The container has a baked
|
|
25
|
+
* node_modules; you have YOUR node_modules, which is better — it is the
|
|
26
|
+
* exact tree you installed. When it is absent or does not satisfy a pin, the
|
|
27
|
+
* CLI resolves the way the container does, into a cache under
|
|
28
|
+
* ~/.somewhere/dev-deps, silently. See resolveAppDependencies below.
|
|
29
|
+
*
|
|
30
|
+
* Where the BUILD toolchain comes from. Never your project. The compiler
|
|
31
|
+
* treats typescript / postcss / autoprefixer / tailwind as its own
|
|
32
|
+
* machinery, not your app's (it deliberately refuses to install them from
|
|
33
|
+
* your package.json), so the CLI runs the container's EXACT pins from
|
|
34
|
+
* runtime/compiler/VENDOR.json into ~/.somewhere/dev-toolchain. Borrowing
|
|
35
|
+
* your tailwind 3.3 or typescript 5.2 would compile different CSS and
|
|
36
|
+
* resolve aliases differently — the precise local-vs-deploy divergence this
|
|
37
|
+
* whole loop exists to remove.
|
|
38
|
+
*/
|
|
39
|
+
import { execFile } from 'node:child_process';
|
|
40
|
+
import { createHash } from 'node:crypto';
|
|
41
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
42
|
+
import { createRequire } from 'node:module';
|
|
43
|
+
import { homedir } from 'node:os';
|
|
44
|
+
import { dirname, join, resolve } from 'node:path';
|
|
45
|
+
import { fileURLToPath } from 'node:url';
|
|
46
|
+
import { promisify } from 'node:util';
|
|
47
|
+
const execFileAsync = promisify(execFile);
|
|
48
|
+
/** A compile that failed, located in the developer's own source. */
|
|
49
|
+
export class CompileFailure extends Error {
|
|
50
|
+
locations;
|
|
51
|
+
constructor(message, locations) {
|
|
52
|
+
super(message);
|
|
53
|
+
this.locations = locations;
|
|
54
|
+
this.name = 'CompileFailure';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function packageRoot() {
|
|
58
|
+
// dist/local/compiler.js → package root is two levels up.
|
|
59
|
+
return join(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
60
|
+
}
|
|
61
|
+
export function readVendorManifest(root = packageRoot()) {
|
|
62
|
+
return JSON.parse(readFileSync(join(root, 'runtime', 'compiler', 'VENDOR.json'), 'utf8'));
|
|
63
|
+
}
|
|
64
|
+
// ─── Dependency resolution, with zero steps for the developer ───────────────
|
|
65
|
+
function cacheHome() {
|
|
66
|
+
return join(process.env.SOMEWHERE_DEV_CACHE ?? join(homedir(), '.somewhere'), '');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Install `specs` into `dir` as a bare node_modules tree.
|
|
70
|
+
*
|
|
71
|
+
* `--ignore-scripts` is the same supply-chain guard the container uses, and it
|
|
72
|
+
* matters MORE here: this runs on your machine, not in a throwaway container.
|
|
73
|
+
* A dependency's postinstall never executes. esbuild bundles a package's files
|
|
74
|
+
* without running them, so frontend dependencies do not need install scripts.
|
|
75
|
+
*/
|
|
76
|
+
async function installInto(dir, specs) {
|
|
77
|
+
mkdirSync(dir, { recursive: true });
|
|
78
|
+
const manifest = join(dir, 'package.json');
|
|
79
|
+
if (!existsSync(manifest)) {
|
|
80
|
+
writeFileSync(manifest, JSON.stringify({ name: 'somewhere-dev-cache', private: true }, null, 2));
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
await execFileAsync('npm', ['install', '--ignore-scripts', '--no-bin-links', '--no-audit', '--no-fund',
|
|
84
|
+
'--no-package-lock', '--prefix', dir, ...specs], { cwd: dir, maxBuffer: 32 * 1024 * 1024, env: { ...process.env, npm_config_ignore_scripts: 'true' } });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const detail = err instanceof Error
|
|
88
|
+
? (err.stderr ?? err.message).toString().slice(-600)
|
|
89
|
+
: String(err);
|
|
90
|
+
throw new Error(`Could not resolve ${specs.join(', ')}: ${detail}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** True when `dir/node_modules/<name>` is a package esbuild would resolve. */
|
|
94
|
+
function installed(dir, name) {
|
|
95
|
+
return existsSync(join(dir, 'node_modules', name, 'package.json'));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The build toolchain, at the container's exact pins, in the CLI's cache.
|
|
99
|
+
*
|
|
100
|
+
* One directory per group because tailwind v3 and v4 are the same package NAME
|
|
101
|
+
* at incompatible majors — the container isolates them for that reason and so
|
|
102
|
+
* does this. Groups are prepared only when the project needs them: a project
|
|
103
|
+
* with no Tailwind never installs a Tailwind engine.
|
|
104
|
+
*
|
|
105
|
+
* Returns the group directories, already populated.
|
|
106
|
+
*/
|
|
107
|
+
async function prepareToolchain(manifest, groups, onFirstInstall) {
|
|
108
|
+
const dirs = {};
|
|
109
|
+
for (const group of groups) {
|
|
110
|
+
const pins = manifest.toolchain[group];
|
|
111
|
+
if (!pins)
|
|
112
|
+
throw new Error(`the vendored compiler declares no "${group}" toolchain group`);
|
|
113
|
+
const dir = join(cacheHome(), 'dev-toolchain', `${group}-${digestOf(pins)}`);
|
|
114
|
+
dirs[group] = dir;
|
|
115
|
+
const missing = Object.entries(pins)
|
|
116
|
+
.filter(([name]) => !installed(dir, name))
|
|
117
|
+
.map(([name, range]) => `${name}@${range}`);
|
|
118
|
+
if (!missing.length)
|
|
119
|
+
continue;
|
|
120
|
+
onFirstInstall?.(`build toolchain (${missing.map((s) => s.split('@')[0] || s).join(', ')})`);
|
|
121
|
+
await installInto(dir, missing);
|
|
122
|
+
}
|
|
123
|
+
return dirs;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Install React at the version the compile image bakes, not the floor of the
|
|
127
|
+
* declared range (tsk_0312cf17).
|
|
128
|
+
*
|
|
129
|
+
* The image keeps React 19 in a tree of its own and prefers it over installing
|
|
130
|
+
* the app's range; locally that set does not exist, so the compiler took its
|
|
131
|
+
* other branch and floor-pinned instead — `react: ^19.2.0` became exactly
|
|
132
|
+
* 19.2.0 while the image served 19.2.7. The same tree, compiled by the same
|
|
133
|
+
* compiler, against two different Reacts.
|
|
134
|
+
*
|
|
135
|
+
* The fix is to rewrite the spec, NOT to add a second node_modules tree. That
|
|
136
|
+
* was tried and is actively worse: a package that physically lives inside the
|
|
137
|
+
* dependency cache resolves `react` to its own sibling before any search path
|
|
138
|
+
* is consulted, so a separate pinned tree gets bundled ALONGSIDE the cache's
|
|
139
|
+
* copy — two Reacts in one bundle, which renders a blank page. The image has no
|
|
140
|
+
* such problem because it ends up with one flat tree, and this keeps one too.
|
|
141
|
+
*
|
|
142
|
+
* Pinning the spec also stops npm resolving React on its own as a peer of
|
|
143
|
+
* something else (react-router-dom pulls one in), which is how a warm cache
|
|
144
|
+
* ended up serving a third version again.
|
|
145
|
+
*/
|
|
146
|
+
export function applyImagePins(specs, pins) {
|
|
147
|
+
if (!Object.keys(pins).length)
|
|
148
|
+
return specs;
|
|
149
|
+
return specs.map((spec) => {
|
|
150
|
+
const at = spec.lastIndexOf('@');
|
|
151
|
+
const name = at > 0 ? spec.slice(0, at) : spec;
|
|
152
|
+
return pins[name] ? `${name}@${pins[name]}` : spec;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
function digestOf(value) {
|
|
156
|
+
return createHash('sha256').update(JSON.stringify(value)).digest('hex').slice(0, 12);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Where the APP's own dependencies come from, in resolution order.
|
|
160
|
+
*
|
|
161
|
+
* 1. The project's own node_modules, when it exists. This is the whole reason
|
|
162
|
+
* a local loop can beat a cloud one: the tree is already on disk and it is
|
|
163
|
+
* the exact tree the developer installed.
|
|
164
|
+
* 2. A CLI-managed cache keyed by the project's dependency map, for the case
|
|
165
|
+
* where node_modules is absent (a fresh `somewhere init`, a clone with no
|
|
166
|
+
* install) or a declared pin is not satisfied by what is installed.
|
|
167
|
+
*
|
|
168
|
+
* Keying the cache on the dependency map rather than sharing one flat tree
|
|
169
|
+
* means two projects on incompatible majors of the same package never
|
|
170
|
+
* overwrite each other, and two projects with identical dependencies share the
|
|
171
|
+
* install for free.
|
|
172
|
+
*/
|
|
173
|
+
function resolveAppDependencies(cwd, pkg, pins) {
|
|
174
|
+
const search = [];
|
|
175
|
+
const projectModules = join(cwd, 'node_modules');
|
|
176
|
+
if (existsSync(projectModules))
|
|
177
|
+
search.push(projectModules);
|
|
178
|
+
const deps = pkg.dependencies ?? {};
|
|
179
|
+
// The pins are part of the cache identity (tsk_0312cf17): when the image
|
|
180
|
+
// bumps its React and the CLI re-vendors, the old cache is simply not reused,
|
|
181
|
+
// so a warm cache can never keep serving the version we just moved off.
|
|
182
|
+
const cacheDir = join(cacheHome(), 'dev-deps', digestOf([Object.entries(deps).sort(), pins]));
|
|
183
|
+
// The core decides what is actually missing (its baked-satisfies rules run
|
|
184
|
+
// against this exact search path) and calls host.installPackages for the
|
|
185
|
+
// rest. All we do here is make the cache dir part of the search path.
|
|
186
|
+
search.push(join(cacheDir, 'node_modules'));
|
|
187
|
+
return search;
|
|
188
|
+
}
|
|
189
|
+
// ─── Entry detection — the same rule the deploy pipeline uses ───────────────
|
|
190
|
+
//
|
|
191
|
+
// The HTML's `<script type="module" src>` tags are the single source of truth
|
|
192
|
+
// for what the compiler is allowed to touch. Mirrors
|
|
193
|
+
// worker/src/utils/module-entry.ts; a divergence here would compile a
|
|
194
|
+
// different entry locally than on deploy, which is the one thing this loop
|
|
195
|
+
// must never do.
|
|
196
|
+
export function isCompilableEntry(path) {
|
|
197
|
+
return /\.(?:tsx?|jsx|mts|cts)$/i.test(path);
|
|
198
|
+
}
|
|
199
|
+
export function collectModuleEntryScripts(files) {
|
|
200
|
+
const entries = new Set();
|
|
201
|
+
for (const [path, content] of Object.entries(files)) {
|
|
202
|
+
if (typeof content !== 'string')
|
|
203
|
+
continue;
|
|
204
|
+
if (!path.toLowerCase().endsWith('.html'))
|
|
205
|
+
continue;
|
|
206
|
+
const tagRe = /<script\b[^>]*>/gi;
|
|
207
|
+
let m;
|
|
208
|
+
while ((m = tagRe.exec(content)) !== null) {
|
|
209
|
+
const tag = m[0];
|
|
210
|
+
if (!/\btype\s*=\s*["']module["']/i.test(tag))
|
|
211
|
+
continue;
|
|
212
|
+
const srcMatch = /\bsrc\s*=\s*["']([^"']+)["']/i.exec(tag);
|
|
213
|
+
if (!srcMatch)
|
|
214
|
+
continue;
|
|
215
|
+
let src = srcMatch[1];
|
|
216
|
+
if (src.startsWith('/'))
|
|
217
|
+
src = src.slice(1);
|
|
218
|
+
if (isCompilableEntry(src) && files[src] !== undefined)
|
|
219
|
+
entries.add(src);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return entries;
|
|
223
|
+
}
|
|
224
|
+
export function detectBundleEntry(files) {
|
|
225
|
+
const entries = collectModuleEntryScripts(files);
|
|
226
|
+
const indexHtml = files['index.html'];
|
|
227
|
+
if (typeof indexHtml === 'string') {
|
|
228
|
+
const tagRe = /<script\b[^>]*>/gi;
|
|
229
|
+
let m;
|
|
230
|
+
while ((m = tagRe.exec(indexHtml)) !== null) {
|
|
231
|
+
const tag = m[0];
|
|
232
|
+
if (!/\btype\s*=\s*["']module["']/i.test(tag))
|
|
233
|
+
continue;
|
|
234
|
+
const srcMatch = /\bsrc\s*=\s*["']([^"']+)["']/i.exec(tag);
|
|
235
|
+
if (!srcMatch)
|
|
236
|
+
continue;
|
|
237
|
+
let src = srcMatch[1];
|
|
238
|
+
if (src.startsWith('/'))
|
|
239
|
+
src = src.slice(1);
|
|
240
|
+
if (entries.has(src))
|
|
241
|
+
return src;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
for (const e of entries)
|
|
245
|
+
return e;
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Point index.html at the compiled bundle instead of the raw entry, and add a
|
|
250
|
+
* <link> for each CSS chunk esbuild split out. The deploy pipeline does exactly
|
|
251
|
+
* this rewrite before serving (jsx-compile.ts) — the browser must receive the
|
|
252
|
+
* same HTML locally or the page it renders is not the page deploy renders.
|
|
253
|
+
*/
|
|
254
|
+
export function rewriteIndexHtml(html, entry, entryChunk, chunkNames) {
|
|
255
|
+
const escaped = entry.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
256
|
+
const reSourceEntry = new RegExp(`(<script\\b[^>]*\\bsrc\\s*=\\s*)(["'])/?${escaped}\\2`, 'i');
|
|
257
|
+
const reCompiledEntry = /(<script\b[^>]*\bsrc\s*=\s*)(["'])\/_compiled\/[^"']+\.js\2/i;
|
|
258
|
+
const newUrl = `/_compiled/${entryChunk}`;
|
|
259
|
+
let next = html.replace(reSourceEntry, `$1$2${newUrl}$2`);
|
|
260
|
+
if (next === html)
|
|
261
|
+
next = html.replace(reCompiledEntry, `$1$2${newUrl}$2`);
|
|
262
|
+
const cssChunks = chunkNames.filter((name) => name.endsWith('.css'));
|
|
263
|
+
const reCompiledCssLink = /<link\b[^>]*\brel\s*=\s*(["'])stylesheet\1[^>]*\bhref\s*=\s*(["'])\/_compiled\/[^"']+\.css\2[^>]*>/gi;
|
|
264
|
+
next = next.replace(reCompiledCssLink, '');
|
|
265
|
+
if (cssChunks.length) {
|
|
266
|
+
const linkTags = cssChunks.map((name) => `<link rel="stylesheet" href="/_compiled/${name}">`).join('\n');
|
|
267
|
+
const headClose = /<\/head\s*>/i;
|
|
268
|
+
const bodyOpen = /<body\b/i;
|
|
269
|
+
if (headClose.test(next))
|
|
270
|
+
next = next.replace(headClose, `${linkTags}\n</head>`);
|
|
271
|
+
else if (bodyOpen.test(next))
|
|
272
|
+
next = next.replace(bodyOpen, `${linkTags}\n<body`);
|
|
273
|
+
else
|
|
274
|
+
next = `${linkTags}\n${next}`;
|
|
275
|
+
}
|
|
276
|
+
return next;
|
|
277
|
+
}
|
|
278
|
+
export class LocalCompiler {
|
|
279
|
+
opts;
|
|
280
|
+
core = null;
|
|
281
|
+
searchPath = [];
|
|
282
|
+
depCacheDir = '';
|
|
283
|
+
constructor(opts) {
|
|
284
|
+
this.opts = opts;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Resolve everything the compiler needs before the first build, so every
|
|
288
|
+
* rebuild afterwards is pure compile time. Idempotent.
|
|
289
|
+
*/
|
|
290
|
+
/**
|
|
291
|
+
* The node_modules dirs the compiler resolves the app's dependencies from,
|
|
292
|
+
* in order. The local FUNCTION runtime resolves against the same list, so a
|
|
293
|
+
* function and a component import the same copy of a package (tsk_3269026d).
|
|
294
|
+
* Empty until prepare() has run.
|
|
295
|
+
*/
|
|
296
|
+
get moduleSearchPath() {
|
|
297
|
+
return this.searchPath;
|
|
298
|
+
}
|
|
299
|
+
async prepare(pkg, tailwindVersion) {
|
|
300
|
+
if (this.core)
|
|
301
|
+
return;
|
|
302
|
+
const root = packageRoot();
|
|
303
|
+
const manifest = readVendorManifest(root);
|
|
304
|
+
const requireVendored = createRequire(join(root, 'runtime', 'compiler', 'compile-core.cjs'));
|
|
305
|
+
const requireCli = createRequire(join(root, 'package.json'));
|
|
306
|
+
const groups = ['base', ...(tailwindVersion === 4 ? ['tw4'] : tailwindVersion === 3 ? ['tw3'] : [])];
|
|
307
|
+
const toolchainDirs = await prepareToolchain(manifest, groups, this.opts.onPrepare);
|
|
308
|
+
const react19Pins = manifest.toolchain.react19 ?? {};
|
|
309
|
+
this.searchPath = resolveAppDependencies(this.opts.cwd, pkg, react19Pins);
|
|
310
|
+
this.depCacheDir = resolve(this.searchPath[this.searchPath.length - 1], '..');
|
|
311
|
+
const requireToolchain = (group) => createRequire(join(toolchainDirs[group], 'package.json'));
|
|
312
|
+
const requireBase = requireToolchain('base');
|
|
313
|
+
const requireTw3 = toolchainDirs.tw3 ? requireToolchain('tw3') : null;
|
|
314
|
+
const requireTw4 = toolchainDirs.tw4 ? requireToolchain('tw4') : null;
|
|
315
|
+
const { createCompileCore } = requireVendored('./compile-core.cjs');
|
|
316
|
+
this.core = createCompileCore({
|
|
317
|
+
// esbuild-wasm at the container's exact version. Loaded through the CLI's
|
|
318
|
+
// own require so it comes from the CLI's bundled tree, never the project's.
|
|
319
|
+
esbuild: requireCli('esbuild-wasm'),
|
|
320
|
+
imageNodeModules: this.searchPath,
|
|
321
|
+
// No isolated React-19 set locally: it exists in the image to skip a cold
|
|
322
|
+
// install of react/react-dom, and here those either sit in the project's
|
|
323
|
+
// node_modules already or land in the dependency cache once and stay.
|
|
324
|
+
react19NodeModules: null,
|
|
325
|
+
tw4TailwindDir: toolchainDirs.tw4 ? join(toolchainDirs.tw4, 'node_modules', 'tailwindcss') : null,
|
|
326
|
+
requireImage: (spec) => {
|
|
327
|
+
// tailwindcss means v3 here, exactly as it does in the image; the v4
|
|
328
|
+
// engine is reached only through requireTw4.
|
|
329
|
+
if (spec === 'tailwindcss' && requireTw3)
|
|
330
|
+
return requireTw3(spec);
|
|
331
|
+
// semver rides along in the CLI's own dependencies already.
|
|
332
|
+
if (spec === 'semver')
|
|
333
|
+
return requireCli(spec);
|
|
334
|
+
return requireBase(spec);
|
|
335
|
+
},
|
|
336
|
+
requireTw4: requireTw4 ? (spec) => requireTw4(spec) : undefined,
|
|
337
|
+
// The container refuses to install without its per-build scoped proxy
|
|
338
|
+
// because it is egress-locked. This is the developer's own machine
|
|
339
|
+
// running their own npm; the proxy does not exist here and its absence
|
|
340
|
+
// is not a safety signal.
|
|
341
|
+
requiresPackageProxy: false,
|
|
342
|
+
installPackages: async ({ specs }) => {
|
|
343
|
+
const pinned = applyImagePins(specs, react19Pins);
|
|
344
|
+
this.opts.onPrepare?.(`${pinned.length} ${pinned.length === 1 ? 'dependency' : 'dependencies'} (${pinned.join(', ')})`);
|
|
345
|
+
await installInto(this.depCacheDir, pinned);
|
|
346
|
+
},
|
|
347
|
+
// The local loop is not a publication: no artifact upload capability, and
|
|
348
|
+
// an identity that says plainly where this build came from.
|
|
349
|
+
stamp: { source: `cli-vendored-${manifest.commit}`, toolchain: digestOf(manifest.files) },
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
/** Compile the project. Throws CompileFailure for an error in the developer's source. */
|
|
353
|
+
async compile(sources) {
|
|
354
|
+
const { files, binaryFiles } = sources;
|
|
355
|
+
const entry = detectBundleEntry(files);
|
|
356
|
+
if (!entry) {
|
|
357
|
+
throw new CompileFailure('No app entry found. index.html needs a <script type="module" src="/src/main.tsx"> pointing at your app entry — that tag is what the platform compiles, locally and on deploy.', []);
|
|
358
|
+
}
|
|
359
|
+
const transformEntries = [...collectModuleEntryScripts(files)].filter((path) => path !== entry);
|
|
360
|
+
if (!this.core)
|
|
361
|
+
throw new Error('LocalCompiler.prepare() must run before compile()');
|
|
362
|
+
let result;
|
|
363
|
+
try {
|
|
364
|
+
result = await this.core.compile({
|
|
365
|
+
project_id: 'somewhere-dev-local',
|
|
366
|
+
build_id: 'somewhere-dev-local',
|
|
367
|
+
entry,
|
|
368
|
+
files,
|
|
369
|
+
binary_files: binaryFiles,
|
|
370
|
+
function_entries: [],
|
|
371
|
+
transform_entries: transformEntries,
|
|
372
|
+
package_json: files['package.json'],
|
|
373
|
+
tsconfig: files['tsconfig.json'],
|
|
374
|
+
vite_env: this.opts.viteEnv ?? {},
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
catch (err) {
|
|
378
|
+
throw toCompileFailure(err);
|
|
379
|
+
}
|
|
380
|
+
if (!result.entry_chunk)
|
|
381
|
+
throw new CompileFailure('The compiler produced no entry chunk.', []);
|
|
382
|
+
const html = typeof files['index.html'] === 'string'
|
|
383
|
+
? rewriteIndexHtml(files['index.html'], entry, result.entry_chunk, Object.keys(result.chunks))
|
|
384
|
+
: null;
|
|
385
|
+
return {
|
|
386
|
+
entryChunk: result.entry_chunk,
|
|
387
|
+
chunks: result.chunks,
|
|
388
|
+
html,
|
|
389
|
+
entry,
|
|
390
|
+
warnings: result.warnings ?? [],
|
|
391
|
+
sourceDigest: result.source_digest,
|
|
392
|
+
artifacts: result.artifact_manifest.artifacts,
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Turn a compiler error into something with a file and a line.
|
|
398
|
+
*
|
|
399
|
+
* The compiler reports a syntax error as SOURCE_PARSE_ERROR with every bad
|
|
400
|
+
* file joined into one message (`src/App.tsx: Expected ";" ...`). esbuild's own
|
|
401
|
+
* errors carry a structured location. Both become a list of
|
|
402
|
+
* {file, line, column, text} so the terminal and the browser overlay can point
|
|
403
|
+
* at the exact line instead of printing a paragraph.
|
|
404
|
+
*/
|
|
405
|
+
export function toCompileFailure(err) {
|
|
406
|
+
const locations = [];
|
|
407
|
+
// The compiler's own parse phase hands back {file, line, column, message}
|
|
408
|
+
// per bad file (source_errors). Use it verbatim — it is the most precise
|
|
409
|
+
// location available, and it is what a syntax error produces.
|
|
410
|
+
const sourceErrors = err?.source_errors;
|
|
411
|
+
if (Array.isArray(sourceErrors) && sourceErrors.length) {
|
|
412
|
+
for (const e of sourceErrors) {
|
|
413
|
+
locations.push({ file: e.file, line: e.line, column: e.column, text: e.message });
|
|
414
|
+
}
|
|
415
|
+
return new CompileFailure(sourceErrors[0].message, locations);
|
|
416
|
+
}
|
|
417
|
+
const esbuildErrors = err?.errors;
|
|
418
|
+
if (Array.isArray(esbuildErrors) && esbuildErrors.length) {
|
|
419
|
+
for (const e of esbuildErrors) {
|
|
420
|
+
locations.push({
|
|
421
|
+
file: e.location?.file ?? '',
|
|
422
|
+
line: e.location?.line,
|
|
423
|
+
column: e.location ? e.location.column + 1 : undefined,
|
|
424
|
+
text: e.text,
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
return new CompileFailure(esbuildErrors[0].text, locations);
|
|
428
|
+
}
|
|
429
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
430
|
+
for (const part of message.split('; ')) {
|
|
431
|
+
// `src/App.tsx:12:4: Expected ";" but found "}"` and the shorter
|
|
432
|
+
// `src/App.tsx: Expected ...` the parse phase produces.
|
|
433
|
+
const withPos = /^([^\s:]+\.[a-z]+):(\d+):(\d+):\s*(.+)$/i.exec(part);
|
|
434
|
+
if (withPos) {
|
|
435
|
+
locations.push({ file: withPos[1], line: Number(withPos[2]), column: Number(withPos[3]), text: withPos[4] });
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
const fileOnly = /^([^\s:]+\.[a-z]+):\s*(.+)$/i.exec(part);
|
|
439
|
+
if (fileOnly)
|
|
440
|
+
locations.push({ file: fileOnly[1], text: fileOnly[2] });
|
|
441
|
+
}
|
|
442
|
+
return new CompileFailure(message, locations);
|
|
443
|
+
}
|
|
444
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/local/compiler.ts"],"names":[],"mappings":"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"}
|