eslint-plugin-slonik 1.0.1 → 1.2.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const index = require('./shared/eslint-plugin-slonik.BEK35rSu.cjs');
3
+ const index = require('./shared/eslint-plugin-slonik.DswZeUED.cjs');
4
4
  require('./shared/eslint-plugin-slonik.rlOTrCdf.cjs');
5
5
  require('path');
6
6
  require('postgres');
package/dist/config.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { r as rules } from './shared/eslint-plugin-slonik.CYdFN4nX.mjs';
1
+ import { r as rules } from './shared/eslint-plugin-slonik.B91e-IBS.mjs';
2
2
  import './shared/eslint-plugin-slonik.BqlRHJaM.mjs';
3
3
  import 'path';
4
4
  import 'postgres';
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const index = require('./shared/eslint-plugin-slonik.BEK35rSu.cjs');
3
+ const index = require('./shared/eslint-plugin-slonik.DswZeUED.cjs');
4
4
  require('./shared/eslint-plugin-slonik.rlOTrCdf.cjs');
5
5
  require('path');
6
6
  require('postgres');
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { r as rules } from './shared/eslint-plugin-slonik.CYdFN4nX.mjs';
1
+ export { r as rules } from './shared/eslint-plugin-slonik.B91e-IBS.mjs';
2
2
  import './shared/eslint-plugin-slonik.BqlRHJaM.mjs';
3
3
  import 'path';
4
4
  import 'postgres';
@@ -490,6 +490,20 @@ function getMemberExpressionObjectName(node) {
490
490
  }
491
491
  return null;
492
492
  }
493
+ function isSlonikIdentifierCall(expression) {
494
+ if (expression.type !== "CallExpression") {
495
+ return false;
496
+ }
497
+ const callee = expression.callee;
498
+ if (callee.type !== "MemberExpression") {
499
+ return false;
500
+ }
501
+ if (callee.property.type !== "Identifier" || callee.property.name !== "identifier") {
502
+ return false;
503
+ }
504
+ const objectName = getMemberExpressionObjectName(callee.object);
505
+ return objectName === "sql";
506
+ }
493
507
  function extractSlonikIdentifier(expression) {
494
508
  if (expression.type !== "CallExpression") {
495
509
  return null;
@@ -646,6 +660,9 @@ function mapTemplateLiteralToQueryText(quasi, parser, checker, options, sourceCo
646
660
  });
647
661
  continue;
648
662
  }
663
+ if (isSlonikIdentifierCall(expression)) {
664
+ return E.right(null);
665
+ }
649
666
  if (isSlonikJoinCall(expression)) {
650
667
  const placeholder2 = `$${++$idx}`;
651
668
  $queryText += placeholder2;
@@ -719,6 +736,14 @@ function mapTemplateLiteralToQueryText(quasi, parser, checker, options, sourceCo
719
736
  });
720
737
  continue;
721
738
  }
739
+ const tsNode = parser.esTreeNodeToTSNodeMap.get(expression);
740
+ if (tsNode) {
741
+ const expressionType = checker.getTypeAtLocation(tsNode);
742
+ const expressionTypeStr = checker.typeToString(expressionType);
743
+ if (isSlonikSqlTokenType(expressionTypeStr)) {
744
+ return E.right(null);
745
+ }
746
+ }
722
747
  const pgType = pipe(
723
748
  mapExpressionToTsTypeString({ expression, parser, checker }),
724
749
  (params) => getPgTypeFromTsType({ ...params, checker, options })
@@ -1203,6 +1228,9 @@ function reportCheck(params) {
1203
1228
  )
1204
1229
  ),
1205
1230
  E.bindW("result", ({ query }) => {
1231
+ if (query === null) {
1232
+ return E.right(null);
1233
+ }
1206
1234
  return generateSyncE({ query, connection, target, projectDir });
1207
1235
  }),
1208
1236
  E.fold(
@@ -1229,6 +1257,9 @@ function reportCheck(params) {
1229
1257
  ).exhaustive();
1230
1258
  },
1231
1259
  ({ result, checker, parser }) => {
1260
+ if (result === null) {
1261
+ return;
1262
+ }
1232
1263
  const shouldSkipTypeAnnotations = target.skipTypeAnnotations === true;
1233
1264
  if (shouldSkipTypeAnnotations) {
1234
1265
  return;
@@ -1474,4 +1505,4 @@ const rules = {
1474
1505
  };
1475
1506
 
1476
1507
  export { rules as r };
1477
- //# sourceMappingURL=eslint-plugin-slonik.CYdFN4nX.mjs.map
1508
+ //# sourceMappingURL=eslint-plugin-slonik.B91e-IBS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint-plugin-slonik.B91e-IBS.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 const typeText = params.parser.esTreeNodeToTSNodeMap.get(params.typeNode).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 // 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 const placeholder = `$${++$idx}`;\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.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 mapTemplateLiteralToQueryText(\n tag.quasi,\n parser,\n checker,\n params.connection,\n params.context.sourceCode,\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 const expected = getResolvedTargetByTypeNode({\n checker,\n parser,\n typeNode,\n reservedTypes,\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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"}
@@ -514,6 +514,20 @@ function getMemberExpressionObjectName(node) {
514
514
  }
515
515
  return null;
516
516
  }
517
+ function isSlonikIdentifierCall(expression) {
518
+ if (expression.type !== "CallExpression") {
519
+ return false;
520
+ }
521
+ const callee = expression.callee;
522
+ if (callee.type !== "MemberExpression") {
523
+ return false;
524
+ }
525
+ if (callee.property.type !== "Identifier" || callee.property.name !== "identifier") {
526
+ return false;
527
+ }
528
+ const objectName = getMemberExpressionObjectName(callee.object);
529
+ return objectName === "sql";
530
+ }
517
531
  function extractSlonikIdentifier(expression) {
518
532
  if (expression.type !== "CallExpression") {
519
533
  return null;
@@ -670,6 +684,9 @@ function mapTemplateLiteralToQueryText(quasi, parser, checker, options, sourceCo
670
684
  });
671
685
  continue;
672
686
  }
687
+ if (isSlonikIdentifierCall(expression)) {
688
+ return E__namespace.right(null);
689
+ }
673
690
  if (isSlonikJoinCall(expression)) {
674
691
  const placeholder2 = `$${++$idx}`;
675
692
  $queryText += placeholder2;
@@ -743,6 +760,14 @@ function mapTemplateLiteralToQueryText(quasi, parser, checker, options, sourceCo
743
760
  });
744
761
  continue;
745
762
  }
763
+ const tsNode = parser.esTreeNodeToTSNodeMap.get(expression);
764
+ if (tsNode) {
765
+ const expressionType = checker.getTypeAtLocation(tsNode);
766
+ const expressionTypeStr = checker.typeToString(expressionType);
767
+ if (isSlonikSqlTokenType(expressionTypeStr)) {
768
+ return E__namespace.right(null);
769
+ }
770
+ }
746
771
  const pgType = function_js.pipe(
747
772
  mapExpressionToTsTypeString({ expression, parser, checker }),
748
773
  (params) => getPgTypeFromTsType({ ...params, checker, options })
@@ -1042,7 +1067,7 @@ function checkType(params) {
1042
1067
  `);
1043
1068
  }
1044
1069
 
1045
- 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.BEK35rSu.cjs', document.baseURI).href))));
1070
+ 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.DswZeUED.cjs', document.baseURI).href))));
1046
1071
  function defineWorker(params) {
1047
1072
  return synckit.createSyncFn(path__default.join(distDir, `./workers/${params.name}.worker.mjs`), {
1048
1073
  tsRunner: "tsx",
@@ -1227,6 +1252,9 @@ function reportCheck(params) {
1227
1252
  )
1228
1253
  ),
1229
1254
  E__namespace.bindW("result", ({ query }) => {
1255
+ if (query === null) {
1256
+ return E__namespace.right(null);
1257
+ }
1230
1258
  return generateSyncE({ query, connection, target, projectDir });
1231
1259
  }),
1232
1260
  E__namespace.fold(
@@ -1253,6 +1281,9 @@ function reportCheck(params) {
1253
1281
  ).exhaustive();
1254
1282
  },
1255
1283
  ({ result, checker, parser }) => {
1284
+ if (result === null) {
1285
+ return;
1286
+ }
1256
1287
  const shouldSkipTypeAnnotations = target.skipTypeAnnotations === true;
1257
1288
  if (shouldSkipTypeAnnotations) {
1258
1289
  return;
@@ -1498,4 +1529,4 @@ const rules = {
1498
1529
  };
1499
1530
 
1500
1531
  exports.rules = rules;
1501
- //# sourceMappingURL=eslint-plugin-slonik.BEK35rSu.cjs.map
1532
+ //# sourceMappingURL=eslint-plugin-slonik.DswZeUED.cjs.map