supercov 0.0.9 → 0.0.12

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 (156) hide show
  1. package/README.md +28 -23
  2. package/bin/native.js +87 -0
  3. package/bin/supercov.js +10 -4
  4. package/package.json +39 -25
  5. package/{dist → runtime/javascript}/atomic.js +0 -1
  6. package/{dist → runtime/javascript}/launchSupervisor.js +3 -1
  7. package/{dist → runtime/javascript}/nodeAssert.js +0 -1
  8. package/{dist → runtime/javascript}/nodeAssertAdapter.js +0 -1
  9. package/{dist → runtime/javascript}/nodeAssertStrict.js +0 -1
  10. package/{dist → runtime/javascript}/nodeTest.js +13 -5
  11. package/{dist → runtime/javascript}/playwright.js +177 -90
  12. package/{dist → runtime/javascript}/playwrightReporter.js +0 -1
  13. package/{dist → runtime/javascript}/provenance.js +0 -1
  14. package/{dist → runtime/javascript}/register.mjs +52 -1
  15. package/{dist → runtime/javascript}/resolve-loader.mjs +0 -36
  16. package/{dist → runtime/javascript}/runnerEvidence.js +6 -5
  17. package/{dist → runtime/javascript}/runtime.js +308 -27
  18. package/{dist → runtime/javascript}/transport.js +2 -3
  19. package/{dist → runtime/javascript}/vitest.js +38 -8
  20. package/{dist → runtime/javascript}/vitestReporter.js +0 -1
  21. package/dist/agentJson.d.ts +0 -44
  22. package/dist/agentJson.d.ts.map +0 -1
  23. package/dist/agentJson.js +0 -84
  24. package/dist/agentJson.js.map +0 -1
  25. package/dist/analyze.d.ts +0 -12
  26. package/dist/analyze.d.ts.map +0 -1
  27. package/dist/analyze.js +0 -699
  28. package/dist/analyze.js.map +0 -1
  29. package/dist/atomic.d.ts +0 -6
  30. package/dist/atomic.d.ts.map +0 -1
  31. package/dist/atomic.js.map +0 -1
  32. package/dist/buildCache.d.ts +0 -14
  33. package/dist/buildCache.d.ts.map +0 -1
  34. package/dist/buildCache.js +0 -84
  35. package/dist/buildCache.js.map +0 -1
  36. package/dist/cli.d.ts +0 -2
  37. package/dist/cli.d.ts.map +0 -1
  38. package/dist/cli.js +0 -706
  39. package/dist/cli.js.map +0 -1
  40. package/dist/directInstrumenter.d.ts +0 -8
  41. package/dist/directInstrumenter.d.ts.map +0 -1
  42. package/dist/directInstrumenter.js +0 -92
  43. package/dist/directInstrumenter.js.map +0 -1
  44. package/dist/esmInterceptor.d.ts +0 -6
  45. package/dist/esmInterceptor.d.ts.map +0 -1
  46. package/dist/esmInterceptor.js +0 -63
  47. package/dist/esmInterceptor.js.map +0 -1
  48. package/dist/evidenceArchive.d.ts +0 -37
  49. package/dist/evidenceArchive.d.ts.map +0 -1
  50. package/dist/evidenceArchive.js +0 -110
  51. package/dist/evidenceArchive.js.map +0 -1
  52. package/dist/instrumenter.d.ts +0 -11
  53. package/dist/instrumenter.d.ts.map +0 -1
  54. package/dist/instrumenter.js +0 -1246
  55. package/dist/instrumenter.js.map +0 -1
  56. package/dist/integrity.d.ts +0 -10
  57. package/dist/integrity.d.ts.map +0 -1
  58. package/dist/integrity.js +0 -205
  59. package/dist/integrity.js.map +0 -1
  60. package/dist/launchSupervisor.d.ts +0 -38
  61. package/dist/launchSupervisor.d.ts.map +0 -1
  62. package/dist/launchSupervisor.js.map +0 -1
  63. package/dist/merge.d.ts +0 -2
  64. package/dist/merge.d.ts.map +0 -1
  65. package/dist/merge.js +0 -116
  66. package/dist/merge.js.map +0 -1
  67. package/dist/nodeAssert.d.ts +0 -31
  68. package/dist/nodeAssert.d.ts.map +0 -1
  69. package/dist/nodeAssert.js.map +0 -1
  70. package/dist/nodeAssertAdapter.d.ts +0 -6
  71. package/dist/nodeAssertAdapter.d.ts.map +0 -1
  72. package/dist/nodeAssertAdapter.js.map +0 -1
  73. package/dist/nodeAssertStrict.d.ts +0 -31
  74. package/dist/nodeAssertStrict.d.ts.map +0 -1
  75. package/dist/nodeAssertStrict.js.map +0 -1
  76. package/dist/nodeAssertionInstrumenter.d.ts +0 -8
  77. package/dist/nodeAssertionInstrumenter.d.ts.map +0 -1
  78. package/dist/nodeAssertionInstrumenter.js +0 -263
  79. package/dist/nodeAssertionInstrumenter.js.map +0 -1
  80. package/dist/nodeTest.d.ts +0 -15
  81. package/dist/nodeTest.d.ts.map +0 -1
  82. package/dist/nodeTest.js.map +0 -1
  83. package/dist/playwright.d.ts +0 -9
  84. package/dist/playwright.d.ts.map +0 -1
  85. package/dist/playwright.js.map +0 -1
  86. package/dist/playwrightReporter.d.ts +0 -6
  87. package/dist/playwrightReporter.d.ts.map +0 -1
  88. package/dist/playwrightReporter.js.map +0 -1
  89. package/dist/project.d.ts +0 -20
  90. package/dist/project.d.ts.map +0 -1
  91. package/dist/project.js +0 -296
  92. package/dist/project.js.map +0 -1
  93. package/dist/provenance.d.ts +0 -9
  94. package/dist/provenance.d.ts.map +0 -1
  95. package/dist/provenance.js.map +0 -1
  96. package/dist/query.d.ts +0 -70
  97. package/dist/query.d.ts.map +0 -1
  98. package/dist/query.js +0 -1443
  99. package/dist/query.js.map +0 -1
  100. package/dist/queryCache.d.ts +0 -15
  101. package/dist/queryCache.d.ts.map +0 -1
  102. package/dist/queryCache.js +0 -95
  103. package/dist/queryCache.js.map +0 -1
  104. package/dist/queueAdapters.d.ts +0 -15
  105. package/dist/queueAdapters.d.ts.map +0 -1
  106. package/dist/queueAdapters.js +0 -55
  107. package/dist/queueAdapters.js.map +0 -1
  108. package/dist/register.d.mts +0 -2
  109. package/dist/register.d.mts.map +0 -1
  110. package/dist/register.mjs.map +0 -1
  111. package/dist/reporter.d.ts +0 -13
  112. package/dist/reporter.d.ts.map +0 -1
  113. package/dist/reporter.js +0 -252
  114. package/dist/reporter.js.map +0 -1
  115. package/dist/resolve-loader.d.mts +0 -3
  116. package/dist/resolve-loader.d.mts.map +0 -1
  117. package/dist/resolve-loader.mjs.map +0 -1
  118. package/dist/runAnalysis.d.ts +0 -19
  119. package/dist/runAnalysis.d.ts.map +0 -1
  120. package/dist/runAnalysis.js +0 -169
  121. package/dist/runAnalysis.js.map +0 -1
  122. package/dist/runnerEvidence.d.ts +0 -19
  123. package/dist/runnerEvidence.d.ts.map +0 -1
  124. package/dist/runnerEvidence.js.map +0 -1
  125. package/dist/runtime.d.ts +0 -88
  126. package/dist/runtime.d.ts.map +0 -1
  127. package/dist/runtime.js.map +0 -1
  128. package/dist/runtimeIsolation.d.ts +0 -3
  129. package/dist/runtimeIsolation.d.ts.map +0 -1
  130. package/dist/runtimeIsolation.js +0 -9
  131. package/dist/runtimeIsolation.js.map +0 -1
  132. package/dist/sourceDiscovery.d.ts +0 -9
  133. package/dist/sourceDiscovery.d.ts.map +0 -1
  134. package/dist/sourceDiscovery.js +0 -238
  135. package/dist/sourceDiscovery.js.map +0 -1
  136. package/dist/transport.d.ts +0 -17
  137. package/dist/transport.d.ts.map +0 -1
  138. package/dist/transport.js.map +0 -1
  139. package/dist/types.d.ts +0 -378
  140. package/dist/types.d.ts.map +0 -1
  141. package/dist/types.js +0 -2
  142. package/dist/types.js.map +0 -1
  143. package/dist/vitePlugin.d.ts +0 -13
  144. package/dist/vitePlugin.d.ts.map +0 -1
  145. package/dist/vitePlugin.js +0 -125
  146. package/dist/vitePlugin.js.map +0 -1
  147. package/dist/vitest.d.ts +0 -2
  148. package/dist/vitest.d.ts.map +0 -1
  149. package/dist/vitest.js.map +0 -1
  150. package/dist/vitestReporter.d.ts +0 -43
  151. package/dist/vitestReporter.d.ts.map +0 -1
  152. package/dist/vitestReporter.js.map +0 -1
  153. package/dist/workspace.d.ts +0 -81
  154. package/dist/workspace.d.ts.map +0 -1
  155. package/dist/workspace.js +0 -504
  156. package/dist/workspace.js.map +0 -1
@@ -1,81 +0,0 @@
1
- export type RunStateStatus = "preparing" | "building" | "testing" | "publishing" | "complete" | "failed" | "interrupted" | "abandoned";
2
- export interface RunState {
3
- id: string;
4
- pid: number;
5
- root: string;
6
- workspace: string;
7
- startedAt: string;
8
- updatedAt: string;
9
- status: RunStateStatus;
10
- signal?: NodeJS.Signals;
11
- error?: string;
12
- }
13
- export declare function isolatedWorkspacePath(root: string, runId: string): string;
14
- /**
15
- * Stable isolated namespace used as a live mount by VM/container runners.
16
- * Its path must remain stable so providers whose snapshot key includes mount
17
- * paths can reuse an instrumented snapshot across equivalent coverage runs.
18
- * The project lock makes refreshes single-writer.
19
- */
20
- export declare function cachedWorkspacePath(root: string): string;
21
- export interface CacheRecoveryResult {
22
- restoredPrevious: boolean;
23
- removedStaging: number;
24
- removedPrevious: number;
25
- }
26
- /**
27
- * Recover the stable cache at transaction boundaries that SIGKILL or a host
28
- * crash can interrupt. A staging tree is never live. A previous tree is
29
- * restored only when the stable name is absent; otherwise it is obsolete.
30
- */
31
- export declare function recoverCachedWorkspace(root: string): CacheRecoveryResult;
32
- export declare function writeRunState(root: string, runId: string, state: Omit<RunState, "updatedAt">): RunState;
33
- export declare function updateRunState(root: string, runId: string, update: Partial<Omit<RunState, "id" | "root" | "workspace" | "startedAt">>): RunState;
34
- /**
35
- * A published run is self-contained only once its raw-evidence archive exists.
36
- * At that point loose evidence and per-run state are transactional leftovers,
37
- * not user history. Derive every deletion target from root + run ID.
38
- */
39
- export declare function finalizePublishedRunStorage(root: string, runId: string): boolean;
40
- /** Recover dead runs and finish any publication whose atomic rename landed. */
41
- export declare function recoverAbandonedRuns(root: string): string[];
42
- export interface ProjectLock {
43
- path: string;
44
- release: () => void;
45
- }
46
- export declare function acquireProjectLock(root: string, runId: string): ProjectLock;
47
- /** Create a copy-on-write project snapshot whose build outputs are disposable. */
48
- export declare function prepareIsolatedWorkspace(root: string, runId: string): string;
49
- interface CachePreparationHooks {
50
- /** Internal fault-injection seam used by the crash-boundary regression. */
51
- beforePublish?: (staging: string) => void;
52
- /** Internal fault-injection seam used by the crash-boundary regression. */
53
- afterPreviousMoved?: (previous: string) => void;
54
- /** Internal fault-injection seam used by the crash-boundary regression. */
55
- afterPublished?: (workspace: string) => void;
56
- /** Internal fault-injection seam for copy fallback and ENOSPC tests. */
57
- copyFile?: (source: string, destination: string) => void;
58
- /** Exact-fingerprint build artifacts carried into the refreshed snapshot. */
59
- reusePaths?: string[];
60
- /** Internal seam for simulating platform rename failures. */
61
- rename?: (source: string, destination: string) => void;
62
- }
63
- /** Refresh the stable, disposable instrumented-build namespace. */
64
- export declare function prepareCachedWorkspace(root: string, hooks?: CachePreparationHooks): string;
65
- export declare function removeIsolatedWorkspace(root: string, runId: string): void;
66
- export interface CleanupOptions {
67
- keep: number;
68
- dryRun: boolean;
69
- }
70
- export interface CleanupResult {
71
- removedRuns: string[];
72
- removedWorkspaces: string[];
73
- removedEvidence: string[];
74
- removedBuildCache: boolean;
75
- }
76
- /** Cleanup is itself a project-wide transaction, so it cannot race a run. */
77
- export declare function cleanCoverageStorage(root: string, options: CleanupOptions): CleanupResult;
78
- /** Explicit history retention that deliberately preserves the shared cache. */
79
- export declare function pruneCoverageStorage(root: string, options: CleanupOptions): CleanupResult;
80
- export {};
81
- //# sourceMappingURL=workspace.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
package/dist/workspace.js DELETED
@@ -1,504 +0,0 @@
1
- import { copyFileSync, constants, existsSync, lstatSync, mkdirSync, openSync, closeSync, fsyncSync, readFileSync, readdirSync, readlinkSync, realpathSync, rmSync, symlinkSync, statSync, writeFileSync, } from "node:fs";
2
- import { randomUUID } from "node:crypto";
3
- import { basename, dirname, isAbsolute, relative, resolve, sep } from "node:path";
4
- import { atomicRenameSync, atomicWriteFileSync } from "./atomic.js";
5
- const TERMINAL = new Set([
6
- "complete",
7
- "failed",
8
- "interrupted",
9
- "abandoned",
10
- ]);
11
- const ROOT_EXCLUSIONS = new Set([
12
- ".cache",
13
- ".git",
14
- ".supercov",
15
- ".mcdc-pool",
16
- "node_modules",
17
- "build",
18
- "dist",
19
- ".next",
20
- ".nuxt",
21
- ".output",
22
- "coverage",
23
- "playwright-report",
24
- "test-results",
25
- ]);
26
- const NESTED_SUPERCOV_EXCLUSIONS = new Set([".supercov", ".mcdc-pool"]);
27
- function processExists(pid) {
28
- if (!Number.isSafeInteger(pid) || pid <= 0)
29
- return false;
30
- try {
31
- process.kill(pid, 0);
32
- return true;
33
- }
34
- catch (error) {
35
- return error.code === "EPERM";
36
- }
37
- }
38
- function readJson(path) {
39
- try {
40
- return JSON.parse(readFileSync(path, "utf8"));
41
- }
42
- catch {
43
- return undefined;
44
- }
45
- }
46
- function statePath(root, runId) {
47
- return resolve(root, ".supercov/work", runId, "state.json");
48
- }
49
- export function isolatedWorkspacePath(root, runId) {
50
- return resolve(root, ".supercov/work", runId, basename(root));
51
- }
52
- /**
53
- * Stable isolated namespace used as a live mount by VM/container runners.
54
- * Its path must remain stable so providers whose snapshot key includes mount
55
- * paths can reuse an instrumented snapshot across equivalent coverage runs.
56
- * The project lock makes refreshes single-writer.
57
- */
58
- export function cachedWorkspacePath(root) {
59
- return resolve(root, ".supercov/cache/instrumented-workspace", basename(root));
60
- }
61
- function cacheTransactionPrefix(root, kind) {
62
- return `.${basename(root)}.${kind}-`;
63
- }
64
- function cacheTransactionPath(root, kind) {
65
- const workspace = cachedWorkspacePath(root);
66
- return resolve(dirname(workspace), `${cacheTransactionPrefix(root, kind)}${process.pid}-${randomUUID()}`);
67
- }
68
- /**
69
- * Recover the stable cache at transaction boundaries that SIGKILL or a host
70
- * crash can interrupt. A staging tree is never live. A previous tree is
71
- * restored only when the stable name is absent; otherwise it is obsolete.
72
- */
73
- export function recoverCachedWorkspace(root) {
74
- const workspace = cachedWorkspacePath(root);
75
- const parent = dirname(workspace);
76
- if (!existsSync(parent))
77
- return { restoredPrevious: false, removedStaging: 0, removedPrevious: 0 };
78
- const entries = readdirSync(parent, { withFileTypes: true });
79
- const stagingPrefix = cacheTransactionPrefix(root, "staging");
80
- const previousPrefix = cacheTransactionPrefix(root, "previous");
81
- const staging = entries
82
- .filter((entry) => entry.name.startsWith(stagingPrefix))
83
- .map((entry) => resolve(parent, entry.name));
84
- const previous = entries
85
- .filter((entry) => entry.name.startsWith(previousPrefix) && entry.isDirectory())
86
- .map((entry) => resolve(parent, entry.name))
87
- .sort((left, right) => lstatSync(right).mtimeMs - lstatSync(left).mtimeMs);
88
- const invalidPrevious = entries
89
- .filter((entry) => entry.name.startsWith(previousPrefix) && !entry.isDirectory())
90
- .map((entry) => resolve(parent, entry.name));
91
- let restoredPrevious = false;
92
- if (!existsSync(workspace) && previous[0]) {
93
- atomicRenameSync(previous[0], workspace);
94
- previous.shift();
95
- restoredPrevious = true;
96
- }
97
- for (const path of staging)
98
- rmSync(path, { recursive: true, force: true });
99
- for (const path of previous)
100
- rmSync(path, { recursive: true, force: true });
101
- for (const path of invalidPrevious)
102
- rmSync(path, { recursive: true, force: true });
103
- return {
104
- restoredPrevious,
105
- removedStaging: staging.length,
106
- removedPrevious: previous.length + invalidPrevious.length,
107
- };
108
- }
109
- export function writeRunState(root, runId, state) {
110
- const complete = { ...state, updatedAt: new Date().toISOString() };
111
- atomicWriteFileSync(statePath(root, runId), `${JSON.stringify(complete, null, 2)}\n`);
112
- return complete;
113
- }
114
- export function updateRunState(root, runId, update) {
115
- const current = readJson(statePath(root, runId));
116
- if (!current)
117
- throw new Error(`Run state is missing for ${runId}`);
118
- const next = {
119
- ...current,
120
- ...update,
121
- updatedAt: new Date().toISOString(),
122
- };
123
- atomicWriteFileSync(statePath(root, runId), `${JSON.stringify(next, null, 2)}\n`);
124
- return next;
125
- }
126
- /**
127
- * A published run is self-contained only once its raw-evidence archive exists.
128
- * At that point loose evidence and per-run state are transactional leftovers,
129
- * not user history. Derive every deletion target from root + run ID.
130
- */
131
- export function finalizePublishedRunStorage(root, runId) {
132
- const runDirectory = resolve(root, ".supercov/runs", runId);
133
- const publishedRun = readJson(resolve(runDirectory, "run.json"));
134
- if (publishedRun?.id !== runId ||
135
- !existsSync(resolve(runDirectory, "evidence.raw.gz"))) {
136
- return false;
137
- }
138
- rmSync(resolve(root, ".supercov/evidence", runId), {
139
- recursive: true,
140
- force: true,
141
- });
142
- rmSync(resolve(root, ".supercov/work", runId), {
143
- recursive: true,
144
- force: true,
145
- });
146
- return true;
147
- }
148
- /** Recover dead runs and finish any publication whose atomic rename landed. */
149
- export function recoverAbandonedRuns(root) {
150
- const workRoot = resolve(root, ".supercov/work");
151
- if (!existsSync(workRoot))
152
- return [];
153
- const recovered = [];
154
- for (const entry of readdirSync(workRoot, { withFileTypes: true })) {
155
- if (!entry.isDirectory())
156
- continue;
157
- const path = statePath(root, entry.name);
158
- const state = readJson(path);
159
- if (!state)
160
- continue;
161
- if (TERMINAL.has(state.status)) {
162
- finalizePublishedRunStorage(root, entry.name);
163
- continue;
164
- }
165
- if (processExists(state.pid))
166
- continue;
167
- // Never trust a persisted path as a deletion target. A partially written
168
- // or manually edited state file cannot widen cleanup beyond this run's
169
- // deterministic workspace namespace.
170
- rmSync(isolatedWorkspacePath(root, entry.name), {
171
- recursive: true,
172
- force: true,
173
- });
174
- rmSync(resolve(root, ".supercov/work", entry.name, "run-publication"), {
175
- recursive: true,
176
- force: true,
177
- });
178
- if (finalizePublishedRunStorage(root, entry.name)) {
179
- // The run directory is published by one atomic rename before the run
180
- // state flips terminal. Its run.json is the durable terminal record, so
181
- // recovery completes cleanup without recreating disposable state.
182
- }
183
- else {
184
- // Evidence moved out of the disposable workspace before run
185
- // generation is not a visible run. Remove that orphan on recovery so a
186
- // hard kill cannot accumulate partial run data indefinitely.
187
- rmSync(resolve(root, ".supercov/evidence", entry.name), {
188
- recursive: true,
189
- force: true,
190
- });
191
- updateRunState(root, entry.name, {
192
- status: "abandoned",
193
- error: `Recovered after process ${state.pid} exited without cleanup`,
194
- });
195
- }
196
- recovered.push(entry.name);
197
- }
198
- return recovered.sort();
199
- }
200
- export function acquireProjectLock(root, runId) {
201
- const lockPath = resolve(root, ".supercov/locks/active.json");
202
- mkdirSync(dirname(lockPath), { recursive: true });
203
- for (let attempt = 0; attempt < 2; attempt += 1) {
204
- let descriptor;
205
- try {
206
- descriptor = openSync(lockPath, "wx", 0o600);
207
- const payload = `${JSON.stringify({ runId, pid: process.pid, startedAt: new Date().toISOString() }, null, 2)}\n`;
208
- writeFileSync(descriptor, payload);
209
- fsyncSync(descriptor);
210
- closeSync(descriptor);
211
- descriptor = undefined;
212
- let released = false;
213
- return {
214
- path: lockPath,
215
- release() {
216
- if (released)
217
- return;
218
- released = true;
219
- const owner = readJson(lockPath);
220
- if (owner?.runId === runId && owner.pid === process.pid)
221
- rmSync(lockPath, { force: true });
222
- },
223
- };
224
- }
225
- catch (error) {
226
- if (descriptor !== undefined)
227
- closeSync(descriptor);
228
- const failure = error;
229
- if (failure.code !== "EEXIST")
230
- throw error;
231
- const owner = readJson(lockPath);
232
- if (owner?.pid && processExists(owner.pid)) {
233
- throw new Error(`Coverage run ${owner.runId ?? "unknown"} is already active in this project (pid ${owner.pid})`);
234
- }
235
- if (!owner) {
236
- const ageMs = Date.now() - statSync(lockPath).mtimeMs;
237
- if (ageMs < 30_000)
238
- throw new Error("A coverage run is currently acquiring the project lock");
239
- }
240
- rmSync(lockPath, { force: true });
241
- }
242
- }
243
- throw new Error("Could not acquire the Supercov project lock");
244
- }
245
- function inside(root, path) {
246
- const local = relative(root, path);
247
- return (local === "" ||
248
- (!local.startsWith(`..${sep}`) && local !== ".." && !isAbsolute(local)));
249
- }
250
- function copyTree(source, destination, root = false, sourceRoot = source, destinationRoot = destination, hooks = {}, finalDestinationRoot = destinationRoot) {
251
- mkdirSync(destination, { recursive: true });
252
- for (const entry of readdirSync(source, { withFileTypes: true })) {
253
- if ((root && ROOT_EXCLUSIONS.has(entry.name)) ||
254
- NESTED_SUPERCOV_EXCLUSIONS.has(entry.name))
255
- continue;
256
- const from = resolve(source, entry.name);
257
- const to = resolve(destination, entry.name);
258
- const stat = lstatSync(from);
259
- if (stat.isDirectory())
260
- copyTree(from, to, false, sourceRoot, destinationRoot, hooks, finalDestinationRoot);
261
- else if (stat.isSymbolicLink()) {
262
- const link = readlinkSync(from);
263
- const lexicalTarget = isAbsolute(link)
264
- ? resolve(link)
265
- : resolve(dirname(from), link);
266
- let finalTarget;
267
- try {
268
- finalTarget = realpathSync(from);
269
- }
270
- catch (error) {
271
- if (error.code !== "ENOENT")
272
- throw error;
273
- }
274
- if (!inside(sourceRoot, lexicalTarget) ||
275
- (finalTarget && !inside(realpathSync(sourceRoot), finalTarget))) {
276
- throw new Error(`Refusing to preserve symlink outside the isolated project: ${relative(sourceRoot, from)} -> ${link}`);
277
- }
278
- const targetIsDirectory = statSync(from).isDirectory();
279
- const relocatedAbsoluteTarget = resolve(destinationRoot, relative(sourceRoot, lexicalTarget));
280
- // Windows junctions are absolute. Point them at the stable name that the
281
- // staging tree will have after publication, not the staging name that is
282
- // about to disappear. POSIX links remain relative and survive rename.
283
- const isolatedLink = process.platform === "win32" && targetIsDirectory
284
- ? resolve(finalDestinationRoot, relative(sourceRoot, lexicalTarget))
285
- : isAbsolute(link)
286
- ? relative(dirname(to), relocatedAbsoluteTarget)
287
- : link;
288
- symlinkSync(isolatedLink, to, process.platform === "win32"
289
- ? targetIsDirectory
290
- ? "junction"
291
- : "file"
292
- : undefined);
293
- }
294
- else if (stat.isFile()) {
295
- if (hooks.copyFile)
296
- hooks.copyFile(from, to);
297
- else
298
- copyFileSync(from, to, constants.COPYFILE_FICLONE);
299
- }
300
- else
301
- throw new Error(`Unsupported filesystem entry in isolated project: ${relative(sourceRoot, from)}`);
302
- }
303
- }
304
- /** Create a copy-on-write project snapshot whose build outputs are disposable. */
305
- export function prepareIsolatedWorkspace(root, runId) {
306
- const workspace = isolatedWorkspacePath(root, runId);
307
- rmSync(workspace, { recursive: true, force: true });
308
- copyTree(root, workspace, true);
309
- const nodeModules = resolve(root, "node_modules");
310
- if (existsSync(nodeModules)) {
311
- // Keep the node_modules mount point itself as a real directory. VM-based
312
- // runners commonly layer a Linux dependency cache onto the mounted
313
- // workspace's node_modules path;
314
- // making the mount point an external symlink causes virtio-fs's safe
315
- // `opaque` policy to reject LOOKUP with EACCES before the nested mount can
316
- // be attached. Per-entry links still give host-side builds zero-copy
317
- // access to the user's installed dependencies and are hidden by the VM's
318
- // nested mount.
319
- const isolatedNodeModules = resolve(workspace, "node_modules");
320
- mkdirSync(isolatedNodeModules, { recursive: true });
321
- for (const entry of readdirSync(nodeModules, { withFileTypes: true })) {
322
- const target = resolve(nodeModules, entry.name);
323
- symlinkSync(target, resolve(isolatedNodeModules, entry.name), process.platform === "win32"
324
- ? entry.isDirectory()
325
- ? "junction"
326
- : "file"
327
- : undefined);
328
- }
329
- }
330
- return workspace;
331
- }
332
- /** Refresh the stable, disposable instrumented-build namespace. */
333
- export function prepareCachedWorkspace(root, hooks = {}) {
334
- const workspace = cachedWorkspacePath(root);
335
- recoverCachedWorkspace(root);
336
- const staging = cacheTransactionPath(root, "staging");
337
- const previous = cacheTransactionPath(root, "previous");
338
- let movedPrevious = false;
339
- try {
340
- copyTree(root, staging, true, root, staging, hooks, workspace);
341
- const nodeModules = resolve(root, "node_modules");
342
- if (existsSync(nodeModules)) {
343
- const isolatedNodeModules = resolve(staging, "node_modules");
344
- mkdirSync(isolatedNodeModules, { recursive: true });
345
- for (const entry of readdirSync(nodeModules, { withFileTypes: true })) {
346
- symlinkSync(resolve(nodeModules, entry.name), resolve(isolatedNodeModules, entry.name), process.platform === "win32"
347
- ? entry.isDirectory()
348
- ? "junction"
349
- : "file"
350
- : undefined);
351
- }
352
- }
353
- for (const requested of hooks.reusePaths ?? []) {
354
- const from = resolve(workspace, requested);
355
- const to = resolve(staging, requested);
356
- if (!inside(workspace, from) ||
357
- from === workspace ||
358
- !inside(staging, to) ||
359
- to === staging ||
360
- !existsSync(from)) {
361
- throw new Error(`Refusing to reuse unexpected build path: ${requested}`);
362
- }
363
- const stat = lstatSync(from);
364
- if (stat.isDirectory())
365
- copyTree(from, to, false, workspace, staging, hooks, workspace);
366
- else if (stat.isFile()) {
367
- mkdirSync(dirname(to), { recursive: true });
368
- if (hooks.copyFile)
369
- hooks.copyFile(from, to);
370
- else
371
- copyFileSync(from, to, constants.COPYFILE_FICLONE);
372
- }
373
- else {
374
- throw new Error(`Unsupported reusable build entry: ${requested}`);
375
- }
376
- }
377
- hooks.beforePublish?.(staging);
378
- // Keep the last complete cache available for the whole refresh. These two
379
- // same-filesystem renames are the only publication boundary. Recovery
380
- // restores `previous` if the process is killed in the narrow gap.
381
- const publishRename = hooks.rename ?? atomicRenameSync;
382
- if (existsSync(workspace)) {
383
- publishRename(workspace, previous);
384
- movedPrevious = true;
385
- hooks.afterPreviousMoved?.(previous);
386
- }
387
- publishRename(staging, workspace);
388
- hooks.afterPublished?.(workspace);
389
- }
390
- catch (error) {
391
- if (movedPrevious && !existsSync(workspace) && existsSync(previous)) {
392
- try {
393
- atomicRenameSync(previous, workspace);
394
- }
395
- catch {
396
- // Leave the previous tree for deterministic recovery next invocation.
397
- }
398
- }
399
- throw error;
400
- }
401
- finally {
402
- rmSync(staging, { recursive: true, force: true });
403
- }
404
- // Failure to remove an obsolete previous generation must not invalidate the
405
- // newly published cache. The next invocation and `supercov clean` both
406
- // remove it deterministically.
407
- try {
408
- rmSync(previous, { recursive: true, force: true });
409
- }
410
- catch {
411
- // Deliberately retained for recoverCachedWorkspace().
412
- }
413
- return workspace;
414
- }
415
- export function removeIsolatedWorkspace(root, runId) {
416
- const workspace = isolatedWorkspacePath(root, runId);
417
- const relativePath = relative(resolve(root, ".supercov/work"), workspace);
418
- if (relativePath.startsWith("..") || relativePath.split(sep).length < 2) {
419
- throw new Error(`Refusing to remove unexpected workspace path: ${workspace}`);
420
- }
421
- rmSync(workspace, { recursive: true, force: true });
422
- }
423
- /** Deterministic retention: IDs sort newest-first because run IDs are UTC. */
424
- function cleanCoverageStorageLocked(root, options, removeBuildCache) {
425
- recoverAbandonedRuns(root);
426
- const runsRoot = resolve(root, ".supercov/runs");
427
- const workRoot = resolve(root, ".supercov/work");
428
- const evidenceRoot = resolve(root, ".supercov/evidence");
429
- const bases = [runsRoot, workRoot, evidenceRoot];
430
- const ids = new Set();
431
- for (const base of bases) {
432
- if (!existsSync(base))
433
- continue;
434
- for (const entry of readdirSync(base, { withFileTypes: true }))
435
- if (entry.isDirectory())
436
- ids.add(entry.name);
437
- }
438
- const ordered = [...ids].sort((left, right) => right.localeCompare(left));
439
- const active = new Set(ordered.filter((id) => {
440
- const state = readJson(resolve(root, ".supercov/work", id, "state.json"));
441
- return Boolean(state && !TERMINAL.has(state.status));
442
- }));
443
- const published = existsSync(runsRoot)
444
- ? readdirSync(runsRoot, { withFileTypes: true })
445
- .filter((entry) => entry.isDirectory())
446
- .map((entry) => entry.name)
447
- .sort((left, right) => right.localeCompare(left))
448
- : [];
449
- const retained = new Set(published.filter((id) => !active.has(id)).slice(0, Math.max(0, options.keep)));
450
- const removedRuns = [];
451
- const removedWorkspaces = [];
452
- const removedEvidence = [];
453
- for (const id of ordered) {
454
- const work = resolve(root, ".supercov/work", id);
455
- const state = readJson(resolve(work, "state.json"));
456
- if (active.has(id))
457
- continue;
458
- const hasPublishedRun = existsSync(resolve(runsRoot, id));
459
- const removeHistory = hasPublishedRun && !retained.has(id);
460
- const removeTransientWork = existsSync(work) && (!state || TERMINAL.has(state.status));
461
- if (removeTransientWork) {
462
- removedWorkspaces.push(id);
463
- if (!options.dryRun)
464
- rmSync(work, { recursive: true, force: true });
465
- }
466
- const hasLooseEvidence = existsSync(resolve(evidenceRoot, id));
467
- if (hasLooseEvidence && (!hasPublishedRun || removeHistory)) {
468
- removedEvidence.push(id);
469
- if (!options.dryRun)
470
- rmSync(resolve(evidenceRoot, id), { recursive: true, force: true });
471
- }
472
- if (removeHistory) {
473
- removedRuns.push(id);
474
- if (!options.dryRun)
475
- rmSync(resolve(runsRoot, id), { recursive: true, force: true });
476
- }
477
- }
478
- const buildCache = resolve(root, ".supercov/cache/instrumented-workspace");
479
- const removedBuildCache = removeBuildCache && active.size === 0 && existsSync(buildCache);
480
- if (removedBuildCache && !options.dryRun)
481
- rmSync(buildCache, { recursive: true, force: true });
482
- return { removedRuns, removedWorkspaces, removedEvidence, removedBuildCache };
483
- }
484
- /** Cleanup is itself a project-wide transaction, so it cannot race a run. */
485
- export function cleanCoverageStorage(root, options) {
486
- const lock = acquireProjectLock(root, `clean-${process.pid}-${randomUUID()}`);
487
- try {
488
- return cleanCoverageStorageLocked(root, options, true);
489
- }
490
- finally {
491
- lock.release();
492
- }
493
- }
494
- /** Explicit history retention that deliberately preserves the shared cache. */
495
- export function pruneCoverageStorage(root, options) {
496
- const lock = acquireProjectLock(root, `prune-${process.pid}-${randomUUID()}`);
497
- try {
498
- return cleanCoverageStorageLocked(root, options, false);
499
- }
500
- finally {
501
- lock.release();
502
- }
503
- }
504
- //# sourceMappingURL=workspace.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}