eslint-plugin-slonik 1.1.0 → 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.DamsLtnx.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.ChHjn8dw.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.DamsLtnx.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.ChHjn8dw.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';
@@ -736,6 +736,14 @@ function mapTemplateLiteralToQueryText(quasi, parser, checker, options, sourceCo
736
736
  });
737
737
  continue;
738
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
+ }
739
747
  const pgType = pipe(
740
748
  mapExpressionToTsTypeString({ expression, parser, checker }),
741
749
  (params) => getPgTypeFromTsType({ ...params, checker, options })
@@ -1497,4 +1505,4 @@ const rules = {
1497
1505
  };
1498
1506
 
1499
1507
  export { rules as r };
1500
- //# sourceMappingURL=eslint-plugin-slonik.ChHjn8dw.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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"}
@@ -760,6 +760,14 @@ function mapTemplateLiteralToQueryText(quasi, parser, checker, options, sourceCo
760
760
  });
761
761
  continue;
762
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
+ }
763
771
  const pgType = function_js.pipe(
764
772
  mapExpressionToTsTypeString({ expression, parser, checker }),
765
773
  (params) => getPgTypeFromTsType({ ...params, checker, options })
@@ -1059,7 +1067,7 @@ function checkType(params) {
1059
1067
  `);
1060
1068
  }
1061
1069
 
1062
- 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.DamsLtnx.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))));
1063
1071
  function defineWorker(params) {
1064
1072
  return synckit.createSyncFn(path__default.join(distDir, `./workers/${params.name}.worker.mjs`), {
1065
1073
  tsRunner: "tsx",
@@ -1521,4 +1529,4 @@ const rules = {
1521
1529
  };
1522
1530
 
1523
1531
  exports.rules = rules;
1524
- //# sourceMappingURL=eslint-plugin-slonik.DamsLtnx.cjs.map
1532
+ //# sourceMappingURL=eslint-plugin-slonik.DswZeUED.cjs.map