@rawsql-ts/ztd-cli 0.20.0 → 0.20.2

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 (179) hide show
  1. package/LICENSE +21 -0
  2. package/dist/commands/agents.d.ts +2 -0
  3. package/dist/commands/agents.js +68 -0
  4. package/dist/commands/agents.js.map +1 -0
  5. package/dist/commands/checkContract.d.ts +46 -0
  6. package/dist/commands/checkContract.js +359 -0
  7. package/dist/commands/checkContract.js.map +1 -0
  8. package/dist/commands/connectionOptions.d.ts +12 -0
  9. package/dist/commands/connectionOptions.js +22 -0
  10. package/dist/commands/connectionOptions.js.map +1 -0
  11. package/dist/commands/ddl.d.ts +7 -0
  12. package/dist/commands/ddl.js +145 -0
  13. package/dist/commands/ddl.js.map +1 -0
  14. package/dist/commands/describe.d.ts +23 -0
  15. package/dist/commands/describe.js +399 -0
  16. package/dist/commands/describe.js.map +1 -0
  17. package/dist/commands/diff.d.ts +24 -0
  18. package/dist/commands/diff.js +73 -0
  19. package/dist/commands/diff.js.map +1 -0
  20. package/dist/commands/genEntities.d.ts +14 -0
  21. package/dist/commands/genEntities.js +58 -0
  22. package/dist/commands/genEntities.js.map +1 -0
  23. package/dist/commands/init.d.ts +104 -0
  24. package/dist/commands/init.js +1480 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/lint.d.ts +89 -0
  27. package/dist/commands/lint.js +501 -0
  28. package/dist/commands/lint.js.map +1 -0
  29. package/dist/commands/modelGen.d.ts +60 -0
  30. package/dist/commands/modelGen.js +572 -0
  31. package/dist/commands/modelGen.js.map +1 -0
  32. package/dist/commands/options.d.ts +9 -0
  33. package/dist/commands/options.js +48 -0
  34. package/dist/commands/options.js.map +1 -0
  35. package/dist/commands/perf.d.ts +9 -0
  36. package/dist/commands/perf.js +374 -0
  37. package/dist/commands/perf.js.map +1 -0
  38. package/dist/commands/pull.d.ts +21 -0
  39. package/dist/commands/pull.js +115 -0
  40. package/dist/commands/pull.js.map +1 -0
  41. package/dist/commands/query.d.ts +9 -0
  42. package/dist/commands/query.js +377 -0
  43. package/dist/commands/query.js.map +1 -0
  44. package/dist/commands/testEvidence.d.ts +237 -0
  45. package/dist/commands/testEvidence.js +1220 -0
  46. package/dist/commands/testEvidence.js.map +1 -0
  47. package/dist/commands/ztdConfig.d.ts +30 -0
  48. package/dist/commands/ztdConfig.js +224 -0
  49. package/dist/commands/ztdConfig.js.map +1 -0
  50. package/dist/commands/ztdConfigCommand.d.ts +18 -0
  51. package/dist/commands/ztdConfigCommand.js +268 -0
  52. package/dist/commands/ztdConfigCommand.js.map +1 -0
  53. package/dist/index.d.ts +4 -0
  54. package/dist/index.js +127 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/perf/benchmark.d.ts +277 -0
  57. package/dist/perf/benchmark.js +2186 -0
  58. package/dist/perf/benchmark.js.map +1 -0
  59. package/dist/perf/sandbox.d.ts +73 -0
  60. package/dist/perf/sandbox.js +492 -0
  61. package/dist/perf/sandbox.js.map +1 -0
  62. package/dist/query/analysis.d.ts +20 -0
  63. package/dist/query/analysis.js +192 -0
  64. package/dist/query/analysis.js.map +1 -0
  65. package/dist/query/analyzeColumnUsage.d.ts +10 -0
  66. package/dist/query/analyzeColumnUsage.js +451 -0
  67. package/dist/query/analyzeColumnUsage.js.map +1 -0
  68. package/dist/query/analyzeTableUsage.d.ts +10 -0
  69. package/dist/query/analyzeTableUsage.js +318 -0
  70. package/dist/query/analyzeTableUsage.js.map +1 -0
  71. package/dist/query/execute.d.ts +40 -0
  72. package/dist/query/execute.js +784 -0
  73. package/dist/query/execute.js.map +1 -0
  74. package/dist/query/format.d.ts +1 -0
  75. package/dist/query/format.js +9 -0
  76. package/dist/query/format.js.map +1 -0
  77. package/dist/query/lint.d.ts +29 -0
  78. package/dist/query/lint.js +340 -0
  79. package/dist/query/lint.js.map +1 -0
  80. package/dist/query/location.d.ts +18 -0
  81. package/dist/query/location.js +204 -0
  82. package/dist/query/location.js.map +1 -0
  83. package/dist/query/patch.d.ts +21 -0
  84. package/dist/query/patch.js +151 -0
  85. package/dist/query/patch.js.map +1 -0
  86. package/dist/query/planner.d.ts +31 -0
  87. package/dist/query/planner.js +134 -0
  88. package/dist/query/planner.js.map +1 -0
  89. package/dist/query/report.d.ts +7 -0
  90. package/dist/query/report.js +19 -0
  91. package/dist/query/report.js.map +1 -0
  92. package/dist/query/scalarFilterAnalysis.d.ts +6 -0
  93. package/dist/query/scalarFilterAnalysis.js +212 -0
  94. package/dist/query/scalarFilterAnalysis.js.map +1 -0
  95. package/dist/query/slice.d.ts +17 -0
  96. package/dist/query/slice.js +204 -0
  97. package/dist/query/slice.js.map +1 -0
  98. package/dist/query/structure.d.ts +24 -0
  99. package/dist/query/structure.js +135 -0
  100. package/dist/query/structure.js.map +1 -0
  101. package/dist/query/targets.d.ts +2 -0
  102. package/dist/query/targets.js +6 -0
  103. package/dist/query/targets.js.map +1 -0
  104. package/dist/query/types.d.ts +97 -0
  105. package/dist/query/types.js +3 -0
  106. package/dist/query/types.js.map +1 -0
  107. package/dist/specs/sql/activeOrders.catalog.d.ts +12 -0
  108. package/dist/specs/sql/activeOrders.catalog.js +36 -0
  109. package/dist/specs/sql/activeOrders.catalog.js.map +1 -0
  110. package/dist/specs/sql/usersList.catalog.d.ts +8 -0
  111. package/dist/specs/sql/usersList.catalog.js +14 -0
  112. package/dist/specs/sql/usersList.catalog.js.map +1 -0
  113. package/dist/specs/sqlCatalogDefinition.d.ts +20 -0
  114. package/dist/specs/sqlCatalogDefinition.js +10 -0
  115. package/dist/specs/sqlCatalogDefinition.js.map +1 -0
  116. package/dist/utils/agentCli.d.ts +23 -0
  117. package/dist/utils/agentCli.js +84 -0
  118. package/dist/utils/agentCli.js.map +1 -0
  119. package/dist/utils/agentSafety.d.ts +4 -0
  120. package/dist/utils/agentSafety.js +50 -0
  121. package/dist/utils/agentSafety.js.map +1 -0
  122. package/dist/utils/agents.d.ts +31 -0
  123. package/dist/utils/agents.js +362 -0
  124. package/dist/utils/agents.js.map +1 -0
  125. package/dist/utils/collectSqlFiles.d.ts +9 -0
  126. package/dist/utils/collectSqlFiles.js +58 -0
  127. package/dist/utils/collectSqlFiles.js.map +1 -0
  128. package/dist/utils/connectionSummary.d.ts +3 -0
  129. package/dist/utils/connectionSummary.js +29 -0
  130. package/dist/utils/connectionSummary.js.map +1 -0
  131. package/dist/utils/dbConnection.d.ts +31 -0
  132. package/dist/utils/dbConnection.js +151 -0
  133. package/dist/utils/dbConnection.js.map +1 -0
  134. package/dist/utils/fs.d.ts +1 -0
  135. package/dist/utils/fs.js +12 -0
  136. package/dist/utils/fs.js.map +1 -0
  137. package/dist/utils/modelGenBinder.d.ts +8 -0
  138. package/dist/utils/modelGenBinder.js +31 -0
  139. package/dist/utils/modelGenBinder.js.map +1 -0
  140. package/dist/utils/modelGenRender.d.ts +29 -0
  141. package/dist/utils/modelGenRender.js +158 -0
  142. package/dist/utils/modelGenRender.js.map +1 -0
  143. package/dist/utils/modelGenScanner.d.ts +24 -0
  144. package/dist/utils/modelGenScanner.js +196 -0
  145. package/dist/utils/modelGenScanner.js.map +1 -0
  146. package/dist/utils/modelProbe.d.ts +14 -0
  147. package/dist/utils/modelProbe.js +121 -0
  148. package/dist/utils/modelProbe.js.map +1 -0
  149. package/dist/utils/normalizePulledSchema.d.ts +12 -0
  150. package/dist/utils/normalizePulledSchema.js +213 -0
  151. package/dist/utils/normalizePulledSchema.js.map +1 -0
  152. package/dist/utils/optionalDependencies.d.ts +43 -0
  153. package/dist/utils/optionalDependencies.js +134 -0
  154. package/dist/utils/optionalDependencies.js.map +1 -0
  155. package/dist/utils/pgDump.d.ts +12 -0
  156. package/dist/utils/pgDump.js +58 -0
  157. package/dist/utils/pgDump.js.map +1 -0
  158. package/dist/utils/queryFingerprint.d.ts +14 -0
  159. package/dist/utils/queryFingerprint.js +34 -0
  160. package/dist/utils/queryFingerprint.js.map +1 -0
  161. package/dist/utils/sqlCatalogDiscovery.d.ts +44 -0
  162. package/dist/utils/sqlCatalogDiscovery.js +166 -0
  163. package/dist/utils/sqlCatalogDiscovery.js.map +1 -0
  164. package/dist/utils/sqlCatalogStatements.d.ts +20 -0
  165. package/dist/utils/sqlCatalogStatements.js +23 -0
  166. package/dist/utils/sqlCatalogStatements.js.map +1 -0
  167. package/dist/utils/sqlLintHelpers.d.ts +18 -0
  168. package/dist/utils/sqlLintHelpers.js +270 -0
  169. package/dist/utils/sqlLintHelpers.js.map +1 -0
  170. package/dist/utils/telemetry.d.ts +71 -0
  171. package/dist/utils/telemetry.js +597 -0
  172. package/dist/utils/telemetry.js.map +1 -0
  173. package/dist/utils/typeMapper.d.ts +4 -0
  174. package/dist/utils/typeMapper.js +79 -0
  175. package/dist/utils/typeMapper.js.map +1 -0
  176. package/dist/utils/ztdProjectConfig.d.ts +41 -0
  177. package/dist/utils/ztdProjectConfig.js +182 -0
  178. package/dist/utils/ztdProjectConfig.js.map +1 -0
  179. package/package.json +19 -20
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clearStatementCache = clearStatementCache;
4
+ exports.locateUsageText = locateUsageText;
5
+ const MAX_SNIPPET_LENGTH = 200;
6
+ const MAX_STATEMENT_CACHE_SIZE = 256;
7
+ const statementCache = new Map();
8
+ function clearStatementCache() {
9
+ statementCache.clear();
10
+ }
11
+ /**
12
+ * Locate the best matching occurrence in a statement and project it to file-relative coordinates.
13
+ */
14
+ function locateUsageText(params) {
15
+ const cache = getStatementCache(params.statementText);
16
+ const occurrences = collectOccurrences(params.statementText, params.candidates);
17
+ if (occurrences.length === 0) {
18
+ return {
19
+ location: null,
20
+ snippet: params.statementText.trim(),
21
+ ambiguous: false
22
+ };
23
+ }
24
+ const clauseWindow = params.clauseAnchor
25
+ ? findClauseWindow(cache, params.clauseAnchor)
26
+ : null;
27
+ const selected = selectOccurrence(occurrences, clauseWindow);
28
+ if (!selected) {
29
+ return {
30
+ location: null,
31
+ snippet: extractSnippet(params.statementText, 0, Math.min(params.statementText.length, MAX_SNIPPET_LENGTH)),
32
+ ambiguous: occurrences.length > 1
33
+ };
34
+ }
35
+ const snippet = params.snippetMode === 'line'
36
+ ? extractLineSnippet(params.statementText, selected.start, selected.end)
37
+ : extractClauseSnippet(params.statementText, selected.start, selected.end, clauseWindow);
38
+ return {
39
+ location: buildLocation(params.statementText, params.statementStartOffsetInFile, selected.start, selected.end),
40
+ snippet,
41
+ ambiguous: selected.ambiguous
42
+ };
43
+ }
44
+ function getStatementCache(statementText) {
45
+ const cached = statementCache.get(statementText);
46
+ if (cached) {
47
+ // Refresh cache recency on access so older statements are evicted first.
48
+ statementCache.delete(statementText);
49
+ statementCache.set(statementText, cached);
50
+ return cached;
51
+ }
52
+ const clauseMarkers = Array.from(statementText.matchAll(/\b(WHERE|ORDER\s+BY|GROUP\s+BY|HAVING|RETURNING|SET|JOIN|ON|USING|FROM|INSERT\s+INTO|UPDATE|DELETE\s+FROM)\b/gi))
53
+ .map((match) => {
54
+ var _a, _b;
55
+ return ({
56
+ start: (_a = match.index) !== null && _a !== void 0 ? _a : 0,
57
+ end: ((_b = match.index) !== null && _b !== void 0 ? _b : 0) + match[0].length,
58
+ keyword: match[0].toUpperCase()
59
+ });
60
+ })
61
+ .sort((left, right) => left.start - right.start || left.end - right.end);
62
+ const value = { clauseMarkers };
63
+ setStatementCache(statementText, value);
64
+ return value;
65
+ }
66
+ function setStatementCache(statementText, value) {
67
+ if (statementCache.has(statementText)) {
68
+ statementCache.delete(statementText);
69
+ }
70
+ statementCache.set(statementText, value);
71
+ // Keep the cache bounded for long-running CLI processes and large batch scans.
72
+ while (statementCache.size > MAX_STATEMENT_CACHE_SIZE) {
73
+ const oldestKey = statementCache.keys().next().value;
74
+ if (oldestKey === undefined) {
75
+ break;
76
+ }
77
+ statementCache.delete(oldestKey);
78
+ }
79
+ }
80
+ function selectOccurrence(occurrences, clauseWindow) {
81
+ if (!clauseWindow) {
82
+ return occurrences.length > 0
83
+ ? {
84
+ ...occurrences[0],
85
+ ambiguous: occurrences.length > 1
86
+ }
87
+ : null;
88
+ }
89
+ const inWindow = occurrences.filter((occurrence) => occurrence.start >= clauseWindow.start &&
90
+ occurrence.start < clauseWindow.end);
91
+ const candidates = inWindow.length > 0
92
+ ? inWindow
93
+ : occurrences.filter((occurrence) => occurrence.start >= clauseWindow.start);
94
+ const selectedPool = candidates.length > 0 ? candidates : occurrences;
95
+ if (selectedPool.length === 0) {
96
+ return null;
97
+ }
98
+ const selected = [...selectedPool].sort((left, right) => Math.abs(left.start - clauseWindow.start) - Math.abs(right.start - clauseWindow.start) ||
99
+ left.start - right.start ||
100
+ (right.end - right.start) - (left.end - left.start))[0];
101
+ return {
102
+ ...selected,
103
+ ambiguous: selectedPool.length > 1
104
+ };
105
+ }
106
+ function findClauseWindow(cache, clauseAnchor) {
107
+ var _a;
108
+ const anchorPattern = clauseAnchor.tokens.join(' ').toUpperCase();
109
+ const anchor = cache.clauseMarkers.find((marker) => marker.keyword === anchorPattern);
110
+ if (!anchor) {
111
+ return null;
112
+ }
113
+ const nextClause = cache.clauseMarkers.find((marker) => marker.start > anchor.end);
114
+ return {
115
+ anchorStart: anchor.start,
116
+ start: anchor.end,
117
+ end: (_a = nextClause === null || nextClause === void 0 ? void 0 : nextClause.start) !== null && _a !== void 0 ? _a : Number.MAX_SAFE_INTEGER
118
+ };
119
+ }
120
+ function collectOccurrences(statementText, candidates) {
121
+ var _a;
122
+ const occurrences = [];
123
+ for (const candidate of Array.from(new Set(candidates.filter(Boolean)))) {
124
+ const pattern = buildCandidatePattern(candidate);
125
+ for (const match of statementText.matchAll(pattern)) {
126
+ const start = (_a = match.index) !== null && _a !== void 0 ? _a : -1;
127
+ if (start < 0) {
128
+ continue;
129
+ }
130
+ occurrences.push({
131
+ start,
132
+ end: start + match[0].length
133
+ });
134
+ }
135
+ }
136
+ return dedupeOccurrences(occurrences);
137
+ }
138
+ function buildCandidatePattern(candidate) {
139
+ const parts = candidate.split('.');
140
+ const pattern = parts
141
+ .map((part) => `(?:"${escapeRegex(part)}"|${escapeRegex(part)})`)
142
+ .join('\\s*\\.\\s*');
143
+ return new RegExp(`(?<![A-Za-z0-9_])${pattern}(?![A-Za-z0-9_])`, 'gi');
144
+ }
145
+ function dedupeOccurrences(occurrences) {
146
+ const sorted = [...occurrences].sort((left, right) => left.start - right.start ||
147
+ (right.end - right.start) - (left.end - left.start) ||
148
+ left.end - right.end);
149
+ const deduped = [];
150
+ for (const occurrence of sorted) {
151
+ const duplicate = deduped.find((entry) => (entry.start === occurrence.start && entry.end === occurrence.end) ||
152
+ (occurrence.start >= entry.start && occurrence.end <= entry.end));
153
+ if (!duplicate) {
154
+ deduped.push(occurrence);
155
+ }
156
+ }
157
+ return deduped.sort((left, right) => left.start - right.start ||
158
+ (right.end - right.start) - (left.end - left.start));
159
+ }
160
+ function clampSnippetEnd(selectedEnd, clauseEnd) {
161
+ return Math.min(Math.max(selectedEnd, 0) + MAX_SNIPPET_LENGTH, clauseEnd);
162
+ }
163
+ function extractClauseSnippet(statementText, selectedStart, selectedEnd, clauseWindow) {
164
+ var _a;
165
+ const snippetStart = clauseWindow ? clauseWindow.anchorStart : selectedStart;
166
+ const snippetEnd = clampSnippetEnd(selectedEnd, (_a = clauseWindow === null || clauseWindow === void 0 ? void 0 : clauseWindow.end) !== null && _a !== void 0 ? _a : statementText.length);
167
+ return extractSnippet(statementText, snippetStart, snippetEnd);
168
+ }
169
+ function extractLineSnippet(statementText, start, end) {
170
+ // Keep table snippets anchored to the concrete identifier line so the reason for the match is obvious.
171
+ const lineStart = statementText.lastIndexOf('\n', Math.max(0, start - 1)) + 1;
172
+ const lineEndIndex = statementText.indexOf('\n', end);
173
+ const lineEnd = lineEndIndex >= 0 ? lineEndIndex : statementText.length;
174
+ return extractSnippet(statementText, lineStart, lineEnd);
175
+ }
176
+ function buildLocation(statementText, statementStartOffsetInFile, statementOffsetStart, statementOffsetEnd) {
177
+ const start = offsetToLineColumn(statementText, statementOffsetStart);
178
+ const end = offsetToLineColumn(statementText, statementOffsetEnd);
179
+ return {
180
+ startLine: start.line,
181
+ startColumn: start.column,
182
+ endLine: end.line,
183
+ endColumn: end.column,
184
+ fileOffsetStart: statementStartOffsetInFile + statementOffsetStart,
185
+ fileOffsetEnd: statementStartOffsetInFile + statementOffsetEnd,
186
+ statementOffsetStart,
187
+ statementOffsetEnd
188
+ };
189
+ }
190
+ function extractSnippet(statementText, start, end) {
191
+ return statementText.slice(Math.max(0, start), Math.min(end, statementText.length)).trim();
192
+ }
193
+ function offsetToLineColumn(text, offset) {
194
+ const safeOffset = Math.max(0, Math.min(offset, text.length));
195
+ const lines = text.slice(0, safeOffset).split('\n');
196
+ return {
197
+ line: lines.length,
198
+ column: lines[lines.length - 1].length + 1
199
+ };
200
+ }
201
+ function escapeRegex(value) {
202
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
203
+ }
204
+ //# sourceMappingURL=location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location.js","sourceRoot":"","sources":["../../src/query/location.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface QueryPatchApplyOptions {
2
+ cte: string;
3
+ from: string;
4
+ out?: string;
5
+ preview?: boolean;
6
+ }
7
+ export interface QueryPatchApplyReport {
8
+ file: string;
9
+ edited_file: string;
10
+ target_cte: string;
11
+ preview: boolean;
12
+ changed: boolean;
13
+ written: boolean;
14
+ output_file: string;
15
+ updated_sql: string;
16
+ diff: string;
17
+ }
18
+ /**
19
+ * Replace one CTE in the original SQL with the matching edited CTE definition.
20
+ */
21
+ export declare function applyQueryPatch(sqlFile: string, options: QueryPatchApplyOptions): QueryPatchApplyReport;
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.applyQueryPatch = applyQueryPatch;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const diff_1 = require("diff");
10
+ const rawsql_ts_1 = require("rawsql-ts");
11
+ const fs_1 = require("../utils/fs");
12
+ const analysis_1 = require("./analysis");
13
+ /**
14
+ * Replace one CTE in the original SQL with the matching edited CTE definition.
15
+ */
16
+ function applyQueryPatch(sqlFile, options) {
17
+ var _a;
18
+ const targetCte = normalizeTargetCte(options.cte);
19
+ const absoluteOriginalPath = node_path_1.default.resolve(sqlFile);
20
+ const absoluteEditedPath = node_path_1.default.resolve(options.from);
21
+ const outputFile = node_path_1.default.resolve((_a = options.out) !== null && _a !== void 0 ? _a : absoluteOriginalPath);
22
+ const originalSql = (0, node_fs_1.readFileSync)(absoluteOriginalPath, 'utf8');
23
+ const editedSql = (0, node_fs_1.readFileSync)(absoluteEditedPath, 'utf8');
24
+ const originalStatement = (0, analysis_1.assertSupportedStatement)(rawsql_ts_1.SqlParser.parse(originalSql), 'ztd query patch apply');
25
+ const originalWithClause = requireWithClause(originalStatement, absoluteOriginalPath);
26
+ const replacement = extractReplacementCte(editedSql, targetCte, absoluteEditedPath);
27
+ const targetIndex = findExactlyOneCteIndex(originalWithClause, targetCte, absoluteOriginalPath);
28
+ // Replace only the requested CTE while preserving the original WITH clause order.
29
+ originalWithClause.tables.splice(targetIndex, 1, replacement);
30
+ const formatter = new rawsql_ts_1.SqlFormatter();
31
+ const updatedSql = `${formatter.format(originalStatement).formattedSql}\n`;
32
+ // Re-parse the emitted SQL so syntax errors fail before any file write happens.
33
+ (0, analysis_1.assertSupportedStatement)(rawsql_ts_1.SqlParser.parse(updatedSql), 'ztd query patch apply');
34
+ const diff = createPatch(absoluteOriginalPath, outputFile, originalSql, updatedSql);
35
+ const changed = normalizeLineEndings(originalSql) !== normalizeLineEndings(updatedSql);
36
+ const preview = Boolean(options.preview);
37
+ if (!preview) {
38
+ (0, fs_1.ensureDirectory)(node_path_1.default.dirname(outputFile));
39
+ (0, node_fs_1.writeFileSync)(outputFile, updatedSql, 'utf8');
40
+ }
41
+ return {
42
+ file: absoluteOriginalPath,
43
+ edited_file: absoluteEditedPath,
44
+ target_cte: targetCte,
45
+ preview,
46
+ changed,
47
+ written: !preview,
48
+ output_file: outputFile,
49
+ updated_sql: updatedSql,
50
+ diff
51
+ };
52
+ }
53
+ function normalizeTargetCte(value) {
54
+ const normalized = value.trim();
55
+ if (!normalized) {
56
+ throw new Error('ztd query patch apply requires --cte <name>.');
57
+ }
58
+ return normalized;
59
+ }
60
+ function extractReplacementCte(sql, targetCte, sourceFile) {
61
+ try {
62
+ const parsed = (0, analysis_1.assertSupportedStatement)(rawsql_ts_1.SqlParser.parse(sql), 'ztd query patch apply');
63
+ return extractReplacementCteFromStatement(parsed, targetCte, sourceFile);
64
+ }
65
+ catch (statementError) {
66
+ try {
67
+ const snippet = sql.trim().replace(/;\s*$/, '');
68
+ const parsed = (0, analysis_1.assertSupportedStatement)(rawsql_ts_1.SqlParser.parse(`with ${snippet} select 1`), 'ztd query patch apply');
69
+ return extractReplacementCteFromStatement(parsed, targetCte, sourceFile);
70
+ }
71
+ catch {
72
+ throw statementError;
73
+ }
74
+ }
75
+ }
76
+ function extractReplacementCteFromStatement(statement, targetCte, sourceFile) {
77
+ const withClause = getWithClause(statement);
78
+ if (!withClause) {
79
+ throw new Error(`Edited SQL must include the target CTE "${targetCte}" in a WITH clause.`);
80
+ }
81
+ const targetIndex = findExactlyOneCteIndex(withClause, targetCte, sourceFile);
82
+ return withClause.tables[targetIndex];
83
+ }
84
+ function requireWithClause(statement, sourceFile) {
85
+ const withClause = getWithClause(statement);
86
+ if (!withClause) {
87
+ throw new Error(`SQL file does not contain a WITH clause: ${sourceFile}`);
88
+ }
89
+ return withClause;
90
+ }
91
+ function findExactlyOneCteIndex(withClause, targetCte, sourceFile) {
92
+ const matches = withClause.tables
93
+ .map((cte, index) => ({ cte, index }))
94
+ .filter((entry) => entry.cte.aliasExpression.table.name.toLowerCase() === targetCte.toLowerCase());
95
+ if (matches.length === 0) {
96
+ throw new Error(`CTE "${targetCte}" was not found in ${sourceFile}.`);
97
+ }
98
+ if (matches.length > 1) {
99
+ throw new Error(`CTE "${targetCte}" appears multiple times in ${sourceFile}; patch apply requires a unique target.`);
100
+ }
101
+ return matches[0].index;
102
+ }
103
+ function createPatch(originalFile, outputFile, before, after) {
104
+ return (0, diff_1.createTwoFilesPatch)(normalizePath(originalFile), normalizePath(outputFile), normalizeLineEndings(before), normalizeLineEndings(after), '', '', { context: 3 });
105
+ }
106
+ function normalizeLineEndings(value) {
107
+ return value.replace(/\r\n/g, '\n');
108
+ }
109
+ function normalizePath(value) {
110
+ return value.split(node_path_1.default.sep).join('/');
111
+ }
112
+ function getWithClause(statement) {
113
+ var _a;
114
+ if (statement instanceof rawsql_ts_1.SimpleSelectQuery ||
115
+ statement instanceof rawsql_ts_1.ValuesQuery ||
116
+ statement instanceof rawsql_ts_1.UpdateQuery ||
117
+ statement instanceof rawsql_ts_1.DeleteQuery) {
118
+ return (_a = statement.withClause) !== null && _a !== void 0 ? _a : null;
119
+ }
120
+ if (statement instanceof rawsql_ts_1.InsertQuery) {
121
+ return statement.selectQuery ? getSelectWithClause(assertSelectStatement(statement.selectQuery)) : null;
122
+ }
123
+ return getSelectWithClause(statement);
124
+ }
125
+ function getSelectWithClause(statement) {
126
+ var _a, _b;
127
+ if (statement instanceof rawsql_ts_1.SimpleSelectQuery || statement instanceof rawsql_ts_1.ValuesQuery) {
128
+ return (_a = statement.withClause) !== null && _a !== void 0 ? _a : null;
129
+ }
130
+ let current = statement;
131
+ while (current instanceof rawsql_ts_1.BinarySelectQuery) {
132
+ if (current.left instanceof rawsql_ts_1.BinarySelectQuery) {
133
+ current = current.left;
134
+ continue;
135
+ }
136
+ if (current.left instanceof rawsql_ts_1.SimpleSelectQuery || current.left instanceof rawsql_ts_1.ValuesQuery) {
137
+ return (_b = current.left.withClause) !== null && _b !== void 0 ? _b : null;
138
+ }
139
+ break;
140
+ }
141
+ return null;
142
+ }
143
+ function assertSelectStatement(statement) {
144
+ if (statement instanceof rawsql_ts_1.SimpleSelectQuery ||
145
+ statement instanceof rawsql_ts_1.BinarySelectQuery ||
146
+ statement instanceof rawsql_ts_1.ValuesQuery) {
147
+ return statement;
148
+ }
149
+ throw new Error('Expected a SELECT-compatible statement.');
150
+ }
151
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/query/patch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type QueryStructureReport } from './structure';
2
+ export type QueryPipelinePlanFormat = 'text' | 'json';
3
+ export type QueryPipelineStepKind = 'materialize' | 'final-query';
4
+ export interface QueryPipelineMetadata {
5
+ material?: string[];
6
+ scalarFilterColumns?: string[];
7
+ }
8
+ export interface QueryPipelineStep {
9
+ step: number;
10
+ kind: QueryPipelineStepKind;
11
+ target: string;
12
+ depends_on: string[];
13
+ }
14
+ export interface QueryPipelinePlan {
15
+ file: string;
16
+ query_type: QueryStructureReport['query_type'];
17
+ final_query: string | null;
18
+ metadata: {
19
+ material: string[];
20
+ scalarFilterColumns: string[];
21
+ };
22
+ steps: QueryPipelineStep[];
23
+ }
24
+ /**
25
+ * Build a deterministic execution plan from query structure and runtime metadata.
26
+ */
27
+ export declare function buildQueryPipelinePlan(sqlFile: string, metadata?: QueryPipelineMetadata): QueryPipelinePlan;
28
+ /**
29
+ * Render the pipeline plan for machine or human consumption.
30
+ */
31
+ export declare function formatQueryPipelinePlan(plan: QueryPipelinePlan, format: QueryPipelinePlanFormat): string;
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildQueryPipelinePlan = buildQueryPipelinePlan;
4
+ exports.formatQueryPipelinePlan = formatQueryPipelinePlan;
5
+ const structure_1 = require("./structure");
6
+ /**
7
+ * Build a deterministic execution plan from query structure and runtime metadata.
8
+ */
9
+ function buildQueryPipelinePlan(sqlFile, metadata = {}) {
10
+ var _a, _b;
11
+ const report = (0, structure_1.buildQueryStructureReport)(sqlFile);
12
+ const material = uniquePreservingOrder((_a = metadata.material) !== null && _a !== void 0 ? _a : []);
13
+ const scalarFilterColumns = uniquePreservingOrder((_b = metadata.scalarFilterColumns) !== null && _b !== void 0 ? _b : []);
14
+ const cteNameSet = new Set(report.ctes.map((cte) => cte.name));
15
+ validateKnownCtes(material, cteNameSet, 'material');
16
+ const orderedCtes = topologicallySortCtes(report);
17
+ const plannedCtes = orderedCtes.filter((name) => material.includes(name));
18
+ const cteMap = new Map(report.ctes.map((cte) => [cte.name, cte]));
19
+ const steps = plannedCtes.map((name, index) => {
20
+ var _a, _b;
21
+ return ({
22
+ step: index + 1,
23
+ kind: 'materialize',
24
+ target: name,
25
+ depends_on: [...((_b = (_a = cteMap.get(name)) === null || _a === void 0 ? void 0 : _a.depends_on) !== null && _b !== void 0 ? _b : [])]
26
+ });
27
+ });
28
+ steps.push({
29
+ step: steps.length + 1,
30
+ kind: 'final-query',
31
+ target: 'FINAL_QUERY',
32
+ depends_on: resolveFinalQueryDependencies(report, cteNameSet)
33
+ });
34
+ return {
35
+ file: report.file,
36
+ query_type: report.query_type,
37
+ final_query: report.final_query,
38
+ metadata: {
39
+ material,
40
+ scalarFilterColumns
41
+ },
42
+ steps
43
+ };
44
+ }
45
+ /**
46
+ * Render the pipeline plan for machine or human consumption.
47
+ */
48
+ function formatQueryPipelinePlan(plan, format) {
49
+ if (format === 'json') {
50
+ return `${JSON.stringify(plan, null, 2)}\n`;
51
+ }
52
+ return `${formatQueryPipelineText(plan)}\n`;
53
+ }
54
+ function formatQueryPipelineText(plan) {
55
+ const lines = [
56
+ `Query type: ${plan.query_type}`,
57
+ `Material CTEs: ${plan.metadata.material.length > 0 ? plan.metadata.material.join(', ') : '(none)'}`,
58
+ `Scalar filter columns: ${plan.metadata.scalarFilterColumns.length > 0 ? plan.metadata.scalarFilterColumns.join(', ') : '(none)'}`,
59
+ '',
60
+ 'Planned steps:'
61
+ ];
62
+ for (const step of plan.steps) {
63
+ lines.push(`${step.step}. ${describeStep(step)}`);
64
+ lines.push(` depends_on: ${step.depends_on.length > 0 ? step.depends_on.join(', ') : '(none)'}`);
65
+ }
66
+ return lines.join('\n');
67
+ }
68
+ function describeStep(step) {
69
+ switch (step.kind) {
70
+ case 'materialize':
71
+ return `materialize ${step.target}`;
72
+ case 'final-query':
73
+ default:
74
+ return 'run final query';
75
+ }
76
+ }
77
+ function validateKnownCtes(names, cteNameSet, label) {
78
+ for (const name of names) {
79
+ if (!cteNameSet.has(name)) {
80
+ throw new Error(`Unknown ${label} CTE: ${name}`);
81
+ }
82
+ }
83
+ }
84
+ function resolveFinalQueryDependencies(report, cteNameSet) {
85
+ if (!report.final_query) {
86
+ return [];
87
+ }
88
+ return report.final_query
89
+ .split(',')
90
+ .map((value) => value.trim())
91
+ .filter((value) => value.length > 0 && cteNameSet.has(value));
92
+ }
93
+ function topologicallySortCtes(report) {
94
+ const cteMap = new Map(report.ctes.map((cte) => [cte.name, cte]));
95
+ const cteOrder = new Map(report.ctes.map((cte, index) => [cte.name, index]));
96
+ const visited = new Set();
97
+ const visiting = new Set();
98
+ const ordered = [];
99
+ const visit = (name) => {
100
+ var _a, _b;
101
+ if (visited.has(name)) {
102
+ return;
103
+ }
104
+ if (visiting.has(name)) {
105
+ throw new Error(`Circular CTE dependency detected while planning: ${name}`);
106
+ }
107
+ visiting.add(name);
108
+ const dependencies = [...((_b = (_a = cteMap.get(name)) === null || _a === void 0 ? void 0 : _a.depends_on) !== null && _b !== void 0 ? _b : [])].sort((left, right) => { var _a, _b; return ((_a = cteOrder.get(left)) !== null && _a !== void 0 ? _a : Number.MAX_SAFE_INTEGER) - ((_b = cteOrder.get(right)) !== null && _b !== void 0 ? _b : Number.MAX_SAFE_INTEGER); });
109
+ // Visit dependencies first so every emitted step is ready to execute.
110
+ for (const dependency of dependencies) {
111
+ visit(dependency);
112
+ }
113
+ visiting.delete(name);
114
+ visited.add(name);
115
+ ordered.push(name);
116
+ };
117
+ for (const cte of report.ctes) {
118
+ visit(cte.name);
119
+ }
120
+ return ordered;
121
+ }
122
+ function uniquePreservingOrder(values) {
123
+ const seen = new Set();
124
+ const result = [];
125
+ for (const value of values) {
126
+ if (seen.has(value)) {
127
+ continue;
128
+ }
129
+ seen.add(value);
130
+ result.push(value);
131
+ }
132
+ return result;
133
+ }
134
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/query/planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { QUERY_USES_REPORT_SPANS, writeQueryUsageOutput } from '@rawsql-ts/sql-grep-core';
2
+ import type { BuildQueryUsageReportParams } from '@rawsql-ts/sql-grep-core';
3
+ export { QUERY_USES_REPORT_SPANS, writeQueryUsageOutput };
4
+ /**
5
+ * Build a deterministic impact or detail investigation report from catalog specs.
6
+ */
7
+ export declare function buildQueryUsageReport(params: Omit<BuildQueryUsageReportParams, 'withSpanSync'>): import("@rawsql-ts/sql-grep-core").QueryUsageReport;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.writeQueryUsageOutput = exports.QUERY_USES_REPORT_SPANS = void 0;
4
+ exports.buildQueryUsageReport = buildQueryUsageReport;
5
+ const sql_grep_core_1 = require("@rawsql-ts/sql-grep-core");
6
+ Object.defineProperty(exports, "QUERY_USES_REPORT_SPANS", { enumerable: true, get: function () { return sql_grep_core_1.QUERY_USES_REPORT_SPANS; } });
7
+ Object.defineProperty(exports, "writeQueryUsageOutput", { enumerable: true, get: function () { return sql_grep_core_1.writeQueryUsageOutput; } });
8
+ const telemetry_1 = require("../utils/telemetry");
9
+ const runQueryUsageSpan = (name, fn, attrs) => (0, telemetry_1.withSpanSync)(name, fn, attrs);
10
+ /**
11
+ * Build a deterministic impact or detail investigation report from catalog specs.
12
+ */
13
+ function buildQueryUsageReport(params) {
14
+ return (0, sql_grep_core_1.buildQueryUsageReport)({
15
+ ...params,
16
+ withSpanSync: runQueryUsageSpan,
17
+ });
18
+ }
19
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/query/report.ts"],"names":[],"mappings":";;;AAiBA,sDAKC;AAtBD,4DAIkC;AAKzB,wGAPP,uCAAuB,OAOO;AAAE,sGANhC,qCAAqB,OAMgC;AAHvD,kDAAkD;AAKlD,MAAM,iBAAiB,GAA6D,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CACtG,IAAA,wBAAY,EAAC,IAAI,EAAE,EAAE,EAAE,KAA4B,CAAC,CAAC;AAEvD;;GAEG;AACH,SAAgB,qBAAqB,CAAC,MAAyD;IAC7F,OAAO,IAAA,qCAAyB,EAAC;QAC/B,GAAG,MAAM;QACT,YAAY,EAAE,iBAAiB;KAChC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type SupportedStatement } from './analysis';
2
+ /**
3
+ * Detect non-correlated WHERE scalar subqueries that are good scalar-filter binding candidates.
4
+ */
5
+ export declare function findScalarFilterCandidates(sqlFile: string): string[];
6
+ export declare function findScalarFilterCandidatesInStatement(statement: SupportedStatement): string[];