@superblocksteam/sdk 2.0.118-next.0 → 2.0.118
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/dev.d.mts +0 -6
- package/dist/cli-replacement/dev.d.mts.map +1 -1
- package/dist/cli-replacement/dev.mjs +0 -1
- package/dist/cli-replacement/dev.mjs.map +1 -1
- package/dist/client.d.ts +6 -67
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +0 -94
- package/dist/client.js.map +1 -1
- package/dist/dev-utils/dev-server-persist.test.mjs +17 -117
- package/dist/dev-utils/dev-server-persist.test.mjs.map +1 -1
- package/dist/dev-utils/dev-server.d.mts +1 -19
- package/dist/dev-utils/dev-server.d.mts.map +1 -1
- package/dist/dev-utils/dev-server.mjs +28 -296
- package/dist/dev-utils/dev-server.mjs.map +1 -1
- package/dist/flag.d.ts +1 -1
- package/dist/flag.d.ts.map +1 -1
- package/dist/flag.js +3 -3
- package/dist/flag.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/sdk.d.ts +1 -8
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +1 -24
- package/dist/sdk.js.map +1 -1
- package/dist/sdk.test.js +1 -102
- package/dist/sdk.test.js.map +1 -1
- package/dist/telemetry/index.d.ts +1 -2
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +1 -8
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/logging.d.ts +2 -1
- package/dist/telemetry/logging.d.ts.map +1 -1
- package/dist/telemetry/logging.js +1 -1
- package/dist/telemetry/logging.js.map +1 -1
- package/dist/types/common.d.ts +1 -1
- package/dist/types/common.d.ts.map +1 -1
- package/dist/version-control.d.mts.map +1 -1
- package/dist/version-control.mjs +19 -14
- package/dist/version-control.mjs.map +1 -1
- package/eslint.config.js +0 -6
- package/package.json +8 -8
- package/src/cli-replacement/dev.mts +0 -8
- package/src/client.ts +6 -189
- package/src/dev-utils/dev-server-persist.test.mts +19 -170
- package/src/dev-utils/dev-server.mts +32 -366
- package/src/flag.ts +4 -4
- package/src/index.ts +1 -19
- package/src/sdk.test.ts +6 -145
- package/src/sdk.ts +0 -36
- package/src/telemetry/index.ts +1 -9
- package/src/telemetry/logging.ts +2 -2
- package/src/types/common.ts +1 -1
- package/src/version-control.mts +30 -11
- package/test/version-control.test.mts +2 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/turbo.json +0 -1
- package/dist/dev-utils/dedupe-async.d.ts +0 -16
- package/dist/dev-utils/dedupe-async.d.ts.map +0 -1
- package/dist/dev-utils/dedupe-async.js +0 -27
- package/dist/dev-utils/dedupe-async.js.map +0 -1
- package/dist/dev-utils/dedupe-async.test.d.ts +0 -2
- package/dist/dev-utils/dedupe-async.test.d.ts.map +0 -1
- package/dist/dev-utils/dedupe-async.test.js +0 -120
- package/dist/dev-utils/dedupe-async.test.js.map +0 -1
- package/dist/dev-utils/dev-server-metrics.d.mts +0 -95
- package/dist/dev-utils/dev-server-metrics.d.mts.map +0 -1
- package/dist/dev-utils/dev-server-metrics.mjs +0 -193
- package/dist/dev-utils/dev-server-metrics.mjs.map +0 -1
- package/dist/telemetry/memory-metrics.d.ts +0 -3
- package/dist/telemetry/memory-metrics.d.ts.map +0 -1
- package/dist/telemetry/memory-metrics.js +0 -59
- package/dist/telemetry/memory-metrics.js.map +0 -1
- package/src/dev-utils/dedupe-async.test.ts +0 -151
- package/src/dev-utils/dedupe-async.ts +0 -45
- package/src/dev-utils/dev-server-metrics.mts +0 -252
- package/src/telemetry/memory-metrics.ts +0 -90
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import type * as NodeChildProcess from "node:child_process";
|
|
2
2
|
import { EventEmitter } from "node:events";
|
|
3
|
-
import { mkdirSync, mkdtempSync, rmSync } from "node:fs";
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import { join } from "node:path";
|
|
6
3
|
import { PassThrough } from "node:stream";
|
|
7
4
|
|
|
8
|
-
import {
|
|
5
|
+
import { describe, expect, it, vi } from "vitest";
|
|
9
6
|
|
|
10
7
|
const { spawnMock } = vi.hoisted(() => ({
|
|
11
8
|
spawnMock: vi.fn(),
|
|
@@ -25,14 +22,6 @@ vi.mock("node:child_process", async () => {
|
|
|
25
22
|
};
|
|
26
23
|
});
|
|
27
24
|
|
|
28
|
-
// Use a static import so the slow `dev-server.mjs` module graph (vite, react
|
|
29
|
-
// plugin, workspace deps) loads during file evaluation rather than inside each
|
|
30
|
-
// test, where the cold-import cost easily exceeds the default 5s test timeout.
|
|
31
|
-
import {
|
|
32
|
-
createWorkspacePersistArchive,
|
|
33
|
-
getSuperblocksTarExcludes,
|
|
34
|
-
} from "./dev-server.mjs";
|
|
35
|
-
|
|
36
25
|
function createMockProcess() {
|
|
37
26
|
return Object.assign(new EventEmitter(), {
|
|
38
27
|
stdin: new PassThrough(),
|
|
@@ -41,53 +30,8 @@ function createMockProcess() {
|
|
|
41
30
|
});
|
|
42
31
|
}
|
|
43
32
|
|
|
44
|
-
describe("getSuperblocksTarExcludes", () => {
|
|
45
|
-
let tempRoot: string;
|
|
46
|
-
|
|
47
|
-
beforeAll(() => {
|
|
48
|
-
tempRoot = mkdtempSync(join(tmpdir(), "persist-test-"));
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
afterAll(() => {
|
|
52
|
-
rmSync(tempRoot, { recursive: true, force: true });
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("excludes .superblocks entirely when the directory does not exist", () => {
|
|
56
|
-
const result = getSuperblocksTarExcludes(tempRoot);
|
|
57
|
-
expect(result).toEqual(["--exclude", ".superblocks"]);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it("excludes subdirs not in the safelist and keeps context/drafts", () => {
|
|
61
|
-
const sb = join(tempRoot, ".superblocks");
|
|
62
|
-
mkdirSync(sb);
|
|
63
|
-
mkdirSync(join(sb, "context"));
|
|
64
|
-
mkdirSync(join(sb, "drafts"));
|
|
65
|
-
mkdirSync(join(sb, "recordings"));
|
|
66
|
-
mkdirSync(join(sb, "scratch"));
|
|
67
|
-
mkdirSync(join(sb, "system-skills"));
|
|
68
|
-
|
|
69
|
-
const result = getSuperblocksTarExcludes(tempRoot);
|
|
70
|
-
|
|
71
|
-
// Safelisted dirs must NOT appear
|
|
72
|
-
expect(result).not.toContain(".superblocks/context");
|
|
73
|
-
expect(result).not.toContain(".superblocks/drafts");
|
|
74
|
-
|
|
75
|
-
// Non-safelisted dirs must be excluded
|
|
76
|
-
expect(result).toContain(".superblocks/recordings");
|
|
77
|
-
expect(result).toContain(".superblocks/scratch");
|
|
78
|
-
expect(result).toContain(".superblocks/system-skills");
|
|
79
|
-
|
|
80
|
-
// Each excluded dir has a preceding --exclude flag
|
|
81
|
-
for (const name of ["recordings", "scratch", "system-skills"]) {
|
|
82
|
-
const idx = result.indexOf(`.superblocks/${name}`);
|
|
83
|
-
expect(idx).toBeGreaterThan(0);
|
|
84
|
-
expect(result[idx - 1]).toBe("--exclude");
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
|
|
89
33
|
describe("createWorkspacePersistArchive", () => {
|
|
90
|
-
it("
|
|
34
|
+
it("excludes node_modules from the tar archive", async () => {
|
|
91
35
|
const tarProc = createMockProcess();
|
|
92
36
|
const zstdProc = createMockProcess();
|
|
93
37
|
spawnMock.mockImplementation((command: string) => {
|
|
@@ -103,17 +47,27 @@ describe("createWorkspacePersistArchive", () => {
|
|
|
103
47
|
return zstdProc;
|
|
104
48
|
});
|
|
105
49
|
|
|
50
|
+
const { createWorkspacePersistArchive } = await import("./dev-server.mjs");
|
|
51
|
+
|
|
106
52
|
await expect(createWorkspacePersistArchive("/workspace")).resolves.toEqual(
|
|
107
53
|
Buffer.from("archive"),
|
|
108
54
|
);
|
|
109
55
|
|
|
110
56
|
const tarCall = spawnMock.mock.calls.find(([command]) => command === "tar");
|
|
111
57
|
expect(tarCall).toBeDefined();
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
58
|
+
expect(tarCall?.[1]).toEqual([
|
|
59
|
+
"cf",
|
|
60
|
+
"-",
|
|
61
|
+
"--exclude",
|
|
62
|
+
".git",
|
|
63
|
+
"--exclude",
|
|
64
|
+
"node_modules",
|
|
65
|
+
"--exclude",
|
|
66
|
+
".superblocks",
|
|
67
|
+
"-C",
|
|
68
|
+
"/workspace",
|
|
69
|
+
".",
|
|
70
|
+
]);
|
|
117
71
|
});
|
|
118
72
|
|
|
119
73
|
it("rejects if tar fails after zstd closes successfully", async () => {
|
|
@@ -133,115 +87,10 @@ describe("createWorkspacePersistArchive", () => {
|
|
|
133
87
|
return zstdProc;
|
|
134
88
|
});
|
|
135
89
|
|
|
90
|
+
const { createWorkspacePersistArchive } = await import("./dev-server.mjs");
|
|
91
|
+
|
|
136
92
|
await expect(
|
|
137
93
|
createWorkspacePersistArchive("/workspace"),
|
|
138
94
|
).rejects.toThrowError(/^tar archival failed \(code 2\): tar failed$/);
|
|
139
95
|
});
|
|
140
96
|
});
|
|
141
|
-
|
|
142
|
-
describe("createWorkspacePersistUploadHeaders", () => {
|
|
143
|
-
it("forwards presigned upload headers and adds the archive content length", async () => {
|
|
144
|
-
const { createWorkspacePersistUploadHeaders } =
|
|
145
|
-
await import("./dev-server.mjs");
|
|
146
|
-
|
|
147
|
-
expect(
|
|
148
|
-
createWorkspacePersistUploadHeaders(123, {
|
|
149
|
-
"Content-Type": "application/custom-zstd",
|
|
150
|
-
"x-amz-server-side-encryption": "AES256",
|
|
151
|
-
}),
|
|
152
|
-
).toEqual({
|
|
153
|
-
"content-length": "123",
|
|
154
|
-
"content-type": "application/custom-zstd",
|
|
155
|
-
"x-amz-server-side-encryption": "AES256",
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it("normalizes presigned upload header names case-insensitively", async () => {
|
|
160
|
-
const { createWorkspacePersistUploadHeaders } =
|
|
161
|
-
await import("./dev-server.mjs");
|
|
162
|
-
|
|
163
|
-
expect(
|
|
164
|
-
createWorkspacePersistUploadHeaders(789, {
|
|
165
|
-
"content-type": "application/custom-zstd",
|
|
166
|
-
"content-length": "1",
|
|
167
|
-
"x-amz-server-side-encryption": "AES256",
|
|
168
|
-
}),
|
|
169
|
-
).toEqual({
|
|
170
|
-
"content-length": "789",
|
|
171
|
-
"content-type": "application/custom-zstd",
|
|
172
|
-
"x-amz-server-side-encryption": "AES256",
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
it("keeps the legacy content headers when SABS sends only a URL", async () => {
|
|
177
|
-
const { createWorkspacePersistUploadHeaders } =
|
|
178
|
-
await import("./dev-server.mjs");
|
|
179
|
-
|
|
180
|
-
expect(createWorkspacePersistUploadHeaders(456)).toEqual({
|
|
181
|
-
"content-length": "456",
|
|
182
|
-
"content-type": "application/zstd",
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
describe("isWorkspacePersistUploadHeaders", () => {
|
|
188
|
-
it("accepts undefined (legacy SABS payloads with no uploadHeaders)", async () => {
|
|
189
|
-
const { isWorkspacePersistUploadHeaders } =
|
|
190
|
-
await import("./dev-server.mjs");
|
|
191
|
-
|
|
192
|
-
expect(isWorkspacePersistUploadHeaders(undefined)).toBe(true);
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
it("accepts a valid string map", async () => {
|
|
196
|
-
const { isWorkspacePersistUploadHeaders } =
|
|
197
|
-
await import("./dev-server.mjs");
|
|
198
|
-
|
|
199
|
-
expect(
|
|
200
|
-
isWorkspacePersistUploadHeaders({
|
|
201
|
-
"content-type": "application/zstd",
|
|
202
|
-
"x-amz-server-side-encryption": "AES256",
|
|
203
|
-
}),
|
|
204
|
-
).toBe(true);
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
it("rejects null, arrays, and non-string values", async () => {
|
|
208
|
-
const { isWorkspacePersistUploadHeaders } =
|
|
209
|
-
await import("./dev-server.mjs");
|
|
210
|
-
|
|
211
|
-
expect(isWorkspacePersistUploadHeaders(null)).toBe(false);
|
|
212
|
-
expect(isWorkspacePersistUploadHeaders([])).toBe(false);
|
|
213
|
-
expect(isWorkspacePersistUploadHeaders({ "x-foo": 1 })).toBe(false);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
it("rejects case-insensitive duplicate keys", async () => {
|
|
217
|
-
const { isWorkspacePersistUploadHeaders } =
|
|
218
|
-
await import("./dev-server.mjs");
|
|
219
|
-
|
|
220
|
-
expect(
|
|
221
|
-
isWorkspacePersistUploadHeaders({
|
|
222
|
-
"Content-Type": "application/zstd",
|
|
223
|
-
"content-type": "application/custom-zstd",
|
|
224
|
-
}),
|
|
225
|
-
).toBe(false);
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
it("rejects header names with illegal characters", async () => {
|
|
229
|
-
const { isWorkspacePersistUploadHeaders } =
|
|
230
|
-
await import("./dev-server.mjs");
|
|
231
|
-
|
|
232
|
-
// Spaces are not allowed in HTTP token names.
|
|
233
|
-
expect(isWorkspacePersistUploadHeaders({ "bad header": "value" })).toBe(
|
|
234
|
-
false,
|
|
235
|
-
);
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it("rejects header values with illegal characters", async () => {
|
|
239
|
-
const { isWorkspacePersistUploadHeaders } =
|
|
240
|
-
await import("./dev-server.mjs");
|
|
241
|
-
|
|
242
|
-
// CR/LF in header values is not allowed (header injection guard).
|
|
243
|
-
expect(isWorkspacePersistUploadHeaders({ "x-foo": "bad\r\nvalue" })).toBe(
|
|
244
|
-
false,
|
|
245
|
-
);
|
|
246
|
-
});
|
|
247
|
-
});
|