code-auditor-mcp 3.4.12 → 3.4.13
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 +46 -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 +15 -5
- 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 +0 -2
- 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 +79 -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.js +10 -1
- 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/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/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,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec 34 — JSON Schema validation (schema-json Stage 2 visitor + reducer
|
|
3
|
+
* input). Extracted to module-level free functions; the only public entry
|
|
4
|
+
* point is `analyzeJsonSchemas`, consumed by pipelineAdapters.ts via the
|
|
5
|
+
* module surface.
|
|
6
|
+
*
|
|
7
|
+
* Dependency direction is leaf -> parent:
|
|
8
|
+
* jsonSchema.ts --(types, config, violations, pipeline)
|
|
9
|
+
*/
|
|
10
|
+
import { DEFAULT_SCHEMA_CONFIG } from './config.js';
|
|
11
|
+
import { emitViolation } from './violations.js';
|
|
12
|
+
import { makeVisitorStatus } from '../../../pipeline.js';
|
|
13
|
+
/**
|
|
14
|
+
* Analyze JSON schemas and validate data files against them.
|
|
15
|
+
*
|
|
16
|
+
* Pipeline-refactored: accepts a list of JSON file paths plus an on-demand
|
|
17
|
+
* parser so parsed objects are transient (one file at a time) rather than
|
|
18
|
+
* retained in memory for the whole Stage 3 reducer run.
|
|
19
|
+
*
|
|
20
|
+
* @param files JSON file paths to validate
|
|
21
|
+
* @param readJson on-demand parser: returns the parsed object, or null when
|
|
22
|
+
* the file failed to parse (invalid JSON) or was absent.
|
|
23
|
+
* @param config Schema analyzer configuration
|
|
24
|
+
* @param analyzerName name reported in the returned AnalyzerResult
|
|
25
|
+
* @returns the aggregate JSON-schema validation result
|
|
26
|
+
*/
|
|
27
|
+
export function analyzeJsonSchemas(files, readJson, config, analyzerName = 'schema') {
|
|
28
|
+
const startTime = Date.now();
|
|
29
|
+
const finalConfig = { ...DEFAULT_SCHEMA_CONFIG, ...config };
|
|
30
|
+
if (!finalConfig.validateJsonSchemas) {
|
|
31
|
+
return jsonResult({ violations: [], errors: [], filesProcessed: 0 }, 0, analyzerName);
|
|
32
|
+
}
|
|
33
|
+
const schemaFiles = identifySchemaFiles(files, finalConfig);
|
|
34
|
+
const dataFiles = identifyDataFiles(files, finalConfig);
|
|
35
|
+
const unknownJsonFiles = files.filter(f => !schemaFiles.includes(f) && !dataFiles.includes(f));
|
|
36
|
+
const state = { violations: [], errors: [], filesProcessed: 0 };
|
|
37
|
+
const scan = { files, readJson, config: finalConfig, state };
|
|
38
|
+
const schemas = loadSchemas(schemaFiles, scan);
|
|
39
|
+
if (finalConfig.schemaDataPairs) {
|
|
40
|
+
validatePairedData(schemas, scan);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
validateDiscoveredData([...dataFiles, ...unknownJsonFiles], unknownJsonFiles, schemas, scan);
|
|
44
|
+
}
|
|
45
|
+
return jsonResult(state, Date.now() - startTime, analyzerName);
|
|
46
|
+
}
|
|
47
|
+
function jsonResult(state, executionTime, analyzerName) {
|
|
48
|
+
return {
|
|
49
|
+
violations: state.violations,
|
|
50
|
+
errors: state.errors,
|
|
51
|
+
status: makeVisitorStatus(state.filesProcessed),
|
|
52
|
+
executionTime,
|
|
53
|
+
analyzerName,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function loadSchemas(schemaFiles, scan) {
|
|
57
|
+
const schemas = new Map();
|
|
58
|
+
for (const file of schemaFiles) {
|
|
59
|
+
try {
|
|
60
|
+
const schema = scan.readJson(file);
|
|
61
|
+
if (schema === null)
|
|
62
|
+
throw new SyntaxError('JSON parse failed');
|
|
63
|
+
schemas.set(file, schema);
|
|
64
|
+
scan.state.violations.push(...validateJsonSchema(schema, file, scan.config));
|
|
65
|
+
scan.state.filesProcessed++;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof SyntaxError) {
|
|
69
|
+
scan.state.violations.push(emitViolation(file, 'warning', `Invalid JSON: ${error.message}`, 'invalid-json'));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
scan.state.errors.push({
|
|
73
|
+
file,
|
|
74
|
+
error: error instanceof Error ? error.message : String(error),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
scan.state.filesProcessed++;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return schemas;
|
|
81
|
+
}
|
|
82
|
+
function validatePairedData(schemas, scan) {
|
|
83
|
+
for (const pair of scan.config.schemaDataPairs) {
|
|
84
|
+
const schema = schemas.get(pair.schema) ?? scan.readJson(pair.schema);
|
|
85
|
+
if (schema) {
|
|
86
|
+
const dataFiles = Array.isArray(pair.data) ? pair.data : [pair.data];
|
|
87
|
+
for (const dataFile of dataFiles) {
|
|
88
|
+
if (scan.files.includes(dataFile)) {
|
|
89
|
+
const parsed = scan.readJson(dataFile);
|
|
90
|
+
if (parsed !== null) {
|
|
91
|
+
const dataViolations = [];
|
|
92
|
+
validateAgainstSchema(parsed, schema, {
|
|
93
|
+
filePath: dataFile,
|
|
94
|
+
config: scan.config,
|
|
95
|
+
violations: dataViolations,
|
|
96
|
+
});
|
|
97
|
+
scan.state.violations.push(...dataViolations);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
scan.state.violations.push(emitViolation(dataFile, 'warning', 'Invalid JSON in data file', 'invalid-json'));
|
|
101
|
+
}
|
|
102
|
+
scan.state.filesProcessed++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function validateDiscoveredData(dataFiles, unknownJsonFiles, schemas, scan) {
|
|
109
|
+
for (const dataFile of dataFiles) {
|
|
110
|
+
const matchedSchema = findMatchingSchema(dataFile, schemas);
|
|
111
|
+
if (matchedSchema) {
|
|
112
|
+
const parsed = scan.readJson(dataFile);
|
|
113
|
+
if (parsed !== null) {
|
|
114
|
+
const dataViolations = [];
|
|
115
|
+
validateAgainstSchema(parsed, matchedSchema, {
|
|
116
|
+
filePath: dataFile,
|
|
117
|
+
config: scan.config,
|
|
118
|
+
violations: dataViolations,
|
|
119
|
+
});
|
|
120
|
+
scan.state.violations.push(...dataViolations);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else if (unknownJsonFiles.includes(dataFile)) {
|
|
124
|
+
const parsed = scan.readJson(dataFile);
|
|
125
|
+
if (parsed === null) {
|
|
126
|
+
scan.state.violations.push(emitViolation(dataFile, 'warning', 'Invalid JSON: Parse error', 'invalid-json'));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
scan.state.filesProcessed++;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function validateJsonSchema(schema, filePath, config) {
|
|
133
|
+
const ctx = { filePath, config, violations: [] };
|
|
134
|
+
if (!schema.$schema && config.jsonSchemaVersion) {
|
|
135
|
+
emit(ctx, 'suggestion', 'missing-schema-declaration', 'JSON Schema missing $schema declaration');
|
|
136
|
+
}
|
|
137
|
+
validateSchemaTypes(schema, ctx);
|
|
138
|
+
if (schema.type === 'object' && schema.properties) {
|
|
139
|
+
if (schema.required && Array.isArray(schema.required)) {
|
|
140
|
+
for (const field of schema.required) {
|
|
141
|
+
if (!schema.properties[field]) {
|
|
142
|
+
emit(ctx, 'warning', 'undefined-required-field', `Required field "${field}" not defined in properties`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return ctx.violations;
|
|
148
|
+
}
|
|
149
|
+
function validateSchemaTypes(schema, ctx, path = '') {
|
|
150
|
+
if (!schema || typeof schema !== 'object')
|
|
151
|
+
return;
|
|
152
|
+
checkSchemaTypeField(schema, ctx, path);
|
|
153
|
+
checkNumericRangeField(schema, ctx, path);
|
|
154
|
+
if (schema.properties) {
|
|
155
|
+
for (const [key, value] of Object.entries(schema.properties)) {
|
|
156
|
+
validateSchemaTypes(value, ctx, `${path}.${key}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (schema.items) {
|
|
160
|
+
validateSchemaTypes(schema.items, ctx, `${path}[items]`);
|
|
161
|
+
}
|
|
162
|
+
if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {
|
|
163
|
+
validateSchemaTypes(schema.additionalProperties, ctx, `${path}[additionalProperties]`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function checkSchemaTypeField(schema, ctx, path) {
|
|
167
|
+
if (schema.type && ctx.config.allowedJsonTypes) {
|
|
168
|
+
const types = Array.isArray(schema.type) ? schema.type : [schema.type];
|
|
169
|
+
for (const type of types) {
|
|
170
|
+
if (!ctx.config.allowedJsonTypes.includes(type)) {
|
|
171
|
+
emit(ctx, 'warning', 'invalid-type', `Invalid type "${type}" at ${path || 'root'}. Allowed types: ${ctx.config.allowedJsonTypes.join(', ')}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function checkNumericRangeField(schema, ctx, path) {
|
|
177
|
+
if (schema.type === 'integer' || schema.type === 'number') {
|
|
178
|
+
if (schema.minimum !== undefined && schema.maximum !== undefined) {
|
|
179
|
+
if (schema.minimum > schema.maximum) {
|
|
180
|
+
emit(ctx, 'warning', 'invalid-range', `Invalid range at ${path}: minimum (${schema.minimum}) > maximum (${schema.maximum})`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function identifySchemaFiles(files, config) {
|
|
186
|
+
if (!config.schemaFilePatterns)
|
|
187
|
+
return [];
|
|
188
|
+
return files.filter(file => {
|
|
189
|
+
const fileName = file.split('/').pop() || '';
|
|
190
|
+
return config.schemaFilePatterns.some(pattern => {
|
|
191
|
+
const regex = new RegExp(pattern.replace('*', '.*'));
|
|
192
|
+
return regex.test(fileName);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
function identifyDataFiles(files, config) {
|
|
197
|
+
if (!config.dataFilePatterns)
|
|
198
|
+
return [];
|
|
199
|
+
return files.filter(file => {
|
|
200
|
+
const fileName = file.split('/').pop() || '';
|
|
201
|
+
return config.dataFilePatterns.some(pattern => {
|
|
202
|
+
const regex = new RegExp(pattern.replace('*', '.*'));
|
|
203
|
+
return regex.test(fileName);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
function findMatchingSchema(dataFile, schemas) {
|
|
208
|
+
const dataFileName = dataFile.split('/').pop() || '';
|
|
209
|
+
const dataBaseName = dataFileName.replace(/\.(data|example|test)\.json$/, '');
|
|
210
|
+
for (const [schemaFile, schema] of schemas) {
|
|
211
|
+
const schemaFileName = schemaFile.split('/').pop() || '';
|
|
212
|
+
const schemaBaseName = schemaFileName.replace(/[.-]?schema\.json$/, '');
|
|
213
|
+
if (dataBaseName === schemaBaseName) {
|
|
214
|
+
return schema;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (schemas.size === 1) {
|
|
218
|
+
return schemas.values().next().value;
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
function validateAgainstSchema(data, schema, ctx, path = '') {
|
|
223
|
+
if (schema.type) {
|
|
224
|
+
const actualType = actualTypeOf(data);
|
|
225
|
+
const allowedTypes = Array.isArray(schema.type) ? schema.type : [schema.type];
|
|
226
|
+
if (!matchesSchemaType(data, actualType, allowedTypes)) {
|
|
227
|
+
emit(ctx, 'warning', 'type-mismatch', `Type mismatch at ${path || 'root'}: expected ${allowedTypes.join(' | ')}, got ${actualType}`);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
checkStringConstraints(data, schema, ctx, path);
|
|
232
|
+
checkNumberConstraints(data, schema, ctx, path);
|
|
233
|
+
checkArrayConstraints(data, schema, ctx, path);
|
|
234
|
+
checkObjectConstraints(data, schema, ctx, path);
|
|
235
|
+
checkEnumConstraint(data, schema, ctx, path);
|
|
236
|
+
}
|
|
237
|
+
function actualTypeOf(data) {
|
|
238
|
+
if (Array.isArray(data))
|
|
239
|
+
return 'array';
|
|
240
|
+
if (data === null)
|
|
241
|
+
return 'null';
|
|
242
|
+
return typeof data;
|
|
243
|
+
}
|
|
244
|
+
function matchesSchemaType(data, actualType, allowedTypes) {
|
|
245
|
+
return allowedTypes.some((type) => {
|
|
246
|
+
if (type === 'integer') {
|
|
247
|
+
return typeof data === 'number' && Number.isInteger(data);
|
|
248
|
+
}
|
|
249
|
+
return type === actualType;
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
function checkStringConstraints(data, schema, ctx, path) {
|
|
253
|
+
if (schema.type !== 'string' || typeof data !== 'string')
|
|
254
|
+
return;
|
|
255
|
+
if (schema.minLength !== undefined && data.length < schema.minLength) {
|
|
256
|
+
emit(ctx, 'warning', 'string-too-short', `String at ${path} too short: ${data.length} < ${schema.minLength}`);
|
|
257
|
+
}
|
|
258
|
+
if (schema.maxLength !== undefined && data.length > schema.maxLength) {
|
|
259
|
+
emit(ctx, 'warning', 'string-too-long', `String at ${path} too long: ${data.length} > ${schema.maxLength}`);
|
|
260
|
+
}
|
|
261
|
+
if (schema.pattern) {
|
|
262
|
+
const regex = new RegExp(schema.pattern);
|
|
263
|
+
if (!regex.test(data)) {
|
|
264
|
+
emit(ctx, 'warning', 'pattern-mismatch', `String at ${path} doesn't match pattern: ${schema.pattern}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (schema.format) {
|
|
268
|
+
checkFormatConstraint(data, schema.format, ctx, path);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function checkFormatConstraint(data, format, ctx, path) {
|
|
272
|
+
switch (format) {
|
|
273
|
+
case 'email':
|
|
274
|
+
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data)) {
|
|
275
|
+
emit(ctx, 'warning', 'invalid-format', `Invalid email format at ${path}`);
|
|
276
|
+
}
|
|
277
|
+
break;
|
|
278
|
+
case 'uuid':
|
|
279
|
+
if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(data)) {
|
|
280
|
+
emit(ctx, 'warning', 'invalid-format', `Invalid UUID format at ${path}`);
|
|
281
|
+
}
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
function checkNumberConstraints(data, schema, ctx, path) {
|
|
286
|
+
if ((schema.type !== 'number' && schema.type !== 'integer') || typeof data !== 'number')
|
|
287
|
+
return;
|
|
288
|
+
if (schema.minimum !== undefined && data < schema.minimum) {
|
|
289
|
+
emit(ctx, 'warning', 'below-minimum', `Value at ${path} below minimum: ${data} < ${schema.minimum}`);
|
|
290
|
+
}
|
|
291
|
+
if (schema.maximum !== undefined && data > schema.maximum) {
|
|
292
|
+
emit(ctx, 'warning', 'above-maximum', `Value at ${path} above maximum: ${data} > ${schema.maximum}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
function checkArrayConstraints(data, schema, ctx, path) {
|
|
296
|
+
if (schema.type !== 'array' || !Array.isArray(data))
|
|
297
|
+
return;
|
|
298
|
+
if (schema.minItems !== undefined && data.length < schema.minItems) {
|
|
299
|
+
emit(ctx, 'warning', 'too-few-items', `Array at ${path} has too few items: ${data.length} < ${schema.minItems}`);
|
|
300
|
+
}
|
|
301
|
+
if (schema.maxItems !== undefined && data.length > schema.maxItems) {
|
|
302
|
+
emit(ctx, 'warning', 'too-many-items', `Array at ${path} has too many items: ${data.length} > ${schema.maxItems}`);
|
|
303
|
+
}
|
|
304
|
+
if (schema.items) {
|
|
305
|
+
data.forEach((item, index) => {
|
|
306
|
+
validateAgainstSchema(item, schema.items, ctx, `${path}[${index}]`);
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function checkObjectConstraints(data, schema, ctx, path) {
|
|
311
|
+
if (schema.type !== 'object' || typeof data !== 'object' || data === null)
|
|
312
|
+
return;
|
|
313
|
+
if (schema.required && Array.isArray(schema.required)) {
|
|
314
|
+
for (const requiredField of schema.required) {
|
|
315
|
+
if (!(requiredField in data)) {
|
|
316
|
+
emit(ctx, 'warning', 'missing-required-field', `Missing required field "${requiredField}" at ${path}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (schema.properties) {
|
|
321
|
+
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
322
|
+
if (key in data) {
|
|
323
|
+
validateAgainstSchema(data[key], propSchema, ctx, path ? `${path}.${key}` : key);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (schema.additionalProperties === false || (ctx.config.strictMode && !schema.additionalProperties)) {
|
|
328
|
+
checkUnexpectedProperties(data, schema, ctx, path);
|
|
329
|
+
}
|
|
330
|
+
else if (typeof schema.additionalProperties === 'object') {
|
|
331
|
+
checkAdditionalProperties(data, schema, ctx, path);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function checkUnexpectedProperties(data, schema, ctx, path) {
|
|
335
|
+
const definedKeys = new Set(Object.keys(schema.properties || {}));
|
|
336
|
+
for (const key of Object.keys(data)) {
|
|
337
|
+
if (!definedKeys.has(key)) {
|
|
338
|
+
emit(ctx, 'warning', 'unexpected-property', `Unexpected property "${key}" at ${path}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
function checkAdditionalProperties(data, schema, ctx, path) {
|
|
343
|
+
const definedKeys = new Set(Object.keys(schema.properties || {}));
|
|
344
|
+
for (const [key, value] of Object.entries(data)) {
|
|
345
|
+
if (!definedKeys.has(key)) {
|
|
346
|
+
validateAgainstSchema(value, schema.additionalProperties, ctx, path ? `${path}.${key}` : key);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
function checkEnumConstraint(data, schema, ctx, path) {
|
|
351
|
+
if (schema.enum && Array.isArray(schema.enum)) {
|
|
352
|
+
if (!schema.enum.includes(data)) {
|
|
353
|
+
emit(ctx, 'warning', 'enum-mismatch', `Value at ${path} not in enum: ${JSON.stringify(data)}. Allowed: ${schema.enum.join(', ')}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
function emit(ctx, severity, rule, message) {
|
|
358
|
+
ctx.violations.push({
|
|
359
|
+
file: ctx.filePath,
|
|
360
|
+
line: 1,
|
|
361
|
+
column: 1,
|
|
362
|
+
severity,
|
|
363
|
+
message,
|
|
364
|
+
rule,
|
|
365
|
+
analyzer: 'schema',
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=jsonSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonSchema.js","sourceRoot":"","sources":["../../../../src/analyzers/universal/schema/jsonSchema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
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 type { MigrationOp, ReExport } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Strip SQL identifier delimiters: backticks or double-quotes.
|
|
11
|
+
* @param name
|
|
12
|
+
* @returns
|
|
13
|
+
*/
|
|
14
|
+
export declare function stripIdentifier(name: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Apply pre-extracted DDL operations to a table set in migration order.
|
|
17
|
+
* Strips identifier delimiters (backticks/quotes) and performs the
|
|
18
|
+
* CREATE/DROP/RENAME state transitions. Callable from the schema reducer
|
|
19
|
+
* without re-parsing raw SQL.
|
|
20
|
+
* @param ops
|
|
21
|
+
* @param tables
|
|
22
|
+
*/
|
|
23
|
+
export declare function applyMigrationOps(ops: MigrationOp[], tables: Set<string>): void;
|
|
24
|
+
/**
|
|
25
|
+
* Parse a migration SQL source and apply stateful CREATE/DROP/RENAME
|
|
26
|
+
* operations to the given table set in migration order.
|
|
27
|
+
* @param source
|
|
28
|
+
* @param tables
|
|
29
|
+
*/
|
|
30
|
+
export declare function processMigrationSource(source: string, tables: Set<string>): void;
|
|
31
|
+
/**
|
|
32
|
+
* Extract ordered DDL operations from migration SQL text. Emitted by the
|
|
33
|
+
* schema-sql visitor instead of raw source so the reducer only retains the
|
|
34
|
+
* extracted state transitions, not the full file text.
|
|
35
|
+
* @param source
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseMigrationOps(source: string): MigrationOp[];
|
|
39
|
+
/**
|
|
40
|
+
* Extract `export * from 'x'` and `export { a, b as c } from 'x'` statements
|
|
41
|
+
* from barrel source. Regex-based — matches the analyzer's existing
|
|
42
|
+
* migration/ORM discovery idiom and avoids a tree-sitter round-trip per barrel.
|
|
43
|
+
* Local re-exports without a `from` clause are not re-exports and are skipped.
|
|
44
|
+
* @param source
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
export declare function extractReExports(source: string): ReExport[];
|
|
48
|
+
/**
|
|
49
|
+
* Resolve a relative module specifier to a file on disk, trying common source
|
|
50
|
+
* extensions and index files. Returns the resolved path (absolute or relative
|
|
51
|
+
* to the importing file's directory) or null when the file cannot be found.
|
|
52
|
+
*
|
|
53
|
+
* @param fromFile The importing file (its directory is the resolution base).
|
|
54
|
+
* @param specifier The relative module specifier to resolve.
|
|
55
|
+
* @returns The resolved file path, or null when not found.
|
|
56
|
+
*/
|
|
57
|
+
export declare function resolveBarrelModulePath(fromFile: string, specifier: string): string | null;
|
|
58
|
+
/**
|
|
59
|
+
* Default barrel reader — resolves the specifier relative to `fromFile` on disk.
|
|
60
|
+
*
|
|
61
|
+
* @param fromFile The importing file (its directory is the resolution base).
|
|
62
|
+
* @param specifier The relative module specifier to read.
|
|
63
|
+
* @returns The resolved file's source text, or null when unreadable.
|
|
64
|
+
*/
|
|
65
|
+
export declare function readModuleFromDisk(fromFile: string, specifier: string): string | null;
|
|
66
|
+
/**
|
|
67
|
+
* Detect whether an SQL file contains any DDL statement without materializing
|
|
68
|
+
* the whole file. Streams in 1 MB chunks, carrying a small tail across chunk
|
|
69
|
+
* boundaries so a marker split at "CREATE TA/BLE" is still caught. Used by the
|
|
70
|
+
* schema-sql visitor for oversized orphans yielded with empty source by stage 1.
|
|
71
|
+
* @param filePath
|
|
72
|
+
* @returns
|
|
73
|
+
*/
|
|
74
|
+
export declare function sqlFileHasDdl(filePath: string): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Extract migration ops from an SQL file, honoring stage-1 streaming: when
|
|
77
|
+
* `sourceCode` is empty the file was too large to materialize, so DDL presence
|
|
78
|
+
* is detected by streaming; only a real oversized migration is read in full
|
|
79
|
+
* (rare). Returns a `skipped` flag so the pipeline can surface the skip in
|
|
80
|
+
* coverage without emitting a violation.
|
|
81
|
+
* @param filePath
|
|
82
|
+
* @param sourceCode
|
|
83
|
+
* @returns
|
|
84
|
+
*/
|
|
85
|
+
export declare function extractMigrationOpsFromFile(filePath: string, sourceCode: string): Promise<{
|
|
86
|
+
ops: MigrationOp[];
|
|
87
|
+
skipped: boolean;
|
|
88
|
+
bytes: number;
|
|
89
|
+
}>;
|
|
90
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../../src/analyzers/universal/schema/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAW/E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAClB,IAAI,CAEN;AAUD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAe/D;AAID;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CA4B3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoB1F;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQrF;AAKD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBtE;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBlE"}
|