@fortytwoservices/ai-universe-code-guard 0.0.0 → 2026.10.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/LICENSE +15 -0
- package/dist/audit/report.d.ts +6 -0
- package/dist/audit/report.d.ts.map +1 -0
- package/dist/audit/report.js +94 -0
- package/dist/audit/report.js.map +1 -0
- package/dist/audit/scan.d.ts +28 -0
- package/dist/audit/scan.d.ts.map +1 -0
- package/dist/audit/scan.js +146 -0
- package/dist/audit/scan.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/complexity/calculate.d.ts +13 -0
- package/dist/complexity/calculate.d.ts.map +1 -0
- package/dist/complexity/calculate.js +182 -0
- package/dist/complexity/calculate.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +15 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +37 -0
- package/dist/output.js.map +1 -0
- package/dist/policy.d.ts +8 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +12 -0
- package/dist/policy.js.map +1 -0
- package/dist/runtime/code-detection.d.ts +8 -0
- package/dist/runtime/code-detection.d.ts.map +1 -0
- package/dist/runtime/code-detection.js +17 -0
- package/dist/runtime/code-detection.js.map +1 -0
- package/dist/runtime/content-policy.d.ts +23 -0
- package/dist/runtime/content-policy.d.ts.map +1 -0
- package/dist/runtime/content-policy.js +73 -0
- package/dist/runtime/content-policy.js.map +1 -0
- package/dist/sync/canonical-rule.d.ts +14 -0
- package/dist/sync/canonical-rule.d.ts.map +1 -0
- package/dist/sync/canonical-rule.js +59 -0
- package/dist/sync/canonical-rule.js.map +1 -0
- package/dist/sync/surfaces.d.ts +8 -0
- package/dist/sync/surfaces.d.ts.map +1 -0
- package/dist/sync/surfaces.js +45 -0
- package/dist/sync/surfaces.js.map +1 -0
- package/dist/sync/sync.d.ts +26 -0
- package/dist/sync/sync.d.ts.map +1 -0
- package/dist/sync/sync.js +124 -0
- package/dist/sync/sync.js.map +1 -0
- package/package.json +39 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Copyright (c) Fortytwo. All rights reserved.
|
|
2
|
+
|
|
3
|
+
This software is proprietary to Fortytwo and is licensed, not sold.
|
|
4
|
+
|
|
5
|
+
You may use this software only as part of an AI Universe deployment that you
|
|
6
|
+
have licensed from Fortytwo, and only for as long as that license is in force.
|
|
7
|
+
|
|
8
|
+
You may not distribute, sublicense, publish or otherwise make
|
|
9
|
+
this software available to any third party, and you may not use it outside
|
|
10
|
+
an AI Universe deployment licensed from Fortytwo.
|
|
11
|
+
|
|
12
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
13
|
+
IMPLIED. IN NO EVENT SHALL FORTYTWO BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
14
|
+
LIABILITY ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR ITS USE,
|
|
15
|
+
EXCEPT AS SET OUT IN YOUR LICENSE AGREEMENT WITH FORTYTWO.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CodeGuardBand } from '../policy.js';
|
|
2
|
+
import type { AuditEntry, AuditReport } from './scan.js';
|
|
3
|
+
export declare function sortedBandEntries(report: AuditReport, band: CodeGuardBand): readonly AuditEntry[];
|
|
4
|
+
export declare function formatAuditReport(report: AuditReport): string;
|
|
5
|
+
export declare function toSnapshot(report: AuditReport): string;
|
|
6
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/audit/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEzD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,GAAG,SAAS,UAAU,EAAE,CAEjG;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsB7D;AAoDD,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsCtD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export function sortedBandEntries(report, band) {
|
|
2
|
+
return [...report.entries.filter((e) => e.band === band)].sort(byComplexityDesc);
|
|
3
|
+
}
|
|
4
|
+
export function formatAuditReport(report) {
|
|
5
|
+
const lines = [];
|
|
6
|
+
lines.push(`# Cyclomatic complexity audit — ${report.root}`);
|
|
7
|
+
lines.push('');
|
|
8
|
+
lines.push(`Policy: warn at \`${String(report.policy.warnAt)}\`, block at \`${String(report.policy.blockAt)}\`.`);
|
|
9
|
+
lines.push('');
|
|
10
|
+
lines.push('## Totals');
|
|
11
|
+
lines.push('');
|
|
12
|
+
lines.push(`- Files scanned: **${String(report.scannedFiles)}**`);
|
|
13
|
+
lines.push(`- Functions measured: **${String(report.entries.length)}**`);
|
|
14
|
+
lines.push(`- Passing: **${String(report.passed)}**`);
|
|
15
|
+
lines.push(`- Warnings (${String(report.policy.warnAt)}-${String(report.policy.blockAt - 1)}): **${String(report.warnings)}**`);
|
|
16
|
+
lines.push(`- Blocks (>= ${String(report.policy.blockAt)}): **${String(report.blocks)}**`);
|
|
17
|
+
appendUnreadableSection(report, lines);
|
|
18
|
+
appendWorstSection(report, lines);
|
|
19
|
+
appendBandSection(report, 'block', 'Blocks (must refactor)', true, lines);
|
|
20
|
+
appendBandSection(report, 'warn', 'Warnings (consider refactor)', false, lines);
|
|
21
|
+
return lines.join('\n');
|
|
22
|
+
}
|
|
23
|
+
function appendUnreadableSection(report, lines) {
|
|
24
|
+
const unreadable = report.unreadable ?? [];
|
|
25
|
+
if (unreadable.length === 0)
|
|
26
|
+
return;
|
|
27
|
+
lines.push('');
|
|
28
|
+
lines.push('## Unreadable paths — THIS REPORT IS PARTIAL');
|
|
29
|
+
lines.push('');
|
|
30
|
+
lines.push('| Path | Kind | Reason |');
|
|
31
|
+
lines.push('| --- | --- | --- |');
|
|
32
|
+
for (const u of unreadable) {
|
|
33
|
+
lines.push(`| \`${u.path}\` | ${u.kind} | ${u.reason} |`);
|
|
34
|
+
}
|
|
35
|
+
lines.push('');
|
|
36
|
+
lines.push('A path the process could not open is NOT a path with nothing in it. The totals above ' +
|
|
37
|
+
'count only what the walk reached.');
|
|
38
|
+
}
|
|
39
|
+
function appendWorstSection(report, lines) {
|
|
40
|
+
if (report.worst === null)
|
|
41
|
+
return;
|
|
42
|
+
lines.push(`- Worst: \`${report.worst.name}\` in \`${report.worst.file}\` at CC **${String(report.worst.complexity)}**`);
|
|
43
|
+
lines.push('');
|
|
44
|
+
}
|
|
45
|
+
function appendBandSection(report, band, heading, bold, lines) {
|
|
46
|
+
const entries = sortedBandEntries(report, band);
|
|
47
|
+
if (entries.length === 0)
|
|
48
|
+
return;
|
|
49
|
+
lines.push(`## ${heading}`);
|
|
50
|
+
lines.push('');
|
|
51
|
+
lines.push('| Function | File | CC |');
|
|
52
|
+
lines.push('| --- | --- | ---: |');
|
|
53
|
+
for (const e of entries) {
|
|
54
|
+
const cc = bold ? `**${String(e.complexity)}**` : String(e.complexity);
|
|
55
|
+
lines.push(`| \`${e.name}\` | \`${e.file}:${String(e.startLine)}\` | ${cc} |`);
|
|
56
|
+
}
|
|
57
|
+
lines.push('');
|
|
58
|
+
}
|
|
59
|
+
function byComplexityDesc(a, b) {
|
|
60
|
+
return b.complexity - a.complexity;
|
|
61
|
+
}
|
|
62
|
+
export function toSnapshot(report) {
|
|
63
|
+
return (JSON.stringify({
|
|
64
|
+
policy: report.policy,
|
|
65
|
+
root: report.root,
|
|
66
|
+
scannedFiles: report.scannedFiles,
|
|
67
|
+
unreadable: (report.unreadable ?? []).map((u) => ({
|
|
68
|
+
path: u.path,
|
|
69
|
+
kind: u.kind,
|
|
70
|
+
reason: u.reason,
|
|
71
|
+
})),
|
|
72
|
+
totals: {
|
|
73
|
+
passed: report.passed,
|
|
74
|
+
warnings: report.warnings,
|
|
75
|
+
blocks: report.blocks,
|
|
76
|
+
worst: report.worst === null
|
|
77
|
+
? null
|
|
78
|
+
: {
|
|
79
|
+
file: report.worst.file,
|
|
80
|
+
name: report.worst.name,
|
|
81
|
+
complexity: report.worst.complexity,
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
entries: report.entries.map((e) => ({
|
|
85
|
+
file: e.file,
|
|
86
|
+
name: e.name,
|
|
87
|
+
startLine: e.startLine,
|
|
88
|
+
endLine: e.endLine,
|
|
89
|
+
complexity: e.complexity,
|
|
90
|
+
band: e.band,
|
|
91
|
+
})),
|
|
92
|
+
}, null, 2) + '\n');
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/audit/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type FunctionComplexity } from '../complexity/calculate.js';
|
|
2
|
+
import { type CodeGuardBand, type CodeGuardPolicy } from '../policy.js';
|
|
3
|
+
export type AuditEntry = FunctionComplexity & {
|
|
4
|
+
readonly file: string;
|
|
5
|
+
readonly band: CodeGuardBand;
|
|
6
|
+
};
|
|
7
|
+
export type UnreadablePath = {
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly kind: 'directory' | 'entry' | 'file';
|
|
10
|
+
readonly reason: string;
|
|
11
|
+
};
|
|
12
|
+
export type AuditReport = {
|
|
13
|
+
readonly policy: CodeGuardPolicy;
|
|
14
|
+
readonly root: string;
|
|
15
|
+
readonly scannedFiles: number;
|
|
16
|
+
readonly entries: readonly AuditEntry[];
|
|
17
|
+
readonly unreadable?: readonly UnreadablePath[];
|
|
18
|
+
readonly worst: AuditEntry | null;
|
|
19
|
+
readonly passed: number;
|
|
20
|
+
readonly warnings: number;
|
|
21
|
+
readonly blocks: number;
|
|
22
|
+
};
|
|
23
|
+
export type AuditOptions = {
|
|
24
|
+
readonly policy?: CodeGuardPolicy;
|
|
25
|
+
readonly excludePatterns?: readonly string[];
|
|
26
|
+
};
|
|
27
|
+
export declare function auditDirectory(root: string, options?: AuditOptions): AuditReport;
|
|
28
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/audit/scan.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAA4B,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAElG,MAAM,MAAM,UAAU,GAAG,kBAAkB,GAAG;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C,CAAC;AAMF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW,CAUpF"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { lstatSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
import { calculateComplexity, parsesAsCode, } from '../complexity/calculate.js';
|
|
4
|
+
import { classify, DEFAULT_POLICY } from '../policy.js';
|
|
5
|
+
const DEFAULT_EXCLUDES = ['node_modules', '/dist/', '/.turbo/', '/coverage/', '/.next/', '/build/'];
|
|
6
|
+
const TS_EXTENSIONS = new Set(['.ts', '.tsx', '.mts', '.cts']);
|
|
7
|
+
export function auditDirectory(root, options = {}) {
|
|
8
|
+
const policy = options.policy ?? DEFAULT_POLICY;
|
|
9
|
+
const excludes = [...DEFAULT_EXCLUDES, ...(options.excludePatterns ?? [])];
|
|
10
|
+
const unreadable = [];
|
|
11
|
+
const files = walkTree(root, excludes, unreadable);
|
|
12
|
+
const entries = [];
|
|
13
|
+
for (const absolute of files) {
|
|
14
|
+
pushFileEntries(absolute, root, policy, entries, unreadable);
|
|
15
|
+
}
|
|
16
|
+
return summarize(root, policy, files.length, entries, unreadable);
|
|
17
|
+
}
|
|
18
|
+
function walkTree(root, excludes, unreadable) {
|
|
19
|
+
const out = [];
|
|
20
|
+
walkInto(root, root, excludes, out, unreadable);
|
|
21
|
+
return out.sort((a, b) => a.localeCompare(b));
|
|
22
|
+
}
|
|
23
|
+
function walkInto(dir, root, excludes, out, unreadable) {
|
|
24
|
+
const listing = readDir(dir);
|
|
25
|
+
if (listing.state === 'unreadable') {
|
|
26
|
+
unreadable.push({ path: displayPath(root, dir), kind: 'directory', reason: listing.reason });
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
for (const entry of listing.entries) {
|
|
30
|
+
const absolute = join(dir, entry);
|
|
31
|
+
if (isExcluded(absolute, root, excludes))
|
|
32
|
+
continue;
|
|
33
|
+
visitEntry(absolute, root, excludes, out, unreadable);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function visitEntry(absolute, root, excludes, out, unreadable) {
|
|
37
|
+
const info = statEntry(absolute);
|
|
38
|
+
if (info.state === 'unreadable') {
|
|
39
|
+
unreadable.push({ path: displayPath(root, absolute), kind: 'entry', reason: info.reason });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (info.stats.isDirectory()) {
|
|
43
|
+
walkInto(absolute, root, excludes, out, unreadable);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (info.stats.isFile() && hasTsExtension(absolute))
|
|
47
|
+
out.push(absolute);
|
|
48
|
+
}
|
|
49
|
+
function readDir(dir) {
|
|
50
|
+
try {
|
|
51
|
+
return { state: 'entries', entries: readdirSync(dir) };
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
return { state: 'unreadable', reason: errorReason(err) };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function statEntry(path) {
|
|
58
|
+
try {
|
|
59
|
+
return { state: 'stats', stats: lstatSync(path) };
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
return { state: 'unreadable', reason: errorReason(err) };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function isExcluded(absolute, root, excludes) {
|
|
66
|
+
const rel = relative(root, absolute);
|
|
67
|
+
const haystack = `/${rel.replace(/\\/g, '/')}`;
|
|
68
|
+
return excludes.some((needle) => haystack.includes(needle));
|
|
69
|
+
}
|
|
70
|
+
function hasTsExtension(name) {
|
|
71
|
+
const dot = name.lastIndexOf('.');
|
|
72
|
+
if (dot < 0)
|
|
73
|
+
return false;
|
|
74
|
+
return TS_EXTENSIONS.has(name.substring(dot));
|
|
75
|
+
}
|
|
76
|
+
function displayPath(root, absolute) {
|
|
77
|
+
const rel = relative(root, absolute);
|
|
78
|
+
return rel === '' ? absolute : rel;
|
|
79
|
+
}
|
|
80
|
+
function errorReason(err) {
|
|
81
|
+
return err instanceof Error ? err.message : String(err);
|
|
82
|
+
}
|
|
83
|
+
function pushFileEntries(absolute, root, policy, out, unreadable) {
|
|
84
|
+
const rel = relative(root, absolute);
|
|
85
|
+
const read = readFile(absolute);
|
|
86
|
+
if (read.state === 'unreadable') {
|
|
87
|
+
unreadable.push({ path: rel, kind: 'file', reason: read.reason });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const source = read.source;
|
|
91
|
+
const jsx = absolute.endsWith('.tsx');
|
|
92
|
+
if (source.trim().length > 0 && !parsesAsCode(source, { jsx })) {
|
|
93
|
+
out.push(parseFailureEntry(rel, policy));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const functions = calculateComplexity(source, { filename: rel, jsx });
|
|
97
|
+
for (const fn of functions) {
|
|
98
|
+
out.push({
|
|
99
|
+
...fn,
|
|
100
|
+
file: rel,
|
|
101
|
+
band: classify(fn.complexity, policy),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function parseFailureEntry(rel, policy) {
|
|
106
|
+
return {
|
|
107
|
+
name: '<parse-error>',
|
|
108
|
+
startLine: 1,
|
|
109
|
+
endLine: 1,
|
|
110
|
+
complexity: policy.blockAt,
|
|
111
|
+
file: rel,
|
|
112
|
+
band: 'block',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function readFile(path) {
|
|
116
|
+
try {
|
|
117
|
+
return { state: 'source', source: readFileSync(path, 'utf8') };
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
return { state: 'unreadable', reason: errorReason(err) };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function summarize(root, policy, scannedFiles, entries, unreadable) {
|
|
124
|
+
const worst = pickWorst(entries);
|
|
125
|
+
let passed = 0;
|
|
126
|
+
let warnings = 0;
|
|
127
|
+
let blocks = 0;
|
|
128
|
+
for (const e of entries) {
|
|
129
|
+
if (e.band === 'block')
|
|
130
|
+
blocks += 1;
|
|
131
|
+
else if (e.band === 'warn')
|
|
132
|
+
warnings += 1;
|
|
133
|
+
else
|
|
134
|
+
passed += 1;
|
|
135
|
+
}
|
|
136
|
+
return { policy, root, scannedFiles, entries, unreadable, worst, passed, warnings, blocks };
|
|
137
|
+
}
|
|
138
|
+
function pickWorst(entries) {
|
|
139
|
+
let worst = null;
|
|
140
|
+
for (const e of entries) {
|
|
141
|
+
if (worst === null || e.complexity > worst.complexity)
|
|
142
|
+
worst = e;
|
|
143
|
+
}
|
|
144
|
+
return worst;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/audit/scan.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LineWriter } from './output.js';
|
|
2
|
+
export type AuditOptions = {
|
|
3
|
+
readonly cwd?: string;
|
|
4
|
+
readonly strict?: boolean;
|
|
5
|
+
readonly writeSnapshot?: boolean;
|
|
6
|
+
readonly excludePatterns?: readonly string[];
|
|
7
|
+
};
|
|
8
|
+
export declare function runAudit(options: AuditOptions, writer: LineWriter): number;
|
|
9
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C,CAAC;AAEF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAO1E"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { toSnapshot } from './audit/report.js';
|
|
4
|
+
import { auditDirectory } from './audit/scan.js';
|
|
5
|
+
import { formatAuditReport } from './index.js';
|
|
6
|
+
export function runAudit(options, writer) {
|
|
7
|
+
const cwd = options.cwd ?? process.cwd();
|
|
8
|
+
const report = auditDirectory(cwd, { excludePatterns: options.excludePatterns });
|
|
9
|
+
writer.info(formatAuditReport(report));
|
|
10
|
+
if (options.writeSnapshot === true)
|
|
11
|
+
writeSnapshotTo(cwd, report);
|
|
12
|
+
if (options.strict !== true)
|
|
13
|
+
return 0;
|
|
14
|
+
return strictExitCode(report, writer);
|
|
15
|
+
}
|
|
16
|
+
function strictExitCode(report, writer) {
|
|
17
|
+
let failed = false;
|
|
18
|
+
const unreadable = report.unreadable ?? [];
|
|
19
|
+
if (unreadable.length > 0) {
|
|
20
|
+
writer.error(`\n${String(unreadable.length)} path(s) could not be read, so the audit is partial and cannot pass. First: ${unreadable[0]?.path ?? ''} — ${unreadable[0]?.reason ?? ''}`);
|
|
21
|
+
failed = true;
|
|
22
|
+
}
|
|
23
|
+
if (report.scannedFiles === 0) {
|
|
24
|
+
writer.error(`\nNo files were scanned under ${report.root}. A gate that reads nothing must not report success — check the path and the exclude patterns.`);
|
|
25
|
+
failed = true;
|
|
26
|
+
}
|
|
27
|
+
if (report.blocks > 0)
|
|
28
|
+
failed = true;
|
|
29
|
+
return failed ? 1 : 0;
|
|
30
|
+
}
|
|
31
|
+
function writeSnapshotTo(cwd, report) {
|
|
32
|
+
const dir = join(cwd, '.fortytwo-ai', 'code-guard', 'snapshots');
|
|
33
|
+
mkdirSync(dir, { recursive: true });
|
|
34
|
+
const filename = `audit-${new Date().toISOString().replace(/[:.]/g, '-')}.json`;
|
|
35
|
+
writeFileSync(join(dir, filename), toSnapshot(report), 'utf8');
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAoB,MAAM,iBAAiB,CAAC;AAGnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAS/C,MAAM,UAAU,QAAQ,CAAC,OAAqB,EAAE,MAAkB;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACjF,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,aAAa,KAAK,IAAI;QAAE,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IACtC,OAAO,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,MAAmB,EAAE,MAAkB;IAC7D,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAC3C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CACV,KAAK,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,+EAA+E,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,EAAE,CAC1K,CAAC;QACF,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CACV,iCAAiC,MAAM,CAAC,IAAI,gGAAgG,CAC7I,CAAC;QACF,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,GAAG,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,MAAmB;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACjE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IAChF,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type FunctionComplexity = {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
readonly startLine: number;
|
|
4
|
+
readonly endLine: number;
|
|
5
|
+
readonly complexity: number;
|
|
6
|
+
};
|
|
7
|
+
export type CalculateOptions = {
|
|
8
|
+
readonly filename?: string;
|
|
9
|
+
readonly jsx?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare function calculateComplexity(source: string, options?: CalculateOptions): readonly FunctionComplexity[];
|
|
12
|
+
export declare function parsesAsCode(source: string, options?: CalculateOptions): boolean;
|
|
13
|
+
//# sourceMappingURL=calculate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculate.d.ts","sourceRoot":"","sources":["../../src/complexity/calculate.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AA6BF,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,gBAAqB,GAC7B,SAAS,kBAAkB,EAAE,CAI/B;AAQD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAEpF"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { AST_NODE_TYPES, parse } from '@typescript-eslint/typescript-estree';
|
|
2
|
+
const FUNCTION_TYPES = new Set([
|
|
3
|
+
AST_NODE_TYPES.FunctionDeclaration,
|
|
4
|
+
AST_NODE_TYPES.FunctionExpression,
|
|
5
|
+
AST_NODE_TYPES.ArrowFunctionExpression,
|
|
6
|
+
]);
|
|
7
|
+
const CLASS_FIELD_TYPES = new Set([
|
|
8
|
+
AST_NODE_TYPES.PropertyDefinition,
|
|
9
|
+
AST_NODE_TYPES.AccessorProperty,
|
|
10
|
+
]);
|
|
11
|
+
const CODE_PATH_BOUNDARIES = new Set([
|
|
12
|
+
...FUNCTION_TYPES,
|
|
13
|
+
...CLASS_FIELD_TYPES,
|
|
14
|
+
AST_NODE_TYPES.StaticBlock,
|
|
15
|
+
]);
|
|
16
|
+
export function calculateComplexity(source, options = {}) {
|
|
17
|
+
const ast = tryParse(source, options);
|
|
18
|
+
if (ast === null)
|
|
19
|
+
return [];
|
|
20
|
+
return collectUnits(ast).map((unit) => measureUnit(unit, options.filename));
|
|
21
|
+
}
|
|
22
|
+
const MAX_WALK_DEPTH = 600;
|
|
23
|
+
const OVER_LIMIT_COMPLEXITY = 9999;
|
|
24
|
+
class WalkDepthError extends Error {
|
|
25
|
+
}
|
|
26
|
+
export function parsesAsCode(source, options = {}) {
|
|
27
|
+
return tryParse(source, options) !== null;
|
|
28
|
+
}
|
|
29
|
+
function tryParse(source, options) {
|
|
30
|
+
try {
|
|
31
|
+
return parse(source, {
|
|
32
|
+
loc: true,
|
|
33
|
+
range: true,
|
|
34
|
+
jsx: options.jsx ?? false,
|
|
35
|
+
errorOnUnknownASTType: false,
|
|
36
|
+
tokens: false,
|
|
37
|
+
comment: false,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function measureUnit(unit, filename) {
|
|
45
|
+
const name = unitName(unit, filename);
|
|
46
|
+
const span = { startLine: unit.node.loc.start.line, endLine: unit.node.loc.end.line };
|
|
47
|
+
try {
|
|
48
|
+
return { name, ...span, complexity: 1 + unitResolutionPoints(unit) };
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (err instanceof WalkDepthError)
|
|
52
|
+
return { name, ...span, complexity: OVER_LIMIT_COMPLEXITY };
|
|
53
|
+
throw err;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function unitResolutionPoints(unit) {
|
|
57
|
+
if (unit.kind === 'function') {
|
|
58
|
+
return sumWalkBody(unit.node.params) + walkBody(unit.node.body, 0);
|
|
59
|
+
}
|
|
60
|
+
if (unit.kind === 'class-field') {
|
|
61
|
+
return walkBody(unit.node.value, 0);
|
|
62
|
+
}
|
|
63
|
+
return sumWalkBody(unit.node.body);
|
|
64
|
+
}
|
|
65
|
+
function sumWalkBody(nodes) {
|
|
66
|
+
let dp = 0;
|
|
67
|
+
for (const node of nodes)
|
|
68
|
+
dp += walkBody(node, 0);
|
|
69
|
+
return dp;
|
|
70
|
+
}
|
|
71
|
+
function unitName(unit, filename) {
|
|
72
|
+
if (unit.kind === 'static-block')
|
|
73
|
+
return '<class-static-block>';
|
|
74
|
+
if (unit.kind === 'class-field')
|
|
75
|
+
return `<class-field:${propertyKeyName(unit.node)}>`;
|
|
76
|
+
return deriveName(unit.node, filename);
|
|
77
|
+
}
|
|
78
|
+
function propertyKeyName(node) {
|
|
79
|
+
if (node.computed)
|
|
80
|
+
return '<computed>';
|
|
81
|
+
if (node.key.type === AST_NODE_TYPES.Identifier)
|
|
82
|
+
return node.key.name;
|
|
83
|
+
if (node.key.type === AST_NODE_TYPES.PrivateIdentifier)
|
|
84
|
+
return `#${node.key.name}`;
|
|
85
|
+
return String(node.key.value);
|
|
86
|
+
}
|
|
87
|
+
function deriveName(fn, filename) {
|
|
88
|
+
if (fn.type === AST_NODE_TYPES.FunctionDeclaration && fn.id !== null)
|
|
89
|
+
return fn.id.name;
|
|
90
|
+
const line = fn.loc.start.line;
|
|
91
|
+
if (filename === undefined)
|
|
92
|
+
return '<anon>';
|
|
93
|
+
return `${filename}:${String(line)}`;
|
|
94
|
+
}
|
|
95
|
+
const SINGLE_DP_NODES = new Set([
|
|
96
|
+
AST_NODE_TYPES.IfStatement,
|
|
97
|
+
AST_NODE_TYPES.ForStatement,
|
|
98
|
+
AST_NODE_TYPES.ForInStatement,
|
|
99
|
+
AST_NODE_TYPES.ForOfStatement,
|
|
100
|
+
AST_NODE_TYPES.WhileStatement,
|
|
101
|
+
AST_NODE_TYPES.DoWhileStatement,
|
|
102
|
+
AST_NODE_TYPES.CatchClause,
|
|
103
|
+
AST_NODE_TYPES.ConditionalExpression,
|
|
104
|
+
AST_NODE_TYPES.LogicalExpression,
|
|
105
|
+
AST_NODE_TYPES.AssignmentPattern,
|
|
106
|
+
]);
|
|
107
|
+
const LOGICAL_ASSIGNMENT_OPERATORS = new Set(['&&=', '||=', '??=']);
|
|
108
|
+
function resolutionPointsForNode(node) {
|
|
109
|
+
if (SINGLE_DP_NODES.has(node.type))
|
|
110
|
+
return 1;
|
|
111
|
+
if (node.type === AST_NODE_TYPES.SwitchCase)
|
|
112
|
+
return node.test !== null ? 1 : 0;
|
|
113
|
+
if (node.type === AST_NODE_TYPES.AssignmentExpression) {
|
|
114
|
+
return LOGICAL_ASSIGNMENT_OPERATORS.has(node.operator) ? 1 : 0;
|
|
115
|
+
}
|
|
116
|
+
if (node.type === AST_NODE_TYPES.MemberExpression ||
|
|
117
|
+
node.type === AST_NODE_TYPES.CallExpression) {
|
|
118
|
+
return node.optional ? 1 : 0;
|
|
119
|
+
}
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
function walkBody(node, depth) {
|
|
123
|
+
if (node === null)
|
|
124
|
+
return 0;
|
|
125
|
+
if (depth > MAX_WALK_DEPTH)
|
|
126
|
+
throw new WalkDepthError('AST nesting exceeds walk-depth cap');
|
|
127
|
+
if (CODE_PATH_BOUNDARIES.has(node.type))
|
|
128
|
+
return 0;
|
|
129
|
+
return resolutionPointsForNode(node) + walkChildren(node, depth);
|
|
130
|
+
}
|
|
131
|
+
function walkChildren(node, depth) {
|
|
132
|
+
let dp = 0;
|
|
133
|
+
forEachChild(node, (child) => {
|
|
134
|
+
dp += walkBody(child, depth + 1);
|
|
135
|
+
});
|
|
136
|
+
return dp;
|
|
137
|
+
}
|
|
138
|
+
function collectUnits(program) {
|
|
139
|
+
const out = [];
|
|
140
|
+
for (const stmt of program.body)
|
|
141
|
+
gatherUnits(stmt, out);
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
function gatherUnits(node, out) {
|
|
145
|
+
if (FUNCTION_TYPES.has(node.type)) {
|
|
146
|
+
out.push({ kind: 'function', node: node });
|
|
147
|
+
}
|
|
148
|
+
else if (CLASS_FIELD_TYPES.has(node.type)) {
|
|
149
|
+
const field = node;
|
|
150
|
+
if (field.value !== null)
|
|
151
|
+
out.push({ kind: 'class-field', node: field });
|
|
152
|
+
}
|
|
153
|
+
else if (node.type === AST_NODE_TYPES.StaticBlock) {
|
|
154
|
+
out.push({ kind: 'static-block', node });
|
|
155
|
+
}
|
|
156
|
+
forEachChild(node, (child) => {
|
|
157
|
+
gatherUnits(child, out);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function forEachChild(node, fn) {
|
|
161
|
+
const record = node;
|
|
162
|
+
for (const key of Object.keys(node)) {
|
|
163
|
+
if (key === 'parent' || key === 'loc' || key === 'range')
|
|
164
|
+
continue;
|
|
165
|
+
visitValue(record[key], fn);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function visitValue(value, fn) {
|
|
169
|
+
if (value === null || typeof value !== 'object')
|
|
170
|
+
return;
|
|
171
|
+
if (Array.isArray(value)) {
|
|
172
|
+
for (const item of value)
|
|
173
|
+
visitValue(item, fn);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (isAstNode(value))
|
|
177
|
+
fn(value);
|
|
178
|
+
}
|
|
179
|
+
function isAstNode(value) {
|
|
180
|
+
return 'type' in value && typeof value.type === 'string';
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=calculate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculate.js","sourceRoot":"","sources":["../../src/complexity/calculate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { auditDirectory, type AuditEntry, type AuditReport } from './audit/scan.js';
|
|
2
|
+
export { formatAuditReport, sortedBandEntries } from './audit/report.js';
|
|
3
|
+
export { BEGIN_SENTINEL, END_SENTINEL, canonicalRule } from './sync/canonical-rule.js';
|
|
4
|
+
export { GALAXY_SURFACES, type SurfaceDefinition } from './sync/surfaces.js';
|
|
5
|
+
export { checkSurfacesInSync, syncSurfaces, type CheckResult, type SyncAction, } from './sync/sync.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEpF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEvF,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { auditDirectory } from './audit/scan.js';
|
|
2
|
+
export { formatAuditReport, sortedBandEntries } from './audit/report.js';
|
|
3
|
+
export { BEGIN_SENTINEL, END_SENTINEL, canonicalRule } from './sync/canonical-rule.js';
|
|
4
|
+
export { GALAXY_SURFACES } from './sync/surfaces.js';
|
|
5
|
+
export { checkSurfacesInSync, syncSurfaces, } from './sync/sync.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAqC,MAAM,iBAAiB,CAAC;AAEpF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEvF,OAAO,EAAE,eAAe,EAA0B,MAAM,oBAAoB,CAAC;AAE7E,OAAO,EACL,mBAAmB,EACnB,YAAY,GAGb,MAAM,gBAAgB,CAAC"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type LineWriter = {
|
|
2
|
+
info(message: string): void;
|
|
3
|
+
success(message: string): void;
|
|
4
|
+
warn(message: string): void;
|
|
5
|
+
error(message: string): void;
|
|
6
|
+
};
|
|
7
|
+
export declare function consoleWriter(): LineWriter;
|
|
8
|
+
export type CapturingWriter = LineWriter & {
|
|
9
|
+
lines(): readonly {
|
|
10
|
+
level: 'info' | 'success' | 'warn' | 'error';
|
|
11
|
+
message: string;
|
|
12
|
+
}[];
|
|
13
|
+
};
|
|
14
|
+
export declare function capturingWriter(): CapturingWriter;
|
|
15
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,aAAa,IAAI,UAAU,CAe1C;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG;IACzC,KAAK,IAAI,SAAS;QAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvF,CAAC;AAEF,wBAAgB,eAAe,IAAI,eAAe,CAmBjD"}
|