code-auditor-mcp 3.4.11 → 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/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +119 -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 +59 -46
- 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 +72 -2
- package/dist/analyzers/provenance.d.ts.map +1 -1
- package/dist/analyzers/provenance.js +462 -338
- 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 +118 -1
- package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
- package/dist/analyzers/ruleRegistry.js +1717 -104
- 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 +24 -186
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +1081 -1061
- 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 -212
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +139 -1518
- 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 -472
- 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 +101 -39
- package/dist/auditRunner.js.map +1 -1
- package/dist/cli.js +348 -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/grammars/tree-sitter-scss.wasm +0 -0
- 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 +38 -9
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts.map +1 -1
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +111 -74
- 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 +95 -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 -62
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +1461 -791
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
- package/dist/mcp-tools/whitelistTools.d.ts +1 -1
- package/dist/mcp-tools-shared.d.ts.map +1 -1
- package/dist/mcp-tools-shared.js +1 -0
- package/dist/mcp-tools-shared.js.map +1 -1
- package/dist/mcpAuditJobs.d.ts.map +1 -1
- package/dist/mcpAuditJobs.js +1 -0
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/pipeline.d.ts +30 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +527 -203
- package/dist/pipeline.js.map +1 -1
- package/dist/pipelineAdapters.d.ts +5 -12
- package/dist/pipelineAdapters.d.ts.map +1 -1
- package/dist/pipelineAdapters.js +175 -100
- 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 +20 -5
- package/dist/styles/cssAstExtractor.d.ts.map +1 -1
- package/dist/styles/cssAstExtractor.js +247 -9
- package/dist/styles/cssAstExtractor.js.map +1 -1
- package/dist/styles/styleIndexer.js +13 -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/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 +201 -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 +7 -4
- package/plugin/.claude-plugin/plugin.json +1 -1
- 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,616 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec 34 — Schema table discovery (R2.1 AST-based registry extraction +
|
|
3
|
+
* auto-discovery helpers + file gate). Extracted free functions; none of these
|
|
4
|
+
* reference the UniversalSchemaAnalyzer class (no cycle back through the class).
|
|
5
|
+
*
|
|
6
|
+
* Dependency direction is leaf → parent:
|
|
7
|
+
* discovery.ts ──(types, migrations, config, codeAnalysis)
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'fs/promises';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import picomatch from 'picomatch';
|
|
12
|
+
import { DB_RECEIVER_NAMES, DB_CALL_METHOD_NAMES, DB_BINDING_NAMES, SQL_TAG_NAMES, escapeRegex, } from './config.js';
|
|
13
|
+
import { processMigrationSource, stripIdentifier, readModuleFromDisk, extractReExports, } from './migrations.js';
|
|
14
|
+
import { getCallee } from './codeAnalysis.js';
|
|
15
|
+
/**
|
|
16
|
+
* Walk project root recursively, returning files matching any of the given
|
|
17
|
+
* picomatch globs. Skips node_modules and dot-directories.
|
|
18
|
+
*
|
|
19
|
+
* @param root The directory to walk.
|
|
20
|
+
* @param globs Picomatch globs to match relative paths against.
|
|
21
|
+
* @returns Absolute paths of matching files, sorted-deterministic per directory.
|
|
22
|
+
*/
|
|
23
|
+
export async function walkFiles(root, globs) {
|
|
24
|
+
const results = [];
|
|
25
|
+
async function walk(dir) {
|
|
26
|
+
let names;
|
|
27
|
+
try {
|
|
28
|
+
names = await fs.readdir(dir);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return; // Skip unreadable directories
|
|
32
|
+
}
|
|
33
|
+
for (const name of names) {
|
|
34
|
+
const fullPath = path.join(dir, name);
|
|
35
|
+
// Skip node_modules and dot-directories
|
|
36
|
+
if (name === 'node_modules' || name.startsWith('.'))
|
|
37
|
+
continue;
|
|
38
|
+
let stat;
|
|
39
|
+
try {
|
|
40
|
+
stat = await fs.stat(fullPath);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
continue; // Skip unstatable
|
|
44
|
+
}
|
|
45
|
+
if (stat.isDirectory()) {
|
|
46
|
+
await walk(fullPath);
|
|
47
|
+
}
|
|
48
|
+
else if (stat.isFile()) {
|
|
49
|
+
const relative = path.relative(root, fullPath);
|
|
50
|
+
const matched = globs.some(g => picomatch.isMatch(relative, g));
|
|
51
|
+
if (matched) {
|
|
52
|
+
results.push(fullPath);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
await walk(root);
|
|
58
|
+
return results;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Discover tables by replaying DDL from migration files under the project root.
|
|
62
|
+
*
|
|
63
|
+
* @param projectRoot The project directory to search.
|
|
64
|
+
* @param config Schema analyzer configuration (fileGateGlobs for migration files).
|
|
65
|
+
* @returns The set of table names discovered from migration DDL.
|
|
66
|
+
*/
|
|
67
|
+
export async function discoverTablesFromMigrations(projectRoot, config) {
|
|
68
|
+
const tables = new Set();
|
|
69
|
+
const gateGlobs = config.fileGateGlobs ?? ['**/*.sql', '**/migrations/**'];
|
|
70
|
+
const walkedFiles = await walkFiles(projectRoot, gateGlobs);
|
|
71
|
+
walkedFiles.sort();
|
|
72
|
+
for (const file of walkedFiles) {
|
|
73
|
+
try {
|
|
74
|
+
const source = await fs.readFile(file, 'utf8');
|
|
75
|
+
processMigrationSource(source, tables);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Skip unreadable files
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return tables;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Discover tables from a Cloudflare D1 `wrangler.toml` migration directory.
|
|
85
|
+
*
|
|
86
|
+
* @param projectRoot The project directory containing wrangler.toml.
|
|
87
|
+
* @returns The set of table names discovered from D1 migration files.
|
|
88
|
+
*/
|
|
89
|
+
/**
|
|
90
|
+
* Parse `migrations_dir` entries from a wrangler.toml `[[d1_databases]]` block.
|
|
91
|
+
*/
|
|
92
|
+
function extractWranglerMigrationDirs(wranglerContent) {
|
|
93
|
+
const migrationDirs = [];
|
|
94
|
+
let inD1Block = false;
|
|
95
|
+
for (const line of wranglerContent.split('\n')) {
|
|
96
|
+
const trimmed = line.trim();
|
|
97
|
+
if (/^\[\[d1_databases\]\]/i.test(trimmed)) {
|
|
98
|
+
inD1Block = true;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (inD1Block && trimmed.startsWith('[')) {
|
|
102
|
+
inD1Block = false;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (inD1Block) {
|
|
106
|
+
const m = trimmed.match(/^migrations_dir\s*=\s*['"](.+?)['"]/);
|
|
107
|
+
if (m) {
|
|
108
|
+
migrationDirs.push(m[1]);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return migrationDirs;
|
|
113
|
+
}
|
|
114
|
+
/** Replay DDL from every `.sql` file in a migration directory into `tables`. */
|
|
115
|
+
async function processMigrationDirectory(absDir, tables) {
|
|
116
|
+
let entries;
|
|
117
|
+
try {
|
|
118
|
+
const dirents = await fs.readdir(absDir, { withFileTypes: true });
|
|
119
|
+
entries = dirents
|
|
120
|
+
.filter(e => e.isFile() && e.name.endsWith('.sql'))
|
|
121
|
+
.map(e => e.name)
|
|
122
|
+
.sort();
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
const filePath = path.join(absDir, entry);
|
|
129
|
+
try {
|
|
130
|
+
const source = await fs.readFile(filePath, 'utf8');
|
|
131
|
+
processMigrationSource(source, tables);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Skip unreadable files
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Discover tables referenced by Cloudflare D1 migrations under `wrangler.toml`.
|
|
140
|
+
*
|
|
141
|
+
* Reads the `wrangler.toml` config, resolves its migration directories, and
|
|
142
|
+
* scans each migration file for `CREATE TABLE` DDL.
|
|
143
|
+
*
|
|
144
|
+
* @param projectRoot Root directory containing `wrangler.toml`.
|
|
145
|
+
* @returns Set of table names discovered from D1 migration files.
|
|
146
|
+
*/
|
|
147
|
+
export async function discoverTablesFromWrangler(projectRoot) {
|
|
148
|
+
const tables = new Set();
|
|
149
|
+
const wranglerPath = path.join(projectRoot, 'wrangler.toml');
|
|
150
|
+
let wranglerContent;
|
|
151
|
+
try {
|
|
152
|
+
wranglerContent = await fs.readFile(wranglerPath, 'utf8');
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return tables; // No wrangler.toml
|
|
156
|
+
}
|
|
157
|
+
for (const migDir of extractWranglerMigrationDirs(wranglerContent)) {
|
|
158
|
+
await processMigrationDirectory(path.resolve(projectRoot, migDir), tables);
|
|
159
|
+
}
|
|
160
|
+
return tables;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Discover tables by scanning explicit schema files for CREATE TABLE DDL.
|
|
164
|
+
*
|
|
165
|
+
* @param schemaFiles Relative paths of schema files to scan.
|
|
166
|
+
* @param projectRoot The project directory the paths resolve against.
|
|
167
|
+
* @returns The set of table names discovered from schema-file DDL.
|
|
168
|
+
*/
|
|
169
|
+
export async function discoverTablesFromSchemaFiles(schemaFiles, projectRoot) {
|
|
170
|
+
const tables = new Set();
|
|
171
|
+
for (const file of schemaFiles) {
|
|
172
|
+
const absPath = path.resolve(projectRoot, file);
|
|
173
|
+
try {
|
|
174
|
+
const source = await fs.readFile(absPath, 'utf8');
|
|
175
|
+
const createRe = /CREATE\s+(?:VIRTUAL\s+)?TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?(`[^`]+`|"[^"]+"|\w+)/gi;
|
|
176
|
+
let match;
|
|
177
|
+
while ((match = createRe.exec(source)) !== null) {
|
|
178
|
+
tables.add(stripIdentifier(match[1]));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Skip unreadable files
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return tables;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Discover tables from ORM schema artifacts (Drizzle builders, Prisma models).
|
|
189
|
+
*
|
|
190
|
+
* @param files Candidate file paths to scan for ORM schema definitions.
|
|
191
|
+
* @returns The set of table names discovered from ORM schemas.
|
|
192
|
+
*/
|
|
193
|
+
export async function discoverTablesFromOrmSchemas(files) {
|
|
194
|
+
const tables = new Set();
|
|
195
|
+
for (const file of files) {
|
|
196
|
+
const lowerFile = file.toLowerCase();
|
|
197
|
+
if (/\.(ts|tsx|js|jsx)$/i.test(file)) {
|
|
198
|
+
try {
|
|
199
|
+
const source = await fs.readFile(file, 'utf8');
|
|
200
|
+
if (/from\s+['"]drizzle-orm/.test(source)) {
|
|
201
|
+
const builderRegex = /(?:pgTable|mysqlTable|sqliteTable)\s*\(\s*['"]([^'"]+)['"]/g;
|
|
202
|
+
let match;
|
|
203
|
+
while ((match = builderRegex.exec(source)) !== null) {
|
|
204
|
+
tables.add(match[1]);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Skip unreadable files
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (file.endsWith('schema.prisma') || file.endsWith('\\schema.prisma')) {
|
|
213
|
+
try {
|
|
214
|
+
const source = await fs.readFile(file, 'utf8');
|
|
215
|
+
const modelRegex = /model\s+(\w+)\s*\{/g;
|
|
216
|
+
let match;
|
|
217
|
+
while ((match = modelRegex.exec(source)) !== null) {
|
|
218
|
+
tables.add(match[1]);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// Skip unreadable files
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return tables;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Pre-filter: only analyze files that show DB usage.
|
|
230
|
+
* Checks: .sql/migration glob, D1/SQL imports, env-binding patterns, DB calls.
|
|
231
|
+
*
|
|
232
|
+
* @param filePath The file under consideration.
|
|
233
|
+
* @param sourceCode The raw source text.
|
|
234
|
+
* @param config Schema analyzer configuration (globs, DB names, tag names).
|
|
235
|
+
* @param provenanceContext Provenance-based DB detection context (Spec 21).
|
|
236
|
+
* @returns True when the file shows DB usage and should be analyzed.
|
|
237
|
+
*/
|
|
238
|
+
/**
|
|
239
|
+
* Legacy name-based DB detection: D1/SQL imports, env bindings, and
|
|
240
|
+
* receiver.method call patterns. Used in 'names' mode or when no provenance
|
|
241
|
+
* context is supplied.
|
|
242
|
+
*/
|
|
243
|
+
function detectDbUsageByName(sourceCode, config) {
|
|
244
|
+
// Check for D1 or SQL API imports
|
|
245
|
+
const importPatterns = [
|
|
246
|
+
/import\s+.*\b(D1Database|D1PreparedStatement|D1Result)\b/,
|
|
247
|
+
/import\s+.*from\s+['"].*d1['"]/,
|
|
248
|
+
/import\s+.*from\s+['"].*pg['"]/,
|
|
249
|
+
/import\s+.*from\s+['"].*mysql['"]/,
|
|
250
|
+
/import\s+.*from\s+['"].*sqlite['"]/,
|
|
251
|
+
/import\s+.*from\s+['"].*knex['"]/,
|
|
252
|
+
/import\s+.*from\s+['"].*drizzle['"]/,
|
|
253
|
+
/import\s+.*from\s+['"].*prisma['"]/,
|
|
254
|
+
];
|
|
255
|
+
for (const pat of importPatterns) {
|
|
256
|
+
if (pat.test(sourceCode))
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
// Check for env-binding patterns (e.g., env.DB in Cloudflare Workers)
|
|
260
|
+
const bindingNames = config.dbBindingNames ?? [...DB_BINDING_NAMES];
|
|
261
|
+
for (const binding of bindingNames) {
|
|
262
|
+
if (sourceCode.includes(binding))
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
// Check for DB call patterns (receiver.method)
|
|
266
|
+
const receivers = config.dbReceiverNames ?? [...DB_RECEIVER_NAMES];
|
|
267
|
+
const methods = config.dbCallMethods ?? [...DB_CALL_METHOD_NAMES];
|
|
268
|
+
for (const receiver of receivers) {
|
|
269
|
+
for (const method of methods) {
|
|
270
|
+
const pattern = new RegExp(`\\b${escapeRegex(receiver)}\\.${escapeRegex(method)}\\s*\\(`);
|
|
271
|
+
if (pattern.test(sourceCode))
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Detect SQL tagged template literals — a syntax feature, not a naming
|
|
279
|
+
* convention (e.g. sql\`SELECT ...\`).
|
|
280
|
+
*/
|
|
281
|
+
function hasSqlTag(sourceCode, config) {
|
|
282
|
+
const sqlTags = config.sqlTagNames ?? [...SQL_TAG_NAMES];
|
|
283
|
+
for (const tag of sqlTags) {
|
|
284
|
+
const pattern = new RegExp(`\\b${escapeRegex(tag)}\`\\s*SELECT|\\b${escapeRegex(tag)}\`\\s*INSERT|\\b${escapeRegex(tag)}\`\\s*UPDATE|\\b${escapeRegex(tag)}\`\\s*DELETE|\\b${escapeRegex(tag)}\`\\s*CREATE`, 'i');
|
|
285
|
+
if (pattern.test(sourceCode))
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Decide whether a file should be scanned for DB usage (the file gate).
|
|
292
|
+
*
|
|
293
|
+
* SQL files and migration directories always pass. In provenance modes the
|
|
294
|
+
* gate defers to DB-provenanced identifiers; in name mode it falls back to
|
|
295
|
+
* name-based DB detection.
|
|
296
|
+
*
|
|
297
|
+
* @param filePath Path of the file being gated.
|
|
298
|
+
* @param sourceCode Contents of the file being gated.
|
|
299
|
+
* @param config Schema analyzer configuration (globs, tag names).
|
|
300
|
+
* @param provenanceContext Optional provenance metadata for DB detection.
|
|
301
|
+
* @returns True when the file should be scanned for schema references.
|
|
302
|
+
*/
|
|
303
|
+
export function passesFileGate(filePath, sourceCode, config, provenanceContext) {
|
|
304
|
+
// Always pass .sql files and migration directories
|
|
305
|
+
const gateGlobs = config.fileGateGlobs ?? ['**/*.sql', '**/migrations/**'];
|
|
306
|
+
if (gateGlobs.some(glob => picomatch.isMatch(filePath, glob))) {
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
// Spec 21: Provenance-first DB detection — if any identifier is DB-provenanced,
|
|
310
|
+
// this file passes the gate. This replaces the regex patterns for import/environment/
|
|
311
|
+
// receiver.method checks in hybrid and provenance modes.
|
|
312
|
+
if (provenanceContext && provenanceContext.mode !== 'names') {
|
|
313
|
+
if (provenanceContext.dbProvenanced.size > 0) {
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// Legacy name-based detection — used in 'names' mode or when no provenance context
|
|
318
|
+
if (!provenanceContext || provenanceContext.mode === 'names') {
|
|
319
|
+
if (detectDbUsageByName(sourceCode, config))
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
// Check for SQL tagged template literals (syntax feature, not naming convention)
|
|
323
|
+
return hasSqlTag(sourceCode, config);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Extract table references from registry-shaped table sources (callee + decorator).
|
|
327
|
+
* R2.1: Only tagged template SQL and DB-call patterns produce candidates.
|
|
328
|
+
*
|
|
329
|
+
* @param ast The parsed file AST.
|
|
330
|
+
* @param adapter The language adapter for the file's syntax.
|
|
331
|
+
* @param tableSources Registry entries (callee/decorator) to match.
|
|
332
|
+
* @param ctx Extraction context carrying the AST, adapter, source text, file
|
|
333
|
+
* path, and an optional module reader.
|
|
334
|
+
* @returns Extracted table names with ORM-registry provenance.
|
|
335
|
+
*/
|
|
336
|
+
export function extractTablesFromRegistry(tableSources, ctx) {
|
|
337
|
+
if (!ctx.ast || !tableSources || tableSources.length === 0)
|
|
338
|
+
return [];
|
|
339
|
+
const results = [];
|
|
340
|
+
const importMap = resolveImportMap(ctx.ast, ctx.adapter, ctx.sourceCode);
|
|
341
|
+
const resolved = { ...ctx, importMap };
|
|
342
|
+
for (const entry of tableSources) {
|
|
343
|
+
if (entry.kind === 'callee') {
|
|
344
|
+
extractCalleeTables(entry, resolved, results);
|
|
345
|
+
}
|
|
346
|
+
else if (entry.kind === 'decorator') {
|
|
347
|
+
extractDecoratorTables(entry, resolved, results);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return results;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Resolve import statements to a module → (importedName → localName) map.
|
|
354
|
+
*
|
|
355
|
+
* For non-aliased imports (`import { pgTable } from 'x'`) the imported and
|
|
356
|
+
* local names are identical. For aliased imports (`import { pgTable as table }`)
|
|
357
|
+
* the map records `pgTable → table`, so the callee-extraction logic can trace
|
|
358
|
+
* the call-site identifier back to the original export name.
|
|
359
|
+
*
|
|
360
|
+
* @param ast The parsed file AST.
|
|
361
|
+
* @param adapter The language adapter for the file's syntax.
|
|
362
|
+
* @param _sourceCode The raw source text (unused; kept for signature parity).
|
|
363
|
+
* @returns A module → (imported name → local name) map.
|
|
364
|
+
*/
|
|
365
|
+
export function resolveImportMap(ast, adapter, _sourceCode) {
|
|
366
|
+
const map = new Map();
|
|
367
|
+
try {
|
|
368
|
+
const imports = adapter.extractImports(ast);
|
|
369
|
+
for (const imp of imports) {
|
|
370
|
+
if (!map.has(imp.source)) {
|
|
371
|
+
map.set(imp.source, new Map());
|
|
372
|
+
}
|
|
373
|
+
const nameMap = map.get(imp.source);
|
|
374
|
+
for (const spec of imp.specifiers) {
|
|
375
|
+
const localName = spec.alias || spec.name;
|
|
376
|
+
if (spec.isDefault || spec.isNamespace) {
|
|
377
|
+
// `import knex from 'knex'` or `import * as knex from 'knex'`
|
|
378
|
+
// Key is the module specifier; value is the local binding.
|
|
379
|
+
nameMap.set(spec.name, localName);
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
// `import { pgTable as table } from 'x'`
|
|
383
|
+
// Key is the original export name; value is the local alias.
|
|
384
|
+
nameMap.set(spec.name, localName);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
// Gracefully handle adapters that don't support extractImports
|
|
391
|
+
}
|
|
392
|
+
return map;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Resolve the call-site root identifier to the original package export name
|
|
396
|
+
* when a `module` filter is set. Handles two shapes:
|
|
397
|
+
*
|
|
398
|
+
* 1. Direct import — `import { pgTable } from 'drizzle-orm/pg-core'`
|
|
399
|
+
* (the root identifier is bound directly to `entry.module`).
|
|
400
|
+
* 2. One-hop barrel re-export — `import { pgTable } from './db'` where
|
|
401
|
+
* `./db` does `export * from 'drizzle-orm/pg-core'` (or a named
|
|
402
|
+
* re-export). Only ONE hop is traced; a barrel that re-exports from
|
|
403
|
+
* another local module is treated as unresolved.
|
|
404
|
+
*
|
|
405
|
+
* @param moduleFilter The required originating module.
|
|
406
|
+
* @param rootId The call-site root identifier.
|
|
407
|
+
* @param ctx Extraction context (import map, file path, module reader).
|
|
408
|
+
* @returns The original export name, or null when unresolved.
|
|
409
|
+
*/
|
|
410
|
+
export function resolveImportedName(moduleFilter, rootId, ctx) {
|
|
411
|
+
const { importMap, filePath, readModule } = ctx;
|
|
412
|
+
if (!importMap)
|
|
413
|
+
return null;
|
|
414
|
+
// 1. Direct import from the required module.
|
|
415
|
+
const direct = importMap.get(moduleFilter);
|
|
416
|
+
if (direct) {
|
|
417
|
+
for (const [name, local] of direct) {
|
|
418
|
+
if (local === rootId)
|
|
419
|
+
return name;
|
|
420
|
+
}
|
|
421
|
+
// The module is imported, but rootId is not one of its bindings.
|
|
422
|
+
return null;
|
|
423
|
+
}
|
|
424
|
+
// 2. One-hop barrel re-export through a local module.
|
|
425
|
+
for (const [specifier, nameMap] of importMap) {
|
|
426
|
+
// Only relative/absolute module specifiers can be local barrels.
|
|
427
|
+
if (!specifier.startsWith('.') && !specifier.startsWith('/'))
|
|
428
|
+
continue;
|
|
429
|
+
// Which name does this local module bind to rootId?
|
|
430
|
+
let localImportedName = null;
|
|
431
|
+
for (const [name, local] of nameMap) {
|
|
432
|
+
if (local === rootId) {
|
|
433
|
+
localImportedName = name;
|
|
434
|
+
break;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
if (!localImportedName)
|
|
438
|
+
continue;
|
|
439
|
+
const barrelSource = readModule
|
|
440
|
+
? readModule(filePath, specifier)
|
|
441
|
+
: readModuleFromDisk(filePath, specifier);
|
|
442
|
+
if (!barrelSource)
|
|
443
|
+
continue;
|
|
444
|
+
for (const reExport of extractReExports(barrelSource)) {
|
|
445
|
+
if (reExport.source !== moduleFilter)
|
|
446
|
+
continue;
|
|
447
|
+
// `export * from 'x'` — every name maps to itself (no rename).
|
|
448
|
+
if (reExport.star)
|
|
449
|
+
return localImportedName;
|
|
450
|
+
// `export { a as b } from 'x'` — local export name → original name.
|
|
451
|
+
const original = reExport.renamed.get(localImportedName);
|
|
452
|
+
if (original)
|
|
453
|
+
return original;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Extract the string literal at a specific argument position from a
|
|
460
|
+
* call_expression node. Counts string/template arguments in order;
|
|
461
|
+
* skips non-string children (like `(` / `,` / `)` delimiters and
|
|
462
|
+
* non-string argument expressions).
|
|
463
|
+
*
|
|
464
|
+
* @param node The call_expression node.
|
|
465
|
+
* @param adapter The language adapter for the file's syntax.
|
|
466
|
+
* @param sourceCode The raw source text.
|
|
467
|
+
* @param argIndex The 0-based string-argument position to extract.
|
|
468
|
+
* @returns The unquoted string at that position, or null when absent.
|
|
469
|
+
*/
|
|
470
|
+
export function getArgStringLiteral(node, adapter, sourceCode, argIndex) {
|
|
471
|
+
if (!node.children)
|
|
472
|
+
return null;
|
|
473
|
+
for (const child of node.children) {
|
|
474
|
+
const type = adapter.getNodeType(child);
|
|
475
|
+
if (type === 'arguments' && child.children) {
|
|
476
|
+
let stringCount = 0;
|
|
477
|
+
for (const arg of child.children) {
|
|
478
|
+
const argType = adapter.getNodeType(arg);
|
|
479
|
+
if (argType === 'string' ||
|
|
480
|
+
argType === 'template_string' ||
|
|
481
|
+
argType === 'template_literal') {
|
|
482
|
+
if (stringCount === argIndex) {
|
|
483
|
+
const text = adapter.getNodeText(arg, sourceCode).trim();
|
|
484
|
+
if ((text.startsWith("'") && text.endsWith("'")) ||
|
|
485
|
+
(text.startsWith('"') && text.endsWith('"')) ||
|
|
486
|
+
(text.startsWith('`') && text.endsWith('`'))) {
|
|
487
|
+
return text.slice(1, -1);
|
|
488
|
+
}
|
|
489
|
+
return text;
|
|
490
|
+
}
|
|
491
|
+
stringCount++;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return null;
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Resolve the call-site callee to the name to match against `entry.name`.
|
|
500
|
+
*
|
|
501
|
+
* When no module filter is set, match the call-site callee literally. When a
|
|
502
|
+
* module filter IS set, resolve the root identifier through the import map to
|
|
503
|
+
* find the original imported name — this handles aliased imports
|
|
504
|
+
* (e.g. `import { pgTable as table }`), default imports used as method
|
|
505
|
+
* receivers (e.g. `knex.schema.createTable`), and one-hop barrel re-exports
|
|
506
|
+
* (e.g. `import { pgTable } from './db'`).
|
|
507
|
+
*
|
|
508
|
+
* @param entry The table-source entry being resolved.
|
|
509
|
+
* @param callee The raw callee text at the call site.
|
|
510
|
+
* @param ctx The registry extraction context (import map, etc.).
|
|
511
|
+
* @returns The name to match, or null when the callee cannot be resolved.
|
|
512
|
+
*/
|
|
513
|
+
export function resolveCalleeMatchName(entry, callee, ctx) {
|
|
514
|
+
const rootId = callee.split('.')[0];
|
|
515
|
+
if (!entry.module) {
|
|
516
|
+
return callee;
|
|
517
|
+
}
|
|
518
|
+
const importedName = resolveImportedName(entry.module, rootId, ctx);
|
|
519
|
+
if (!importedName)
|
|
520
|
+
return null;
|
|
521
|
+
// Reconstruct the callee with the imported name replacing the local.
|
|
522
|
+
// For simple calls: `table(...)` where rootId='table', importedName='pgTable'
|
|
523
|
+
// → 'pgTable'
|
|
524
|
+
// For member calls: `knex.schema.createTable(...)` where rootId='knex'
|
|
525
|
+
// → 'knex.schema.createTable' (unchanged, root=imported)
|
|
526
|
+
return importedName + callee.substring(rootId.length);
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Walk call_expression nodes for callee-shaped table-source entries.
|
|
530
|
+
*
|
|
531
|
+
* @param entry The callee-shaped registry entry to match.
|
|
532
|
+
* @param ctx Shared extraction context (AST, adapter, source, import map, reader).
|
|
533
|
+
* @param results Accumulator for extracted table references.
|
|
534
|
+
*/
|
|
535
|
+
export function extractCalleeTables(entry, ctx, results) {
|
|
536
|
+
const { ast, adapter, sourceCode } = ctx;
|
|
537
|
+
const nodes = adapter.findNodes(ast, {
|
|
538
|
+
custom: (n) => adapter.getNodeType(n) === 'call_expression',
|
|
539
|
+
});
|
|
540
|
+
for (const node of nodes) {
|
|
541
|
+
const callee = getCallee(node, adapter, sourceCode);
|
|
542
|
+
if (!callee)
|
|
543
|
+
continue;
|
|
544
|
+
const calleeNameToMatch = resolveCalleeMatchName(entry, callee, ctx);
|
|
545
|
+
if (!calleeNameToMatch)
|
|
546
|
+
continue;
|
|
547
|
+
const matches = calleeNameToMatch === entry.name ||
|
|
548
|
+
calleeNameToMatch.endsWith('.' + entry.name);
|
|
549
|
+
if (!matches)
|
|
550
|
+
continue;
|
|
551
|
+
const table = getArgStringLiteral(node, adapter, sourceCode, entry.arg);
|
|
552
|
+
if (!table)
|
|
553
|
+
continue;
|
|
554
|
+
results.push({
|
|
555
|
+
table,
|
|
556
|
+
source: {
|
|
557
|
+
table,
|
|
558
|
+
tier: 'orm-registry',
|
|
559
|
+
sourceFile: ctx.filePath,
|
|
560
|
+
description: entry.description || `ORM: ${entry.name}`,
|
|
561
|
+
},
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Walk decorator nodes for decorator-shaped table-source entries.
|
|
567
|
+
* Handles both argument-bearing decorators (@Entity('table')) and
|
|
568
|
+
* bare decorators (skipped — no table name to extract).
|
|
569
|
+
*
|
|
570
|
+
* @param entry The decorator-shaped registry entry to match.
|
|
571
|
+
* @param ctx Shared extraction context (AST, adapter, source, import map, reader).
|
|
572
|
+
* @param results Accumulator for extracted table references.
|
|
573
|
+
*/
|
|
574
|
+
export function extractDecoratorTables(entry, ctx, results) {
|
|
575
|
+
const { ast, adapter, sourceCode } = ctx;
|
|
576
|
+
const nodes = adapter.findNodes(ast, {
|
|
577
|
+
custom: (n) => adapter.getNodeType(n) === 'decorator',
|
|
578
|
+
});
|
|
579
|
+
for (const node of nodes) {
|
|
580
|
+
if (!node.children)
|
|
581
|
+
continue;
|
|
582
|
+
// Find the call_expression child (decorator with args, e.g. @Entity('tbl'))
|
|
583
|
+
let callExpr = null;
|
|
584
|
+
for (const child of node.children) {
|
|
585
|
+
if (adapter.getNodeType(child) === 'call_expression') {
|
|
586
|
+
callExpr = child;
|
|
587
|
+
break;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
if (!callExpr)
|
|
591
|
+
continue; // bare decorator — no args to extract
|
|
592
|
+
const callee = getCallee(callExpr, adapter, sourceCode);
|
|
593
|
+
if (!callee)
|
|
594
|
+
continue;
|
|
595
|
+
const calleeNameToMatch = resolveCalleeMatchName(entry, callee, ctx);
|
|
596
|
+
if (!calleeNameToMatch)
|
|
597
|
+
continue;
|
|
598
|
+
const matches = calleeNameToMatch === entry.name ||
|
|
599
|
+
calleeNameToMatch.endsWith('.' + entry.name);
|
|
600
|
+
if (!matches)
|
|
601
|
+
continue;
|
|
602
|
+
const table = getArgStringLiteral(callExpr, adapter, sourceCode, entry.arg);
|
|
603
|
+
if (!table)
|
|
604
|
+
continue;
|
|
605
|
+
results.push({
|
|
606
|
+
table,
|
|
607
|
+
source: {
|
|
608
|
+
table,
|
|
609
|
+
tier: 'orm-registry',
|
|
610
|
+
sourceFile: ctx.filePath,
|
|
611
|
+
description: entry.description || `Decorator: ${entry.name}`,
|
|
612
|
+
},
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../../src/analyzers/universal/schema/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
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 type { AnalyzerResult } from '../../../types.js';
|
|
11
|
+
import type { SchemaAnalyzerConfig } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Analyze JSON schemas and validate data files against them.
|
|
14
|
+
*
|
|
15
|
+
* Pipeline-refactored: accepts a list of JSON file paths plus an on-demand
|
|
16
|
+
* parser so parsed objects are transient (one file at a time) rather than
|
|
17
|
+
* retained in memory for the whole Stage 3 reducer run.
|
|
18
|
+
*
|
|
19
|
+
* @param files JSON file paths to validate
|
|
20
|
+
* @param readJson on-demand parser: returns the parsed object, or null when
|
|
21
|
+
* the file failed to parse (invalid JSON) or was absent.
|
|
22
|
+
* @param config Schema analyzer configuration
|
|
23
|
+
* @param analyzerName name reported in the returned AnalyzerResult
|
|
24
|
+
* @returns the aggregate JSON-schema validation result
|
|
25
|
+
*/
|
|
26
|
+
export declare function analyzeJsonSchemas(files: string[], readJson: (filePath: string) => object | null, config: SchemaAnalyzerConfig, analyzerName?: string): AnalyzerResult;
|
|
27
|
+
//# sourceMappingURL=jsonSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonSchema.d.ts","sourceRoot":"","sources":["../../../../src/analyzers/universal/schema/jsonSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,mBAAmB,CAAC;AACpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAmBvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EAC7C,MAAM,EAAE,oBAAoB,EAC5B,YAAY,SAAW,GACtB,cAAc,CAyBhB"}
|