sublyzer-snapshot 0.3.0 → 0.4.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.
- package/README.md +114 -193
- package/dist/cli.js +83 -38
- package/dist/cli.js.map +1 -1
- package/dist/commands/ci.d.ts.map +1 -1
- package/dist/commands/ci.js +15 -14
- package/dist/commands/ci.js.map +1 -1
- package/dist/commands/compare.d.ts +1 -0
- package/dist/commands/compare.d.ts.map +1 -1
- package/dist/commands/compare.js +14 -8
- package/dist/commands/compare.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +47 -45
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +70 -28
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/open.d.ts.map +1 -1
- package/dist/commands/open.js +6 -1
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +4 -1
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/report.d.ts +1 -0
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +19 -19
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/run.d.ts +5 -12
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +12 -90
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/scan.d.ts +13 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +17 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +31 -22
- package/dist/commands/status.js.map +1 -1
- package/dist/config.d.ts +17 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +27 -4
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +4 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -1
- package/dist/constants.js.map +1 -1
- package/dist/detect/scan-target.d.ts +13 -0
- package/dist/detect/scan-target.d.ts.map +1 -0
- package/dist/detect/scan-target.js +95 -0
- package/dist/detect/scan-target.js.map +1 -0
- package/dist/report/markdown.d.ts +1 -1
- package/dist/report/markdown.d.ts.map +1 -1
- package/dist/report/markdown.js +5 -0
- package/dist/report/markdown.js.map +1 -1
- package/dist/scan/bundle-size.d.ts +12 -0
- package/dist/scan/bundle-size.d.ts.map +1 -0
- package/dist/scan/bundle-size.js +50 -0
- package/dist/scan/bundle-size.js.map +1 -0
- package/dist/scan/execute.d.ts +28 -0
- package/dist/scan/execute.d.ts.map +1 -0
- package/dist/scan/execute.js +135 -0
- package/dist/scan/execute.js.map +1 -0
- package/dist/scan/history.d.ts +5 -5
- package/dist/scan/history.d.ts.map +1 -1
- package/dist/scan/history.js +15 -15
- package/dist/scan/history.js.map +1 -1
- package/dist/scan/snapshot.d.ts +8 -0
- package/dist/scan/snapshot.d.ts.map +1 -1
- package/dist/scan/snapshot.js +37 -9
- package/dist/scan/snapshot.js.map +1 -1
- package/package.json +10 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAUlD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB,EAAE;IAClD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAErD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,yFAAyF;YACvF,iEAAiE,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAC9D,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAExB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAClC,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,MAAO,EAAE,MAAM,CAAC,eAAgB,EAAE,OAAO,EAAE;QACzF,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;QAChC,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,qBAAqB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,EAAE,CAAC,cAAc,CAAC,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAsB,SAAS,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+CzE"}
|
package/dist/commands/report.js
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
-
import { dashboardIntegrationUrl,
|
|
3
|
+
import { dashboardIntegrationUrl, tryLoadConfig } from '../config.js';
|
|
4
4
|
import { diffSnapshots, loadLastSnapshot, loadPreviousSnapshot } from '../scan/history.js';
|
|
5
|
+
import { resolveScanTarget } from '../detect/scan-target.js';
|
|
5
6
|
import { buildProjectSnapshot } from '../scan/snapshot.js';
|
|
6
7
|
import { computeHealthScore } from '../scan/health-score.js';
|
|
7
8
|
import { renderMarkdownReport } from '../report/markdown.js';
|
|
8
9
|
import { info, ok, title } from '../utils/log.js';
|
|
9
10
|
export async function runReport(opts = {}) {
|
|
10
|
-
const config =
|
|
11
|
-
const
|
|
11
|
+
const config = tryLoadConfig();
|
|
12
|
+
const anchor = config?.configRoot || process.cwd();
|
|
12
13
|
let snapshot = opts.rescan
|
|
13
|
-
? buildProjectSnapshot(
|
|
14
|
-
|
|
14
|
+
? buildProjectSnapshot(anchor, {
|
|
15
|
+
skipAudit: opts.skipAudit,
|
|
16
|
+
target: resolveScanTarget(anchor, opts.path || config?.scanRoot),
|
|
17
|
+
})
|
|
18
|
+
: loadLastSnapshot(anchor);
|
|
15
19
|
if (!snapshot) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
throw new Error('Scan failed');
|
|
22
|
-
}
|
|
20
|
+
info('No cached scan — running fresh scan…');
|
|
21
|
+
snapshot = buildProjectSnapshot(anchor, {
|
|
22
|
+
skipAudit: opts.skipAudit,
|
|
23
|
+
target: resolveScanTarget(anchor, opts.path),
|
|
24
|
+
});
|
|
23
25
|
}
|
|
24
26
|
const health = snapshot.health ?? computeHealthScore(snapshot);
|
|
25
|
-
const previous = loadPreviousSnapshot(
|
|
27
|
+
const previous = loadPreviousSnapshot(anchor);
|
|
26
28
|
const diff = previous
|
|
27
29
|
? diffSnapshots(previous, snapshot, health.score - (previous.health?.score ?? previous.summary?.healthScore ?? 0))
|
|
28
30
|
: null;
|
|
29
|
-
const markdown = renderMarkdownReport(snapshot, health, diff, dashboardIntegrationUrl(config));
|
|
31
|
+
const markdown = renderMarkdownReport(snapshot, health, diff, config ? dashboardIntegrationUrl(config) : null);
|
|
30
32
|
if (opts.json) {
|
|
31
33
|
return JSON.stringify({ markdown, health, snapshot: { scannedAt: snapshot.scannedAt, projectName: snapshot.projectName } }, null, 2);
|
|
32
34
|
}
|
|
33
35
|
if (opts.out) {
|
|
34
|
-
const outPath = path.resolve(
|
|
36
|
+
const outPath = path.resolve(anchor, opts.out);
|
|
35
37
|
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
|
36
38
|
fs.writeFileSync(outPath, markdown, 'utf8');
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
ok(`Wrote ${outPath}`);
|
|
40
|
-
}
|
|
39
|
+
title('Sublyzer Snapshot — report');
|
|
40
|
+
ok(`Wrote ${outPath}`);
|
|
41
41
|
return markdown;
|
|
42
42
|
}
|
|
43
43
|
title('Sublyzer Snapshot — report');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -1,21 +1,14 @@
|
|
|
1
1
|
import type { FailOnLevel } from '../constants.js';
|
|
2
|
-
import { diffSnapshots } from '../scan/history.js';
|
|
3
|
-
import { type ProjectSnapshot } from '../scan/snapshot.js';
|
|
4
2
|
export type RunOptions = {
|
|
3
|
+
path?: string;
|
|
5
4
|
dryRun?: boolean;
|
|
5
|
+
push?: boolean;
|
|
6
|
+
local?: boolean;
|
|
6
7
|
skipAudit?: boolean;
|
|
7
8
|
skipOutdated?: boolean;
|
|
9
|
+
skipBundle?: boolean;
|
|
8
10
|
json?: boolean;
|
|
9
11
|
failOn?: FailOnLevel;
|
|
10
12
|
};
|
|
11
|
-
export
|
|
12
|
-
success: boolean;
|
|
13
|
-
dryRun: boolean;
|
|
14
|
-
snapshot: ProjectSnapshot;
|
|
15
|
-
eventsSent?: number;
|
|
16
|
-
dashboardUrl?: string;
|
|
17
|
-
diff?: ReturnType<typeof diffSnapshots>;
|
|
18
|
-
policyFailed?: boolean;
|
|
19
|
-
};
|
|
20
|
-
export declare function runScan(opts?: RunOptions): Promise<RunResult>;
|
|
13
|
+
export declare function runRunCommand(opts?: RunOptions): Promise<import("../scan/execute.js").ExecuteScanResult>;
|
|
21
14
|
//# sourceMappingURL=run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,wBAAsB,aAAa,CAAC,IAAI,GAAE,UAAe,2DAexD"}
|
package/dist/commands/run.js
CHANGED
|
@@ -1,96 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import { failOnMessage, shouldFailOnVulns } from '../scan/policy.js';
|
|
5
|
-
import { buildProjectSnapshot, printLocalSummary, snapshotToCollectItems, } from '../scan/snapshot.js';
|
|
6
|
-
import { info, ok, title, warn } from '../utils/log.js';
|
|
7
|
-
function applyScanToConfig(config, snapshot, eventsSent) {
|
|
8
|
-
config.updatedAt = new Date().toISOString();
|
|
9
|
-
config.lastScanAt = snapshot.scannedAt;
|
|
10
|
-
const lastScan = {
|
|
11
|
-
scannedAt: snapshot.scannedAt,
|
|
12
|
-
routeCount: snapshot.summary.routeCount,
|
|
13
|
-
dependencyCount: snapshot.dependencyCount,
|
|
14
|
-
vulnerablePackages: snapshot.summary.vulnerablePackages,
|
|
15
|
-
criticalVulns: snapshot.summary.criticalVulns,
|
|
16
|
-
highVulns: snapshot.summary.highVulns,
|
|
17
|
-
eventsSent,
|
|
18
|
-
healthScore: snapshot.health.score,
|
|
19
|
-
healthGrade: snapshot.health.grade,
|
|
20
|
-
};
|
|
21
|
-
config.lastScan = lastScan;
|
|
22
|
-
}
|
|
23
|
-
export async function runScan(opts = {}) {
|
|
24
|
-
if (!opts.json)
|
|
25
|
-
title('Sublyzer Snapshot — scan');
|
|
26
|
-
const config = loadConfig();
|
|
27
|
-
const root = config.projectRoot || process.cwd();
|
|
28
|
-
const previous = loadLastSnapshot(root);
|
|
1
|
+
import { executeScan } from '../scan/execute.js';
|
|
2
|
+
import { title } from '../utils/log.js';
|
|
3
|
+
export async function runRunCommand(opts = {}) {
|
|
29
4
|
if (!opts.json)
|
|
30
|
-
|
|
31
|
-
const
|
|
5
|
+
title('Sublyzer Snapshot — run');
|
|
6
|
+
const push = opts.local ? false : opts.push ?? undefined;
|
|
7
|
+
return executeScan({
|
|
8
|
+
path: opts.path,
|
|
9
|
+
dryRun: opts.dryRun,
|
|
10
|
+
push,
|
|
32
11
|
skipAudit: opts.skipAudit,
|
|
33
12
|
skipOutdated: opts.skipOutdated,
|
|
13
|
+
skipBundle: opts.skipBundle,
|
|
14
|
+
json: opts.json,
|
|
15
|
+
failOn: opts.failOn,
|
|
34
16
|
});
|
|
35
|
-
const healthDelta = previous
|
|
36
|
-
? snapshot.health.score - (previous.health?.score ?? previous.summary?.healthScore ?? 0)
|
|
37
|
-
: null;
|
|
38
|
-
const diff = diffSnapshots(previous, snapshot, healthDelta);
|
|
39
|
-
if (!opts.json && previous && (diff.routesAdded.length || diff.vulnDelta.total !== 0 || healthDelta !== 0)) {
|
|
40
|
-
info('Changes since last scan:');
|
|
41
|
-
if (healthDelta != null && healthDelta !== 0) {
|
|
42
|
-
console.log(` Health: ${healthDelta > 0 ? '+' : ''}${healthDelta} → ${snapshot.health.score}/100`);
|
|
43
|
-
}
|
|
44
|
-
if (diff.vulnDelta.total !== 0) {
|
|
45
|
-
console.log(` Vulnerabilities: ${diff.vulnDelta.total >= 0 ? '+' : ''}${diff.vulnDelta.total}`);
|
|
46
|
-
}
|
|
47
|
-
if (diff.routesAdded.length)
|
|
48
|
-
console.log(` Routes added: ${diff.routesAdded.length}`);
|
|
49
|
-
if (diff.routesRemoved.length)
|
|
50
|
-
console.log(` Routes removed: ${diff.routesRemoved.length}`);
|
|
51
|
-
console.log('');
|
|
52
|
-
}
|
|
53
|
-
if (!opts.json)
|
|
54
|
-
printLocalSummary(snapshot);
|
|
55
|
-
if (opts.failOn && shouldFailOnVulns(snapshot, opts.failOn)) {
|
|
56
|
-
const msg = failOnMessage(snapshot, opts.failOn);
|
|
57
|
-
if (opts.json) {
|
|
58
|
-
return { success: false, dryRun: Boolean(opts.dryRun), snapshot, diff, policyFailed: true };
|
|
59
|
-
}
|
|
60
|
-
throw new Error(msg);
|
|
61
|
-
}
|
|
62
|
-
if (opts.dryRun) {
|
|
63
|
-
if (!opts.json)
|
|
64
|
-
warn('Dry run — nothing sent to Sublyzer.');
|
|
65
|
-
return { success: true, dryRun: true, snapshot, diff };
|
|
66
|
-
}
|
|
67
|
-
const items = snapshotToCollectItems(snapshot);
|
|
68
|
-
if (!opts.json)
|
|
69
|
-
info(`Pushing ${items.length} events to ${config.apiUrl}…`);
|
|
70
|
-
const result = await pushSnapshot(config.apiUrl, config.integrationCode, items);
|
|
71
|
-
if (!result.success) {
|
|
72
|
-
throw new Error(result.error || 'Failed to push snapshot');
|
|
73
|
-
}
|
|
74
|
-
const eventsSent = result.processed ?? items.length;
|
|
75
|
-
const dash = dashboardIntegrationUrl(config);
|
|
76
|
-
saveScanHistory(snapshot, root);
|
|
77
|
-
applyScanToConfig(config, snapshot, eventsSent);
|
|
78
|
-
saveConfig(config, root);
|
|
79
|
-
const runResult = {
|
|
80
|
-
success: true,
|
|
81
|
-
dryRun: false,
|
|
82
|
-
snapshot,
|
|
83
|
-
eventsSent,
|
|
84
|
-
dashboardUrl: dash,
|
|
85
|
-
diff,
|
|
86
|
-
};
|
|
87
|
-
if (opts.json)
|
|
88
|
-
return runResult;
|
|
89
|
-
ok(`Sent ${eventsSent} events`);
|
|
90
|
-
console.log(` Dashboard: ${dash}`);
|
|
91
|
-
console.log('');
|
|
92
|
-
console.log(' Next: sublyzer-snapshot report | compare | pull');
|
|
93
|
-
console.log('');
|
|
94
|
-
return runResult;
|
|
95
17
|
}
|
|
96
18
|
//# sourceMappingURL=run.js.map
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAcxC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAmB,EAAE;IACvD,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;IAEzD,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI;QACJ,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FailOnLevel } from '../constants.js';
|
|
2
|
+
export type ScanOptions = {
|
|
3
|
+
path?: string;
|
|
4
|
+
skipAudit?: boolean;
|
|
5
|
+
skipOutdated?: boolean;
|
|
6
|
+
skipBundle?: boolean;
|
|
7
|
+
push?: boolean;
|
|
8
|
+
dryRun?: boolean;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
failOn?: FailOnLevel;
|
|
11
|
+
};
|
|
12
|
+
export declare function runScanCommand(opts?: ScanOptions): Promise<import("../scan/execute.js").ExecuteScanResult>;
|
|
13
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,wBAAsB,cAAc,CAAC,IAAI,GAAE,WAAgB,2DAY1D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { executeScan } from '../scan/execute.js';
|
|
2
|
+
import { title } from '../utils/log.js';
|
|
3
|
+
export async function runScanCommand(opts = {}) {
|
|
4
|
+
if (!opts.json)
|
|
5
|
+
title('Sublyzer Snapshot — scan');
|
|
6
|
+
return executeScan({
|
|
7
|
+
path: opts.path,
|
|
8
|
+
skipAudit: opts.skipAudit,
|
|
9
|
+
skipOutdated: opts.skipOutdated,
|
|
10
|
+
skipBundle: opts.skipBundle,
|
|
11
|
+
push: opts.push ?? false,
|
|
12
|
+
dryRun: opts.dryRun,
|
|
13
|
+
json: opts.json,
|
|
14
|
+
failOn: opts.failOn,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAQ,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAa9C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAoB,EAAE;IACzD,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAClD,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;QACxB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/C,wBAAsB,SAAS,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6D1F"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,50 +1,59 @@
|
|
|
1
|
-
import { configExists, configPath, dashboardIntegrationUrl, loadConfig, maskSecret, publicReadUrl, } from '../config.js';
|
|
1
|
+
import { configExists, configPath, dashboardIntegrationUrl, isCloudConfig, loadConfig, maskSecret, publicReadUrl, } from '../config.js';
|
|
2
2
|
import { info, title } from '../utils/log.js';
|
|
3
3
|
export async function runStatus(opts = {}) {
|
|
4
4
|
if (!configExists()) {
|
|
5
|
-
throw new Error(
|
|
5
|
+
throw new Error('Not initialized. Run: npx sublyzer-snapshot init --local (or scan without init)');
|
|
6
6
|
}
|
|
7
7
|
const config = loadConfig();
|
|
8
|
+
const cloud = isCloudConfig(config);
|
|
8
9
|
const payload = {
|
|
9
10
|
initialized: true,
|
|
10
|
-
|
|
11
|
+
mode: config.mode,
|
|
12
|
+
configPath: configPath(config.configRoot),
|
|
11
13
|
projectName: config.projectName,
|
|
12
|
-
|
|
14
|
+
configRoot: config.configRoot,
|
|
15
|
+
scanRoot: config.scanRoot,
|
|
13
16
|
stack: config.stack,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
cloudLinked: cloud,
|
|
18
|
+
integration: cloud
|
|
19
|
+
? {
|
|
20
|
+
id: config.integrationId,
|
|
21
|
+
name: config.integrationName,
|
|
22
|
+
code: maskSecret(config.integrationCode, 6),
|
|
23
|
+
}
|
|
24
|
+
: null,
|
|
25
|
+
apiUrl: config.apiUrl ?? null,
|
|
21
26
|
dashboardUrl: dashboardIntegrationUrl(config),
|
|
22
27
|
readKey: config.readKey ? maskSecret(config.readKey) : null,
|
|
23
|
-
pullEnabled: Boolean(config.readKey || process.env.SUBLYZER_READ_KEY),
|
|
24
|
-
publicReadUrl: publicReadUrl(config, { limit: 50, windowDays: 7 }),
|
|
28
|
+
pullEnabled: cloud && Boolean(config.readKey || process.env.SUBLYZER_READ_KEY),
|
|
29
|
+
publicReadUrl: cloud ? publicReadUrl(config, { limit: 50, windowDays: 7 }) : null,
|
|
25
30
|
createdAt: config.createdAt,
|
|
26
31
|
updatedAt: config.updatedAt,
|
|
27
32
|
lastScanAt: config.lastScanAt ?? null,
|
|
28
33
|
lastScan: config.lastScan ?? null,
|
|
29
34
|
};
|
|
30
|
-
if (opts.json)
|
|
35
|
+
if (opts.json)
|
|
31
36
|
return payload;
|
|
32
|
-
}
|
|
33
37
|
title('Sublyzer Snapshot — status');
|
|
38
|
+
info(`Mode: ${config.mode}`);
|
|
34
39
|
info(`Project: ${config.projectName}`);
|
|
35
|
-
info(`
|
|
36
|
-
info(`
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
info(`Scan root: ${config.scanRoot}`);
|
|
41
|
+
info(`Config: ${configPath(config.configRoot)}`);
|
|
42
|
+
if (cloud) {
|
|
43
|
+
info(`Integration: ${config.integrationName || '—'} (${maskSecret(config.integrationCode, 6)})`);
|
|
44
|
+
info(`Dashboard: ${dashboardIntegrationUrl(config) || '—'}`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
info('Cloud: not linked (local-only — optional: init --code …)');
|
|
48
|
+
}
|
|
40
49
|
if (config.lastScanAt) {
|
|
41
50
|
info(`Last scan: ${config.lastScanAt}`);
|
|
42
51
|
if (config.lastScan) {
|
|
43
|
-
info(` health ${config.lastScan.healthScore}/100 (${config.lastScan.healthGrade}), routes ${config.lastScan.routeCount},
|
|
52
|
+
info(` health ${config.lastScan.healthScore}/100 (${config.lastScan.healthGrade}), routes ${config.lastScan.routeCount}, pushed ${config.lastScan.pushedToCloud ? 'yes' : 'no'}`);
|
|
44
53
|
}
|
|
45
54
|
}
|
|
46
55
|
else {
|
|
47
|
-
info('Last scan: never — run `sublyzer-snapshot
|
|
56
|
+
info('Last scan: never — run `npx sublyzer-snapshot scan`');
|
|
48
57
|
}
|
|
49
58
|
console.log('');
|
|
50
59
|
return payload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,uBAAuB,EACvB,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAI9C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAsB,EAAE;IACtD,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { type SnapshotMode } from './constants.js';
|
|
1
2
|
export type LastScanSummary = {
|
|
2
3
|
scannedAt: string;
|
|
4
|
+
scanRoot: string;
|
|
3
5
|
routeCount: number;
|
|
4
6
|
dependencyCount: number;
|
|
5
7
|
vulnerablePackages: number;
|
|
@@ -8,29 +10,39 @@ export type LastScanSummary = {
|
|
|
8
10
|
eventsSent: number;
|
|
9
11
|
healthScore: number;
|
|
10
12
|
healthGrade: 'A' | 'B' | 'C' | 'D' | 'F';
|
|
13
|
+
pushedToCloud: boolean;
|
|
11
14
|
};
|
|
12
15
|
export type SnapshotConfig = {
|
|
13
16
|
version: 1;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
mode: SnapshotMode;
|
|
18
|
+
integrationCode?: string;
|
|
19
|
+
apiUrl?: string;
|
|
20
|
+
dashboardUrl?: string;
|
|
17
21
|
integrationId?: string;
|
|
18
22
|
integrationName?: string;
|
|
19
23
|
readKey?: string;
|
|
20
24
|
projectName: string;
|
|
21
|
-
|
|
25
|
+
/** Config anchor directory (where .sublyzer lives) */
|
|
26
|
+
configRoot: string;
|
|
27
|
+
/** Preferred scan directory (may differ in monorepos) */
|
|
28
|
+
scanRoot: string;
|
|
22
29
|
stack: string;
|
|
23
30
|
createdAt: string;
|
|
24
31
|
updatedAt: string;
|
|
25
32
|
lastScanAt?: string;
|
|
26
33
|
lastScan?: LastScanSummary;
|
|
34
|
+
/** @deprecated use configRoot */
|
|
35
|
+
projectRoot?: string;
|
|
27
36
|
};
|
|
28
37
|
export declare function configPath(cwd?: string): string;
|
|
29
38
|
export declare function configExists(cwd?: string): boolean;
|
|
39
|
+
export declare function tryLoadConfig(cwd?: string): SnapshotConfig | null;
|
|
30
40
|
export declare function loadConfig(cwd?: string): SnapshotConfig;
|
|
31
41
|
export declare function saveConfig(config: SnapshotConfig, cwd?: string): void;
|
|
32
|
-
export declare function
|
|
42
|
+
export declare function isCloudConfig(config: SnapshotConfig): boolean;
|
|
43
|
+
export declare function dashboardIntegrationUrl(config: SnapshotConfig): string | null;
|
|
33
44
|
export declare function publicReadUrl(config: SnapshotConfig, params?: Record<string, string | number>): string | null;
|
|
34
45
|
export declare function maskSecret(value: string | undefined, visible?: number): string;
|
|
35
46
|
export declare function resolveReadKey(config: SnapshotConfig, override?: string): string | undefined;
|
|
47
|
+
export declare function historyAnchor(config: SnapshotConfig | null, cwd?: string): string;
|
|
36
48
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE5E,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,SAAgB,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,GAAG,SAAgB,GAAG,OAAO,CAEzD;AAED,wBAAgB,aAAa,CAAC,GAAG,SAAgB,GAAG,cAAc,GAAG,IAAI,CAGxE;AAED,wBAAgB,UAAU,CAAC,GAAG,SAAgB,GAAG,cAAc,CAmB9D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,SAAgB,GAAG,IAAI,CAK5E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAE7D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAO7E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAW7G;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,SAAI,GAAG,MAAM,CAIzE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI5F;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,EAAE,GAAG,SAAgB,GAAG,MAAM,CAExF"}
|
package/dist/config.js
CHANGED
|
@@ -7,31 +7,51 @@ export function configPath(cwd = process.cwd()) {
|
|
|
7
7
|
export function configExists(cwd = process.cwd()) {
|
|
8
8
|
return fs.existsSync(configPath(cwd));
|
|
9
9
|
}
|
|
10
|
+
export function tryLoadConfig(cwd = process.cwd()) {
|
|
11
|
+
if (!configExists(cwd))
|
|
12
|
+
return null;
|
|
13
|
+
return loadConfig(cwd);
|
|
14
|
+
}
|
|
10
15
|
export function loadConfig(cwd = process.cwd()) {
|
|
11
16
|
const file = configPath(cwd);
|
|
12
17
|
if (!fs.existsSync(file)) {
|
|
13
|
-
throw new Error(`Config not found at ${file}. Run: sublyzer-snapshot init`);
|
|
18
|
+
throw new Error(`Config not found at ${file}. Run: sublyzer-snapshot init --local (or init --code … for cloud sync)`);
|
|
14
19
|
}
|
|
15
20
|
const raw = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
16
21
|
if (raw.version !== 1) {
|
|
17
22
|
throw new Error('Unsupported config version. Re-run: sublyzer-snapshot init');
|
|
18
23
|
}
|
|
24
|
+
if (!raw.mode) {
|
|
25
|
+
raw.mode = raw.integrationCode ? 'cloud' : 'local';
|
|
26
|
+
}
|
|
27
|
+
if (!raw.configRoot) {
|
|
28
|
+
raw.configRoot = raw.projectRoot || cwd;
|
|
29
|
+
}
|
|
30
|
+
if (!raw.scanRoot) {
|
|
31
|
+
raw.scanRoot = raw.configRoot;
|
|
32
|
+
}
|
|
19
33
|
return raw;
|
|
20
34
|
}
|
|
21
35
|
export function saveConfig(config, cwd = process.cwd()) {
|
|
22
|
-
const
|
|
36
|
+
const anchor = config.configRoot || cwd;
|
|
37
|
+
const file = configPath(anchor);
|
|
23
38
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
24
39
|
fs.writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
|
|
25
40
|
}
|
|
41
|
+
export function isCloudConfig(config) {
|
|
42
|
+
return config.mode === 'cloud' && Boolean(config.integrationCode);
|
|
43
|
+
}
|
|
26
44
|
export function dashboardIntegrationUrl(config) {
|
|
27
|
-
|
|
45
|
+
if (!isCloudConfig(config))
|
|
46
|
+
return null;
|
|
47
|
+
const base = (config.dashboardUrl || 'https://sublyzer.com').replace(/\/$/, '');
|
|
28
48
|
if (config.integrationId) {
|
|
29
49
|
return `${base}/dashboard/integration/${config.integrationId}`;
|
|
30
50
|
}
|
|
31
51
|
return `${base}/dashboard`;
|
|
32
52
|
}
|
|
33
53
|
export function publicReadUrl(config, params) {
|
|
34
|
-
if (!config.readKey)
|
|
54
|
+
if (!config.readKey || !config.integrationCode || !config.apiUrl)
|
|
35
55
|
return null;
|
|
36
56
|
const base = config.apiUrl.replace(/\/$/, '');
|
|
37
57
|
const url = new URL(`${base}/data-collection/integration/${config.integrationCode}/data`);
|
|
@@ -55,4 +75,7 @@ export function resolveReadKey(config, override) {
|
|
|
55
75
|
const key = (override || fromEnv || config.readKey || '').trim();
|
|
56
76
|
return key || undefined;
|
|
57
77
|
}
|
|
78
|
+
export function historyAnchor(config, cwd = process.cwd()) {
|
|
79
|
+
return config?.configRoot || cwd;
|
|
80
|
+
}
|
|
58
81
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const SDK_NAME = "sublyzer-snapshot";
|
|
2
|
-
export declare const SDK_VERSION = "0.
|
|
2
|
+
export declare const SDK_VERSION = "0.4.0";
|
|
3
3
|
export declare const DEFAULT_API_URL = "https://api.sublyzer.com";
|
|
4
4
|
export declare const DEFAULT_DASHBOARD_URL = "https://sublyzer.com";
|
|
5
5
|
export declare const CONFIG_DIR = ".sublyzer";
|
|
@@ -10,4 +10,7 @@ export declare const MAX_HISTORY_FILES = 20;
|
|
|
10
10
|
export declare const INTEGRATION_CODE_RE: RegExp;
|
|
11
11
|
export declare const GITIGNORE_ENTRY = ".sublyzer/";
|
|
12
12
|
export type FailOnLevel = 'critical' | 'high' | 'moderate' | 'any';
|
|
13
|
+
export type SnapshotMode = 'local' | 'cloud';
|
|
14
|
+
export declare const DOCS_URL = "https://sublyzer.com/docs/sdk";
|
|
15
|
+
export declare const DASHBOARD_URL = "https://sublyzer.com/dashboard";
|
|
13
16
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,sBAAsB,CAAC;AAC5C,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAC1D,eAAO,MAAM,qBAAqB,yBAAyB,CAAC;AAE5D,eAAO,MAAM,UAAU,cAAc,CAAC;AACtC,eAAO,MAAM,WAAW,kBAAkB,CAAC;AAC3C,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,WAAW,YAAY,CAAC;AACrC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AAEpD,eAAO,MAAM,eAAe,eAAe,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,sBAAsB,CAAC;AAC5C,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAC1D,eAAO,MAAM,qBAAqB,yBAAyB,CAAC;AAE5D,eAAO,MAAM,UAAU,cAAc,CAAC;AACtC,eAAO,MAAM,WAAW,kBAAkB,CAAC;AAC3C,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,WAAW,YAAY,CAAC;AACrC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AAEpD,eAAO,MAAM,eAAe,eAAe,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;AACnE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAE7C,eAAO,MAAM,QAAQ,kCAAkC,CAAC;AACxD,eAAO,MAAM,aAAa,mCAAmC,CAAC"}
|
package/dist/constants.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const SDK_NAME = 'sublyzer-snapshot';
|
|
2
|
-
export const SDK_VERSION = '0.
|
|
2
|
+
export const SDK_VERSION = '0.4.0';
|
|
3
3
|
export const DEFAULT_API_URL = 'https://api.sublyzer.com';
|
|
4
4
|
export const DEFAULT_DASHBOARD_URL = 'https://sublyzer.com';
|
|
5
5
|
export const CONFIG_DIR = '.sublyzer';
|
|
@@ -9,4 +9,6 @@ export const HISTORY_DIR = 'history';
|
|
|
9
9
|
export const MAX_HISTORY_FILES = 20;
|
|
10
10
|
export const INTEGRATION_CODE_RE = /^[A-Z0-9]{24}$/;
|
|
11
11
|
export const GITIGNORE_ENTRY = '.sublyzer/';
|
|
12
|
+
export const DOCS_URL = 'https://sublyzer.com/docs/sdk';
|
|
13
|
+
export const DASHBOARD_URL = 'https://sublyzer.com/dashboard';
|
|
12
14
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AAE5D,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AAE5D,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAK5C,MAAM,CAAC,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AACxD,MAAM,CAAC,MAAM,aAAa,GAAG,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { detectStack } from './stack.js';
|
|
2
|
+
export type ScanTarget = {
|
|
3
|
+
root: string;
|
|
4
|
+
reason: string;
|
|
5
|
+
stack: ReturnType<typeof detectStack>;
|
|
6
|
+
score: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Pick the best directory to scan — useful for monorepos where cwd is a meta root.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveScanTarget(base?: string, explicitPath?: string): ScanTarget;
|
|
12
|
+
export declare function findMonorepoScanHints(base?: string): ScanTarget[];
|
|
13
|
+
//# sourceMappingURL=scan-target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-target.d.ts","sourceRoot":"","sources":["../../src/detect/scan-target.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAmEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,SAAgB,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAsBzF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,SAAgB,GAAG,UAAU,EAAE,CAMxE"}
|