eslint-plugin-slonik 1.0.0 → 1.1.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/README.md +4 -53
- package/dist/config.cjs +1 -16
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +0 -181
- package/dist/config.d.mts +0 -181
- package/dist/config.d.ts +0 -181
- package/dist/config.mjs +2 -17
- package/dist/config.mjs.map +1 -1
- package/dist/index.cjs +1 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -161
- package/dist/index.d.mts +3 -161
- package/dist/index.d.ts +3 -161
- package/dist/index.mjs +2 -3
- package/dist/index.mjs.map +1 -1
- package/dist/shared/{eslint-plugin-slonik.C0xTyWZ2.mjs → eslint-plugin-slonik.BqlRHJaM.mjs} +2 -2
- package/dist/shared/{eslint-plugin-slonik.C0xTyWZ2.mjs.map → eslint-plugin-slonik.BqlRHJaM.mjs.map} +1 -1
- package/dist/shared/{eslint-plugin-slonik.DbzoLz5_.mjs → eslint-plugin-slonik.ChHjn8dw.mjs} +29 -43
- package/dist/shared/eslint-plugin-slonik.ChHjn8dw.mjs.map +1 -0
- package/dist/shared/{eslint-plugin-slonik.BxexVlk1.cjs → eslint-plugin-slonik.DamsLtnx.cjs} +28 -43
- package/dist/shared/eslint-plugin-slonik.DamsLtnx.cjs.map +1 -0
- package/dist/workers/check-sql.worker.cjs +9 -1
- package/dist/workers/check-sql.worker.cjs.map +1 -1
- package/dist/workers/check-sql.worker.mjs +10 -2
- package/dist/workers/check-sql.worker.mjs.map +1 -1
- package/package.json +4 -4
- package/dist/shared/eslint-plugin-slonik.BxexVlk1.cjs.map +0 -1
- package/dist/shared/eslint-plugin-slonik.DbzoLz5_.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as InvalidQueryError, q as defaultTypeMapping, s as doesMatchPattern, n as normalizeIndent, u as objectKeysNonEmpty, v as
|
|
1
|
+
import { o as InvalidQueryError, q as defaultTypeMapping, s as doesMatchPattern, n as normalizeIndent, u as objectKeysNonEmpty, v as shouldLintFile, w as InvalidConfigError, x as reportInvalidConfig, y as reportDuplicateColumns, z as reportPostgresError, A as reportInvalidQueryError, B as reportBaseError, C as reportMissingTypeAnnotations, E as getFinalResolvedTargetString, F as reportInvalidTypeAnnotations, G as reportIncorrectTypeAnnotations, f as fmap, H as isIdentifier, J as isMemberExpression, K as getResolvedTargetComparableString, L as transformTypes, M as getResolvedTargetString } from './eslint-plugin-slonik.BqlRHJaM.mjs';
|
|
2
2
|
import { TSESTree, ESLintUtils } from '@typescript-eslint/utils';
|
|
3
3
|
import { match } from 'ts-pattern';
|
|
4
4
|
import * as E from 'fp-ts/lib/Either.js';
|
|
@@ -12,7 +12,6 @@ import fs from 'fs';
|
|
|
12
12
|
import { createSyncFn } from 'synckit';
|
|
13
13
|
import { fileURLToPath } from 'node:url';
|
|
14
14
|
import z from 'zod';
|
|
15
|
-
import { createRequire } from 'module';
|
|
16
15
|
|
|
17
16
|
const PRIMITIVES = {
|
|
18
17
|
string: "string",
|
|
@@ -491,6 +490,20 @@ function getMemberExpressionObjectName(node) {
|
|
|
491
490
|
}
|
|
492
491
|
return null;
|
|
493
492
|
}
|
|
493
|
+
function isSlonikIdentifierCall(expression) {
|
|
494
|
+
if (expression.type !== "CallExpression") {
|
|
495
|
+
return false;
|
|
496
|
+
}
|
|
497
|
+
const callee = expression.callee;
|
|
498
|
+
if (callee.type !== "MemberExpression") {
|
|
499
|
+
return false;
|
|
500
|
+
}
|
|
501
|
+
if (callee.property.type !== "Identifier" || callee.property.name !== "identifier") {
|
|
502
|
+
return false;
|
|
503
|
+
}
|
|
504
|
+
const objectName = getMemberExpressionObjectName(callee.object);
|
|
505
|
+
return objectName === "sql";
|
|
506
|
+
}
|
|
494
507
|
function extractSlonikIdentifier(expression) {
|
|
495
508
|
if (expression.type !== "CallExpression") {
|
|
496
509
|
return null;
|
|
@@ -647,6 +660,9 @@ function mapTemplateLiteralToQueryText(quasi, parser, checker, options, sourceCo
|
|
|
647
660
|
});
|
|
648
661
|
continue;
|
|
649
662
|
}
|
|
663
|
+
if (isSlonikIdentifierCall(expression)) {
|
|
664
|
+
return E.right(null);
|
|
665
|
+
}
|
|
650
666
|
if (isSlonikJoinCall(expression)) {
|
|
651
667
|
const placeholder2 = `$${++$idx}`;
|
|
652
668
|
$queryText += placeholder2;
|
|
@@ -1127,47 +1143,11 @@ const zRuleOptionConnection = z.union([
|
|
|
1127
1143
|
const zConfig = z.object({
|
|
1128
1144
|
connections: z.union([z.array(zRuleOptionConnection), zRuleOptionConnection])
|
|
1129
1145
|
});
|
|
1130
|
-
const
|
|
1131
|
-
useConfigFile: z.boolean()
|
|
1132
|
-
});
|
|
1133
|
-
const Options = z.union([zConfig, UserConfigFile]);
|
|
1134
|
-
const RuleOptions = z.array(Options).min(1).max(1);
|
|
1146
|
+
const RuleOptions = z.array(zConfig).min(1).max(1);
|
|
1135
1147
|
const defaultInferLiteralOptions = ["string"];
|
|
1136
1148
|
|
|
1137
1149
|
function getConfigFromFileWithContext(params) {
|
|
1138
|
-
|
|
1139
|
-
if (!isConfigFileRuleOptions(options)) {
|
|
1140
|
-
return options;
|
|
1141
|
-
}
|
|
1142
|
-
return pipe(
|
|
1143
|
-
getConfigFromFile(params.projectDir),
|
|
1144
|
-
E.getOrElseW((message) => {
|
|
1145
|
-
throw new Error(`eslint-plugin-slonik: ${message}`);
|
|
1146
|
-
})
|
|
1147
|
-
);
|
|
1148
|
-
}
|
|
1149
|
-
function getConfigFromFile(projectDir) {
|
|
1150
|
-
try {
|
|
1151
|
-
const configFilePath = path.join(projectDir, "slonik.config.ts");
|
|
1152
|
-
const require = createRequire(import.meta.url);
|
|
1153
|
-
const rawConfig = require(`tsx/cjs/api`).require(configFilePath, configFilePath).default;
|
|
1154
|
-
if (rawConfig === void 0) {
|
|
1155
|
-
throw new InvalidConfigError(`slonik.config.ts must export a default value`);
|
|
1156
|
-
}
|
|
1157
|
-
const config = zConfig.safeParse(rawConfig);
|
|
1158
|
-
if (!config.success) {
|
|
1159
|
-
throw new InvalidConfigError(`slonik.config.ts is invalid: ${config.error.message}`);
|
|
1160
|
-
}
|
|
1161
|
-
return E.right(config.data);
|
|
1162
|
-
} catch (error) {
|
|
1163
|
-
return E.left(`${error}`);
|
|
1164
|
-
}
|
|
1165
|
-
}
|
|
1166
|
-
function isConfigFileRuleOptions(options) {
|
|
1167
|
-
return "useConfigFile" in options;
|
|
1168
|
-
}
|
|
1169
|
-
function defineConfig(config) {
|
|
1170
|
-
return config;
|
|
1150
|
+
return params.context.options[0];
|
|
1171
1151
|
}
|
|
1172
1152
|
|
|
1173
1153
|
const messages = {
|
|
@@ -1240,6 +1220,9 @@ function reportCheck(params) {
|
|
|
1240
1220
|
)
|
|
1241
1221
|
),
|
|
1242
1222
|
E.bindW("result", ({ query }) => {
|
|
1223
|
+
if (query === null) {
|
|
1224
|
+
return E.right(null);
|
|
1225
|
+
}
|
|
1243
1226
|
return generateSyncE({ query, connection, target, projectDir });
|
|
1244
1227
|
}),
|
|
1245
1228
|
E.fold(
|
|
@@ -1266,6 +1249,9 @@ function reportCheck(params) {
|
|
|
1266
1249
|
).exhaustive();
|
|
1267
1250
|
},
|
|
1268
1251
|
({ result, checker, parser }) => {
|
|
1252
|
+
if (result === null) {
|
|
1253
|
+
return;
|
|
1254
|
+
}
|
|
1269
1255
|
const shouldSkipTypeAnnotations = target.skipTypeAnnotations === true;
|
|
1270
1256
|
if (shouldSkipTypeAnnotations) {
|
|
1271
1257
|
return;
|
|
@@ -1496,7 +1482,7 @@ const checkSql = createRule({
|
|
|
1496
1482
|
});
|
|
1497
1483
|
const config = memoize({
|
|
1498
1484
|
key: JSON.stringify({ key: "config", options: context.options, projectDir }),
|
|
1499
|
-
value: () => getConfigFromFileWithContext({ context
|
|
1485
|
+
value: () => getConfigFromFileWithContext({ context})
|
|
1500
1486
|
});
|
|
1501
1487
|
return {
|
|
1502
1488
|
TaggedTemplateExpression(tag) {
|
|
@@ -1510,5 +1496,5 @@ const rules = {
|
|
|
1510
1496
|
"check-sql": checkSql
|
|
1511
1497
|
};
|
|
1512
1498
|
|
|
1513
|
-
export {
|
|
1514
|
-
//# sourceMappingURL=eslint-plugin-slonik.
|
|
1499
|
+
export { rules as r };
|
|
1500
|
+
//# sourceMappingURL=eslint-plugin-slonik.ChHjn8dw.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint-plugin-slonik.ChHjn8dw.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 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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"}
|
|
@@ -14,7 +14,6 @@ const fs = require('fs');
|
|
|
14
14
|
const synckit = require('synckit');
|
|
15
15
|
const node_url = require('node:url');
|
|
16
16
|
const z = require('zod');
|
|
17
|
-
const module$1 = require('module');
|
|
18
17
|
|
|
19
18
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
20
19
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
@@ -515,6 +514,20 @@ function getMemberExpressionObjectName(node) {
|
|
|
515
514
|
}
|
|
516
515
|
return null;
|
|
517
516
|
}
|
|
517
|
+
function isSlonikIdentifierCall(expression) {
|
|
518
|
+
if (expression.type !== "CallExpression") {
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
const callee = expression.callee;
|
|
522
|
+
if (callee.type !== "MemberExpression") {
|
|
523
|
+
return false;
|
|
524
|
+
}
|
|
525
|
+
if (callee.property.type !== "Identifier" || callee.property.name !== "identifier") {
|
|
526
|
+
return false;
|
|
527
|
+
}
|
|
528
|
+
const objectName = getMemberExpressionObjectName(callee.object);
|
|
529
|
+
return objectName === "sql";
|
|
530
|
+
}
|
|
518
531
|
function extractSlonikIdentifier(expression) {
|
|
519
532
|
if (expression.type !== "CallExpression") {
|
|
520
533
|
return null;
|
|
@@ -671,6 +684,9 @@ function mapTemplateLiteralToQueryText(quasi, parser, checker, options, sourceCo
|
|
|
671
684
|
});
|
|
672
685
|
continue;
|
|
673
686
|
}
|
|
687
|
+
if (isSlonikIdentifierCall(expression)) {
|
|
688
|
+
return E__namespace.right(null);
|
|
689
|
+
}
|
|
674
690
|
if (isSlonikJoinCall(expression)) {
|
|
675
691
|
const placeholder2 = `$${++$idx}`;
|
|
676
692
|
$queryText += placeholder2;
|
|
@@ -1043,7 +1059,7 @@ function checkType(params) {
|
|
|
1043
1059
|
`);
|
|
1044
1060
|
}
|
|
1045
1061
|
|
|
1046
|
-
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.
|
|
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))));
|
|
1047
1063
|
function defineWorker(params) {
|
|
1048
1064
|
return synckit.createSyncFn(path__default.join(distDir, `./workers/${params.name}.worker.mjs`), {
|
|
1049
1065
|
tsRunner: "tsx",
|
|
@@ -1151,47 +1167,11 @@ const zRuleOptionConnection = z__default.union([
|
|
|
1151
1167
|
const zConfig = z__default.object({
|
|
1152
1168
|
connections: z__default.union([z__default.array(zRuleOptionConnection), zRuleOptionConnection])
|
|
1153
1169
|
});
|
|
1154
|
-
const
|
|
1155
|
-
useConfigFile: z__default.boolean()
|
|
1156
|
-
});
|
|
1157
|
-
const Options = z__default.union([zConfig, UserConfigFile]);
|
|
1158
|
-
const RuleOptions = z__default.array(Options).min(1).max(1);
|
|
1170
|
+
const RuleOptions = z__default.array(zConfig).min(1).max(1);
|
|
1159
1171
|
const defaultInferLiteralOptions = ["string"];
|
|
1160
1172
|
|
|
1161
1173
|
function getConfigFromFileWithContext(params) {
|
|
1162
|
-
|
|
1163
|
-
if (!isConfigFileRuleOptions(options)) {
|
|
1164
|
-
return options;
|
|
1165
|
-
}
|
|
1166
|
-
return function_js.pipe(
|
|
1167
|
-
getConfigFromFile(params.projectDir),
|
|
1168
|
-
E__namespace.getOrElseW((message) => {
|
|
1169
|
-
throw new Error(`eslint-plugin-slonik: ${message}`);
|
|
1170
|
-
})
|
|
1171
|
-
);
|
|
1172
|
-
}
|
|
1173
|
-
function getConfigFromFile(projectDir) {
|
|
1174
|
-
try {
|
|
1175
|
-
const configFilePath = path__default.join(projectDir, "slonik.config.ts");
|
|
1176
|
-
const require$1 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/eslint-plugin-slonik.BxexVlk1.cjs', document.baseURI).href)));
|
|
1177
|
-
const rawConfig = require$1(`tsx/cjs/api`).require(configFilePath, configFilePath).default;
|
|
1178
|
-
if (rawConfig === void 0) {
|
|
1179
|
-
throw new checkSql_utils.InvalidConfigError(`slonik.config.ts must export a default value`);
|
|
1180
|
-
}
|
|
1181
|
-
const config = zConfig.safeParse(rawConfig);
|
|
1182
|
-
if (!config.success) {
|
|
1183
|
-
throw new checkSql_utils.InvalidConfigError(`slonik.config.ts is invalid: ${config.error.message}`);
|
|
1184
|
-
}
|
|
1185
|
-
return E__namespace.right(config.data);
|
|
1186
|
-
} catch (error) {
|
|
1187
|
-
return E__namespace.left(`${error}`);
|
|
1188
|
-
}
|
|
1189
|
-
}
|
|
1190
|
-
function isConfigFileRuleOptions(options) {
|
|
1191
|
-
return "useConfigFile" in options;
|
|
1192
|
-
}
|
|
1193
|
-
function defineConfig(config) {
|
|
1194
|
-
return config;
|
|
1174
|
+
return params.context.options[0];
|
|
1195
1175
|
}
|
|
1196
1176
|
|
|
1197
1177
|
const messages = {
|
|
@@ -1264,6 +1244,9 @@ function reportCheck(params) {
|
|
|
1264
1244
|
)
|
|
1265
1245
|
),
|
|
1266
1246
|
E__namespace.bindW("result", ({ query }) => {
|
|
1247
|
+
if (query === null) {
|
|
1248
|
+
return E__namespace.right(null);
|
|
1249
|
+
}
|
|
1267
1250
|
return generateSyncE({ query, connection, target, projectDir });
|
|
1268
1251
|
}),
|
|
1269
1252
|
E__namespace.fold(
|
|
@@ -1290,6 +1273,9 @@ function reportCheck(params) {
|
|
|
1290
1273
|
).exhaustive();
|
|
1291
1274
|
},
|
|
1292
1275
|
({ result, checker, parser }) => {
|
|
1276
|
+
if (result === null) {
|
|
1277
|
+
return;
|
|
1278
|
+
}
|
|
1293
1279
|
const shouldSkipTypeAnnotations = target.skipTypeAnnotations === true;
|
|
1294
1280
|
if (shouldSkipTypeAnnotations) {
|
|
1295
1281
|
return;
|
|
@@ -1520,7 +1506,7 @@ const checkSql = createRule({
|
|
|
1520
1506
|
});
|
|
1521
1507
|
const config = memoize({
|
|
1522
1508
|
key: JSON.stringify({ key: "config", options: context.options, projectDir }),
|
|
1523
|
-
value: () => getConfigFromFileWithContext({ context
|
|
1509
|
+
value: () => getConfigFromFileWithContext({ context})
|
|
1524
1510
|
});
|
|
1525
1511
|
return {
|
|
1526
1512
|
TaggedTemplateExpression(tag) {
|
|
@@ -1534,6 +1520,5 @@ const rules = {
|
|
|
1534
1520
|
"check-sql": checkSql
|
|
1535
1521
|
};
|
|
1536
1522
|
|
|
1537
|
-
exports.defineConfig = defineConfig;
|
|
1538
1523
|
exports.rules = rules;
|
|
1539
|
-
//# sourceMappingURL=eslint-plugin-slonik.
|
|
1524
|
+
//# sourceMappingURL=eslint-plugin-slonik.DamsLtnx.cjs.map
|