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.
Files changed (255) hide show
  1. package/CHANGELOG.md +74 -1
  2. package/dist/analyzers/__verify_self_probe.d.ts +2 -0
  3. package/dist/analyzers/__verify_self_probe.d.ts.map +1 -0
  4. package/dist/analyzers/__verify_self_probe.js +5 -0
  5. package/dist/analyzers/__verify_self_probe.js.map +1 -0
  6. package/dist/analyzers/analyzerUtils.d.ts +34 -1
  7. package/dist/analyzers/analyzerUtils.d.ts.map +1 -1
  8. package/dist/analyzers/analyzerUtils.js +61 -22
  9. package/dist/analyzers/analyzerUtils.js.map +1 -1
  10. package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts +18 -23
  11. package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
  12. package/dist/analyzers/cross-language/APIContractAnalyzer.js +198 -186
  13. package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
  14. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts +78 -55
  15. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
  16. package/dist/analyzers/cross-language/DependencyGraphBuilder.js +244 -243
  17. package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
  18. package/dist/analyzers/cross-language/SchemaValidator.d.ts +27 -37
  19. package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
  20. package/dist/analyzers/cross-language/SchemaValidator.js +314 -275
  21. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  22. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +17 -46
  23. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -1
  24. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +620 -523
  25. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
  26. package/dist/analyzers/documentationAnalyzer.d.ts +7 -2
  27. package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
  28. package/dist/analyzers/documentationAnalyzer.js +259 -198
  29. package/dist/analyzers/documentationAnalyzer.js.map +1 -1
  30. package/dist/analyzers/invariantsAnalyzer.d.ts.map +1 -1
  31. package/dist/analyzers/invariantsAnalyzer.js +57 -50
  32. package/dist/analyzers/invariantsAnalyzer.js.map +1 -1
  33. package/dist/analyzers/orm/adapterRegistry.d.ts +10 -0
  34. package/dist/analyzers/orm/adapterRegistry.d.ts.map +1 -1
  35. package/dist/analyzers/orm/adapterRegistry.js +10 -0
  36. package/dist/analyzers/orm/adapterRegistry.js.map +1 -1
  37. package/dist/analyzers/orm/drizzleAdapter.d.ts +22 -0
  38. package/dist/analyzers/orm/drizzleAdapter.d.ts.map +1 -1
  39. package/dist/analyzers/orm/drizzleAdapter.js +42 -44
  40. package/dist/analyzers/orm/drizzleAdapter.js.map +1 -1
  41. package/dist/analyzers/orm/prismaAdapter.d.ts +30 -0
  42. package/dist/analyzers/orm/prismaAdapter.d.ts.map +1 -1
  43. package/dist/analyzers/orm/prismaAdapter.js +30 -0
  44. package/dist/analyzers/orm/prismaAdapter.js.map +1 -1
  45. package/dist/analyzers/provenance.d.ts +62 -2
  46. package/dist/analyzers/provenance.d.ts.map +1 -1
  47. package/dist/analyzers/provenance.js +443 -349
  48. package/dist/analyzers/provenance.js.map +1 -1
  49. package/dist/analyzers/reactAnalyzer.d.ts +11 -0
  50. package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
  51. package/dist/analyzers/reactAnalyzer.js +188 -125
  52. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  53. package/dist/analyzers/ruleRegistry.d.ts +110 -1
  54. package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
  55. package/dist/analyzers/ruleRegistry.js +1714 -124
  56. package/dist/analyzers/ruleRegistry.js.map +1 -1
  57. package/dist/analyzers/ruleTiming.d.ts +54 -0
  58. package/dist/analyzers/ruleTiming.d.ts.map +1 -0
  59. package/dist/analyzers/ruleTiming.js +71 -0
  60. package/dist/analyzers/ruleTiming.js.map +1 -0
  61. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +13 -0
  62. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -1
  63. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +362 -283
  64. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -1
  65. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +26 -68
  66. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  67. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +430 -391
  68. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  69. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +17 -202
  70. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  71. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +1073 -1121
  72. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  73. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +3 -49
  74. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  75. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +414 -340
  76. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  77. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +48 -5
  78. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  79. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +262 -134
  80. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  81. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +23 -214
  82. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  83. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +139 -1521
  84. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  85. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +78 -79
  86. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
  87. package/dist/analyzers/universal/UniversalStylesAnalyzer.js +613 -480
  88. package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
  89. package/dist/analyzers/universal/schema/codeAnalysis.d.ts +307 -0
  90. package/dist/analyzers/universal/schema/codeAnalysis.d.ts.map +1 -0
  91. package/dist/analyzers/universal/schema/codeAnalysis.js +965 -0
  92. package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -0
  93. package/dist/analyzers/universal/schema/config.d.ts +31 -0
  94. package/dist/analyzers/universal/schema/config.d.ts.map +1 -0
  95. package/dist/analyzers/universal/schema/config.js +57 -0
  96. package/dist/analyzers/universal/schema/config.js.map +1 -0
  97. package/dist/analyzers/universal/schema/discovery.d.ts +167 -0
  98. package/dist/analyzers/universal/schema/discovery.d.ts.map +1 -0
  99. package/dist/analyzers/universal/schema/discovery.js +616 -0
  100. package/dist/analyzers/universal/schema/discovery.js.map +1 -0
  101. package/dist/analyzers/universal/schema/jsonSchema.d.ts +27 -0
  102. package/dist/analyzers/universal/schema/jsonSchema.d.ts.map +1 -0
  103. package/dist/analyzers/universal/schema/jsonSchema.js +368 -0
  104. package/dist/analyzers/universal/schema/jsonSchema.js.map +1 -0
  105. package/dist/analyzers/universal/schema/migrations.d.ts +90 -0
  106. package/dist/analyzers/universal/schema/migrations.d.ts.map +1 -0
  107. package/dist/analyzers/universal/schema/migrations.js +238 -0
  108. package/dist/analyzers/universal/schema/migrations.js.map +1 -0
  109. package/dist/analyzers/universal/schema/types.d.ts +131 -0
  110. package/dist/analyzers/universal/schema/types.d.ts.map +1 -0
  111. package/dist/analyzers/universal/schema/types.js +10 -0
  112. package/dist/analyzers/universal/schema/types.js.map +1 -0
  113. package/dist/analyzers/universal/schema/violations.d.ts +44 -0
  114. package/dist/analyzers/universal/schema/violations.d.ts.map +1 -0
  115. package/dist/analyzers/universal/schema/violations.js +54 -0
  116. package/dist/analyzers/universal/schema/violations.js.map +1 -0
  117. package/dist/auditRunner.d.ts.map +1 -1
  118. package/dist/auditRunner.js +89 -13
  119. package/dist/auditRunner.js.map +1 -1
  120. package/dist/cli.js +315 -40
  121. package/dist/cli.js.map +1 -1
  122. package/dist/config/configLoader.d.ts.map +1 -1
  123. package/dist/config/configLoader.js +9 -7
  124. package/dist/config/configLoader.js.map +1 -1
  125. package/dist/config/defaults.d.ts +12 -3
  126. package/dist/config/defaults.d.ts.map +1 -1
  127. package/dist/config/defaults.js +16 -6
  128. package/dist/config/defaults.js.map +1 -1
  129. package/dist/config/effectiveConfig.d.ts +75 -0
  130. package/dist/config/effectiveConfig.d.ts.map +1 -0
  131. package/dist/config/effectiveConfig.js +213 -0
  132. package/dist/config/effectiveConfig.js.map +1 -0
  133. package/dist/config/pathProfiles.d.ts +7 -4
  134. package/dist/config/pathProfiles.d.ts.map +1 -1
  135. package/dist/config/pathProfiles.js +8 -10
  136. package/dist/config/pathProfiles.js.map +1 -1
  137. package/dist/config/thresholdRationales.d.ts +45 -0
  138. package/dist/config/thresholdRationales.d.ts.map +1 -0
  139. package/dist/config/thresholdRationales.js +67 -0
  140. package/dist/config/thresholdRationales.js.map +1 -0
  141. package/dist/conventions/conventionMiner.d.ts.map +1 -1
  142. package/dist/conventions/conventionMiner.js +6 -2
  143. package/dist/conventions/conventionMiner.js.map +1 -1
  144. package/dist/enforcement/diffGate.d.ts +55 -0
  145. package/dist/enforcement/diffGate.d.ts.map +1 -0
  146. package/dist/enforcement/diffGate.js +136 -0
  147. package/dist/enforcement/diffGate.js.map +1 -0
  148. package/dist/enforcement/gate.d.ts +36 -0
  149. package/dist/enforcement/gate.d.ts.map +1 -0
  150. package/dist/enforcement/gate.js +72 -0
  151. package/dist/enforcement/gate.js.map +1 -0
  152. package/dist/enforcement/suppressions.d.ts +41 -0
  153. package/dist/enforcement/suppressions.d.ts.map +1 -0
  154. package/dist/enforcement/suppressions.js +170 -0
  155. package/dist/enforcement/suppressions.js.map +1 -0
  156. package/dist/fingerprint.d.ts.map +1 -1
  157. package/dist/fingerprint.js +4 -1
  158. package/dist/fingerprint.js.map +1 -1
  159. package/dist/invariants/ruleEngine.d.ts +3 -4
  160. package/dist/invariants/ruleEngine.d.ts.map +1 -1
  161. package/dist/invariants/ruleEngine.js +2 -2
  162. package/dist/invariants/ruleEngine.js.map +1 -1
  163. package/dist/languages/LanguageOrchestrator.d.ts +14 -0
  164. package/dist/languages/LanguageOrchestrator.d.ts.map +1 -1
  165. package/dist/languages/LanguageOrchestrator.js +93 -55
  166. package/dist/languages/LanguageOrchestrator.js.map +1 -1
  167. package/dist/languages/LanguageRegistry.d.ts +8 -0
  168. package/dist/languages/LanguageRegistry.d.ts.map +1 -1
  169. package/dist/languages/LanguageRegistry.js +8 -0
  170. package/dist/languages/LanguageRegistry.js.map +1 -1
  171. package/dist/languages/RuntimeManager.d.ts +82 -60
  172. package/dist/languages/RuntimeManager.d.ts.map +1 -1
  173. package/dist/languages/RuntimeManager.js +404 -349
  174. package/dist/languages/RuntimeManager.js.map +1 -1
  175. package/dist/languages/UniversalAnalyzer.d.ts +51 -6
  176. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
  177. package/dist/languages/UniversalAnalyzer.js +127 -88
  178. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  179. package/dist/languages/adapterBridge.d.ts +36 -0
  180. package/dist/languages/adapterBridge.d.ts.map +1 -1
  181. package/dist/languages/adapterBridge.js +89 -35
  182. package/dist/languages/adapterBridge.js.map +1 -1
  183. package/dist/languages/go/GoAdapter.d.ts +66 -23
  184. package/dist/languages/go/GoAdapter.d.ts.map +1 -1
  185. package/dist/languages/go/GoAdapter.js +553 -474
  186. package/dist/languages/go/GoAdapter.js.map +1 -1
  187. package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts +33 -4
  188. package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts.map +1 -1
  189. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +101 -66
  190. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -1
  191. package/dist/languages/tree-sitter/converter.d.ts +18 -0
  192. package/dist/languages/tree-sitter/converter.d.ts.map +1 -1
  193. package/dist/languages/tree-sitter/converter.js +18 -0
  194. package/dist/languages/tree-sitter/converter.js.map +1 -1
  195. package/dist/languages/tree-sitter/parser.d.ts +39 -2
  196. package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
  197. package/dist/languages/tree-sitter/parser.js +93 -12
  198. package/dist/languages/tree-sitter/parser.js.map +1 -1
  199. package/dist/languages/types.d.ts +67 -2
  200. package/dist/languages/types.d.ts.map +1 -1
  201. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +253 -72
  202. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
  203. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +1419 -923
  204. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
  205. package/dist/mcp-tools-shared.d.ts.map +1 -1
  206. package/dist/mcp-tools-shared.js.map +1 -1
  207. package/dist/pipeline.d.ts +13 -5
  208. package/dist/pipeline.d.ts.map +1 -1
  209. package/dist/pipeline.js +381 -200
  210. package/dist/pipeline.js.map +1 -1
  211. package/dist/pipelineAdapters.d.ts +3 -8
  212. package/dist/pipelineAdapters.d.ts.map +1 -1
  213. package/dist/pipelineAdapters.js +149 -94
  214. package/dist/pipelineAdapters.js.map +1 -1
  215. package/dist/presets/presets.d.ts +54 -0
  216. package/dist/presets/presets.d.ts.map +1 -0
  217. package/dist/presets/presets.js +181 -0
  218. package/dist/presets/presets.js.map +1 -0
  219. package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
  220. package/dist/reporting/sarifReportGenerator.js +6 -3
  221. package/dist/reporting/sarifReportGenerator.js.map +1 -1
  222. package/dist/ruleAliases.d.ts +67 -0
  223. package/dist/ruleAliases.d.ts.map +1 -0
  224. package/dist/ruleAliases.js +102 -0
  225. package/dist/ruleAliases.js.map +1 -0
  226. package/dist/styles/cssAstExtractor.d.ts.map +1 -1
  227. package/dist/styles/cssAstExtractor.js +78 -18
  228. package/dist/styles/cssAstExtractor.js.map +1 -1
  229. package/dist/styles/styleIndexer.d.ts +6 -0
  230. package/dist/styles/styleIndexer.d.ts.map +1 -1
  231. package/dist/styles/styleIndexer.js +26 -4
  232. package/dist/styles/styleIndexer.js.map +1 -1
  233. package/dist/styles/tailwindConfigLoader.d.ts +8 -6
  234. package/dist/styles/tailwindConfigLoader.d.ts.map +1 -1
  235. package/dist/styles/tailwindConfigLoader.js +61 -15
  236. package/dist/styles/tailwindConfigLoader.js.map +1 -1
  237. package/dist/styles/tailwindProbe.d.ts +31 -0
  238. package/dist/styles/tailwindProbe.d.ts.map +1 -1
  239. package/dist/styles/tailwindProbe.js +145 -4
  240. package/dist/styles/tailwindProbe.js.map +1 -1
  241. package/dist/styles/tailwindUtilityExpander.d.ts.map +1 -1
  242. package/dist/styles/tailwindUtilityExpander.js +13 -1
  243. package/dist/styles/tailwindUtilityExpander.js.map +1 -1
  244. package/dist/types.d.ts +181 -1
  245. package/dist/types.d.ts.map +1 -1
  246. package/dist/types.js +8 -0
  247. package/dist/types.js.map +1 -1
  248. package/dist/utils/fileDiscovery.d.ts +9 -0
  249. package/dist/utils/fileDiscovery.d.ts.map +1 -1
  250. package/dist/utils/fileDiscovery.js +21 -0
  251. package/dist/utils/fileDiscovery.js.map +1 -1
  252. package/package.json +5 -3
  253. package/plugin/hooks/hooks.json +1 -1
  254. package/plugin/scripts/hook-audit.sh +25 -7
  255. 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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,SAAS,MAAM,WAAW,CAAC;AASlC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,KAAe;IAC3D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,IAAI,KAAe,CAAC;QACpB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,8BAA8B;QACxC,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,wCAAwC;YACxC,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAE9D,IAAI,IAAI,CAAC;YACT,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,CAAC,kBAAkB;YAC9B,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChE,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,WAAmB,EACnB,MAA4B;IAE5B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5D,WAAW,CAAC,IAAI,EAAE,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/C,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH;;GAEG;AACH,SAAS,4BAA4B,CAAC,eAAuB;IAC3D,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,SAAS,GAAG,IAAI,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,SAAS,GAAG,KAAK,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YAC/D,IAAI,CAAC,EAAE,CAAC;gBACN,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,gFAAgF;AAChF,KAAK,UAAU,yBAAyB,CAAC,MAAc,EAAE,MAAmB;IAC1E,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,OAAO,GAAG,OAAO;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aAClD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAChB,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACnD,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAI,eAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,mBAAmB;IACpC,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,4BAA4B,CAAC,eAAe,CAAC,EAAE,CAAC;QACnE,MAAM,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,WAAqB,EACrB,WAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,kFAAkF,CAAC;YACpG,IAAI,KAA6B,CAAC;YAClC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAChD,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAAe;IAEf,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC/C,IAAI,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1C,MAAM,YAAY,GAAG,6DAA6D,CAAC;oBACnF,IAAI,KAA6B,CAAC;oBAClC,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBACpD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC/C,MAAM,UAAU,GAAG,qBAAqB,CAAC;gBACzC,IAAI,KAA6B,CAAC;gBAClC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBAClD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,UAAkB,EAAE,MAA4B;IAC3E,kCAAkC;IAClC,MAAM,cAAc,GAAG;QACrB,0DAA0D;QAC1D,gCAAgC;QAChC,gCAAgC;QAChC,mCAAmC;QACnC,oCAAoC;QACpC,kCAAkC;QAClC,qCAAqC;QACrC,oCAAoC;KACrC,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;IACxC,CAAC;IAED,sEAAsE;IACtE,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACpE,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;IAChD,CAAC;IAED,+CAA+C;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,IAAI,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAClE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC1F,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,UAAkB,EAAE,MAA4B;IACjE,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IACzD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAClN,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,UAAkB,EAClB,MAA4B,EAC5B,iBAAqC;IAErC,mDAAmD;IACnD,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC3E,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gFAAgF;IAChF,sFAAsF;IACtF,yDAAyD;IACzD,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5D,IAAI,iBAAiB,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,mFAAmF;IACnF,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7D,IAAI,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IAC3D,CAAC;IAED,iFAAiF;IACjF,OAAO,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CACvC,YAAgC,EAChC,GAA8B;IAE9B,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtE,MAAM,OAAO,GAAsD,EAAE,CAAC;IACtE,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,QAAQ,GAA8B,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,CAAC;IAElE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACtC,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAQ,EACR,OAAwB,EACxB,WAAmB;IAEnB,MAAM,GAAG,GAAG,IAAI,GAAG,EAA+B,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,OAAO,GAAiB,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACjC,CAAC;YACD,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;gBAC1C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACvC,8DAA8D;oBAC9D,2DAA2D;oBAC3D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,yCAAyC;oBACzC,6DAA6D;oBAC7D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CACjC,YAAoB,EACpB,MAAc,EACd,GAA8B;IAE9B,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;IAChD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,6CAA6C;IAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACnC,IAAI,KAAK,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;QACpC,CAAC;QACD,iEAAiE;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sDAAsD;IACtD,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC;QAC7C,iEAAiE;QACjE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAEvE,oDAAoD;QACpD,IAAI,iBAAiB,GAAkB,IAAI,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACpC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,iBAAiB,GAAG,IAAI,CAAC;gBACzB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,iBAAiB;YAAE,SAAS;QAEjC,MAAM,YAAY,GAAG,UAAU;YAC7B,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;YACjC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,KAAK,MAAM,QAAQ,IAAI,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC;YACtD,IAAI,QAAQ,CAAC,MAAM,KAAK,YAAY;gBAAE,SAAS;YAC/C,+DAA+D;YAC/D,IAAI,QAAQ,CAAC,IAAI;gBAAE,OAAO,iBAAiB,CAAC;YAC5C,oEAAoE;YACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YACzD,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAa,EACb,OAAwB,EACxB,UAAkB,EAClB,QAAgB;IAEhB,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3C,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACzC,IACE,OAAO,KAAK,QAAQ;oBACpB,OAAO,KAAK,iBAAiB;oBAC7B,OAAO,KAAK,kBAAkB,EAC9B,CAAC;oBACD,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;wBAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;wBACzD,IACE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;4BAC5C,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;4BAC5C,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC5C,CAAC;4BACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBAC3B,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,WAAW,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAuB,EACvB,MAAc,EACd,GAA8B;IAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACpE,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAE/B,qEAAqE;IACrE,8EAA8E;IAC9E,gBAAgB;IAChB,uEAAuE;IACvE,2DAA2D;IAC3D,OAAO,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAuB,EACvB,GAA8B,EAC9B,OAA0D;IAE1D,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;QACnC,MAAM,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,iBAAiB;KACrE,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,iBAAiB;YAAE,SAAS;QAEjC,MAAM,OAAO,GAAG,iBAAiB,KAAK,KAAK,CAAC,IAAI;YAChC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,OAAO,CAAC,IAAI,CAAC;YACX,KAAK;YACL,MAAM,EAAE;gBACN,KAAK;gBACL,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,GAAG,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,KAAK,CAAC,IAAI,EAAE;aACvD;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAuB,EACvB,GAA8B,EAC9B,OAA0D;IAE1D,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;QACnC,MAAM,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW;KAC/D,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAE7B,4EAA4E;QAC5E,IAAI,QAAQ,GAAmB,IAAI,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,iBAAiB,EAAE,CAAC;gBACrD,QAAQ,GAAG,KAAK,CAAC;gBACjB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ;YAAE,SAAS,CAAC,sCAAsC;QAE/D,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,iBAAiB;YAAE,SAAS;QAEjC,MAAM,OAAO,GAAG,iBAAiB,KAAK,KAAK,CAAC,IAAI;YAChC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,OAAO,CAAC,IAAI,CAAC;YACX,KAAK;YACL,MAAM,EAAE;gBACN,KAAK;gBACL,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,GAAG,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,cAAc,KAAK,CAAC,IAAI,EAAE;aAC7D;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -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"}