@ryanstark24/sfgraph-cli 1.4.0 → 1.6.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.
Files changed (67) hide show
  1. package/dist/commands/ingest.d.ts +73 -0
  2. package/dist/commands/ingest.d.ts.map +1 -1
  3. package/dist/commands/ingest.js +334 -20
  4. package/dist/commands/ingest.js.map +1 -1
  5. package/dist/commands/serve.d.ts +7 -0
  6. package/dist/commands/serve.d.ts.map +1 -1
  7. package/dist/commands/serve.js +59 -1
  8. package/dist/commands/serve.js.map +1 -1
  9. package/dist/commands/skip-labels.d.ts +11 -0
  10. package/dist/commands/skip-labels.d.ts.map +1 -0
  11. package/dist/commands/skip-labels.js +15 -0
  12. package/dist/commands/skip-labels.js.map +1 -0
  13. package/dist/commands/telemetry.js +1 -1
  14. package/dist/commands/telemetry.js.map +1 -1
  15. package/dist/heap.d.ts +24 -0
  16. package/dist/heap.d.ts.map +1 -0
  17. package/dist/heap.js +45 -0
  18. package/dist/heap.js.map +1 -0
  19. package/dist/index.d.ts +13 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +15 -2
  22. package/dist/index.js.map +1 -1
  23. package/package.json +8 -7
  24. package/dist/__tests__/diagnose.test.d.ts +0 -2
  25. package/dist/__tests__/diagnose.test.d.ts.map +0 -1
  26. package/dist/__tests__/diagnose.test.js +0 -272
  27. package/dist/__tests__/diagnose.test.js.map +0 -1
  28. package/dist/__tests__/doctor.test.d.ts +0 -2
  29. package/dist/__tests__/doctor.test.d.ts.map +0 -1
  30. package/dist/__tests__/doctor.test.js +0 -64
  31. package/dist/__tests__/doctor.test.js.map +0 -1
  32. package/dist/__tests__/ingest-db-guard.test.d.ts +0 -2
  33. package/dist/__tests__/ingest-db-guard.test.d.ts.map +0 -1
  34. package/dist/__tests__/ingest-db-guard.test.js +0 -110
  35. package/dist/__tests__/ingest-db-guard.test.js.map +0 -1
  36. package/dist/__tests__/ingest-multi.test.d.ts +0 -2
  37. package/dist/__tests__/ingest-multi.test.d.ts.map +0 -1
  38. package/dist/__tests__/ingest-multi.test.js +0 -51
  39. package/dist/__tests__/ingest-multi.test.js.map +0 -1
  40. package/dist/__tests__/install-dry-run.test.d.ts +0 -2
  41. package/dist/__tests__/install-dry-run.test.d.ts.map +0 -1
  42. package/dist/__tests__/install-dry-run.test.js +0 -29
  43. package/dist/__tests__/install-dry-run.test.js.map +0 -1
  44. package/dist/__tests__/install-e2e.test.d.ts +0 -2
  45. package/dist/__tests__/install-e2e.test.d.ts.map +0 -1
  46. package/dist/__tests__/install-e2e.test.js +0 -33
  47. package/dist/__tests__/install-e2e.test.js.map +0 -1
  48. package/dist/__tests__/mcp-config.test.d.ts +0 -2
  49. package/dist/__tests__/mcp-config.test.d.ts.map +0 -1
  50. package/dist/__tests__/mcp-config.test.js +0 -104
  51. package/dist/__tests__/mcp-config.test.js.map +0 -1
  52. package/dist/__tests__/rebuild.test.d.ts +0 -2
  53. package/dist/__tests__/rebuild.test.d.ts.map +0 -1
  54. package/dist/__tests__/rebuild.test.js +0 -180
  55. package/dist/__tests__/rebuild.test.js.map +0 -1
  56. package/dist/__tests__/serve-guard.test.d.ts +0 -2
  57. package/dist/__tests__/serve-guard.test.d.ts.map +0 -1
  58. package/dist/__tests__/serve-guard.test.js +0 -82
  59. package/dist/__tests__/serve-guard.test.js.map +0 -1
  60. package/dist/__tests__/snapshot.test.d.ts +0 -2
  61. package/dist/__tests__/snapshot.test.d.ts.map +0 -1
  62. package/dist/__tests__/snapshot.test.js +0 -139
  63. package/dist/__tests__/snapshot.test.js.map +0 -1
  64. package/dist/__tests__/telemetry.test.d.ts +0 -2
  65. package/dist/__tests__/telemetry.test.d.ts.map +0 -1
  66. package/dist/__tests__/telemetry.test.js +0 -53
  67. package/dist/__tests__/telemetry.test.js.map +0 -1
@@ -1,272 +0,0 @@
1
- /**
2
- * Phase 1.5 W1.5-05 — diagnose CLI subcommand tests.
3
- *
4
- * The diagnose command's heavy lifting is the parsing of namespaced
5
- * warning strings into the structured report shape, plus the env-restore
6
- * try/finally invariant. We test those directly here against the
7
- * `DiagnoseReporter` class and the `diagnoseCmd` entrypoint with mocked
8
- * runner/resolveOrg so no Salesforce connection is required.
9
- */
10
- import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
11
- import { tmpdir } from "node:os";
12
- import { join } from "node:path";
13
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
14
- import { DiagnoseReporter, diagnoseCmd, topSlowestSources } from "../commands/diagnose.js";
15
- let tmpRoot;
16
- beforeEach(() => {
17
- tmpRoot = mkdtempSync(join(tmpdir(), "sfgraph-diagnose-test-"));
18
- });
19
- afterEach(() => {
20
- rmSync(tmpRoot, { recursive: true, force: true });
21
- });
22
- const fakeResolveOrg = async (alias) => ({
23
- alias,
24
- orgId: "00DTEST00000001",
25
- apiVersion: "60.0",
26
- instanceUrl: "https://test.my.salesforce.com",
27
- conn: {},
28
- });
29
- /** Build a runner that just emits a canned LiveIngestResult — no real
30
- * Salesforce activity, no SqliteGraphStore touched (the diagnoseCmd
31
- * still opens one against the temp dir, which is fine; the runner
32
- * bypasses any heavy work). */
33
- function fakeRunner(opts) {
34
- return async () => {
35
- if (opts.timeoutMs) {
36
- await new Promise((r) => setTimeout(r, opts.timeoutMs));
37
- }
38
- if (opts.throws)
39
- throw opts.throws;
40
- const stub = {
41
- orgId: "00DTEST00000001",
42
- capabilities: opts.capabilities ?? { sourceTracking: false, agentforce: false },
43
- mode: "full",
44
- membersProcessed: 0,
45
- parseErrors: 0,
46
- deletions: 0,
47
- durationMs: 1,
48
- crossFlavorEdges: 0,
49
- arityResolved: 0,
50
- flowMethodsResolved: 0,
51
- danglingEdges: 0,
52
- reflectionEdges: 0,
53
- overlap: { matched: 0, diverged: 0, empty: 0, annotated: 0 },
54
- warnings: opts.warnings ?? [],
55
- };
56
- return stub;
57
- };
58
- }
59
- describe("DiagnoseReporter.ingestWarnings", () => {
60
- it("parses a firstYield wedge warning into a structured event", () => {
61
- const r = new DiagnoseReporter("00DTEST00000001", "alias", 1_000);
62
- r.ingestWarning("wedge:lwc:firstYield:90s:lastYielded=LightningComponentBundle/Foo:wedgedForMs=90123");
63
- const out = r.build({
64
- finishedAtEpoch: 2_000,
65
- capabilities: {},
66
- config: { sourceConcurrency: 1, toolingPool: 1, metadataPool: 1, dataPool: 1 },
67
- warnings: [
68
- "wedge:lwc:firstYield:90s:lastYielded=LightningComponentBundle/Foo:wedgedForMs=90123",
69
- ],
70
- exitStatus: "ok",
71
- });
72
- const lwc = out.perSource.find((s) => s.name === "lwc");
73
- expect(lwc).toBeDefined();
74
- expect(lwc?.wedged).toBe(true);
75
- expect(lwc?.lastYieldedRecord).toBe("LightningComponentBundle/Foo");
76
- expect(lwc?.wedgeEvents).toHaveLength(1);
77
- expect(lwc?.wedgeEvents[0]?.kind).toBe("firstYield");
78
- expect(lwc?.wedgeEvents[0]?.atMs).toBe(90_000);
79
- expect(lwc?.wedgeEvents[0]?.lastYieldedRecord).toBe("LightningComponentBundle/Foo");
80
- });
81
- it("parses an empty-stream detect-deletions refusal", () => {
82
- const r = new DiagnoseReporter("00DTEST00000001");
83
- r.ingestWarning("wedge:detect-deletions:refuse:label=Profile:reason=empty-stream:priorCount=100");
84
- const out = r.build({
85
- capabilities: {},
86
- config: { sourceConcurrency: 1, toolingPool: 1, metadataPool: 1, dataPool: 1 },
87
- warnings: [],
88
- exitStatus: "ok",
89
- });
90
- expect(out.detectDeletionsRefusals).toHaveLength(1);
91
- expect(out.detectDeletionsRefusals[0]).toEqual({
92
- label: "Profile",
93
- reason: "empty-stream",
94
- priorCount: 100,
95
- });
96
- // Mirrors onto perSource with needsDiagnose=true
97
- const profile = out.perSource.find((s) => s.name === "Profile");
98
- expect(profile?.needsDiagnose).toBe(true);
99
- expect(out.needsDiagnose).toContain("Profile");
100
- });
101
- it("parses a drop-ratio refusal with dropped/prior/ratio fields", () => {
102
- const r = new DiagnoseReporter("00DTEST00000001");
103
- r.ingestWarning("wedge:detect-deletions:refuse:label=Profile:reason=drop-ratio:dropped=50:prior=100:ratio=0.50");
104
- const out = r.build({
105
- capabilities: {},
106
- config: { sourceConcurrency: 1, toolingPool: 1, metadataPool: 1, dataPool: 1 },
107
- warnings: [],
108
- exitStatus: "ok",
109
- });
110
- expect(out.detectDeletionsRefusals[0]).toEqual({
111
- label: "Profile",
112
- reason: "drop-ratio",
113
- priorCount: 100,
114
- touchedCount: 50,
115
- ratio: 0.5,
116
- });
117
- });
118
- it("parses a cap-evicted background-wedge entry onto the named source", () => {
119
- const r = new DiagnoseReporter("00DTEST00000001");
120
- r.ingestWarning("wedge:cap:backgroundWedgeAborted:source=generic:Layout:ageMs=12345:reason=backgroundWedgeCapExceeded");
121
- const out = r.build({
122
- capabilities: {},
123
- config: { sourceConcurrency: 1, toolingPool: 1, metadataPool: 1, dataPool: 1 },
124
- warnings: [],
125
- exitStatus: "ok",
126
- });
127
- // "source=generic" is the parsed value because colon-split treats
128
- // generic:Layout as two segments. The reporter records whatever the
129
- // warning string identified; the contract is that future warning
130
- // formats stay compatible. We assert structure, not the exact label.
131
- const evicted = out.perSource.find((s) => s.wedgeEvents.some((e) => e.kind === "cap-evicted"));
132
- expect(evicted).toBeDefined();
133
- expect(evicted?.wedged).toBe(true);
134
- expect(evicted?.wedgeEvents[0]?.wedgedForMs).toBe(12345);
135
- });
136
- it("ignores non-wedge warnings (e.g. plain skip messages)", () => {
137
- const r = new DiagnoseReporter("00DTEST00000001");
138
- r.ingestWarning("generic:Layout: skipped (insufficient_access)");
139
- const out = r.build({
140
- capabilities: {},
141
- config: { sourceConcurrency: 1, toolingPool: 1, metadataPool: 1, dataPool: 1 },
142
- warnings: ["generic:Layout: skipped (insufficient_access)"],
143
- exitStatus: "ok",
144
- });
145
- expect(out.perSource).toHaveLength(0);
146
- expect(out.detectDeletionsRefusals).toHaveLength(0);
147
- });
148
- });
149
- describe("topSlowestSources", () => {
150
- it("returns top N by elapsedMs descending; wedged-but-incomplete sources sort to the top", () => {
151
- const src = (name, elapsedMs, wedged = false) => ({
152
- name,
153
- yieldCount: 0,
154
- wedged,
155
- wedgeEvents: [],
156
- ...(elapsedMs !== undefined ? { elapsedMs } : {}),
157
- });
158
- const sources = [
159
- src("a", 1_000),
160
- src("b", 5_000),
161
- src("c", undefined, true), // wedged, no elapsed → top
162
- src("d", 3_000),
163
- src("e", 2_000),
164
- ];
165
- const top = topSlowestSources(sources, 3);
166
- expect(top.map((s) => s.name)).toEqual(["c", "b", "d"]);
167
- });
168
- it("respects the N parameter", () => {
169
- const sources = [
170
- { name: "x", yieldCount: 0, wedged: false, wedgeEvents: [], elapsedMs: 100 },
171
- { name: "y", yieldCount: 0, wedged: false, wedgeEvents: [], elapsedMs: 200 },
172
- { name: "z", yieldCount: 0, wedged: false, wedgeEvents: [], elapsedMs: 300 },
173
- ];
174
- expect(topSlowestSources(sources, 1).map((s) => s.name)).toEqual(["z"]);
175
- expect(topSlowestSources(sources, 2).map((s) => s.name)).toEqual(["z", "y"]);
176
- });
177
- });
178
- describe("diagnoseCmd integration", () => {
179
- it("writes a JSON report with the expected shape to --output", async () => {
180
- const outPath = join(tmpRoot, "report.json");
181
- const { reportPath, report } = await diagnoseCmd({ orgId: "myalias", output: outPath, keepGraph: false }, {
182
- resolveOrg: fakeResolveOrg,
183
- runner: fakeRunner({
184
- warnings: [
185
- "wedge:lwc:firstYield:90s:lastYielded=LightningComponentBundle/Foo:wedgedForMs=90123",
186
- "wedge:detect-deletions:refuse:label=Profile:reason=empty-stream:priorCount=100",
187
- ],
188
- capabilities: { sourceTracking: false, agentforce: true },
189
- }),
190
- });
191
- expect(reportPath).toBe(outPath);
192
- expect(existsSync(outPath)).toBe(true);
193
- const onDisk = JSON.parse(readFileSync(outPath, "utf8"));
194
- expect(onDisk.schemaVersion).toBe(1);
195
- expect(onDisk.diagnosticMode).toBe(true);
196
- expect(onDisk.orgId).toBe("myalias");
197
- expect(onDisk.exitStatus).toBe("ok");
198
- expect(onDisk.config).toMatchObject({
199
- sourceConcurrency: 1,
200
- toolingPool: 1,
201
- metadataPool: 1,
202
- dataPool: 1,
203
- });
204
- expect(onDisk.capabilities.agentforce).toBe(true);
205
- // Per-source wedge + refusal parsed
206
- expect(onDisk.perSource.find((s) => s.name === "lwc").wedged).toBe(true);
207
- expect(onDisk.detectDeletionsRefusals).toHaveLength(1);
208
- expect(onDisk.needsDiagnose).toContain("Profile");
209
- // The in-memory `report` matches what was written
210
- expect(report.exitStatus).toBe("ok");
211
- });
212
- it("restores SFGRAPH_SOURCE_CONCURRENCY after the run (try/finally invariant)", async () => {
213
- const prior = process.env.SFGRAPH_SOURCE_CONCURRENCY;
214
- process.env.SFGRAPH_SOURCE_CONCURRENCY = "4";
215
- try {
216
- const outPath = join(tmpRoot, "report.json");
217
- await diagnoseCmd({ orgId: "myalias", output: outPath, keepGraph: false }, { resolveOrg: fakeResolveOrg, runner: fakeRunner({ warnings: [] }) });
218
- expect(process.env.SFGRAPH_SOURCE_CONCURRENCY).toBe("4");
219
- }
220
- finally {
221
- if (prior === undefined) {
222
- // biome-ignore lint/performance/noDelete: env var restoration requires removing the key
223
- delete process.env.SFGRAPH_SOURCE_CONCURRENCY;
224
- }
225
- else {
226
- process.env.SFGRAPH_SOURCE_CONCURRENCY = prior;
227
- }
228
- }
229
- });
230
- it("restores SFGRAPH_TOOLING_POOL / METADATA_POOL / DATA_POOL even when the runner throws", async () => {
231
- const snapshot = {
232
- SFGRAPH_TOOLING_POOL: process.env.SFGRAPH_TOOLING_POOL,
233
- SFGRAPH_METADATA_POOL: process.env.SFGRAPH_METADATA_POOL,
234
- SFGRAPH_DATA_POOL: process.env.SFGRAPH_DATA_POOL,
235
- };
236
- process.env.SFGRAPH_TOOLING_POOL = "7";
237
- process.env.SFGRAPH_METADATA_POOL = "8";
238
- process.env.SFGRAPH_DATA_POOL = "9";
239
- try {
240
- const outPath = join(tmpRoot, "report.json");
241
- const { report } = await diagnoseCmd({ orgId: "myalias", output: outPath, keepGraph: false }, {
242
- resolveOrg: fakeResolveOrg,
243
- runner: fakeRunner({ throws: new Error("simulated wedge") }),
244
- });
245
- expect(report.exitStatus).toBe("failed");
246
- expect(report.error).toContain("simulated wedge");
247
- // Env restored despite the throw
248
- expect(process.env.SFGRAPH_TOOLING_POOL).toBe("7");
249
- expect(process.env.SFGRAPH_METADATA_POOL).toBe("8");
250
- expect(process.env.SFGRAPH_DATA_POOL).toBe("9");
251
- }
252
- finally {
253
- for (const [k, v] of Object.entries(snapshot)) {
254
- if (v === undefined)
255
- delete process.env[k];
256
- else
257
- process.env[k] = v;
258
- }
259
- }
260
- });
261
- it("hits the timeout path when the runner outlasts --max-duration", async () => {
262
- const outPath = join(tmpRoot, "report.json");
263
- const { report } = await diagnoseCmd({ orgId: "myalias", output: outPath, keepGraph: false, maxDuration: 0 }, {
264
- resolveOrg: fakeResolveOrg,
265
- // Promise that never resolves within 0s — Promise.race picks the timeout
266
- runner: fakeRunner({ timeoutMs: 100_000 }),
267
- });
268
- expect(report.exitStatus).toBe("timeout");
269
- expect(report.error).toMatch(/max-duration/);
270
- });
271
- });
272
- //# sourceMappingURL=diagnose.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnose.test.js","sourceRoot":"","sources":["../../src/__tests__/diagnose.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAO3F,IAAI,OAAe,CAAC;AACpB,UAAU,CAAC,GAAG,EAAE;IACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AACH,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,MAAM,cAAc,GAAuB,KAAK,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;IACnE,KAAK;IACL,KAAK,EAAE,iBAAiB;IACxB,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,gCAAgC;IAC7C,IAAI,EAAE,EAAE;CACT,CAAC,CAAC;AAEH;;;gCAGgC;AAChC,SAAS,UAAU,CAAC,IAKnB;IACC,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC;QACnC,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,iBAAiB;YACxB,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;YAC/E,IAAI,EAAE,MAAM;YACZ,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,gBAAgB,EAAE,CAAC;YACnB,aAAa,EAAE,CAAC;YAChB,mBAAmB,EAAE,CAAC;YACtB,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,CAAC;YAClB,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;YAC5D,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;SAC9B,CAAC;QACF,OAAO,IAA0D,CAAC;IACpE,CAAC,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC,CAAC,aAAa,CACb,qFAAqF,CACtF,CAAC;QACF,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;YAClB,eAAe,EAAE,KAAK;YACtB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC9E,QAAQ,EAAE;gBACR,qFAAqF;aACtF;YACD,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrD,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC,CAAC,aAAa,CACb,gFAAgF,CACjF,CAAC;QACF,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;YAClB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC9E,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,cAAc;YACtB,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QACH,iDAAiD;QACjD,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAChE,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC,CAAC,aAAa,CACb,+FAA+F,CAChG,CAAC;QACF,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;YAClB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC9E,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,GAAG;YACf,YAAY,EAAE,EAAE;YAChB,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC,CAAC,aAAa,CACb,sGAAsG,CACvG,CAAC;QACF,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;YAClB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC9E,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,kEAAkE;QAClE,oEAAoE;QACpE,iEAAiE;QACjE,qEAAqE;QACrE,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC;QAC/F,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC,CAAC,aAAa,CAAC,+CAA+C,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;YAClB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC9E,QAAQ,EAAE,CAAC,+CAA+C,CAAC;YAC3D,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,MAAM,GAAG,GAAG,CACV,IAAY,EACZ,SAA6B,EAC7B,MAAM,GAAG,KAAK,EACa,EAAE,CAAC,CAAC;YAC/B,IAAI;YACJ,UAAU,EAAE,CAAC;YACb,MAAM;YACN,WAAW,EAAE,EAAE;YACf,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC,CAAC;QACH,MAAM,OAAO,GAAG;YACd,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;YACf,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;YACf,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,2BAA2B;YACtD,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;YACf,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;SAChB,CAAC;QACF,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,OAAO,GAAgC;YAC3C,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;YAC5E,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;YAC5E,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;SAC7E,CAAC;QACF,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC7C,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAC9C,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EACvD;YACE,UAAU,EAAE,cAAc;YAC1B,MAAM,EAAE,UAAU,CAAC;gBACjB,QAAQ,EAAE;oBACR,qFAAqF;oBACrF,gFAAgF;iBACjF;gBACD,YAAY,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;aAC1D,CAAC;SACH,CACF,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;YAClC,iBAAiB,EAAE,CAAC;YACpB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,oCAAoC;QACpC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3F,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClD,kDAAkD;QAClD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,GAAG,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC7C,MAAM,WAAW,CACf,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EACvD,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,CACrE,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC;gBAAS,CAAC;YACT,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,wFAAwF;gBACxF,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,KAAK,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,MAAM,QAAQ,GAAuC;YACnD,oBAAoB,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACtD,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;YACxD,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;SACjD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,GAAG,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,GAAG,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAClC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EACvD;gBACE,UAAU,EAAE,cAAc;gBAC1B,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;aAC7D,CACF,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAClD,iCAAiC;YACjC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,KAAK,SAAS;oBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;oBACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAClC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,EACvE;YACE,UAAU,EAAE,cAAc;YAC1B,yEAAyE;YACzE,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;SAC3C,CACF,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=doctor.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/doctor.test.ts"],"names":[],"mappings":""}
@@ -1,64 +0,0 @@
1
- import { mkdtempSync, rmSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
- import { runDoctorChecks } from "../commands/doctor.js";
6
- let home;
7
- let dataDir;
8
- beforeEach(() => {
9
- home = mkdtempSync(join(tmpdir(), "sfgraph-doctor-home-"));
10
- dataDir = mkdtempSync(join(tmpdir(), "sfgraph-doctor-data-"));
11
- });
12
- afterEach(() => {
13
- rmSync(home, { recursive: true, force: true });
14
- rmSync(dataDir, { recursive: true, force: true });
15
- });
16
- describe("runDoctorChecks", () => {
17
- it("flags ABI mismatch as a hard fail with a rebuild hint", () => {
18
- const requireFn = () => {
19
- throw new Error("NODE_MODULE_VERSION 137 mismatch — was compiled against a different Node.js version");
20
- };
21
- const report = runDoctorChecks({
22
- dataDir,
23
- homeOverride: home,
24
- requireFn,
25
- sfProbe: () => ({ ok: true, detail: "@salesforce/cli 2.0.0" }),
26
- });
27
- const binding = report.checks.find((c) => c.name === "better-sqlite3 native binding");
28
- expect(binding?.status).toBe("fail");
29
- expect(binding?.fix).toMatch(/rebuild better-sqlite3/);
30
- expect(report.ok).toBe(false);
31
- });
32
- it("reports all-green when the environment is healthy and no orgs are ingested yet", () => {
33
- const requireFn = () => ({
34
- /* mock Database ctor never used because no .sqlite files */
35
- });
36
- const report = runDoctorChecks({
37
- dataDir,
38
- homeOverride: home,
39
- requireFn,
40
- sfProbe: () => ({ ok: true, detail: "@salesforce/cli 2.0.0" }),
41
- });
42
- expect(report.ok).toBe(true);
43
- // No org DBs yet → warn (still ok overall)
44
- const orgs = report.checks.find((c) => c.name === "org databases");
45
- expect(orgs?.status).toBe("warn");
46
- const node = report.checks.find((c) => c.name === "node runtime");
47
- expect(node?.detail).toContain(process.version);
48
- });
49
- it("emits a warn (not fail) when no IDE MCP configs are present yet", () => {
50
- const requireFn = () => ({});
51
- const report = runDoctorChecks({
52
- dataDir,
53
- homeOverride: home,
54
- requireFn,
55
- sfProbe: () => ({ ok: false, detail: "not found" }),
56
- });
57
- const mcp = report.checks.find((c) => c.name === "IDE MCP configs");
58
- expect(mcp?.status).toBe("warn");
59
- expect(mcp?.fix).toMatch(/sfgraph install/);
60
- // sf CLI missing is warn, not fail
61
- expect(report.ok).toBe(true);
62
- });
63
- });
64
- //# sourceMappingURL=doctor.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../src/__tests__/doctor.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ingest-db-guard.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ingest-db-guard.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ingest-db-guard.test.ts"],"names":[],"mappings":""}
@@ -1,110 +0,0 @@
1
- import { mkdtempSync, rmSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
- /**
6
- * `--db <path>` lets a user override the SQLite path the ingester writes to.
7
- * Without containment, a script could overwrite arbitrary files or fill `/`.
8
- * We require the resolved path to land inside `getSfgraphPaths().data`
9
- * unless `SFGRAPH_ALLOW_ANY_DB=1` is set.
10
- */
11
- let tmpDataDir;
12
- let tmpDbDir;
13
- let prevAllowAnyDb;
14
- beforeEach(() => {
15
- tmpDataDir = mkdtempSync(join(tmpdir(), "sfg-dbguard-data-"));
16
- tmpDbDir = mkdtempSync(join(tmpdir(), "sfg-dbguard-elsewhere-"));
17
- prevAllowAnyDb = process.env.SFGRAPH_ALLOW_ANY_DB;
18
- // biome-ignore lint/performance/noDelete: cleanest reset of an env var override
19
- delete process.env.SFGRAPH_ALLOW_ANY_DB;
20
- });
21
- afterEach(() => {
22
- rmSync(tmpDataDir, { recursive: true, force: true });
23
- rmSync(tmpDbDir, { recursive: true, force: true });
24
- if (prevAllowAnyDb === undefined) {
25
- // biome-ignore lint/performance/noDelete: cleanest reset of an env var override
26
- delete process.env.SFGRAPH_ALLOW_ANY_DB;
27
- }
28
- else {
29
- process.env.SFGRAPH_ALLOW_ANY_DB = prevAllowAnyDb;
30
- }
31
- vi.restoreAllMocks();
32
- vi.resetModules();
33
- });
34
- async function loadIngestWithStubs() {
35
- vi.doMock("@ryanstark24/sfgraph-core", async () => {
36
- const actual = await vi.importActual("@ryanstark24/sfgraph-core");
37
- return {
38
- ...actual,
39
- liveIngest: async () => ({
40
- orgId: "00DxxGuardTest001",
41
- capabilities: {},
42
- mode: "full",
43
- membersProcessed: 0,
44
- parseErrors: 0,
45
- deletions: 0,
46
- durationMs: 0,
47
- }),
48
- resolveOrg: async (alias) => ({
49
- orgId: "00DxxGuardTest001",
50
- alias,
51
- username: "u@example.com",
52
- instanceUrl: "https://x.test",
53
- apiVersion: "60.0",
54
- conn: {},
55
- }),
56
- };
57
- });
58
- vi.doMock("@ryanstark24/sfgraph-shared", async () => {
59
- const actual = await vi.importActual("@ryanstark24/sfgraph-shared");
60
- return {
61
- ...actual,
62
- getSfgraphPaths: () => ({ data: tmpDataDir, cache: tmpDataDir, config: tmpDataDir }),
63
- };
64
- });
65
- return await import("../commands/ingest.js");
66
- }
67
- describe("ingest --db containment", () => {
68
- it("rejects --db path outside the data dir", async () => {
69
- const { ingestCmd } = await loadIngestWithStubs();
70
- const errSpy = vi.spyOn(console, "error").mockImplementation(() => { });
71
- const badDbPath = join(tmpDbDir, "anywhere.sqlite");
72
- await ingestCmd({ org: "myalias", db: badDbPath });
73
- expect(process.exitCode).toBe(1);
74
- const calls = errSpy.mock.calls.map((c) => String(c[0]));
75
- expect(calls.some((s) => s.includes("resolves outside the sfgraph data dir"))).toBe(true);
76
- process.exitCode = 0;
77
- errSpy.mockRestore();
78
- });
79
- it("rejects --db with parent-dir traversal", async () => {
80
- const { ingestCmd } = await loadIngestWithStubs();
81
- const errSpy = vi.spyOn(console, "error").mockImplementation(() => { });
82
- const traversed = join(tmpDataDir, "..", "escape.sqlite");
83
- await ingestCmd({ org: "myalias", db: traversed });
84
- expect(process.exitCode).toBe(1);
85
- process.exitCode = 0;
86
- errSpy.mockRestore();
87
- });
88
- it("accepts --db inside the data dir", async () => {
89
- const { ingestCmd } = await loadIngestWithStubs();
90
- const errSpy = vi.spyOn(console, "error").mockImplementation(() => { });
91
- const goodDbPath = join(tmpDataDir, "00DxxGuardTest001.sqlite");
92
- await ingestCmd({ org: "myalias", db: goodDbPath });
93
- // Either succeeds or fails inside liveIngest (we stubbed it to no-op),
94
- // but it should NOT bail with the containment error.
95
- const calls = errSpy.mock.calls.map((c) => String(c[0]));
96
- expect(calls.some((s) => s.includes("resolves outside the sfgraph data dir"))).toBe(false);
97
- errSpy.mockRestore();
98
- });
99
- it("permits cross-dir --db when SFGRAPH_ALLOW_ANY_DB=1 is set", async () => {
100
- process.env.SFGRAPH_ALLOW_ANY_DB = "1";
101
- const { ingestCmd } = await loadIngestWithStubs();
102
- const errSpy = vi.spyOn(console, "error").mockImplementation(() => { });
103
- const elsewhere = join(tmpDbDir, "ok.sqlite");
104
- await ingestCmd({ org: "myalias", db: elsewhere });
105
- const calls = errSpy.mock.calls.map((c) => String(c[0]));
106
- expect(calls.some((s) => s.includes("resolves outside the sfgraph data dir"))).toBe(false);
107
- errSpy.mockRestore();
108
- });
109
- });
110
- //# sourceMappingURL=ingest-db-guard.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ingest-db-guard.test.js","sourceRoot":"","sources":["../../src/__tests__/ingest-db-guard.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE;;;;;GAKG;AAEH,IAAI,UAAkB,CAAC;AACvB,IAAI,QAAgB,CAAC;AACrB,IAAI,cAAkC,CAAC;AAEvC,UAAU,CAAC,GAAG,EAAE;IACd,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC9D,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;IACjE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAClD,gFAAgF;IAChF,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,gFAAgF;QAChF,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,cAAc,CAAC;IACpD,CAAC;IACD,EAAE,CAAC,eAAe,EAAE,CAAC;IACrB,EAAE,CAAC,YAAY,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,mBAAmB;IAChC,EAAE,CAAC,MAAM,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAClC,2BAA2B,CAC5B,CAAC;QACF,OAAO;YACL,GAAG,MAAM;YACT,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACvB,KAAK,EAAE,mBAAmB;gBAC1B,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,MAAe;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;aACd,CAAC;YACF,UAAU,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;gBACpC,KAAK,EAAE,mBAAmB;gBAC1B,KAAK;gBACL,QAAQ,EAAE,eAAe;gBACzB,WAAW,EAAE,gBAAgB;gBAC7B,UAAU,EAAE,MAAM;gBAClB,IAAI,EAAE,EAAE;aACT,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,MAAM,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAClC,6BAA6B,CAC9B,CAAC;QACF,OAAO;YACL,GAAG,MAAM;YACT,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;SACrF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAC/C,CAAC;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACpD,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QAC1D,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC;QAChE,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACpD,uEAAuE;QACvE,qDAAqD;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3F,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,GAAG,CAAC;QACvC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3F,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ingest-multi.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ingest-multi.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ingest-multi.test.ts"],"names":[],"mappings":""}
@@ -1,51 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { buildProgram } from "../index.js";
3
- /**
4
- * These tests parse the CLI argv into the `ingest` command and assert that the
5
- * commander option model exposes the new flags. We don't actually invoke
6
- * `ingestCmd` (that would hit @salesforce/core); we just verify the parser.
7
- */
8
- describe("sfgraph ingest CLI flags", () => {
9
- function getIngest() {
10
- const program = buildProgram();
11
- const ingest = program.commands.find((c) => c.name() === "ingest");
12
- if (!ingest)
13
- throw new Error("ingest command not registered");
14
- return { program, ingest: ingest };
15
- }
16
- it("registers --orgs, --all, and --parallel options", () => {
17
- const { ingest } = getIngest();
18
- const opts = ingest.options.map((o) => o.long);
19
- expect(opts).toContain("--orgs");
20
- expect(opts).toContain("--all");
21
- expect(opts).toContain("--parallel");
22
- expect(opts).toContain("--org");
23
- });
24
- it("parses --orgs a,b correctly", () => {
25
- const { ingest } = getIngest();
26
- // Parse without running the action by using parseOptions on a clone.
27
- const parsed = ingest.parseOptions(["--orgs", "a,b"]);
28
- expect(parsed).toBeDefined();
29
- // After parse, commander stores parsed values on the command.
30
- const opts = ingest.opts();
31
- expect(opts.orgs).toBe("a,b");
32
- });
33
- it("honors --all flag", () => {
34
- const { ingest } = getIngest();
35
- ingest.parseOptions(["--all"]);
36
- const opts = ingest.opts();
37
- expect(opts.all).toBe(true);
38
- });
39
- it("honors --parallel flag", () => {
40
- const { ingest } = getIngest();
41
- ingest.parseOptions([
42
- "--orgs",
43
- "a,b",
44
- "--parallel",
45
- ]);
46
- const opts = ingest.opts();
47
- expect(opts.parallel).toBe(true);
48
- expect(opts.orgs).toBe("a,b");
49
- });
50
- });
51
- //# sourceMappingURL=ingest-multi.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ingest-multi.test.js","sourceRoot":"","sources":["../../src/__tests__/ingest-multi.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;GAIG;AACH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,SAAS,SAAS;QAMhB,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAe,EAAE,CAAC;IAC9C,CAAC;IAED,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAI,MAA2D,CAAC,OAAO,CAAC,GAAG,CACnF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACd,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QAC/B,qEAAqE;QACrE,MAAM,MAAM,GACV,MAGD,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,8DAA8D;QAC9D,MAAM,IAAI,GAAI,MAA6D,CAAC,IAAI,EAAE,CAAC;QACnF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,MAAiE,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3F,MAAM,IAAI,GAAI,MAA6D,CAAC,IAAI,EAAE,CAAC;QACnF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,MAAiE,CAAC,YAAY,CAAC;YAC9E,QAAQ;YACR,KAAK;YACL,YAAY;SACb,CAAC,CAAC;QACH,MAAM,IAAI,GAAI,MAA6D,CAAC,IAAI,EAAE,CAAC;QACnF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=install-dry-run.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-dry-run.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/install-dry-run.test.ts"],"names":[],"mappings":""}
@@ -1,29 +0,0 @@
1
- import { existsSync, mkdtempSync, rmSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
- import { installCmd } from "../commands/install.js";
6
- let home;
7
- let logs;
8
- beforeEach(() => {
9
- home = mkdtempSync(join(tmpdir(), "sfgraph-inst-"));
10
- logs = [];
11
- });
12
- afterEach(() => {
13
- rmSync(home, { recursive: true, force: true });
14
- });
15
- describe("installCmd --dry-run", () => {
16
- it("logs would-write rows and writes nothing", async () => {
17
- const rows = await installCmd({
18
- target: "all",
19
- dryRun: true,
20
- homeOverride: home,
21
- log: (s) => logs.push(s),
22
- });
23
- expect(rows.every((r) => r.action === "would-write")).toBe(true);
24
- expect(logs.join("\n")).toMatch(/\[dry-run\] no files written/);
25
- expect(existsSync(join(home, ".claude"))).toBe(false);
26
- expect(existsSync(join(home, ".cursor"))).toBe(false);
27
- });
28
- });
29
- //# sourceMappingURL=install-dry-run.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-dry-run.test.js","sourceRoot":"","sources":["../../src/__tests__/install-dry-run.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,IAAI,IAAY,CAAC;AACjB,IAAI,IAAc,CAAC;AAEnB,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACpD,IAAI,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AACH,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC;YAC5B,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,IAAI;YAClB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SACzB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QAChE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=install-e2e.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-e2e.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/install-e2e.test.ts"],"names":[],"mappings":""}