@superblocksteam/sdk 2.0.123 → 2.0.124-next.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/.turbo/turbo-build.log +1 -1
- package/dist/cli-replacement/automatic-upgrades.d.ts +37 -1
- package/dist/cli-replacement/automatic-upgrades.d.ts.map +1 -1
- package/dist/cli-replacement/automatic-upgrades.js +162 -10
- package/dist/cli-replacement/automatic-upgrades.js.map +1 -1
- package/dist/cli-replacement/automatic-upgrades.test.js +377 -8
- package/dist/cli-replacement/automatic-upgrades.test.js.map +1 -1
- package/dist/cli-replacement/dependency-install-classifier.d.mts +21 -0
- package/dist/cli-replacement/dependency-install-classifier.d.mts.map +1 -0
- package/dist/cli-replacement/dependency-install-classifier.mjs +83 -0
- package/dist/cli-replacement/dependency-install-classifier.mjs.map +1 -0
- package/dist/cli-replacement/dependency-install-classifier.test.d.mts +2 -0
- package/dist/cli-replacement/dependency-install-classifier.test.d.mts.map +1 -0
- package/dist/cli-replacement/dependency-install-classifier.test.mjs +51 -0
- package/dist/cli-replacement/dependency-install-classifier.test.mjs.map +1 -0
- package/dist/cli-replacement/dev-s3-restore.test.mjs +403 -14
- package/dist/cli-replacement/dev-s3-restore.test.mjs.map +1 -1
- package/dist/cli-replacement/dev-startup-git-before-dbfs-order.test.mjs +33 -2
- package/dist/cli-replacement/dev-startup-git-before-dbfs-order.test.mjs.map +1 -1
- package/dist/cli-replacement/dev-token-priming.test.d.mts +31 -0
- package/dist/cli-replacement/dev-token-priming.test.d.mts.map +1 -0
- package/dist/cli-replacement/dev-token-priming.test.mjs +87 -0
- package/dist/cli-replacement/dev-token-priming.test.mjs.map +1 -0
- package/dist/cli-replacement/dev.d.mts +47 -0
- package/dist/cli-replacement/dev.d.mts.map +1 -1
- package/dist/cli-replacement/dev.interception.test.d.mts +2 -0
- package/dist/cli-replacement/dev.interception.test.d.mts.map +1 -0
- package/dist/cli-replacement/dev.interception.test.mjs +68 -0
- package/dist/cli-replacement/dev.interception.test.mjs.map +1 -0
- package/dist/cli-replacement/dev.mjs +486 -65
- package/dist/cli-replacement/dev.mjs.map +1 -1
- package/dist/cli-replacement/home-npmrc.d.mts +180 -0
- package/dist/cli-replacement/home-npmrc.d.mts.map +1 -0
- package/dist/cli-replacement/home-npmrc.mjs +283 -0
- package/dist/cli-replacement/home-npmrc.mjs.map +1 -0
- package/dist/cli-replacement/home-npmrc.test.d.mts +10 -0
- package/dist/cli-replacement/home-npmrc.test.d.mts.map +1 -0
- package/dist/cli-replacement/home-npmrc.test.mjs +582 -0
- package/dist/cli-replacement/home-npmrc.test.mjs.map +1 -0
- package/dist/cli-replacement/install-packages.classify.test.d.mts +2 -0
- package/dist/cli-replacement/install-packages.classify.test.d.mts.map +1 -0
- package/dist/cli-replacement/install-packages.classify.test.mjs +125 -0
- package/dist/cli-replacement/install-packages.classify.test.mjs.map +1 -0
- package/dist/cli-replacement/install-packages.npm-registry.test.d.mts +2 -0
- package/dist/cli-replacement/install-packages.npm-registry.test.d.mts.map +1 -0
- package/dist/cli-replacement/install-packages.npm-registry.test.mjs +260 -0
- package/dist/cli-replacement/install-packages.npm-registry.test.mjs.map +1 -0
- package/dist/cli-replacement/post-upgrade-lockfile-strip.d.mts +58 -0
- package/dist/cli-replacement/post-upgrade-lockfile-strip.d.mts.map +1 -0
- package/dist/cli-replacement/post-upgrade-lockfile-strip.mjs +224 -0
- package/dist/cli-replacement/post-upgrade-lockfile-strip.mjs.map +1 -0
- package/dist/cli-replacement/post-upgrade-lockfile-strip.test.d.mts +11 -0
- package/dist/cli-replacement/post-upgrade-lockfile-strip.test.d.mts.map +1 -0
- package/dist/cli-replacement/post-upgrade-lockfile-strip.test.mjs +317 -0
- package/dist/cli-replacement/post-upgrade-lockfile-strip.test.mjs.map +1 -0
- package/dist/cli-replacement/userconfig-env.integration.test.d.mts +26 -0
- package/dist/cli-replacement/userconfig-env.integration.test.d.mts.map +1 -0
- package/dist/cli-replacement/userconfig-env.integration.test.mjs +148 -0
- package/dist/cli-replacement/userconfig-env.integration.test.mjs.map +1 -0
- package/dist/dev-utils/dev-server-metrics.d.mts +25 -0
- package/dist/dev-utils/dev-server-metrics.d.mts.map +1 -1
- package/dist/dev-utils/dev-server-metrics.mjs +84 -0
- package/dist/dev-utils/dev-server-metrics.mjs.map +1 -1
- package/dist/dev-utils/dev-server-metrics.test.d.mts +2 -0
- package/dist/dev-utils/dev-server-metrics.test.d.mts.map +1 -0
- package/dist/dev-utils/dev-server-metrics.test.mjs +26 -0
- package/dist/dev-utils/dev-server-metrics.test.mjs.map +1 -0
- package/dist/dev-utils/dev-server.d.mts +23 -1
- package/dist/dev-utils/dev-server.d.mts.map +1 -1
- package/dist/dev-utils/dev-server.mjs +21 -9
- package/dist/dev-utils/dev-server.mjs.map +1 -1
- package/dist/dev-utils/dev-server.status.test.d.mts +2 -0
- package/dist/dev-utils/dev-server.status.test.d.mts.map +1 -0
- package/dist/dev-utils/dev-server.status.test.mjs +41 -0
- package/dist/dev-utils/dev-server.status.test.mjs.map +1 -0
- package/dist/dev-utils/token-manager.d.ts +31 -0
- package/dist/dev-utils/token-manager.d.ts.map +1 -1
- package/dist/dev-utils/token-manager.js +34 -0
- package/dist/dev-utils/token-manager.js.map +1 -1
- package/dist/telemetry/local-obs.js +1 -1
- package/dist/telemetry/local-obs.js.map +1 -1
- package/dist/telemetry/util.js +1 -1
- package/dist/types/scoped-jwt-token-payload.d.ts +1 -0
- package/dist/types/scoped-jwt-token-payload.d.ts.map +1 -1
- package/dist/version-control.d.mts.map +1 -1
- package/dist/version-control.mjs +6 -7
- package/dist/version-control.mjs.map +1 -1
- package/package.json +12 -12
- package/src/cli-replacement/automatic-upgrades.test.ts +530 -8
- package/src/cli-replacement/automatic-upgrades.ts +179 -7
- package/src/cli-replacement/dependency-install-classifier.mts +118 -0
- package/src/cli-replacement/dependency-install-classifier.test.mts +72 -0
- package/src/cli-replacement/dev-s3-restore.test.mts +554 -14
- package/src/cli-replacement/dev-startup-git-before-dbfs-order.test.mts +35 -2
- package/src/cli-replacement/dev-token-priming.test.mts +103 -0
- package/src/cli-replacement/dev.interception.test.mts +80 -0
- package/src/cli-replacement/dev.mts +597 -95
- package/src/cli-replacement/home-npmrc.mts +409 -0
- package/src/cli-replacement/home-npmrc.test.mts +757 -0
- package/src/cli-replacement/install-packages.classify.test.mts +168 -0
- package/src/cli-replacement/install-packages.npm-registry.test.mts +345 -0
- package/src/cli-replacement/post-upgrade-lockfile-strip.mts +296 -0
- package/src/cli-replacement/post-upgrade-lockfile-strip.test.mts +482 -0
- package/src/cli-replacement/userconfig-env.integration.test.mts +189 -0
- package/src/dev-utils/dev-server-metrics.mts +96 -0
- package/src/dev-utils/dev-server-metrics.test.mts +38 -0
- package/src/dev-utils/dev-server.mts +48 -8
- package/src/dev-utils/dev-server.status.test.mts +58 -0
- package/src/dev-utils/token-manager.ts +36 -0
- package/src/telemetry/local-obs.ts +1 -1
- package/src/telemetry/util.ts +1 -1
- package/src/types/scoped-jwt-token-payload.ts +1 -0
- package/src/version-control.mts +8 -6
- package/tsconfig.tsbuildinfo +1 -1
- package/.turbo/turbo-publish-package.log +0 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-CLI-upgrade lockfile normalization for the dev-server pod's globally
|
|
3
|
+
* installed Superblocks CLI.
|
|
4
|
+
*
|
|
5
|
+
* npm honors `resolved` URLs verbatim, so a tarball whose bundled lockfile
|
|
6
|
+
* entries point at `registry.npmjs.org` keeps fetching from public npm even
|
|
7
|
+
* after we've written a private `.npmrc`. This module strips those URLs
|
|
8
|
+
* post-upgrade so subsequent installs re-resolve through the active registry.
|
|
9
|
+
*
|
|
10
|
+
* The walk from the resolved `superblocks` binary up to the CLI package root
|
|
11
|
+
* is bounded so a misconfigured layout can never mutate arbitrary lockfiles
|
|
12
|
+
* on the filesystem.
|
|
13
|
+
*
|
|
14
|
+
* All failures are logged and swallowed — a failed post-strip must not crash
|
|
15
|
+
* the pod after a working upgrade. The next dev startup repeats the strip
|
|
16
|
+
* idempotently.
|
|
17
|
+
*/
|
|
18
|
+
import * as child_process from "node:child_process";
|
|
19
|
+
import fs from "node:fs/promises";
|
|
20
|
+
import * as path from "node:path";
|
|
21
|
+
import { promisify } from "node:util";
|
|
22
|
+
import { stripResolvedFromLockfile, stripResolvedFromLockfilePath, } from "@superblocksteam/vite-plugin-file-sync/npm-registry";
|
|
23
|
+
import { getErrorMeta } from "../telemetry/logging.js";
|
|
24
|
+
const exec = promisify(child_process.exec);
|
|
25
|
+
const LOG_PREFIX = "[post-upgrade-lockfile-strip]";
|
|
26
|
+
/**
|
|
27
|
+
* Upper bound on the post-upgrade strip. The I/O is local and small, but the
|
|
28
|
+
* CLI install can live on a network-mounted prefix (custom `npm prefix`,
|
|
29
|
+
* Volta cache, etc.) where a hung `fs.realpath` or `fs.readFile` would
|
|
30
|
+
* otherwise extend `cliUpgradePromise` and block dev-server startup. A
|
|
31
|
+
* timeout keeps the boot path bounded; the underlying I/O is left to settle
|
|
32
|
+
* in the background since every step is idempotent and individually error-
|
|
33
|
+
* swallowing.
|
|
34
|
+
*/
|
|
35
|
+
const STRIP_TIMEOUT_MS = 5_000;
|
|
36
|
+
/**
|
|
37
|
+
* Upper bound on `package.json` lookups when walking up from the resolved
|
|
38
|
+
* `superblocks` binary. The expected path depth is 3 levels
|
|
39
|
+
* (`<prefix>/lib/node_modules/@superblocksteam/cli/bin/run.js` ->
|
|
40
|
+
* `<prefix>/lib/node_modules/@superblocksteam/cli`); 8 leaves headroom for
|
|
41
|
+
* non-standard layouts (Volta, nvm, custom prefixes) without ever climbing
|
|
42
|
+
* out of the install tree.
|
|
43
|
+
*/
|
|
44
|
+
const MAX_PACKAGE_ROOT_WALK_DEPTH = 8;
|
|
45
|
+
// Both names are valid CLI install roots: `cli-ephemeral` is the alias used
|
|
46
|
+
// for snapshot builds (see the alias detection in `version-detection.ts`),
|
|
47
|
+
// and either may appear in the global install depending on which channel the
|
|
48
|
+
// pod was provisioned against.
|
|
49
|
+
const CLI_PACKAGE_NAMES = new Set([
|
|
50
|
+
"@superblocksteam/cli",
|
|
51
|
+
"@superblocksteam/cli-ephemeral",
|
|
52
|
+
]);
|
|
53
|
+
const defaultWhichRunner = async (binary) => {
|
|
54
|
+
const cmd = process.platform === "win32" ? "where" : "which";
|
|
55
|
+
const { stdout } = await exec(`${cmd} ${binary}`);
|
|
56
|
+
return stdout;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Discovers the absolute path of the `@superblocksteam/cli` install root
|
|
60
|
+
* (the directory containing the CLI's `package.json`), or returns `undefined`
|
|
61
|
+
* if discovery fails. Discovery failures are non-fatal — the caller logs and
|
|
62
|
+
* skips the strip rather than aborting.
|
|
63
|
+
*/
|
|
64
|
+
export async function findGlobalCliInstallDir(logger, whichRunner = defaultWhichRunner) {
|
|
65
|
+
let binStdout;
|
|
66
|
+
try {
|
|
67
|
+
binStdout = await whichRunner("superblocks");
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
logger.warn(`${LOG_PREFIX} which/where superblocks failed; skipping strip`, {
|
|
71
|
+
...getErrorMeta(error),
|
|
72
|
+
});
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
// `which`/`where` may emit multiple lines (e.g. shim + real path on
|
|
76
|
+
// Windows). The first line wins; matches the existing pattern in
|
|
77
|
+
// `version-detection.ts`.
|
|
78
|
+
const binPath = binStdout.trim().split(/\r?\n/)[0]?.trim();
|
|
79
|
+
if (!binPath) {
|
|
80
|
+
logger.warn(`${LOG_PREFIX} superblocks binary not found in PATH; skipping strip`);
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
let realBinPath;
|
|
84
|
+
try {
|
|
85
|
+
realBinPath = await fs.realpath(binPath);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
logger.warn(`${LOG_PREFIX} realpath failed for superblocks binary; skipping strip`, {
|
|
89
|
+
binPath,
|
|
90
|
+
...getErrorMeta(error),
|
|
91
|
+
});
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
let dir = path.dirname(realBinPath);
|
|
95
|
+
for (let i = 0; i < MAX_PACKAGE_ROOT_WALK_DEPTH; i++) {
|
|
96
|
+
const candidate = path.join(dir, "package.json");
|
|
97
|
+
let raw;
|
|
98
|
+
try {
|
|
99
|
+
raw = await fs.readFile(candidate, "utf-8");
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const code = error?.code;
|
|
103
|
+
if (code === "ENOENT") {
|
|
104
|
+
const parent = path.dirname(dir);
|
|
105
|
+
if (parent === dir) {
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
dir = parent;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
logger.warn(`${LOG_PREFIX} failed to read candidate package.json; skipping strip`, {
|
|
112
|
+
candidate,
|
|
113
|
+
code,
|
|
114
|
+
...getErrorMeta(error),
|
|
115
|
+
});
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
let parsed;
|
|
119
|
+
try {
|
|
120
|
+
parsed = JSON.parse(raw);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
logger.warn(`${LOG_PREFIX} candidate package.json is not valid JSON; skipping strip`, {
|
|
124
|
+
candidate,
|
|
125
|
+
...getErrorMeta(error),
|
|
126
|
+
});
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
if (typeof parsed.name === "string" && CLI_PACKAGE_NAMES.has(parsed.name)) {
|
|
130
|
+
return dir;
|
|
131
|
+
}
|
|
132
|
+
// Found a `package.json` that isn't the CLI's — keep walking up. Some
|
|
133
|
+
// layouts (oclif's update channel) nest the binary under a wrapper
|
|
134
|
+
// package; we don't want to bail on the first unrelated manifest.
|
|
135
|
+
const parent = path.dirname(dir);
|
|
136
|
+
if (parent === dir) {
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
dir = parent;
|
|
140
|
+
}
|
|
141
|
+
logger.warn(`${LOG_PREFIX} could not locate @superblocksteam/cli install root; skipping strip`, {
|
|
142
|
+
startedAt: realBinPath,
|
|
143
|
+
});
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Strips public-host `resolved` URLs from every lockfile under the global
|
|
148
|
+
* CLI install that the auto-upgrade could have refreshed. Returns the
|
|
149
|
+
* resolved install root on success, or `undefined` when discovery failed.
|
|
150
|
+
*
|
|
151
|
+
* Non-fatal: every individual strip already swallows lockfile-level errors
|
|
152
|
+
* (logged in `stripResolvedFromLockfilePath`); this wrapper additionally
|
|
153
|
+
* swallows discovery failures and any unexpected throw from the inner
|
|
154
|
+
* helpers so a successful upgrade is never demoted to a crash by a post-step
|
|
155
|
+
* problem.
|
|
156
|
+
*/
|
|
157
|
+
export async function stripUpgradedCliLockfiles(logger, options = {}) {
|
|
158
|
+
const installDir = options.installDir ??
|
|
159
|
+
(await findGlobalCliInstallDir(logger, options.whichRunner));
|
|
160
|
+
if (!installDir) {
|
|
161
|
+
return {};
|
|
162
|
+
}
|
|
163
|
+
const timeoutMs = options.timeoutMs ?? STRIP_TIMEOUT_MS;
|
|
164
|
+
const start = Date.now();
|
|
165
|
+
// The hidden lockfile listing the CLI itself lives two levels up from
|
|
166
|
+
// installDir under the npm-global layout
|
|
167
|
+
// (<prefix>/lib/node_modules/.package-lock.json).
|
|
168
|
+
const globalHiddenLockfile = path.join(path.dirname(path.dirname(installDir)), ".package-lock.json");
|
|
169
|
+
const STRIP_TIMED_OUT = Symbol("STRIP_TIMED_OUT");
|
|
170
|
+
let timeoutHandle;
|
|
171
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
172
|
+
timeoutHandle = setTimeout(() => resolve(STRIP_TIMED_OUT), timeoutMs);
|
|
173
|
+
});
|
|
174
|
+
try {
|
|
175
|
+
const stripWork = Promise.all([
|
|
176
|
+
stripResolvedFromLockfile(installDir),
|
|
177
|
+
stripResolvedFromLockfilePath(globalHiddenLockfile),
|
|
178
|
+
]);
|
|
179
|
+
const outcome = await Promise.race([stripWork, timeoutPromise]);
|
|
180
|
+
if (outcome === STRIP_TIMED_OUT) {
|
|
181
|
+
logger.warn(`${LOG_PREFIX} strip exceeded timeout; continuing without waiting`, {
|
|
182
|
+
installDir,
|
|
183
|
+
timeoutMs,
|
|
184
|
+
elapsedMs: Date.now() - start,
|
|
185
|
+
});
|
|
186
|
+
// We're abandoning `stripWork` after the timeout won the race. The
|
|
187
|
+
// inner helpers swallow per-file errors, but their atomic `writeFile`
|
|
188
|
+
// / `rename` calls can still throw (EACCES, EXDEV, ENOSPC, …) — and
|
|
189
|
+
// with no subscriber left on `stripWork`, a late rejection would
|
|
190
|
+
// surface as an unhandled rejection and crash the pod under Node's
|
|
191
|
+
// default policy. Attach a tail handler to keep the post-step
|
|
192
|
+
// non-fatal even when the timeout path is taken.
|
|
193
|
+
stripWork.catch((error) => {
|
|
194
|
+
logger.warn(`${LOG_PREFIX} background strip rejected after timeout; ignoring`, {
|
|
195
|
+
...getErrorMeta(error),
|
|
196
|
+
installDir,
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
logger.info(`${LOG_PREFIX} stripped resolved URLs from upgraded CLI lockfiles`, {
|
|
202
|
+
installDir,
|
|
203
|
+
elapsedMs: Date.now() - start,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
// The lower-level helpers already swallow per-file errors; this catches
|
|
209
|
+
// any unexpected throw so a post-step problem never surfaces as a failed
|
|
210
|
+
// upgrade.
|
|
211
|
+
logger.warn(`${LOG_PREFIX} unexpected error during strip; continuing`, {
|
|
212
|
+
...getErrorMeta(error),
|
|
213
|
+
installDir,
|
|
214
|
+
elapsedMs: Date.now() - start,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
if (timeoutHandle) {
|
|
219
|
+
clearTimeout(timeoutHandle);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return { installDir };
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=post-upgrade-lockfile-strip.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-upgrade-lockfile-strip.mjs","sourceRoot":"","sources":["../../src/cli-replacement/post-upgrade-lockfile-strip.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for post-upgrade-lockfile-strip.
|
|
3
|
+
*
|
|
4
|
+
* Strategy: stand up a real on-disk fixture mimicking the dev-server pod
|
|
5
|
+
* layout (`<prefix>/lib/node_modules/@superblocksteam/cli/...`), then assert
|
|
6
|
+
* the strip mutates the right files and is idempotent / non-fatal on edge
|
|
7
|
+
* cases. Avoids mocking the strip helpers because the disk-shape they expect
|
|
8
|
+
* is the actual contract under test.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=post-upgrade-lockfile-strip.test.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-upgrade-lockfile-strip.test.d.mts","sourceRoot":"","sources":["../../src/cli-replacement/post-upgrade-lockfile-strip.test.mts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for post-upgrade-lockfile-strip.
|
|
3
|
+
*
|
|
4
|
+
* Strategy: stand up a real on-disk fixture mimicking the dev-server pod
|
|
5
|
+
* layout (`<prefix>/lib/node_modules/@superblocksteam/cli/...`), then assert
|
|
6
|
+
* the strip mutates the right files and is idempotent / non-fatal on edge
|
|
7
|
+
* cases. Avoids mocking the strip helpers because the disk-shape they expect
|
|
8
|
+
* is the actual contract under test.
|
|
9
|
+
*/
|
|
10
|
+
import { mkdir, mkdtemp, readFile, realpath, rm, symlink, writeFile, } from "node:fs/promises";
|
|
11
|
+
import * as os from "node:os";
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
14
|
+
import { findGlobalCliInstallDir, stripUpgradedCliLockfiles, } from "./post-upgrade-lockfile-strip.mjs";
|
|
15
|
+
function makeLogger() {
|
|
16
|
+
return {
|
|
17
|
+
info: vi.fn(),
|
|
18
|
+
warn: vi.fn(),
|
|
19
|
+
error: vi.fn(),
|
|
20
|
+
debug: vi.fn(),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function asLogger(mock) {
|
|
24
|
+
return mock;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Lockfile fixture with mixed registries — only public-host `resolved` URLs
|
|
28
|
+
* should be stripped; `integrity` must survive.
|
|
29
|
+
*/
|
|
30
|
+
function lockfile(version) {
|
|
31
|
+
return {
|
|
32
|
+
name: "@superblocksteam/cli",
|
|
33
|
+
version,
|
|
34
|
+
lockfileVersion: 3,
|
|
35
|
+
requires: true,
|
|
36
|
+
packages: {
|
|
37
|
+
"": {
|
|
38
|
+
name: "@superblocksteam/cli",
|
|
39
|
+
version,
|
|
40
|
+
},
|
|
41
|
+
"node_modules/some-dep": {
|
|
42
|
+
version: "1.0.0",
|
|
43
|
+
resolved: "https://registry.npmjs.org/some-dep/-/some-dep-1.0.0.tgz",
|
|
44
|
+
integrity: "sha512-abc",
|
|
45
|
+
},
|
|
46
|
+
"node_modules/already-stripped": {
|
|
47
|
+
version: "2.0.0",
|
|
48
|
+
integrity: "sha512-def",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function makeCliInstallTree(root) {
|
|
54
|
+
const prefix = path.join(root, ".npm-global");
|
|
55
|
+
const cliDir = path.join(prefix, "lib", "node_modules", "@superblocksteam", "cli");
|
|
56
|
+
await mkdir(cliDir, { recursive: true });
|
|
57
|
+
await mkdir(path.join(cliDir, "node_modules"), { recursive: true });
|
|
58
|
+
await mkdir(path.join(cliDir, "bin"), { recursive: true });
|
|
59
|
+
await mkdir(path.join(prefix, "bin"), { recursive: true });
|
|
60
|
+
// package.json identifying this as @superblocksteam/cli
|
|
61
|
+
await writeFile(path.join(cliDir, "package.json"), JSON.stringify({ name: "@superblocksteam/cli", version: "2.1.0" }, null, 2));
|
|
62
|
+
// CLI's own lockfile, with stale public-host resolved URLs
|
|
63
|
+
const cliLockfile = path.join(cliDir, "package-lock.json");
|
|
64
|
+
await writeFile(cliLockfile, JSON.stringify(lockfile("2.1.0"), null, 2) + "\n");
|
|
65
|
+
// CLI's bundled hidden lockfile
|
|
66
|
+
const cliHiddenLockfile = path.join(cliDir, "node_modules", ".package-lock.json");
|
|
67
|
+
await writeFile(cliHiddenLockfile, JSON.stringify(lockfile("2.1.0"), null, 2) + "\n");
|
|
68
|
+
// npm-global hidden lockfile (lists @superblocksteam/cli itself)
|
|
69
|
+
const globalHiddenLockfile = path.join(prefix, "lib", "node_modules", ".package-lock.json");
|
|
70
|
+
await writeFile(globalHiddenLockfile, JSON.stringify({
|
|
71
|
+
name: "global-prefix",
|
|
72
|
+
lockfileVersion: 3,
|
|
73
|
+
packages: {
|
|
74
|
+
"node_modules/@superblocksteam/cli": {
|
|
75
|
+
version: "2.1.0",
|
|
76
|
+
resolved: "https://registry.npmjs.org/@superblocksteam/cli/-/cli-2.1.0.tgz",
|
|
77
|
+
integrity: "sha512-cli",
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
}, null, 2) + "\n");
|
|
81
|
+
// Real binary the shim points at
|
|
82
|
+
const realBin = path.join(cliDir, "bin", "run.js");
|
|
83
|
+
await writeFile(realBin, "#!/usr/bin/env node\n");
|
|
84
|
+
// The PATH-resolved shim is a symlink under <prefix>/bin
|
|
85
|
+
const binShim = path.join(prefix, "bin", "superblocks");
|
|
86
|
+
await symlink(realBin, binShim);
|
|
87
|
+
return {
|
|
88
|
+
prefix,
|
|
89
|
+
cliDir,
|
|
90
|
+
cliLockfile,
|
|
91
|
+
cliHiddenLockfile,
|
|
92
|
+
globalHiddenLockfile,
|
|
93
|
+
binShim,
|
|
94
|
+
realBin,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
describe("post-upgrade-lockfile-strip", () => {
|
|
98
|
+
let tmpRoot;
|
|
99
|
+
let logger;
|
|
100
|
+
beforeEach(async () => {
|
|
101
|
+
// Realpath up front so test expectations match `fs.realpath` output on
|
|
102
|
+
// macOS, where `/var` is a symlink to `/private/var` and any subsequent
|
|
103
|
+
// realpath() resolves through it. Without this every "expect dir" line
|
|
104
|
+
// would have to manually realpath() each comparison.
|
|
105
|
+
tmpRoot = await realpath(await mkdtemp(path.join(os.tmpdir(), "apps-4196-")));
|
|
106
|
+
logger = makeLogger();
|
|
107
|
+
});
|
|
108
|
+
afterEach(async () => {
|
|
109
|
+
await rm(tmpRoot, { recursive: true, force: true });
|
|
110
|
+
});
|
|
111
|
+
describe("findGlobalCliInstallDir", () => {
|
|
112
|
+
it("resolves the CLI install root via which + realpath + walkup", async () => {
|
|
113
|
+
const tree = await makeCliInstallTree(tmpRoot);
|
|
114
|
+
const which = vi.fn(async () => `${tree.binShim}\n`);
|
|
115
|
+
const result = await findGlobalCliInstallDir(asLogger(logger), which);
|
|
116
|
+
expect(result).toBe(tree.cliDir);
|
|
117
|
+
expect(which).toHaveBeenCalledWith("superblocks");
|
|
118
|
+
});
|
|
119
|
+
it("returns undefined when which/where fails (binary not in PATH)", async () => {
|
|
120
|
+
const which = vi.fn(async () => {
|
|
121
|
+
throw new Error("not found");
|
|
122
|
+
});
|
|
123
|
+
const result = await findGlobalCliInstallDir(asLogger(logger), which);
|
|
124
|
+
expect(result).toBeUndefined();
|
|
125
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining("which/where superblocks failed"), expect.any(Object));
|
|
126
|
+
});
|
|
127
|
+
it("returns undefined when which stdout is empty", async () => {
|
|
128
|
+
const which = vi.fn(async () => "\n");
|
|
129
|
+
const result = await findGlobalCliInstallDir(asLogger(logger), which);
|
|
130
|
+
expect(result).toBeUndefined();
|
|
131
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining("superblocks binary not found in PATH"));
|
|
132
|
+
});
|
|
133
|
+
it("uses only the first line when which returns multiple paths", async () => {
|
|
134
|
+
const tree = await makeCliInstallTree(tmpRoot);
|
|
135
|
+
const which = vi.fn(async () => `${tree.binShim}\n/another/path/superblocks\n`);
|
|
136
|
+
const result = await findGlobalCliInstallDir(asLogger(logger), which);
|
|
137
|
+
expect(result).toBe(tree.cliDir);
|
|
138
|
+
});
|
|
139
|
+
it("accepts @superblocksteam/cli-ephemeral as the CLI package name", async () => {
|
|
140
|
+
const tree = await makeCliInstallTree(tmpRoot);
|
|
141
|
+
// Rewrite the manifest as the ephemeral alias
|
|
142
|
+
await writeFile(path.join(tree.cliDir, "package.json"), JSON.stringify({ name: "@superblocksteam/cli-ephemeral", version: "2.1.0" }, null, 2));
|
|
143
|
+
const which = vi.fn(async () => `${tree.binShim}\n`);
|
|
144
|
+
const result = await findGlobalCliInstallDir(asLogger(logger), which);
|
|
145
|
+
expect(result).toBe(tree.cliDir);
|
|
146
|
+
});
|
|
147
|
+
it("returns undefined when no CLI manifest is found within the walk bound", async () => {
|
|
148
|
+
// Symlink targets a path whose ancestors carry no @superblocksteam/cli manifest.
|
|
149
|
+
const wrongRoot = path.join(tmpRoot, "wrong");
|
|
150
|
+
await mkdir(wrongRoot, { recursive: true });
|
|
151
|
+
const realBin = path.join(wrongRoot, "bin");
|
|
152
|
+
await writeFile(realBin, "#!/usr/bin/env node\n");
|
|
153
|
+
const shim = path.join(tmpRoot, "shim");
|
|
154
|
+
await symlink(realBin, shim);
|
|
155
|
+
const which = vi.fn(async () => `${shim}\n`);
|
|
156
|
+
const result = await findGlobalCliInstallDir(asLogger(logger), which);
|
|
157
|
+
expect(result).toBeUndefined();
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe("stripUpgradedCliLockfiles", () => {
|
|
161
|
+
it("strips resolved from all three lockfile locations", async () => {
|
|
162
|
+
const tree = await makeCliInstallTree(tmpRoot);
|
|
163
|
+
const result = await stripUpgradedCliLockfiles(asLogger(logger), {
|
|
164
|
+
installDir: tree.cliDir,
|
|
165
|
+
});
|
|
166
|
+
expect(result.installDir).toBe(tree.cliDir);
|
|
167
|
+
// The success info log is the operator-facing signal that the strip
|
|
168
|
+
// ran; assert it fires exactly once on the happy path.
|
|
169
|
+
expect(logger.info).toHaveBeenCalledTimes(1);
|
|
170
|
+
expect(logger.warn).not.toHaveBeenCalled();
|
|
171
|
+
// CLI's own lockfile: public-host resolved gone, integrity preserved
|
|
172
|
+
const cli = JSON.parse(await readFile(tree.cliLockfile, "utf-8"));
|
|
173
|
+
expect(cli.packages["node_modules/some-dep"].resolved).toBeUndefined();
|
|
174
|
+
expect(cli.packages["node_modules/some-dep"].integrity).toBe("sha512-abc");
|
|
175
|
+
// CLI's hidden lockfile
|
|
176
|
+
const hidden = JSON.parse(await readFile(tree.cliHiddenLockfile, "utf-8"));
|
|
177
|
+
expect(hidden.packages["node_modules/some-dep"].resolved).toBeUndefined();
|
|
178
|
+
// Global hidden lockfile (the @superblocksteam/cli listing itself)
|
|
179
|
+
const global = JSON.parse(await readFile(tree.globalHiddenLockfile, "utf-8"));
|
|
180
|
+
expect(global.packages["node_modules/@superblocksteam/cli"].resolved).toBeUndefined();
|
|
181
|
+
expect(global.packages["node_modules/@superblocksteam/cli"].integrity).toBe("sha512-cli");
|
|
182
|
+
});
|
|
183
|
+
it("is idempotent — second call produces no further changes", async () => {
|
|
184
|
+
const tree = await makeCliInstallTree(tmpRoot);
|
|
185
|
+
await stripUpgradedCliLockfiles(asLogger(logger), {
|
|
186
|
+
installDir: tree.cliDir,
|
|
187
|
+
});
|
|
188
|
+
const after1 = await readFile(tree.cliLockfile, "utf-8");
|
|
189
|
+
await stripUpgradedCliLockfiles(asLogger(logger), {
|
|
190
|
+
installDir: tree.cliDir,
|
|
191
|
+
});
|
|
192
|
+
const after2 = await readFile(tree.cliLockfile, "utf-8");
|
|
193
|
+
expect(after2).toBe(after1);
|
|
194
|
+
});
|
|
195
|
+
it("returns no installDir and does not throw when discovery fails", async () => {
|
|
196
|
+
const which = vi.fn(async () => {
|
|
197
|
+
throw new Error("not found");
|
|
198
|
+
});
|
|
199
|
+
const result = await stripUpgradedCliLockfiles(asLogger(logger), {
|
|
200
|
+
whichRunner: which,
|
|
201
|
+
});
|
|
202
|
+
expect(result).toEqual({});
|
|
203
|
+
// No success log should fire when there was no work to do.
|
|
204
|
+
expect(logger.info).not.toHaveBeenCalled();
|
|
205
|
+
});
|
|
206
|
+
it("does not throw when global hidden lockfile is absent (npm v6 layout)", async () => {
|
|
207
|
+
const tree = await makeCliInstallTree(tmpRoot);
|
|
208
|
+
await rm(tree.globalHiddenLockfile);
|
|
209
|
+
await expect(stripUpgradedCliLockfiles(asLogger(logger), {
|
|
210
|
+
installDir: tree.cliDir,
|
|
211
|
+
})).resolves.toEqual({ installDir: tree.cliDir });
|
|
212
|
+
// The other two were still stripped
|
|
213
|
+
const cli = JSON.parse(await readFile(tree.cliLockfile, "utf-8"));
|
|
214
|
+
expect(cli.packages["node_modules/some-dep"].resolved).toBeUndefined();
|
|
215
|
+
});
|
|
216
|
+
it("returns and warns when the inner strip exceeds the timeout", async () => {
|
|
217
|
+
// Simulate a hung strip (e.g. wedged I/O on a network-mounted prefix).
|
|
218
|
+
// Without the timeout, this would extend `cliUpgradePromise` and block
|
|
219
|
+
// dev-server startup; the timeout converts that into a bounded warn.
|
|
220
|
+
const tree = await makeCliInstallTree(tmpRoot);
|
|
221
|
+
const stripModule = await import("@superblocksteam/vite-plugin-file-sync/npm-registry");
|
|
222
|
+
const stripSpy = vi
|
|
223
|
+
.spyOn(stripModule, "stripResolvedFromLockfile")
|
|
224
|
+
.mockImplementation(() => new Promise(() => { }));
|
|
225
|
+
try {
|
|
226
|
+
const result = await stripUpgradedCliLockfiles(asLogger(logger), {
|
|
227
|
+
installDir: tree.cliDir,
|
|
228
|
+
timeoutMs: 10,
|
|
229
|
+
});
|
|
230
|
+
expect(result).toEqual({ installDir: tree.cliDir });
|
|
231
|
+
expect(logger.warn).toHaveBeenCalledTimes(1);
|
|
232
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining("strip exceeded timeout"), expect.objectContaining({
|
|
233
|
+
installDir: tree.cliDir,
|
|
234
|
+
timeoutMs: 10,
|
|
235
|
+
}));
|
|
236
|
+
expect(logger.info).not.toHaveBeenCalled();
|
|
237
|
+
}
|
|
238
|
+
finally {
|
|
239
|
+
stripSpy.mockRestore();
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
it("suppresses a post-timeout rejection so the abandoned strip cannot crash the pod", async () => {
|
|
243
|
+
// After the timeout wins the race we abandon `stripWork`. If a later
|
|
244
|
+
// rejection from the inner helpers (e.g. EACCES on the atomic rename)
|
|
245
|
+
// had no subscriber, Node would surface it as an unhandled rejection
|
|
246
|
+
// and exit the dev-server process. This test wires up a strip that
|
|
247
|
+
// rejects strictly after the timeout fires, then asserts the wrapper
|
|
248
|
+
// resolves cleanly AND logs the post-timeout rejection via its tail
|
|
249
|
+
// handler.
|
|
250
|
+
const tree = await makeCliInstallTree(tmpRoot);
|
|
251
|
+
let rejectStrip = () => { };
|
|
252
|
+
const pendingStrip = new Promise((_, reject) => {
|
|
253
|
+
rejectStrip = reject;
|
|
254
|
+
});
|
|
255
|
+
const unhandled = [];
|
|
256
|
+
const onUnhandled = (reason) => {
|
|
257
|
+
unhandled.push(reason);
|
|
258
|
+
};
|
|
259
|
+
process.on("unhandledRejection", onUnhandled);
|
|
260
|
+
const stripModule = await import("@superblocksteam/vite-plugin-file-sync/npm-registry");
|
|
261
|
+
const stripSpy = vi
|
|
262
|
+
.spyOn(stripModule, "stripResolvedFromLockfile")
|
|
263
|
+
.mockImplementation(() => pendingStrip);
|
|
264
|
+
try {
|
|
265
|
+
const result = await stripUpgradedCliLockfiles(asLogger(logger), {
|
|
266
|
+
installDir: tree.cliDir,
|
|
267
|
+
timeoutMs: 10,
|
|
268
|
+
});
|
|
269
|
+
expect(result).toEqual({ installDir: tree.cliDir });
|
|
270
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining("strip exceeded timeout"), expect.objectContaining({ installDir: tree.cliDir }));
|
|
271
|
+
rejectStrip(new Error("simulated post-timeout rejection"));
|
|
272
|
+
// Let the rejection propagate and the tail .catch() run.
|
|
273
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
274
|
+
expect(unhandled).toEqual([]);
|
|
275
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining("background strip rejected after timeout"), expect.objectContaining({
|
|
276
|
+
installDir: tree.cliDir,
|
|
277
|
+
error: expect.objectContaining({
|
|
278
|
+
message: "simulated post-timeout rejection",
|
|
279
|
+
}),
|
|
280
|
+
}));
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
process.off("unhandledRejection", onUnhandled);
|
|
284
|
+
stripSpy.mockRestore();
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
it("does not throw or emit the success log when an inner strip rejects unexpectedly", async () => {
|
|
288
|
+
// Replace the CLI's lockfile with a directory at the same path — the
|
|
289
|
+
// inner helper's readFile will see EISDIR. The lower-level helpers
|
|
290
|
+
// documented as swallowing errors should keep the Promise.all from
|
|
291
|
+
// rejecting, but if a future refactor changes that, this test asserts
|
|
292
|
+
// the wrapper's belt-and-suspenders catch still keeps the function
|
|
293
|
+
// non-fatal AND suppresses the success log.
|
|
294
|
+
const tree = await makeCliInstallTree(tmpRoot);
|
|
295
|
+
await rm(tree.cliLockfile);
|
|
296
|
+
await mkdir(tree.cliLockfile);
|
|
297
|
+
const stripModule = await import("@superblocksteam/vite-plugin-file-sync/npm-registry");
|
|
298
|
+
const stripSpy = vi
|
|
299
|
+
.spyOn(stripModule, "stripResolvedFromLockfile")
|
|
300
|
+
.mockRejectedValue(new Error("simulated unexpected throw"));
|
|
301
|
+
try {
|
|
302
|
+
await expect(stripUpgradedCliLockfiles(asLogger(logger), {
|
|
303
|
+
installDir: tree.cliDir,
|
|
304
|
+
})).resolves.toEqual({ installDir: tree.cliDir });
|
|
305
|
+
// Wrapper logged a warn for the unexpected error; the success info
|
|
306
|
+
// log MUST NOT have fired (otherwise pod logs would falsely claim
|
|
307
|
+
// the strip completed).
|
|
308
|
+
expect(logger.warn).toHaveBeenCalledTimes(1);
|
|
309
|
+
expect(logger.info).not.toHaveBeenCalled();
|
|
310
|
+
}
|
|
311
|
+
finally {
|
|
312
|
+
stripSpy.mockRestore();
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
//# sourceMappingURL=post-upgrade-lockfile-strip.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-upgrade-lockfile-strip.test.mjs","sourceRoot":"","sources":["../../src/cli-replacement/post-upgrade-lockfile-strip.test.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test: real `npm` and `pnpm` subprocesses read the
|
|
3
|
+
* Superblocks-owned userconfig when our env overlay is set. Pins the
|
|
4
|
+
* contract that `buildInstallEnv` and the dev-server startup install
|
|
5
|
+
* rely on.
|
|
6
|
+
*
|
|
7
|
+
* Why this exists:
|
|
8
|
+
* - Unit tests assert the spawned `env` includes the userconfig keys,
|
|
9
|
+
* but they cannot tell us whether npm/pnpm actually *honor* them.
|
|
10
|
+
* Earlier iterations of this PR tripped on two real CLI gaps that
|
|
11
|
+
* the unit tests missed:
|
|
12
|
+
* 1. pnpm rejects `--userconfig=` as a CLI flag (pnpm/pnpm#6036)
|
|
13
|
+
* 2. pnpm 11 stopped honouring `NPM_CONFIG_USERCONFIG` (config
|
|
14
|
+
* keys must now be `pnpm_config_*` instead).
|
|
15
|
+
* - This file spawns the real binaries and asserts the registry
|
|
16
|
+
* comes back from our fixture userconfig.
|
|
17
|
+
*
|
|
18
|
+
* Env scrubbing: pnpm/npm inject many `(npm|pnpm)_config_*` env vars
|
|
19
|
+
* into spawned child processes. Those take precedence over userconfig
|
|
20
|
+
* (env > userconfig in the npm config priority chain), which means the
|
|
21
|
+
* fixture would be silently overridden if we forwarded the test
|
|
22
|
+
* runner's env as-is. We strip those vars on the spawn so the assertion
|
|
23
|
+
* exercises the userconfig pathway in isolation.
|
|
24
|
+
*/
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=userconfig-env.integration.test.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userconfig-env.integration.test.d.mts","sourceRoot":"","sources":["../../src/cli-replacement/userconfig-env.integration.test.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG"}
|