@checkdigit/eslint-plugin 7.18.0-PR.143-b6d4 → 7.18.0-PR.143-c73c
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/LICENSE.txt +1 -1
- package/dist-mjs/athena/athena.mjs +3 -473
- package/dist-mjs/athena/sql-file.mjs +100 -0
- package/dist-mjs/athena/validate.mjs +480 -0
- package/dist-mjs/index.mjs +18 -5
- package/dist-mjs/sql-parser.mjs +25 -0
- package/dist-types/athena/athena.d.ts +1 -2
- package/dist-types/athena/sql-file.d.ts +5 -0
- package/dist-types/athena/validate.d.ts +14 -0
- package/dist-types/index.d.ts +1 -0
- package/dist-types/sql-parser.d.ts +25 -0
- package/package.json +1 -1
- package/src/athena/athena.ts +3 -654
- package/src/athena/sql-file.ts +116 -0
- package/src/athena/validate.ts +625 -0
- package/src/index.ts +12 -0
- package/src/sql-parser.ts +46 -0
- package/src/athena/ATHENA.md +0 -387
- package/src/athena/PLAN.md +0 -355
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
// src/athena/validate.ts
|
|
2
|
+
import { strict as assert } from "node:assert";
|
|
3
|
+
import debug from "debug";
|
|
4
|
+
import { JSONPath } from "jsonpath-plus";
|
|
5
|
+
import { matchApi } from "./api-matcher.mjs";
|
|
6
|
+
import { locateApi } from "./api-locator.mjs";
|
|
7
|
+
import { createChildContext } from "./context.mjs";
|
|
8
|
+
import { buildServiceTables } from "./service-table.mjs";
|
|
9
|
+
import {
|
|
10
|
+
containsCastToArray,
|
|
11
|
+
containsCastToMap,
|
|
12
|
+
containsLambda,
|
|
13
|
+
extractBracketAccessorPath,
|
|
14
|
+
extractColumnRefs,
|
|
15
|
+
extractJsonExtractCalls,
|
|
16
|
+
extractJsonExtractPath,
|
|
17
|
+
hasFunctionCalls,
|
|
18
|
+
isBaseFrom,
|
|
19
|
+
isJoin,
|
|
20
|
+
isTableExpr,
|
|
21
|
+
isUnnestFrom
|
|
22
|
+
} from "./visitor.mjs";
|
|
23
|
+
var SYNTEXT_ERROR = "SyntextError";
|
|
24
|
+
var ATHENA_ERROR = "AthenaError";
|
|
25
|
+
var AthenaError = class extends Error {
|
|
26
|
+
code;
|
|
27
|
+
ast;
|
|
28
|
+
constructor(code, message, ast) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.code = code;
|
|
31
|
+
this.name = "AthenaError";
|
|
32
|
+
if (ast !== void 0) {
|
|
33
|
+
this.ast = ast;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
function offsetToLoc(text, offset) {
|
|
38
|
+
const prefix = text.slice(0, offset);
|
|
39
|
+
const lines = prefix.split("\n");
|
|
40
|
+
return { line: lines.length, column: lines[lines.length - 1]?.length ?? 0 };
|
|
41
|
+
}
|
|
42
|
+
var log = debug("eslint-plugin:athena");
|
|
43
|
+
function resolvedCol(name, schema, ast) {
|
|
44
|
+
return ast !== void 0 ? { name, schema, ast } : { name, schema };
|
|
45
|
+
}
|
|
46
|
+
function getApiSchemas(serviceName, ctx) {
|
|
47
|
+
let schemas = ctx.apiSchemas.get(serviceName);
|
|
48
|
+
if (schemas === void 0) {
|
|
49
|
+
schemas = locateApi(serviceName);
|
|
50
|
+
ctx.apiSchemas.set(serviceName, schemas);
|
|
51
|
+
}
|
|
52
|
+
return schemas;
|
|
53
|
+
}
|
|
54
|
+
function lookupTables(nameOrAlias, ctx) {
|
|
55
|
+
const canonical = ctx.aliases.get(nameOrAlias) ?? nameOrAlias;
|
|
56
|
+
return ctx.tables.get(canonical) ?? [];
|
|
57
|
+
}
|
|
58
|
+
function fromClauseItems(select) {
|
|
59
|
+
if (Array.isArray(select.from)) {
|
|
60
|
+
return select.from;
|
|
61
|
+
}
|
|
62
|
+
if (select.from !== null) {
|
|
63
|
+
return [select.from];
|
|
64
|
+
}
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
function resolveServiceTable(select, item, ctx) {
|
|
68
|
+
const { table: tableName } = item;
|
|
69
|
+
try {
|
|
70
|
+
const apiSchemas = getApiSchemas(tableName, ctx);
|
|
71
|
+
if (apiSchemas.length === 0) {
|
|
72
|
+
throw new AthenaError(ATHENA_ERROR, `service not found: "${tableName}" (no swagger schema located)`, item);
|
|
73
|
+
}
|
|
74
|
+
const operations = matchApi(select, item, apiSchemas) ?? [];
|
|
75
|
+
ctx.tables.set(tableName, buildServiceTables(tableName, operations));
|
|
76
|
+
} catch (error) {
|
|
77
|
+
if (error instanceof AthenaError) {
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
throw new AthenaError(ATHENA_ERROR, error instanceof Error ? error.message : String(error), item);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function restrictToFromClause(select, ctx) {
|
|
84
|
+
const fromNames = /* @__PURE__ */ new Set();
|
|
85
|
+
for (const item of fromClauseItems(select)) {
|
|
86
|
+
if (isBaseFrom(item) || isJoin(item)) {
|
|
87
|
+
fromNames.add(item.table);
|
|
88
|
+
} else if (isTableExpr(item)) {
|
|
89
|
+
fromNames.add(typeof item.as === "string" ? item.as : "<subquery>");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const name of [...ctx.tables.keys()]) {
|
|
93
|
+
if (!fromNames.has(name)) {
|
|
94
|
+
ctx.tables.delete(name);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function resolveFromClause(select, ctx) {
|
|
99
|
+
for (const item of fromClauseItems(select)) {
|
|
100
|
+
if (isUnnestFrom(item)) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (isTableExpr(item)) {
|
|
104
|
+
const alias2 = typeof item.as === "string" ? item.as : "<subquery>";
|
|
105
|
+
checkSelect(item.expr.ast, ctx, alias2);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (isJoin(item)) {
|
|
109
|
+
const { table: tableName2, as: alias2 } = item;
|
|
110
|
+
if (alias2 !== null) {
|
|
111
|
+
ctx.aliases.set(alias2, tableName2);
|
|
112
|
+
}
|
|
113
|
+
if (!ctx.tables.has(tableName2)) {
|
|
114
|
+
resolveServiceTable(select, item, ctx);
|
|
115
|
+
}
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (!isBaseFrom(item)) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const { table: tableName, as: alias } = item;
|
|
122
|
+
if (alias !== null) {
|
|
123
|
+
ctx.aliases.set(alias, tableName);
|
|
124
|
+
}
|
|
125
|
+
if (ctx.tables.has(tableName)) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
resolveServiceTable(select, item, ctx);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function extractUnnestMappings(select) {
|
|
132
|
+
const mappings = [];
|
|
133
|
+
for (const item of fromClauseItems(select)) {
|
|
134
|
+
if (!isUnnestFrom(item)) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const fromColumn = typeof item.expr.column === "string" ? item.expr.column : void 0;
|
|
138
|
+
assert.ok(fromColumn !== void 0, "UNNEST expr must be a column_ref with a string column name");
|
|
139
|
+
const aliasArgs = item.as?.args.value ?? [];
|
|
140
|
+
const toColumns = [];
|
|
141
|
+
for (const col of aliasArgs) {
|
|
142
|
+
if (typeof col.column === "string") {
|
|
143
|
+
toColumns.push(col.column);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
assert.ok(toColumns.length > 0, "UNNEST alias must have at least one column name");
|
|
147
|
+
mappings.push({ fromColumn, toColumns, ast: item.expr });
|
|
148
|
+
}
|
|
149
|
+
return mappings;
|
|
150
|
+
}
|
|
151
|
+
function applyUnnestPre(mappings, ctx) {
|
|
152
|
+
const deferred = [];
|
|
153
|
+
for (const { fromColumn, toColumns, ast } of mappings) {
|
|
154
|
+
const ownerTable = [...ctx.tables.values()].flat().find((table) => table.columns.has(fromColumn));
|
|
155
|
+
if (ownerTable === void 0) {
|
|
156
|
+
deferred.push({ fromColumn, toColumns, ast });
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const sourceColumns = ownerTable.columns.get(fromColumn) ?? [];
|
|
160
|
+
const sourceSchema = sourceColumns[0]?.schema;
|
|
161
|
+
const unnestTableName = `${ownerTable.name ?? "<anonymous>"}:<unnested>`;
|
|
162
|
+
const apiOperation = ownerTable.apiOperation !== void 0 ? { apiOperation: ownerTable.apiOperation } : {};
|
|
163
|
+
if (sourceSchema?.type === "array") {
|
|
164
|
+
const [toColumn] = toColumns;
|
|
165
|
+
assert.ok(toColumn !== void 0);
|
|
166
|
+
ctx.tables.set(unnestTableName, [
|
|
167
|
+
{
|
|
168
|
+
name: unnestTableName,
|
|
169
|
+
...apiOperation,
|
|
170
|
+
columns: /* @__PURE__ */ new Map([[toColumn, [resolvedCol(toColumn, sourceSchema.items, sourceColumns[0]?.ast)]]])
|
|
171
|
+
}
|
|
172
|
+
]);
|
|
173
|
+
} else if (sourceSchema?.type === "object") {
|
|
174
|
+
const [keyColumn, valueColumn] = toColumns;
|
|
175
|
+
assert.ok(
|
|
176
|
+
keyColumn !== void 0 && valueColumn !== void 0,
|
|
177
|
+
`UNNEST of map column '${fromColumn}' requires exactly two alias columns (key, value)`
|
|
178
|
+
);
|
|
179
|
+
const addlProps = sourceSchema["additionalProperties"];
|
|
180
|
+
const valueSchema = typeof addlProps === "object" && addlProps !== null ? addlProps : { type: "string" };
|
|
181
|
+
ctx.tables.set(unnestTableName, [
|
|
182
|
+
{
|
|
183
|
+
name: unnestTableName,
|
|
184
|
+
...apiOperation,
|
|
185
|
+
columns: /* @__PURE__ */ new Map([
|
|
186
|
+
[keyColumn, [resolvedCol(keyColumn, { type: "string" }, sourceColumns[0]?.ast)]],
|
|
187
|
+
[valueColumn, [resolvedCol(valueColumn, valueSchema, sourceColumns[0]?.ast)]]
|
|
188
|
+
])
|
|
189
|
+
}
|
|
190
|
+
]);
|
|
191
|
+
} else {
|
|
192
|
+
throw new AthenaError(
|
|
193
|
+
ATHENA_ERROR,
|
|
194
|
+
`UNNEST source column '${fromColumn}' must resolve to an array or map schema`,
|
|
195
|
+
ast
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return deferred;
|
|
200
|
+
}
|
|
201
|
+
function applyUnnestPost(mappings, columns) {
|
|
202
|
+
for (const { fromColumn, toColumns, ast } of mappings) {
|
|
203
|
+
const sourceColumns = columns.get(fromColumn);
|
|
204
|
+
if (sourceColumns === void 0) {
|
|
205
|
+
throw new AthenaError(ATHENA_ERROR, `UNNEST source column '${fromColumn}' not found in SELECT`, ast);
|
|
206
|
+
}
|
|
207
|
+
const sourceSchema = sourceColumns[0]?.schema;
|
|
208
|
+
if (sourceSchema?.type === "array") {
|
|
209
|
+
const [toColumn] = toColumns;
|
|
210
|
+
assert.ok(toColumn !== void 0);
|
|
211
|
+
columns.set(toColumn, [resolvedCol(toColumn, sourceSchema.items, sourceColumns[0]?.ast)]);
|
|
212
|
+
} else if (sourceSchema?.type === "object") {
|
|
213
|
+
const [keyColumn, valueColumn] = toColumns;
|
|
214
|
+
assert.ok(
|
|
215
|
+
keyColumn !== void 0 && valueColumn !== void 0,
|
|
216
|
+
`UNNEST of map column '${fromColumn}' requires exactly two alias columns (key, value)`
|
|
217
|
+
);
|
|
218
|
+
const addlProps = sourceSchema["additionalProperties"];
|
|
219
|
+
const valueSchema = typeof addlProps === "object" && addlProps !== null ? addlProps : { type: "string" };
|
|
220
|
+
columns.set(keyColumn, [resolvedCol(keyColumn, { type: "string" }, sourceColumns[0]?.ast)]);
|
|
221
|
+
columns.set(valueColumn, [resolvedCol(valueColumn, valueSchema, sourceColumns[0]?.ast)]);
|
|
222
|
+
} else {
|
|
223
|
+
throw new AthenaError(
|
|
224
|
+
ATHENA_ERROR,
|
|
225
|
+
`UNNEST source column '${fromColumn}' must resolve to an array or map schema`,
|
|
226
|
+
ast
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function resolveDefaultSchemaColumn(columnAlias, indexedName, columnAST, columns) {
|
|
232
|
+
const name = columnAlias ?? indexedName;
|
|
233
|
+
columns.set(name, [resolvedCol(name, { type: "string" }, columnAST)]);
|
|
234
|
+
}
|
|
235
|
+
function expandWildcard(referencedTables, columns) {
|
|
236
|
+
for (const table of referencedTables) {
|
|
237
|
+
for (const [colName, cols] of table.columns) {
|
|
238
|
+
columns.set(colName, cols);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function schemaPropertyHint(resolvedColumns) {
|
|
243
|
+
if (resolvedColumns.length === 0) {
|
|
244
|
+
return "";
|
|
245
|
+
}
|
|
246
|
+
const first = JSON.stringify(resolvedColumns[0]?.schema);
|
|
247
|
+
if (!resolvedColumns.every((col) => JSON.stringify(col.schema) === first)) {
|
|
248
|
+
return "";
|
|
249
|
+
}
|
|
250
|
+
const schema = resolvedColumns[0]?.schema;
|
|
251
|
+
if (schema?.type !== "object") {
|
|
252
|
+
return "";
|
|
253
|
+
}
|
|
254
|
+
const properties = schema.properties;
|
|
255
|
+
if (properties === void 0) {
|
|
256
|
+
return "";
|
|
257
|
+
}
|
|
258
|
+
const propNames = Object.keys(properties);
|
|
259
|
+
return propNames.length > 0 ? `; available properties: ${propNames.join(", ")}` : "";
|
|
260
|
+
}
|
|
261
|
+
function resolveSchemaAtPath(colRef, propertyAccessor, resolvedColumns, ast) {
|
|
262
|
+
const adjustedPath = `$.${propertyAccessor.substring(1).replace(/(\.|\[)/gu, "..properties$1")}`;
|
|
263
|
+
log("adjusted path", adjustedPath);
|
|
264
|
+
const extractedSchemas = resolvedColumns.flatMap(
|
|
265
|
+
(col) => JSONPath({ json: col.schema, path: adjustedPath })
|
|
266
|
+
);
|
|
267
|
+
log("extracted schemas", extractedSchemas);
|
|
268
|
+
if (extractedSchemas.length === 0) {
|
|
269
|
+
throw new AthenaError(
|
|
270
|
+
ATHENA_ERROR,
|
|
271
|
+
`property not found ${colRef} - ${propertyAccessor}${schemaPropertyHint(resolvedColumns)}`,
|
|
272
|
+
ast
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
return extractedSchemas;
|
|
276
|
+
}
|
|
277
|
+
function navigateSchemaPath(colRef, propertyAccessor, resolvedColumns, colName, columnAST, columns) {
|
|
278
|
+
const errorAst = extractJsonExtractCalls(columnAST)[0]?.fnNode ?? columnAST;
|
|
279
|
+
const extractedSchemas = resolveSchemaAtPath(colRef, propertyAccessor, resolvedColumns, errorAst);
|
|
280
|
+
columns.set(
|
|
281
|
+
colName,
|
|
282
|
+
extractedSchemas.map((schema) => resolvedCol(colName, schema, columnAST))
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
function lookupColumnOrThrow(colRef, ref, referencedTables) {
|
|
286
|
+
const resolvedColumns = referencedTables.flatMap((table) => table.columns.get(colRef) ?? []);
|
|
287
|
+
if (resolvedColumns.length === 0) {
|
|
288
|
+
const tableNames = [
|
|
289
|
+
...new Set(referencedTables.map((referenceTable) => referenceTable.name ?? "<anonymous>"))
|
|
290
|
+
].join(", ");
|
|
291
|
+
const availableCols = [...new Set(referencedTables.flatMap((table) => [...table.columns.keys()]))].join(", ");
|
|
292
|
+
throw new AthenaError(
|
|
293
|
+
ATHENA_ERROR,
|
|
294
|
+
`can't found column ${colRef} in tables: ${tableNames}; available columns: ${availableCols}`,
|
|
295
|
+
ref
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
return resolvedColumns;
|
|
299
|
+
}
|
|
300
|
+
function checkColumnRefsExist(ast, allTables, ctx, selectColumns) {
|
|
301
|
+
if (containsLambda(ast)) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
for (const ref of extractColumnRefs(ast)) {
|
|
305
|
+
const colRef = typeof ref.column === "string" ? ref.column : void 0;
|
|
306
|
+
if (colRef === void 0 || colRef === "*") {
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
const tableRef = ref.table ?? void 0;
|
|
310
|
+
if (tableRef === void 0 && selectColumns?.has(colRef) === true) {
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
const referencedTables = tableRef !== void 0 ? lookupTables(tableRef, ctx) : allTables;
|
|
314
|
+
if (referencedTables.length === 0) {
|
|
315
|
+
throw new AthenaError(
|
|
316
|
+
ATHENA_ERROR,
|
|
317
|
+
`unknown table or alias '${tableRef ?? colRef}'; known tables: ${[...ctx.tables.keys()].join(", ")}`,
|
|
318
|
+
ref
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
lookupColumnOrThrow(colRef, ref, referencedTables);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
function validateComplexColumnExpression(columnAST, allTables, ctx) {
|
|
325
|
+
for (const { ref, path, fnNode } of extractJsonExtractCalls(columnAST)) {
|
|
326
|
+
const tableRef = ref.table ?? void 0;
|
|
327
|
+
const colRef = typeof ref.column === "string" ? ref.column : void 0;
|
|
328
|
+
if (colRef === void 0) {
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
const referencedTables = tableRef !== void 0 ? lookupTables(tableRef, ctx) : allTables;
|
|
332
|
+
const resolvedColumns = referencedTables.flatMap((table) => table.columns.get(colRef) ?? []);
|
|
333
|
+
if (resolvedColumns.length > 0) {
|
|
334
|
+
resolveSchemaAtPath(colRef, path, resolvedColumns, fnNode);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
function resolveSingleColumnRef(columnAST, columnAlias, indexedName, ref, allTables, ctx, columns) {
|
|
339
|
+
const tableRef = ref.table ?? void 0;
|
|
340
|
+
const colRef = typeof ref.column === "string" ? ref.column : void 0;
|
|
341
|
+
assert.ok(colRef !== void 0, "column_ref must have a string column name");
|
|
342
|
+
const referencedTables = tableRef !== void 0 ? lookupTables(tableRef, ctx) : allTables;
|
|
343
|
+
if (referencedTables.length === 0) {
|
|
344
|
+
const tableNames = [...ctx.tables.keys()].join(", ");
|
|
345
|
+
throw new AthenaError(
|
|
346
|
+
ATHENA_ERROR,
|
|
347
|
+
`unknown table or alias '${tableRef ?? colRef}'; known tables: ${tableNames}`,
|
|
348
|
+
ref
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
if (colRef === "*") {
|
|
352
|
+
expandWildcard(referencedTables, columns);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
const withFunctions = hasFunctionCalls(columnAST);
|
|
356
|
+
const colName = columnAlias ?? (withFunctions ? indexedName : colRef);
|
|
357
|
+
const resolvedColumns = lookupColumnOrThrow(colRef, ref, referencedTables);
|
|
358
|
+
const propertyAccessor = extractJsonExtractPath(columnAST) ?? extractBracketAccessorPath(columnAST);
|
|
359
|
+
if (propertyAccessor !== void 0) {
|
|
360
|
+
navigateSchemaPath(colRef, propertyAccessor, resolvedColumns, colName, columnAST, columns);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
columns.set(
|
|
364
|
+
colName,
|
|
365
|
+
resolvedColumns.map((col) => resolvedCol(colName, col.schema, columnAST))
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
function resolveSelectColumns(select, ctx) {
|
|
369
|
+
const allTables = [...ctx.tables.values()].flat();
|
|
370
|
+
const columns = /* @__PURE__ */ new Map();
|
|
371
|
+
for (const [index, columnAST] of select.columns.entries()) {
|
|
372
|
+
log("resolving column", columnAST);
|
|
373
|
+
const columnAlias = columnAST.as ?? null;
|
|
374
|
+
const indexedName = `_col${String(index)}`;
|
|
375
|
+
const columnRefs = extractColumnRefs(columnAST);
|
|
376
|
+
if (columnRefs.length !== 1) {
|
|
377
|
+
checkColumnRefsExist(columnAST, allTables, ctx);
|
|
378
|
+
validateComplexColumnExpression(columnAST, allTables, ctx);
|
|
379
|
+
resolveDefaultSchemaColumn(columnAlias, indexedName, columnAST, columns);
|
|
380
|
+
} else {
|
|
381
|
+
const [ref] = columnRefs;
|
|
382
|
+
assert.ok(ref !== void 0);
|
|
383
|
+
resolveSingleColumnRef(columnAST, columnAlias, indexedName, ref, allTables, ctx, columns);
|
|
384
|
+
}
|
|
385
|
+
if (containsCastToArray(columnAST)) {
|
|
386
|
+
const colName = columnAlias ?? indexedName;
|
|
387
|
+
const existing = columns.get(colName);
|
|
388
|
+
if (existing !== void 0 && existing[0]?.schema.type !== "array") {
|
|
389
|
+
columns.set(
|
|
390
|
+
colName,
|
|
391
|
+
existing.map((col) => resolvedCol(col.name, { type: "array" }, col.ast))
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
if (containsCastToMap(columnAST)) {
|
|
396
|
+
const colName = columnAlias ?? indexedName;
|
|
397
|
+
const existing = columns.get(colName);
|
|
398
|
+
if (existing !== void 0 && existing[0]?.schema.type !== "object") {
|
|
399
|
+
columns.set(
|
|
400
|
+
colName,
|
|
401
|
+
existing.map((col) => resolvedCol(col.name, { type: "object" }, col.ast))
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return columns;
|
|
407
|
+
}
|
|
408
|
+
function checkSelect(selectAST, ctx, withTableName) {
|
|
409
|
+
const select = "stmt" in selectAST ? selectAST.stmt.ast : selectAST;
|
|
410
|
+
const selectCtx = createChildContext(ctx);
|
|
411
|
+
resolveFromClause(select, selectCtx);
|
|
412
|
+
restrictToFromClause(select, selectCtx);
|
|
413
|
+
const unnestMappings = extractUnnestMappings(select);
|
|
414
|
+
const deferredUnnest = applyUnnestPre(unnestMappings, selectCtx);
|
|
415
|
+
const columns = resolveSelectColumns(select, selectCtx);
|
|
416
|
+
applyUnnestPost(deferredUnnest, columns);
|
|
417
|
+
log("resolved columns", [...columns.keys()]);
|
|
418
|
+
const allTables = [...selectCtx.tables.values()].flat();
|
|
419
|
+
for (const item of fromClauseItems(select)) {
|
|
420
|
+
const onExpr = item.on;
|
|
421
|
+
if (onExpr !== void 0) {
|
|
422
|
+
checkColumnRefsExist(onExpr, allTables, selectCtx);
|
|
423
|
+
validateComplexColumnExpression(onExpr, allTables, selectCtx);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
if (select.where !== null) {
|
|
427
|
+
checkColumnRefsExist(select.where, allTables, selectCtx);
|
|
428
|
+
validateComplexColumnExpression(select.where, allTables, selectCtx);
|
|
429
|
+
}
|
|
430
|
+
if (select.having !== null) {
|
|
431
|
+
checkColumnRefsExist(select.having, allTables, selectCtx, columns);
|
|
432
|
+
validateComplexColumnExpression(select.having, allTables, selectCtx);
|
|
433
|
+
}
|
|
434
|
+
for (const orderItem of select.orderby ?? []) {
|
|
435
|
+
checkColumnRefsExist(orderItem.expr, allTables, selectCtx, columns);
|
|
436
|
+
validateComplexColumnExpression(orderItem.expr, allTables, selectCtx);
|
|
437
|
+
}
|
|
438
|
+
if (select.groupby?.columns !== void 0) {
|
|
439
|
+
for (const groupCol of select.groupby.columns) {
|
|
440
|
+
checkColumnRefsExist(groupCol, allTables, selectCtx, columns);
|
|
441
|
+
validateComplexColumnExpression(groupCol, allTables, selectCtx);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
if (select._next !== void 0) {
|
|
445
|
+
const nextColumns = checkSelect(select._next, ctx, withTableName);
|
|
446
|
+
const currentNumberOfKeys = columns.size;
|
|
447
|
+
const nextNumberOfKeys = nextColumns.size;
|
|
448
|
+
if (currentNumberOfKeys !== nextNumberOfKeys) {
|
|
449
|
+
throw new AthenaError(
|
|
450
|
+
ATHENA_ERROR,
|
|
451
|
+
`UNION ALL parts have different number of columns: ${currentNumberOfKeys.toString()} vs ${nextNumberOfKeys.toString()}`,
|
|
452
|
+
select._next
|
|
453
|
+
);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
if (withTableName !== void 0) {
|
|
457
|
+
const resolvedTable = { name: withTableName, columns };
|
|
458
|
+
ctx.tables.set(withTableName, [resolvedTable]);
|
|
459
|
+
}
|
|
460
|
+
return columns;
|
|
461
|
+
}
|
|
462
|
+
function checkAthenaAst(ast, ctx) {
|
|
463
|
+
assert.ok(ast.type === "select");
|
|
464
|
+
const select = ast;
|
|
465
|
+
if (select.with !== null) {
|
|
466
|
+
for (const withItem of select.with) {
|
|
467
|
+
checkSelect(withItem.stmt.ast, ctx, withItem.name.value);
|
|
468
|
+
}
|
|
469
|
+
select.with = null;
|
|
470
|
+
}
|
|
471
|
+
checkSelect(select, ctx);
|
|
472
|
+
}
|
|
473
|
+
export {
|
|
474
|
+
ATHENA_ERROR,
|
|
475
|
+
AthenaError,
|
|
476
|
+
SYNTEXT_ERROR,
|
|
477
|
+
checkAthenaAst,
|
|
478
|
+
offsetToLoc
|
|
479
|
+
};
|
|
480
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS92YWxpZGF0ZS50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFVQSxTQUFTLFVBQVUsY0FBYztBQUVqQyxPQUFPLFdBQVc7QUFDbEIsU0FBUyxnQkFBZ0I7QUFJekIsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUywwQkFBc0Y7QUFDL0YsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRUEsSUFBTSxnQkFBZ0I7QUFDdEIsSUFBTSxlQUFlO0FBRXJCLElBQU0sY0FBTixjQUEwQixNQUFNO0FBQUEsRUFDOUI7QUFBQSxFQUNBO0FBQUEsRUFDUCxZQUFZLE1BQWMsU0FBaUIsS0FBYztBQUN2RCxVQUFNLE9BQU87QUFDYixTQUFLLE9BQU87QUFDWixTQUFLLE9BQU87QUFDWixRQUFJLFFBQVEsUUFBVztBQUNyQixXQUFLLE1BQU07QUFBQSxJQUNiO0FBQUEsRUFDRjtBQUNGO0FBR08sU0FBUyxZQUFZLE1BQWMsUUFBa0Q7QUFDMUYsUUFBTSxTQUFTLEtBQUssTUFBTSxHQUFHLE1BQU07QUFDbkMsUUFBTSxRQUFRLE9BQU8sTUFBTSxJQUFJO0FBQy9CLFNBQU8sRUFBRSxNQUFNLE1BQU0sUUFBUSxRQUFRLE1BQU0sTUFBTSxTQUFTLENBQUMsR0FBRyxVQUFVLEVBQUU7QUFDNUU7QUFFQSxJQUFNLE1BQU0sTUFBTSxzQkFBc0I7QUFNeEMsU0FBUyxZQUFZLE1BQWMsUUFBc0IsS0FBOEI7QUFDckYsU0FBTyxRQUFRLFNBQVksRUFBRSxNQUFNLFFBQVEsSUFBSSxJQUFJLEVBQUUsTUFBTSxPQUFPO0FBQ3BFO0FBRUEsU0FBUyxjQUFjLGFBQXFCLEtBQW1CO0FBQzdELE1BQUksVUFBVSxJQUFJLFdBQVcsSUFBSSxXQUFXO0FBQzVDLE1BQUksWUFBWSxRQUFXO0FBQ3pCLGNBQVUsVUFBVSxXQUFXO0FBQy9CLFFBQUksV0FBVyxJQUFJLGFBQWEsT0FBTztBQUFBLEVBQ3pDO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyxhQUFhLGFBQXFCLEtBQW9DO0FBQzdFLFFBQU0sWUFBWSxJQUFJLFFBQVEsSUFBSSxXQUFXLEtBQUs7QUFDbEQsU0FBTyxJQUFJLE9BQU8sSUFBSSxTQUFTLEtBQUssQ0FBQztBQUN2QztBQUVBLFNBQVMsZ0JBQWdCLFFBQXdCO0FBQy9DLE1BQUksTUFBTSxRQUFRLE9BQU8sSUFBSSxHQUFHO0FBQzlCLFdBQU8sT0FBTztBQUFBLEVBQ2hCO0FBQ0EsTUFBSSxPQUFPLFNBQVMsTUFBTTtBQUN4QixXQUFPLENBQUMsT0FBTyxJQUFJO0FBQUEsRUFDckI7QUFDQSxTQUFPLENBQUM7QUFDVjtBQU1BLFNBQVMsb0JBQW9CLFFBQWdCLE1BQWdCLEtBQXlCO0FBQ3BGLFFBQU0sRUFBRSxPQUFPLFVBQVUsSUFBSTtBQUM3QixNQUFJO0FBQ0YsVUFBTSxhQUFhLGNBQWMsV0FBVyxHQUFHO0FBQy9DLFFBQUksV0FBVyxXQUFXLEdBQUc7QUFDM0IsWUFBTSxJQUFJLFlBQVksY0FBYyx1QkFBdUIsU0FBUyxpQ0FBaUMsSUFBSTtBQUFBLElBQzNHO0FBQ0EsVUFBTSxhQUFhLFNBQVMsUUFBUSxNQUFNLFVBQVUsS0FBSyxDQUFDO0FBQzFELFFBQUksT0FBTyxJQUFJLFdBQVcsbUJBQW1CLFdBQVcsVUFBVSxDQUFDO0FBQUEsRUFDckUsU0FBUyxPQUFPO0FBQ2QsUUFBSSxpQkFBaUIsYUFBYTtBQUNoQyxZQUFNO0FBQUEsSUFDUjtBQUNBLFVBQU0sSUFBSSxZQUFZLGNBQWMsaUJBQWlCLFFBQVEsTUFBTSxVQUFVLE9BQU8sS0FBSyxHQUFHLElBQUk7QUFBQSxFQUNsRztBQUNGO0FBRUEsU0FBUyxxQkFBcUIsUUFBZ0IsS0FBeUI7QUFDckUsUUFBTSxZQUFZLG9CQUFJLElBQVk7QUFDbEMsYUFBVyxRQUFRLGdCQUFnQixNQUFNLEdBQUc7QUFDMUMsUUFBSSxXQUFXLElBQUksS0FBSyxPQUFPLElBQUksR0FBRztBQUNwQyxnQkFBVSxJQUFJLEtBQUssS0FBSztBQUFBLElBQzFCLFdBQVcsWUFBWSxJQUFJLEdBQUc7QUFDNUIsZ0JBQVUsSUFBSSxPQUFPLEtBQUssT0FBTyxXQUFXLEtBQUssS0FBSyxZQUFZO0FBQUEsSUFDcEU7QUFBQSxFQUNGO0FBQ0EsYUFBVyxRQUFRLENBQUMsR0FBRyxJQUFJLE9BQU8sS0FBSyxDQUFDLEdBQUc7QUFDekMsUUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEdBQUc7QUFDeEIsVUFBSSxPQUFPLE9BQU8sSUFBSTtBQUFBLElBQ3hCO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxrQkFBa0IsUUFBZ0IsS0FBeUI7QUFDbEUsYUFBVyxRQUFRLGdCQUFnQixNQUFNLEdBQUc7QUFDMUMsUUFBSSxhQUFhLElBQUksR0FBRztBQUN0QjtBQUFBLElBQ0Y7QUFFQSxRQUFJLFlBQVksSUFBSSxHQUFHO0FBQ3JCLFlBQU1BLFNBQVEsT0FBTyxLQUFLLE9BQU8sV0FBVyxLQUFLLEtBQUs7QUFFdEQsa0JBQVksS0FBSyxLQUFLLEtBQUssS0FBS0EsTUFBSztBQUNyQztBQUFBLElBQ0Y7QUFFQSxRQUFJLE9BQU8sSUFBSSxHQUFHO0FBQ2hCLFlBQU0sRUFBRSxPQUFPQyxZQUFXLElBQUlELE9BQU0sSUFBSTtBQUN4QyxVQUFJQSxXQUFVLE1BQU07QUFDbEIsWUFBSSxRQUFRLElBQUlBLFFBQU9DLFVBQVM7QUFBQSxNQUNsQztBQUNBLFVBQUksQ0FBQyxJQUFJLE9BQU8sSUFBSUEsVUFBUyxHQUFHO0FBQzlCLDRCQUFvQixRQUFRLE1BQU0sR0FBRztBQUFBLE1BQ3ZDO0FBQ0E7QUFBQSxJQUNGO0FBRUEsUUFBSSxDQUFDLFdBQVcsSUFBSSxHQUFHO0FBQ3JCO0FBQUEsSUFDRjtBQUVBLFVBQU0sRUFBRSxPQUFPLFdBQVcsSUFBSSxNQUFNLElBQUk7QUFFeEMsUUFBSSxVQUFVLE1BQU07QUFDbEIsVUFBSSxRQUFRLElBQUksT0FBTyxTQUFTO0FBQUEsSUFDbEM7QUFFQSxRQUFJLElBQUksT0FBTyxJQUFJLFNBQVMsR0FBRztBQUM3QjtBQUFBLElBQ0Y7QUFFQSx3QkFBb0IsUUFBUSxNQUFNLEdBQUc7QUFBQSxFQUN2QztBQUNGO0FBWUEsU0FBUyxzQkFBc0IsUUFBaUM7QUFDOUQsUUFBTSxXQUE0QixDQUFDO0FBRW5DLGFBQVcsUUFBUSxnQkFBZ0IsTUFBTSxHQUFHO0FBQzFDLFFBQUksQ0FBQyxhQUFhLElBQUksR0FBRztBQUN2QjtBQUFBLElBQ0Y7QUFFQSxVQUFNLGFBQWEsT0FBTyxLQUFLLEtBQUssV0FBVyxXQUFXLEtBQUssS0FBSyxTQUFTO0FBQzdFLFdBQU8sR0FBRyxlQUFlLFFBQVcsNERBQTREO0FBRWhHLFVBQU0sWUFBWSxLQUFLLElBQUksS0FBSyxTQUFTLENBQUM7QUFDMUMsVUFBTSxZQUFzQixDQUFDO0FBQzdCLGVBQVcsT0FBTyxXQUFXO0FBQzNCLFVBQUksT0FBUSxJQUE2QixXQUFXLFVBQVU7QUFDNUQsa0JBQVUsS0FBTSxJQUEyQixNQUFNO0FBQUEsTUFDbkQ7QUFBQSxJQUNGO0FBQ0EsV0FBTyxHQUFHLFVBQVUsU0FBUyxHQUFHLGlEQUFpRDtBQUVqRixhQUFTLEtBQUssRUFBRSxZQUFZLFdBQVcsS0FBSyxLQUFLLEtBQUssQ0FBQztBQUFBLEVBQ3pEO0FBRUEsU0FBTztBQUNUO0FBRUEsU0FBUyxlQUFlLFVBQTJCLEtBQW9DO0FBQ3JGLFFBQU0sV0FBNEIsQ0FBQztBQUVuQyxhQUFXLEVBQUUsWUFBWSxXQUFXLElBQUksS0FBSyxVQUFVO0FBQ3JELFVBQU0sYUFBYSxDQUFDLEdBQUcsSUFBSSxPQUFPLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxNQUFNLFFBQVEsSUFBSSxVQUFVLENBQUM7QUFFaEcsUUFBSSxlQUFlLFFBQVc7QUFDNUIsZUFBUyxLQUFLLEVBQUUsWUFBWSxXQUFXLElBQUksQ0FBQztBQUM1QztBQUFBLElBQ0Y7QUFFQSxVQUFNLGdCQUFnQixXQUFXLFFBQVEsSUFBSSxVQUFVLEtBQUssQ0FBQztBQUM3RCxVQUFNLGVBQWUsY0FBYyxDQUFDLEdBQUc7QUFDdkMsVUFBTSxrQkFBa0IsR0FBRyxXQUFXLFFBQVEsYUFBYTtBQUMzRCxVQUFNLGVBQWUsV0FBVyxpQkFBaUIsU0FBWSxFQUFFLGNBQWMsV0FBVyxhQUFhLElBQUksQ0FBQztBQUUxRyxRQUFJLGNBQWMsU0FBUyxTQUFTO0FBQ2xDLFlBQU0sQ0FBQyxRQUFRLElBQUk7QUFDbkIsYUFBTyxHQUFHLGFBQWEsTUFBUztBQUNoQyxVQUFJLE9BQU8sSUFBSSxpQkFBaUI7QUFBQSxRQUM5QjtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sR0FBRztBQUFBLFVBQ0gsU0FBUyxvQkFBSSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxVQUFVLGFBQWEsT0FBTyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFBQSxRQUNuRztBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0gsV0FBVyxjQUFjLFNBQVMsVUFBVTtBQUMxQyxZQUFNLENBQUMsV0FBVyxXQUFXLElBQUk7QUFDakMsYUFBTztBQUFBLFFBQ0wsY0FBYyxVQUFhLGdCQUFnQjtBQUFBLFFBQzNDLHlCQUF5QixVQUFVO0FBQUEsTUFDckM7QUFDQSxZQUFNLFlBQWEsYUFBOEIsc0JBQXNCO0FBQ3ZFLFlBQU0sY0FDSixPQUFPLGNBQWMsWUFBWSxjQUFjLE9BQU8sWUFBWSxFQUFFLE1BQU0sU0FBUztBQUNyRixVQUFJLE9BQU8sSUFBSSxpQkFBaUI7QUFBQSxRQUM5QjtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sR0FBRztBQUFBLFVBQ0gsU0FBUyxvQkFBSSxJQUFJO0FBQUEsWUFDZixDQUFDLFdBQVcsQ0FBQyxZQUFZLFdBQVcsRUFBRSxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUFBLFlBQy9FLENBQUMsYUFBYSxDQUFDLFlBQVksYUFBYSxhQUFhLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUEsVUFDOUUsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNILE9BQU87QUFDTCxZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsUUFDQSx5QkFBeUIsVUFBVTtBQUFBLFFBQ25DO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBRUEsU0FBUyxnQkFBZ0IsVUFBMkIsU0FBOEM7QUFDaEcsYUFBVyxFQUFFLFlBQVksV0FBVyxJQUFJLEtBQUssVUFBVTtBQUNyRCxVQUFNLGdCQUFnQixRQUFRLElBQUksVUFBVTtBQUM1QyxRQUFJLGtCQUFrQixRQUFXO0FBQy9CLFlBQU0sSUFBSSxZQUFZLGNBQWMseUJBQXlCLFVBQVUseUJBQXlCLEdBQUc7QUFBQSxJQUNyRztBQUNBLFVBQU0sZUFBZSxjQUFjLENBQUMsR0FBRztBQUV2QyxRQUFJLGNBQWMsU0FBUyxTQUFTO0FBQ2xDLFlBQU0sQ0FBQyxRQUFRLElBQUk7QUFDbkIsYUFBTyxHQUFHLGFBQWEsTUFBUztBQUNoQyxjQUFRLElBQUksVUFBVSxDQUFDLFlBQVksVUFBVSxhQUFhLE9BQU8sY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFBQSxJQUMxRixXQUFXLGNBQWMsU0FBUyxVQUFVO0FBQzFDLFlBQU0sQ0FBQyxXQUFXLFdBQVcsSUFBSTtBQUNqQyxhQUFPO0FBQUEsUUFDTCxjQUFjLFVBQWEsZ0JBQWdCO0FBQUEsUUFDM0MseUJBQXlCLFVBQVU7QUFBQSxNQUNyQztBQUNBLFlBQU0sWUFBYSxhQUE4QixzQkFBc0I7QUFDdkUsWUFBTSxjQUNKLE9BQU8sY0FBYyxZQUFZLGNBQWMsT0FBTyxZQUFZLEVBQUUsTUFBTSxTQUFTO0FBQ3JGLGNBQVEsSUFBSSxXQUFXLENBQUMsWUFBWSxXQUFXLEVBQUUsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUYsY0FBUSxJQUFJLGFBQWEsQ0FBQyxZQUFZLGFBQWEsYUFBYSxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUFBLElBQ3pGLE9BQU87QUFDTCxZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsUUFDQSx5QkFBeUIsVUFBVTtBQUFBLFFBQ25DO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFNQSxTQUFTLDJCQUNQLGFBQ0EsYUFDQSxXQUNBLFNBQ007QUFDTixRQUFNLE9BQU8sZUFBZTtBQUM1QixVQUFRLElBQUksTUFBTSxDQUFDLFlBQVksTUFBTSxFQUFFLE1BQU0sU0FBUyxHQUFHLFNBQW1CLENBQUMsQ0FBQztBQUNoRjtBQUVBLFNBQVMsZUFBZSxrQkFBbUMsU0FBOEM7QUFDdkcsYUFBVyxTQUFTLGtCQUFrQjtBQUNwQyxlQUFXLENBQUMsU0FBUyxJQUFJLEtBQUssTUFBTSxTQUFTO0FBQzNDLGNBQVEsSUFBSSxTQUFTLElBQUk7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsbUJBQW1CLGlCQUEyQztBQUNyRSxNQUFJLGdCQUFnQixXQUFXLEdBQUc7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLFFBQVEsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEdBQUcsTUFBTTtBQUN2RCxNQUFJLENBQUMsZ0JBQWdCLE1BQU0sQ0FBQyxRQUFRLEtBQUssVUFBVSxJQUFJLE1BQU0sTUFBTSxLQUFLLEdBQUc7QUFDekUsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLFNBQVMsZ0JBQWdCLENBQUMsR0FBRztBQUNuQyxNQUFJLFFBQVEsU0FBUyxVQUFVO0FBQzdCLFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxhQUFhLE9BQU87QUFDMUIsTUFBSSxlQUFlLFFBQVc7QUFDNUIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLFlBQVksT0FBTyxLQUFLLFVBQVU7QUFDeEMsU0FBTyxVQUFVLFNBQVMsSUFBSSwyQkFBMkIsVUFBVSxLQUFLLElBQUksQ0FBQyxLQUFLO0FBQ3BGO0FBRUEsU0FBUyxvQkFDUCxRQUNBLGtCQUNBLGlCQUNBLEtBQ2dCO0FBR2hCLFFBQU0sZUFBZSxLQUFLLGlCQUFpQixVQUFVLENBQUMsRUFBRSxRQUFRLGFBQWEsZ0JBQWdCLENBQUM7QUFDOUYsTUFBSSxpQkFBaUIsWUFBWTtBQUVqQyxRQUFNLG1CQUFtQixnQkFBZ0I7QUFBQSxJQUFRLENBQUMsUUFDaEQsU0FBeUIsRUFBRSxNQUFNLElBQUksUUFBUSxNQUFNLGFBQWEsQ0FBQztBQUFBLEVBQ25FO0FBQ0EsTUFBSSxxQkFBcUIsZ0JBQWdCO0FBRXpDLE1BQUksaUJBQWlCLFdBQVcsR0FBRztBQUNqQyxVQUFNLElBQUk7QUFBQSxNQUNSO0FBQUEsTUFDQSxzQkFBc0IsTUFBTSxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixlQUFlLENBQUM7QUFBQSxNQUN4RjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyxtQkFDUCxRQUNBLGtCQUNBLGlCQUNBLFNBQ0EsV0FDQSxTQUNNO0FBQ04sUUFBTSxXQUFZLHdCQUF3QixTQUFTLEVBQUUsQ0FBQyxHQUFHLFVBQVU7QUFDbkUsUUFBTSxtQkFBbUIsb0JBQW9CLFFBQVEsa0JBQWtCLGlCQUFpQixRQUFRO0FBQ2hHLFVBQVE7QUFBQSxJQUNOO0FBQUEsSUFDQSxpQkFBaUIsSUFBSSxDQUFDLFdBQVcsWUFBWSxTQUFTLFFBQVEsU0FBbUIsQ0FBQztBQUFBLEVBQ3BGO0FBQ0Y7QUFNQSxTQUFTLG9CQUFvQixRQUFnQixLQUFhLGtCQUFxRDtBQUM3RyxRQUFNLGtCQUFrQixpQkFBaUIsUUFBUSxDQUFDLFVBQVUsTUFBTSxRQUFRLElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQztBQUMzRixNQUFJLGdCQUFnQixXQUFXLEdBQUc7QUFDaEMsVUFBTSxhQUFhO0FBQUEsTUFDakIsR0FBRyxJQUFJLElBQUksaUJBQWlCLElBQUksQ0FBQyxtQkFBbUIsZUFBZSxRQUFRLGFBQWEsQ0FBQztBQUFBLElBQzNGLEVBQUUsS0FBSyxJQUFJO0FBQ1gsVUFBTSxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksSUFBSSxpQkFBaUIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUk7QUFDNUcsVUFBTSxJQUFJO0FBQUEsTUFDUjtBQUFBLE1BQ0Esc0JBQXNCLE1BQU0sZUFBZSxVQUFVLHdCQUF3QixhQUFhO0FBQUEsTUFDMUY7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMscUJBQ1AsS0FDQSxXQUNBLEtBQ0EsZUFDTTtBQUNOLE1BQUksZUFBZSxHQUFHLEdBQUc7QUFDdkI7QUFBQSxFQUNGO0FBQ0EsYUFBVyxPQUFPLGtCQUFrQixHQUFHLEdBQUc7QUFDeEMsVUFBTSxTQUFTLE9BQU8sSUFBSSxXQUFXLFdBQVcsSUFBSSxTQUFTO0FBQzdELFFBQUksV0FBVyxVQUFhLFdBQVcsS0FBSztBQUMxQztBQUFBLElBQ0Y7QUFDQSxVQUFNLFdBQVcsSUFBSSxTQUFTO0FBQzlCLFFBQUksYUFBYSxVQUFhLGVBQWUsSUFBSSxNQUFNLE1BQU0sTUFBTTtBQUNqRTtBQUFBLElBQ0Y7QUFDQSxVQUFNLG1CQUFtQixhQUFhLFNBQVksYUFBYSxVQUFVLEdBQUcsSUFBSTtBQUNoRixRQUFJLGlCQUFpQixXQUFXLEdBQUc7QUFDakMsWUFBTSxJQUFJO0FBQUEsUUFDUjtBQUFBLFFBQ0EsMkJBQTJCLFlBQVksTUFBTSxvQkFBb0IsQ0FBQyxHQUFHLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQztBQUFBLFFBQ2xHO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFDQSx3QkFBb0IsUUFBUSxLQUFLLGdCQUFnQjtBQUFBLEVBQ25EO0FBQ0Y7QUFFQSxTQUFTLGdDQUFnQyxXQUFvQixXQUE0QixLQUF5QjtBQUNoSCxhQUFXLEVBQUUsS0FBSyxNQUFNLE9BQU8sS0FBSyx3QkFBd0IsU0FBUyxHQUFHO0FBQ3RFLFVBQU0sV0FBVyxJQUFJLFNBQVM7QUFDOUIsVUFBTSxTQUFTLE9BQU8sSUFBSSxXQUFXLFdBQVcsSUFBSSxTQUFTO0FBQzdELFFBQUksV0FBVyxRQUFXO0FBQ3hCO0FBQUEsSUFDRjtBQUNBLFVBQU0sbUJBQW1CLGFBQWEsU0FBWSxhQUFhLFVBQVUsR0FBRyxJQUFJO0FBQ2hGLFVBQU0sa0JBQWtCLGlCQUFpQixRQUFRLENBQUMsVUFBVSxNQUFNLFFBQVEsSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQzNGLFFBQUksZ0JBQWdCLFNBQVMsR0FBRztBQUM5QiwwQkFBb0IsUUFBUSxNQUFNLGlCQUFpQixNQUFNO0FBQUEsSUFDM0Q7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLHVCQUNQLFdBQ0EsYUFDQSxhQUNBLEtBQ0EsV0FDQSxLQUNBLFNBQ007QUFDTixRQUFNLFdBQVcsSUFBSSxTQUFTO0FBQzlCLFFBQU0sU0FBUyxPQUFPLElBQUksV0FBVyxXQUFXLElBQUksU0FBUztBQUM3RCxTQUFPLEdBQUcsV0FBVyxRQUFXLDJDQUEyQztBQUUzRSxRQUFNLG1CQUFtQixhQUFhLFNBQVksYUFBYSxVQUFVLEdBQUcsSUFBSTtBQUNoRixNQUFJLGlCQUFpQixXQUFXLEdBQUc7QUFDakMsVUFBTSxhQUFhLENBQUMsR0FBRyxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJO0FBQ25ELFVBQU0sSUFBSTtBQUFBLE1BQ1I7QUFBQSxNQUNBLDJCQUEyQixZQUFZLE1BQU0sb0JBQW9CLFVBQVU7QUFBQSxNQUMzRTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxXQUFXLEtBQUs7QUFDbEIsbUJBQWUsa0JBQWtCLE9BQU87QUFDeEM7QUFBQSxFQUNGO0FBRUEsUUFBTSxnQkFBZ0IsaUJBQWlCLFNBQVM7QUFDaEQsUUFBTSxVQUFVLGdCQUFnQixnQkFBZ0IsY0FBYztBQUM5RCxRQUFNLGtCQUFrQixvQkFBb0IsUUFBUSxLQUFLLGdCQUFnQjtBQUV6RSxRQUFNLG1CQUFtQix1QkFBdUIsU0FBUyxLQUFLLDJCQUEyQixTQUFTO0FBQ2xHLE1BQUkscUJBQXFCLFFBQVc7QUFDbEMsdUJBQW1CLFFBQVEsa0JBQWtCLGlCQUFpQixTQUFTLFdBQVcsT0FBTztBQUN6RjtBQUFBLEVBQ0Y7QUFFQSxVQUFRO0FBQUEsSUFDTjtBQUFBLElBQ0EsZ0JBQWdCLElBQUksQ0FBQyxRQUFRLFlBQVksU0FBUyxJQUFJLFFBQVEsU0FBbUIsQ0FBQztBQUFBLEVBQ3BGO0FBQ0Y7QUFFQSxTQUFTLHFCQUFxQixRQUFnQixLQUFrRDtBQUM5RixRQUFNLFlBQVksQ0FBQyxHQUFHLElBQUksT0FBTyxPQUFPLENBQUMsRUFBRSxLQUFLO0FBQ2hELFFBQU0sVUFBVSxvQkFBSSxJQUE4QjtBQUVsRCxhQUFXLENBQUMsT0FBTyxTQUFTLEtBQUssT0FBTyxRQUFRLFFBQVEsR0FBRztBQUN6RCxRQUFJLG9CQUFvQixTQUFTO0FBRWpDLFVBQU0sY0FBZSxVQUFxQyxNQUFNO0FBQ2hFLFVBQU0sY0FBYyxPQUFPLE9BQU8sS0FBSyxDQUFDO0FBQ3hDLFVBQU0sYUFBYSxrQkFBa0IsU0FBUztBQUU5QyxRQUFJLFdBQVcsV0FBVyxHQUFHO0FBQzNCLDJCQUFxQixXQUFXLFdBQVcsR0FBRztBQUM5QyxzQ0FBZ0MsV0FBVyxXQUFXLEdBQUc7QUFDekQsaUNBQTJCLGFBQWEsYUFBYSxXQUFXLE9BQU87QUFBQSxJQUN6RSxPQUFPO0FBQ0wsWUFBTSxDQUFDLEdBQUcsSUFBSTtBQUNkLGFBQU8sR0FBRyxRQUFRLE1BQVM7QUFDM0IsNkJBQXVCLFdBQVcsYUFBYSxhQUFhLEtBQUssV0FBVyxLQUFLLE9BQU87QUFBQSxJQUMxRjtBQUVBLFFBQUksb0JBQW9CLFNBQVMsR0FBRztBQUNsQyxZQUFNLFVBQVUsZUFBZTtBQUMvQixZQUFNLFdBQVcsUUFBUSxJQUFJLE9BQU87QUFDcEMsVUFBSSxhQUFhLFVBQWEsU0FBUyxDQUFDLEdBQUcsT0FBTyxTQUFTLFNBQVM7QUFDbEUsZ0JBQVE7QUFBQSxVQUNOO0FBQUEsVUFDQSxTQUFTLElBQUksQ0FBQyxRQUFRLFlBQVksSUFBSSxNQUFNLEVBQUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFBQSxRQUN6RTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsUUFBSSxrQkFBa0IsU0FBUyxHQUFHO0FBQ2hDLFlBQU0sVUFBVSxlQUFlO0FBQy9CLFlBQU0sV0FBVyxRQUFRLElBQUksT0FBTztBQUNwQyxVQUFJLGFBQWEsVUFBYSxTQUFTLENBQUMsR0FBRyxPQUFPLFNBQVMsVUFBVTtBQUNuRSxnQkFBUTtBQUFBLFVBQ047QUFBQSxVQUNBLFNBQVMsSUFBSSxDQUFDLFFBQVEsWUFBWSxJQUFJLE1BQU0sRUFBRSxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUFBLFFBQzFFO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBTUEsU0FBUyxZQUNQLFdBQ0EsS0FDQSxlQUMrQjtBQUMvQixRQUFNLFNBQVMsVUFBVSxZQUFZLFVBQVUsS0FBSyxNQUFNO0FBQzFELFFBQU0sWUFBWSxtQkFBbUIsR0FBRztBQUV4QyxvQkFBa0IsUUFBUSxTQUFTO0FBQ25DLHVCQUFxQixRQUFRLFNBQVM7QUFFdEMsUUFBTSxpQkFBaUIsc0JBQXNCLE1BQU07QUFDbkQsUUFBTSxpQkFBaUIsZUFBZSxnQkFBZ0IsU0FBUztBQUUvRCxRQUFNLFVBQVUscUJBQXFCLFFBQVEsU0FBUztBQUV0RCxrQkFBZ0IsZ0JBQWdCLE9BQU87QUFFdkMsTUFBSSxvQkFBb0IsQ0FBQyxHQUFHLFFBQVEsS0FBSyxDQUFDLENBQUM7QUFFM0MsUUFBTSxZQUFZLENBQUMsR0FBRyxVQUFVLE9BQU8sT0FBTyxDQUFDLEVBQUUsS0FBSztBQUN0RCxhQUFXLFFBQVEsZ0JBQWdCLE1BQU0sR0FBRztBQUMxQyxVQUFNLFNBQVUsS0FBMEI7QUFDMUMsUUFBSSxXQUFXLFFBQVc7QUFDeEIsMkJBQXFCLFFBQVEsV0FBVyxTQUFTO0FBQ2pELHNDQUFnQyxRQUFRLFdBQVcsU0FBUztBQUFBLElBQzlEO0FBQUEsRUFDRjtBQUNBLE1BQUksT0FBTyxVQUFVLE1BQU07QUFDekIseUJBQXFCLE9BQU8sT0FBTyxXQUFXLFNBQVM7QUFDdkQsb0NBQWdDLE9BQU8sT0FBTyxXQUFXLFNBQVM7QUFBQSxFQUNwRTtBQUNBLE1BQUksT0FBTyxXQUFXLE1BQU07QUFDMUIseUJBQXFCLE9BQU8sUUFBUSxXQUFXLFdBQVcsT0FBTztBQUNqRSxvQ0FBZ0MsT0FBTyxRQUFRLFdBQVcsU0FBUztBQUFBLEVBQ3JFO0FBQ0EsYUFBVyxhQUFhLE9BQU8sV0FBVyxDQUFDLEdBQUc7QUFDNUMseUJBQXFCLFVBQVUsTUFBTSxXQUFXLFdBQVcsT0FBTztBQUNsRSxvQ0FBZ0MsVUFBVSxNQUFNLFdBQVcsU0FBUztBQUFBLEVBQ3RFO0FBQ0EsTUFBSSxPQUFPLFNBQVMsWUFBWSxRQUFXO0FBQ3pDLGVBQVcsWUFBWSxPQUFPLFFBQVEsU0FBUztBQUM3QywyQkFBcUIsVUFBVSxXQUFXLFdBQVcsT0FBTztBQUM1RCxzQ0FBZ0MsVUFBVSxXQUFXLFNBQVM7QUFBQSxJQUNoRTtBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sVUFBVSxRQUFXO0FBQzlCLFVBQU0sY0FBYyxZQUFZLE9BQU8sT0FBTyxLQUFLLGFBQWE7QUFDaEUsVUFBTSxzQkFBc0IsUUFBUTtBQUNwQyxVQUFNLG1CQUFtQixZQUFZO0FBQ3JDLFFBQUksd0JBQXdCLGtCQUFrQjtBQUM1QyxZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsUUFDQSxxREFBcUQsb0JBQW9CLFNBQVMsQ0FBQyxPQUFPLGlCQUFpQixTQUFTLENBQUM7QUFBQSxRQUNySCxPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxrQkFBa0IsUUFBVztBQUMvQixVQUFNLGdCQUErQixFQUFFLE1BQU0sZUFBZSxRQUFRO0FBQ3BFLFFBQUksT0FBTyxJQUFJLGVBQWUsQ0FBQyxhQUFhLENBQUM7QUFBQSxFQUMvQztBQUVBLFNBQU87QUFDVDtBQUVPLFNBQVMsZUFBZSxLQUFVLEtBQXlCO0FBQ2hFLFNBQU8sR0FBRyxJQUFJLFNBQVMsUUFBUTtBQUMvQixRQUFNLFNBQVM7QUFFZixNQUFJLE9BQU8sU0FBUyxNQUFNO0FBQ3hCLGVBQVcsWUFBWSxPQUFPLE1BQU07QUFDbEMsa0JBQVksU0FBUyxLQUFLLEtBQUssS0FBSyxTQUFTLEtBQUssS0FBSztBQUFBLElBQ3pEO0FBQ0EsV0FBTyxPQUFPO0FBQUEsRUFDaEI7QUFFQSxjQUFZLFFBQVEsR0FBRztBQUN6QjsiLAogICJuYW1lcyI6IFsiYWxpYXMiLCAidGFibGVOYW1lIl0KfQo=
|
package/dist-mjs/index.mjs
CHANGED
|
@@ -21,6 +21,8 @@ import requireAwsConfig, { ruleId as requireAwsConfigRuleId } from "./aws/requir
|
|
|
21
21
|
import requireAWSBareBones, { ruleId as requireAWSBareBonesRuleId } from "./aws/require-aws-bare-bones.mjs";
|
|
22
22
|
import requireConsistentRead, { ruleId as requireConsistentReadRuleId } from "./aws/require-consistent-read.mjs";
|
|
23
23
|
import athena, { ruleId as athenaRuleId } from "./athena/athena.mjs";
|
|
24
|
+
import sqlFile, { ruleId as sqlFileRuleId } from "./athena/sql-file.mjs";
|
|
25
|
+
import { parseForESLint } from "./sql-parser.mjs";
|
|
24
26
|
import filePathComment from "./file-path-comment.mjs";
|
|
25
27
|
import noCardNumbers from "./no-card-numbers.mjs";
|
|
26
28
|
import noEnum from "./no-enum.mjs";
|
|
@@ -36,6 +38,7 @@ import requireAssertPredicateRejectsThrows from "./require-assert-predicate-reje
|
|
|
36
38
|
import requireStrictAssert from "./require-strict-assert.mjs";
|
|
37
39
|
import requireAssertMessage from "./require-assert-message.mjs";
|
|
38
40
|
import requireTsExtensionImportsExports from "./require-ts-extension-imports-exports.mjs";
|
|
41
|
+
import { parseForESLint as parseForESLint2 } from "./sql-parser.mjs";
|
|
39
42
|
import { default as default2 } from "./aws/is-aws-sdk-v3-used.mjs";
|
|
40
43
|
var rules = {
|
|
41
44
|
"file-path-comment": filePathComment,
|
|
@@ -66,7 +69,8 @@ var rules = {
|
|
|
66
69
|
[requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports,
|
|
67
70
|
[requireAWSBareBonesRuleId]: requireAWSBareBones,
|
|
68
71
|
[requireConsistentReadRuleId]: requireConsistentRead,
|
|
69
|
-
[athenaRuleId]: athena
|
|
72
|
+
[athenaRuleId]: athena,
|
|
73
|
+
[sqlFileRuleId]: sqlFile
|
|
70
74
|
};
|
|
71
75
|
var plugin = {
|
|
72
76
|
rules
|
|
@@ -107,8 +111,15 @@ var configs = {
|
|
|
107
111
|
[`@checkdigit/${requireConsistentReadRuleId}`]: "error",
|
|
108
112
|
[`@checkdigit/${requireAwsConfigRuleId}`]: "error",
|
|
109
113
|
[`@checkdigit/${requireAWSBareBonesRuleId}`]: "error",
|
|
110
|
-
[`@checkdigit/${athenaRuleId}`]: "error"
|
|
114
|
+
[`@checkdigit/${athenaRuleId}`]: "error",
|
|
115
|
+
[`@checkdigit/${sqlFileRuleId}`]: "error"
|
|
111
116
|
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
files: ["**/*.sql"],
|
|
120
|
+
plugins: { "@checkdigit": plugin },
|
|
121
|
+
languageOptions: { parser: { parseForESLint: parseForESLint2 } },
|
|
122
|
+
rules: { [`@checkdigit/${sqlFileRuleId}`]: "error" }
|
|
112
123
|
}
|
|
113
124
|
],
|
|
114
125
|
recommended: [
|
|
@@ -146,7 +157,8 @@ var configs = {
|
|
|
146
157
|
[`@checkdigit/${requireConsistentReadRuleId}`]: "off",
|
|
147
158
|
[`@checkdigit/${requireAwsConfigRuleId}`]: "off",
|
|
148
159
|
[`@checkdigit/${requireAWSBareBonesRuleId}`]: "off",
|
|
149
|
-
[`@checkdigit/${athenaRuleId}`]: "off"
|
|
160
|
+
[`@checkdigit/${athenaRuleId}`]: "off",
|
|
161
|
+
[`@checkdigit/${sqlFileRuleId}`]: "off"
|
|
150
162
|
}
|
|
151
163
|
}
|
|
152
164
|
]
|
|
@@ -158,6 +170,7 @@ var defaultToExport = {
|
|
|
158
170
|
var index_default = defaultToExport;
|
|
159
171
|
export {
|
|
160
172
|
index_default as default,
|
|
161
|
-
default2 as isAwsSdkV3Used
|
|
173
|
+
default2 as isAwsSdkV3Used,
|
|
174
|
+
parseForESLint
|
|
162
175
|
};
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,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QVE7QUFBQSxJQUNyRDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGFBQWE7QUFBQSxJQUNYO0FBQUEsTUFDRSxPQUFPLENBQUMsU0FBUztBQUFBLE1BQ2pCLFNBQVM7QUFBQSxRQUNQLGVBQWU7QUFBQSxNQUNqQjtBQUFBLE1BQ0EsT0FBTztBQUFBLFFBQ0wsK0JBQStCO0FBQUEsUUFDL0IsdUJBQXVCO0FBQUEsUUFDdkIsaUNBQWlDO0FBQUEsUUFDakMsaUNBQWlDO0FBQUEsUUFDakMscUNBQXFDO0FBQUEsUUFDckMsdUJBQXVCO0FBQUEsUUFDdkIsdUJBQXVCO0FBQUEsUUFDdkIsc0NBQXNDO0FBQUEsUUFDdEMscUNBQXFDO0FBQUEsUUFDckMsb0RBQW9EO0FBQUEsUUFDcEQsa0NBQWtDO0FBQUEsUUFDbEMsK0JBQStCO0FBQUEsUUFDL0IsMENBQTBDO0FBQUEsUUFDMUMsdURBQXVEO0FBQUEsUUFDdkQsdUNBQXVDO0FBQUEsUUFDdkMsOEJBQThCO0FBQUEsUUFDOUIsQ0FBQyxlQUFlLDBCQUEwQixFQUFFLEdBQUc7QUFBQSxRQUMvQyxDQUFDLGVBQWUsNkJBQTZCLEVBQUUsR0FBRztBQUFBLFFBQ2xELENBQUMsZUFBZSwyQkFBMkIsRUFBRSxHQUFHO0FBQUEsUUFDaEQsQ0FBQyxlQUFlLGdDQUFnQyxFQUFFLEdBQUc7QUFBQSxRQUNyRCxDQUFDLGVBQWUseUJBQXlCLEVBQUUsR0FBRztBQUFBLFFBQzlDLENBQUMsZUFBZSxnQ0FBZ0MsRUFBRSxHQUFHO0FBQUEsUUFDckQsQ0FBQyxlQUFlLHFDQUFxQyxFQUFFLEdBQUc7QUFBQSxRQUMxRCxDQUFDLGVBQWUsb0JBQW9CLEVBQUUsR0FBRztBQUFBLFFBQ3pDLENBQUMsZUFBZSwyQ0FBMkMsRUFBRSxHQUFHO0FBQUEsUUFDaEUsQ0FBQyxlQUFlLDJCQUEyQixFQUFFLEdBQUc7QUFBQSxRQUNoRCxDQUFDLGVBQWUsc0JBQXNCLEVBQUUsR0FBRztBQUFBLFFBQzNDLENBQUMsZUFBZSx5QkFBeUIsRUFBRSxHQUFHO0FBQUEsUUFDOUMsQ0FBQyxlQUFlLFlBQVksRUFBRSxHQUFHO0FBQUEsUUFDakMsQ0FBQyxlQUFlLGFBQWEsRUFBRSxHQUFHO0FBQUEsTUFDcEM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTSxrQkFFRjtBQUFBLEVBQ0YsR0FBRztBQUFBLEVBQ0g7QUFDRjtBQUNBLElBQU8sZ0JBQVE7IiwKICAibmFtZXMiOiBbInBhcnNlRm9yRVNMaW50IiwgImRlZmF1bHQiXQp9Cg==
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// src/sql-parser.ts
|
|
2
|
+
function parseForESLint(code) {
|
|
3
|
+
const lines = code.split("\n");
|
|
4
|
+
return {
|
|
5
|
+
ast: {
|
|
6
|
+
type: "Program",
|
|
7
|
+
body: [],
|
|
8
|
+
sourceType: "module",
|
|
9
|
+
range: [0, code.length],
|
|
10
|
+
loc: {
|
|
11
|
+
start: { line: 1, column: 0 },
|
|
12
|
+
end: { line: lines.length, column: lines[lines.length - 1]?.length ?? 0 }
|
|
13
|
+
},
|
|
14
|
+
tokens: [],
|
|
15
|
+
comments: []
|
|
16
|
+
},
|
|
17
|
+
services: {},
|
|
18
|
+
scopeManager: null,
|
|
19
|
+
visitorKeys: { Program: [] }
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
parseForESLint
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NxbC1wYXJzZXIudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBMEJPLFNBQVMsZUFBZSxNQUE4QjtBQUMzRCxRQUFNLFFBQVEsS0FBSyxNQUFNLElBQUk7QUFDN0IsU0FBTztBQUFBLElBQ0wsS0FBSztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sTUFBTSxDQUFDO0FBQUEsTUFDUCxZQUFZO0FBQUEsTUFDWixPQUFPLENBQUMsR0FBRyxLQUFLLE1BQU07QUFBQSxNQUN0QixLQUFLO0FBQUEsUUFDSCxPQUFPLEVBQUUsTUFBTSxHQUFHLFFBQVEsRUFBRTtBQUFBLFFBQzVCLEtBQUssRUFBRSxNQUFNLE1BQU0sUUFBUSxRQUFRLE1BQU0sTUFBTSxTQUFTLENBQUMsR0FBRyxVQUFVLEVBQUU7QUFBQSxNQUMxRTtBQUFBLE1BQ0EsUUFBUSxDQUFDO0FBQUEsTUFDVCxVQUFVLENBQUM7QUFBQSxJQUNiO0FBQUEsSUFDQSxVQUFVLENBQUM7QUFBQSxJQUNYLGNBQWM7QUFBQSxJQUNkLGFBQWEsRUFBRSxTQUFTLENBQUMsRUFBRTtBQUFBLEVBQzdCO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
+
import { ATHENA_ERROR, SYNTEXT_ERROR } from './validate.ts';
|
|
2
3
|
export declare const ruleId = "athena";
|
|
3
|
-
declare const SYNTEXT_ERROR = "SyntextError";
|
|
4
|
-
declare const ATHENA_ERROR = "AthenaError";
|
|
5
4
|
declare const rule: ESLintUtils.RuleModule<typeof SYNTEXT_ERROR | typeof ATHENA_ERROR>;
|
|
6
5
|
export default rule;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
+
import { ATHENA_ERROR, SYNTEXT_ERROR } from './validate.ts';
|
|
3
|
+
export declare const ruleId = "sql-file";
|
|
4
|
+
declare const rule: ESLintUtils.RuleModule<typeof SYNTEXT_ERROR | typeof ATHENA_ERROR>;
|
|
5
|
+
export default rule;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AST } from './types';
|
|
2
|
+
import { type VisitContext } from './context.ts';
|
|
3
|
+
export declare const SYNTEXT_ERROR = "SyntextError";
|
|
4
|
+
export declare const ATHENA_ERROR = "AthenaError";
|
|
5
|
+
export declare class AthenaError extends Error {
|
|
6
|
+
code: string;
|
|
7
|
+
ast?: object;
|
|
8
|
+
constructor(code: string, message: string, ast?: object);
|
|
9
|
+
}
|
|
10
|
+
export declare function offsetToLoc(text: string, offset: number): {
|
|
11
|
+
line: number;
|
|
12
|
+
column: number;
|
|
13
|
+
};
|
|
14
|
+
export declare function checkAthenaAst(ast: AST, ctx: VisitContext): void;
|
package/dist-types/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
export { parseForESLint } from './sql-parser.ts';
|
|
2
3
|
export { default as isAwsSdkV3Used } from './aws/is-aws-sdk-v3-used.ts';
|
|
3
4
|
declare const defaultToExport: Exclude<TSESLint.FlatConfig.Plugin, 'config'> & {
|
|
4
5
|
configs: Record<string, TSESLint.FlatConfig.Config[]>;
|