eslint-plugin-slonik 1.3.0 → 1.4.0
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/config.cjs +1 -1
- package/dist/config.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/shared/{eslint-plugin-slonik.DAMzIGnl.mjs → eslint-plugin-slonik.CCCn4mCE.mjs} +48 -18
- package/dist/shared/eslint-plugin-slonik.CCCn4mCE.mjs.map +1 -0
- package/dist/shared/{eslint-plugin-slonik.CRMCnC9V.cjs → eslint-plugin-slonik.yAav42tm.cjs} +49 -19
- package/dist/shared/eslint-plugin-slonik.yAav42tm.cjs.map +1 -0
- package/package.json +1 -1
- package/dist/shared/eslint-plugin-slonik.CRMCnC9V.cjs.map +0 -1
- package/dist/shared/eslint-plugin-slonik.DAMzIGnl.mjs.map +0 -1
package/dist/config.cjs
CHANGED
package/dist/config.mjs
CHANGED
package/dist/index.cjs
CHANGED
package/dist/index.mjs
CHANGED
|
@@ -24,7 +24,16 @@ const PRIMITIVES = {
|
|
|
24
24
|
any: "any"
|
|
25
25
|
};
|
|
26
26
|
function getResolvedTargetByTypeNode(params) {
|
|
27
|
-
|
|
27
|
+
if (!params.typeNode) {
|
|
28
|
+
console.error("[slonik/check-sql] DEBUG: typeNode is undefined in getResolvedTargetByTypeNode");
|
|
29
|
+
throw new Error("typeNode is undefined");
|
|
30
|
+
}
|
|
31
|
+
const tsNode = params.parser.esTreeNodeToTSNodeMap.get(params.typeNode);
|
|
32
|
+
if (!tsNode) {
|
|
33
|
+
console.error("[slonik/check-sql] DEBUG: Could not map ESTree node to TS node. typeNode.type:", params.typeNode.type);
|
|
34
|
+
throw new Error(`Could not map ESTree node (type: ${params.typeNode.type}) to TS node`);
|
|
35
|
+
}
|
|
36
|
+
const typeText = tsNode.getText();
|
|
28
37
|
if (isReservedType(typeText, params.reservedTypes)) {
|
|
29
38
|
return { kind: "type", value: typeText };
|
|
30
39
|
}
|
|
@@ -623,6 +632,14 @@ function mapTemplateLiteralToQueryText(quasi, parser, checker, options, sourceCo
|
|
|
623
632
|
}
|
|
624
633
|
const position = $queryText.length;
|
|
625
634
|
const expression = quasi.expressions[quasiIdx];
|
|
635
|
+
if (!expression) {
|
|
636
|
+
console.error("[slonik/check-sql] DEBUG: expression is undefined at index", quasiIdx, {
|
|
637
|
+
quasiCount: quasi.quasis.length,
|
|
638
|
+
expressionCount: quasi.expressions.length,
|
|
639
|
+
queryTextSoFar: $queryText
|
|
640
|
+
});
|
|
641
|
+
continue;
|
|
642
|
+
}
|
|
626
643
|
const slonikArrayType = extractSlonikArrayType(expression);
|
|
627
644
|
if (slonikArrayType !== null) {
|
|
628
645
|
const placeholder2 = `$${++$idx}::${slonikArrayType}`;
|
|
@@ -1202,16 +1219,21 @@ function reportCheck(params) {
|
|
|
1202
1219
|
E.bind("checker", ({ parser }) => {
|
|
1203
1220
|
return !parser.program ? E.left(new InvalidConfigError("Type checker is not available")) : E.right(parser.program.getTypeChecker());
|
|
1204
1221
|
}),
|
|
1205
|
-
E.bindW(
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1222
|
+
E.bindW("query", ({ parser, checker }) => {
|
|
1223
|
+
try {
|
|
1224
|
+
return mapTemplateLiteralToQueryText(
|
|
1225
|
+
tag.quasi,
|
|
1226
|
+
parser,
|
|
1227
|
+
checker,
|
|
1228
|
+
params.connection,
|
|
1229
|
+
params.context.sourceCode
|
|
1230
|
+
);
|
|
1231
|
+
} catch (error) {
|
|
1232
|
+
console.error("[slonik/check-sql] DEBUG: Error in mapTemplateLiteralToQueryText:", error);
|
|
1233
|
+
console.error("[slonik/check-sql] DEBUG: Query template:", context.sourceCode.getText(tag));
|
|
1234
|
+
throw error;
|
|
1235
|
+
}
|
|
1236
|
+
}),
|
|
1215
1237
|
E.bindW("result", ({ query }) => {
|
|
1216
1238
|
if (query === null) {
|
|
1217
1239
|
return E.right(null);
|
|
@@ -1390,12 +1412,20 @@ function getTypeAnnotationState({
|
|
|
1390
1412
|
return "INVALID";
|
|
1391
1413
|
}
|
|
1392
1414
|
const typeNode = typeParameter.params[0];
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1415
|
+
let expected;
|
|
1416
|
+
try {
|
|
1417
|
+
expected = getResolvedTargetByTypeNode({
|
|
1418
|
+
checker,
|
|
1419
|
+
parser,
|
|
1420
|
+
typeNode,
|
|
1421
|
+
reservedTypes
|
|
1422
|
+
});
|
|
1423
|
+
} catch (error) {
|
|
1424
|
+
console.error("[slonik/check-sql] DEBUG: Error in getResolvedTargetByTypeNode:", error);
|
|
1425
|
+
console.error("[slonik/check-sql] DEBUG: typeNode:", typeNode);
|
|
1426
|
+
console.error("[slonik/check-sql] DEBUG: typeNode.type:", typeNode?.type);
|
|
1427
|
+
throw error;
|
|
1428
|
+
}
|
|
1399
1429
|
return getResolvedTargetsEquality({
|
|
1400
1430
|
expected,
|
|
1401
1431
|
generated,
|
|
@@ -1490,4 +1520,4 @@ const rules = {
|
|
|
1490
1520
|
};
|
|
1491
1521
|
|
|
1492
1522
|
export { rules as r };
|
|
1493
|
-
//# sourceMappingURL=eslint-plugin-slonik.
|
|
1523
|
+
//# sourceMappingURL=eslint-plugin-slonik.CCCn4mCE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint-plugin-slonik.CCCn4mCE.mjs","sources":["../../src/utils/get-resolved-target-by-type-node.ts","../../src/utils/is-in-editor.ts","../../src/utils/memoize.ts","../../src/utils/node.utils.ts","../../src/utils/ts.utils.ts","../../src/utils/query-context.ts","../../src/utils/ts-pg.utils.ts","../../src/workers/index.ts","../../src/rules/RuleOptions.ts","../../src/rules/check-sql.config.ts","../../src/rules/check-sql.rule.ts","../../src/rules/index.ts"],"sourcesContent":["import { ParserServices, TSESTree } from \"@typescript-eslint/utils\";\nimport ts from \"typescript\";\n\ntype GetResolvedTargetByTypeNodeParams = {\n typeNode: TSESTree.TypeNode;\n parser: ParserServices;\n checker: ts.TypeChecker;\n reservedTypes: Set<string>;\n};\n\nexport type ExpectedResolvedTarget =\n | { kind: \"type\"; value: string; base?: string }\n | { kind: \"literal\"; value: string; base: ExpectedResolvedTarget }\n | { kind: \"union\"; value: ExpectedResolvedTarget[] }\n | { kind: \"array\"; value: ExpectedResolvedTarget; syntax?: \"array-type\" | \"type-reference\" }\n | { kind: \"object\"; value: ExpectedResolvedTargetEntry[] };\n\nexport type ExpectedResolvedTargetEntry = [string, ExpectedResolvedTarget];\n\nconst PRIMITIVES = {\n string: \"string\",\n number: \"number\",\n boolean: \"boolean\",\n false: \"false\",\n true: \"true\",\n null: \"null\",\n undefined: \"undefined\",\n any: \"any\",\n} as const;\n\nexport function getResolvedTargetByTypeNode(\n params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n if (!params.typeNode) {\n console.error('[slonik/check-sql] DEBUG: typeNode is undefined in getResolvedTargetByTypeNode');\n throw new Error('typeNode is undefined');\n }\n\n const tsNode = params.parser.esTreeNodeToTSNodeMap.get(params.typeNode);\n if (!tsNode) {\n console.error('[slonik/check-sql] DEBUG: Could not map ESTree node to TS node. typeNode.type:', params.typeNode.type);\n throw new Error(`Could not map ESTree node (type: ${params.typeNode.type}) to TS node`);\n }\n\n const typeText = tsNode.getText();\n\n if (isReservedType(typeText, params.reservedTypes)) {\n return { kind: \"type\", value: typeText };\n }\n\n switch (params.typeNode.type) {\n case TSESTree.AST_NODE_TYPES.TSLiteralType:\n return handleLiteralType(params.typeNode);\n\n case TSESTree.AST_NODE_TYPES.TSUnionType:\n return {\n kind: \"union\",\n value: params.typeNode.types.map((type) =>\n getResolvedTargetByTypeNode({ ...params, typeNode: type }),\n ),\n };\n\n case TSESTree.AST_NODE_TYPES.TSNullKeyword:\n return { kind: \"type\", value: \"null\" };\n\n case TSESTree.AST_NODE_TYPES.TSUndefinedKeyword:\n return { kind: \"type\", value: \"undefined\" };\n\n case TSESTree.AST_NODE_TYPES.TSTypeLiteral:\n return handleTypeLiteral(params.typeNode, params);\n\n case TSESTree.AST_NODE_TYPES.TSTypeReference:\n return handleTypeReference(params.typeNode, params);\n\n case TSESTree.AST_NODE_TYPES.TSIntersectionType:\n return handleIntersectionType(params.typeNode, params);\n\n case TSESTree.AST_NODE_TYPES.TSArrayType:\n return {\n kind: \"array\",\n value: getResolvedTargetByTypeNode({\n ...params,\n typeNode: params.typeNode.elementType,\n }),\n };\n\n default:\n return { kind: \"type\", value: typeText };\n }\n}\n\nfunction isReservedType(typeText: string, reservedTypes: Set<string>): boolean {\n return reservedTypes.has(typeText) || reservedTypes.has(`${typeText}[]`);\n}\n\nfunction handleLiteralType(typeNode: TSESTree.TSLiteralType): ExpectedResolvedTarget {\n return typeNode.literal.type === TSESTree.AST_NODE_TYPES.Literal\n ? { kind: \"type\", value: `'${typeNode.literal.value}'` }\n : { kind: \"type\", value: \"unknown\" };\n}\n\nfunction handleTypeLiteral(\n typeNode: TSESTree.TSTypeLiteral,\n params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n const properties = typeNode.members.flatMap((member) => {\n if (member.type !== TSESTree.AST_NODE_TYPES.TSPropertySignature || !member.typeAnnotation) {\n return [];\n }\n\n const key = extractPropertyKey(member.key);\n if (!key) return [];\n\n const propertyName = member.optional ? `${key}?` : key;\n const propertyType = getResolvedTargetByTypeNode({\n ...params,\n typeNode: member.typeAnnotation.typeAnnotation,\n });\n\n return [[propertyName, propertyType] as ExpectedResolvedTargetEntry];\n });\n\n return { kind: \"object\", value: properties };\n}\n\nfunction extractPropertyKey(key: TSESTree.PropertyName): string | undefined {\n switch (key.type) {\n case TSESTree.AST_NODE_TYPES.Identifier:\n return key.name;\n case TSESTree.AST_NODE_TYPES.Literal:\n return String(key.value);\n default:\n return undefined;\n }\n}\n\nfunction handleTypeReference(\n typeNode: TSESTree.TSTypeReference,\n params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n if (\n typeNode.typeName.type !== TSESTree.AST_NODE_TYPES.Identifier &&\n typeNode.typeName.type !== TSESTree.AST_NODE_TYPES.TSQualifiedName\n ) {\n return { kind: \"type\", value: \"unknown\" };\n }\n\n const typeNameText = params.parser.esTreeNodeToTSNodeMap.get(typeNode.typeName).getText();\n\n if (params.reservedTypes.has(typeNameText)) {\n return { kind: \"type\", value: typeNameText };\n }\n\n if (typeNameText === \"Array\" && typeNode.typeArguments?.params[0]) {\n return {\n kind: \"array\",\n syntax: \"type-reference\",\n value: getResolvedTargetByTypeNode({\n ...params,\n typeNode: typeNode.typeArguments.params[0],\n }),\n };\n }\n\n const type = params.checker.getTypeFromTypeNode(\n params.parser.esTreeNodeToTSNodeMap.get(typeNode),\n );\n return resolveType(type, { ...params, typeNode });\n}\n\nfunction handleIntersectionType(\n typeNode: TSESTree.TSIntersectionType,\n params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n const allProperties = typeNode.types.flatMap((type) => {\n const resolved = getResolvedTargetByTypeNode({ ...params, typeNode: type });\n return resolved.kind === \"object\" ? resolved.value : [];\n });\n\n return { kind: \"object\", value: Array.from(new Map(allProperties).entries()) };\n}\n\nfunction resolveType(\n type: ts.Type,\n params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n const typeAsString = params.checker.typeToString(type);\n\n if (params.reservedTypes.has(typeAsString)) {\n return { kind: \"type\", value: typeAsString };\n }\n\n if (params.reservedTypes.has(`${typeAsString}[]`)) {\n return { kind: \"array\", value: { kind: \"type\", value: typeAsString.replace(\"[]\", \"\") } };\n }\n\n const primitive = getPrimitiveType(type, typeAsString);\n if (primitive) return primitive;\n\n if (type.isLiteral()) {\n return { kind: \"type\", value: `'${type.value}'` };\n }\n\n if (type.isUnion()) {\n return handleUnionTypeReference(type, params);\n }\n\n if (type.isIntersection()) {\n return handleIntersectionTypeReference(type, params);\n }\n\n if (params.checker.isArrayType(type)) {\n return handleArrayTypeReferenceFromType(type, params);\n }\n\n return handleObjectType(type, params);\n}\n\nfunction getPrimitiveType(type: ts.Type, typeAsString: string): ExpectedResolvedTarget | null {\n if (PRIMITIVES[typeAsString as keyof typeof PRIMITIVES]) {\n return { kind: \"type\", value: PRIMITIVES[typeAsString as keyof typeof PRIMITIVES] };\n }\n\n const flagMap = {\n [ts.TypeFlags.String]: \"string\",\n [ts.TypeFlags.Number]: \"number\",\n [ts.TypeFlags.Boolean]: \"boolean\",\n [ts.TypeFlags.Null]: \"null\",\n [ts.TypeFlags.Undefined]: \"undefined\",\n [ts.TypeFlags.Any]: \"any\",\n } as const;\n\n return flagMap[type.flags as keyof typeof flagMap]\n ? { kind: \"type\", value: flagMap[type.flags as keyof typeof flagMap] }\n : null;\n}\n\nfunction handleUnionTypeReference(\n type: ts.UnionType,\n params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n const types = type.types.map((t) => resolveType(t, params));\n\n const isBooleanUnionWithNull =\n types.length === 3 &&\n types.some((t) => t.value === \"false\") &&\n types.some((t) => t.value === \"true\") &&\n types.some((t) => t.value === \"null\");\n\n if (isBooleanUnionWithNull) {\n return {\n kind: \"union\",\n value: [\n { kind: \"type\", value: \"boolean\" },\n { kind: \"type\", value: \"null\" },\n ],\n };\n }\n\n return { kind: \"union\", value: types };\n}\n\nfunction handleIntersectionTypeReference(\n type: ts.IntersectionType,\n params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n const properties = type.types.flatMap((t) => {\n const resolved = resolveType(t, params);\n return resolved.kind === \"object\" ? resolved.value : [];\n });\n\n return { kind: \"object\", value: properties };\n}\n\nfunction handleArrayTypeReferenceFromType(\n type: ts.Type,\n params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n const typeArguments = (type as ts.TypeReference).typeArguments;\n const firstArgument = typeArguments?.[0];\n\n if (firstArgument) {\n const elementType = resolveType(firstArgument, params);\n return { kind: \"array\", value: elementType };\n }\n\n return { kind: \"array\", value: { kind: \"type\", value: \"unknown\" } };\n}\n\nfunction handleObjectType(\n type: ts.Type,\n params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n if (!type.symbol) {\n return { kind: \"type\", value: type.aliasSymbol?.escapedName.toString() ?? \"unknown\" };\n }\n\n if (type.symbol.valueDeclaration) {\n const declaration = type.symbol.valueDeclaration;\n const sourceFile = declaration.getSourceFile();\n const filePath = sourceFile.fileName;\n\n if (!filePath.includes(\"node_modules\")) {\n return extractObjectProperties(type, params);\n }\n\n return { kind: \"type\", value: type.symbol.name };\n }\n\n if (type.flags === ts.TypeFlags.Object) {\n return extractObjectProperties(type, params);\n }\n\n return { kind: \"object\", value: [] };\n}\n\nfunction extractObjectProperties(\n type: ts.Type,\n params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n const properties = type.getProperties().map((property): ExpectedResolvedTargetEntry => {\n const key = property.escapedName.toString();\n const propType = params.checker.getTypeOfSymbolAtLocation(\n property,\n params.parser.esTreeNodeToTSNodeMap.get(params.typeNode),\n );\n\n const resolvedType = resolveType(propType, params);\n return [key, resolvedType];\n });\n\n return { kind: \"object\", value: properties };\n}\n","/* eslint-disable no-constant-binary-expression */\n// https://github.com/antfu/eslint-config/blob/de2d48d0f4409c66fccbf0872896f00c202f7bf1/src/utils.ts#L135\nexport function isInEditorEnv(): boolean {\n if (process.env.CI) return false;\n if (isInGitHooksOrLintStaged()) return false;\n return !!(\n false ||\n process.env.VSCODE_PID ||\n process.env.VSCODE_CWD ||\n process.env.JETBRAINS_IDE ||\n process.env.VIM ||\n process.env.NVIM\n );\n}\n\nexport function isInGitHooksOrLintStaged(): boolean {\n return !!(\n false ||\n process.env.GIT_PARAMS ||\n process.env.VSCODE_GIT_COMMAND ||\n process.env.npm_lifecycle_script?.startsWith(\"lint-staged\")\n );\n}\n","const memoized = new Map();\n\nexport function memoize<T>(params: { key: string; value: () => T }): T {\n const { key, value } = params;\n\n if (memoized.has(key)) {\n return memoized.get(key);\n }\n\n const result = value();\n\n memoized.set(key, result);\n\n return result;\n}\n","import path from \"path\";\nimport fs from \"fs\";\n\nexport function locateNearestPackageJsonDir(filePath: string): string {\n const dir = path.dirname(filePath);\n const packageJsonFile = path.join(dir, \"package.json\");\n if (fs.existsSync(packageJsonFile)) {\n return dir;\n }\n return locateNearestPackageJsonDir(dir);\n}\n","import ts from \"typescript\";\n\ntype EnumKind =\n | { kind: \"Const\" }\n | { kind: \"Numeric\" }\n | { kind: \"String\"; values: string[] }\n | { kind: \"Heterogeneous\" };\n\nexport const TSUtils = {\n isTypeUnion: (typeNode: ts.TypeNode | undefined): typeNode is ts.UnionTypeNode => {\n return typeNode?.kind === ts.SyntaxKind.UnionType;\n },\n isTsUnionType(type: ts.Type): type is ts.UnionType {\n return type.flags === ts.TypeFlags.Union;\n },\n isTsTypeReference(type: ts.Type): type is ts.TypeReference {\n return TSUtils.isTsObjectType(type) && type.objectFlags === ts.ObjectFlags.Reference;\n },\n isTsArrayUnionType(\n checker: ts.TypeChecker,\n type: ts.Type,\n ): type is ts.ObjectType & {\n objectFlags: ts.ObjectFlags.Reference;\n resolvedTypeArguments: (ts.TypeReference & { types: [ts.UnionType] })[];\n } {\n if (!TSUtils.isTsTypeReference(type)) {\n return false;\n }\n\n const firstArgument = checker.getTypeArguments(type)[0];\n\n if (firstArgument === undefined) {\n return false;\n }\n\n return TSUtils.isTsUnionType(firstArgument);\n },\n isTsObjectType(type: ts.Type): type is ts.ObjectType {\n return type.flags === ts.TypeFlags.Object;\n },\n getEnumKind(type: ts.Type): EnumKind | undefined {\n const symbol = type.getSymbol();\n if (!symbol || !(symbol.flags & ts.SymbolFlags.Enum)) {\n return undefined; // Not an enum\n }\n\n const declarations = symbol.getDeclarations();\n if (!declarations) {\n return undefined;\n }\n\n let hasString = false;\n let hasNumeric = false;\n const stringValues: string[] = [];\n\n for (const declaration of declarations) {\n if (ts.isEnumDeclaration(declaration)) {\n for (const member of declaration.members) {\n const initializer = member.initializer;\n\n if (initializer) {\n if (ts.isStringLiteralLike(initializer)) {\n hasString = true;\n stringValues.push(initializer.text);\n }\n\n if (initializer.kind === ts.SyntaxKind.NumericLiteral) {\n hasNumeric = true;\n }\n } else {\n // Members without initializers are numeric by default\n hasNumeric = true;\n }\n }\n }\n }\n\n // Determine the kind of enum\n if (symbol.flags & ts.SymbolFlags.ConstEnum) {\n return { kind: \"Const\" };\n }\n\n if (hasString && hasNumeric) {\n return { kind: \"Heterogeneous\" };\n }\n\n if (hasString) {\n return { kind: \"String\", values: stringValues };\n }\n\n return { kind: \"Numeric\" };\n },\n};\n","const keywords = [\n \"WITH\",\n \"SELECT\",\n \"FROM\",\n \"WHERE\",\n \"GROUP BY\",\n \"HAVING\",\n \"WINDOW\",\n \"ORDER BY\",\n \"PARTITION BY\",\n \"LIMIT\",\n \"OFFSET\",\n \"INSERT INTO\",\n \"VALUES\",\n \"UPDATE\",\n \"SET\",\n \"RETURNING\",\n \"ON\",\n \"JOIN\",\n \"INNER JOIN\",\n \"LEFT JOIN\",\n \"RIGHT JOIN\",\n \"FULL JOIN\",\n \"FULL OUTER JOIN\",\n \"CROSS JOIN\",\n \"WHEN\",\n \"USING\",\n \"UNION\",\n \"UNION ALL\",\n \"INTERSECT\",\n \"EXCEPT\",\n] as const;\n\nconst keywordSet = new Set(keywords);\ntype Keyword = (typeof keywords)[number];\ntype Context = (Keyword | Context)[];\n\nexport function isLastQueryContextOneOf(queryText: string, keywords: Keyword[]): boolean {\n const contextKeywords = getLastQueryContext(queryText);\n const lastKeyword = contextKeywords[contextKeywords.length - 1];\n\n return keywords.some((keyword) => keyword === lastKeyword);\n}\n\nexport function getLastQueryContext(queryText: string): Keyword[] {\n const context = getQueryContext(queryText);\n\n const iterate = (ctx: Context): Keyword[] => {\n const last = ctx[ctx.length - 1];\n\n if (Array.isArray(last)) {\n return iterate(last);\n }\n\n return ctx as Keyword[];\n };\n\n return iterate(context);\n}\n\nexport function getQueryContext(queryText: string): Context {\n const tokens = removePgComments(queryText)\n .split(/(\\s+|\\(|\\))/)\n .filter((token) => token.trim() !== \"\");\n let index = 0;\n\n function parseQuery(): Context {\n const context: Context = [];\n\n while (index < tokens.length) {\n const token = tokens[index++].toUpperCase();\n\n if (token === \")\") {\n // End of the current query context\n return context;\n }\n\n if (token === \"(\") {\n // Start of a subquery\n const subquery = parseQuery();\n if (subquery.length > 0) {\n context.push(subquery); // Add valid subquery\n }\n continue;\n }\n\n const previousToken = tokens[index - 2]?.toUpperCase();\n const nextToken = tokens[index]?.toUpperCase();\n\n if (isOneOf([\"ORDER\", \"GROUP\", \"PARTITION\"], token) && nextToken === \"BY\") {\n index++; // Consume \"BY\"\n context.push(`${token} BY`);\n continue;\n }\n\n if (token === \"JOIN\") {\n switch (previousToken) {\n case \"INNER\":\n case \"LEFT\":\n case \"RIGHT\":\n case \"FULL\":\n case \"CROSS\":\n context.push(`${previousToken} JOIN` as Keyword);\n break;\n case \"OUTER\":\n context.push(\"FULL OUTER JOIN\");\n break;\n }\n continue;\n }\n\n if (keywordSet.has(token as Keyword)) {\n context.push(token as Keyword);\n continue;\n }\n\n // Skip non-keyword tokens (identifiers, literals, etc.)\n }\n\n return context;\n }\n\n return parseQuery();\n}\n\nfunction removePgComments(query: string) {\n return query.replace(/--.*(\\r?\\n|$)|\\/\\*[\\s\\S]*?\\*\\//g, \"\").trim();\n}\n\nfunction isOneOf<const T extends string>(values: T[], value: string): value is T {\n return values.includes(value as T);\n}\n","import {\n defaultTypeMapping,\n doesMatchPattern,\n InvalidQueryError,\n normalizeIndent,\n QuerySourceMapEntry,\n} from \"@ts-safeql/shared\";\nimport { TSESTreeToTSNode } from \"@typescript-eslint/typescript-estree\";\nimport { ParserServices, TSESLint, TSESTree } from \"@typescript-eslint/utils\";\nimport ts, { TypeChecker } from \"typescript\";\nimport { RuleOptionConnection } from \"../rules/RuleOptions\";\nimport { E, pipe } from \"./fp-ts\";\nimport { TSUtils } from \"./ts.utils\";\nimport { isLastQueryContextOneOf } from \"./query-context\";\n\n/**\n * Slonik SQL token types that represent SQL fragments/builders.\n * These types cannot be converted to PostgreSQL placeholder types\n * because they represent dynamic SQL construction at runtime.\n *\n * When we encounter these types, we skip type checking for that expression\n * and the query containing it.\n */\nconst SLONIK_SQL_TOKEN_TYPES = new Set([\n // Core SQL tokens from Slonik\n \"SqlToken\",\n \"SqlSqlToken\",\n \"QuerySqlToken\",\n \"FragmentSqlToken\",\n \"SqlFragmentToken\",\n \"SqlFragment\", // Return type of sql.fragment\n \"ListSqlToken\",\n \"UnnestSqlToken\",\n \"IdentifierSqlToken\",\n \"ArraySqlToken\",\n \"JsonSqlToken\",\n \"JsonBinarySqlToken\",\n \"BinarySqlToken\",\n \"DateSqlToken\",\n \"TimestampSqlToken\",\n \"IntervalSqlToken\",\n \"UuidSqlToken\", // Return type of sql.uuid\n\n // Generic/union types\n \"PrimitiveValueExpression\",\n \"ValueExpression\",\n \"SqlTokenType\",\n]);\n\n/**\n * Check if a TypeScript type string represents a Slonik SQL token.\n * This handles both direct matches and generic type parameters.\n */\nfunction isSlonikSqlTokenType(typeStr: string): boolean {\n // Direct match\n if (SLONIK_SQL_TOKEN_TYPES.has(typeStr)) {\n return true;\n }\n\n // Check if any Slonik token type appears in the type string\n // This handles cases like \"QuerySqlToken<...>\" or \"FragmentSqlToken | null\"\n for (const tokenType of SLONIK_SQL_TOKEN_TYPES) {\n if (typeStr.includes(tokenType)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Check if an expression is a Slonik sql.array() call and extract the PostgreSQL type.\n * \n * Slonik sql.array() syntax:\n * sql.array([1, 2, 3], 'int4')\n * sql.array(values, 'text')\n * \n * The second argument is the PostgreSQL type name.\n * Returns the array type (e.g., 'int4[]') or null if not a sql.array() call.\n */\nfunction extractSlonikArrayType(expression: TSESTree.Expression): string | null {\n // Check if it's a call expression\n if (expression.type !== \"CallExpression\") {\n return null;\n }\n\n const callee = expression.callee;\n\n // Check if callee is sql.array (MemberExpression)\n if (callee.type !== \"MemberExpression\") {\n return null;\n }\n\n // Check if property is 'array'\n if (callee.property.type !== \"Identifier\" || callee.property.name !== \"array\") {\n return null;\n }\n\n // Check if object is 'sql' (could be Identifier or another MemberExpression for this.sql, etc.)\n const objectName = getMemberExpressionObjectName(callee.object);\n if (objectName !== \"sql\") {\n return null;\n }\n\n // Get the second argument (type hint)\n const typeArg = expression.arguments[1];\n if (!typeArg) {\n return null;\n }\n\n // Extract the type string from the literal\n if (typeArg.type === \"Literal\" && typeof typeArg.value === \"string\") {\n // Return as array type\n return `${typeArg.value}[]`;\n }\n\n return null;\n}\n\n/**\n * Get the name of the object in a member expression.\n * Handles both simple identifiers (sql) and this expressions (this.sql).\n */\nfunction getMemberExpressionObjectName(node: TSESTree.Expression): string | null {\n if (node.type === \"Identifier\") {\n return node.name;\n }\n \n // Handle this.sql pattern\n if (node.type === \"MemberExpression\" && \n node.object.type === \"ThisExpression\" &&\n node.property.type === \"Identifier\") {\n return node.property.name;\n }\n\n return null;\n}\n\n/**\n * Check if an expression is a Slonik sql.identifier() call.\n * Returns true if this is a sql.identifier() call (regardless of whether arguments are static or dynamic).\n */\nfunction isSlonikIdentifierCall(expression: TSESTree.Expression): boolean {\n if (expression.type !== \"CallExpression\") {\n return false;\n }\n\n const callee = expression.callee;\n\n if (callee.type !== \"MemberExpression\") {\n return false;\n }\n\n if (callee.property.type !== \"Identifier\" || callee.property.name !== \"identifier\") {\n return false;\n }\n\n const objectName = getMemberExpressionObjectName(callee.object);\n return objectName === \"sql\";\n}\n\n/**\n * Check if an expression is a Slonik sql.identifier() call and extract the identifier parts.\n * \n * Slonik sql.identifier() syntax:\n * sql.identifier(['column']) → \"column\"\n * sql.identifier(['schema', 'table']) → \"schema\".\"table\"\n * sql.identifier(['schema', 'table', 'column']) → \"schema\".\"table\".\"column\"\n * \n * Returns the quoted identifier string or null if not a sql.identifier() call or has dynamic arguments.\n */\nfunction extractSlonikIdentifier(expression: TSESTree.Expression): string | null {\n // Check if it's a call expression\n if (expression.type !== \"CallExpression\") {\n return null;\n }\n\n const callee = expression.callee;\n\n // Check if callee is sql.identifier (MemberExpression)\n if (callee.type !== \"MemberExpression\") {\n return null;\n }\n\n // Check if property is 'identifier'\n if (callee.property.type !== \"Identifier\" || callee.property.name !== \"identifier\") {\n return null;\n }\n\n // Check if object is 'sql'\n const objectName = getMemberExpressionObjectName(callee.object);\n if (objectName !== \"sql\") {\n return null;\n }\n\n // Get the first argument (identifier parts array)\n const partsArg = expression.arguments[0];\n if (!partsArg) {\n return null;\n }\n\n // Extract the identifier parts from the array\n if (partsArg.type === \"ArrayExpression\") {\n const parts: string[] = [];\n for (const element of partsArg.elements) {\n if (element && element.type === \"Literal\" && typeof element.value === \"string\") {\n parts.push(element.value);\n } else {\n // If any element is not a string literal, we can't extract the identifier\n return null;\n }\n }\n \n if (parts.length === 0) {\n return null;\n }\n \n // Return as quoted identifier: \"part1\".\"part2\".\"part3\"\n return parts.map(part => `\"${part}\"`).join(\".\");\n }\n\n return null;\n}\n\n/**\n * Check if an expression is a Slonik sql.join() call.\n * These should be skipped as they join multiple fragments at runtime.\n * \n * Slonik sql.join() syntax:\n * sql.join([sql.fragment`a = 1`, sql.fragment`b = 2`], sql.fragment` AND `)\n * \n * Returns true if this is a sql.join() call.\n */\nfunction isSlonikJoinCall(expression: TSESTree.Expression): boolean {\n if (expression.type !== \"CallExpression\") {\n return false;\n }\n\n const callee = expression.callee;\n\n if (callee.type !== \"MemberExpression\") {\n return false;\n }\n\n if (callee.property.type !== \"Identifier\" || callee.property.name !== \"join\") {\n return false;\n }\n\n const objectName = getMemberExpressionObjectName(callee.object);\n return objectName === \"sql\";\n}\n\n/**\n * Result of extracting a Slonik sql.fragment expression.\n * Contains the SQL text and any nested expressions that need type checking.\n */\ninterface SlonikFragmentResult {\n /** The SQL text with placeholders for expressions */\n sqlText: string;\n /** Nested expressions that need to be processed for type checking */\n expressions: TSESTree.Expression[];\n}\n\n/**\n * Check if an expression is a Slonik sql.fragment`...` tagged template and extract its content.\n * \n * Slonik sql.fragment syntax:\n * sql.fragment`WHERE active = true`\n * sql.fragment`WHERE id = ${id}`\n * \n * Returns the SQL text with placeholder markers for any nested expressions,\n * or null if not a sql.fragment expression.\n */\nfunction extractSlonikFragment(expression: TSESTree.Expression): SlonikFragmentResult | null {\n // Check if it's a tagged template expression\n if (expression.type !== \"TaggedTemplateExpression\") {\n return null;\n }\n\n const tag = expression.tag;\n\n // Check if tag is sql.fragment (MemberExpression)\n if (tag.type !== \"MemberExpression\") {\n return null;\n }\n\n // Check if property is 'fragment'\n if (tag.property.type !== \"Identifier\" || tag.property.name !== \"fragment\") {\n return null;\n }\n\n // Check if object is 'sql'\n const objectName = getMemberExpressionObjectName(tag.object);\n if (objectName !== \"sql\") {\n return null;\n }\n\n // Extract the SQL text from the template literal\n const quasi = expression.quasi;\n let sqlText = \"\";\n const nestedExpressions: TSESTree.Expression[] = [];\n\n for (const [i, templateElement] of quasi.quasis.entries()) {\n sqlText += templateElement.value.raw;\n\n if (!templateElement.tail && quasi.expressions[i]) {\n // Mark where expressions go - we'll use a special placeholder\n // that will be replaced during processing\n nestedExpressions.push(quasi.expressions[i] as TSESTree.Expression);\n sqlText += `\\${__FRAGMENT_EXPR_${nestedExpressions.length - 1}__}`;\n }\n }\n\n return { sqlText, expressions: nestedExpressions };\n}\n\n/**\n * Check if an expression is a Slonik sql.unnest() call and extract the PostgreSQL types.\n * \n * Slonik sql.unnest() syntax:\n * sql.unnest([[1, 'foo'], [2, 'bar']], ['int4', 'text'])\n * \n * The second argument is an array of PostgreSQL type names, one per column.\n * Returns the array types (e.g., ['int4[]', 'text[]']) or null if not a sql.unnest() call.\n */\nfunction extractSlonikUnnestTypes(expression: TSESTree.Expression): string[] | null {\n // Check if it's a call expression\n if (expression.type !== \"CallExpression\") {\n return null;\n }\n\n const callee = expression.callee;\n\n // Check if callee is sql.unnest (MemberExpression)\n if (callee.type !== \"MemberExpression\") {\n return null;\n }\n\n // Check if property is 'unnest'\n if (callee.property.type !== \"Identifier\" || callee.property.name !== \"unnest\") {\n return null;\n }\n\n // Check if object is 'sql'\n const objectName = getMemberExpressionObjectName(callee.object);\n if (objectName !== \"sql\") {\n return null;\n }\n\n // Get the second argument (type hints array)\n const typeArg = expression.arguments[1];\n if (!typeArg) {\n return null;\n }\n\n // Extract the type strings from the array\n if (typeArg.type === \"ArrayExpression\") {\n const types: string[] = [];\n for (const element of typeArg.elements) {\n if (element && element.type === \"Literal\" && typeof element.value === \"string\") {\n types.push(`${element.value}[]`);\n } else {\n // If any element is not a string literal, we can't extract types\n return null;\n }\n }\n return types.length > 0 ? types : null;\n }\n\n return null;\n}\n\nexport function mapTemplateLiteralToQueryText(\n quasi: TSESTree.TemplateLiteral,\n parser: ParserServices,\n checker: ts.TypeChecker,\n options: RuleOptionConnection,\n sourceCode: Readonly<TSESLint.SourceCode>,\n) {\n let $idx = 0;\n let $queryText = \"\";\n const sourcemaps: QuerySourceMapEntry[] = [];\n\n for (const [quasiIdx, $quasi] of quasi.quasis.entries()) {\n $queryText += $quasi.value.raw;\n\n if ($quasi.tail) {\n break;\n }\n\n const position = $queryText.length;\n const expression = quasi.expressions[quasiIdx];\n\n // Guard against undefined expression (should not happen with well-formed template literals)\n if (!expression) {\n console.error('[slonik/check-sql] DEBUG: expression is undefined at index', quasiIdx, {\n quasiCount: quasi.quasis.length,\n expressionCount: quasi.expressions.length,\n queryTextSoFar: $queryText,\n });\n continue;\n }\n\n // Check for Slonik sql.array() calls first - these have explicit type hints\n const slonikArrayType = extractSlonikArrayType(expression);\n if (slonikArrayType !== null) {\n const placeholder = `$${++$idx}::${slonikArrayType}`;\n $queryText += placeholder;\n\n sourcemaps.push({\n original: {\n start: expression.range[0] - quasi.range[0] - 2,\n end: expression.range[1] - quasi.range[0],\n text: sourceCode.text.slice(expression.range[0] - 2, expression.range[1] + 1),\n },\n generated: {\n start: position,\n end: position + placeholder.length,\n text: placeholder,\n },\n offset: 0,\n });\n\n continue;\n }\n\n // Check for Slonik sql.identifier() calls - embed the quoted identifier directly\n const slonikIdentifier = extractSlonikIdentifier(expression);\n if (slonikIdentifier !== null) {\n $queryText += slonikIdentifier;\n\n sourcemaps.push({\n original: {\n start: expression.range[0] - quasi.range[0] - 2,\n end: expression.range[1] - quasi.range[0],\n text: sourceCode.text.slice(expression.range[0] - 2, expression.range[1] + 1),\n },\n generated: {\n start: position,\n end: position + slonikIdentifier.length,\n text: slonikIdentifier,\n },\n offset: 0,\n });\n\n continue;\n }\n\n // If it's a sql.identifier() call but we couldn't extract static identifier parts,\n // it means it has dynamic arguments - skip validation for the entire query\n if (isSlonikIdentifierCall(expression)) {\n return E.right(null);\n }\n\n // Check for Slonik sql.join() calls - skip validation as content is determined at runtime\n if (isSlonikJoinCall(expression)) {\n return E.right(null);\n }\n\n // Check for Slonik sql.unnest() calls - these have explicit column type hints\n const slonikUnnestTypes = extractSlonikUnnestTypes(expression);\n if (slonikUnnestTypes !== null) {\n // Generate UNNEST with typed array placeholders for each column\n // e.g., unnest($1::int4[], $2::text[])\n const placeholders = slonikUnnestTypes.map((type) => `$${++$idx}::${type}`);\n const placeholder = `unnest(${placeholders.join(\", \")})`;\n $queryText += placeholder;\n\n sourcemaps.push({\n original: {\n start: expression.range[0] - quasi.range[0] - 2,\n end: expression.range[1] - quasi.range[0],\n text: sourceCode.text.slice(expression.range[0] - 2, expression.range[1] + 1),\n },\n generated: {\n start: position,\n end: position + placeholder.length,\n text: placeholder,\n },\n offset: 0,\n });\n\n continue;\n }\n\n // Check for Slonik sql.fragment`...` expressions - embed the SQL directly\n const slonikFragment = extractSlonikFragment(expression);\n if (slonikFragment !== null) {\n // Process nested expressions within the fragment\n let fragmentSql = slonikFragment.sqlText;\n \n for (let i = 0; i < slonikFragment.expressions.length; i++) {\n const nestedExpr = slonikFragment.expressions[i];\n const nestedPgType = pipe(\n mapExpressionToTsTypeString({ expression: nestedExpr, parser, checker }),\n (params) => getPgTypeFromTsType({ ...params, checker, options }),\n );\n\n let nestedPlaceholder: string;\n if (E.isLeft(nestedPgType) || nestedPgType.right === null) {\n // If we can't determine the type, use a simple placeholder\n nestedPlaceholder = `$${++$idx}`;\n } else if (nestedPgType.right.kind === \"literal\") {\n nestedPlaceholder = nestedPgType.right.value;\n } else {\n nestedPlaceholder = `$${++$idx}::${nestedPgType.right.cast}`;\n }\n\n fragmentSql = fragmentSql.replace(`\\${__FRAGMENT_EXPR_${i}__}`, nestedPlaceholder);\n }\n\n $queryText += fragmentSql;\n\n sourcemaps.push({\n original: {\n start: expression.range[0] - quasi.range[0] - 2,\n end: expression.range[1] - quasi.range[0],\n text: sourceCode.text.slice(expression.range[0] - 2, expression.range[1] + 1),\n },\n generated: {\n start: position,\n end: position + fragmentSql.length,\n text: fragmentSql,\n },\n offset: 0,\n });\n\n continue;\n }\n\n // Check if the expression is a Slonik SQL token type (nested query/fragment)\n // These represent dynamic SQL that cannot be analyzed statically, so skip validation\n const tsNode = parser.esTreeNodeToTSNodeMap.get(expression);\n if (tsNode) {\n const expressionType = checker.getTypeAtLocation(tsNode);\n const expressionTypeStr = checker.typeToString(expressionType);\n if (isSlonikSqlTokenType(expressionTypeStr)) {\n return E.right(null);\n }\n }\n\n const pgType = pipe(mapExpressionToTsTypeString({ expression, parser, checker }), (params) =>\n getPgTypeFromTsType({ ...params, checker, options }),\n );\n\n if (E.isLeft(pgType)) {\n return E.left(InvalidQueryError.of(pgType.left, expression));\n }\n\n const pgTypeValue = pgType.right;\n\n if (pgTypeValue === null) {\n const placeholder = `$${++$idx}`;\n $queryText += placeholder;\n\n sourcemaps.push({\n original: {\n text: sourceCode.text.slice(expression.range[0] - 2, expression.range[1] + 1),\n start: expression.range[0] - quasi.range[0] - 2,\n end: expression.range[1] - quasi.range[0] + 1,\n },\n generated: {\n text: placeholder,\n start: position,\n end: position + placeholder.length,\n },\n offset: 0,\n });\n\n continue;\n }\n\n if (pgTypeValue.kind === \"literal\") {\n const placeholder = pgTypeValue.value;\n $queryText += placeholder;\n\n sourcemaps.push({\n original: {\n start: expression.range[0] - quasi.range[0] - 2,\n end: expression.range[1] - quasi.range[0] + 1,\n text: sourceCode.text.slice(expression.range[0] - 2, expression.range[1] + 1),\n },\n generated: {\n start: position,\n end: position + placeholder.length,\n text: placeholder,\n },\n offset: 0,\n });\n\n continue;\n }\n\n const escapePgValue = (text: string) => text.replace(/'/g, \"''\");\n\n if (\n pgTypeValue.kind === \"one-of\" &&\n $queryText.trimEnd().endsWith(\"=\") &&\n isLastQueryContextOneOf($queryText, [\"SELECT\", \"ON\", \"WHERE\", \"WHEN\", \"HAVING\", \"RETURNING\"])\n ) {\n const textFromEquals = $queryText.slice($queryText.lastIndexOf(\"=\"));\n const placeholder = `IN (${pgTypeValue.types.map((t) => `'${escapePgValue(t)}'`).join(\", \")})`;\n const expressionText = sourceCode.text.slice(\n expression.range[0] - 2,\n expression.range[1] + 1,\n );\n\n $queryText = $queryText.replace(/(=)\\s*$/, \"\");\n $queryText += placeholder;\n\n sourcemaps.push({\n original: {\n start: expression.range[0] - quasi.range[0] - 2 - textFromEquals.length,\n end: expression.range[1] - quasi.range[0] + 2 - textFromEquals.length,\n text: `${textFromEquals}${expressionText}`,\n },\n generated: {\n start: position - textFromEquals.length + 1,\n end: position + placeholder.length - textFromEquals.length,\n text: placeholder,\n },\n offset: textFromEquals.length,\n });\n\n continue;\n }\n\n const placeholder = `$${++$idx}::${pgTypeValue.cast}`;\n $queryText += placeholder;\n\n sourcemaps.push({\n original: {\n start: expression.range[0] - quasi.range[0] - 2,\n end: expression.range[1] - quasi.range[0],\n text: sourceCode.text.slice(expression.range[0] - 2, expression.range[1] + 1),\n },\n generated: {\n start: position,\n end: position + placeholder.length,\n text: placeholder,\n },\n offset: 0,\n });\n }\n\n return E.right({ text: $queryText, sourcemaps });\n}\n\nfunction mapExpressionToTsTypeString(params: {\n expression: TSESTree.Expression;\n parser: ParserServices;\n checker: ts.TypeChecker;\n}) {\n const tsNode = params.parser.esTreeNodeToTSNodeMap.get(params.expression);\n const tsType = params.checker.getTypeAtLocation(tsNode);\n return {\n node: tsNode,\n type: tsType,\n };\n}\n\nconst tsTypeToPgTypeMap: Record<string, string> = {\n number: \"int\",\n string: \"text\",\n boolean: \"boolean\",\n bigint: \"bigint\",\n any: \"text\",\n unknown: \"text\",\n};\n\nconst tsFlagToPgTypeMap: Record<number, string> = {\n [ts.TypeFlags.String]: \"text\",\n [ts.TypeFlags.Number]: \"int\",\n [ts.TypeFlags.Boolean]: \"boolean\",\n [ts.TypeFlags.BigInt]: \"bigint\",\n [ts.TypeFlags.NumberLiteral]: \"int\",\n [ts.TypeFlags.StringLiteral]: \"text\",\n [ts.TypeFlags.BooleanLiteral]: \"boolean\",\n [ts.TypeFlags.BigIntLiteral]: \"bigint\",\n};\n\nfunction getPgTypeFromTsTypeUnion(params: {\n types: ts.Type[];\n checker: ts.TypeChecker;\n options: RuleOptionConnection;\n}): E.Either<string, PgTypeStrategy | null> {\n const { types, checker, options } = params;\n const nonNullTypes = types.filter((t) => (t.flags & ts.TypeFlags.Null) === 0);\n\n if (nonNullTypes.length === 0) {\n return E.right(null);\n }\n\n // Check if any member of the union is a Slonik SQL token type\n // If so, we can't validate the union and should skip it\n const hasSlonikToken = nonNullTypes.some((t) => {\n const typeStr = checker.typeToString(t);\n return isSlonikSqlTokenType(typeStr);\n });\n\n if (hasSlonikToken) {\n return E.right(null);\n }\n\n const isStringLiterals = nonNullTypes.every((t) => t.flags & ts.TypeFlags.StringLiteral);\n\n if (isStringLiterals) {\n return E.right({\n kind: \"one-of\",\n types: nonNullTypes.map((t) => (t as ts.StringLiteralType).value),\n cast: \"text\",\n });\n }\n\n const results = nonNullTypes.map((t) => checkType({ checker, type: t, options }));\n const strategies: PgTypeStrategy[] = [];\n\n for (const result of results) {\n if (E.isLeft(result)) {\n return result;\n }\n if (result.right !== null) {\n strategies.push(result.right);\n }\n }\n\n if (strategies.length === 0) {\n const typesStr = nonNullTypes.map((t) => checker.typeToString(t)).join(\", \");\n return E.left(`No PostgreSQL type could be inferred for the union members: ${typesStr}`);\n }\n\n const firstStrategy = strategies[0];\n const mixedTypes: string[] = [firstStrategy.cast];\n\n for (let i = 1; i < strategies.length; i++) {\n const strategy = strategies[i];\n if (strategy.cast !== firstStrategy.cast) {\n mixedTypes.push(strategy.cast);\n }\n }\n\n if (mixedTypes.length > 1) {\n return E.left(\n `Union types must result in the same PostgreSQL type (found ${mixedTypes.join(\", \")})`,\n );\n }\n\n return E.right(firstStrategy);\n}\n\ntype PgTypeStrategy =\n | { kind: \"cast\"; cast: string }\n | { kind: \"literal\"; value: string; cast: string }\n | { kind: \"one-of\"; types: string[]; cast: string };\n\nfunction getPgTypeFromTsType(params: {\n checker: TypeChecker;\n node: TSESTreeToTSNode<TSESTree.Expression>;\n type: ts.Type;\n options: RuleOptionConnection;\n}): E.Either<string, PgTypeStrategy | null> {\n const { checker, node, type, options } = params;\n\n // First check if the overall type is a Slonik token\n const typeStr = checker.typeToString(type);\n if (isSlonikSqlTokenType(typeStr)) {\n return E.right(null);\n }\n\n if (node.kind === ts.SyntaxKind.ConditionalExpression) {\n const trueType = checker.getTypeAtLocation(node.whenTrue);\n const falseType = checker.getTypeAtLocation(node.whenFalse);\n\n // Check if either branch is a Slonik token type\n const trueTypeStr = checker.typeToString(trueType);\n const falseTypeStr = checker.typeToString(falseType);\n\n if (isSlonikSqlTokenType(trueTypeStr) || isSlonikSqlTokenType(falseTypeStr)) {\n // If either branch is a Slonik token, skip validation for the entire expression\n return E.right(null);\n }\n\n const whenTrue = checkType({\n checker,\n type: trueType,\n options,\n });\n\n const whenFalse = checkType({\n checker,\n type: falseType,\n options,\n });\n\n if (E.isLeft(whenTrue)) {\n return whenTrue;\n }\n if (E.isLeft(whenFalse)) {\n return whenFalse;\n }\n\n const trueStrategy = whenTrue.right;\n const falseStrategy = whenFalse.right;\n\n if (trueStrategy === null && falseStrategy === null) {\n return E.right(null);\n }\n\n if (\n trueStrategy !== null &&\n falseStrategy !== null &&\n trueStrategy.cast !== falseStrategy.cast\n ) {\n return E.left(\n `Conditional expression must have the same type (true = ${trueStrategy.cast}, false = ${falseStrategy.cast})`,\n );\n }\n\n const strategy = trueStrategy ?? falseStrategy;\n if (strategy === null) {\n return E.right(null);\n }\n\n return E.right({ kind: \"cast\", cast: strategy.cast });\n }\n\n return checkType({ checker, type, options });\n}\n\nfunction checkType(params: {\n checker: TypeChecker;\n type: ts.Type;\n options: RuleOptionConnection;\n}): E.Either<string, PgTypeStrategy | null> {\n const { checker, type, options } = params;\n\n if (type.flags & ts.TypeFlags.Null) {\n return E.right(null);\n }\n\n const typeStr = checker.typeToString(type);\n\n // Skip Slonik SQL token types - these represent dynamic SQL fragments\n // that cannot be validated at lint time\n if (isSlonikSqlTokenType(typeStr)) {\n return E.right(null);\n }\n\n const singularType = typeStr.replace(/\\[\\]$/, \"\");\n const isArray = typeStr !== singularType;\n const singularPgType = tsTypeToPgTypeMap[singularType];\n\n if (singularPgType) {\n return E.right({ kind: \"cast\", cast: isArray ? `${singularPgType}[]` : singularPgType });\n }\n\n // Handle overrides\n const typesWithOverrides = { ...defaultTypeMapping, ...options.overrides?.types };\n const override = Object.entries(typesWithOverrides).find(([, tsType]) =>\n doesMatchPattern({\n pattern: typeof tsType === \"string\" ? tsType : tsType.parameter,\n text: singularType,\n }),\n );\n\n if (override) {\n const [pgType] = override;\n return E.right({ kind: \"cast\", cast: isArray ? `${pgType}[]` : pgType });\n }\n\n const enumType = TSUtils.getEnumKind(type);\n\n if (enumType) {\n switch (enumType.kind) {\n case \"Const\":\n case \"Numeric\":\n return E.right({ kind: \"cast\", cast: \"int\" });\n case \"String\":\n return E.right({ kind: \"one-of\", types: enumType.values, cast: \"text\" });\n case \"Heterogeneous\":\n return E.left(\"Heterogeneous enums are not supported\");\n }\n }\n\n if (checker.isArrayType(type)) {\n const elementType = (type as ts.TypeReference).typeArguments?.[0];\n\n if (elementType) {\n return pipe(\n checkType({ checker, type: elementType, options }),\n E.map((pgType): PgTypeStrategy | null =>\n pgType === null ? null : { kind: \"cast\", cast: `${pgType.cast}[]` },\n ),\n );\n }\n }\n\n if (type.isStringLiteral()) {\n return E.right({ kind: \"literal\", value: `'${type.value}'`, cast: \"text\" });\n }\n\n if (type.isNumberLiteral()) {\n return E.right({ kind: \"literal\", value: `${type.value}`, cast: \"int\" });\n }\n\n // Handle union types\n if (type.isUnion()) {\n return pipe(\n getPgTypeFromTsTypeUnion({ types: type.types, checker, options }),\n E.chain((pgType) =>\n pgType === null ? E.left(\"Unsupported union type (only null)\") : E.right(pgType),\n ),\n );\n }\n\n if (type.flags in tsFlagToPgTypeMap) {\n const pgType = tsFlagToPgTypeMap[type.flags];\n return E.right({ kind: \"cast\", cast: isArray ? `${pgType}[]` : pgType });\n }\n\n // Fallback for unsupported types\n return E.left(normalizeIndent`\n The type \"${typeStr}\" has no corresponding PostgreSQL type.\n Please add it manually using the \"overrides.types\" option:\n\n \\`\\`\\`ts\n {\n \"connections\": {\n ...,\n \"overrides\": {\n \"types\": {\n \"PG TYPE (e.g. 'date')\": \"${typeStr}\"\n }\n }\n }\n }\n \\`\\`\\`\n\n Read docs - https://github.com/gajus/eslint-plugin-slonik#type-override-reference\n `);\n}\n","import path from \"path\";\nimport { AnyFn, createSyncFn } from \"synckit\";\nimport { CheckSQLWorkerHandler } from \"./check-sql.worker\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const distDir = fileURLToPath(new URL(\"../../dist\", import.meta.url));\n\nfunction defineWorker<T extends AnyFn<R>, R = unknown>(params: { name: string; timeout: number }) {\n return createSyncFn<T>(path.join(distDir, `./workers/${params.name}.worker.mjs`), {\n tsRunner: \"tsx\",\n timeout: params.timeout,\n });\n}\n\nexport const workers = {\n generateSync: defineWorker<CheckSQLWorkerHandler>({ name: \"check-sql\", timeout: 1000 * 60 * 1 }),\n};\n","import { defaultTypeMapping, objectKeysNonEmpty } from \"@ts-safeql/shared\";\nimport z from \"zod\";\n\nconst zStringOrRegex = z.union([z.string(), z.object({ regex: z.string() })]);\nconst zBaseTarget = z.object({\n /**\n * Transform the end result of the type.\n *\n * For example:\n * - `\"{type}[]\"` will transform the type to an array\n * - `[\"colname\", \"x_colname\"]` will replace `colname` with `x_colname` in the type.\n * - `[\"{type}[]\", [\"colname\", x_colname\"]]` will do both\n */\n transform: z\n .union([z.string(), z.array(z.union([z.string(), z.tuple([z.string(), z.string()])]))])\n .optional(),\n\n /**\n * Transform the (column) field key. Can be one of the following:\n * - `\"snake\"` - `userId` → `user_id`\n * - `\"camel\"` - `user_id` → `userId`\n * - `\"pascal\"` - `user_id` → `UserId`\n * - `\"screaming snake\"` - `user_id` → `USER_ID`\n */\n fieldTransform: z.enum([\"snake\", \"pascal\", \"camel\", \"screaming snake\"]).optional(),\n\n /**\n * Whether or not to skip type annotation.\n */\n skipTypeAnnotations: z.boolean().optional(),\n});\n/**\n * A target that acts as a wrapper for the query. For example:\n *\n * ```ts\n * const query = conn.query(sql`SELECT * FROM users`);\n * ^^^^^^^^^^ wrapper\n * ```\n */\nconst zWrapperTarget = z\n .object({ wrapper: zStringOrRegex, maxDepth: z.number().optional() })\n .merge(zBaseTarget);\nexport type WrapperTarget = z.infer<typeof zWrapperTarget>;\n/**\n * A target that is a tag expression. For example:\n *\n * ```ts\n * const query = sql`SELECT * FROM users`;\n * ^^^ tag\n * ```\n */\nconst zTagTarget = z.object({ tag: zStringOrRegex }).merge(zBaseTarget);\nexport type TagTarget = z.infer<typeof zTagTarget>;\n\nexport type ConnectionTarget = WrapperTarget | TagTarget;\nconst zOverrideTypeResolver = z.union([\n z.string(),\n z.object({ parameter: zStringOrRegex, return: z.string() }),\n]);\nconst zBaseSchema = z.object({\n targets: z.union([zWrapperTarget, zTagTarget]).array(),\n\n /**\n * Whether or not keep the connection alive. Change it only if you know what you're doing.\n */\n keepAlive: z.boolean().optional(),\n\n /**\n * Override defaults\n */\n overrides: z\n .object({\n types: z.union([\n z.record(z.enum(objectKeysNonEmpty(defaultTypeMapping)), zOverrideTypeResolver),\n z.record(z.string(), zOverrideTypeResolver),\n ]),\n columns: z.record(z.string(), z.string()),\n })\n .partial()\n .optional(),\n\n /**\n * Use `undefined` instead of `null` when the value is nullable.\n */\n nullAsUndefined: z.boolean().optional(),\n\n /**\n * Mark the property as optional when the value is nullable.\n */\n nullAsOptional: z.boolean().optional(),\n\n /**\n * Specifies whether to infer literals and their types.\n * Can be a boolean or an array of specific types to infer.\n *\n * By default, it will infer all literals.\n */\n inferLiterals: z.union([z.boolean(), z.enum([\"number\", \"string\", \"boolean\"]).array()]).optional(),\n});\n\nexport const zConnectionMigration = z.object({\n /**\n * The path where the migration files are located.\n */\n migrationsDir: z.string(),\n\n /**\n * THIS IS NOT THE PRODUCTION DATABASE.\n *\n * A connection url to the database.\n * This is required since in order to run the migrations, a connection to postgres is required.\n * Will be used only to create and drop the shadow database (see `databaseName`).\n */\n connectionUrl: z.string().optional(),\n\n /**\n * The name of the shadow database that will be created from the migration files.\n */\n databaseName: z.string().optional(),\n\n /**\n * Whether or not should refresh the shadow database when the migration files change.\n */\n watchMode: z.boolean().optional(),\n});\nconst zConnectionUrl = z.object({\n /**\n * The connection url to the database\n */\n databaseUrl: z.string(),\n});\nconst zRuleOptionConnection = z.union([\n zBaseSchema.merge(zConnectionMigration),\n zBaseSchema.merge(zConnectionUrl),\n]);\nexport type RuleOptionConnection = z.infer<typeof zRuleOptionConnection>;\n\nexport const zConfig = z.object({\n connections: z.union([z.array(zRuleOptionConnection), zRuleOptionConnection]),\n});\n\nexport type Config = z.infer<typeof zConfig>;\n\nexport const RuleOptions = z.array(zConfig).min(1).max(1);\nexport type RuleOptions = z.infer<typeof RuleOptions>;\n\nexport type InferLiteralsOption = NonNullable<z.infer<typeof zBaseSchema>[\"inferLiterals\"]>;\nexport const defaultInferLiteralOptions: InferLiteralsOption = [\"string\"];\n","import { RuleContext } from \"./check-sql.rule\";\nimport { Config } from \"./RuleOptions\";\n\nexport function getConfigFromFileWithContext(params: {\n context: RuleContext;\n projectDir: string;\n}): Config {\n return params.context.options[0];\n}\n","import { ResolvedTarget } from \"@ts-safeql/generate\";\nimport { InvalidConfigError, doesMatchPattern, fmap } from \"@ts-safeql/shared\";\nimport {\n ESLintUtils,\n ParserServices,\n ParserServicesWithTypeInformation,\n TSESLint,\n TSESTree,\n} from \"@typescript-eslint/utils\";\nimport { JSONSchema4 } from \"@typescript-eslint/utils/json-schema\";\nimport { match } from \"ts-pattern\";\nimport ts from \"typescript\";\nimport { ESTreeUtils } from \"../utils\";\nimport { E, J, flow, pipe } from \"../utils/fp-ts\";\nimport {\n ExpectedResolvedTarget,\n getResolvedTargetByTypeNode,\n} from \"../utils/get-resolved-target-by-type-node\";\nimport { isInEditorEnv } from \"../utils/is-in-editor\";\nimport { memoize } from \"../utils/memoize\";\nimport { locateNearestPackageJsonDir } from \"../utils/node.utils\";\nimport { mapTemplateLiteralToQueryText } from \"../utils/ts-pg.utils\";\nimport { workers } from \"../workers\";\nimport { WorkerError, WorkerResult } from \"../workers/check-sql.worker\";\nimport {\n Config,\n ConnectionTarget,\n InferLiteralsOption,\n RuleOptionConnection,\n RuleOptions,\n TagTarget,\n WrapperTarget,\n defaultInferLiteralOptions,\n} from \"./RuleOptions\";\nimport { getConfigFromFileWithContext } from \"./check-sql.config\";\nimport {\n TypeTransformer,\n getFinalResolvedTargetString,\n getResolvedTargetComparableString,\n getResolvedTargetString,\n reportBaseError,\n reportDuplicateColumns,\n reportIncorrectTypeAnnotations,\n reportInvalidConfig,\n reportInvalidQueryError,\n reportInvalidTypeAnnotations,\n reportMissingTypeAnnotations,\n reportPostgresError,\n shouldLintFile,\n transformTypes,\n} from \"./check-sql.utils\";\nimport z from \"zod\";\n\nconst messages = {\n typeInferenceFailed: \"Type inference failed {{error}}\",\n error: \"{{error}}\",\n invalidQuery: \"Invalid Query: {{error}}\",\n missingTypeAnnotations: \"Query is missing type annotation\\n\\tFix with: {{fix}}\",\n incorrectTypeAnnotations: `Query has incorrect type annotation.\\n\\tExpected: {{expected}}\\n\\t Actual: {{actual}}`,\n invalidTypeAnnotations: `Query has invalid type annotation (SafeQL does not support it. If you think it should, please open an issue)`,\n};\nexport type RuleMessage = keyof typeof messages;\n\nexport type RuleContext = Readonly<TSESLint.RuleContext<RuleMessage, RuleOptions>>;\n\nfunction check(params: {\n context: RuleContext;\n config: Config;\n tag: TSESTree.TaggedTemplateExpression;\n projectDir: string;\n}) {\n const connections = Array.isArray(params.config.connections)\n ? params.config.connections\n : [params.config.connections];\n\n for (const connection of connections) {\n for (const target of connection.targets) {\n checkConnection({ ...params, connection, target });\n }\n }\n}\n\nfunction isTagMemberValid(\n expr: TSESTree.TaggedTemplateExpression,\n): expr is TSESTree.TaggedTemplateExpression &\n (\n | {\n tag: TSESTree.Identifier;\n }\n | {\n tag: TSESTree.MemberExpression & {\n property: TSESTree.Identifier;\n };\n }\n ) {\n // For example sql``\n if (ESTreeUtils.isIdentifier(expr.tag)) {\n return true;\n }\n\n // For example Provider.sql``\n if (ESTreeUtils.isMemberExpression(expr.tag) && ESTreeUtils.isIdentifier(expr.tag.property)) {\n return true;\n }\n\n return false;\n}\n\nfunction checkConnection(params: {\n context: RuleContext;\n connection: RuleOptionConnection;\n target: ConnectionTarget;\n tag: TSESTree.TaggedTemplateExpression;\n projectDir: string;\n}) {\n if (\"tag\" in params.target) {\n return checkConnectionByTagExpression({ ...params, target: params.target });\n }\n\n if (\"wrapper\" in params.target) {\n return checkConnectionByWrapperExpression({ ...params, target: params.target });\n }\n\n return match(params.target).exhaustive();\n}\n\nconst generateSyncE = flow(\n workers.generateSync,\n E.chain(J.parse),\n E.chainW((parsed) => parsed as unknown as E.Either<WorkerError, WorkerResult>),\n E.mapLeft((error) => error as unknown as WorkerError),\n);\n\nlet fatalError: WorkerError | undefined;\n\nfunction reportCheck(params: {\n context: RuleContext;\n tag: TSESTree.TaggedTemplateExpression;\n connection: RuleOptionConnection;\n target: ConnectionTarget;\n projectDir: string;\n typeParameter: TSESTree.TSTypeParameterInstantiation | undefined;\n baseNode: TSESTree.BaseNode;\n}) {\n const { context, tag, connection, target, projectDir, typeParameter, baseNode } = params;\n\n if (fatalError !== undefined) {\n const hint = isInEditorEnv()\n ? \"If you think this is a bug, please open an issue. If not, please try to fix the error and restart ESLint.\"\n : \"If you think this is a bug, please open an issue.\";\n\n return reportBaseError({ context, error: fatalError, tag, hint });\n }\n\n const nullAsOptional = connection.nullAsOptional ?? false;\n const nullAsUndefined = connection.nullAsUndefined ?? false;\n\n return pipe(\n E.Do,\n E.bind(\"parser\", () => {\n return hasParserServicesWithTypeInformation(context.sourceCode.parserServices)\n ? E.right(context.sourceCode.parserServices)\n : E.left(new InvalidConfigError(\"Parser services are not available\"));\n }),\n E.bind(\"checker\", ({ parser }) => {\n return !parser.program\n ? E.left(new InvalidConfigError(\"Type checker is not available\"))\n : E.right(parser.program.getTypeChecker());\n }),\n E.bindW(\"query\", ({ parser, checker }) => {\n try {\n return mapTemplateLiteralToQueryText(\n tag.quasi,\n parser,\n checker,\n params.connection,\n params.context.sourceCode,\n );\n } catch (error) {\n console.error('[slonik/check-sql] DEBUG: Error in mapTemplateLiteralToQueryText:', error);\n console.error('[slonik/check-sql] DEBUG: Query template:', context.sourceCode.getText(tag));\n throw error;\n }\n }),\n E.bindW(\"result\", ({ query }) => {\n // If query is null, it means we should skip validation (e.g., dynamic sql.identifier)\n if (query === null) {\n return E.right(null);\n }\n return generateSyncE({ query, connection, target, projectDir });\n }),\n E.fold(\n (error) => {\n return match(error)\n .with({ _tag: \"InvalidConfigError\" }, (error) => {\n return reportInvalidConfig({ context, error, tag });\n })\n .with({ _tag: \"DuplicateColumnsError\" }, (error) => {\n return reportDuplicateColumns({ context, error, tag });\n })\n .with({ _tag: \"PostgresError\" }, (error) => {\n return reportPostgresError({ context, error, tag });\n })\n .with({ _tag: \"InvalidQueryError\" }, (error) => {\n return reportInvalidQueryError({ context, error });\n })\n .with(\n { _tag: \"InvalidMigrationError\" },\n { _tag: \"InvalidMigrationsPathError\" },\n { _tag: \"DatabaseInitializationError\" },\n { _tag: \"InternalError\" },\n (error) => {\n if (params.connection.keepAlive === true) {\n fatalError = error;\n }\n\n return reportBaseError({ context, error, tag });\n },\n )\n .exhaustive();\n },\n ({ result, checker, parser }) => {\n // If result is null, validation was skipped (e.g., dynamic sql.identifier)\n if (result === null) {\n return;\n }\n\n const shouldSkipTypeAnnotations = target.skipTypeAnnotations === true;\n\n if (shouldSkipTypeAnnotations) {\n return;\n }\n\n const isMissingTypeAnnotations = typeParameter === undefined;\n\n if (isMissingTypeAnnotations) {\n if (result.output === null) {\n return;\n }\n\n return reportMissingTypeAnnotations({\n tag: tag,\n context: context,\n baseNode: baseNode,\n actual: getFinalResolvedTargetString({\n target: result.output,\n nullAsOptional: nullAsOptional ?? false,\n nullAsUndefined: nullAsUndefined ?? false,\n transform: target.transform,\n inferLiterals: connection.inferLiterals ?? defaultInferLiteralOptions,\n }),\n });\n }\n\n const reservedTypes = memoize({\n key: `reserved-types:${JSON.stringify(connection.overrides)}`,\n value: () => {\n const types = new Set<string>();\n\n for (const value of Object.values(connection.overrides?.types ?? {})) {\n types.add(typeof value === \"string\" ? value : value.return);\n }\n\n for (const columnType of Object.values(connection.overrides?.columns ?? {})) {\n types.add(columnType);\n }\n\n return types;\n },\n });\n\n const typeAnnotationState = getTypeAnnotationState({\n generated: result.output,\n typeParameter: typeParameter,\n transform: target.transform,\n checker: checker,\n parser: parser,\n reservedTypes: reservedTypes,\n nullAsOptional: nullAsOptional,\n nullAsUndefined: nullAsUndefined,\n inferLiterals: connection.inferLiterals ?? defaultInferLiteralOptions,\n });\n\n if (typeAnnotationState === \"INVALID\") {\n return reportInvalidTypeAnnotations({\n context: context,\n typeParameter: typeParameter,\n });\n }\n\n if (!typeAnnotationState.isEqual) {\n return reportIncorrectTypeAnnotations({\n context,\n typeParameter: typeParameter,\n expected: fmap(typeAnnotationState.expected, (expected) =>\n getResolvedTargetString({\n target: expected,\n nullAsOptional: false,\n nullAsUndefined: false,\n inferLiterals: params.connection.inferLiterals ?? defaultInferLiteralOptions,\n }),\n ),\n actual: fmap(result.output, (output) =>\n getFinalResolvedTargetString({\n target: output,\n nullAsOptional: connection.nullAsOptional ?? false,\n nullAsUndefined: connection.nullAsUndefined ?? false,\n transform: target.transform,\n inferLiterals: connection.inferLiterals ?? defaultInferLiteralOptions,\n }),\n ),\n });\n }\n },\n ),\n );\n}\n\nfunction hasParserServicesWithTypeInformation(\n parser: Partial<ParserServices> | undefined,\n): parser is ParserServicesWithTypeInformation {\n return parser !== undefined && parser.program !== null;\n}\n\nfunction checkConnectionByTagExpression(params: {\n context: RuleContext;\n connection: RuleOptionConnection;\n target: TagTarget;\n tag: TSESTree.TaggedTemplateExpression;\n projectDir: string;\n}) {\n const { context, tag, projectDir, connection, target } = params;\n\n const tagAsText = context.sourceCode.getText(tag.tag).replace(/^this\\./, \"\");\n\n if (doesMatchPattern({ pattern: target.tag, text: tagAsText })) {\n return reportCheck({\n context,\n tag,\n connection,\n target,\n projectDir,\n baseNode: tag.tag,\n typeParameter: tag.typeArguments,\n });\n }\n}\n\nfunction getValidParentUntilDepth(node: TSESTree.Node, depth: number) {\n if (node.type === \"CallExpression\" && node.callee.type === \"MemberExpression\") {\n return node;\n }\n\n if (depth > 0 && node.parent) {\n return getValidParentUntilDepth(node.parent, depth - 1);\n }\n\n return null;\n}\n\nfunction checkConnectionByWrapperExpression(params: {\n context: RuleContext;\n connection: RuleOptionConnection;\n target: WrapperTarget;\n tag: TSESTree.TaggedTemplateExpression;\n projectDir: string;\n}) {\n const { context, tag, projectDir, connection, target } = params;\n\n if (!isTagMemberValid(tag)) {\n return;\n }\n\n const wrapperNode = getValidParentUntilDepth(tag.parent, target.maxDepth ?? 0);\n\n if (wrapperNode === null) {\n return;\n }\n\n const calleeAsText = context.sourceCode.getText(wrapperNode.callee).replace(/^this\\./, \"\");\n\n if (doesMatchPattern({ pattern: target.wrapper, text: calleeAsText })) {\n return reportCheck({\n context,\n tag,\n connection,\n target,\n projectDir,\n baseNode: wrapperNode.callee,\n typeParameter: wrapperNode.typeArguments,\n });\n }\n}\n\ntype GetTypeAnnotationStateParams = {\n generated: ResolvedTarget | null;\n typeParameter: TSESTree.TSTypeParameterInstantiation;\n transform?: TypeTransformer;\n parser: ParserServices;\n checker: ts.TypeChecker;\n reservedTypes: Set<string>;\n nullAsOptional: boolean;\n nullAsUndefined: boolean;\n inferLiterals: InferLiteralsOption;\n};\n\nfunction getTypeAnnotationState({\n generated,\n typeParameter,\n transform,\n parser,\n checker,\n reservedTypes,\n nullAsOptional,\n nullAsUndefined,\n inferLiterals,\n}: GetTypeAnnotationStateParams) {\n if (typeParameter.params.length !== 1) {\n return \"INVALID\" as const;\n }\n\n const typeNode = typeParameter.params[0];\n\n let expected;\n try {\n expected = getResolvedTargetByTypeNode({\n checker,\n parser,\n typeNode,\n reservedTypes,\n });\n } catch (error) {\n console.error('[slonik/check-sql] DEBUG: Error in getResolvedTargetByTypeNode:', error);\n console.error('[slonik/check-sql] DEBUG: typeNode:', typeNode);\n console.error('[slonik/check-sql] DEBUG: typeNode.type:', typeNode?.type);\n throw error;\n }\n\n return getResolvedTargetsEquality({\n expected,\n generated,\n nullAsOptional,\n nullAsUndefined,\n inferLiterals,\n transform,\n });\n}\n\nfunction getResolvedTargetsEquality(params: {\n expected: ExpectedResolvedTarget | null;\n generated: ResolvedTarget | null;\n nullAsOptional: boolean;\n nullAsUndefined: boolean;\n inferLiterals: InferLiteralsOption;\n transform?: TypeTransformer;\n}) {\n if (params.expected === null && params.generated === null) {\n return {\n isEqual: true,\n expected: params.expected,\n generated: params.generated,\n };\n }\n\n if (params.expected === null || params.generated === null) {\n return {\n isEqual: false,\n expected: params.expected,\n generated: params.generated,\n };\n }\n\n let expectedString = getResolvedTargetComparableString({\n target: params.expected,\n nullAsOptional: false,\n nullAsUndefined: false,\n inferLiterals: params.inferLiterals,\n });\n\n let generatedString = getResolvedTargetComparableString({\n target: params.generated,\n nullAsOptional: params.nullAsOptional,\n nullAsUndefined: params.nullAsUndefined,\n inferLiterals: params.inferLiterals,\n });\n\n if (expectedString === null || generatedString === null) {\n return {\n isEqual: false,\n expected: params.expected,\n generated: params.generated,\n };\n }\n\n expectedString = expectedString.replace(/'/g, '\"');\n generatedString = generatedString.replace(/'/g, '\"');\n\n expectedString = expectedString.split(\", \").sort().join(\", \");\n generatedString = generatedString.split(\", \").sort().join(\", \");\n\n if (params.transform !== undefined) {\n generatedString = transformTypes(generatedString, params.transform);\n }\n\n return {\n isEqual: expectedString === generatedString,\n expected: params.expected,\n generated: params.generated,\n };\n}\n\nconst createRule = ESLintUtils.RuleCreator(() => `https://github.com/gajus/eslint-plugin-slonik`)<\n RuleOptions,\n RuleMessage\n>;\n\nexport default createRule({\n name: \"check-sql\",\n meta: {\n fixable: \"code\",\n docs: {\n description: \"Ensure that sql queries have type annotations\",\n },\n messages: messages,\n type: \"problem\",\n schema: z.toJSONSchema(RuleOptions, { target: \"draft-4\" }) as JSONSchema4,\n },\n defaultOptions: [],\n create(context) {\n if (!shouldLintFile(context)) {\n return {};\n }\n\n const projectDir = memoize({\n key: context.filename,\n value: () => locateNearestPackageJsonDir(context.filename),\n });\n\n const config = memoize({\n key: JSON.stringify({ key: \"config\", options: context.options, projectDir }),\n value: () => getConfigFromFileWithContext({ context, projectDir }),\n });\n\n return {\n TaggedTemplateExpression(tag) {\n check({ context, tag, config, projectDir });\n },\n };\n },\n});\n","import checkSql from \"./check-sql.rule\";\n\nexport default {\n \"check-sql\": checkSql,\n};\n"],"names":["keywords","placeholder","ESTreeUtils.isIdentifier","ESTreeUtils.isMemberExpression","error"],"mappings":"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"}
|
|
@@ -48,7 +48,16 @@ const PRIMITIVES = {
|
|
|
48
48
|
any: "any"
|
|
49
49
|
};
|
|
50
50
|
function getResolvedTargetByTypeNode(params) {
|
|
51
|
-
|
|
51
|
+
if (!params.typeNode) {
|
|
52
|
+
console.error("[slonik/check-sql] DEBUG: typeNode is undefined in getResolvedTargetByTypeNode");
|
|
53
|
+
throw new Error("typeNode is undefined");
|
|
54
|
+
}
|
|
55
|
+
const tsNode = params.parser.esTreeNodeToTSNodeMap.get(params.typeNode);
|
|
56
|
+
if (!tsNode) {
|
|
57
|
+
console.error("[slonik/check-sql] DEBUG: Could not map ESTree node to TS node. typeNode.type:", params.typeNode.type);
|
|
58
|
+
throw new Error(`Could not map ESTree node (type: ${params.typeNode.type}) to TS node`);
|
|
59
|
+
}
|
|
60
|
+
const typeText = tsNode.getText();
|
|
52
61
|
if (isReservedType(typeText, params.reservedTypes)) {
|
|
53
62
|
return { kind: "type", value: typeText };
|
|
54
63
|
}
|
|
@@ -647,6 +656,14 @@ function mapTemplateLiteralToQueryText(quasi, parser, checker, options, sourceCo
|
|
|
647
656
|
}
|
|
648
657
|
const position = $queryText.length;
|
|
649
658
|
const expression = quasi.expressions[quasiIdx];
|
|
659
|
+
if (!expression) {
|
|
660
|
+
console.error("[slonik/check-sql] DEBUG: expression is undefined at index", quasiIdx, {
|
|
661
|
+
quasiCount: quasi.quasis.length,
|
|
662
|
+
expressionCount: quasi.expressions.length,
|
|
663
|
+
queryTextSoFar: $queryText
|
|
664
|
+
});
|
|
665
|
+
continue;
|
|
666
|
+
}
|
|
650
667
|
const slonikArrayType = extractSlonikArrayType(expression);
|
|
651
668
|
if (slonikArrayType !== null) {
|
|
652
669
|
const placeholder2 = `$${++$idx}::${slonikArrayType}`;
|
|
@@ -1052,7 +1069,7 @@ function checkType(params) {
|
|
|
1052
1069
|
`);
|
|
1053
1070
|
}
|
|
1054
1071
|
|
|
1055
|
-
const distDir = node_url.fileURLToPath(new URL("../../dist", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/eslint-plugin-slonik.
|
|
1072
|
+
const distDir = node_url.fileURLToPath(new URL("../../dist", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/eslint-plugin-slonik.yAav42tm.cjs', document.baseURI).href))));
|
|
1056
1073
|
function defineWorker(params) {
|
|
1057
1074
|
return synckit.createSyncFn(path__default.join(distDir, `./workers/${params.name}.worker.mjs`), {
|
|
1058
1075
|
tsRunner: "tsx",
|
|
@@ -1226,16 +1243,21 @@ function reportCheck(params) {
|
|
|
1226
1243
|
E__namespace.bind("checker", ({ parser }) => {
|
|
1227
1244
|
return !parser.program ? E__namespace.left(new checkSql_utils.InvalidConfigError("Type checker is not available")) : E__namespace.right(parser.program.getTypeChecker());
|
|
1228
1245
|
}),
|
|
1229
|
-
E__namespace.bindW(
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1246
|
+
E__namespace.bindW("query", ({ parser, checker }) => {
|
|
1247
|
+
try {
|
|
1248
|
+
return mapTemplateLiteralToQueryText(
|
|
1249
|
+
tag.quasi,
|
|
1250
|
+
parser,
|
|
1251
|
+
checker,
|
|
1252
|
+
params.connection,
|
|
1253
|
+
params.context.sourceCode
|
|
1254
|
+
);
|
|
1255
|
+
} catch (error) {
|
|
1256
|
+
console.error("[slonik/check-sql] DEBUG: Error in mapTemplateLiteralToQueryText:", error);
|
|
1257
|
+
console.error("[slonik/check-sql] DEBUG: Query template:", context.sourceCode.getText(tag));
|
|
1258
|
+
throw error;
|
|
1259
|
+
}
|
|
1260
|
+
}),
|
|
1239
1261
|
E__namespace.bindW("result", ({ query }) => {
|
|
1240
1262
|
if (query === null) {
|
|
1241
1263
|
return E__namespace.right(null);
|
|
@@ -1414,12 +1436,20 @@ function getTypeAnnotationState({
|
|
|
1414
1436
|
return "INVALID";
|
|
1415
1437
|
}
|
|
1416
1438
|
const typeNode = typeParameter.params[0];
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1439
|
+
let expected;
|
|
1440
|
+
try {
|
|
1441
|
+
expected = getResolvedTargetByTypeNode({
|
|
1442
|
+
checker,
|
|
1443
|
+
parser,
|
|
1444
|
+
typeNode,
|
|
1445
|
+
reservedTypes
|
|
1446
|
+
});
|
|
1447
|
+
} catch (error) {
|
|
1448
|
+
console.error("[slonik/check-sql] DEBUG: Error in getResolvedTargetByTypeNode:", error);
|
|
1449
|
+
console.error("[slonik/check-sql] DEBUG: typeNode:", typeNode);
|
|
1450
|
+
console.error("[slonik/check-sql] DEBUG: typeNode.type:", typeNode?.type);
|
|
1451
|
+
throw error;
|
|
1452
|
+
}
|
|
1423
1453
|
return getResolvedTargetsEquality({
|
|
1424
1454
|
expected,
|
|
1425
1455
|
generated,
|
|
@@ -1514,4 +1544,4 @@ const rules = {
|
|
|
1514
1544
|
};
|
|
1515
1545
|
|
|
1516
1546
|
exports.rules = rules;
|
|
1517
|
-
//# sourceMappingURL=eslint-plugin-slonik.
|
|
1547
|
+
//# sourceMappingURL=eslint-plugin-slonik.yAav42tm.cjs.map
|