@checkdigit/eslint-plugin 7.18.0-PR.143-5adf → 7.18.0-PR.143-c067
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/dist-mjs/athena/athena.mjs +62 -15
- package/dist-mjs/athena/visitor.mjs +13 -1
- package/dist-types/athena/visitor.d.ts +2 -0
- package/package.json +1 -1
- package/src/athena/athena.ts +80 -16
- package/src/athena/visitor.ts +13 -0
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from "./context.mjs";
|
|
13
13
|
import { buildServiceTables } from "./service-table.mjs";
|
|
14
14
|
import {
|
|
15
|
+
containsLambda,
|
|
15
16
|
extractBracketAccessorPath,
|
|
16
17
|
extractColumnRefs,
|
|
17
18
|
extractJsonExtractCalls,
|
|
@@ -96,9 +97,15 @@ function resolveServiceTable(select, item, ctx) {
|
|
|
96
97
|
const { table: tableName } = item;
|
|
97
98
|
try {
|
|
98
99
|
const apiSchemas = getApiSchemas(tableName, ctx);
|
|
100
|
+
if (apiSchemas.length === 0) {
|
|
101
|
+
throw new AthenaError(ATHENA_ERROR, `service not found: "${tableName}" (no swagger schema located)`, item);
|
|
102
|
+
}
|
|
99
103
|
const operations = matchApi(select, item, apiSchemas) ?? [];
|
|
100
104
|
ctx.tables.set(tableName, buildServiceTables(tableName, operations));
|
|
101
105
|
} catch (error) {
|
|
106
|
+
if (error instanceof AthenaError) {
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
102
109
|
throw new AthenaError(ATHENA_ERROR, error instanceof Error ? error.message : String(error), item);
|
|
103
110
|
}
|
|
104
111
|
}
|
|
@@ -230,6 +237,43 @@ function navigateSchemaPath(colRef, propertyAccessor, resolvedColumns, colName,
|
|
|
230
237
|
extractedSchemas.map((schema) => resolvedCol(colName, schema, columnAST))
|
|
231
238
|
);
|
|
232
239
|
}
|
|
240
|
+
function lookupColumnOrThrow(colRef, ref, referencedTables, ctx) {
|
|
241
|
+
const resolvedColumns = referencedTables.flatMap((table) => table.columns.get(colRef) ?? []);
|
|
242
|
+
if (resolvedColumns.length === 0) {
|
|
243
|
+
const tableNames = [...ctx.tables.keys()].join(", ");
|
|
244
|
+
const availableCols = [...new Set(referencedTables.flatMap((table) => [...table.columns.keys()]))].join(", ");
|
|
245
|
+
throw new AthenaError(
|
|
246
|
+
ATHENA_ERROR,
|
|
247
|
+
`can't found column ${colRef} in tables: ${tableNames}; available columns: ${availableCols}`,
|
|
248
|
+
ref
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
return resolvedColumns;
|
|
252
|
+
}
|
|
253
|
+
function checkColumnRefsExist(ast, allTables, ctx, selectColumns) {
|
|
254
|
+
if (containsLambda(ast)) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
for (const ref of extractColumnRefs(ast)) {
|
|
258
|
+
const colRef = typeof ref.column === "string" ? ref.column : void 0;
|
|
259
|
+
if (colRef === void 0 || colRef === "*") {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
const tableRef = ref.table ?? void 0;
|
|
263
|
+
if (tableRef === void 0 && selectColumns?.has(colRef) === true) {
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
const referencedTables = tableRef !== void 0 ? lookupTables(tableRef, ctx) : allTables;
|
|
267
|
+
if (referencedTables.length === 0) {
|
|
268
|
+
throw new AthenaError(
|
|
269
|
+
ATHENA_ERROR,
|
|
270
|
+
`unknown table or alias '${tableRef ?? colRef}'; known tables: ${[...ctx.tables.keys()].join(", ")}`,
|
|
271
|
+
ref
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
lookupColumnOrThrow(colRef, ref, referencedTables, ctx);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
233
277
|
function validateComplexColumnExpression(columnAST, allTables, ctx) {
|
|
234
278
|
for (const { ref, path, fnNode } of extractJsonExtractCalls(columnAST)) {
|
|
235
279
|
const tableRef = ref.table ?? void 0;
|
|
@@ -249,23 +293,21 @@ function resolveSingleColumnRef(columnAST, columnAlias, indexedName, ref, allTab
|
|
|
249
293
|
const colRef = typeof ref.column === "string" ? ref.column : void 0;
|
|
250
294
|
assert.ok(colRef !== void 0, "column_ref must have a string column name");
|
|
251
295
|
const referencedTables = tableRef !== void 0 ? lookupTables(tableRef, ctx) : allTables;
|
|
252
|
-
|
|
253
|
-
if (colRef === "*") {
|
|
254
|
-
expandWildcard(referencedTables, columns);
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
const withFunctions = hasFunctionCalls(columnAST);
|
|
258
|
-
const colName = columnAlias ?? (withFunctions ? indexedName : colRef);
|
|
259
|
-
const resolvedColumns = referencedTables.flatMap((table) => table.columns.get(colRef) ?? []);
|
|
260
|
-
if (resolvedColumns.length === 0) {
|
|
296
|
+
if (referencedTables.length === 0) {
|
|
261
297
|
const tableNames = [...ctx.tables.keys()].join(", ");
|
|
262
|
-
const availableCols = [...new Set(referencedTables.flatMap((table) => [...table.columns.keys()]))].join(", ");
|
|
263
298
|
throw new AthenaError(
|
|
264
299
|
ATHENA_ERROR,
|
|
265
|
-
`
|
|
300
|
+
`unknown table or alias '${tableRef ?? colRef}'; known tables: ${tableNames}`,
|
|
266
301
|
ref
|
|
267
302
|
);
|
|
268
303
|
}
|
|
304
|
+
if (colRef === "*") {
|
|
305
|
+
expandWildcard(referencedTables, columns);
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
const withFunctions = hasFunctionCalls(columnAST);
|
|
309
|
+
const colName = columnAlias ?? (withFunctions ? indexedName : colRef);
|
|
310
|
+
const resolvedColumns = lookupColumnOrThrow(colRef, ref, referencedTables, ctx);
|
|
269
311
|
const propertyAccessor = extractJsonExtractPath(columnAST) ?? extractBracketAccessorPath(columnAST);
|
|
270
312
|
if (propertyAccessor !== void 0) {
|
|
271
313
|
navigateSchemaPath(colRef, propertyAccessor, resolvedColumns, colName, columnAST, columns);
|
|
@@ -285,6 +327,7 @@ function resolveSelectColumns(select, ctx) {
|
|
|
285
327
|
const indexedName = `_col${String(index)}`;
|
|
286
328
|
const columnRefs = extractColumnRefs(columnAST);
|
|
287
329
|
if (columnRefs.length !== 1) {
|
|
330
|
+
checkColumnRefsExist(columnAST, allTables, ctx);
|
|
288
331
|
validateComplexColumnExpression(columnAST, allTables, ctx);
|
|
289
332
|
resolveDefaultSchemaColumn(columnAlias, indexedName, columnAST, columns);
|
|
290
333
|
continue;
|
|
@@ -306,16 +349,20 @@ function checkSelect(selectAST, ctx, withTableName) {
|
|
|
306
349
|
log("resolved columns", [...columns.keys()]);
|
|
307
350
|
const allTables = [...selectCtx.tables.values()].flat();
|
|
308
351
|
if (select.where !== null) {
|
|
352
|
+
checkColumnRefsExist(select.where, allTables, selectCtx);
|
|
309
353
|
validateComplexColumnExpression(select.where, allTables, selectCtx);
|
|
310
354
|
}
|
|
311
355
|
if (select.having !== null) {
|
|
356
|
+
checkColumnRefsExist(select.having, allTables, selectCtx, columns);
|
|
312
357
|
validateComplexColumnExpression(select.having, allTables, selectCtx);
|
|
313
358
|
}
|
|
314
359
|
for (const orderItem of select.orderby ?? []) {
|
|
360
|
+
checkColumnRefsExist(orderItem.expr, allTables, selectCtx, columns);
|
|
315
361
|
validateComplexColumnExpression(orderItem.expr, allTables, selectCtx);
|
|
316
362
|
}
|
|
317
363
|
if (select.groupby?.columns !== void 0) {
|
|
318
364
|
for (const groupCol of select.groupby.columns) {
|
|
365
|
+
checkColumnRefsExist(groupCol, allTables, selectCtx, columns);
|
|
319
366
|
validateComplexColumnExpression(groupCol, allTables, selectCtx);
|
|
320
367
|
}
|
|
321
368
|
}
|
|
@@ -363,7 +410,7 @@ var rule = createRule({
|
|
|
363
410
|
try {
|
|
364
411
|
({ ast } = parse(sql, { includeLocations: true }));
|
|
365
412
|
} catch (error) {
|
|
366
|
-
log("error
|
|
413
|
+
log("error parsing Athena SQL", { error, sql });
|
|
367
414
|
const pegLoc = error.location;
|
|
368
415
|
if (pegLoc !== void 0) {
|
|
369
416
|
const sourceText = context.sourceCode.getText();
|
|
@@ -373,13 +420,13 @@ var rule = createRule({
|
|
|
373
420
|
end: offsetToLoc(sourceText, sqlOffsetToSource(pegLoc.end.offset, sqlMapping))
|
|
374
421
|
},
|
|
375
422
|
messageId: SYNTEXT_ERROR,
|
|
376
|
-
data: { errorMessage:
|
|
423
|
+
data: { errorMessage: error.message }
|
|
377
424
|
});
|
|
378
425
|
} else {
|
|
379
426
|
context.report({
|
|
380
427
|
node: sqlNode,
|
|
381
428
|
messageId: SYNTEXT_ERROR,
|
|
382
|
-
data: { errorMessage:
|
|
429
|
+
data: { errorMessage: error.message }
|
|
383
430
|
});
|
|
384
431
|
}
|
|
385
432
|
return;
|
|
@@ -439,4 +486,4 @@ export {
|
|
|
439
486
|
athena_default as default,
|
|
440
487
|
ruleId
|
|
441
488
|
};
|
|
442
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS9hdGhlbmEudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxVQUFVLGNBQWM7QUFFakMsT0FBTyxXQUFXO0FBQ2xCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsZ0JBQWdCLG1CQUFrQztBQUczRCxTQUFTLGFBQWE7QUFFdEIsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BSUs7QUFDUCxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVBLElBQU0sU0FBUztBQUV0QixJQUFNLE1BQU0sTUFBTSxzQkFBc0I7QUFDeEMsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsSUFBSTtBQUV6RCxJQUFNLGdCQUFnQjtBQUN0QixJQUFNLGVBQWU7QUFFckIsSUFBTSxjQUFOLGNBQTBCLE1BQU07QUFBQSxFQUN2QjtBQUFBLEVBQ0E7QUFBQSxFQUNQLFlBQVksTUFBYyxTQUFpQixLQUFjO0FBQ3ZELFVBQU0sT0FBTztBQUNiLFNBQUssT0FBTztBQUNaLFNBQUssT0FBTztBQUNaLFFBQUksUUFBUSxRQUFXO0FBQ3JCLFdBQUssTUFBTTtBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQ0Y7QUFHQSxTQUFTLFlBQVksTUFBYyxRQUFrRDtBQUNuRixRQUFNLFNBQVMsS0FBSyxNQUFNLEdBQUcsTUFBTTtBQUNuQyxRQUFNLFFBQVEsT0FBTyxNQUFNLElBQUk7QUFDL0IsU0FBTyxFQUFFLE1BQU0sTUFBTSxRQUFRLFFBQVEsTUFBTSxNQUFNLFNBQVMsQ0FBQyxHQUFHLFVBQVUsRUFBRTtBQUM1RTtBQVdBLFNBQVMsZ0JBQWdCLFNBQTRDO0FBQ25FLE1BQUksUUFBUSxTQUFTLGVBQWUsaUJBQWlCO0FBRW5ELFdBQU8s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SUFBSSxLQUFLLFNBQVM7QUFBQSxNQUM3RCxTQUFTLE9BQU87QUFDZCxZQUFJLDZCQUE2QixFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQy9DLFlBQUksaUJBQWlCLGFBQWE7QUFDaEMsZ0JBQU0sU0FBVSxNQUFNLEtBQ2xCO0FBQ0osY0FBSSxXQUFXLFFBQVc7QUFDeEIsa0JBQU0sYUFBYSxRQUFRLFdBQVcsUUFBUTtBQUM5QyxvQkFBUSxPQUFPO0FBQUEsY0FDYixLQUFLO0FBQUEsZ0JBQ0gsT0FBTyxZQUFZLFlBQVksa0JBQWtCLE9BQU8sTUFBTSxRQUFRLFVBQVUsQ0FBQztBQUFBLGdCQUNqRixLQUFLLFlBQVksWUFBWSxrQkFBa0IsT0FBTyxJQUFJLFFBQVEsVUFBVSxDQUFDO0FBQUEsY0FDL0U7QUFBQSxjQUNBLFdBQVc7QUFBQSxjQUNYLE1BQU0sRUFBRSxjQUFjLE1BQU0sUUFBUTtBQUFBLFlBQ3RDLENBQUM7QUFBQSxVQUNILE9BQU87QUFDTCxvQkFBUSxPQUFPO0FBQUEsY0FDYixNQUFNO0FBQUEsY0FDTixXQUFXO0FBQUEsY0FDWCxNQUFNLEVBQUUsY0FBYyxNQUFNLFFBQVE7QUFBQSxZQUN0QyxDQUFDO0FBQUEsVUFDSDtBQUFBLFFBQ0YsT0FBTztBQUVMLGtCQUFRLE1BQU0sbUJBQW1CLE1BQU0sY0FBYyxRQUFRLFFBQVEsTUFBTSxLQUFLO0FBQ2hGLGtCQUFRLE9BQU87QUFBQSxZQUNiLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxjQUNKLGNBQWMsaUJBQWlCLFFBQVEsT0FBTyxLQUFLLElBQUksS0FBSyxVQUFVLE9BQU8sUUFBVyxDQUFDO0FBQUEsWUFDM0Y7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsTUFDTCxnQkFBZ0IsU0FBUztBQUN2QixjQUFNLE1BQU0sUUFBUSxPQUNqQixJQUFJLENBQUMsVUFBVSxNQUFNLE1BQU0sTUFBTSxFQUNqQyxLQUFLLEVBQUUsRUFDUCxLQUFLO0FBQ1IsaUJBQVMsS0FBSyxPQUFPO0FBQUEsTUFDdkI7QUFBQSxNQUNBLFFBQVEsU0FBUztBQUNmLFlBQUksT0FBTyxRQUFRLFVBQVUsVUFBVTtBQUNyQztBQUFBLFFBQ0Y7QUFDQSxpQkFBUyxRQUFRLE9BQU8sT0FBTztBQUFBLE1BQ2pDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBRUQsSUFBTyxpQkFBUTsiLAogICJuYW1lcyI6IFsidGFibGVOYW1lIiwgImFsaWFzIl0KfQo=
|
|
489
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS9hdGhlbmEudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBVUEsU0FBUyxVQUFVLGNBQWM7QUFFakMsT0FBTyxXQUFXO0FBQ2xCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsZ0JBQWdCLG1CQUFrQztBQUczRCxTQUFTLGFBQWE7QUFFdEIsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BSUs7QUFDUCxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFQSxJQUFNLFNBQVM7QUFFdEIsSUFBTSxNQUFNLE1BQU0sc0JBQXNCO0FBQ3hDLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLElBQUk7QUFFekQsSUFBTSxnQkFBZ0I7QUFDdEIsSUFBTSxlQUFlO0FBRXJCLElBQU0sY0FBTixjQUEwQixNQUFNO0FBQUEsRUFDdkI7QUFBQSxFQUNBO0FBQUEsRUFDUCxZQUFZLE1BQWMsU0FBaUIsS0FBYztBQUN2RCxVQUFNLE9BQU87QUFDYixTQUFLLE9BQU87QUFDWixTQUFLLE9BQU87QUFDWixRQUFJLFFBQVEsUUFBVztBQUNyQixXQUFLLE1BQU07QUFBQSxJQUNiO0FBQUEsRUFDRjtBQUNGO0FBR0EsU0FBUyxZQUFZLE1BQWMsUUFBa0Q7QUFDbkYsUUFBTSxTQUFTLEtBQUssTUFBTSxHQUFHLE1BQU07QUFDbkMsUUFBTSxRQUFRLE9BQU8sTUFBTSxJQUFJO0FBQy9CLFNBQU8sRUFBRSxNQUFNLE1BQU0sUUFBUSxRQUFRLE1BQU0sTUFBTSxTQUFTLENBQUMsR0FBRyxVQUFVLEVBQUU7QUFDNUU7QUFXQSxTQUFTLGdCQUFnQixTQUE0QztBQUNuRSxNQUFJLFFBQVEsU0FBUyxlQUFlLGlCQUFpQjtB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QUFBQSxZQUNYLE1BQU0sRUFBRSxjQUFlLE1BQWdCLFFBQVE7QUFBQSxVQUNqRCxDQUFDO0FBQUEsUUFDSDtBQUNBO0FBQUEsTUFDRjtBQUNBLFlBQU0sWUFBWSxrQkFBa0I7QUFDcEMsVUFBSTtBQUVGLHVCQUFlLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDN0QsU0FBUyxPQUFPO0FBQ2QsWUFBSSw2QkFBNkIsRUFBRSxPQUFPLElBQUksQ0FBQztBQUMvQyxZQUFJLGlCQUFpQixhQUFhO0FBQ2hDLGdCQUFNLFNBQVUsTUFBTSxLQUNsQjtBQUNKLGNBQUksV0FBVyxRQUFXO0FBQ3hCLGtCQUFNLGFBQWEsUUFBUSxXQUFXLFFBQVE7QUFDOUMsb0JBQVEsT0FBTztBQUFBLGNBQ2IsS0FBSztBQUFBLGdCQUNILE9BQU8sWUFBWSxZQUFZLGtCQUFrQixPQUFPLE1BQU0sUUFBUSxVQUFVLENBQUM7QUFBQSxnQkFDakYsS0FBSyxZQUFZLFlBQVksa0JBQWtCLE9BQU8sSUFBSSxRQUFRLFVBQVUsQ0FBQztBQUFBLGNBQy9FO0FBQUEsY0FDQSxXQUFXO0FBQUEsY0FDWCxNQUFNLEVBQUUsY0FBYyxNQUFNLFFBQVE7QUFBQSxZQUN0QyxDQUFDO0FBQUEsVUFDSCxPQUFPO0FBQ0wsb0JBQVEsT0FBTztBQUFBLGNBQ2IsTUFBTTtBQUFBLGNBQ04sV0FBVztBQUFBLGNBQ1gsTUFBTSxFQUFFLGNBQWMsTUFBTSxRQUFRO0FBQUEsWUFDdEMsQ0FBQztBQUFBLFVBQ0g7QUFBQSxRQUNGLE9BQU87QUFFTCxrQkFBUSxNQUFNLG1CQUFtQixNQUFNLGNBQWMsUUFBUSxRQUFRLE1BQU0sS0FBSztBQUNoRixrQkFBUSxPQUFPO0FBQUEsWUFDYixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsY0FDSixjQUFjLGlCQUFpQixRQUFRLE9BQU8sS0FBSyxJQUFJLEtBQUssVUFBVSxPQUFPLFFBQVcsQ0FBQztBQUFBLFlBQzNGO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsV0FBTztBQUFBLE1BQ0wsZ0JBQWdCLFNBQVM7QUFDdkIsY0FBTSxNQUFNLFFBQVEsT0FDakIsSUFBSSxDQUFDLFVBQVUsTUFBTSxNQUFNLE1BQU0sRUFDakMsS0FBSyxFQUFFLEVBQ1AsS0FBSztBQUNSLGlCQUFTLEtBQUssT0FBTztBQUFBLE1BQ3ZCO0FBQUEsTUFDQSxRQUFRLFNBQVM7QUFDZixZQUFJLE9BQU8sUUFBUSxVQUFVLFVBQVU7QUFDckM7QUFBQSxRQUNGO0FBQ0EsaUJBQVMsUUFBUSxPQUFPLE9BQU87QUFBQSxNQUNqQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8saUJBQVE7IiwKICAibmFtZXMiOiBbInRhYmxlTmFtZSIsICJhbGlhcyJdCn0K
|
|
@@ -156,6 +156,17 @@ function walk(node, visitor) {
|
|
|
156
156
|
walkExpr(node, visitor);
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
|
+
function containsLambda(expr) {
|
|
160
|
+
let found = false;
|
|
161
|
+
walkExpr(expr, {
|
|
162
|
+
visitBinary(node) {
|
|
163
|
+
if (node.operator === "->") {
|
|
164
|
+
found = true;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
return found;
|
|
169
|
+
}
|
|
159
170
|
function extractColumnRefs(expr) {
|
|
160
171
|
const refs = [];
|
|
161
172
|
walkExpr(expr, {
|
|
@@ -242,6 +253,7 @@ function hasFunctionCalls(expr) {
|
|
|
242
253
|
return found;
|
|
243
254
|
}
|
|
244
255
|
export {
|
|
256
|
+
containsLambda,
|
|
245
257
|
extractBracketAccessorPath,
|
|
246
258
|
extractColumnRefs,
|
|
247
259
|
extractJsonExtractCalls,
|
|
@@ -255,4 +267,4 @@ export {
|
|
|
255
267
|
isUnnestFrom,
|
|
256
268
|
walk
|
|
257
269
|
};
|
|
258
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS92aXNpdG9yLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLE9BQU8sV0FBVztBQUVsQixJQUFNLE1BQU0sTUFBTSxnQkFBZ0I7QUFpRTNCLFNBQVMsYUFBYSxNQUFtQztBQUM5RCxTQUFPLE9BQU8sU0FBUyxZQUFZLFNBQVMsUUFBUyxLQUE0QixTQUFTO0FBQzVGO0FBRU8sU0FBUyxPQUFPLE1BQTZCO0FBQ2xELFNBQU8sT0FBTyxTQUFTLFlBQVksU0FBUyxRQUFTLEtBQTRCLFNBQVM7QUFDNUY7QUFFTyxTQUFTLFlBQVksTUFBa0M7QUFDNUQsTUFBSSxPQUFPLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLE9BQVEsS0FBNEI7QUFDMUMsU0FBTyxPQUFPLFNBQVMsWUFBWSxTQUFTLFFBQVEsU0FBUztBQUMvRDtBQUVPLFNBQVMsT0FBTyxNQUE2QjtBQUNsRCxTQUNFLENBQUMsYUFBYSxJQUFJLEtBQ2xCLENBQUMsT0FBTyxJQUFJLEtBQ1osQ0FBQyxZQUFZLElBQUksS0FDakIsT0FBTyxTQUFTLFlBQ2hCLFNBQVMsUUFDVCxVQUFVO0FBRWQ7QUFFTyxTQUFTLFdBQVcsTUFBaUM7QUFDMUQsU0FDRSxDQUFDLGFBQWEsSUFBSSxLQUNsQixDQUFDLE9BQU8sSUFBSSxLQUNaLENBQUMsWUFBWSxJQUFJLEtBQ2pCLENBQUMsT0FBTyxJQUFJLEtBQ1osT0FBTyxTQUFTLFlBQ2hCLFNBQVMsUUFDVCxXQUFXO0FBRWY7QUFFTyxTQUFTLGNBQWMsTUFBaUQ7QUFDN0UsUUFBTSxRQUFRO0FBQ2QsU0FBTyxNQUFNLFFBQVEsTUFBTSxXQUFXLEtBQUssTUFBTSxZQUFZLFNBQVM7QUFDeEU7QUFPQSxTQUFTLFNBQVMsTUFBZSxTQUEyQjtBQUMxRCxNQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUM3QztBQUFBLEVBQ0Y7QUFDQSxRQUFNLFFBQVE7QUFFZCxVQUFRLE1BQU0s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
|
|
@@ -47,6 +47,8 @@ export declare function isJoin(node: unknown): node is Join;
|
|
|
47
47
|
export declare function isBaseFrom(node: unknown): node is BaseFrom;
|
|
48
48
|
export declare function hasArrayIndex(node: ColumnRefItem): node is ColumnRefWithIndex;
|
|
49
49
|
export declare function walk(node: unknown, visitor: VisitorMap): void;
|
|
50
|
+
/** Return true if the expression contains a lambda (`->`) subexpression. */
|
|
51
|
+
export declare function containsLambda(expr: unknown): boolean;
|
|
50
52
|
/** Collect all column_ref nodes within an expression subtree. */
|
|
51
53
|
export declare function extractColumnRefs(expr: unknown): ColumnRefItem[];
|
|
52
54
|
/** Return the path string from the first json_extract_scalar / json_extract call found. */
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@checkdigit/eslint-plugin","version":"7.18.0-PR.143-
|
|
1
|
+
{"name":"@checkdigit/eslint-plugin","version":"7.18.0-PR.143-c067","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-mjs","!src/**/test/**","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/test/**","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-mjs/**/test/**","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 .","lint:fix":"eslint --max-warnings 0 --fix .","peggy":"for file in ./src/peggy/*.peggy; do peggy \"$file\" --format es --output \"${file%.peggy}-peggy.ts\"; done","peggy-watch":"for file in ./src/peggy/*.peggy; do peggy \"$file\" --format=es --watch --output=\"${file%.peggy}-peggy.ts\"; done","prepare":"","prepublishOnly":"npm run build:dist-types && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@apidevtools/json-schema-ref-parser":"^15.3.5","@typescript-eslint/type-utils":"^8.60.1","@typescript-eslint/utils":"^8.60.1","ajv":"^8.20.0","debug":"^4.4.3","glob":"^13.0.6","http-status-codes":"^2.3.0","js-yaml":"^4.2.0","json-pointer":"^0.6.2","jsonpath-plus":"^10.4.0","ts-api-utils":"^2.5.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^6.1.0","@checkdigit/typescript-config":"10.0.0","@eslint/js":"^9.37.0","@types/debug":"^4.1.13","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@types/js-yaml":"^4.0.9","@types/json-pointer":"^1.0.34","@typescript-eslint/parser":"^8.60.1","@typescript-eslint/rule-tester":"^8.60.1","eslint":"^9.37.0","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.5","eslint-plugin-eslint-plugin":"^6.4.0","eslint-plugin-import":"^2.32.0","eslint-plugin-no-only-tests":"^3.4.0","eslint-plugin-no-secrets":"^2.3.3","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"^1.0.4","openapi-types":"^12.1.3","peggy":"^4.2.0","rimraf":"^6.1.3","typescript-eslint":"^8.60.1"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=22.18"},"service":{"api":{"root":"src","endpoints":["api/v1"]}},"wallaby":{"env":{"params":{"runner":"--experimental-vm-modules"}}}}
|
package/src/athena/athena.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// athena/athena.ts
|
|
2
2
|
|
|
3
|
+
/* eslint-disable max-lines */
|
|
4
|
+
|
|
3
5
|
/*
|
|
4
6
|
* Copyright (c) 2021-2026 Check Digit, LLC
|
|
5
7
|
*
|
|
@@ -26,6 +28,7 @@ import {
|
|
|
26
28
|
} from './context.ts';
|
|
27
29
|
import { buildServiceTables } from './service-table.ts';
|
|
28
30
|
import {
|
|
31
|
+
containsLambda,
|
|
29
32
|
extractBracketAccessorPath,
|
|
30
33
|
extractColumnRefs,
|
|
31
34
|
extractJsonExtractCalls,
|
|
@@ -145,9 +148,15 @@ function resolveServiceTable(select: Select, item: BaseFrom, ctx: VisitContext):
|
|
|
145
148
|
const { table: tableName } = item;
|
|
146
149
|
try {
|
|
147
150
|
const apiSchemas = getApiSchemas(tableName, ctx);
|
|
151
|
+
if (apiSchemas.length === 0) {
|
|
152
|
+
throw new AthenaError(ATHENA_ERROR, `service not found: "${tableName}" (no swagger schema located)`, item);
|
|
153
|
+
}
|
|
148
154
|
const operations = matchApi(select, item, apiSchemas) ?? [];
|
|
149
155
|
ctx.tables.set(tableName, buildServiceTables(tableName, operations));
|
|
150
156
|
} catch (error) {
|
|
157
|
+
if (error instanceof AthenaError) {
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
151
160
|
throw new AthenaError(ATHENA_ERROR, error instanceof Error ? error.message : String(error), item);
|
|
152
161
|
}
|
|
153
162
|
}
|
|
@@ -352,6 +361,57 @@ function navigateSchemaPath(
|
|
|
352
361
|
// Pass 2 — Resolve SELECT columns → Map<name, ResolvedColumn[]>
|
|
353
362
|
// ---------------------------------------------------------------------------
|
|
354
363
|
|
|
364
|
+
/** Resolve a column by name against `referencedTables`, throwing if not found. */
|
|
365
|
+
function lookupColumnOrThrow(
|
|
366
|
+
colRef: string,
|
|
367
|
+
ref: object,
|
|
368
|
+
referencedTables: ResolvedTable[],
|
|
369
|
+
ctx: VisitContext,
|
|
370
|
+
): ResolvedColumn[] {
|
|
371
|
+
const resolvedColumns = referencedTables.flatMap((table) => table.columns.get(colRef) ?? []);
|
|
372
|
+
if (resolvedColumns.length === 0) {
|
|
373
|
+
const tableNames = [...ctx.tables.keys()].join(', ');
|
|
374
|
+
const availableCols = [...new Set(referencedTables.flatMap((table) => [...table.columns.keys()]))].join(', ');
|
|
375
|
+
throw new AthenaError(
|
|
376
|
+
ATHENA_ERROR,
|
|
377
|
+
`can't found column ${colRef} in tables: ${tableNames}; available columns: ${availableCols}`,
|
|
378
|
+
ref,
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
return resolvedColumns;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/** Check all column_refs in `ast` exist in scope. Skips lambda expressions (lambda params look like column_refs). */
|
|
385
|
+
function checkColumnRefsExist(
|
|
386
|
+
ast: unknown,
|
|
387
|
+
allTables: ResolvedTable[],
|
|
388
|
+
ctx: VisitContext,
|
|
389
|
+
selectColumns?: Map<string, ResolvedColumn[]>,
|
|
390
|
+
): void {
|
|
391
|
+
if (containsLambda(ast)) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
for (const ref of extractColumnRefs(ast)) {
|
|
395
|
+
const colRef = typeof ref.column === 'string' ? ref.column : undefined;
|
|
396
|
+
if (colRef === undefined || colRef === '*') {
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
const tableRef = ref.table ?? undefined;
|
|
400
|
+
if (tableRef === undefined && selectColumns?.has(colRef) === true) {
|
|
401
|
+
continue; // SELECT alias used in GROUP BY / ORDER BY / HAVING — valid
|
|
402
|
+
}
|
|
403
|
+
const referencedTables = tableRef !== undefined ? lookupTables(tableRef, ctx) : allTables;
|
|
404
|
+
if (referencedTables.length === 0) {
|
|
405
|
+
throw new AthenaError(
|
|
406
|
+
ATHENA_ERROR,
|
|
407
|
+
`unknown table or alias '${tableRef ?? colRef}'; known tables: ${[...ctx.tables.keys()].join(', ')}`,
|
|
408
|
+
ref,
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
lookupColumnOrThrow(colRef, ref, referencedTables, ctx);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
355
415
|
/** Validate all json_extract / json_extract_scalar paths in a complex column expression. */
|
|
356
416
|
function validateComplexColumnExpression(columnAST: unknown, allTables: ResolvedTable[], ctx: VisitContext): void {
|
|
357
417
|
for (const { ref, path, fnNode } of extractJsonExtractCalls(columnAST)) {
|
|
@@ -383,7 +443,14 @@ function resolveSingleColumnRef(
|
|
|
383
443
|
assert.ok(colRef !== undefined, 'column_ref must have a string column name');
|
|
384
444
|
|
|
385
445
|
const referencedTables = tableRef !== undefined ? lookupTables(tableRef, ctx) : allTables;
|
|
386
|
-
|
|
446
|
+
if (referencedTables.length === 0) {
|
|
447
|
+
const tableNames = [...ctx.tables.keys()].join(', ');
|
|
448
|
+
throw new AthenaError(
|
|
449
|
+
ATHENA_ERROR,
|
|
450
|
+
`unknown table or alias '${tableRef ?? colRef}'; known tables: ${tableNames}`,
|
|
451
|
+
ref,
|
|
452
|
+
);
|
|
453
|
+
}
|
|
387
454
|
|
|
388
455
|
if (colRef === '*') {
|
|
389
456
|
expandWildcard(referencedTables, columns);
|
|
@@ -392,17 +459,7 @@ function resolveSingleColumnRef(
|
|
|
392
459
|
|
|
393
460
|
const withFunctions = hasFunctionCalls(columnAST);
|
|
394
461
|
const colName = columnAlias ?? (withFunctions ? indexedName : colRef);
|
|
395
|
-
const resolvedColumns =
|
|
396
|
-
|
|
397
|
-
if (resolvedColumns.length === 0) {
|
|
398
|
-
const tableNames = [...ctx.tables.keys()].join(', ');
|
|
399
|
-
const availableCols = [...new Set(referencedTables.flatMap((table) => [...table.columns.keys()]))].join(', ');
|
|
400
|
-
throw new AthenaError(
|
|
401
|
-
ATHENA_ERROR,
|
|
402
|
-
`can't found column ${colRef} in tables: ${tableNames}; available columns: ${availableCols}`,
|
|
403
|
-
ref,
|
|
404
|
-
);
|
|
405
|
-
}
|
|
462
|
+
const resolvedColumns = lookupColumnOrThrow(colRef, ref, referencedTables, ctx);
|
|
406
463
|
|
|
407
464
|
const propertyAccessor = extractJsonExtractPath(columnAST) ?? extractBracketAccessorPath(columnAST);
|
|
408
465
|
if (propertyAccessor !== undefined) {
|
|
@@ -428,6 +485,7 @@ function resolveSelectColumns(select: Select, ctx: VisitContext): Map<string, Re
|
|
|
428
485
|
const columnRefs = extractColumnRefs(columnAST);
|
|
429
486
|
|
|
430
487
|
if (columnRefs.length !== 1) {
|
|
488
|
+
checkColumnRefsExist(columnAST, allTables, ctx);
|
|
431
489
|
validateComplexColumnExpression(columnAST, allTables, ctx);
|
|
432
490
|
resolveDefaultSchemaColumn(columnAlias, indexedName, columnAST, columns);
|
|
433
491
|
continue;
|
|
@@ -467,19 +525,23 @@ function checkSelect(selectAST: Select | With, ctx: VisitContext, withTableName?
|
|
|
467
525
|
|
|
468
526
|
log('resolved columns', [...columns.keys()]);
|
|
469
527
|
|
|
470
|
-
// Pass 3: validate JSON paths in WHERE / HAVING / GROUP BY / ORDER BY
|
|
528
|
+
// Pass 3: validate column refs and JSON paths in WHERE / HAVING / GROUP BY / ORDER BY
|
|
471
529
|
const allTables = [...selectCtx.tables.values()].flat();
|
|
472
530
|
if (select.where !== null) {
|
|
531
|
+
checkColumnRefsExist(select.where, allTables, selectCtx);
|
|
473
532
|
validateComplexColumnExpression(select.where, allTables, selectCtx);
|
|
474
533
|
}
|
|
475
534
|
if (select.having !== null) {
|
|
535
|
+
checkColumnRefsExist(select.having, allTables, selectCtx, columns);
|
|
476
536
|
validateComplexColumnExpression(select.having, allTables, selectCtx);
|
|
477
537
|
}
|
|
478
538
|
for (const orderItem of select.orderby ?? []) {
|
|
539
|
+
checkColumnRefsExist(orderItem.expr, allTables, selectCtx, columns);
|
|
479
540
|
validateComplexColumnExpression(orderItem.expr, allTables, selectCtx);
|
|
480
541
|
}
|
|
481
542
|
if (select.groupby?.columns !== undefined) {
|
|
482
543
|
for (const groupCol of select.groupby.columns) {
|
|
544
|
+
checkColumnRefsExist(groupCol, allTables, selectCtx, columns);
|
|
483
545
|
validateComplexColumnExpression(groupCol, allTables, selectCtx);
|
|
484
546
|
}
|
|
485
547
|
}
|
|
@@ -541,7 +603,7 @@ const rule: ESLintUtils.RuleModule<typeof SYNTEXT_ERROR | typeof ATHENA_ERROR> =
|
|
|
541
603
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
542
604
|
({ ast } = parse(sql, { includeLocations: true }));
|
|
543
605
|
} catch (error) {
|
|
544
|
-
log('error
|
|
606
|
+
log('error parsing Athena SQL', { error, sql });
|
|
545
607
|
const pegLoc = (error as { location?: { start: { offset: number }; end: { offset: number } } }).location;
|
|
546
608
|
if (pegLoc !== undefined) {
|
|
547
609
|
const sourceText = context.sourceCode.getText();
|
|
@@ -551,13 +613,13 @@ const rule: ESLintUtils.RuleModule<typeof SYNTEXT_ERROR | typeof ATHENA_ERROR> =
|
|
|
551
613
|
end: offsetToLoc(sourceText, sqlOffsetToSource(pegLoc.end.offset, sqlMapping)),
|
|
552
614
|
},
|
|
553
615
|
messageId: SYNTEXT_ERROR,
|
|
554
|
-
data: { errorMessage:
|
|
616
|
+
data: { errorMessage: (error as Error).message },
|
|
555
617
|
});
|
|
556
618
|
} else {
|
|
557
619
|
context.report({
|
|
558
620
|
node: sqlNode,
|
|
559
621
|
messageId: SYNTEXT_ERROR,
|
|
560
|
-
data: { errorMessage:
|
|
622
|
+
data: { errorMessage: (error as Error).message },
|
|
561
623
|
});
|
|
562
624
|
}
|
|
563
625
|
return;
|
|
@@ -621,3 +683,5 @@ const rule: ESLintUtils.RuleModule<typeof SYNTEXT_ERROR | typeof ATHENA_ERROR> =
|
|
|
621
683
|
});
|
|
622
684
|
|
|
623
685
|
export default rule;
|
|
686
|
+
|
|
687
|
+
/* eslint-enable max-lines */
|
package/src/athena/visitor.ts
CHANGED
|
@@ -264,6 +264,19 @@ export function walk(node: unknown, visitor: VisitorMap): void {
|
|
|
264
264
|
// Convenience extractors — replace ad-hoc JSONPath queries.
|
|
265
265
|
// -------------------------------------------------------------------
|
|
266
266
|
|
|
267
|
+
/** Return true if the expression contains a lambda (`->`) subexpression. */
|
|
268
|
+
export function containsLambda(expr: unknown): boolean {
|
|
269
|
+
let found = false;
|
|
270
|
+
walkExpr(expr, {
|
|
271
|
+
visitBinary(node) {
|
|
272
|
+
if (node.operator === '->') {
|
|
273
|
+
found = true;
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
return found;
|
|
278
|
+
}
|
|
279
|
+
|
|
267
280
|
/** Collect all column_ref nodes within an expression subtree. */
|
|
268
281
|
export function extractColumnRefs(expr: unknown): ColumnRefItem[] {
|
|
269
282
|
const refs: ColumnRefItem[] = [];
|