@superblocksteam/sdk 2.0.110-next.9 → 2.0.110

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.
@@ -1,11 +0,0 @@
1
- /**
2
- * Tests for checkVersionsAndWritePackageJson, specifically around the
3
- * skipCliUpgrade parameter introduced for warm pool activation.
4
- *
5
- * Warm pods ship with the latest CLI, so an auto-upgrade would pointlessly
6
- * restart the process and defeat the warm pool. But we still need the
7
- * package.json version sync when resuming an existing app so the user's
8
- * @superblocksteam/library pin matches the target version.
9
- */
10
- export {};
11
- //# sourceMappingURL=automatic-upgrades.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"automatic-upgrades.test.d.ts","sourceRoot":"","sources":["../../src/cli-replacement/automatic-upgrades.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -1,175 +0,0 @@
1
- /**
2
- * Tests for checkVersionsAndWritePackageJson, specifically around the
3
- * skipCliUpgrade parameter introduced for warm pool activation.
4
- *
5
- * Warm pods ship with the latest CLI, so an auto-upgrade would pointlessly
6
- * restart the process and defeat the warm pool. But we still need the
7
- * package.json version sync when resuming an existing app so the user's
8
- * @superblocksteam/library pin matches the target version.
9
- */
10
- import fs from "node:fs/promises";
11
- import { describe, it, expect, beforeEach, vi } from "vitest";
12
- import { checkVersionsAndWritePackageJson } from "./automatic-upgrades.js";
13
- // ---------------------------------------------------------------------------
14
- // Mocks
15
- // ---------------------------------------------------------------------------
16
- vi.mock("node:fs/promises", () => ({
17
- default: {
18
- readFile: vi.fn(),
19
- writeFile: vi.fn(),
20
- },
21
- }));
22
- vi.mock("node:child_process", () => ({
23
- exec: vi.fn(),
24
- }));
25
- const upgradeWithPackageManagerCalls = [];
26
- vi.mock("package-manager-detector/detect", () => ({
27
- detect: vi.fn(async () => ({
28
- name: "pnpm",
29
- agent: "pnpm",
30
- version: "10.0.0",
31
- })),
32
- }));
33
- vi.mock("package-manager-detector", () => ({
34
- resolveCommand: vi.fn(() => ({ command: "pnpm", args: ["install"] })),
35
- }));
36
- vi.mock("./version-detection.js", () => ({
37
- getCurrentCliVersion: vi.fn(async () => ({
38
- version: "2.0.0",
39
- alias: undefined,
40
- })),
41
- clearCliVersionCache: vi.fn(),
42
- }));
43
- vi.mock("../telemetry/logging.js", () => ({
44
- getLogger: () => ({
45
- info: vi.fn(),
46
- warn: vi.fn(),
47
- error: vi.fn(),
48
- debug: vi.fn(),
49
- }),
50
- getErrorMeta: vi.fn(() => ({})),
51
- }));
52
- vi.mock("../telemetry/index.js", () => ({
53
- getTracer: () => ({
54
- startActiveSpan: vi.fn((_name, fn) => fn({ end: vi.fn() })),
55
- }),
56
- }));
57
- vi.mock("@superblocksteam/shared", async () => {
58
- return {
59
- NON_SB_ORG_UPDATE_ERROR: "non_sb_org_update_error",
60
- // traceFunction in tests is a passthrough — we just want the fn to run.
61
- traceFunction: async ({ fn }) => {
62
- return await fn();
63
- },
64
- };
65
- });
66
- // ---------------------------------------------------------------------------
67
- // Test fixtures
68
- // ---------------------------------------------------------------------------
69
- const TARGET_CLI_VERSION = "2.1.0"; // newer than the mocked current 2.0.0
70
- const TARGET_LIBRARY_VERSION = "1.9.0";
71
- const mockLockService = {
72
- shutdown: vi.fn(async () => undefined),
73
- };
74
- const mockConfig = {
75
- id: "app-123",
76
- branchName: "main",
77
- superblocksBaseUrl: "https://example.test",
78
- token: "test-token",
79
- userId: "user-1",
80
- userEmail: "test@example.com",
81
- organizationId: "org-1",
82
- featureFlags: {},
83
- };
84
- beforeEach(() => {
85
- vi.clearAllMocks();
86
- upgradeWithPackageManagerCalls.length = 0;
87
- // Mock global fetch used by getRemoteVersions
88
- global.fetch = vi.fn(async () => ({
89
- ok: true,
90
- json: async () => ({
91
- data: {
92
- cli: TARGET_CLI_VERSION,
93
- library: TARGET_LIBRARY_VERSION,
94
- },
95
- }),
96
- }));
97
- // Default package.json content
98
- vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify({
99
- name: "test-app",
100
- dependencies: {
101
- "@superblocksteam/library": "1.0.0",
102
- },
103
- }));
104
- vi.mocked(fs.writeFile).mockResolvedValue(undefined);
105
- });
106
- // ---------------------------------------------------------------------------
107
- // Tests
108
- // ---------------------------------------------------------------------------
109
- describe("checkVersionsAndWritePackageJson", () => {
110
- describe("skipCliUpgrade=true (warm pool activation)", () => {
111
- it("still writes package.json with the target library version", async () => {
112
- await checkVersionsAndWritePackageJson(mockLockService, mockConfig, false, // forceUpgrade
113
- true);
114
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
115
- const [, writtenContent] = vi.mocked(fs.writeFile).mock.calls[0];
116
- const parsed = JSON.parse(writtenContent);
117
- expect(parsed.dependencies["@superblocksteam/library"]).toBe(TARGET_LIBRARY_VERSION);
118
- });
119
- it("does NOT call the oclif CLI upgrader even when CLI is stale", async () => {
120
- const { exec } = await import("node:child_process");
121
- // If an upgrade were attempted, upgradeCliWithOclif would exec
122
- // `which superblocks`. We assert that does not happen.
123
- await checkVersionsAndWritePackageJson(mockLockService, mockConfig, false, true);
124
- expect(exec).not.toHaveBeenCalled();
125
- });
126
- it("returns cliUpdated=false regardless of CLI version gap", async () => {
127
- const result = await checkVersionsAndWritePackageJson(mockLockService, mockConfig, false, true);
128
- expect(result.cliUpdated).toBe(false);
129
- });
130
- it("skipCliUpgrade overrides forceUpgrade", async () => {
131
- const { exec } = await import("node:child_process");
132
- await checkVersionsAndWritePackageJson(mockLockService, mockConfig, true, // forceUpgrade — should be overridden by skipCliUpgrade
133
- true);
134
- expect(exec).not.toHaveBeenCalled();
135
- // But package.json still gets written
136
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
137
- });
138
- });
139
- describe("skipCliUpgrade=false (default)", () => {
140
- it("writes package.json with the target library version", async () => {
141
- await checkVersionsAndWritePackageJson(mockLockService, mockConfig, false, false);
142
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
143
- const [, writtenContent] = vi.mocked(fs.writeFile).mock.calls[0];
144
- const parsed = JSON.parse(writtenContent);
145
- expect(parsed.dependencies["@superblocksteam/library"]).toBe(TARGET_LIBRARY_VERSION);
146
- });
147
- it("defaults to false when omitted (backward compat)", async () => {
148
- // 3-arg call (pre-warm-pool signature) should behave as skipCliUpgrade=false
149
- const result = await checkVersionsAndWritePackageJson(mockLockService, mockConfig, false);
150
- // Still writes package.json
151
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
152
- expect(result).toBeDefined();
153
- });
154
- });
155
- describe("SNAPSHOT library versions", () => {
156
- it("pins to ephemeral alias when library target is a SNAPSHOT", async () => {
157
- const snapshotVersion = "1.9.0-SNAPSHOT.abc123";
158
- global.fetch = vi.fn(async () => ({
159
- ok: true,
160
- json: async () => ({
161
- data: {
162
- cli: TARGET_CLI_VERSION,
163
- library: snapshotVersion,
164
- },
165
- }),
166
- }));
167
- await checkVersionsAndWritePackageJson(mockLockService, mockConfig, false, true);
168
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
169
- const [, writtenContent] = vi.mocked(fs.writeFile).mock.calls[0];
170
- const parsed = JSON.parse(writtenContent);
171
- expect(parsed.dependencies["@superblocksteam/library"]).toBe(`npm:@superblocksteam/library-ephemeral@${snapshotVersion}`);
172
- });
173
- });
174
- });
175
- //# sourceMappingURL=automatic-upgrades.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"automatic-upgrades.test.js","sourceRoot":"","sources":["../../src/cli-replacement/automatic-upgrades.test.ts"],"names":[],"mappings":"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"}
@@ -1,251 +0,0 @@
1
- /**
2
- * Tests for checkVersionsAndWritePackageJson, specifically around the
3
- * skipCliUpgrade parameter introduced for warm pool activation.
4
- *
5
- * Warm pods ship with the latest CLI, so an auto-upgrade would pointlessly
6
- * restart the process and defeat the warm pool. But we still need the
7
- * package.json version sync when resuming an existing app so the user's
8
- * @superblocksteam/library pin matches the target version.
9
- */
10
-
11
- import fs from "node:fs/promises";
12
-
13
- import { describe, it, expect, beforeEach, vi } from "vitest";
14
-
15
- import { checkVersionsAndWritePackageJson } from "./automatic-upgrades.js";
16
-
17
- // ---------------------------------------------------------------------------
18
- // Mocks
19
- // ---------------------------------------------------------------------------
20
-
21
- vi.mock("node:fs/promises", () => ({
22
- default: {
23
- readFile: vi.fn(),
24
- writeFile: vi.fn(),
25
- },
26
- }));
27
-
28
- vi.mock("node:child_process", () => ({
29
- exec: vi.fn(),
30
- }));
31
-
32
- const upgradeWithPackageManagerCalls: unknown[] = [];
33
- vi.mock("package-manager-detector/detect", () => ({
34
- detect: vi.fn(async () => ({
35
- name: "pnpm",
36
- agent: "pnpm",
37
- version: "10.0.0",
38
- })),
39
- }));
40
-
41
- vi.mock("package-manager-detector", () => ({
42
- resolveCommand: vi.fn(() => ({ command: "pnpm", args: ["install"] })),
43
- }));
44
-
45
- vi.mock("./version-detection.js", () => ({
46
- getCurrentCliVersion: vi.fn(async () => ({
47
- version: "2.0.0",
48
- alias: undefined,
49
- })),
50
- clearCliVersionCache: vi.fn(),
51
- }));
52
-
53
- vi.mock("../telemetry/logging.js", () => ({
54
- getLogger: () => ({
55
- info: vi.fn(),
56
- warn: vi.fn(),
57
- error: vi.fn(),
58
- debug: vi.fn(),
59
- }),
60
- getErrorMeta: vi.fn(() => ({})),
61
- }));
62
-
63
- vi.mock("../telemetry/index.js", () => ({
64
- getTracer: () => ({
65
- startActiveSpan: vi.fn((_name, fn) => fn({ end: vi.fn() })),
66
- }),
67
- }));
68
-
69
- vi.mock("@superblocksteam/shared", async () => {
70
- return {
71
- NON_SB_ORG_UPDATE_ERROR: "non_sb_org_update_error",
72
- // traceFunction in tests is a passthrough — we just want the fn to run.
73
- traceFunction: async ({ fn }: { fn: () => Promise<unknown> }) => {
74
- return await fn();
75
- },
76
- };
77
- });
78
-
79
- // ---------------------------------------------------------------------------
80
- // Test fixtures
81
- // ---------------------------------------------------------------------------
82
-
83
- const TARGET_CLI_VERSION = "2.1.0"; // newer than the mocked current 2.0.0
84
- const TARGET_LIBRARY_VERSION = "1.9.0";
85
-
86
- const mockLockService = {
87
- shutdown: vi.fn(async () => undefined),
88
- } as unknown as Parameters<typeof checkVersionsAndWritePackageJson>[0];
89
-
90
- const mockConfig: Parameters<typeof checkVersionsAndWritePackageJson>[1] = {
91
- id: "app-123",
92
- branchName: "main",
93
- superblocksBaseUrl: "https://example.test",
94
- token: "test-token",
95
- userId: "user-1",
96
- userEmail: "test@example.com",
97
- organizationId: "org-1",
98
- featureFlags: {},
99
- } as unknown as Parameters<typeof checkVersionsAndWritePackageJson>[1];
100
-
101
- beforeEach(() => {
102
- vi.clearAllMocks();
103
- upgradeWithPackageManagerCalls.length = 0;
104
-
105
- // Mock global fetch used by getRemoteVersions
106
- global.fetch = vi.fn(async () => ({
107
- ok: true,
108
- json: async () => ({
109
- data: {
110
- cli: TARGET_CLI_VERSION,
111
- library: TARGET_LIBRARY_VERSION,
112
- },
113
- }),
114
- })) as unknown as typeof fetch;
115
-
116
- // Default package.json content
117
- vi.mocked(fs.readFile).mockResolvedValue(
118
- JSON.stringify({
119
- name: "test-app",
120
- dependencies: {
121
- "@superblocksteam/library": "1.0.0",
122
- },
123
- }),
124
- );
125
- vi.mocked(fs.writeFile).mockResolvedValue(undefined);
126
- });
127
-
128
- // ---------------------------------------------------------------------------
129
- // Tests
130
- // ---------------------------------------------------------------------------
131
-
132
- describe("checkVersionsAndWritePackageJson", () => {
133
- describe("skipCliUpgrade=true (warm pool activation)", () => {
134
- it("still writes package.json with the target library version", async () => {
135
- await checkVersionsAndWritePackageJson(
136
- mockLockService,
137
- mockConfig,
138
- false, // forceUpgrade
139
- true, // skipCliUpgrade — the warm pool case
140
- );
141
-
142
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
143
- const [, writtenContent] = vi.mocked(fs.writeFile).mock.calls[0];
144
- const parsed = JSON.parse(writtenContent as string);
145
- expect(parsed.dependencies["@superblocksteam/library"]).toBe(
146
- TARGET_LIBRARY_VERSION,
147
- );
148
- });
149
-
150
- it("does NOT call the oclif CLI upgrader even when CLI is stale", async () => {
151
- const { exec } = await import("node:child_process");
152
- // If an upgrade were attempted, upgradeCliWithOclif would exec
153
- // `which superblocks`. We assert that does not happen.
154
-
155
- await checkVersionsAndWritePackageJson(
156
- mockLockService,
157
- mockConfig,
158
- false,
159
- true,
160
- );
161
-
162
- expect(exec).not.toHaveBeenCalled();
163
- });
164
-
165
- it("returns cliUpdated=false regardless of CLI version gap", async () => {
166
- const result = await checkVersionsAndWritePackageJson(
167
- mockLockService,
168
- mockConfig,
169
- false,
170
- true,
171
- );
172
-
173
- expect(result.cliUpdated).toBe(false);
174
- });
175
-
176
- it("skipCliUpgrade overrides forceUpgrade", async () => {
177
- const { exec } = await import("node:child_process");
178
-
179
- await checkVersionsAndWritePackageJson(
180
- mockLockService,
181
- mockConfig,
182
- true, // forceUpgrade — should be overridden by skipCliUpgrade
183
- true, // skipCliUpgrade wins
184
- );
185
-
186
- expect(exec).not.toHaveBeenCalled();
187
- // But package.json still gets written
188
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
189
- });
190
- });
191
-
192
- describe("skipCliUpgrade=false (default)", () => {
193
- it("writes package.json with the target library version", async () => {
194
- await checkVersionsAndWritePackageJson(
195
- mockLockService,
196
- mockConfig,
197
- false,
198
- false,
199
- );
200
-
201
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
202
- const [, writtenContent] = vi.mocked(fs.writeFile).mock.calls[0];
203
- const parsed = JSON.parse(writtenContent as string);
204
- expect(parsed.dependencies["@superblocksteam/library"]).toBe(
205
- TARGET_LIBRARY_VERSION,
206
- );
207
- });
208
-
209
- it("defaults to false when omitted (backward compat)", async () => {
210
- // 3-arg call (pre-warm-pool signature) should behave as skipCliUpgrade=false
211
- const result = await checkVersionsAndWritePackageJson(
212
- mockLockService,
213
- mockConfig,
214
- false,
215
- );
216
-
217
- // Still writes package.json
218
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
219
- expect(result).toBeDefined();
220
- });
221
- });
222
-
223
- describe("SNAPSHOT library versions", () => {
224
- it("pins to ephemeral alias when library target is a SNAPSHOT", async () => {
225
- const snapshotVersion = "1.9.0-SNAPSHOT.abc123";
226
- global.fetch = vi.fn(async () => ({
227
- ok: true,
228
- json: async () => ({
229
- data: {
230
- cli: TARGET_CLI_VERSION,
231
- library: snapshotVersion,
232
- },
233
- }),
234
- })) as unknown as typeof fetch;
235
-
236
- await checkVersionsAndWritePackageJson(
237
- mockLockService,
238
- mockConfig,
239
- false,
240
- true, // warm pool
241
- );
242
-
243
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
244
- const [, writtenContent] = vi.mocked(fs.writeFile).mock.calls[0];
245
- const parsed = JSON.parse(writtenContent as string);
246
- expect(parsed.dependencies["@superblocksteam/library"]).toBe(
247
- `npm:@superblocksteam/library-ephemeral@${snapshotVersion}`,
248
- );
249
- });
250
- });
251
- });