rawsql-ts 0.11.4-beta → 0.11.6-beta
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/README.md +735 -735
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +14 -14
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/src/index.js +1 -1
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/models/ValueComponent.js +2 -1
- package/dist/esm/src/models/ValueComponent.js.map +1 -1
- package/dist/esm/src/parsers/FunctionExpressionParser.js +47 -4
- package/dist/esm/src/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/esm/src/parsers/SqlPrintTokenParser.js +28 -6
- package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/esm/src/tokenReaders/CommandTokenReader.js +2 -0
- package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/esm/src/transformers/SchemaCollector.js +76 -9
- package/dist/esm/src/transformers/SchemaCollector.js.map +1 -1
- package/dist/esm/src/utils/CommentEditor.js +190 -0
- package/dist/esm/src/utils/CommentEditor.js.map +1 -0
- package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/esm/types/src/index.d.ts +1 -2
- package/dist/esm/types/src/models/ValueComponent.d.ts +2 -1
- package/dist/esm/types/src/parsers/FunctionExpressionParser.d.ts +7 -0
- package/dist/esm/types/src/parsers/SqlPrintTokenParser.d.ts +1 -0
- package/dist/esm/types/src/transformers/SchemaCollector.d.ts +6 -1
- package/dist/esm/types/src/utils/CommentEditor.d.ts +72 -0
- package/dist/index.min.js +15 -15
- package/dist/index.min.js.map +4 -4
- package/dist/src/index.d.ts +1 -2
- package/dist/src/index.js +2 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/models/ValueComponent.d.ts +2 -1
- package/dist/src/models/ValueComponent.js +2 -1
- package/dist/src/models/ValueComponent.js.map +1 -1
- package/dist/src/parsers/FunctionExpressionParser.d.ts +7 -0
- package/dist/src/parsers/FunctionExpressionParser.js +47 -4
- package/dist/src/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/src/parsers/SqlPrintTokenParser.d.ts +1 -0
- package/dist/src/parsers/SqlPrintTokenParser.js +28 -6
- package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/src/tokenReaders/CommandTokenReader.js +2 -0
- package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/src/transformers/SchemaCollector.d.ts +6 -1
- package/dist/src/transformers/SchemaCollector.js +76 -9
- package/dist/src/transformers/SchemaCollector.js.map +1 -1
- package/dist/src/utils/CommentEditor.d.ts +72 -0
- package/dist/src/utils/CommentEditor.js +194 -0
- package/dist/src/utils/CommentEditor.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/esm/src/transformers/UnifiedJsonMapping.js +0 -57
- package/dist/esm/src/transformers/UnifiedJsonMapping.js.map +0 -1
- package/dist/esm/types/src/transformers/UnifiedJsonMapping.d.ts +0 -53
- package/dist/src/transformers/UnifiedJsonMapping.d.ts +0 -53
- package/dist/src/transformers/UnifiedJsonMapping.js +0 -60
- package/dist/src/transformers/UnifiedJsonMapping.js.map +0 -1
|
@@ -14,8 +14,9 @@ export class TableSchema {
|
|
|
14
14
|
* A visitor that collects schema information (table names and column names) from a SQL query structure.
|
|
15
15
|
*/
|
|
16
16
|
export class SchemaCollector {
|
|
17
|
-
constructor(tableColumnResolver = null) {
|
|
17
|
+
constructor(tableColumnResolver = null, allowWildcardWithoutResolver = false) {
|
|
18
18
|
this.tableColumnResolver = tableColumnResolver;
|
|
19
|
+
this.allowWildcardWithoutResolver = allowWildcardWithoutResolver;
|
|
19
20
|
this.tableSchemas = [];
|
|
20
21
|
this.visitedNodes = new Set();
|
|
21
22
|
this.commonTables = [];
|
|
@@ -146,12 +147,61 @@ export class SchemaCollector {
|
|
|
146
147
|
// Collect columns used in the query
|
|
147
148
|
const columnCollector = new SelectableColumnCollector(this.tableColumnResolver, true, DuplicateDetectionMode.FullName);
|
|
148
149
|
const columns = columnCollector.collect(query);
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
150
|
+
let queryColumns;
|
|
151
|
+
// Only filter JOIN condition columns when allowWildcardWithoutResolver is true
|
|
152
|
+
// This preserves backward compatibility for existing tests
|
|
153
|
+
if (this.allowWildcardWithoutResolver) {
|
|
154
|
+
// Filter to include only columns that are actually selected, not those used in JOIN conditions
|
|
155
|
+
const selectColumns = this.getSelectClauseColumns(query);
|
|
156
|
+
queryColumns = columns.filter((column) => column.value instanceof ColumnReference)
|
|
157
|
+
.map(column => column.value)
|
|
158
|
+
.filter(columnRef => {
|
|
159
|
+
// Only include columns that are either:
|
|
160
|
+
// 1. Explicitly mentioned in SELECT clause (not wildcards)
|
|
161
|
+
// 2. Part of wildcard expansion from SELECT clause (only if we have a resolver)
|
|
162
|
+
const tableName = columnRef.getNamespace();
|
|
163
|
+
const columnName = columnRef.column.name;
|
|
164
|
+
return selectColumns.some(selectCol => {
|
|
165
|
+
if (selectCol.value instanceof ColumnReference) {
|
|
166
|
+
const selectTableName = selectCol.value.getNamespace();
|
|
167
|
+
const selectColumnName = selectCol.value.column.name;
|
|
168
|
+
// Exact match for explicit columns
|
|
169
|
+
if (selectTableName === tableName && selectColumnName === columnName) {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
// Wildcard match (table.* or *) - only include if we have a resolver
|
|
173
|
+
if (selectColumnName === "*") {
|
|
174
|
+
// If allowWildcardWithoutResolver is true and no resolver, exclude wildcard expansions
|
|
175
|
+
if (this.allowWildcardWithoutResolver && this.tableColumnResolver === null) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
// Full wildcard (*) matches all tables
|
|
179
|
+
if (selectTableName === "") {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
// Table wildcard (table.*) matches specific table
|
|
183
|
+
if (selectTableName === tableName) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return false;
|
|
189
|
+
});
|
|
190
|
+
})
|
|
191
|
+
.map(columnRef => ({
|
|
192
|
+
table: columnRef.getNamespace(),
|
|
193
|
+
column: columnRef.column.name
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
// Original behavior: include all columns including JOIN conditions
|
|
198
|
+
queryColumns = columns.filter((column) => column.value instanceof ColumnReference)
|
|
199
|
+
.map(column => column.value)
|
|
200
|
+
.map(columnRef => ({
|
|
201
|
+
table: columnRef.getNamespace(),
|
|
202
|
+
column: columnRef.column.name
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
155
205
|
// Throw an error if there are columns without table names in queries with joins
|
|
156
206
|
if (query.fromClause.joins !== null && query.fromClause.joins.length > 0) {
|
|
157
207
|
const columnsWithoutTable = queryColumns.filter((columnRef) => columnRef.table === "").map((columnRef) => columnRef.column);
|
|
@@ -183,14 +233,31 @@ export class SchemaCollector {
|
|
|
183
233
|
this.visitNode(query.left);
|
|
184
234
|
this.visitNode(query.right);
|
|
185
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Extract column references from the SELECT clause only
|
|
238
|
+
*/
|
|
239
|
+
getSelectClauseColumns(query) {
|
|
240
|
+
if (!query.selectClause) {
|
|
241
|
+
return [];
|
|
242
|
+
}
|
|
243
|
+
const selectColumns = [];
|
|
244
|
+
for (const item of query.selectClause.items) {
|
|
245
|
+
if (item.value instanceof ColumnReference) {
|
|
246
|
+
const columnName = item.value.column.name;
|
|
247
|
+
selectColumns.push({ name: columnName, value: item.value });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return selectColumns;
|
|
251
|
+
}
|
|
186
252
|
processCollectTableSchema(tableName, tableAlias, queryColumns, includeUnnamed = false) {
|
|
187
|
-
//
|
|
253
|
+
// Check if wildcard is present and handle based on configuration
|
|
188
254
|
if (this.tableColumnResolver === null) {
|
|
189
255
|
const hasWildcard = queryColumns
|
|
190
256
|
.filter((columnRef) => columnRef.table === tableAlias || (includeUnnamed && columnRef.table === ""))
|
|
191
257
|
.filter((columnRef) => columnRef.column === "*")
|
|
192
258
|
.length > 0;
|
|
193
|
-
if (
|
|
259
|
+
// Throw error if wildcard is found and allowWildcardWithoutResolver is false (default behavior)
|
|
260
|
+
if (hasWildcard && !this.allowWildcardWithoutResolver) {
|
|
194
261
|
const errorMessage = tableName
|
|
195
262
|
? `Wildcard (*) is used. A TableColumnResolver is required to resolve wildcards. Target table: ${tableName}`
|
|
196
263
|
: "Wildcard (*) is used. A TableColumnResolver is required to resolve wildcards.";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaCollector.js","sourceRoot":"","sources":["../../../../src/transformers/SchemaCollector.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,cAAc,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"SchemaCollector.js","sourceRoot":"","sources":["../../../../src/transformers/SchemaCollector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { SqlComponent } from '../models/SqlComponent';
|
|
2
|
+
/**
|
|
3
|
+
* Utility class for editing comments on SQL components.
|
|
4
|
+
* Provides functions to add, edit, delete, and search comments in SQL AST.
|
|
5
|
+
*/
|
|
6
|
+
export class CommentEditor {
|
|
7
|
+
/**
|
|
8
|
+
* Add a comment to a SQL component
|
|
9
|
+
* @param component The SQL component to add comment to
|
|
10
|
+
* @param comment The comment text to add
|
|
11
|
+
*/
|
|
12
|
+
static addComment(component, comment) {
|
|
13
|
+
if (!component.comments) {
|
|
14
|
+
component.comments = [];
|
|
15
|
+
}
|
|
16
|
+
component.comments.push(comment);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Edit an existing comment by index
|
|
20
|
+
* @param component The SQL component containing the comment
|
|
21
|
+
* @param index The index of the comment to edit (0-based)
|
|
22
|
+
* @param newComment The new comment text
|
|
23
|
+
* @throws Error if index is invalid
|
|
24
|
+
*/
|
|
25
|
+
static editComment(component, index, newComment) {
|
|
26
|
+
var _a;
|
|
27
|
+
if (!component.comments || index < 0 || index >= component.comments.length) {
|
|
28
|
+
throw new Error(`Invalid comment index: ${index}. Component has ${((_a = component.comments) === null || _a === void 0 ? void 0 : _a.length) || 0} comments.`);
|
|
29
|
+
}
|
|
30
|
+
component.comments[index] = newComment;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Delete a comment by index
|
|
34
|
+
* @param component The SQL component containing the comment
|
|
35
|
+
* @param index The index of the comment to delete (0-based)
|
|
36
|
+
* @throws Error if index is invalid
|
|
37
|
+
*/
|
|
38
|
+
static deleteComment(component, index) {
|
|
39
|
+
var _a;
|
|
40
|
+
if (!component.comments || index < 0 || index >= component.comments.length) {
|
|
41
|
+
throw new Error(`Invalid comment index: ${index}. Component has ${((_a = component.comments) === null || _a === void 0 ? void 0 : _a.length) || 0} comments.`);
|
|
42
|
+
}
|
|
43
|
+
component.comments.splice(index, 1);
|
|
44
|
+
if (component.comments.length === 0) {
|
|
45
|
+
component.comments = null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Delete all comments from a component
|
|
50
|
+
* @param component The SQL component to clear comments from
|
|
51
|
+
*/
|
|
52
|
+
static deleteAllComments(component) {
|
|
53
|
+
component.comments = null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get all comments from a component
|
|
57
|
+
* @param component The SQL component to get comments from
|
|
58
|
+
* @returns Array of comment strings (empty array if no comments)
|
|
59
|
+
*/
|
|
60
|
+
static getComments(component) {
|
|
61
|
+
return component.comments || [];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Find all components in the AST that have comments containing the search text
|
|
65
|
+
* @param root The root SQL component to search from
|
|
66
|
+
* @param searchText The text to search for in comments
|
|
67
|
+
* @param caseSensitive Whether the search should be case-sensitive (default: false)
|
|
68
|
+
* @returns Array of components that have matching comments
|
|
69
|
+
*/
|
|
70
|
+
static findComponentsWithComment(root, searchText, caseSensitive = false) {
|
|
71
|
+
const results = [];
|
|
72
|
+
const searchTerm = caseSensitive ? searchText : searchText.toLowerCase();
|
|
73
|
+
const traverse = (component) => {
|
|
74
|
+
if (component && component instanceof SqlComponent) {
|
|
75
|
+
if (component.comments && component.comments.some(c => {
|
|
76
|
+
const commentText = caseSensitive ? c : c.toLowerCase();
|
|
77
|
+
return commentText.includes(searchTerm);
|
|
78
|
+
})) {
|
|
79
|
+
results.push(component);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Traverse all properties recursively
|
|
83
|
+
for (const key in component) {
|
|
84
|
+
if (component[key] && typeof component[key] === 'object') {
|
|
85
|
+
if (Array.isArray(component[key])) {
|
|
86
|
+
component[key].forEach(traverse);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
traverse(component[key]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
traverse(root);
|
|
95
|
+
return results;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Replace all occurrences of a text in comments across the entire AST
|
|
99
|
+
* @param root The root SQL component to search and replace in
|
|
100
|
+
* @param searchText The text to search for
|
|
101
|
+
* @param replaceText The text to replace with
|
|
102
|
+
* @param caseSensitive Whether the search should be case-sensitive (default: false)
|
|
103
|
+
* @returns Number of replacements made
|
|
104
|
+
*/
|
|
105
|
+
static replaceInComments(root, searchText, replaceText, caseSensitive = false) {
|
|
106
|
+
let replacementCount = 0;
|
|
107
|
+
const traverse = (component) => {
|
|
108
|
+
if (component && component instanceof SqlComponent && component.comments) {
|
|
109
|
+
for (let i = 0; i < component.comments.length; i++) {
|
|
110
|
+
const originalComment = component.comments[i];
|
|
111
|
+
const flags = caseSensitive ? 'g' : 'gi';
|
|
112
|
+
const regex = new RegExp(searchText.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), flags);
|
|
113
|
+
const newComment = originalComment.replace(regex, replaceText);
|
|
114
|
+
if (newComment !== originalComment) {
|
|
115
|
+
component.comments[i] = newComment;
|
|
116
|
+
replacementCount++;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Traverse all properties recursively
|
|
121
|
+
for (const key in component) {
|
|
122
|
+
if (component[key] && typeof component[key] === 'object') {
|
|
123
|
+
if (Array.isArray(component[key])) {
|
|
124
|
+
component[key].forEach(traverse);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
traverse(component[key]);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
traverse(root);
|
|
133
|
+
return replacementCount;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Count total number of comments in the AST
|
|
137
|
+
* @param root The root SQL component to count comments in
|
|
138
|
+
* @returns Total number of comments
|
|
139
|
+
*/
|
|
140
|
+
static countComments(root) {
|
|
141
|
+
let count = 0;
|
|
142
|
+
const traverse = (component) => {
|
|
143
|
+
if (component && component instanceof SqlComponent && component.comments) {
|
|
144
|
+
count += component.comments.length;
|
|
145
|
+
}
|
|
146
|
+
// Traverse all properties recursively
|
|
147
|
+
for (const key in component) {
|
|
148
|
+
if (component[key] && typeof component[key] === 'object') {
|
|
149
|
+
if (Array.isArray(component[key])) {
|
|
150
|
+
component[key].forEach(traverse);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
traverse(component[key]);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
traverse(root);
|
|
159
|
+
return count;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get all comments from the entire AST as a flat array with their source components
|
|
163
|
+
* @param root The root SQL component to extract comments from
|
|
164
|
+
* @returns Array of objects containing comment text and the component they belong to
|
|
165
|
+
*/
|
|
166
|
+
static getAllComments(root) {
|
|
167
|
+
const results = [];
|
|
168
|
+
const traverse = (component) => {
|
|
169
|
+
if (component && component instanceof SqlComponent && component.comments) {
|
|
170
|
+
component.comments.forEach((comment, index) => {
|
|
171
|
+
results.push({ comment, component, index });
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
// Traverse all properties recursively
|
|
175
|
+
for (const key in component) {
|
|
176
|
+
if (component[key] && typeof component[key] === 'object') {
|
|
177
|
+
if (Array.isArray(component[key])) {
|
|
178
|
+
component[key].forEach(traverse);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
traverse(component[key]);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
traverse(root);
|
|
187
|
+
return results;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=CommentEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommentEditor.js","sourceRoot":"","sources":["../../../../src/utils/CommentEditor.ts"],"names":[],"mappings":"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"}
|