@checkdigit/eslint-plugin 7.18.0-PR.143-1b97 → 7.18.0-PR.143-3aac

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.
@@ -2,7 +2,7 @@
2
2
  import { strict as assert } from "node:assert";
3
3
  import debug from "debug";
4
4
  import { JSONPath } from "jsonpath-plus";
5
- import { ESLintUtils } from "@typescript-eslint/utils";
5
+ import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
6
6
  import { parse } from "../peggy/athena-peggy.mjs";
7
7
  import { matchApi } from "./api-matcher.mjs";
8
8
  import { locateApi } from "./api-locator.mjs";
@@ -28,12 +28,46 @@ var SYNTEXT_ERROR = "SyntextError";
28
28
  var ATHENA_ERROR = "AthenaError";
29
29
  var AthenaError = class extends Error {
30
30
  code;
31
- constructor(code, message) {
31
+ ast;
32
+ constructor(code, message, ast) {
32
33
  super(message);
33
34
  this.code = code;
34
35
  this.name = "AthenaError";
36
+ if (ast !== void 0) {
37
+ this.ast = ast;
38
+ }
35
39
  }
36
40
  };
41
+ function offsetToLoc(text, offset) {
42
+ const prefix = text.slice(0, offset);
43
+ const lines = prefix.split("\n");
44
+ return { line: lines.length, column: lines[lines.length - 1]?.length ?? 0 };
45
+ }
46
+ function buildSqlMapping(sqlNode) {
47
+ if (sqlNode.type !== AST_NODE_TYPES.TemplateLiteral) {
48
+ return [{ sqlStart: 0, srcStart: sqlNode.range[0] + 1 }];
49
+ }
50
+ const rawSql = sqlNode.quasis.map((quasi) => quasi.value.cooked ?? "").join("");
51
+ const trimStart = rawSql.length - rawSql.trimStart().length;
52
+ const segments = [];
53
+ let sqlCursor = 0;
54
+ for (const [index, quasi] of sqlNode.quasis.entries()) {
55
+ const cooked = quasi.value.cooked ?? "";
56
+ const localTrim = index === 0 ? trimStart : 0;
57
+ segments.push({ sqlStart: sqlCursor, srcStart: quasi.range[0] + 1 + localTrim });
58
+ sqlCursor += cooked.length - localTrim;
59
+ }
60
+ return segments;
61
+ }
62
+ function sqlOffsetToSource(sqlOffset, segments) {
63
+ for (let index = segments.length - 1; index >= 0; index--) {
64
+ const seg = segments[index];
65
+ if (seg !== void 0 && sqlOffset >= seg.sqlStart) {
66
+ return seg.srcStart + (sqlOffset - seg.sqlStart);
67
+ }
68
+ }
69
+ return segments[0]?.srcStart ?? 0;
70
+ }
37
71
  function resolvedCol(name, schema, ast) {
38
72
  return ast !== void 0 ? { name, schema, ast } : { name, schema };
39
73
  }
@@ -147,7 +181,7 @@ function expandWildcard(referencedTables, columns) {
147
181
  }
148
182
  }
149
183
  }
150
- function resolveSchemaAtPath(colRef, propertyAccessor, resolvedColumns) {
184
+ function resolveSchemaAtPath(colRef, propertyAccessor, resolvedColumns, ast) {
151
185
  const adjustedPath = `$.${propertyAccessor.substring(1).replace(/(\.|\[)/gu, "..properties$1")}`;
152
186
  log("adjusted path", adjustedPath);
153
187
  const extractedSchemas = resolvedColumns.flatMap(
@@ -155,19 +189,20 @@ function resolveSchemaAtPath(colRef, propertyAccessor, resolvedColumns) {
155
189
  );
156
190
  log("extracted schemas", extractedSchemas);
157
191
  if (extractedSchemas.length === 0) {
158
- throw new AthenaError(ATHENA_ERROR, `property not found ${colRef} - ${propertyAccessor}`);
192
+ throw new AthenaError(ATHENA_ERROR, `property not found ${colRef} - ${propertyAccessor}`, ast);
159
193
  }
160
194
  return extractedSchemas;
161
195
  }
162
196
  function navigateSchemaPath(colRef, propertyAccessor, resolvedColumns, colName, columnAST, columns) {
163
- const extractedSchemas = resolveSchemaAtPath(colRef, propertyAccessor, resolvedColumns);
197
+ const errorAst = extractJsonExtractCalls(columnAST)[0]?.fnNode ?? columnAST;
198
+ const extractedSchemas = resolveSchemaAtPath(colRef, propertyAccessor, resolvedColumns, errorAst);
164
199
  columns.set(
165
200
  colName,
166
201
  extractedSchemas.map((schema) => resolvedCol(colName, schema, columnAST))
167
202
  );
168
203
  }
169
204
  function validateComplexColumnExpression(columnAST, allTables, ctx) {
170
- for (const { ref, path } of extractJsonExtractCalls(columnAST)) {
205
+ for (const { ref, path, fnNode } of extractJsonExtractCalls(columnAST)) {
171
206
  const tableRef = ref.table ?? void 0;
172
207
  const colRef = typeof ref.column === "string" ? ref.column : void 0;
173
208
  if (colRef === void 0) {
@@ -176,7 +211,7 @@ function validateComplexColumnExpression(columnAST, allTables, ctx) {
176
211
  const referencedTables = tableRef !== void 0 ? lookupTables(tableRef, ctx) : allTables;
177
212
  const resolvedColumns = referencedTables.flatMap((table) => table.columns.get(colRef) ?? []);
178
213
  if (resolvedColumns.length > 0) {
179
- resolveSchemaAtPath(colRef, path, resolvedColumns);
214
+ resolveSchemaAtPath(colRef, path, resolvedColumns, fnNode);
180
215
  }
181
216
  }
182
217
  }
@@ -195,7 +230,7 @@ function resolveSingleColumnRef(columnAST, columnAlias, indexedName, ref, allTab
195
230
  const resolvedColumns = referencedTables.flatMap((table) => table.columns.get(colRef) ?? []);
196
231
  if (resolvedColumns.length === 0) {
197
232
  const tableNames = [...ctx.tables.keys()].join(", ");
198
- throw new AthenaError(ATHENA_ERROR, `can't found column ${colRef} in tables: ${tableNames}`);
233
+ throw new AthenaError(ATHENA_ERROR, `can't found column ${colRef} in tables: ${tableNames}`, columnAST);
199
234
  }
200
235
  const propertyAccessor = extractJsonExtractPath(columnAST) ?? extractBracketAccessorPath(columnAST);
201
236
  if (propertyAccessor !== void 0) {
@@ -301,17 +336,31 @@ var rule = createRule({
301
336
  });
302
337
  return;
303
338
  }
339
+ const sqlMapping = buildSqlMapping(sqlNode);
304
340
  const athenaCtx = createRootContext();
305
341
  try {
306
342
  checkAthenaAst(Array.isArray(ast) ? ast[0] : ast, athenaCtx);
307
343
  } catch (error) {
308
344
  log("error checking Athena AST", { error, sql });
309
345
  if (error instanceof AthenaError) {
310
- context.report({
311
- node: sqlNode,
312
- messageId: ATHENA_ERROR,
313
- data: { errorMessage: error.message }
314
- });
346
+ const astLoc = error.ast?.loc;
347
+ if (astLoc !== void 0) {
348
+ const sourceText = context.sourceCode.getText();
349
+ context.report({
350
+ loc: {
351
+ start: offsetToLoc(sourceText, sqlOffsetToSource(astLoc.start.offset, sqlMapping)),
352
+ end: offsetToLoc(sourceText, sqlOffsetToSource(astLoc.end.offset, sqlMapping))
353
+ },
354
+ messageId: ATHENA_ERROR,
355
+ data: { errorMessage: error.message }
356
+ });
357
+ } else {
358
+ context.report({
359
+ node: sqlNode,
360
+ messageId: ATHENA_ERROR,
361
+ data: { errorMessage: error.message }
362
+ });
363
+ }
315
364
  } else {
316
365
  console.error(`Failed to apply ${ruleId} rule for "${context.filename}":`, error);
317
366
  context.report({
@@ -343,4 +392,4 @@ export {
343
392
  athena_default as default,
344
393
  ruleId
345
394
  };
346
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS9hdGhlbmEudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxVQUFVLGNBQWM7QUFFakMsT0FBTyxXQUFXO0FBQ2xCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsbUJBQWtDO0FBRzNDLFNBQVMsYUFBYTtBQUV0QixTQUFTLGdCQUFnQjtBQUN6QixTQUFTLGlCQUFpQjtBQUMxQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FJSztBQUNQLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRUEsSUFBTSxTQUFTO0FBRXRCLElBQU0sTUFBTSxNQUFNLHNCQUFzQjtBQUN4QyxJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxJQUFJO0FBRXpELElBQU0sZ0JBQWdCO0FBQ3RCLElBQU0sZUFBZTtBQUVyQixJQUFNLGNBQU4sY0FBMEIsTUFBTTtBQUFBLEVBQ3ZCO0FBQUEsRUFDUCxZQUFZLE1BQWMsU0FBaUI7QUFDekMsVUFBTSxPQUFPO0FBQ2IsU0FBSyxPQUFPO0FBQ1osU0FBSyxPQUFPO0FBQUEsRUFDZDtBQUNGO0FBTUEsU0FBUyxZQUFZLE1BQWMsUUFBc0IsS0FBOEI7QUFDckYsU0FBTyxRQUFRLFNBQVksRUFBRSxNQUFNLFFBQVEsSUFBSSxJQUFJLEVBQUUsTUFBTSxPQUFPO0FBQ3BFO0FBR0EsU0FBUyxjQUFjLGFBQXFCLEtBQW1CO0FBQzdELE1BQUksVUFBVSxJQUFJLFdBQVcsSUFBSSxXQUFXO0FBQzVDLE1BQUksWUFBWSxRQUFXO0FBQ3pCLGNBQVUsVUFBVSxXQUFXO0FBQy9CLFFBQUksV0FBVyxJQUFJLGFBQWEsT0FBTztBQUFBLEVBQ3pDO0FBQ0EsU0FBTztBQUNUO0FBR0EsU0FBUyxhQUFhLGFBQXFCLEtBQW9DO0FBQzdFLFFBQU0sWUFBWSxJ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QUFBQSxFQUNGO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLGFBQVMsU0FBUyxLQUFhLFNBQXdCO0FBQ3JELFVBQUksQ0FBQyxxRUFBcUUsS0FBSyxHQUFHLEdBQUc7QUFDbkYsWUFBSSxrQ0FBa0MsRUFBRSxJQUFJLENBQUM7QUFDN0M7QUFBQSxNQUNGO0FBRUEsVUFBSTtBQUNKLFVBQUk7QUFFRixTQUFDLEVBQUUsSUFBSSxJQUFJLE1BQU0sS0FBSyxFQUFFLGtCQUFrQixLQUFLLENBQUM7QUFBQSxNQUNsRCxTQUFTLE9BQU87QUFDZCxZQUFJLDZCQUE2QixFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQy9DLGdCQUFRLE9BQU87QUFBQSxVQUNiLE1BQU07QUFBQSxVQUNOLFdBQVc7QUFBQSxVQUNYLE1BQU0sRUFBRSxjQUFjLEtBQUssVUFBVSxPQUFPLFFBQVcsQ0FBQyxHQUFHLElBQUk7QUFBQSxRQUNqRSxDQUFDO0FBQ0Q7QUFBQSxNQUNGO0FBRUEsWUFBTSxZQUFZLGtCQUFrQjtBQUNwQyxVQUFJO0FBRUYsdUJBQWUsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVM7QUFBQSxNQUM3RCxTQUFTLE9BQU87QUFDZCxZQUFJLDZCQUE2QixFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQy9DLFlBQUksaUJBQWlCLGFBQWE7QUFDaEMsa0JBQVEsT0FBTztBQUFBLFlBQ2IsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFlBQ1gsTUFBTSxFQUFFLGNBQWMsTUFBTSxRQUFRO0FBQUEsVUFDdEMsQ0FBQztBQUFBLFFBQ0gsT0FBTztBQUVMLGtCQUFRLE1BQU0sbUJBQW1CLE1BQU0sY0FBYyxRQUFRLFFBQVEsTUFBTSxLQUFLO0FBQ2hGLGtCQUFRLE9BQU87QUFBQSxZQUNiLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxjQUNKLGNBQWMsaUJBQWlCLFFBQVEsT0FBTyxLQUFLLElBQUksS0FBSyxVQUFVLE9BQU8sUUFBVyxDQUFDO0FBQUEsWUFDM0Y7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsTUFDTCxnQkFBZ0IsU0FBUztBQUN2QixjQUFNLE1BQU0sUUFBUSxPQUNqQixJQUFJLENBQUMsVUFBVSxNQUFNLE1BQU0sTUFBTSxFQUNqQyxLQUFLLEVBQUUsRUFDUCxLQUFLO0FBQ1IsaUJBQVMsS0FBSyxPQUFPO0FBQUEsTUFDdkI7QUFBQSxNQUNBLFFBQVEsU0FBUztBQUNmLFlBQUksT0FBTyxRQUFRLFVBQVUsVUFBVTtBQUNyQztBQUFBLFFBQ0Y7QUFDQSxpQkFBUyxRQUFRLE9BQU8sT0FBTztBQUFBLE1BQ2pDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBRUQsSUFBTyxpQkFBUTsiLAogICJuYW1lcyI6IFsidGFibGVOYW1lIiwgImFsaWFzIiwgImFwaVNjaGVtYXMiLCAib3BlcmF0aW9ucyJdCn0K
395
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS9hdGhlbmEudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxVQUFVLGNBQWM7QUFFakMsT0FBTyxXQUFXO0FBQ2xCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsZ0JBQWdCLG1CQUFrQztBQUczRCxTQUFTLGFBQWE7QUFFdEIsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BSUs7QUFDUCxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVBLElBQU0sU0FBUztBQUV0QixJQUFNLE1BQU0sTUFBTSxzQkFBc0I7QUFDeEMsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsSUFBSTtBQUV6RCxJQUFNLGdCQUFnQjtBQUN0QixJQUFNLGVBQWU7QUFFckIsSUFBTSxjQUFOLGNBQTBCLE1BQU07QUFBQSxFQUN2QjtBQUFBLEVBQ0E7QUFBQSxFQUNQLFlBQVksTUFBYyxTQUFpQixLQUFjO0FBQ3ZELFVBQU0sT0FBTztBQUNiLFNBQUssT0FBTztBQUNaLFNBQUssT0FBTztBQUNaLFFBQUksUUFBUSxRQUFXO0FBQ3JCLFdBQUssTUFBTTtBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQ0Y7QUFHQSxTQUFTLFlBQVksTUFBYyxRQUFrRDtBQUNuRixRQUFNLFNBQVMsS0FBSyxNQUFNLEdBQUcsTUFBTTtBQUNuQyxRQUFNLFFBQVEsT0FBTyxNQUFNLElBQUk7QUFDL0IsU0FBTyxFQUFFLE1BQU0sTUFBTSxRQUFRLFFBQVEsTUFBTSxNQUFNLFNBQVMsQ0FBQyxHQUFHLFVBQVUsRUFBRTtBQUM1RTtBQVdBLFNBQVMsZ0JBQWdCLFNBQTRDO0FBQ25FLE1BQUksUUFBUSxTQUFTLGVBQWUsaUJBQWlCO0FBRW5ELFdBQU8s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
@@ -209,7 +209,7 @@ function extractJsonExtractCalls(expr) {
209
209
  if (ref === void 0 || typeof path !== "string") {
210
210
  return;
211
211
  }
212
- calls.push({ ref, path });
212
+ calls.push({ ref, path, fnNode: node });
213
213
  }
214
214
  });
215
215
  return calls;
@@ -255,4 +255,4 @@ export {
255
255
  isUnnestFrom,
256
256
  walk
257
257
  };
258
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS92aXNpdG9yLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLE9BQU8sV0FBVztBQUVsQixJQUFNLE1BQU0sTUFBTSxnQkFBZ0I7QUFpRTNCLFNBQVMsYUFBYSxNQUFtQztBQUM5RCxTQUFPLE9BQU8sU0FBUyxZQUFZLFNBQVMsUUFBUyxLQUE0QixTQUFTO0FBQzVGO0FBRU8sU0FBUyxPQUFPLE1BQTZCO0FBQ2xELFNBQU8sT0FBTyxTQUFTLFlBQVksU0FBUyxRQUFTLEtBQTRCLFNBQVM7QUFDNUY7QUFFTyxTQUFTLFlBQVksTUFBa0M7QUFDNUQsTUFBSSxPQUFPLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLE9BQVEsS0FBNEI7QUFDMUMsU0FBTyxPQUFPLFNBQVMsWUFBWSxTQUFTLFFBQVEsU0FBUztBQUMvRDtBQUVPLFNBQVMsT0FBTyxNQUE2QjtBQUNsRCxTQUNFLENBQUMsYUFBYSxJQUFJLEtBQ2xCLENBQUMsT0FBTyxJQUFJLEtBQ1osQ0FBQyxZQUFZLElBQUksS0FDakIsT0FBTyxTQUFTLFlBQ2hCLFNBQVMsUUFDVCxVQUFVO0FBRWQ7QUFFTyxTQUFTLFdBQVcsTUFBaUM7QUFDMUQsU0FDRSxDQUFDLGFBQWEsSUFBSSxLQUNsQixDQUFDLE9BQU8sSUFBSSxLQUNaLENBQUMsWUFBWSxJQUFJLEtBQ2pCLENBQUMsT0FBTyxJQUFJLEtBQ1osT0FBTyxTQUFTLFlBQ2hCLFNBQVMsUUFDVCxXQUFXO0FBRWY7QUFFTyxTQUFTLGNBQWMsTUFBaUQ7QUFDN0UsUUFBTSxRQUFRO0FBQ2QsU0FBTyxNQUFNLFFBQVEsTUFBTSxXQUFXLEtBQUssTUFBTSxZQUFZLFNBQVM7QUFDeEU7QUFPQSxTQUFTLFNBQVMsTUFBZSxTQUEyQjtBQUMxRCxNQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUM3QztBQUFBLEVBQ0Y7QUFDQSxRQUFNLFFBQVE7QUFFZCxVQUFRLE1BQU0sTUFBTSxHQUFHO0FBQUEsSUFDckIsS0FBSyxVQUFVO0FBRWIsV0FBSyxNQUFNLE9BQU87QUFDbEI7QUFBQSxJQUNGO0FBQUEsSUFDQSxLQUFLLFFBQVE7QUFDWCxlQUFVLEtBQWdCLE1BQU0sT0FBTztBQUN2QztBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssZUFBZTtBQUNsQixZQUFNLE1BQU07QUFDWixjQUFRLGNBQWMsR0FBRztBQUN6QixlQUFTLElBQUksTUFBTSxPQUFPO0FBQzFCLGVBQVMsSUFBSSxPQUFPLE9BQU87QUFDM0I7QUFBQSxJQUNGO0FBQUEsSUFDQSxLQUFLLGNBQWM7QUFDakIsY0FBUSxpQkFBaUIsSUFBcUI7QUFDOUM7QUFBQSxJQUNGO0FBQUEsSUFDQSxLQUFLLFlBQVk7QUFDZixZQUFNLEtBQUs7QUFDWCxjQUFRLGdCQUFnQixFQUFFO0FBQzFCLFVBQUksR0FBRyxTQUFTLFFBQVc7QUFDekIsaUJBQVMsR0FBRyxNQUFNLE9BQU87QUFBQSxNQUMzQjtBQUNBO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSyxhQUFhO0FBQ2hCLFlBQU0sTUFBTTtBQUNaLGNBQVEsZ0JBQWdCLEdBQUc7QUFDM0IsZUFBUyxJQUFJLEtBQUssTUFBTSxPQUFPO0FBQy9CO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSyxRQUFRO0FBQ1gsWUFBTSxPQUFPO0FBQ2IsY0FBUSxZQUFZLElBQUk7QUFDeEIsZUFBUyxLQUFLLE1BQU0sT0FBTztBQUMzQjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssUUFBUTtBQUNYLFlBQU0sV0FBVztBQUNqQixjQUFRLFlBQVksUUFBUTtBQUM1QixpQkFBVyxPQUFPLFNBQVMsTUFBTTtBQUMvQixZQUFJLFVBQVUsS0FBSztBQUNqQixtQkFBUyxJQUFJLE1BQU0sT0FBTztBQUFBLFFBQzVCO0FBQ0EsaUJBQVMsSUFBSSxRQUFRLE9BQU87QUFBQSxNQUM5QjtBQUNBO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSyxhQUFhO0FBQ2hCLFlBQU0sT0FBTztBQUNiLGNBQVEsZ0JBQWdCLElBQUk7QUFDNUIsaUJBQVcsUUFBUSxLQUFLLE9BQU87QUFDN0IsaUJBQVMsTUFBTSxPQUFPO0FBQUEsTUFDeEI7QUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVM7QUFFUCxVQUFJLE1BQU0sTUFBTSxNQUFNLFVBQWEsVUFBVSxPQUFPO0FBQ2xELGlCQUFTLE1BQU0sTUFBTSxHQUFHLE9BQU87QUFBQSxNQUNqQyxPQUFPO0FBQ0wsZ0JBQVEsYUFBYSxJQUF1QjtBQUFBLE1BQzlDO0FBQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxTQUFTLE1BQVksU0FBMkI7QUFDdkQsTUFBSSxPQUFPLElBQUksR0FBRztBQUNoQjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLGFBQWEsSUFBSSxHQUFHO0FBQ3RCLFlBQVEsY0FBYyxJQUFJO0FBQzFCO0FBQUEsRUFDRjtBQUNBLE1BQUksWUFBWSxJQUFJLEdBQUc7QUFDckIsWUFBUSxpQkFBaUIsSUFBSTtBQUU3QixTQUFLLEtBQUssS0FBSyxLQUFLLE9BQU87QUFDM0I7QUFBQSxFQUNGO0FBQ0EsTUFBSSxPQUFPLElBQUksR0FBRztBQUNoQixZQUFRLFlBQVksSUFBSTtBQUN4QixRQUFJLEtBQUssT0FBTyxRQUFXO0FBQ3pCLGVBQVMsS0FBSyxJQUFJLE9BQU87QUFBQSxJQUMzQjtBQUNBO0FBQUEsRUFDRjtBQUNBLFVBQVEsZ0JBQWdCLElBQUk7QUFDOUI7QUFNTyxTQUFTLEtBQUssTUFBZSxTQUEyQjtBQUM3RCxNQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUM3QztBQUFBLEVBQ0Y7QUFDQSxRQUFNLFFBQVE7QUFFZCxNQUFJLE1BQU0sTUFBTSxNQUFNLFVBQVU7QUFDOUIsVUFBTSxNQUFNO0FBQ1osWUFBUSxjQUFjLEdBQUc7QUFDekIsZUFBVyxZQUFZLElBQUksUUFBUSxDQUFDLEdBQUc7QUFDckMsY0FBUSxZQUFZLFFBQVE7QUFDNUIsV0FBSyxTQUFTLEtBQUssS0FBSyxPQUFPO0FBQUEsSUFDakM7QUFDQSxRQUFJO0FBQ0osUUFBSSxNQUFNLFFBQVEsSUFBSSxJQUFJLEdBQUc7QUFDM0Isa0JBQVksSUFBSTtBQUFBLElBQ2xCLFdBQVcsSUFBSSxTQUFTLE1BQU07QUFDNUIsa0JBQVksQ0FBQyxJQUFJLElBQUk7QUFBQSxJQUN2QixPQUFPO0FBQ0wsa0JBQVksQ0FBQztBQUFBLElBQ2Y7QUFDQSxlQUFXLFlBQVksV0FBVztBQUNoQyxlQUFTLFVBQVUsT0FBTztBQUFBLElBQzVCO0FBQ0EsZUFBVyxPQUFPLElBQUksU0FBUztBQUM3QixlQUFTLEtBQUssT0FBTztBQUFBLElBQ3ZCO0FBQ0EsUUFBSSxJQUFJLFVBQVUsTUFBTTtBQUN0QixlQUFTLElBQUksT0FBTyxPQUFPO0FBQUEsSUFDN0I7QUFDQSxRQUFJLElBQUksVUFBVSxRQUFXO0FBQzNCLFdBQUssSUFBSSxPQUFPLE9BQU87QUFBQSxJQUN6QjtBQUFBLEVBQ0YsT0FBTztBQUNMLGFBQVMsTUFBTSxPQUFPO0FBQUEsRUFDeEI7QUFDRjtBQU9PLFNBQVMsa0JBQWtCLE1BQWdDO0FBQ2hFLFFBQU0sT0FBd0IsQ0FBQztBQUMvQixXQUFTLE1BQU07QUFBQSxJQUNiLGVBQWUsTUFBTTtBQUNuQixXQUFLLEtBQUssSUFBSTtBQUFBLElBQ2hCO0FBQUEsRUFDRixDQUFDO0FBQ0QsU0FBTztBQUNUO0FBR08sU0FBUyx1QkFBdUIsTUFBbUM7QUFDeEUsTUFBSTtBQUNKLFdBQVMsTUFBTTtBQUFBLElBQ2IsY0FBYyxNQUFNO0FBQ2xCLFVBQUksU0FBUyxRQUFXO0FBQ3RCO0FBQUEsTUFDRjtBQUNBLFlBQU0sU0FBUyxLQUFLLEtBQUssS0FBSyxDQUFDLEdBQUc7QUFDbEMsVUFBSSxXQUFXLHlCQUF5QixXQUFXLGdCQUFnQjtBQUNqRSxjQUFNLFVBQVUsS0FBSyxNQUFNLE1BQU0sQ0FBQztBQUNsQyxZQUFJLFlBQVksUUFBVztBQUN6QixnQkFBTSxNQUFPLFFBQTJDO0FBQ3hELGNBQUksT0FBTyxRQUFRLFVBQVU7QUFDM0IsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUNBLFlBQUkscUNBQXFDLFFBQVEsSUFBSTtBQUFBLE1BQ3ZEO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNELFNBQU87QUFDVDtBQVFPLFNBQVMsd0JBQXdCLE1BQWtDO0FBQ3hFLFFBQU0sUUFBMkIsQ0FBQztBQUNsQyxXQUFTLE1BQU07QUFBQSxJQUNiLGNBQWMsTUFBTTtBQUNsQixZQUFNLFNBQVMsS0FBSyxLQUFLLEtBQUssQ0FBQyxHQUFHO0FBQ2xDLFVBQUksV0FBVyx5QkFBeUIsV0FBVyxnQkFBZ0I7QUFDakU7QUFBQSxNQUNGO0FBQ0EsWUFBTSxZQUFZLEtBQUssTUFBTSxNQUFNLENBQUM7QUFDcEMsWUFBTSxVQUFVLEtBQUssTUFBTSxNQUFNLENBQUM7QUFDbEMsVUFBSSxjQUFjLFVBQWEsWUFBWSxRQUFXO0FBQ3BEO0FBQUEsTUFDRjtBQUNBLFlBQU0sYUFBYSxrQkFBa0IsU0FBUztBQUM5QyxVQUFJLFdBQVcsV0FBVyxHQUFHO0FBQzNCO0FBQUEsTUFDRjtBQUNBLFlBQU0sQ0FBQyxHQUFHLElBQUk7QUFDZCxZQUFNLE9BQVEsUUFBMkM7QUFDekQsVUFBSSxRQUFRLFVBQWEsT0FBTyxTQUFTLFVBQVU7QUFDakQ7QUFBQSxNQUNGO0FBQ0EsWUFBTSxLQUFLLEVBQUUsS0FBSyxLQUFLLENBQUM7QUFBQSxJQUMxQjtBQUFBLEVBQ0YsQ0FBQztBQUNELFNBQU87QUFDVDtBQUdPLFNBQVMsMkJBQTJCLE1BQW1DO0FBQzVFLE1BQUk7QUFDSixXQUFTLE1BQU07QUFBQSxJQUNiLGVBQWUsTUFBTTtBQUNuQixVQUFJLFNBQVMsVUFBYSxDQUFDLGNBQWMsSUFBSSxHQUFHO0FBQzlDO0FBQUEsTUFDRjtBQUNBLFlBQU0sYUFBYSxLQUFLLFlBQVksQ0FBQyxHQUFHLE1BQU07QUFDOUMsVUFBSSxPQUFPLGVBQWUsVUFBVTtBQUNsQyxlQUFPLE1BQU0sVUFBVTtBQUFBLE1BQ3pCO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNELFNBQU87QUFDVDtBQUdPLFNBQVMsaUJBQWlCLE1BQXdCO0FBQ3ZELE1BQUksUUFBUTtBQUNaLFdBQVMsTUFBTTtBQUFBLElBQ2IsZ0JBQWdCO0FBQ2QsY0FBUTtBQUFBLElBQ1Y7QUFBQSxJQUNBLGdCQUFnQjtBQUNkLGNBQVE7QUFBQSxJQUNWO0FBQUEsRUFDRixDQUFDO0FBQ0QsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
258
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS92aXNpdG9yLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLE9BQU8sV0FBVztBQUVsQixJQUFNLE1BQU0sTUFBTSxnQkFBZ0I7QUFpRTNCLFNBQVMsYUFBYSxNQUFtQztBQUM5RCxTQUFPLE9BQU8sU0FBUyxZQUFZLFNBQVMsUUFBUyxLQUE0QixTQUFTO0FBQzVGO0FBRU8sU0FBUyxPQUFPLE1BQTZCO0FBQ2xELFNBQU8sT0FBTyxTQUFTLFlBQVksU0FBUyxRQUFTLEtBQTRCLFNBQVM7QUFDNUY7QUFFTyxTQUFTLFlBQVksTUFBa0M7QUFDNUQsTUFBSSxPQUFPLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLE9BQVEsS0FBNEI7QUFDMUMsU0FBTyxPQUFPLFNBQVMsWUFBWSxTQUFTLFFBQVEsU0FBUztBQUMvRDtBQUVPLFNBQVMsT0FBTyxNQUE2QjtBQUNsRCxTQUNFLENBQUMsYUFBYSxJQUFJLEtBQ2xCLENBQUMsT0FBTyxJQUFJLEtBQ1osQ0FBQyxZQUFZLElBQUksS0FDakIsT0FBTyxTQUFTLFlBQ2hCLFNBQVMsUUFDVCxVQUFVO0FBRWQ7QUFFTyxTQUFTLFdBQVcsTUFBaUM7QUFDMUQsU0FDRSxDQUFDLGFBQWEsSUFBSSxLQUNsQixDQUFDLE9BQU8sSUFBSSxLQUNaLENBQUMsWUFBWSxJQUFJLEtBQ2pCLENBQUMsT0FBTyxJQUFJLEtBQ1osT0FBTyxTQUFTLFlBQ2hCLFNBQVMsUUFDVCxXQUFXO0FBRWY7QUFFTyxTQUFTLGNBQWMsTUFBaUQ7QUFDN0UsUUFBTSxRQUFRO0FBQ2QsU0FBTyxNQUFNLFFBQVEsTUFBTSxXQUFXLEtBQUssTUFBTSxZQUFZLFNBQVM7QUFDeEU7QUFPQSxTQUFTLFNBQVMsTUFBZSxTQUEyQjtBQUMxRCxNQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUM3QztBQUFBLEVBQ0Y7QUFDQSxRQUFNLFFBQVE7QUFFZCxVQUFRLE1BQU0s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
@@ -54,6 +54,7 @@ export declare function extractJsonExtractPath(expr: unknown): string | undefine
54
54
  export interface JsonExtractCall {
55
55
  ref: ColumnRefItem;
56
56
  path: string;
57
+ fnNode: Function;
57
58
  }
58
59
  /** Collect ALL json_extract / json_extract_scalar calls as (source column_ref, path) pairs. */
59
60
  export declare function extractJsonExtractCalls(expr: unknown): JsonExtractCall[];
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"7.18.0-PR.143-1b97","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"}}}}
1
+ {"name":"@checkdigit/eslint-plugin","version":"7.18.0-PR.143-3aac","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"}}}}
@@ -10,7 +10,7 @@ import { strict as assert } from 'node:assert';
10
10
 
11
11
  import debug from 'debug';
12
12
  import { JSONPath } from 'jsonpath-plus';
13
- import { ESLintUtils, type TSESTree } from '@typescript-eslint/utils';
13
+ import { AST_NODE_TYPES, ESLintUtils, type TSESTree } from '@typescript-eslint/utils';
14
14
  import type { SchemaObject } from 'ajv/dist/2020';
15
15
 
16
16
  import { parse } from '../peggy/athena-peggy.ts';
@@ -46,11 +46,60 @@ const ATHENA_ERROR = 'AthenaError';
46
46
 
47
47
  class AthenaError extends Error {
48
48
  public code: string;
49
- constructor(code: string, message: string) {
49
+ public ast?: object;
50
+ constructor(code: string, message: string, ast?: object) {
50
51
  super(message);
51
52
  this.code = code;
52
53
  this.name = 'AthenaError';
54
+ if (ast !== undefined) {
55
+ this.ast = ast;
56
+ }
57
+ }
58
+ }
59
+
60
+ // Convert a 0-based character offset in `text` to a 1-based line / 0-based column ESLint location.
61
+ function offsetToLoc(text: string, offset: number): { line: number; column: number } {
62
+ const prefix = text.slice(0, offset);
63
+ const lines = prefix.split('\n');
64
+ return { line: lines.length, column: lines[lines.length - 1]?.length ?? 0 };
65
+ }
66
+
67
+ // Maps a SQL-string offset (as produced by the PEG parser) back to an absolute source offset.
68
+ // Each quasi in a TemplateLiteral contributes a segment; template expressions have no SQL width
69
+ // but do occupy source characters, so a naïve single-offset approach gives wrong results when
70
+ // the error location is in a quasi that follows one or more template expressions.
71
+ interface SqlSourceSegment {
72
+ sqlStart: number; // offset in the trimmed SQL where this quasi's content begins
73
+ srcStart: number; // absolute source offset where this quasi's content begins
74
+ }
75
+
76
+ function buildSqlMapping(sqlNode: TSESTree.Node): SqlSourceSegment[] {
77
+ if (sqlNode.type !== AST_NODE_TYPES.TemplateLiteral) {
78
+ // String literals: single segment, content starts one char after the opening quote.
79
+ return [{ sqlStart: 0, srcStart: sqlNode.range[0] + 1 }];
80
+ }
81
+ const rawSql = sqlNode.quasis.map((quasi) => quasi.value.cooked ?? '').join('');
82
+ const trimStart = rawSql.length - rawSql.trimStart().length;
83
+ const segments: SqlSourceSegment[] = [];
84
+ let sqlCursor = 0;
85
+ for (const [index, quasi] of sqlNode.quasis.entries()) {
86
+ const cooked = quasi.value.cooked ?? '';
87
+ const localTrim = index === 0 ? trimStart : 0;
88
+ // quasi.range[0] is the opening backtick (index 0) or the closing } of the preceding expression.
89
+ segments.push({ sqlStart: sqlCursor, srcStart: quasi.range[0] + 1 + localTrim });
90
+ sqlCursor += cooked.length - localTrim;
53
91
  }
92
+ return segments;
93
+ }
94
+
95
+ function sqlOffsetToSource(sqlOffset: number, segments: SqlSourceSegment[]): number {
96
+ for (let index = segments.length - 1; index >= 0; index--) {
97
+ const seg = segments[index];
98
+ if (seg !== undefined && sqlOffset >= seg.sqlStart) {
99
+ return seg.srcStart + (sqlOffset - seg.sqlStart);
100
+ }
101
+ }
102
+ return segments[0]?.srcStart ?? 0;
54
103
  }
55
104
 
56
105
  // ---------------------------------------------------------------------------
@@ -233,6 +282,7 @@ function resolveSchemaAtPath(
233
282
  colRef: string,
234
283
  propertyAccessor: string,
235
284
  resolvedColumns: ResolvedColumn[],
285
+ ast?: object,
236
286
  ): SchemaObject[] {
237
287
  // Double-dot handles allOf / anyOf / oneOf wrappers that may appear in the schema.
238
288
  // eslint-disable-next-line prefer-named-capture-group
@@ -245,7 +295,7 @@ function resolveSchemaAtPath(
245
295
  log('extracted schemas', extractedSchemas);
246
296
 
247
297
  if (extractedSchemas.length === 0) {
248
- throw new AthenaError(ATHENA_ERROR, `property not found ${colRef} - ${propertyAccessor}`);
298
+ throw new AthenaError(ATHENA_ERROR, `property not found ${colRef} - ${propertyAccessor}`, ast);
249
299
  }
250
300
  return extractedSchemas;
251
301
  }
@@ -258,7 +308,9 @@ function navigateSchemaPath(
258
308
  columnAST: unknown,
259
309
  columns: Map<string, ResolvedColumn[]>,
260
310
  ): void {
261
- const extractedSchemas = resolveSchemaAtPath(colRef, propertyAccessor, resolvedColumns);
311
+ // Prefer the inner function/expression node for location: the Column wrapper rarely carries loc.
312
+ const errorAst = (extractJsonExtractCalls(columnAST)[0]?.fnNode ?? columnAST) as object;
313
+ const extractedSchemas = resolveSchemaAtPath(colRef, propertyAccessor, resolvedColumns, errorAst);
262
314
  columns.set(
263
315
  colName,
264
316
  extractedSchemas.map((schema) => resolvedCol(colName, schema, columnAST as object)),
@@ -271,7 +323,7 @@ function navigateSchemaPath(
271
323
 
272
324
  /** Validate all json_extract / json_extract_scalar paths in a complex column expression. */
273
325
  function validateComplexColumnExpression(columnAST: unknown, allTables: ResolvedTable[], ctx: VisitContext): void {
274
- for (const { ref, path } of extractJsonExtractCalls(columnAST)) {
326
+ for (const { ref, path, fnNode } of extractJsonExtractCalls(columnAST)) {
275
327
  const tableRef = ref.table ?? undefined;
276
328
  const colRef = typeof ref.column === 'string' ? ref.column : undefined;
277
329
  if (colRef === undefined) {
@@ -280,7 +332,7 @@ function validateComplexColumnExpression(columnAST: unknown, allTables: Resolved
280
332
  const referencedTables = tableRef !== undefined ? lookupTables(tableRef, ctx) : allTables;
281
333
  const resolvedColumns = referencedTables.flatMap((table) => table.columns.get(colRef) ?? []);
282
334
  if (resolvedColumns.length > 0) {
283
- resolveSchemaAtPath(colRef, path, resolvedColumns); // throws if path not found
335
+ resolveSchemaAtPath(colRef, path, resolvedColumns, fnNode); // throws if path not found
284
336
  }
285
337
  }
286
338
  }
@@ -313,7 +365,7 @@ function resolveSingleColumnRef(
313
365
 
314
366
  if (resolvedColumns.length === 0) {
315
367
  const tableNames = [...ctx.tables.keys()].join(', ');
316
- throw new AthenaError(ATHENA_ERROR, `can't found column ${colRef} in tables: ${tableNames}`);
368
+ throw new AthenaError(ATHENA_ERROR, `can't found column ${colRef} in tables: ${tableNames}`, columnAST as object);
317
369
  }
318
370
 
319
371
  const propertyAccessor = extractJsonExtractPath(columnAST) ?? extractBracketAccessorPath(columnAST);
@@ -461,6 +513,7 @@ const rule: ESLintUtils.RuleModule<typeof SYNTEXT_ERROR | typeof ATHENA_ERROR> =
461
513
  return;
462
514
  }
463
515
 
516
+ const sqlMapping = buildSqlMapping(sqlNode);
464
517
  const athenaCtx = createRootContext();
465
518
  try {
466
519
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
@@ -468,11 +521,25 @@ const rule: ESLintUtils.RuleModule<typeof SYNTEXT_ERROR | typeof ATHENA_ERROR> =
468
521
  } catch (error) {
469
522
  log('error checking Athena AST', { error, sql });
470
523
  if (error instanceof AthenaError) {
471
- context.report({
472
- node: sqlNode,
473
- messageId: ATHENA_ERROR,
474
- data: { errorMessage: error.message },
475
- });
524
+ const astLoc = (error.ast as { loc?: { start: { offset: number }; end: { offset: number } } } | undefined)
525
+ ?.loc;
526
+ if (astLoc !== undefined) {
527
+ const sourceText = context.sourceCode.getText();
528
+ context.report({
529
+ loc: {
530
+ start: offsetToLoc(sourceText, sqlOffsetToSource(astLoc.start.offset, sqlMapping)),
531
+ end: offsetToLoc(sourceText, sqlOffsetToSource(astLoc.end.offset, sqlMapping)),
532
+ },
533
+ messageId: ATHENA_ERROR,
534
+ data: { errorMessage: error.message },
535
+ });
536
+ } else {
537
+ context.report({
538
+ node: sqlNode,
539
+ messageId: ATHENA_ERROR,
540
+ data: { errorMessage: error.message },
541
+ });
542
+ }
476
543
  } else {
477
544
  // eslint-disable-next-line no-console
478
545
  console.error(`Failed to apply ${ruleId} rule for "${context.filename}":`, error);
@@ -302,6 +302,7 @@ export function extractJsonExtractPath(expr: unknown): string | undefined {
302
302
  export interface JsonExtractCall {
303
303
  ref: ColumnRefItem;
304
304
  path: string;
305
+ fnNode: Function;
305
306
  }
306
307
 
307
308
  /** Collect ALL json_extract / json_extract_scalar calls as (source column_ref, path) pairs. */
@@ -327,7 +328,7 @@ export function extractJsonExtractCalls(expr: unknown): JsonExtractCall[] {
327
328
  if (ref === undefined || typeof path !== 'string') {
328
329
  return;
329
330
  }
330
- calls.push({ ref, path });
331
+ calls.push({ ref, path, fnNode: node });
331
332
  },
332
333
  });
333
334
  return calls;