supercov 0.0.2 → 0.0.3

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.
Files changed (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -20
  3. package/bin/supercov.js +10 -0
  4. package/dist/atomic.d.ts +6 -0
  5. package/dist/atomic.d.ts.map +1 -0
  6. package/dist/atomic.js +47 -0
  7. package/dist/atomic.js.map +1 -0
  8. package/dist/cli.js +431 -214
  9. package/dist/cli.js.map +1 -1
  10. package/dist/directInstrumenter.d.ts +8 -0
  11. package/dist/directInstrumenter.d.ts.map +1 -0
  12. package/dist/directInstrumenter.js +70 -0
  13. package/dist/directInstrumenter.js.map +1 -0
  14. package/dist/instrumenter.d.ts.map +1 -1
  15. package/dist/instrumenter.js +251 -41
  16. package/dist/instrumenter.js.map +1 -1
  17. package/dist/integrity.d.ts.map +1 -1
  18. package/dist/integrity.js +27 -0
  19. package/dist/integrity.js.map +1 -1
  20. package/dist/launchSupervisor.d.ts +24 -0
  21. package/dist/launchSupervisor.d.ts.map +1 -0
  22. package/dist/launchSupervisor.js +397 -0
  23. package/dist/launchSupervisor.js.map +1 -0
  24. package/dist/playwright.d.ts +0 -4
  25. package/dist/playwright.d.ts.map +1 -1
  26. package/dist/playwright.js +33 -17
  27. package/dist/playwright.js.map +1 -1
  28. package/dist/playwrightReporter.d.ts.map +1 -1
  29. package/dist/playwrightReporter.js +3 -2
  30. package/dist/playwrightReporter.js.map +1 -1
  31. package/dist/project.d.ts +5 -2
  32. package/dist/project.d.ts.map +1 -1
  33. package/dist/project.js +192 -27
  34. package/dist/project.js.map +1 -1
  35. package/dist/query.d.ts.map +1 -1
  36. package/dist/query.js +1 -0
  37. package/dist/query.js.map +1 -1
  38. package/dist/register.mjs +18 -13
  39. package/dist/register.mjs.map +1 -1
  40. package/dist/reporter.d.ts +4 -1
  41. package/dist/reporter.d.ts.map +1 -1
  42. package/dist/reporter.js +13 -11
  43. package/dist/reporter.js.map +1 -1
  44. package/dist/resolve-loader.d.mts.map +1 -1
  45. package/dist/resolve-loader.mjs +11 -3
  46. package/dist/resolve-loader.mjs.map +1 -1
  47. package/dist/runtime.d.ts +2 -2
  48. package/dist/runtime.d.ts.map +1 -1
  49. package/dist/runtime.js +35 -7
  50. package/dist/runtime.js.map +1 -1
  51. package/dist/transport.d.ts +2 -0
  52. package/dist/transport.d.ts.map +1 -1
  53. package/dist/transport.js +2 -0
  54. package/dist/transport.js.map +1 -1
  55. package/dist/types.d.ts +2 -1
  56. package/dist/types.d.ts.map +1 -1
  57. package/dist/vitePlugin.d.ts.map +1 -1
  58. package/dist/vitePlugin.js +4 -3
  59. package/dist/vitePlugin.js.map +1 -1
  60. package/dist/vitest.js +3 -2
  61. package/dist/vitest.js.map +1 -1
  62. package/dist/vitestReporter.d.ts +17 -2
  63. package/dist/vitestReporter.d.ts.map +1 -1
  64. package/dist/vitestReporter.js +51 -2
  65. package/dist/vitestReporter.js.map +1 -1
  66. package/dist/workspace.d.ts +46 -0
  67. package/dist/workspace.d.ts.map +1 -0
  68. package/dist/workspace.js +284 -0
  69. package/dist/workspace.js.map +1 -0
  70. package/package.json +19 -5
@@ -0,0 +1,284 @@
1
+ import { copyFileSync, constants, existsSync, lstatSync, mkdirSync, openSync, closeSync, fsyncSync, readFileSync, readdirSync, readlinkSync, rmSync, symlinkSync, statSync, writeFileSync, } from "node:fs";
2
+ import { basename, dirname, relative, resolve, sep } from "node:path";
3
+ import { atomicWriteFileSync } from "./atomic.js";
4
+ const TERMINAL = new Set([
5
+ "complete",
6
+ "failed",
7
+ "interrupted",
8
+ "abandoned",
9
+ ]);
10
+ const ROOT_EXCLUSIONS = new Set([
11
+ ".git",
12
+ ".supercov",
13
+ ".mcdc-pool",
14
+ "node_modules",
15
+ "build",
16
+ "dist",
17
+ ".next",
18
+ ".nuxt",
19
+ ".output",
20
+ "coverage",
21
+ "playwright-report",
22
+ "test-results",
23
+ ]);
24
+ function processExists(pid) {
25
+ if (!Number.isSafeInteger(pid) || pid <= 0)
26
+ return false;
27
+ try {
28
+ process.kill(pid, 0);
29
+ return true;
30
+ }
31
+ catch (error) {
32
+ return error.code === "EPERM";
33
+ }
34
+ }
35
+ function readJson(path) {
36
+ try {
37
+ return JSON.parse(readFileSync(path, "utf8"));
38
+ }
39
+ catch {
40
+ return undefined;
41
+ }
42
+ }
43
+ function statePath(root, runId) {
44
+ return resolve(root, ".supercov/work", runId, "state.json");
45
+ }
46
+ export function isolatedWorkspacePath(root, runId) {
47
+ return resolve(root, ".supercov/work", runId, basename(root));
48
+ }
49
+ /**
50
+ * Stable isolated namespace used as a live mount by VM/container runners.
51
+ * Its path must remain stable so providers whose snapshot key includes mount
52
+ * paths can reuse an instrumented snapshot across equivalent coverage runs.
53
+ * The project lock makes refreshes single-writer.
54
+ */
55
+ export function cachedWorkspacePath(root) {
56
+ return resolve(root, ".supercov/cache/instrumented-workspace", basename(root));
57
+ }
58
+ export function writeRunState(root, runId, state) {
59
+ const complete = { ...state, updatedAt: new Date().toISOString() };
60
+ atomicWriteFileSync(statePath(root, runId), `${JSON.stringify(complete, null, 2)}\n`);
61
+ return complete;
62
+ }
63
+ export function updateRunState(root, runId, update) {
64
+ const current = readJson(statePath(root, runId));
65
+ if (!current)
66
+ throw new Error(`Run state is missing for ${runId}`);
67
+ const next = {
68
+ ...current,
69
+ ...update,
70
+ updatedAt: new Date().toISOString(),
71
+ };
72
+ atomicWriteFileSync(statePath(root, runId), `${JSON.stringify(next, null, 2)}\n`);
73
+ return next;
74
+ }
75
+ /** Mark dead runs abandoned and remove only their isolated workspace copy. */
76
+ export function recoverAbandonedRuns(root) {
77
+ const workRoot = resolve(root, ".supercov/work");
78
+ if (!existsSync(workRoot))
79
+ return [];
80
+ const recovered = [];
81
+ for (const entry of readdirSync(workRoot, { withFileTypes: true })) {
82
+ if (!entry.isDirectory())
83
+ continue;
84
+ const path = statePath(root, entry.name);
85
+ const state = readJson(path);
86
+ if (!state || TERMINAL.has(state.status) || processExists(state.pid))
87
+ continue;
88
+ // Never trust a persisted path as a deletion target. A partially written
89
+ // or manually edited state file cannot widen cleanup beyond this run's
90
+ // deterministic workspace namespace.
91
+ rmSync(isolatedWorkspacePath(root, entry.name), {
92
+ recursive: true,
93
+ force: true,
94
+ });
95
+ rmSync(resolve(root, ".supercov/work", entry.name, "report-publication"), {
96
+ recursive: true,
97
+ force: true,
98
+ });
99
+ const publishedRun = readJson(resolve(root, ".supercov/runs", entry.name, "run.json"));
100
+ if (publishedRun?.id === entry.name) {
101
+ // The report directory is published by one atomic rename before the run
102
+ // state flips terminal. A kill in that tiny window must recover the
103
+ // already complete run rather than discard or mislabel it.
104
+ updateRunState(root, entry.name, { status: "complete" });
105
+ }
106
+ else {
107
+ // Evidence moved out of the disposable workspace before report
108
+ // generation is not a visible run. Remove that orphan on recovery so a
109
+ // hard kill cannot accumulate partial run data indefinitely.
110
+ rmSync(resolve(root, ".supercov/evidence", entry.name), {
111
+ recursive: true,
112
+ force: true,
113
+ });
114
+ updateRunState(root, entry.name, {
115
+ status: "abandoned",
116
+ error: `Recovered after process ${state.pid} exited without cleanup`,
117
+ });
118
+ }
119
+ recovered.push(entry.name);
120
+ }
121
+ return recovered.sort();
122
+ }
123
+ export function acquireProjectLock(root, runId) {
124
+ const lockPath = resolve(root, ".supercov/locks/active.json");
125
+ mkdirSync(dirname(lockPath), { recursive: true });
126
+ for (let attempt = 0; attempt < 2; attempt += 1) {
127
+ let descriptor;
128
+ try {
129
+ descriptor = openSync(lockPath, "wx", 0o600);
130
+ const payload = `${JSON.stringify({ runId, pid: process.pid, startedAt: new Date().toISOString() }, null, 2)}\n`;
131
+ writeFileSync(descriptor, payload);
132
+ fsyncSync(descriptor);
133
+ closeSync(descriptor);
134
+ descriptor = undefined;
135
+ let released = false;
136
+ return {
137
+ path: lockPath,
138
+ release() {
139
+ if (released)
140
+ return;
141
+ released = true;
142
+ const owner = readJson(lockPath);
143
+ if (owner?.runId === runId && owner.pid === process.pid)
144
+ rmSync(lockPath, { force: true });
145
+ },
146
+ };
147
+ }
148
+ catch (error) {
149
+ if (descriptor !== undefined)
150
+ closeSync(descriptor);
151
+ const failure = error;
152
+ if (failure.code !== "EEXIST")
153
+ throw error;
154
+ const owner = readJson(lockPath);
155
+ if (owner?.pid && processExists(owner.pid)) {
156
+ throw new Error(`Coverage run ${owner.runId ?? "unknown"} is already active in this project (pid ${owner.pid})`);
157
+ }
158
+ if (!owner) {
159
+ const ageMs = Date.now() - statSync(lockPath).mtimeMs;
160
+ if (ageMs < 30_000)
161
+ throw new Error("A coverage run is currently acquiring the project lock");
162
+ }
163
+ rmSync(lockPath, { force: true });
164
+ }
165
+ }
166
+ throw new Error("Could not acquire the Supercov project lock");
167
+ }
168
+ function copyTree(source, destination, root = false) {
169
+ mkdirSync(destination, { recursive: true });
170
+ for (const entry of readdirSync(source, { withFileTypes: true })) {
171
+ if (root && ROOT_EXCLUSIONS.has(entry.name))
172
+ continue;
173
+ const from = resolve(source, entry.name);
174
+ const to = resolve(destination, entry.name);
175
+ const stat = lstatSync(from);
176
+ if (stat.isDirectory())
177
+ copyTree(from, to);
178
+ else if (stat.isSymbolicLink())
179
+ symlinkSync(readlinkSync(from), to, process.platform === "win32" ? "junction" : undefined);
180
+ else if (stat.isFile())
181
+ copyFileSync(from, to, constants.COPYFILE_FICLONE);
182
+ }
183
+ }
184
+ /** Create a copy-on-write project snapshot whose build outputs are disposable. */
185
+ export function prepareIsolatedWorkspace(root, runId) {
186
+ const workspace = isolatedWorkspacePath(root, runId);
187
+ rmSync(workspace, { recursive: true, force: true });
188
+ copyTree(root, workspace, true);
189
+ const nodeModules = resolve(root, "node_modules");
190
+ if (existsSync(nodeModules)) {
191
+ // Keep the node_modules mount point itself as a real directory. VM-based
192
+ // runners commonly layer a Linux dependency cache onto the mounted
193
+ // workspace's node_modules path;
194
+ // making the mount point an external symlink causes virtio-fs's safe
195
+ // `opaque` policy to reject LOOKUP with EACCES before the nested mount can
196
+ // be attached. Per-entry links still give host-side builds zero-copy
197
+ // access to the user's installed dependencies and are hidden by the VM's
198
+ // nested mount.
199
+ const isolatedNodeModules = resolve(workspace, "node_modules");
200
+ mkdirSync(isolatedNodeModules, { recursive: true });
201
+ for (const entry of readdirSync(nodeModules, { withFileTypes: true })) {
202
+ const target = resolve(nodeModules, entry.name);
203
+ symlinkSync(target, resolve(isolatedNodeModules, entry.name), process.platform === "win32"
204
+ ? entry.isDirectory()
205
+ ? "junction"
206
+ : "file"
207
+ : undefined);
208
+ }
209
+ }
210
+ return workspace;
211
+ }
212
+ /** Refresh the stable, disposable instrumented-build namespace. */
213
+ export function prepareCachedWorkspace(root) {
214
+ const workspace = cachedWorkspacePath(root);
215
+ rmSync(workspace, { recursive: true, force: true });
216
+ copyTree(root, workspace, true);
217
+ const nodeModules = resolve(root, "node_modules");
218
+ if (existsSync(nodeModules)) {
219
+ const isolatedNodeModules = resolve(workspace, "node_modules");
220
+ mkdirSync(isolatedNodeModules, { recursive: true });
221
+ for (const entry of readdirSync(nodeModules, { withFileTypes: true })) {
222
+ symlinkSync(resolve(nodeModules, entry.name), resolve(isolatedNodeModules, entry.name), process.platform === "win32"
223
+ ? entry.isDirectory()
224
+ ? "junction"
225
+ : "file"
226
+ : undefined);
227
+ }
228
+ }
229
+ return workspace;
230
+ }
231
+ export function removeIsolatedWorkspace(root, runId) {
232
+ const workspace = isolatedWorkspacePath(root, runId);
233
+ const relativePath = relative(resolve(root, ".supercov/work"), workspace);
234
+ if (relativePath.startsWith("..") || relativePath.split(sep).length < 2) {
235
+ throw new Error(`Refusing to remove unexpected workspace path: ${workspace}`);
236
+ }
237
+ rmSync(workspace, { recursive: true, force: true });
238
+ }
239
+ /** Deterministic retention: IDs sort newest-first because run IDs are UTC. */
240
+ export function cleanCoverageStorage(root, options) {
241
+ recoverAbandonedRuns(root);
242
+ const bases = ["runs", "work", "evidence"].map((name) => resolve(root, ".supercov", name));
243
+ const ids = new Set();
244
+ for (const base of bases) {
245
+ if (!existsSync(base))
246
+ continue;
247
+ for (const entry of readdirSync(base, { withFileTypes: true }))
248
+ if (entry.isDirectory())
249
+ ids.add(entry.name);
250
+ }
251
+ const ordered = [...ids].sort((left, right) => right.localeCompare(left));
252
+ const active = new Set(ordered.filter((id) => {
253
+ const state = readJson(resolve(root, ".supercov/work", id, "state.json"));
254
+ return Boolean(state && !TERMINAL.has(state.status));
255
+ }));
256
+ const retained = new Set(ordered.filter((id) => !active.has(id)).slice(0, Math.max(0, options.keep)));
257
+ const removedRuns = [];
258
+ const removedWorkspaces = [];
259
+ for (const id of ordered) {
260
+ const work = resolve(root, ".supercov/work", id);
261
+ const state = readJson(resolve(work, "state.json"));
262
+ const workspace = isolatedWorkspacePath(root, id);
263
+ if (active.has(id))
264
+ continue;
265
+ if (existsSync(workspace) && (!state || TERMINAL.has(state.status))) {
266
+ removedWorkspaces.push(id);
267
+ if (!options.dryRun)
268
+ rmSync(workspace, { recursive: true, force: true });
269
+ }
270
+ if (retained.has(id))
271
+ continue;
272
+ removedRuns.push(id);
273
+ if (!options.dryRun) {
274
+ for (const base of bases)
275
+ rmSync(resolve(base, id), { recursive: true, force: true });
276
+ }
277
+ }
278
+ const buildCache = resolve(root, ".supercov/cache/instrumented-workspace");
279
+ const removedBuildCache = active.size === 0 && existsSync(buildCache);
280
+ if (removedBuildCache && !options.dryRun)
281
+ rmSync(buildCache, { recursive: true, force: true });
282
+ return { removedRuns, removedWorkspaces, removedBuildCache };
283
+ }
284
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "supercov",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Zero-edit, runner-aware coverage completeness for JavaScript test suites",
5
+ "license": "MIT",
5
6
  "repository": {
6
7
  "type": "git",
7
8
  "url": "https://github.com/supercorp-ai/supercov.git"
@@ -35,10 +36,16 @@
35
36
  "build": "tsc -p tsconfig.build.json",
36
37
  "test": "vitest run tests/unit",
37
38
  "test:types": "tsc --noEmit",
38
- "test:fixture": "npm run build && npm --prefix tests/fixtures/generic-playwright run test:coverage",
39
+ "test:fixture": "npm run build && npm --prefix tests/fixtures/generic-playwright run test:coverage && node scripts/opaque-runner-integration.mjs",
40
+ "test:packed-npx": "node scripts/packed-npx-integration.mjs",
41
+ "test:isolation": "npm run build && node scripts/isolation-integration.mjs",
42
+ "test:clang-mcdc": "node scripts/clang-mcdc-oracle.mjs",
43
+ "test:test262": "npm run build && node scripts/test262-equivalence.mjs",
44
+ "benchmark:check": "npm run build && node scripts/benchmark.mjs",
39
45
  "check": "npm run test && npm run test:types",
46
+ "release:check": "npm run check && npm run build && node scripts/isolation-integration.mjs && npm run test:packed-npx && npm run test:clang-mcdc && node scripts/benchmark.mjs",
40
47
  "prepack": "npm run build",
41
- "prepublishOnly": "npm run check"
48
+ "prepublishOnly": "npm run release:check"
42
49
  },
43
50
  "dependencies": {
44
51
  "@babel/generator": "^8.0.0",
@@ -47,7 +54,7 @@
47
54
  "@babel/types": "^8.0.4"
48
55
  },
49
56
  "peerDependencies": {
50
- "@playwright/test": ">=1.50.0",
57
+ "@playwright/test": ">=1.55.0",
51
58
  "vite": ">=5.0.0",
52
59
  "vitest": ">=2.0.0"
53
60
  },
@@ -55,6 +62,9 @@
55
62
  "@playwright/test": {
56
63
  "optional": true
57
64
  },
65
+ "vite": {
66
+ "optional": true
67
+ },
58
68
  "vitest": {
59
69
  "optional": true
60
70
  }
@@ -62,8 +72,12 @@
62
72
  "devDependencies": {
63
73
  "@playwright/test": "1.62.1",
64
74
  "@types/node": "^24.0.0",
75
+ "fast-check": "^4.9.0",
76
+ "test262-harness": "^10.0.0",
65
77
  "typescript": "7.0.2",
66
78
  "vite": "8.2.2",
67
- "vitest": "4.1.11"
79
+ "vitest": "4.1.11",
80
+ "ws": "^8.21.3",
81
+ "yaml": "^2.9.0"
68
82
  }
69
83
  }