{"version":3,"file":"eslint-plugin.hd5VK2pb.cjs","sources":["../../src/ts.ts","../../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/parser-services.ts","../../src/errors.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 { createRequire } from \"node:module\";\n\nexport const TS = createRequire(import.meta.url)(\"typescript\") as typeof import(\"typescript\");\n","import { ParserServices, TSESTree } from \"@typescript-eslint/utils\";\nimport type * as ts from \"typescript\";\nimport { TS } from \"../ts\";\n\ntype GetResolvedTargetByTypeNodeParams = {\n  typeNode?: TSESTree.TypeNode;\n  parser: ParserServices;\n  checker: ts.TypeChecker;\n  reservedTypes: Set<string>;\n  anchorNode?: ts.Node;\n};\n\nexport type ExpectedResolvedTarget =\n  | { kind: \"type\"; value: string; base?: string }\n  | { kind: \"literal\"; value: string; base: ExpectedResolvedTarget }\n  | { kind: \"union\"; value: ExpectedResolvedTarget[] }\n  | { kind: \"array\"; value: ExpectedResolvedTarget; syntax?: \"array-type\" | \"type-reference\" }\n  | { kind: \"object\"; value: ExpectedResolvedTargetEntry[] };\n\nexport type ExpectedResolvedTargetEntry = [string, ExpectedResolvedTarget];\n\nconst PRIMITIVES = {\n  string: \"string\",\n  number: \"number\",\n  boolean: \"boolean\",\n  false: \"false\",\n  true: \"true\",\n  null: \"null\",\n  undefined: \"undefined\",\n  any: \"any\",\n} as const;\n\nexport function getResolvedTargetByTypeNode(\n  params: GetResolvedTargetByTypeNodeParams,\n): ExpectedResolvedTarget {\n  if (!params.typeNode) {\n    return { kind: \"type\", value: \"unknown\" };\n  }\n\n  const typeNode = params.typeNode;\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 (typeNode.type) {\n    case TSESTree.AST_NODE_TYPES.TSLiteralType:\n      return handleLiteralType(typeNode);\n\n    case TSESTree.AST_NODE_TYPES.TSUnionType:\n      return {\n        kind: \"union\",\n        value: typeNode.types.map((type) =>\n          getResolvedTargetByTypeNode({ ...params, typeNode: type as TSESTree.TypeNode }),\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(typeNode, params);\n\n    case TSESTree.AST_NODE_TYPES.TSTypeReference:\n      return handleTypeReference(typeNode, params);\n\n    case TSESTree.AST_NODE_TYPES.TSIntersectionType:\n      return handleIntersectionType(typeNode, params);\n\n    case TSESTree.AST_NODE_TYPES.TSArrayType:\n      return {\n        kind: \"array\",\n        value: getResolvedTargetByTypeNode({\n          ...params,\n          typeNode: typeNode.elementType,\n        }),\n      };\n\n    default:\n      return { kind: \"type\", value: typeText };\n  }\n}\n\nexport interface GetResolvedTargetByTypeParams {\n  type: ts.Type;\n  checker: ts.TypeChecker;\n  parser: ParserServices;\n  reservedTypes: Set<string>;\n  anchorNode?: ts.Node;\n}\n\nexport function getResolvedTargetByType(\n  params: GetResolvedTargetByTypeParams,\n): ExpectedResolvedTarget {\n  return resolveTypeFromType(params.type, {\n    checker: params.checker,\n    parser: params.parser,\n    reservedTypes: params.reservedTypes,\n    anchorNode: params.anchorNode,\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 typeLocation = toTypeScriptNode({\n    parser: params.parser,\n    node: params.typeNode ?? params.anchorNode,\n  });\n\n  if (typeLocation === undefined) {\n    return { kind: \"object\", value: [] };\n  }\n\n  const properties = type.getProperties().map((property): ExpectedResolvedTargetEntry => {\n    const key = property.escapedName.toString();\n    const propType = params.checker.getTypeOfSymbolAtLocation(property, typeLocation);\n\n    const resolvedType = resolveType(propType, params);\n    return [key, resolvedType];\n  });\n\n  return { kind: \"object\", value: properties };\n}\n\nfunction resolveTypeFromType(\n  type: ts.Type,\n  params: Omit<GetResolvedTargetByTypeParams, \"type\"> & {\n    typeNode?: TSESTree.TypeNode | ts.Node;\n    anchorNode?: ts.Node;\n  },\n): ExpectedResolvedTarget {\n  const typeLocation = toTypeScriptNode({\n    parser: params.parser,\n    node: params.typeNode ?? params.anchorNode,\n  });\n\n  if (!typeLocation) {\n    return resolveType(type, {\n      parser: params.parser,\n      checker: params.checker,\n      reservedTypes: params.reservedTypes,\n    });\n  }\n\n  return resolveType(type, {\n    parser: params.parser,\n    checker: params.checker,\n    reservedTypes: params.reservedTypes,\n    anchorNode: typeLocation,\n  });\n}\n\nfunction toTypeScriptNode(params: {\n  parser: ParserServices;\n  node?: TSESTree.Node | ts.Node;\n}): ts.Node | undefined {\n  if (params.node === undefined) {\n    return undefined;\n  }\n\n  const node = params.node;\n  if (\"kind\" in node) {\n    return node as ts.Node;\n  }\n\n  return params.parser.esTreeNodeToTSNodeMap.get(node as TSESTree.Node);\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 type { ParserServices, ParserServicesWithTypeInformation } from \"@typescript-eslint/utils\";\n\nexport function hasParserServicesWithTypeInformation(\n  parser: Partial<ParserServices> | undefined,\n): parser is ParserServicesWithTypeInformation {\n  return parser !== undefined && parser.program !== null && parser.program !== undefined;\n}\n","import type { TSESTree } from \"@typescript-eslint/utils\";\n\nexport class InvalidQueryError extends Error {\n  _tag = \"InvalidQueryError\" as const;\n\n  node: TSESTree.Expression;\n\n  constructor(error: string, node: TSESTree.Expression) {\n    super(error);\n    this.node = node;\n  }\n\n  static of(error: string, node: TSESTree.Expression) {\n    return new InvalidQueryError(error, node);\n  }\n\n  toJSON() {\n    return {\n      _tag: this._tag,\n      message: this.message,\n      node: this.node,\n    };\n  }\n}\n","import type * as ts from \"typescript\";\nimport { TS } from \"../ts\";\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  isTsTupleType(checker: ts.TypeChecker, type: ts.Type): type is ts.TypeReference {\n    return checker.isTupleType(type);\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  normalizeIndent,\n  QuerySourceMapEntry,\n} from \"@ts-safeql/shared\";\nimport { type SafeQLPlugin } from \"@ts-safeql/plugin-utils\";\nimport { InvalidQueryError } from \"../errors\";\nimport { TSESTreeToTSNode } from \"@typescript-eslint/typescript-estree\";\nimport { ParserServices, TSESLint, TSESTree } from \"@typescript-eslint/utils\";\nimport type * as ts from \"typescript\";\nimport type { TypeChecker } from \"typescript\";\nimport { TS } from \"../ts\";\nimport { RuleOptionConnection } from \"../rules/RuleOptions\";\nimport { E, pipe } from \"./fp-ts\";\nimport { TSUtils } from \"./ts.utils\";\nimport { isLastQueryContextOneOf } from \"./query-context\";\n\nexport function mapTemplateLiteralToQueryText(\n  quasi: TSESTree.TemplateLiteral,\n  parser: ParserServices,\n  checker: ts.TypeChecker,\n  options: RuleOptionConnection,\n  sourceCode: Readonly<TSESLint.SourceCode>,\n  plugins: SafeQLPlugin[] = [],\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    const expressionType = mapExpressionToTsTypeString({ expression, parser, checker });\n    const pluginExpression = resolvePluginExpression({\n      expression,\n      checker,\n      plugins,\n      precedingSQL: $queryText,\n      tsNode: expressionType.node,\n      tsType: expressionType.type,\n    });\n\n    if (pluginExpression === false) {\n      return E.right(null);\n    }\n\n    if (typeof pluginExpression === \"string\") {\n      const generatedPlaceholder = replacePluginPlaceholders(pluginExpression, $idx);\n      $idx = generatedPlaceholder.nextIndex;\n      const generatedText = generatedPlaceholder.text;\n      $queryText += generatedText;\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 + generatedText.length,\n          text: generatedText,\n        },\n        offset: 0,\n      });\n\n      continue;\n    }\n\n    const pgType = pipe(expressionType, (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] + 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\n  return E.right({ text: $queryText, sourcemaps });\n}\n\nexport function replacePluginPlaceholders(\n  text: string,\n  startIndex: number,\n): { text: string; nextIndex: number } {\n  let nextIndex = startIndex;\n  let output = \"\";\n  let cursor = 0;\n\n  while (cursor < text.length) {\n    const dollarQuote = getDollarQuoteDelimiter(text, cursor);\n    if (dollarQuote) {\n      const end = text.indexOf(dollarQuote, cursor + dollarQuote.length);\n      const sliceEnd = end === -1 ? text.length : end + dollarQuote.length;\n      output += text.slice(cursor, sliceEnd);\n      cursor = sliceEnd;\n      continue;\n    }\n\n    if (text.startsWith(\"--\", cursor)) {\n      const end = text.indexOf(\"\\n\", cursor + 2);\n      const sliceEnd = end === -1 ? text.length : end;\n      output += text.slice(cursor, sliceEnd);\n      cursor = sliceEnd;\n      continue;\n    }\n\n    if (text.startsWith(\"/*\", cursor)) {\n      const end = text.indexOf(\"*/\", cursor + 2);\n      const sliceEnd = end === -1 ? text.length : end + 2;\n      output += text.slice(cursor, sliceEnd);\n      cursor = sliceEnd;\n      continue;\n    }\n\n    if (text[cursor] === \"'\") {\n      const end = findQuotedLiteralEnd(text, cursor, \"'\");\n      output += text.slice(cursor, end);\n      cursor = end;\n      continue;\n    }\n\n    if (text[cursor] === '\"') {\n      const end = findQuotedLiteralEnd(text, cursor, '\"');\n      output += text.slice(cursor, end);\n      cursor = end;\n      continue;\n    }\n\n    if (text.startsWith(\"$N\", cursor) && !isIdentifierChar(text[cursor + 2])) {\n      output += `$${++nextIndex}`;\n      cursor += 2;\n      continue;\n    }\n\n    output += text[cursor];\n    cursor += 1;\n  }\n\n  return { text: output, nextIndex };\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\nfunction resolvePluginExpression(params: {\n  expression: TSESTree.Expression;\n  checker: ts.TypeChecker;\n  plugins: SafeQLPlugin[];\n  precedingSQL: string;\n  tsNode: ts.Node;\n  tsType: ts.Type;\n}): string | false | undefined {\n  for (const plugin of params.plugins) {\n    const pluginResult = plugin.onExpression?.({\n      node: params.expression,\n      context: {\n        precedingSQL: params.precedingSQL,\n        checker: params.checker,\n        tsNode: params.tsNode,\n        tsType: params.tsType,\n        tsTypeText: params.checker.typeToString(params.tsType),\n      },\n    });\n\n    if (pluginResult !== undefined) {\n      return pluginResult;\n    }\n  }\n\n  return undefined;\n}\n\nfunction getDollarQuoteDelimiter(text: string, cursor: number): string | undefined {\n  const match = /^\\$[A-Za-z_][A-Za-z0-9_]*?\\$|^\\$\\$/.exec(text.slice(cursor));\n  return match?.[0];\n}\n\nfunction findQuotedLiteralEnd(text: string, start: number, quote: \"'\" | '\"'): number {\n  let cursor = start + 1;\n\n  while (cursor < text.length) {\n    if (text[cursor] !== quote) {\n      cursor += 1;\n      continue;\n    }\n\n    if (text[cursor + 1] === quote) {\n      cursor += 2;\n      continue;\n    }\n\n    return cursor + 1;\n  }\n\n  return text.length;\n}\n\nfunction isIdentifierChar(char: string | undefined): boolean {\n  return char !== undefined && /[A-Za-z0-9_]/.test(char);\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  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\nfunction getPgTypeFromTsTypeIntersection(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\n  // A branded type intersects a base type with marker members that exist only in TypeScript\n  // (e.g. `{ __brand: \"ID\" }`). Keep the members that map to a Postgres type — the bases the\n  // value is assignable to — and drop the markers, which don't map. Unlike a union, an\n  // unmappable member is expected here (it's a marker), so it is skipped rather than fatal.\n  const strategies: PgTypeStrategy[] = [];\n\n  for (const member of types) {\n    const result = checkType({ checker, type: member, options });\n    if (E.isRight(result) && result.right !== null) {\n      strategies.push(result.right);\n    }\n  }\n\n  if (strategies.length === 0) {\n    const typesStr = types.map((t) => checker.typeToString(t)).join(\" & \");\n    return E.left(`No PostgreSQL type could be inferred for the intersection: ${typesStr}`);\n  }\n\n  const casts = [...new Set(strategies.map((strategy) => strategy.cast))];\n\n  if (casts.length > 1) {\n    return E.left(\n      `Intersection types must result in the same PostgreSQL type (found ${casts.join(\", \")})`,\n    );\n  }\n\n  return E.right(strategies[0]);\n}\n\nfunction getPgTypeFromTsTypeTuple(params: {\n  type: ts.TypeReference;\n  checker: ts.TypeChecker;\n  options: RuleOptionConnection;\n}): E.Either<string, PgTypeStrategy | null> {\n  const { type, checker, options } = params;\n\n  // A tuple (`NonEmptyArray<T>` = `[T, ...T[]]`) has no Postgres type, but its elements share one.\n  // Resolve each via `checkType` (so branded elements still map) and return it as `T[]`, like an\n  // array. An unmappable element is fatal here, unlike an intersection marker (which is skipped).\n  const elementTypes = checker.getTypeArguments(type);\n\n  if (elementTypes.length === 0) {\n    return E.left(\"Empty tuple types have no corresponding PostgreSQL type\");\n  }\n\n  const strategies: PgTypeStrategy[] = [];\n\n  for (const elementType of elementTypes) {\n    const result = checkType({ checker, type: elementType, options });\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    return E.left(\"Unsupported tuple type (only null)\");\n  }\n\n  const casts = [...new Set(strategies.map((strategy) => strategy.cast))];\n\n  if (casts.length > 1) {\n    return E.left(\n      `Tuple types must result in the same PostgreSQL type (found ${casts.join(\", \")})`,\n    );\n  }\n\n  const elementCast = strategies[0].cast;\n  return E.right({\n    kind: \"cast\",\n    cast: elementCast.endsWith(\"[]\") ? elementCast : `${elementCast}[]`,\n  });\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  if (node.kind === TS.SyntaxKind.ConditionalExpression) {\n    const whenTrue = checkType({\n      checker,\n      type: checker.getTypeAtLocation(node.whenTrue),\n      options,\n    });\n\n    const whenFalse = checkType({\n      checker,\n      type: checker.getTypeAtLocation(node.whenFalse),\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  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  if (type.isIntersection()) {\n    return getPgTypeFromTsTypeIntersection({ types: type.types, checker, options });\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 (TSUtils.isTsTupleType(checker, type)) {\n    return getPgTypeFromTsTypeTuple({ type, checker, options });\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  // Template-literal types (`${number}`) and string-mapping types (`Uppercase<string>`) are strings\n  // at runtime → `text`. Branded types like `Money` resolve here via their `${number}` base.\n  if (type.flags & (TS.TypeFlags.TemplateLiteral | TS.TypeFlags.StringMapping)) {\n    return E.right({ kind: \"cast\", cast: isArray ? \"text[]\" : \"text\" });\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://safeql.dev/api/#connections-overrides-types-optional\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 * 5 }),\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]);\n\nconst zPluginDescriptor = z.object({\n  package: z.string(),\n  config: z.looseObject({}).optional(),\n});\n\nconst zBaseSchema = z.object({\n  targets: z.union([zWrapperTarget, zTagTarget]).array().optional(),\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  /**\n   * Specifies how to enforce type annotations.\n   * - \"fix\": Auto-fix type annotations when running with --fix (default)\n   * - \"suggest\": Provide suggestions instead of auto-fix (requires manual acceptance in IDE)\n   */\n  enforceType: z.enum([\"fix\", \"suggest\"]).optional(),\n\n  /**\n   * Optional array of plugins. Each plugin can provide hooks (e.g., `createConnection`).\n   * When used alongside `databaseUrl` or `migrationsDir`, only non-connection hooks apply.\n   * When used alone, at least one plugin must provide `createConnection`.\n   */\n  plugins: z.array(zPluginDescriptor).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.extend(zConnectionMigration.shape),\n  zBaseSchema.extend(zConnectionUrl.shape),\n  zBaseSchema.refine((data) => data.plugins && data.plugins.length > 0, {\n    message: \"Must specify databaseUrl, migrationsDir, or plugins with at least one entry\",\n  }),\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 UserConfigFile = z.object({\n  useConfigFile: z.boolean(),\n});\nexport type UserConfigFile = z.infer<typeof UserConfigFile>;\n\nexport const Options = z.union([zConfig, UserConfigFile]);\nexport type Options = z.infer<typeof Options>;\n\nexport const RuleOptions = z.array(Options).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\nexport type EnforceTypeOption = NonNullable<z.infer<typeof zBaseSchema>[\"enforceType\"]>;\n","import { createRequire } from \"module\";\nimport path from \"path\";\nimport { E, pipe } from \"../utils/fp-ts\";\nimport { Config, Options, RuleOptions, UserConfigFile, zConfig } from \"./RuleOptions\";\nimport { InvalidConfigError } from \"@ts-safeql/shared\";\n\nexport function getConfigFromFileWithContext(params: {\n  context: { options: RuleOptions };\n  projectDir: string;\n}): Config {\n  const options = params.context.options[0];\n  if (!isConfigFileRuleOptions(options)) {\n    return options;\n  }\n\n  return pipe(\n    getConfigFromFile(params.projectDir),\n    E.getOrElseW((message) => {\n      throw new Error(`safeql: ${message}`);\n    }),\n  );\n}\n\nfunction getConfigFromFile(projectDir: string): E.Either<string, Config> {\n  try {\n    const configFilePath = path.join(projectDir, \"safeql.config.ts\");\n    const require = createRequire(import.meta.url);\n    const rawConfig = require(`tsx/cjs/api`).require(configFilePath, configFilePath).default;\n\n    if (rawConfig === undefined) {\n      throw new InvalidConfigError(`safeql.config.ts must export a default value`);\n    }\n\n    const config = zConfig.safeParse(rawConfig);\n\n    if (!config.success) {\n      throw new InvalidConfigError(`safeql.config.ts is invalid: ${config.error.message}`);\n    }\n\n    return E.right(config.data);\n  } catch (error) {\n    return E.left(`${error}`);\n  }\n}\n\nfunction isConfigFileRuleOptions(options: Options): options is UserConfigFile {\n  return \"useConfigFile\" in options;\n}\n\nexport function defineConfig(config: Config) {\n  return config;\n}\n","import { ResolvedTarget } from \"@ts-safeql/generate\";\nimport {\n  PluginManager,\n  matchesQueryNodeSelector,\n  type IncorrectTypeAnnotationReport,\n  type PluginResolvedTarget,\n  type ResolvedQueryTypeCheckContext,\n  type ResolvedQueryTypeCheckResult,\n  type QueryNodeSelector,\n  type SafeQLPlugin,\n  type QuerySourceMapEntry,\n  type TargetContext,\n  type TargetMatch,\n} from \"@ts-safeql/plugin-utils\";\nimport { InvalidConfigError, deepMergeDefaults, 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 type * as ts from \"typescript\";\nimport { TS } from \"../ts\";\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 { hasParserServicesWithTypeInformation } from \"../utils/parser-services\";\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  getResolvedTargetsEquality,\n  getResolvedTargetString,\n  reportBaseError,\n  reportDuplicateColumns,\n  reportIncorrectTypeAnnotations,\n  reportInvalidConfig,\n  reportInvalidQueryError,\n  reportInvalidTypeAnnotations,\n  reportMissingTypeAnnotations,\n  reportPostgresError,\n  shouldLintFile,\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  pluginError: `{{error}}`,\n  pluginSuggestion: \"Apply suggested plugin fix\",\n};\nexport type RuleMessage = keyof typeof messages;\n\nexport type RuleContext = Readonly<TSESLint.RuleContext<RuleMessage, RuleOptions>>;\n\ninterface PluginContext {\n  plugins: SafeQLPlugin[];\n  targetMatch: TargetMatch | false | undefined;\n}\n\ntype CheckNode = TSESTree.Node;\n\ntype TerminalCallQuery = {\n  text: string;\n  sourcemaps: QuerySourceMapEntry[];\n  typeCheck?: (\n    ctx: ResolvedQueryTypeCheckContext,\n  ) => readonly ResolvedQueryTypeCheckResult[] | undefined;\n};\n\nfunction check(params: {\n  context: RuleContext;\n  config: Config;\n  tag: CheckNode;\n  projectDir: string;\n}) {\n  const connections = Array.isArray(params.config.connections)\n    ? params.config.connections\n    : [params.config.connections];\n\n  for (const rawConnection of connections) {\n    const plugins = resolveConnectionPlugins(rawConnection, params.projectDir);\n    const connection = applyPluginDefaults(rawConnection, plugins);\n    const targetCtx = plugins.length > 0 ? getTargetContext(params.context) : undefined;\n    const targetMatch =\n      params.tag.type === \"TaggedTemplateExpression\"\n        ? resolvePluginTargetMatch(plugins, params.tag, targetCtx)\n        : undefined;\n    const pluginCtx: PluginContext = { plugins, targetMatch };\n\n    const targets = connection.targets ?? [];\n\n    if (\n      params.tag.type === \"CallExpression\" &&\n      !anyPluginClaimsCallExpression(plugins, params.tag)\n    ) {\n      continue;\n    }\n\n    if (targets.length === 0 && targetMatch) {\n      reportCheck({\n        ...params,\n        tag: params.tag,\n        connection,\n        target: {\n          tag: { regex: \".*\" },\n          skipTypeAnnotations: targetMatch.skipTypeAnnotations,\n        },\n        pluginCtx,\n        baseNode: getBaseNodeFromCheckNode(params.tag),\n        typeParameter:\n          params.tag.type === \"TaggedTemplateExpression\" ? params.tag.typeArguments : undefined,\n      });\n      continue;\n    }\n\n    // A builder query has no tag, so it validates regardless of the connection's tag `targets`.\n    if (params.tag.type === \"CallExpression\") {\n      const query = resolveQueryFromPlugins({\n        node: params.tag,\n        plugins,\n        context: params.context,\n      });\n\n      if (query === undefined) {\n        continue;\n      }\n\n      // A builder query has no tag/target to match on, so it validates against the\n      // first connection whose plugins resolve it (one query → one report).\n      return reportCheck({\n        context: params.context,\n        projectDir: params.projectDir,\n        connection,\n        tag: params.tag,\n        target: {\n          tag: { regex: \".*\" },\n        },\n        baseNode: getBaseNodeFromCheckNode(params.tag),\n        typeParameter: params.tag.typeArguments,\n        query,\n      });\n    }\n\n    if (targets.length > 0) {\n      for (const target of targets) {\n        if (params.tag.type === \"TaggedTemplateExpression\") {\n          checkConnection({ ...params, tag: params.tag, connection, target, pluginCtx });\n        }\n      }\n    }\n  }\n}\n\nfunction anyPluginClaimsCallExpression(\n  plugins: SafeQLPlugin[],\n  node: TSESTree.CallExpression,\n): boolean {\n  return plugins.some((plugin) =>\n    (plugin.queryNodeKinds ?? []).some((selector) => matchesQueryNodeSelector(node, selector)),\n  );\n}\n\n// Resolved once per file so the visitor gates without re-resolving plugins per node; returns []\n// (without resolving plugins) when no connection declares any, keeping the no-plugin case free.\nfunction collectCallExpressionSelectors(config: Config, projectDir: string): QueryNodeSelector[] {\n  const connections = Array.isArray(config.connections) ? config.connections : [config.connections];\n\n  if (!connections.some((connection) => \"plugins\" in connection && connection.plugins?.length)) {\n    return [];\n  }\n\n  const selectors: QueryNodeSelector[] = [];\n  for (const connection of connections) {\n    for (const plugin of resolveConnectionPlugins(connection, projectDir)) {\n      for (const selector of plugin.queryNodeKinds ?? []) {\n        if (selector.kind === \"CallExpression\") {\n          selectors.push(selector);\n        }\n      }\n    }\n  }\n  return selectors;\n}\n\nfunction getBaseNodeFromCheckNode(node: CheckNode): TSESTree.Node {\n  if (node.type === \"TaggedTemplateExpression\") {\n    return node.tag;\n  }\n\n  if (node.type === \"CallExpression\") {\n    return node.callee;\n  }\n\n  return node;\n}\n\nfunction resolveQueryFromPlugins(params: {\n  node: TSESTree.Node;\n  plugins: SafeQLPlugin[];\n  context: RuleContext;\n}): TerminalCallQuery | undefined {\n  const targetCtx = getTargetContext(params.context);\n  if (targetCtx === undefined) {\n    return undefined;\n  }\n\n  const tsNode = targetCtx.parser.esTreeNodeToTSNodeMap.get(params.node);\n  if (!tsNode) {\n    return undefined;\n  }\n\n  // Built once and shared across candidate plugins; the type is computed lazily on first\n  // access, so a plugin that gates syntactically and never reads it pays no checker cost.\n  let cachedType: ts.Type | undefined;\n  let cachedTypeText: string | undefined;\n  const resolveContext = {\n    checker: targetCtx.checker,\n    parser: targetCtx.parser,\n    precedingSQL: \"\",\n    tsNode,\n    get tsType(): ts.Type {\n      return (cachedType ??= targetCtx.checker.getTypeAtLocation(tsNode));\n    },\n    get tsTypeText(): string {\n      return (cachedTypeText ??= targetCtx.checker.typeToString(this.tsType));\n    },\n  };\n\n  const isCallExpression = params.node.type === \"CallExpression\";\n\n  for (const plugin of params.plugins) {\n    if (!plugin.resolveQuery) {\n      continue;\n    }\n\n    if (\n      isCallExpression &&\n      !anyPluginClaimsCallExpression([plugin], params.node as TSESTree.CallExpression)\n    ) {\n      continue;\n    }\n\n    const result = plugin.resolveQuery(resolveContext);\n\n    if (result === \"skip\" || result === undefined) {\n      continue;\n    }\n\n    return {\n      text: result.text,\n      sourcemaps: result.sourcemaps,\n      typeCheck: result.typeCheck,\n    };\n  }\n\n  return undefined;\n}\n\nfunction isTagMemberValid(\n  expr: TSESTree.TaggedTemplateExpression,\n): expr is TSESTree.TaggedTemplateExpression &\n  (\n    | { tag: TSESTree.Identifier }\n    | { tag: TSESTree.MemberExpression & { property: TSESTree.Identifier } }\n    | { tag: TSESTree.CallExpression }\n  ) {\n  if (ESTreeUtils.isIdentifier(expr.tag)) {\n    return true;\n  }\n\n  if (ESTreeUtils.isMemberExpression(expr.tag) && ESTreeUtils.isIdentifier(expr.tag.property)) {\n    return true;\n  }\n\n  if (expr.tag.type === \"CallExpression\") {\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  pluginCtx: PluginContext;\n}) {\n  if (params.pluginCtx.targetMatch === false) {\n    return;\n  }\n\n  if (params.pluginCtx.targetMatch !== undefined) {\n    const target: ConnectionTarget = {\n      ...params.target,\n      skipTypeAnnotations:\n        params.pluginCtx.targetMatch.skipTypeAnnotations ?? params.target.skipTypeAnnotations,\n    };\n    return reportCheck({\n      context: params.context,\n      tag: params.tag,\n      connection: params.connection,\n      target,\n      projectDir: params.projectDir,\n      baseNode: params.tag.tag,\n      typeParameter: params.tag.typeArguments,\n      pluginCtx: params.pluginCtx,\n    });\n  }\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\nconst pluginManager = new PluginManager();\n\nfunction resolveConnectionPlugins(\n  connection: RuleOptionConnection,\n  projectDir: string,\n): SafeQLPlugin[] {\n  if (!(\"plugins\" in connection) || !connection.plugins?.length) {\n    return [];\n  }\n\n  return pluginManager.resolvePluginsSync(connection.plugins, projectDir);\n}\n\nfunction applyPluginDefaults(\n  connection: RuleOptionConnection,\n  plugins: SafeQLPlugin[],\n): RuleOptionConnection {\n  let merged = connection;\n  for (const plugin of plugins) {\n    if (plugin.connectionDefaults) {\n      merged = deepMergeDefaults(merged, plugin.connectionDefaults);\n    }\n  }\n  return merged;\n}\n\nfunction getTargetContext(context: RuleContext): TargetContext | undefined {\n  const services = context.sourceCode.parserServices;\n  if (!hasParserServicesWithTypeInformation(services)) return undefined;\n  const checker = services.program?.getTypeChecker();\n  if (!checker) return undefined;\n  return { checker, parser: services };\n}\n\nfunction resolvePluginTargetMatch(\n  plugins: SafeQLPlugin[],\n  tag: TSESTree.TaggedTemplateExpression,\n  targetCtx: TargetContext | undefined,\n): TargetMatch | false | undefined {\n  if (!targetCtx) return undefined;\n\n  for (const plugin of plugins) {\n    const result = plugin.onTarget?.({ node: tag, context: targetCtx });\n    if (result !== undefined) {\n      return result;\n    }\n  }\n\n  return undefined;\n}\n\nfunction makeGetComparableString(\n  connection: RuleOptionConnection,\n): (target: PluginResolvedTarget) => string {\n  return (target) =>\n    getResolvedTargetComparableString({\n      target: target as ExpectedResolvedTarget,\n      nullAsOptional: connection.nullAsOptional ?? false,\n      nullAsUndefined: connection.nullAsUndefined ?? false,\n      inferLiterals: connection.inferLiterals ?? defaultInferLiteralOptions,\n    });\n}\n\nfunction reportPluginTypeCheck(params: {\n  context: RuleContext;\n  tag: TSESTree.TaggedTemplateExpression;\n  connection: RuleOptionConnection;\n  checker: ts.TypeChecker;\n  parser: ParserServices;\n  output: PluginResolvedTarget;\n  typeCheck: NonNullable<TargetMatch[\"typeCheck\"]>;\n}): void {\n  const { context, tag, connection, checker, parser, output, typeCheck } = params;\n\n  const result = typeCheck({\n    node: tag,\n    output,\n    checker,\n    parser,\n    sourceCode: context.sourceCode,\n    getComparableString: makeGetComparableString(connection),\n  });\n\n  if (result) {\n    reportTypeCheckResult({ context, connection, result, defaultNode: tag.tag });\n  }\n}\n\nfunction isIncorrectTypeAnnotationReport(\n  result: ResolvedQueryTypeCheckResult,\n): result is IncorrectTypeAnnotationReport {\n  return \"kind\" in result && result.kind === \"incorrect-type-annotation\";\n}\n\n// Dispatches whatever a plugin's `typeCheck` returns: a structured annotation mismatch routes\n// through the core's standard incorrect-annotation report; a free-form report becomes a plugin error.\nfunction reportTypeCheckResult(params: {\n  context: RuleContext;\n  connection: RuleOptionConnection;\n  result: ResolvedQueryTypeCheckResult;\n  defaultNode: TSESTree.Node;\n}): void {\n  const { context, connection, result, defaultNode } = params;\n\n  if (isIncorrectTypeAnnotationReport(result)) {\n    return reportIncorrectTypeAnnotations({\n      context,\n      typeParameter: result.typeParameter,\n      expected: result.expected,\n      actual: result.actual,\n      enforceType: connection.enforceType,\n    });\n  }\n\n  const enforceType = connection.enforceType ?? \"fix\";\n\n  const reportNode = result.node ?? defaultNode;\n  const reportData = { error: result.message };\n  const reportFixData = result.fix;\n  const reportFix = reportFixData\n    ? (fixer: TSESLint.RuleFixer) => fixer.replaceText(reportFixData.node, reportFixData.text)\n    : undefined;\n\n  if (!reportFix || enforceType === \"fix\") {\n    context.report({\n      node: reportNode,\n      messageId: \"pluginError\",\n      data: reportData,\n      fix: reportFix,\n    });\n    return;\n  }\n\n  context.report({\n    node: reportNode,\n    messageId: \"pluginError\",\n    data: reportData,\n    suggest: [\n      {\n        messageId: \"pluginSuggestion\",\n        data: reportData,\n        fix: reportFix,\n      },\n    ],\n  });\n}\n\nfunction reportCheck(params: {\n  context: RuleContext;\n  tag: CheckNode;\n  connection: RuleOptionConnection;\n  target: ConnectionTarget;\n  projectDir: string;\n  typeParameter?: TSESTree.TSTypeParameterInstantiation;\n  baseNode: TSESTree.Node;\n  query?: TerminalCallQuery;\n  pluginCtx?: PluginContext;\n}) {\n  const {\n    context,\n    tag,\n    connection,\n    target,\n    projectDir,\n    typeParameter,\n    baseNode,\n    query: overrideQuery,\n  } = params;\n  const queryTypeParameter = typeParameter;\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      overrideQuery !== undefined\n        ? E.right({ text: overrideQuery.text, sourcemaps: overrideQuery.sourcemaps })\n        : tag.type === \"TaggedTemplateExpression\"\n          ? mapTemplateLiteralToQueryText(\n              tag.quasi,\n              parser,\n              checker,\n              params.connection,\n              params.context.sourceCode,\n              params.pluginCtx?.plugins,\n            )\n          : E.right(null),\n    ),\n    E.bindW(\"result\", ({ query }) => {\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            { _tag: \"PluginError\" },\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 === null) {\n          return;\n        }\n\n        const pluginTypeCheck =\n          params.pluginCtx?.targetMatch && params.pluginCtx.targetMatch.typeCheck;\n\n        if (pluginTypeCheck && result.output && tag.type === \"TaggedTemplateExpression\") {\n          return reportPluginTypeCheck({\n            context,\n            tag,\n            connection,\n            checker,\n            parser,\n            output: result.output,\n            typeCheck: pluginTypeCheck,\n          });\n        }\n\n        const shouldSkipTypeAnnotations = target.skipTypeAnnotations === true;\n\n        if (shouldSkipTypeAnnotations) {\n          return;\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        // A terminal taking no `<T>` infers its row type from the builder's own\n        // schema; any embedded type checks are delegated to the plugin via\n        // `ResolvedQuery.typeCheck`.\n        if (tag.type === \"CallExpression\" && !calleeAcceptsTypeArgument(tag, checker, parser)) {\n          return reportResolvedQueryTypeCheck({\n            context,\n            connection,\n            tag,\n            output: result.output,\n            typeCheck: overrideQuery?.typeCheck,\n            checker,\n            parser,\n            reservedTypes,\n          });\n        }\n\n        const isMissingTypeAnnotations = queryTypeParameter === 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: connection.nullAsOptional ?? false,\n              nullAsUndefined: connection.nullAsUndefined ?? false,\n              transform: target.transform,\n              inferLiterals: connection.inferLiterals ?? defaultInferLiteralOptions,\n            }),\n            enforceType: connection.enforceType,\n          });\n        }\n\n        const typeAnnotationState = getTypeAnnotationState({\n          generated: result.output,\n          typeParameter: queryTypeParameter,\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: queryTypeParameter,\n          });\n        }\n\n        if (!typeAnnotationState.isEqual) {\n          return reportIncorrectTypeAnnotations({\n            context,\n            typeParameter: queryTypeParameter,\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            enforceType: connection.enforceType,\n          });\n        }\n      },\n    ),\n  );\n}\n\nfunction reportResolvedQueryTypeCheck(params: {\n  context: RuleContext;\n  connection: RuleOptionConnection;\n  tag: TSESTree.CallExpression;\n  output: ResolvedTarget | null;\n  typeCheck?: (\n    ctx: ResolvedQueryTypeCheckContext,\n  ) => readonly ResolvedQueryTypeCheckResult[] | undefined;\n  checker: ts.TypeChecker;\n  parser: ParserServices;\n  reservedTypes: Set<string>;\n}): void {\n  const { context, connection, tag, output, typeCheck, checker, parser, reservedTypes } = params;\n\n  if (typeCheck === undefined) {\n    return;\n  }\n\n  const results = typeCheck({\n    terminal: tag,\n    output: output as PluginResolvedTarget | null,\n    checker,\n    parser,\n    sourceCode: context.sourceCode,\n    getComparableString: makeGetComparableString(connection),\n    resolveExpectedType: (typeNode) =>\n      getResolvedTargetByTypeNode({\n        checker,\n        parser,\n        typeNode,\n        reservedTypes,\n      }) as PluginResolvedTarget | null,\n  });\n\n  for (const result of results ?? []) {\n    reportTypeCheckResult({ context, connection, result, defaultNode: tag });\n  }\n}\n\nfunction calleeAcceptsTypeArgument(\n  node: TSESTree.CallExpression,\n  checker: ts.TypeChecker,\n  parser: ParserServicesWithTypeInformation,\n): boolean {\n  const tsCall = parser.esTreeNodeToTSNodeMap.get(node);\n  if (tsCall === undefined || !TS.isCallExpression(tsCall)) {\n    return false;\n  }\n\n  return checker\n    .getTypeAtLocation(tsCall.expression)\n    .getCallSignatures()\n    .some((signature) => (signature.getTypeParameters()?.length ?? 0) > 0);\n}\n\nfunction checkConnectionByTagExpression(params: {\n  context: RuleContext;\n  connection: RuleOptionConnection;\n  target: TagTarget;\n  tag: TSESTree.TaggedTemplateExpression;\n  projectDir: string;\n  pluginCtx: PluginContext;\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      pluginCtx: params.pluginCtx,\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  pluginCtx: PluginContext;\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      pluginCtx: params.pluginCtx,\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 !== undefined && typeParameter.params.length !== 1) {\n    return \"INVALID\" as const;\n  }\n\n  const expected = getExpectedTarget({\n    typeNode: typeParameter?.params.at(0),\n    checker,\n    parser,\n    reservedTypes,\n  });\n\n  if (expected === null) {\n    return \"INVALID\" as const;\n  }\n\n  return getResolvedTargetsEquality({\n    expected,\n    generated,\n    nullAsOptional,\n    nullAsUndefined,\n    inferLiterals,\n    transform,\n  });\n}\n\nfunction getExpectedTarget({\n  typeNode,\n  checker,\n  parser,\n  reservedTypes,\n}: {\n  typeNode?: TSESTree.TypeNode;\n  checker: ts.TypeChecker;\n  parser: ParserServices;\n  reservedTypes: Set<string>;\n}): ExpectedResolvedTarget | null {\n  if (typeNode === undefined) {\n    return null;\n  }\n\n  return getResolvedTargetByTypeNode({\n    checker,\n    parser,\n    typeNode,\n    reservedTypes,\n  });\n}\n\nconst createRule = ESLintUtils.RuleCreator(() => `https://github.com/ts-safeql/safeql`)<\n  RuleOptions,\n  RuleMessage\n>;\n\nexport default createRule({\n  name: \"check-sql\",\n  meta: {\n    fixable: \"code\",\n    hasSuggestions: true,\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    const callExpressionSelectors = memoize({\n      key: JSON.stringify({ key: \"call-selectors\", options: context.options, projectDir }),\n      value: () => collectCallExpressionSelectors(config, projectDir),\n    });\n\n    const listener: TSESLint.RuleListener = {\n      TaggedTemplateExpression(tag) {\n        check({ context, tag, config, projectDir });\n      },\n    };\n\n    // Files without a builder plugin never pay the per-CallExpression visit.\n    if (callExpressionSelectors.length > 0) {\n      listener.CallExpression = (node) => {\n        if (!callExpressionSelectors.some((selector) => matchesQueryNodeSelector(node, selector))) {\n          return;\n        }\n\n        check({ context, tag: node, config, projectDir });\n      };\n    }\n\n    return listener;\n  },\n});\n","import checkSql from \"./check-sql.rule\";\n\nexport default {\n  \"check-sql\": checkSql,\n};\n"],"names":["createRequire","TSESTree","path","fs","keywords","E","pipe","placeholder","defaultTypeMapping","doesMatchPattern","normalizeIndent","fileURLToPath","createSyncFn","z","objectKeysNonEmpty","require","InvalidConfigError","matchesQueryNodeSelector","ESTreeUtils.isIdentifier","ESTreeUtils.isMemberExpression","match","flow","J","PluginManager","deepMergeDefaults","getResolvedTargetComparableString","reportIncorrectTypeAnnotations","reportBaseError","error","reportInvalidConfig","reportDuplicateColumns","reportPostgresError","reportInvalidQueryError","reportMissingTypeAnnotations","getFinalResolvedTargetString","reportInvalidTypeAnnotations","fmap","getResolvedTargetString","getResolvedTargetsEquality","ESLintUtils","shouldLintFile"],"mappings":"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"}