code-auditor-mcp 3.4.12 → 3.4.14
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/CHANGELOG.md +74 -1
- package/dist/analyzers/__verify_self_probe.d.ts +2 -0
- package/dist/analyzers/__verify_self_probe.d.ts.map +1 -0
- package/dist/analyzers/__verify_self_probe.js +5 -0
- package/dist/analyzers/__verify_self_probe.js.map +1 -0
- package/dist/analyzers/analyzerUtils.d.ts +34 -1
- package/dist/analyzers/analyzerUtils.d.ts.map +1 -1
- package/dist/analyzers/analyzerUtils.js +61 -22
- package/dist/analyzers/analyzerUtils.js.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts +18 -23
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.js +198 -186
- package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts +78 -55
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js +244 -243
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts +27 -37
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.js +314 -275
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +17 -46
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +620 -523
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
- package/dist/analyzers/documentationAnalyzer.d.ts +7 -2
- package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/documentationAnalyzer.js +259 -198
- package/dist/analyzers/documentationAnalyzer.js.map +1 -1
- package/dist/analyzers/invariantsAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/invariantsAnalyzer.js +57 -50
- package/dist/analyzers/invariantsAnalyzer.js.map +1 -1
- package/dist/analyzers/orm/adapterRegistry.d.ts +10 -0
- package/dist/analyzers/orm/adapterRegistry.d.ts.map +1 -1
- package/dist/analyzers/orm/adapterRegistry.js +10 -0
- package/dist/analyzers/orm/adapterRegistry.js.map +1 -1
- package/dist/analyzers/orm/drizzleAdapter.d.ts +22 -0
- package/dist/analyzers/orm/drizzleAdapter.d.ts.map +1 -1
- package/dist/analyzers/orm/drizzleAdapter.js +42 -44
- package/dist/analyzers/orm/drizzleAdapter.js.map +1 -1
- package/dist/analyzers/orm/prismaAdapter.d.ts +30 -0
- package/dist/analyzers/orm/prismaAdapter.d.ts.map +1 -1
- package/dist/analyzers/orm/prismaAdapter.js +30 -0
- package/dist/analyzers/orm/prismaAdapter.js.map +1 -1
- package/dist/analyzers/provenance.d.ts +62 -2
- package/dist/analyzers/provenance.d.ts.map +1 -1
- package/dist/analyzers/provenance.js +443 -349
- package/dist/analyzers/provenance.js.map +1 -1
- package/dist/analyzers/reactAnalyzer.d.ts +11 -0
- package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/reactAnalyzer.js +188 -125
- package/dist/analyzers/reactAnalyzer.js.map +1 -1
- package/dist/analyzers/ruleRegistry.d.ts +110 -1
- package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
- package/dist/analyzers/ruleRegistry.js +1714 -124
- package/dist/analyzers/ruleRegistry.js.map +1 -1
- package/dist/analyzers/ruleTiming.d.ts +54 -0
- package/dist/analyzers/ruleTiming.d.ts.map +1 -0
- package/dist/analyzers/ruleTiming.js +71 -0
- package/dist/analyzers/ruleTiming.js.map +1 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +13 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +362 -283
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +26 -68
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +430 -391
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +17 -202
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +1073 -1121
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +3 -49
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +414 -340
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +48 -5
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +262 -134
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +23 -214
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +139 -1521
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +78 -79
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js +613 -480
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.d.ts +307 -0
- package/dist/analyzers/universal/schema/codeAnalysis.d.ts.map +1 -0
- package/dist/analyzers/universal/schema/codeAnalysis.js +965 -0
- package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -0
- package/dist/analyzers/universal/schema/config.d.ts +31 -0
- package/dist/analyzers/universal/schema/config.d.ts.map +1 -0
- package/dist/analyzers/universal/schema/config.js +57 -0
- package/dist/analyzers/universal/schema/config.js.map +1 -0
- package/dist/analyzers/universal/schema/discovery.d.ts +167 -0
- package/dist/analyzers/universal/schema/discovery.d.ts.map +1 -0
- package/dist/analyzers/universal/schema/discovery.js +616 -0
- package/dist/analyzers/universal/schema/discovery.js.map +1 -0
- package/dist/analyzers/universal/schema/jsonSchema.d.ts +27 -0
- package/dist/analyzers/universal/schema/jsonSchema.d.ts.map +1 -0
- package/dist/analyzers/universal/schema/jsonSchema.js +368 -0
- package/dist/analyzers/universal/schema/jsonSchema.js.map +1 -0
- package/dist/analyzers/universal/schema/migrations.d.ts +90 -0
- package/dist/analyzers/universal/schema/migrations.d.ts.map +1 -0
- package/dist/analyzers/universal/schema/migrations.js +238 -0
- package/dist/analyzers/universal/schema/migrations.js.map +1 -0
- package/dist/analyzers/universal/schema/types.d.ts +131 -0
- package/dist/analyzers/universal/schema/types.d.ts.map +1 -0
- package/dist/analyzers/universal/schema/types.js +10 -0
- package/dist/analyzers/universal/schema/types.js.map +1 -0
- package/dist/analyzers/universal/schema/violations.d.ts +44 -0
- package/dist/analyzers/universal/schema/violations.d.ts.map +1 -0
- package/dist/analyzers/universal/schema/violations.js +54 -0
- package/dist/analyzers/universal/schema/violations.js.map +1 -0
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +89 -13
- package/dist/auditRunner.js.map +1 -1
- package/dist/cli.js +315 -40
- package/dist/cli.js.map +1 -1
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +9 -7
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts +12 -3
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +16 -6
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/effectiveConfig.d.ts +75 -0
- package/dist/config/effectiveConfig.d.ts.map +1 -0
- package/dist/config/effectiveConfig.js +213 -0
- package/dist/config/effectiveConfig.js.map +1 -0
- package/dist/config/pathProfiles.d.ts +7 -4
- package/dist/config/pathProfiles.d.ts.map +1 -1
- package/dist/config/pathProfiles.js +8 -10
- package/dist/config/pathProfiles.js.map +1 -1
- package/dist/config/thresholdRationales.d.ts +45 -0
- package/dist/config/thresholdRationales.d.ts.map +1 -0
- package/dist/config/thresholdRationales.js +67 -0
- package/dist/config/thresholdRationales.js.map +1 -0
- package/dist/conventions/conventionMiner.d.ts.map +1 -1
- package/dist/conventions/conventionMiner.js +6 -2
- package/dist/conventions/conventionMiner.js.map +1 -1
- package/dist/enforcement/diffGate.d.ts +55 -0
- package/dist/enforcement/diffGate.d.ts.map +1 -0
- package/dist/enforcement/diffGate.js +136 -0
- package/dist/enforcement/diffGate.js.map +1 -0
- package/dist/enforcement/gate.d.ts +36 -0
- package/dist/enforcement/gate.d.ts.map +1 -0
- package/dist/enforcement/gate.js +72 -0
- package/dist/enforcement/gate.js.map +1 -0
- package/dist/enforcement/suppressions.d.ts +41 -0
- package/dist/enforcement/suppressions.d.ts.map +1 -0
- package/dist/enforcement/suppressions.js +170 -0
- package/dist/enforcement/suppressions.js.map +1 -0
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +4 -1
- package/dist/fingerprint.js.map +1 -1
- package/dist/invariants/ruleEngine.d.ts +3 -4
- package/dist/invariants/ruleEngine.d.ts.map +1 -1
- package/dist/invariants/ruleEngine.js +2 -2
- package/dist/invariants/ruleEngine.js.map +1 -1
- package/dist/languages/LanguageOrchestrator.d.ts +14 -0
- package/dist/languages/LanguageOrchestrator.d.ts.map +1 -1
- package/dist/languages/LanguageOrchestrator.js +93 -55
- package/dist/languages/LanguageOrchestrator.js.map +1 -1
- package/dist/languages/LanguageRegistry.d.ts +8 -0
- package/dist/languages/LanguageRegistry.d.ts.map +1 -1
- package/dist/languages/LanguageRegistry.js +8 -0
- package/dist/languages/LanguageRegistry.js.map +1 -1
- package/dist/languages/RuntimeManager.d.ts +82 -60
- package/dist/languages/RuntimeManager.d.ts.map +1 -1
- package/dist/languages/RuntimeManager.js +404 -349
- package/dist/languages/RuntimeManager.js.map +1 -1
- package/dist/languages/UniversalAnalyzer.d.ts +51 -6
- package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
- package/dist/languages/UniversalAnalyzer.js +127 -88
- package/dist/languages/UniversalAnalyzer.js.map +1 -1
- package/dist/languages/adapterBridge.d.ts +36 -0
- package/dist/languages/adapterBridge.d.ts.map +1 -1
- package/dist/languages/adapterBridge.js +89 -35
- package/dist/languages/adapterBridge.js.map +1 -1
- package/dist/languages/go/GoAdapter.d.ts +66 -23
- package/dist/languages/go/GoAdapter.d.ts.map +1 -1
- package/dist/languages/go/GoAdapter.js +553 -474
- package/dist/languages/go/GoAdapter.js.map +1 -1
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts +33 -4
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts.map +1 -1
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +101 -66
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -1
- package/dist/languages/tree-sitter/converter.d.ts +18 -0
- package/dist/languages/tree-sitter/converter.d.ts.map +1 -1
- package/dist/languages/tree-sitter/converter.js +18 -0
- package/dist/languages/tree-sitter/converter.js.map +1 -1
- package/dist/languages/tree-sitter/parser.d.ts +39 -2
- package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
- package/dist/languages/tree-sitter/parser.js +93 -12
- package/dist/languages/tree-sitter/parser.js.map +1 -1
- package/dist/languages/types.d.ts +67 -2
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +253 -72
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +1419 -923
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
- package/dist/mcp-tools-shared.d.ts.map +1 -1
- package/dist/mcp-tools-shared.js.map +1 -1
- package/dist/pipeline.d.ts +13 -5
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +381 -200
- package/dist/pipeline.js.map +1 -1
- package/dist/pipelineAdapters.d.ts +3 -8
- package/dist/pipelineAdapters.d.ts.map +1 -1
- package/dist/pipelineAdapters.js +149 -94
- package/dist/pipelineAdapters.js.map +1 -1
- package/dist/presets/presets.d.ts +54 -0
- package/dist/presets/presets.d.ts.map +1 -0
- package/dist/presets/presets.js +181 -0
- package/dist/presets/presets.js.map +1 -0
- package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
- package/dist/reporting/sarifReportGenerator.js +6 -3
- package/dist/reporting/sarifReportGenerator.js.map +1 -1
- package/dist/ruleAliases.d.ts +67 -0
- package/dist/ruleAliases.d.ts.map +1 -0
- package/dist/ruleAliases.js +102 -0
- package/dist/ruleAliases.js.map +1 -0
- package/dist/styles/cssAstExtractor.d.ts.map +1 -1
- package/dist/styles/cssAstExtractor.js +78 -18
- package/dist/styles/cssAstExtractor.js.map +1 -1
- package/dist/styles/styleIndexer.d.ts +6 -0
- package/dist/styles/styleIndexer.d.ts.map +1 -1
- package/dist/styles/styleIndexer.js +26 -4
- package/dist/styles/styleIndexer.js.map +1 -1
- package/dist/styles/tailwindConfigLoader.d.ts +8 -6
- package/dist/styles/tailwindConfigLoader.d.ts.map +1 -1
- package/dist/styles/tailwindConfigLoader.js +61 -15
- package/dist/styles/tailwindConfigLoader.js.map +1 -1
- package/dist/styles/tailwindProbe.d.ts +31 -0
- package/dist/styles/tailwindProbe.d.ts.map +1 -1
- package/dist/styles/tailwindProbe.js +145 -4
- package/dist/styles/tailwindProbe.js.map +1 -1
- package/dist/styles/tailwindUtilityExpander.d.ts.map +1 -1
- package/dist/styles/tailwindUtilityExpander.js +13 -1
- package/dist/styles/tailwindUtilityExpander.js.map +1 -1
- package/dist/types.d.ts +181 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/fileDiscovery.d.ts +9 -0
- package/dist/utils/fileDiscovery.d.ts.map +1 -1
- package/dist/utils/fileDiscovery.js +21 -0
- package/dist/utils/fileDiscovery.js.map +1 -1
- package/package.json +5 -3
- package/plugin/hooks/hooks.json +1 -1
- package/plugin/scripts/hook-audit.sh +25 -7
- package/plugin/skills/code-auditor/SKILL.md +5 -5
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration/DDL replay + one-hop barrel re-export resolution.
|
|
3
|
+
*
|
|
4
|
+
* Spec 33 item 15 — extracted from UniversalSchemaAnalyzer.ts so the DDL
|
|
5
|
+
* state machine, barrel reader, and streaming DDL-presence detection are
|
|
6
|
+
* importable and testable independently of the analyzer class.
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs/promises';
|
|
9
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import { MAX_ORPHAN_SOURCE_BYTES } from '../../../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Strip SQL identifier delimiters: backticks or double-quotes.
|
|
14
|
+
* @param name
|
|
15
|
+
* @returns
|
|
16
|
+
*/
|
|
17
|
+
export function stripIdentifier(name) {
|
|
18
|
+
if ((name.startsWith('`') && name.endsWith('`')) ||
|
|
19
|
+
(name.startsWith('"') && name.endsWith('"'))) {
|
|
20
|
+
return name.slice(1, -1);
|
|
21
|
+
}
|
|
22
|
+
return name;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Apply pre-extracted DDL operations to a table set in migration order.
|
|
26
|
+
* Strips identifier delimiters (backticks/quotes) and performs the
|
|
27
|
+
* CREATE/DROP/RENAME state transitions. Callable from the schema reducer
|
|
28
|
+
* without re-parsing raw SQL.
|
|
29
|
+
* @param ops
|
|
30
|
+
* @param tables
|
|
31
|
+
*/
|
|
32
|
+
export function applyMigrationOps(ops, tables) {
|
|
33
|
+
for (const { op, table, newTable } of ops) {
|
|
34
|
+
if (op === 'CREATE') {
|
|
35
|
+
tables.add(stripIdentifier(table));
|
|
36
|
+
}
|
|
37
|
+
else if (op === 'DROP') {
|
|
38
|
+
tables.delete(stripIdentifier(table));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
tables.delete(stripIdentifier(table));
|
|
42
|
+
tables.add(stripIdentifier(newTable));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse a migration SQL source and apply stateful CREATE/DROP/RENAME
|
|
48
|
+
* operations to the given table set in migration order.
|
|
49
|
+
* @param source
|
|
50
|
+
* @param tables
|
|
51
|
+
*/
|
|
52
|
+
export function processMigrationSource(source, tables) {
|
|
53
|
+
applyMigrationOps(parseMigrationOps(source), tables);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The DDL state-machine regex shared by the standalone analyze() path and the
|
|
57
|
+
* pipeline's schema-sql visitor. Single ordered pass — applies CREATE/DROP/
|
|
58
|
+
* RENAME in statement order within each migration file (fixes the rename-replay
|
|
59
|
+
* bug where CREATE after RENAME in the same file was silently dropped).
|
|
60
|
+
*/
|
|
61
|
+
const DDL_RE = /(CREATE)\s+(?:VIRTUAL\s+)?TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?(`[^`]+`|"[^"]+"|\w+)|(DROP)\s+TABLE\s+(?:IF\s+EXISTS\s+)?(`[^`]+`|"[^"]+"|\w+)|(ALTER)\s+TABLE\s+(`[^`]+`|"[^"]+"|\w+)\s+RENAME\s+TO\s+(`[^`]+`|"[^"]+"|\w+)/gi;
|
|
62
|
+
/**
|
|
63
|
+
* Extract ordered DDL operations from migration SQL text. Emitted by the
|
|
64
|
+
* schema-sql visitor instead of raw source so the reducer only retains the
|
|
65
|
+
* extracted state transitions, not the full file text.
|
|
66
|
+
* @param source
|
|
67
|
+
* @returns
|
|
68
|
+
*/
|
|
69
|
+
export function parseMigrationOps(source) {
|
|
70
|
+
const ops = [];
|
|
71
|
+
let match;
|
|
72
|
+
DDL_RE.lastIndex = 0;
|
|
73
|
+
while ((match = DDL_RE.exec(source)) !== null) {
|
|
74
|
+
const op = match[1] || match[3] || match[5];
|
|
75
|
+
if (op === 'CREATE') {
|
|
76
|
+
ops.push({ op: 'CREATE', table: match[2] });
|
|
77
|
+
}
|
|
78
|
+
else if (op === 'DROP') {
|
|
79
|
+
ops.push({ op: 'DROP', table: match[4] });
|
|
80
|
+
}
|
|
81
|
+
else if (op === 'ALTER') {
|
|
82
|
+
ops.push({ op: 'RENAME', table: match[6], newTable: match[7] });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return ops;
|
|
86
|
+
}
|
|
87
|
+
// ── One-hop barrel re-export resolution (Spec 33 item 9) ─────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* Extract `export * from 'x'` and `export { a, b as c } from 'x'` statements
|
|
90
|
+
* from barrel source. Regex-based — matches the analyzer's existing
|
|
91
|
+
* migration/ORM discovery idiom and avoids a tree-sitter round-trip per barrel.
|
|
92
|
+
* Local re-exports without a `from` clause are not re-exports and are skipped.
|
|
93
|
+
* @param source
|
|
94
|
+
* @returns
|
|
95
|
+
*/
|
|
96
|
+
export function extractReExports(source) {
|
|
97
|
+
const results = [];
|
|
98
|
+
const starRe = /export\s*\*\s*from\s*(['"])([^'"]+)\1/g;
|
|
99
|
+
let m;
|
|
100
|
+
while ((m = starRe.exec(source)) !== null) {
|
|
101
|
+
results.push({ source: m[2], star: true, renamed: new Map() });
|
|
102
|
+
}
|
|
103
|
+
const namedRe = /export\s*\{([^}]*)\}\s*from\s*(['"])([^'"]+)\2/g;
|
|
104
|
+
while ((m = namedRe.exec(source)) !== null) {
|
|
105
|
+
const renamed = new Map();
|
|
106
|
+
for (const raw of m[1].split(',')) {
|
|
107
|
+
const spec = raw.trim();
|
|
108
|
+
if (!spec)
|
|
109
|
+
continue;
|
|
110
|
+
const asMatch = /^(\w+)\s+as\s+(\w+)$/.exec(spec);
|
|
111
|
+
if (asMatch) {
|
|
112
|
+
// `export { original as local } from 'x'`
|
|
113
|
+
renamed.set(asMatch[2], asMatch[1]);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
const name = /^(\w+)$/.exec(spec);
|
|
117
|
+
if (name)
|
|
118
|
+
renamed.set(name[1], name[1]);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
results.push({ source: m[3], star: false, renamed });
|
|
122
|
+
}
|
|
123
|
+
return results;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Resolve a relative module specifier to a file on disk, trying common source
|
|
127
|
+
* extensions and index files. Returns the resolved path (absolute or relative
|
|
128
|
+
* to the importing file's directory) or null when the file cannot be found.
|
|
129
|
+
*
|
|
130
|
+
* @param fromFile The importing file (its directory is the resolution base).
|
|
131
|
+
* @param specifier The relative module specifier to resolve.
|
|
132
|
+
* @returns The resolved file path, or null when not found.
|
|
133
|
+
*/
|
|
134
|
+
export function resolveBarrelModulePath(fromFile, specifier) {
|
|
135
|
+
const fromDir = path.dirname(fromFile);
|
|
136
|
+
const base = path.resolve(fromDir, specifier);
|
|
137
|
+
const candidates = [
|
|
138
|
+
base,
|
|
139
|
+
...['.ts', '.tsx', '.js', '.jsx'].map(ext => base + ext),
|
|
140
|
+
...['.ts', '.tsx', '.js', '.jsx'].map(ext => path.join(base, 'index' + ext)),
|
|
141
|
+
];
|
|
142
|
+
for (const candidate of candidates) {
|
|
143
|
+
try {
|
|
144
|
+
// Cheap existence check without throwing on directory candidates.
|
|
145
|
+
const stat = statSync(candidate);
|
|
146
|
+
if (stat.isFile())
|
|
147
|
+
return candidate;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// continue
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Default barrel reader — resolves the specifier relative to `fromFile` on disk.
|
|
157
|
+
*
|
|
158
|
+
* @param fromFile The importing file (its directory is the resolution base).
|
|
159
|
+
* @param specifier The relative module specifier to read.
|
|
160
|
+
* @returns The resolved file's source text, or null when unreadable.
|
|
161
|
+
*/
|
|
162
|
+
export function readModuleFromDisk(fromFile, specifier) {
|
|
163
|
+
const resolved = resolveBarrelModulePath(fromFile, specifier);
|
|
164
|
+
if (!resolved)
|
|
165
|
+
return null;
|
|
166
|
+
try {
|
|
167
|
+
return readFileSync(resolved, 'utf-8');
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/** Lightweight DDL presence marker — detection only, no capture groups. */
|
|
174
|
+
const DDL_PRESENCE_RE = /(?:CREATE|DROP|ALTER)\s+(?:VIRTUAL\s+)?TABLE/i;
|
|
175
|
+
/**
|
|
176
|
+
* Detect whether an SQL file contains any DDL statement without materializing
|
|
177
|
+
* the whole file. Streams in 1 MB chunks, carrying a small tail across chunk
|
|
178
|
+
* boundaries so a marker split at "CREATE TA/BLE" is still caught. Used by the
|
|
179
|
+
* schema-sql visitor for oversized orphans yielded with empty source by stage 1.
|
|
180
|
+
* @param filePath
|
|
181
|
+
* @returns
|
|
182
|
+
*/
|
|
183
|
+
export async function sqlFileHasDdl(filePath) {
|
|
184
|
+
const CHUNK = 1024 * 1024; // 1 MB
|
|
185
|
+
const CARRY = 32; // "ALTER VIRTUAL TABLE IF NOT EXISTS" — enough to bridge a boundary
|
|
186
|
+
const handle = await fs.open(filePath, 'r');
|
|
187
|
+
try {
|
|
188
|
+
const buffer = Buffer.alloc(CHUNK);
|
|
189
|
+
let carry = '';
|
|
190
|
+
let pos = 0;
|
|
191
|
+
for (;;) {
|
|
192
|
+
const { bytesRead } = await handle.read(buffer, 0, CHUNK, pos);
|
|
193
|
+
if (bytesRead === 0)
|
|
194
|
+
break;
|
|
195
|
+
const text = carry + buffer.toString('utf8', 0, bytesRead);
|
|
196
|
+
if (DDL_PRESENCE_RE.test(text))
|
|
197
|
+
return true;
|
|
198
|
+
carry = text.slice(-CARRY);
|
|
199
|
+
pos += bytesRead;
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
await handle.close();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Extract migration ops from an SQL file, honoring stage-1 streaming: when
|
|
209
|
+
* `sourceCode` is empty the file was too large to materialize, so DDL presence
|
|
210
|
+
* is detected by streaming; only a real oversized migration is read in full
|
|
211
|
+
* (rare). Returns a `skipped` flag so the pipeline can surface the skip in
|
|
212
|
+
* coverage without emitting a violation.
|
|
213
|
+
* @param filePath
|
|
214
|
+
* @param sourceCode
|
|
215
|
+
* @returns
|
|
216
|
+
*/
|
|
217
|
+
export async function extractMigrationOpsFromFile(filePath, sourceCode) {
|
|
218
|
+
if (sourceCode !== '') {
|
|
219
|
+
return { ops: parseMigrationOps(sourceCode), skipped: false, bytes: Buffer.byteLength(sourceCode) };
|
|
220
|
+
}
|
|
221
|
+
let size = 0;
|
|
222
|
+
try {
|
|
223
|
+
size = (await fs.stat(filePath)).size;
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
size = 0;
|
|
227
|
+
}
|
|
228
|
+
if (size <= MAX_ORPHAN_SOURCE_BYTES) {
|
|
229
|
+
// Empty or small file whose read produced an empty string — nothing to do.
|
|
230
|
+
return { ops: [], skipped: false, bytes: size };
|
|
231
|
+
}
|
|
232
|
+
if (!(await sqlFileHasDdl(filePath))) {
|
|
233
|
+
return { ops: [], skipped: true, bytes: size };
|
|
234
|
+
}
|
|
235
|
+
const full = await fs.readFile(filePath, 'utf-8');
|
|
236
|
+
return { ops: parseMigrationOps(full), skipped: false, bytes: size };
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../../src/analyzers/universal/schema/migrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the schema analyzer family.
|
|
3
|
+
*
|
|
4
|
+
* Split out of UniversalSchemaAnalyzer.ts (Spec 33 item 15) so the
|
|
5
|
+
* migration/DDL, discovery, table-analysis, and JSON-schema modules can each
|
|
6
|
+
* import what they need without dragging in the whole analyzer — and without
|
|
7
|
+
* creating a circular import through the class.
|
|
8
|
+
*/
|
|
9
|
+
import type { AST, LanguageAdapter } from '../../../languages/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for Schema analyzer
|
|
12
|
+
*/
|
|
13
|
+
export interface SchemaAnalyzerConfig {
|
|
14
|
+
enableTableUsageTracking?: boolean;
|
|
15
|
+
checkMissingReferences?: boolean;
|
|
16
|
+
checkNamingConventions?: boolean;
|
|
17
|
+
detectUnusedTables?: boolean;
|
|
18
|
+
validateQueryPatterns?: boolean;
|
|
19
|
+
maxQueriesPerFunction?: number;
|
|
20
|
+
requiredSchemas?: string[];
|
|
21
|
+
schemas?: Array<{
|
|
22
|
+
name: string;
|
|
23
|
+
tables: Array<{
|
|
24
|
+
name: string;
|
|
25
|
+
columns: Array<{
|
|
26
|
+
name: string;
|
|
27
|
+
type: string;
|
|
28
|
+
}>;
|
|
29
|
+
}>;
|
|
30
|
+
}>;
|
|
31
|
+
validateJsonSchemas?: boolean;
|
|
32
|
+
jsonSchemaVersion?: 'draft-04' | 'draft-06' | 'draft-07' | '2019-09' | '2020-12';
|
|
33
|
+
allowedJsonTypes?: string[];
|
|
34
|
+
schemaFilePatterns?: string[];
|
|
35
|
+
dataFilePatterns?: string[];
|
|
36
|
+
schemaDataPairs?: Array<{
|
|
37
|
+
schema: string;
|
|
38
|
+
data: string | string[];
|
|
39
|
+
}>;
|
|
40
|
+
strictMode?: boolean;
|
|
41
|
+
allowAdditionalProperties?: boolean;
|
|
42
|
+
sqlTagNames?: string[];
|
|
43
|
+
dbReceiverNames?: string[];
|
|
44
|
+
dbCallMethods?: string[];
|
|
45
|
+
dbBindingNames?: string[];
|
|
46
|
+
dbWrapperNames?: string[];
|
|
47
|
+
fileGateGlobs?: string[];
|
|
48
|
+
schemaFiles?: string[];
|
|
49
|
+
/** Spec 29: Declarative table-source registry for Tier 2 ORM detection */
|
|
50
|
+
tableSources?: TableSourceEntry[];
|
|
51
|
+
}
|
|
52
|
+
export interface TableReference {
|
|
53
|
+
table: string;
|
|
54
|
+
type: 'select' | 'insert' | 'update' | 'delete' | 'create' | 'reference';
|
|
55
|
+
location: {
|
|
56
|
+
line: number;
|
|
57
|
+
column: number;
|
|
58
|
+
};
|
|
59
|
+
context: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Registry entry for declarative table-source detection.
|
|
63
|
+
* Adding an ORM becomes a config entry, not code.
|
|
64
|
+
*/
|
|
65
|
+
export interface TableSourceEntry {
|
|
66
|
+
/** Type discriminator for the match shape */
|
|
67
|
+
kind: 'callee' | 'decorator';
|
|
68
|
+
/** The function/method/decorator name to match */
|
|
69
|
+
name: string;
|
|
70
|
+
/** Which argument (0-indexed) holds the table name as a string literal */
|
|
71
|
+
arg: number;
|
|
72
|
+
/** Human-readable description for provenance display */
|
|
73
|
+
description?: string;
|
|
74
|
+
/**
|
|
75
|
+
* Optional: required module path. When set, the call/decorator is only
|
|
76
|
+
* considered if the identifier originates from an import matching this
|
|
77
|
+
* specifier. Example: 'knex' prevents matching a local function also
|
|
78
|
+
* named createTable.
|
|
79
|
+
*/
|
|
80
|
+
module?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Per-table origin record — tracks which tier and source file contributed
|
|
84
|
+
* a table to the catalog.
|
|
85
|
+
*/
|
|
86
|
+
export interface TableProvenance {
|
|
87
|
+
table: string;
|
|
88
|
+
tier: 'sql-migration' | 'orm-registry' | 'prisma-model' | 'external-config';
|
|
89
|
+
sourceFile?: string;
|
|
90
|
+
description?: string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* A complete catalog entry: one table name with all its known sources.
|
|
94
|
+
*/
|
|
95
|
+
export interface TableCatalogEntry {
|
|
96
|
+
table: string;
|
|
97
|
+
sources: TableProvenance[];
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Resolution context threaded through the registry table extractors. Bundling
|
|
101
|
+
* the AST + adapter + source + file-path + module-reader tuple keeps the
|
|
102
|
+
* extractor signatures at three positional parameters (target + context +
|
|
103
|
+
* accumulator) instead of six.
|
|
104
|
+
*
|
|
105
|
+
* `importMap` is populated by `extractTablesFromRegistry` before dispatch —
|
|
106
|
+
* callers build the context without it.
|
|
107
|
+
*/
|
|
108
|
+
export interface RegistryExtractionContext {
|
|
109
|
+
ast: AST;
|
|
110
|
+
adapter: LanguageAdapter;
|
|
111
|
+
sourceCode: string;
|
|
112
|
+
filePath: string;
|
|
113
|
+
importMap?: Map<string, Map<string, string>>;
|
|
114
|
+
readModule?: (fromFile: string, specifier: string) => string | null;
|
|
115
|
+
}
|
|
116
|
+
/** A single DDL state transition parsed from migration SQL. */
|
|
117
|
+
export type MigrationOp = {
|
|
118
|
+
op: 'CREATE' | 'DROP' | 'RENAME';
|
|
119
|
+
table: string;
|
|
120
|
+
newTable?: string;
|
|
121
|
+
};
|
|
122
|
+
/** A single re-export statement from a barrel file. */
|
|
123
|
+
export interface ReExport {
|
|
124
|
+
/** The module the statement re-exports from. */
|
|
125
|
+
source: string;
|
|
126
|
+
/** True for `export * from 'x'` (every name maps to itself). */
|
|
127
|
+
star: boolean;
|
|
128
|
+
/** For named re-exports: local export name → original package name. */
|
|
129
|
+
renamed: Map<string, string>;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/analyzers/universal/schema/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the schema analyzer family.
|
|
3
|
+
*
|
|
4
|
+
* Split out of UniversalSchemaAnalyzer.ts (Spec 33 item 15) so the
|
|
5
|
+
* migration/DDL, discovery, table-analysis, and JSON-schema modules can each
|
|
6
|
+
* import what they need without dragging in the whole analyzer — and without
|
|
7
|
+
* creating a circular import through the class.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/analyzers/universal/schema/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema violation builders — module-level equivalents of the base
|
|
3
|
+
* UniversalAnalyzer.createViolation with `analyzer: 'schema'` hardcoded, so
|
|
4
|
+
* extracted free functions (Spec 34) can construct violations without a `this`
|
|
5
|
+
* reference back through the analyzer class.
|
|
6
|
+
*/
|
|
7
|
+
import type { Violation } from '../../../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Bundled classification for a schema violation — `severity`, `rule`, and an
|
|
10
|
+
* optional `symbol` travel together so `createSchemaViolation` stays a 4-arg
|
|
11
|
+
* call rather than a 6-arg one.
|
|
12
|
+
*/
|
|
13
|
+
export interface SchemaViolationClassification {
|
|
14
|
+
severity: 'critical' | 'warning' | 'suggestion';
|
|
15
|
+
rule: string;
|
|
16
|
+
symbol?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Module-level equivalent of `UniversalAnalyzer.createViolation`. `rule`
|
|
20
|
+
* identity is preserved exactly; `location` and optional `symbol` are kept,
|
|
21
|
+
* while `analyzer` is hardcoded to `'schema'` instead of `this.name`.
|
|
22
|
+
*
|
|
23
|
+
* @param file The file the violation occurred in.
|
|
24
|
+
* @param location The 1-based line/column of the violation.
|
|
25
|
+
* @param message The human-readable violation message.
|
|
26
|
+
* @param classification Bundled severity/rule/symbol classification.
|
|
27
|
+
* @returns A schema analyzer violation.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createSchemaViolation(file: string, location: {
|
|
30
|
+
line: number;
|
|
31
|
+
column: number;
|
|
32
|
+
}, message: string, classification: SchemaViolationClassification): Violation;
|
|
33
|
+
/**
|
|
34
|
+
* Single-line JSON validation violation — hardcoded `line: 1` / `column: 1`
|
|
35
|
+
* (JSON files have no AST positions). Used by the JSON-schema helpers.
|
|
36
|
+
*
|
|
37
|
+
* @param file The JSON file the violation occurred in.
|
|
38
|
+
* @param severity The violation severity.
|
|
39
|
+
* @param message The human-readable violation message.
|
|
40
|
+
* @param rule The rule identifier.
|
|
41
|
+
* @returns A schema analyzer violation anchored at 1:1.
|
|
42
|
+
*/
|
|
43
|
+
export declare function emitViolation(file: string, severity: Violation['severity'], message: string, rule: string): Violation;
|
|
44
|
+
//# sourceMappingURL=violations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violations.d.ts","sourceRoot":"","sources":["../../../../src/analyzers/universal/schema/violations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC1C,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,6BAA6B,GAC5C,SAAS,CAcX;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,EAC/B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,SAAS,CAUX"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema violation builders — module-level equivalents of the base
|
|
3
|
+
* UniversalAnalyzer.createViolation with `analyzer: 'schema'` hardcoded, so
|
|
4
|
+
* extracted free functions (Spec 34) can construct violations without a `this`
|
|
5
|
+
* reference back through the analyzer class.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Module-level equivalent of `UniversalAnalyzer.createViolation`. `rule`
|
|
9
|
+
* identity is preserved exactly; `location` and optional `symbol` are kept,
|
|
10
|
+
* while `analyzer` is hardcoded to `'schema'` instead of `this.name`.
|
|
11
|
+
*
|
|
12
|
+
* @param file The file the violation occurred in.
|
|
13
|
+
* @param location The 1-based line/column of the violation.
|
|
14
|
+
* @param message The human-readable violation message.
|
|
15
|
+
* @param classification Bundled severity/rule/symbol classification.
|
|
16
|
+
* @returns A schema analyzer violation.
|
|
17
|
+
*/
|
|
18
|
+
export function createSchemaViolation(file, location, message, classification) {
|
|
19
|
+
const v = {
|
|
20
|
+
file,
|
|
21
|
+
line: location.line,
|
|
22
|
+
column: location.column,
|
|
23
|
+
severity: classification.severity,
|
|
24
|
+
message,
|
|
25
|
+
rule: classification.rule,
|
|
26
|
+
analyzer: 'schema'
|
|
27
|
+
};
|
|
28
|
+
if (classification.symbol) {
|
|
29
|
+
v.functionName = classification.symbol;
|
|
30
|
+
}
|
|
31
|
+
return v;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Single-line JSON validation violation — hardcoded `line: 1` / `column: 1`
|
|
35
|
+
* (JSON files have no AST positions). Used by the JSON-schema helpers.
|
|
36
|
+
*
|
|
37
|
+
* @param file The JSON file the violation occurred in.
|
|
38
|
+
* @param severity The violation severity.
|
|
39
|
+
* @param message The human-readable violation message.
|
|
40
|
+
* @param rule The rule identifier.
|
|
41
|
+
* @returns A schema analyzer violation anchored at 1:1.
|
|
42
|
+
*/
|
|
43
|
+
export function emitViolation(file, severity, message, rule) {
|
|
44
|
+
return {
|
|
45
|
+
file,
|
|
46
|
+
line: 1,
|
|
47
|
+
column: 1,
|
|
48
|
+
severity,
|
|
49
|
+
message,
|
|
50
|
+
rule,
|
|
51
|
+
analyzer: 'schema',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=violations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violations.js","sourceRoot":"","sources":["../../../../src/analyzers/universal/schema/violations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,QAA0C,EAC1C,OAAe,EACf,cAA6C;IAE7C,MAAM,CAAC,GAAc;QACnB,IAAI;QACJ,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,OAAO;QACP,IAAI,EAAE,cAAc,CAAC,IAAI;QACzB,QAAQ,EAAE,QAAQ;KACnB,CAAC;IACF,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;QAC1B,CAAC,CAAC,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,QAA+B,EAC/B,OAAe,EACf,IAAY;IAEZ,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;QACT,QAAQ;QACR,OAAO;QACP,IAAI;QACJ,QAAQ,EAAE,QAAQ;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auditRunner.d.ts","sourceRoot":"","sources":["../src/auditRunner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,cAAc,
|
|
1
|
+
{"version":3,"file":"auditRunner.d.ts","sourceRoot":"","sources":["../src/auditRunner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,cAAc,EASf,MAAM,YAAY,CAAC;AA4DpB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB;oCAiBnB,MAAM,KAAG,OAAO,CAAC,kBAAkB,CAAC;uBAQjD,kBAAkB,KAAG,OAAO,CAAC,WAAW,CAAC;6BA29B1B,WAAW,UAAU,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;EAS7F;AAyQD,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAC/C,UAAU,CAAC,EAAE,MAAM,GAClB,iBAAiB,EAAE,CA0CrB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAGjF;AAED,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|