@superblocksteam/sdk 2.0.123-next.0 → 2.0.124-next.0
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 +170 -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 +36 -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 +396 -62
- 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 +210 -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 +495 -92
- 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,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the cold-start `TokenManager` priming step (APPS-4231 follow-up).
|
|
3
|
+
*
|
|
4
|
+
* Background
|
|
5
|
+
* ----------
|
|
6
|
+
* `NpmRegistryClient.getJwt()` (`packages/vite-plugin-file-sync/src/ai-service/index.ts`)
|
|
7
|
+
* has two bearer-credential sources:
|
|
8
|
+
* 1. `tokenManagerJwt`, seeded synchronously at `AiService` construction
|
|
9
|
+
* from `tokenManager.getCurrentToken()` and kept current via the
|
|
10
|
+
* `tokenUpdated` listener for future refreshes.
|
|
11
|
+
* 2. `clark?.context?.jwt`, primed lazily by the first socket RPC's
|
|
12
|
+
* `peerAuthorization` header (`socket-manager.ts`).
|
|
13
|
+
*
|
|
14
|
+
* `TokenManager.updateToken()` has exactly one production writer outside
|
|
15
|
+
* `dev()` itself: `AuthHotReloadServer` (`auth-hot-reload.mts`). That socket
|
|
16
|
+
* is explicitly disabled on live-edit pods (SABS sets
|
|
17
|
+
* `SUPERBLOCKS_AUTH_HOT_RELOAD=false`). So on cold start neither source is
|
|
18
|
+
* primed until the UI socket lands — which is AFTER `syncHomeNpmrc` and
|
|
19
|
+
* AFTER the AiService's `TemplateRenderer` prefetch fires.
|
|
20
|
+
*
|
|
21
|
+
* The CLI does have a usable token in scope at `dev()` entry
|
|
22
|
+
* (`tokenConfig.token`, sourced from auth.json or `/_sb_activate`).
|
|
23
|
+
* `primeTokenManagerWithInitialToken` seeds it. Because `TokenManager`
|
|
24
|
+
* retains the current token as state and consumers read it synchronously
|
|
25
|
+
* during construction (see `getCurrentToken()` on `ITokenManager`), the
|
|
26
|
+
* call-site ordering between the prime and consumer construction is NOT
|
|
27
|
+
* load-bearing: the seed reaches AiService whether the prime fires before
|
|
28
|
+
* or after `new AiService(...)`.
|
|
29
|
+
*/
|
|
30
|
+
import { describe, expect, it, vi } from "vitest";
|
|
31
|
+
import { TokenManager } from "../dev-utils/token-manager.js";
|
|
32
|
+
import { primeTokenManagerWithInitialToken } from "./dev.mjs";
|
|
33
|
+
describe("primeTokenManagerWithInitialToken", () => {
|
|
34
|
+
it("emits a `tokenUpdated` event carrying the supplied token to listeners subscribed before the call", () => {
|
|
35
|
+
const tokenManager = new TokenManager();
|
|
36
|
+
const events = [];
|
|
37
|
+
tokenManager.on("tokenUpdated", (event) => {
|
|
38
|
+
events.push(event.token);
|
|
39
|
+
});
|
|
40
|
+
primeTokenManagerWithInitialToken(tokenManager, "jwt-from-cold-start");
|
|
41
|
+
expect(events).toEqual(["jwt-from-cold-start"]);
|
|
42
|
+
});
|
|
43
|
+
it("no-ops when the token is empty (no spurious `tokenUpdated` event)", () => {
|
|
44
|
+
const tokenManager = new TokenManager();
|
|
45
|
+
const events = [];
|
|
46
|
+
tokenManager.on("tokenUpdated", (event) => {
|
|
47
|
+
events.push(event.token);
|
|
48
|
+
});
|
|
49
|
+
primeTokenManagerWithInitialToken(tokenManager, "");
|
|
50
|
+
expect(events).toEqual([]);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe("TokenManager state retention (cold-start contract)", () => {
|
|
54
|
+
it("exposes the primed token via getCurrentToken() to consumers constructed AFTER the prime call", () => {
|
|
55
|
+
// This is what makes the dev.mts call site order-independent. AiService
|
|
56
|
+
// reads tokenManager.getCurrentToken() synchronously in its constructor
|
|
57
|
+
// to seed `tokenManagerJwt` — so even if `dev()` primes BEFORE
|
|
58
|
+
// `new AiService(...)`, the seed survives.
|
|
59
|
+
const tokenManager = new TokenManager();
|
|
60
|
+
primeTokenManagerWithInitialToken(tokenManager, "seed-jwt");
|
|
61
|
+
expect(tokenManager.getCurrentToken()).toBe("seed-jwt");
|
|
62
|
+
});
|
|
63
|
+
it("returns undefined from getCurrentToken() when no token has been set", () => {
|
|
64
|
+
const tokenManager = new TokenManager();
|
|
65
|
+
expect(tokenManager.getCurrentToken()).toBeUndefined();
|
|
66
|
+
});
|
|
67
|
+
it("does NOT auto-replay prior emissions to late-attached listeners", () => {
|
|
68
|
+
// Deliberate: auto-replaying would cause refresh-handling subscribers
|
|
69
|
+
// (e.g. AutoConnectingRpcClient, which closes and reconnects the socket
|
|
70
|
+
// on every `tokenUpdated`) to fire on what is conceptually a seed read.
|
|
71
|
+
// Late-attached subscribers MUST opt in via `getCurrentToken()` if they
|
|
72
|
+
// need the current value at attach time; the event channel is for
|
|
73
|
+
// changes only.
|
|
74
|
+
const tokenManager = new TokenManager();
|
|
75
|
+
primeTokenManagerWithInitialToken(tokenManager, "abc");
|
|
76
|
+
const lateListener = vi.fn();
|
|
77
|
+
tokenManager.on("tokenUpdated", lateListener);
|
|
78
|
+
expect(lateListener).not.toHaveBeenCalled();
|
|
79
|
+
});
|
|
80
|
+
it("overwrites the stored token on each updateToken call so refreshes win", () => {
|
|
81
|
+
const tokenManager = new TokenManager();
|
|
82
|
+
primeTokenManagerWithInitialToken(tokenManager, "first");
|
|
83
|
+
tokenManager.updateToken("second");
|
|
84
|
+
expect(tokenManager.getCurrentToken()).toBe("second");
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=dev-token-priming.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-token-priming.test.mjs","sourceRoot":"","sources":["../../src/cli-replacement/dev-token-priming.test.mts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { Server as HttpServer } from "node:http";
|
|
2
|
+
import type { ServerError } from "@superblocksteam/library-shared/types";
|
|
3
|
+
import { type NpmRegistryClient } from "@superblocksteam/vite-plugin-file-sync/npm-registry";
|
|
2
4
|
import type { AuthHotReloadServer, MultiPageApplicationWrapper, TokenManager, SuperblocksSdk } from "../index.js";
|
|
5
|
+
import { type Logger } from "../telemetry/logging.js";
|
|
3
6
|
import type { ApplicationConfig, TokenConfig } from "../types/index.js";
|
|
4
7
|
import { type PackageJsonSnapshot } from "./package-json-snapshot.mjs";
|
|
8
|
+
export declare function installPackages(cwd: string, logger: Logger, npmRegistryClient?: NpmRegistryClient): Promise<void>;
|
|
5
9
|
export declare enum DevServerAutoUpgradeMode {
|
|
6
10
|
SKIP = "skip-upgrade",
|
|
7
11
|
FORCE = "force-upgrade",
|
|
@@ -14,6 +18,38 @@ export declare enum DevServerAutoUpgradeMode {
|
|
|
14
18
|
*/
|
|
15
19
|
SKIP_CLI_ONLY = "skip-cli-only"
|
|
16
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Seed `tokenManager` with the initial token the CLI received from auth.json
|
|
23
|
+
* (standalone dev) or `/_sb_activate` (SABS live-edit pod activation), so the
|
|
24
|
+
* `NpmRegistryClient`'s JWT source has a usable bearer credential on cold
|
|
25
|
+
* boot.
|
|
26
|
+
*
|
|
27
|
+
* Without this seeding, `TokenManager.updateToken` is only ever called by
|
|
28
|
+
* `AuthHotReloadServer` (`auth-hot-reload.mts`) — and that socket is
|
|
29
|
+
* explicitly disabled on live-edit pods (`sabs/entrypoint-local.sh` sets
|
|
30
|
+
* `SUPERBLOCKS_AUTH_HOT_RELOAD=false`), so `NpmRegistryClient.getConfig()`
|
|
31
|
+
* cannot authenticate its server fetch on cold boot. The result is
|
|
32
|
+
* `source: "unreachable"`, `syncHomeNpmrc` skips with `~/.npmrc` left
|
|
33
|
+
* untouched, and the CLI auto-upgrade that fires moments later resolves
|
|
34
|
+
* `npm install -g @superblocksteam/cli@…` through public npm instead of the
|
|
35
|
+
* customer's configured private registry.
|
|
36
|
+
*
|
|
37
|
+
* Call-site ordering is intentionally NOT load-bearing: `TokenManager`
|
|
38
|
+
* retains the current token as state and `AiService` reads
|
|
39
|
+
* `tokenManager.getCurrentToken()` synchronously at construction time, so
|
|
40
|
+
* the prime call works whether it runs before or after consumer
|
|
41
|
+
* construction. The `tokenUpdated` event stream stays as the refresh
|
|
42
|
+
* channel for future rotations (hot-reload pushes, JWT renewal), so this
|
|
43
|
+
* seed is purely additive.
|
|
44
|
+
*/
|
|
45
|
+
export declare function primeTokenManagerWithInitialToken(tokenManager: TokenManager, token: string): void;
|
|
46
|
+
export interface DevServerStatus {
|
|
47
|
+
serverErrors: ServerError[];
|
|
48
|
+
}
|
|
49
|
+
/** Decide how the startup catch handles an error: degrade (record, keep Vite up)
|
|
50
|
+
* for an app-install failure (the InitialInstallFailed marker), or exit for
|
|
51
|
+
* anything else (lock/sync/upgrade). Pure + unit-tested. Does NOT call process.exit. */
|
|
52
|
+
export declare function handleStartupError(error: unknown, status: DevServerStatus, logger: Logger): "degrade" | "exit";
|
|
17
53
|
export declare function dev(options: {
|
|
18
54
|
cwd: string;
|
|
19
55
|
devServerPort?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.mts","sourceRoot":"","sources":["../../src/cli-replacement/dev.mts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dev.d.mts","sourceRoot":"","sources":["../../src/cli-replacement/dev.mts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAWtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAyBzE,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,qDAAqD,CAAC;AAQ7D,OAAO,KAAK,EACV,mBAAmB,EACnB,2BAA2B,EAC3B,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EACV,iBAAiB,EAEjB,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAmB3B,OAAO,EAIL,KAAK,mBAAmB,EAEzB,MAAM,6BAA6B,CAAC;AAkLrC,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,iBAAiB,CAAC,EAAE,iBAAiB,iBA8HtC;AA8DD,oBAAY,wBAAwB;IAClC,IAAI,iBAAiB;IACrB,KAAK,kBAAkB;IACvB;;;;;;OAMG;IACH,aAAa,kBAAkB;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,MAAM,GACZ,IAAI,CAIN;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED;;yFAEyF;AACzF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,SAAS,GAAG,MAAM,CAepB;AAED,wBAAsB,GAAG,CAAC,OAAO,EAAE;IAEjC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC;IAGzB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAG1C,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAG3C,MAAM,CAAC,EAAE,WAAW,CAAC;IAGrB,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,GAAG,EAAE,cAAc,CAAC;IAEpB,mGAAmG;IACnG,qBAAqB,CAAC,EAAE,2BAA2B,CAAC;IAEpD,uFAAuF;IACvF,cAAc,CAAC,EAAE,UAAU,CAAC;IAE5B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,oGAAoG;IACpG,gCAAgC,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE9D,8FAA8F;IAC9F,mCAAmC,CAAC,EAAE,OAAO,CAAC;CAC/C,iBA0hCA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.interception.test.d.mts","sourceRoot":"","sources":["../../src/cli-replacement/dev.interception.test.mts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { InitialInstallFailed } from "./dependency-install-classifier.mjs";
|
|
3
|
+
import { handleStartupError } from "./dev.mjs";
|
|
4
|
+
// Mock the metrics module so we can assert recordInitialInstallFailure calls.
|
|
5
|
+
// vi.mock is hoisted, so we use vi.hoisted to declare the spy before the factory.
|
|
6
|
+
const { recordInitialInstallFailureMock } = vi.hoisted(() => ({
|
|
7
|
+
recordInitialInstallFailureMock: vi.fn(),
|
|
8
|
+
}));
|
|
9
|
+
vi.mock("../dev-utils/dev-server-metrics.mjs", () => ({
|
|
10
|
+
devServerMetrics: {
|
|
11
|
+
recordInitialInstallFailure: recordInitialInstallFailureMock,
|
|
12
|
+
flush: vi.fn(),
|
|
13
|
+
recordEndpoint: vi.fn(),
|
|
14
|
+
recordSocketUpgrade: vi.fn(),
|
|
15
|
+
recordViteEagerInit: vi.fn(),
|
|
16
|
+
recordWarmPrewarm: vi.fn(),
|
|
17
|
+
recordWarmActivation: vi.fn(),
|
|
18
|
+
recordWarmHandoff: vi.fn(),
|
|
19
|
+
},
|
|
20
|
+
}));
|
|
21
|
+
const makeLogger = () => ({ error: () => { }, info: () => { }, warn: () => { } });
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
recordInitialInstallFailureMock.mockClear();
|
|
24
|
+
});
|
|
25
|
+
describe("handleStartupError", () => {
|
|
26
|
+
it("records + does NOT exit for InitialInstallFailed", () => {
|
|
27
|
+
const status = { serverErrors: [] };
|
|
28
|
+
const marker = new InitialInstallFailed({
|
|
29
|
+
type: "dev-server/dependency-install",
|
|
30
|
+
timestamp: "t",
|
|
31
|
+
category: "dependency_conflict",
|
|
32
|
+
rawError: "x",
|
|
33
|
+
});
|
|
34
|
+
const decision = handleStartupError(marker, status, makeLogger());
|
|
35
|
+
expect(decision).toBe("degrade");
|
|
36
|
+
expect(status.serverErrors).toHaveLength(1);
|
|
37
|
+
});
|
|
38
|
+
it("emits the install-failure metric with category on the degrade path", () => {
|
|
39
|
+
const status = { serverErrors: [] };
|
|
40
|
+
const marker = new InitialInstallFailed({
|
|
41
|
+
type: "dev-server/dependency-install",
|
|
42
|
+
timestamp: "t",
|
|
43
|
+
category: "registry_auth_failed",
|
|
44
|
+
npmErrorCode: "E401",
|
|
45
|
+
hasAnyRegistryConfigured: true,
|
|
46
|
+
rawError: "x",
|
|
47
|
+
});
|
|
48
|
+
handleStartupError(marker, status, makeLogger());
|
|
49
|
+
expect(recordInitialInstallFailureMock).toHaveBeenCalledOnce();
|
|
50
|
+
expect(recordInitialInstallFailureMock).toHaveBeenCalledWith({
|
|
51
|
+
category: "registry_auth_failed",
|
|
52
|
+
npmErrorCode: "E401",
|
|
53
|
+
hasAnyRegistryConfigured: true,
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
it("does NOT emit the install-failure metric on the exit path", () => {
|
|
57
|
+
const status = { serverErrors: [] };
|
|
58
|
+
handleStartupError(new Error("lock failed"), status, makeLogger());
|
|
59
|
+
expect(recordInitialInstallFailureMock).not.toHaveBeenCalled();
|
|
60
|
+
});
|
|
61
|
+
it("exits for a non-marker error (upgrade / lock / sync)", () => {
|
|
62
|
+
const status = { serverErrors: [] };
|
|
63
|
+
const decision = handleStartupError(new Error("lock failed"), status, makeLogger());
|
|
64
|
+
expect(decision).toBe("exit");
|
|
65
|
+
expect(status.serverErrors).toHaveLength(0);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=dev.interception.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.interception.test.mjs","sourceRoot":"","sources":["../../src/cli-replacement/dev.interception.test.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,8EAA8E;AAC9E,kFAAkF;AAClF,MAAM,EAAE,+BAA+B,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5D,+BAA+B,EAAE,EAAE,CAAC,EAAE,EAAE;CACzC,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,gBAAgB,EAAE;QAChB,2BAA2B,EAAE,+BAA+B;QAC5D,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;QACvB,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC5B,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC5B,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC1B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC7B,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;KAC3B;CACF,CAAC,CAAC,CAAC;AAEJ,MAAM,UAAU,GAAG,GAAG,EAAE,CACtB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAQ,CAAC;AAE/D,UAAU,CAAC,GAAG,EAAE;IACd,+BAA+B,CAAC,SAAS,EAAE,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,EAAW,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC;YACtC,IAAI,EAAE,+BAA+B;YACrC,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,qBAAqB;YAC/B,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,EAAW,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC;YACtC,IAAI,EAAE,+BAA+B;YACrC,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,sBAAsB;YAChC,YAAY,EAAE,MAAM;YACpB,wBAAwB,EAAE,IAAI;YAC9B,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,+BAA+B,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAC/D,MAAM,CAAC,+BAA+B,CAAC,CAAC,oBAAoB,CAAC;YAC3D,QAAQ,EAAE,sBAAsB;YAChC,YAAY,EAAE,MAAM;YACpB,wBAAwB,EAAE,IAAI;SAC/B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,EAAW,EAAE,CAAC;QAC7C,kBAAkB,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,EAAW,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,kBAAkB,CACjC,IAAI,KAAK,CAAC,aAAa,CAAC,EACxB,MAAM,EACN,UAAU,EAAE,CACb,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|