@xylex-group/athena 1.6.0 → 1.6.2
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 +31 -6
- package/bin/athena-js.js +74 -6
- package/dist/cli/index.cjs +194 -30
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +21 -2
- package/dist/cli/index.d.ts +21 -2
- package/dist/cli/index.js +193 -31
- package/dist/cli/index.js.map +1 -1
- package/dist/errors-1b-LSTum.d.ts +31 -0
- package/dist/errors-BYRK5phv.d.cts +31 -0
- package/dist/index.cjs +104 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -338
- package/dist/index.d.ts +6 -338
- package/dist/index.js +104 -16
- package/dist/index.js.map +1 -1
- package/dist/pipeline-BQzpSLD3.d.ts +338 -0
- package/dist/pipeline-CA2aexDl.d.cts +338 -0
- package/dist/react.d.cts +3 -2
- package/dist/react.d.ts +3 -2
- package/dist/{errors-DQerAaXC.d.cts → types-v6UyGg-x.d.cts} +1 -29
- package/dist/{errors-DQerAaXC.d.ts → types-v6UyGg-x.d.ts} +1 -29
- package/package.json +2 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/generator/naming.ts","../../src/generator/placeholders.ts","../../src/generator/postgres-type-mapping.ts","../../src/generator/config.ts","../../src/generator/renderer.ts","../../src/gateway/errors.ts","../../src/gateway/client.ts","../../src/sql-identifiers.ts","../../src/client.ts","../../src/schema/postgres-introspection-core.ts","../../src/schema/postgres-provider.ts","../../src/generator/providers.ts","../../src/generator/pipeline.ts","../../src/cli/index.ts"],"names":["relationKey","filterMethods","resolve"],"mappings":"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","file":"index.js","sourcesContent":["import type { NamingStyle } from './types.ts'\r\n\r\nconst IDENTIFIER_PATTERN = /^[A-Za-z_$][A-Za-z0-9_$]*$/\r\nconst RESERVED_IDENTIFIERS = new Set([\r\n 'break',\r\n 'case',\r\n 'catch',\r\n 'class',\r\n 'const',\r\n 'continue',\r\n 'debugger',\r\n 'default',\r\n 'delete',\r\n 'do',\r\n 'else',\r\n 'enum',\r\n 'export',\r\n 'extends',\r\n 'false',\r\n 'finally',\r\n 'for',\r\n 'function',\r\n 'if',\r\n 'import',\r\n 'in',\r\n 'instanceof',\r\n 'new',\r\n 'null',\r\n 'return',\r\n 'super',\r\n 'switch',\r\n 'this',\r\n 'throw',\r\n 'true',\r\n 'try',\r\n 'typeof',\r\n 'var',\r\n 'void',\r\n 'while',\r\n 'with',\r\n 'as',\r\n 'implements',\r\n 'interface',\r\n 'let',\r\n 'package',\r\n 'private',\r\n 'protected',\r\n 'public',\r\n 'static',\r\n 'yield',\r\n 'any',\r\n 'boolean',\r\n 'constructor',\r\n 'declare',\r\n 'get',\r\n 'module',\r\n 'require',\r\n 'number',\r\n 'set',\r\n 'string',\r\n 'symbol',\r\n 'type',\r\n 'from',\r\n 'of',\r\n])\r\n\r\nfunction splitWords(input: string): string[] {\r\n return input\r\n .trim()\r\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\r\n .replace(/([A-Z]+)([A-Z][a-z0-9]+)/g, '$1 $2')\r\n .replace(/[^A-Za-z0-9]+/g, ' ')\r\n .split(' ')\r\n .map(word => word.trim())\r\n .filter(word => word.length > 0)\r\n}\r\n\r\nfunction capitalize(word: string): string {\r\n return word.length > 0 ? `${word[0].toUpperCase()}${word.slice(1).toLowerCase()}` : word\r\n}\r\n\r\nfunction ensureValidIdentifier(candidate: string, fallback: string): string {\r\n const normalized = candidate.length > 0 ? candidate : fallback\r\n const prefixed = /^[0-9]/.test(normalized) ? `_${normalized}` : normalized\r\n if (RESERVED_IDENTIFIERS.has(prefixed)) {\r\n return `${prefixed}_value`\r\n }\r\n return prefixed\r\n}\r\n\r\nexport function applyNamingStyle(input: string, style: NamingStyle): string {\r\n const words = splitWords(input)\r\n if (words.length === 0) {\r\n return ''\r\n }\r\n\r\n switch (style) {\r\n case 'preserve':\r\n return input\r\n case 'camel': {\r\n const [first, ...rest] = words\r\n return `${first.toLowerCase()}${rest.map(capitalize).join('')}`\r\n }\r\n case 'pascal':\r\n return words.map(capitalize).join('')\r\n case 'snake':\r\n return words.map(word => word.toLowerCase()).join('_')\r\n case 'kebab':\r\n return words.map(word => word.toLowerCase()).join('-')\r\n default:\r\n return input\r\n }\r\n}\r\n\r\nexport function toSafeIdentifier(input: string, style: NamingStyle, fallback = 'value'): string {\r\n const transformed = applyNamingStyle(input, style)\r\n const normalized = transformed\r\n .replace(/[^A-Za-z0-9_$]+/g, '_')\r\n .replace(/^_+|_+$/g, '')\r\n const fallbackValue = splitWords(input).join('')\r\n return ensureValidIdentifier(\r\n normalized.length > 0 ? normalized : fallbackValue,\r\n fallback,\r\n )\r\n}\r\n\r\nexport function escapeTypePropertyName(propertyName: string): string {\r\n if (IDENTIFIER_PATTERN.test(propertyName) && !RESERVED_IDENTIFIERS.has(propertyName)) {\r\n return propertyName\r\n }\r\n return `'${propertyName.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\r\n}\r\n\r\nexport function escapeStringLiteral(value: string): string {\r\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\r\n}\r\n","import { applyNamingStyle } from './naming.ts'\r\nimport type { GeneratorArtifactKind, GeneratorOutputConfig } from './types.ts'\r\n\r\nexport interface PlaceholderContext {\r\n provider: string\r\n kind: GeneratorArtifactKind\r\n database: string\r\n schema: string\r\n model: string\r\n}\r\n\r\nfunction createStyleTokens(prefix: string, value: string): Record<string, string> {\r\n return {\r\n [prefix]: value,\r\n [`${prefix}_camel`]: applyNamingStyle(value, 'camel'),\r\n [`${prefix}_pascal`]: applyNamingStyle(value, 'pascal'),\r\n [`${prefix}_snake`]: applyNamingStyle(value, 'snake'),\r\n [`${prefix}_kebab`]: applyNamingStyle(value, 'kebab'),\r\n }\r\n}\r\n\r\nfunction renderTemplate(template: string, tokenMap: Record<string, string>): string {\r\n return template.replace(/\\{([A-Za-z0-9_]+)\\}/g, (_match, token) => {\r\n if (!(token in tokenMap)) {\r\n throw new Error(`Unknown placeholder token \"${token}\" in template \"${template}\"`)\r\n }\r\n return tokenMap[token]\r\n })\r\n}\r\n\r\nfunction resolvePlaceholderMap(\r\n baseTokens: Record<string, string>,\r\n outputConfig: GeneratorOutputConfig,\r\n): Record<string, string> {\r\n const resolved: Record<string, string> = {\r\n ...baseTokens,\r\n }\r\n\r\n const entries = Object.entries(outputConfig.placeholderMap ?? {})\r\n for (let index = 0; index < entries.length; index += 1) {\r\n const [key, value] = entries[index]\r\n let current = value\r\n for (let depth = 0; depth < 8; depth += 1) {\r\n const next = renderTemplate(current, resolved)\r\n if (next === current) {\r\n break\r\n }\r\n current = next\r\n }\r\n resolved[key] = current\r\n }\r\n\r\n return resolved\r\n}\r\n\r\nexport function renderOutputPath(\r\n template: string,\r\n context: PlaceholderContext,\r\n outputConfig: GeneratorOutputConfig,\r\n): string {\r\n const baseTokens: Record<string, string> = {\r\n provider: context.provider,\r\n kind: context.kind,\r\n ...createStyleTokens('database', context.database),\r\n ...createStyleTokens('schema', context.schema),\r\n ...createStyleTokens('model', context.model),\r\n }\r\n\r\n const tokens = resolvePlaceholderMap(baseTokens, outputConfig)\r\n return renderTemplate(template, tokens)\r\n}\r\n","import type { IntrospectionColumn } from '../schema/types.ts'\r\n\r\nconst NUMBER_TYPES = new Set([\r\n 'int2',\r\n 'int4',\r\n 'float4',\r\n 'float8',\r\n 'smallint',\r\n 'integer',\r\n 'real',\r\n 'double precision',\r\n])\r\n\r\nconst STRING_NUMERIC_TYPES = new Set([\r\n 'int8',\r\n 'bigint',\r\n 'serial8',\r\n 'bigserial',\r\n 'numeric',\r\n 'decimal',\r\n 'money',\r\n])\r\n\r\nconst TEXT_TYPES = new Set([\r\n 'char',\r\n 'bpchar',\r\n 'varchar',\r\n 'character varying',\r\n 'text',\r\n 'citext',\r\n 'name',\r\n 'uuid',\r\n 'date',\r\n 'time',\r\n 'timetz',\r\n 'timestamp',\r\n 'timestamptz',\r\n 'interval',\r\n 'inet',\r\n 'cidr',\r\n 'macaddr',\r\n 'macaddr8',\r\n 'point',\r\n 'line',\r\n 'lseg',\r\n 'box',\r\n 'path',\r\n 'polygon',\r\n 'circle',\r\n 'bit',\r\n 'varbit',\r\n 'xml',\r\n 'tsvector',\r\n 'tsquery',\r\n 'jsonpath',\r\n])\r\n\r\nfunction normalizeTypeLabel(column: IntrospectionColumn): string {\r\n const preferred = (column.udtName || column.dataType).toLowerCase().trim()\r\n if (column.arrayDimensions > 0 && preferred.startsWith('_')) {\r\n return preferred.slice(1)\r\n }\r\n return preferred\r\n}\r\n\r\nfunction wrapArrayType(baseType: string, depth: number): string {\r\n let wrapped = baseType\r\n for (let index = 0; index < depth; index += 1) {\r\n wrapped = `Array<${wrapped}>`\r\n }\r\n return wrapped\r\n}\r\n\r\nfunction resolveScalarType(column: IntrospectionColumn): string {\r\n const label = normalizeTypeLabel(column)\r\n\r\n if (NUMBER_TYPES.has(label)) {\r\n return 'number'\r\n }\r\n\r\n if (STRING_NUMERIC_TYPES.has(label)) {\r\n return 'string'\r\n }\r\n\r\n if (label === 'bool' || label === 'boolean') {\r\n return 'boolean'\r\n }\r\n\r\n if (label === 'bytea') {\r\n return 'Buffer'\r\n }\r\n\r\n if (label === 'json' || label === 'jsonb') {\r\n return 'Record<string, unknown>'\r\n }\r\n\r\n if (TEXT_TYPES.has(label)) {\r\n return 'string'\r\n }\r\n\r\n if (label.endsWith('range') || label.endsWith('multirange')) {\r\n return 'string'\r\n }\r\n\r\n return 'unknown'\r\n}\r\n\r\nfunction resolveKindAwareType(column: IntrospectionColumn): string {\r\n if (column.typeKind === 'enum') {\r\n const values = column.enumValues ?? []\r\n if (values.length === 0) {\r\n return 'string'\r\n }\r\n return values.map(value => `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`).join(' | ')\r\n }\r\n\r\n if (column.typeKind === 'composite') {\r\n return 'Record<string, unknown>'\r\n }\r\n\r\n if (column.typeKind === 'domain' || column.typeKind === 'range' || column.typeKind === 'multirange') {\r\n return 'string'\r\n }\r\n\r\n return resolveScalarType(column)\r\n}\r\n\r\nexport function resolvePostgresColumnType(column: IntrospectionColumn): string {\r\n const baseType = resolveKindAwareType(column)\r\n if (!column.arrayDimensions || column.arrayDimensions <= 0) {\r\n return baseType\r\n }\r\n return wrapArrayType(baseType, column.arrayDimensions)\r\n}\r\n","import { existsSync } from 'fs'\r\nimport { resolve } from 'path'\r\nimport { pathToFileURL } from 'url'\r\nimport type {\r\n AthenaGeneratorConfig,\r\n GeneratorExperimentalFlags,\r\n GeneratorFeatureFlags,\r\n GeneratorNamingConfig,\r\n GeneratorOutputConfig,\r\n GeneratorOutputTargets,\r\n LoadGeneratorConfigOptions,\r\n LoadedGeneratorConfig,\r\n NormalizedAthenaGeneratorConfig,\r\n} from './types.ts'\r\n\r\nconst DEFAULT_CONFIG_CANDIDATES = [\r\n 'athena.config.ts',\r\n 'athena.config.js',\r\n 'athena-js.config.ts',\r\n 'athena-js.config.js',\r\n '.athena.config.ts',\r\n '.athena.config.js',\r\n]\r\n\r\nconst DEFAULT_TARGETS: GeneratorOutputTargets = {\r\n model: 'src/generated/{database_kebab}/{schema_kebab}/{model_kebab}.model.ts',\r\n schema: 'src/generated/{database_kebab}/{schema_kebab}/index.ts',\r\n database: 'src/generated/{database_kebab}/index.ts',\r\n registry: 'src/generated/index.ts',\r\n}\r\n\r\nconst DEFAULT_NAMING: GeneratorNamingConfig = {\r\n modelType: 'pascal',\r\n modelConst: 'camel',\r\n schemaConst: 'camel',\r\n databaseConst: 'camel',\r\n registryConst: 'camel',\r\n}\r\n\r\nconst DEFAULT_FEATURES: GeneratorFeatureFlags = {\r\n emitRelations: true,\r\n emitRegistry: true,\r\n}\r\n\r\nconst DEFAULT_EXPERIMENTAL_FLAGS: GeneratorExperimentalFlags = {\r\n postgresGatewayIntrospection: false,\r\n scyllaProviderContracts: true,\r\n}\r\n\r\nfunction normalizeOutputConfig(output: GeneratorOutputConfig): GeneratorOutputConfig {\r\n return {\r\n targets: {\r\n ...DEFAULT_TARGETS,\r\n ...(output.targets ?? {}),\r\n },\r\n placeholderMap: {\r\n ...(output.placeholderMap ?? {}),\r\n },\r\n }\r\n}\r\n\r\nexport function normalizeGeneratorConfig(input: AthenaGeneratorConfig): NormalizedAthenaGeneratorConfig {\r\n return {\r\n provider: input.provider,\r\n output: normalizeOutputConfig(input.output),\r\n naming: {\r\n ...DEFAULT_NAMING,\r\n ...(input.naming ?? {}),\r\n },\r\n features: {\r\n ...DEFAULT_FEATURES,\r\n ...(input.features ?? {}),\r\n },\r\n experimental: {\r\n ...DEFAULT_EXPERIMENTAL_FLAGS,\r\n ...(input.experimental ?? {}),\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Typed identity helper for authoring generator configs.\r\n */\r\nexport function defineGeneratorConfig<TConfig extends AthenaGeneratorConfig>(\r\n config: TConfig,\r\n): TConfig {\r\n return config\r\n}\r\n\r\n/**\r\n * Finds a supported generator config filename in the provided directory.\r\n */\r\nexport function findGeneratorConfigPath(cwd: string = process.cwd()): string | undefined {\r\n for (const candidate of DEFAULT_CONFIG_CANDIDATES) {\r\n const absolutePath = resolve(cwd, candidate)\r\n if (existsSync(absolutePath)) {\r\n return absolutePath\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nfunction extractConfigExport(module: unknown): AthenaGeneratorConfig {\r\n if (module && typeof module === 'object') {\r\n const record = module as Record<string, unknown>\r\n const defaultExport = record.default\r\n if (defaultExport && typeof defaultExport === 'object') {\r\n return defaultExport as AthenaGeneratorConfig\r\n }\r\n const namedConfigExport = record.config\r\n if (namedConfigExport && typeof namedConfigExport === 'object') {\r\n return namedConfigExport as AthenaGeneratorConfig\r\n }\r\n }\r\n\r\n throw new Error('Generator config file must export a config object as default export or `config`.')\r\n}\r\n\r\n/**\r\n * Loads and normalizes `athena.config.*` from disk.\r\n */\r\nexport async function loadGeneratorConfig(\r\n options: LoadGeneratorConfigOptions = {},\r\n): Promise<LoadedGeneratorConfig> {\r\n const cwd = options.cwd ?? process.cwd()\r\n const resolvedPath = options.configPath\r\n ? resolve(cwd, options.configPath)\r\n : findGeneratorConfigPath(cwd)\r\n\r\n if (!resolvedPath) {\r\n throw new Error(\r\n `No generator config found in ${cwd}. Expected one of: ${DEFAULT_CONFIG_CANDIDATES.join(', ')}`,\r\n )\r\n }\r\n\r\n const moduleUrl = pathToFileURL(resolvedPath)\r\n const module = await import(`${moduleUrl.href}?cacheBust=${Date.now()}`)\r\n const rawConfig = extractConfigExport(module)\r\n\r\n return {\r\n configPath: resolvedPath,\r\n config: normalizeGeneratorConfig(rawConfig),\r\n }\r\n}\r\n","import { posix } from 'path'\r\nimport type {\r\n AthenaGeneratorConfig,\r\n GeneratedArtifact,\r\n GeneratedArtifacts,\r\n NormalizedAthenaGeneratorConfig,\r\n} from './types.ts'\r\nimport type {\r\n IntrospectionRelation,\r\n IntrospectionSnapshot,\r\n IntrospectionTable,\r\n} from '../schema/types.ts'\r\nimport {\r\n escapeStringLiteral,\r\n escapeTypePropertyName,\r\n toSafeIdentifier,\r\n} from './naming.ts'\r\nimport { renderOutputPath } from './placeholders.ts'\r\nimport { resolvePostgresColumnType } from './postgres-type-mapping.ts'\r\nimport { normalizeGeneratorConfig } from './config.ts'\r\n\r\ntype ModelRenderDescriptor = {\r\n schemaName: string\r\n tableName: string\r\n filePath: string\r\n rowTypeName: string\r\n insertTypeName: string\r\n updateTypeName: string\r\n modelConstName: string\r\n table: IntrospectionTable\r\n}\r\n\r\ntype SchemaRenderDescriptor = {\r\n schemaName: string\r\n filePath: string\r\n schemaConstName: string\r\n models: ModelRenderDescriptor[]\r\n}\r\n\r\ntype DatabaseRenderDescriptor = {\r\n filePath: string\r\n databaseConstName: string\r\n schemas: SchemaRenderDescriptor[]\r\n}\r\n\r\nfunction normalizePath(pathValue: string): string {\r\n return pathValue.replace(/\\\\/g, '/')\r\n}\r\n\r\nfunction withoutTypeScriptExtension(pathValue: string): string {\r\n return pathValue.replace(/\\.tsx?$/i, '')\r\n}\r\n\r\nfunction toModuleImportPath(fromFile: string, targetFile: string): string {\r\n const relativePath = withoutTypeScriptExtension(\r\n normalizePath(posix.relative(posix.dirname(fromFile), targetFile)),\r\n )\r\n return relativePath.startsWith('.') ? relativePath : `./${relativePath}`\r\n}\r\n\r\nfunction renderObjectKey(key: string): string {\r\n const escaped = escapeTypePropertyName(key)\r\n return escaped.startsWith(\"'\") ? escaped : escaped\r\n}\r\n\r\nfunction renderRelation(relation: IntrospectionRelation): string {\r\n const through = relation.through\r\n ? `,\r\n through: {\r\n schema: ${escapeStringLiteral(relation.through.schema)},\r\n model: ${escapeStringLiteral(relation.through.model)},\r\n sourceColumns: [${relation.through.sourceColumns.map(value => escapeStringLiteral(value)).join(', ')}],\r\n targetColumns: [${relation.through.targetColumns.map(value => escapeStringLiteral(value)).join(', ')}],\r\n }`\r\n : ''\r\n\r\n return `{\r\n kind: ${escapeStringLiteral(relation.kind)},\r\n sourceColumns: [${relation.sourceColumns.map(value => escapeStringLiteral(value)).join(', ')}],\r\n targetSchema: ${escapeStringLiteral(relation.targetSchema)},\r\n targetModel: ${escapeStringLiteral(relation.targetModel)},\r\n targetColumns: [${relation.targetColumns.map(value => escapeStringLiteral(value)).join(', ')}]${through}\r\n }`\r\n}\r\n\r\nfunction renderModelArtifact(\r\n snapshot: IntrospectionSnapshot,\r\n descriptor: ModelRenderDescriptor,\r\n config: NormalizedAthenaGeneratorConfig,\r\n): GeneratedArtifact {\r\n const columnLines = Object.values(descriptor.table.columns)\r\n .map(column => {\r\n const propertyName = escapeTypePropertyName(column.name)\r\n const baseType = resolvePostgresColumnType(column)\r\n const isOptional = column.isNullable\r\n const typeWithNullability = column.isNullable ? `${baseType} | null` : baseType\r\n return ` ${propertyName}${isOptional ? '?' : ''}: ${typeWithNullability}`\r\n })\r\n .join('\\n')\r\n\r\n const nullableLines = Object.values(descriptor.table.columns)\r\n .map(column => ` ${renderObjectKey(column.name)}: ${column.isNullable ? 'true' : 'false'}`)\r\n .join(',\\n')\r\n\r\n const relationEntries = Object.entries(descriptor.table.relations)\r\n const relationBlock = config.features.emitRelations && relationEntries.length > 0\r\n ? `,\r\n relations: {\r\n${relationEntries\r\n .map(([relationKey, relationValue]) => ` ${renderObjectKey(relationKey)}: ${renderRelation(relationValue)}`)\r\n .join(',\\n')}\r\n }`\r\n : ''\r\n\r\n const content = `import { defineModel } from '@xylex-group/athena'\r\n\r\nexport interface ${descriptor.rowTypeName} {\r\n${columnLines}\r\n}\r\n\r\nexport type ${descriptor.insertTypeName} = Partial<${descriptor.rowTypeName}>\r\nexport type ${descriptor.updateTypeName} = Partial<${descriptor.insertTypeName}>\r\n\r\nexport const ${descriptor.modelConstName} = defineModel<${descriptor.rowTypeName}, ${descriptor.insertTypeName}, ${descriptor.updateTypeName}>({\r\n meta: {\r\n database: ${escapeStringLiteral(snapshot.database)},\r\n schema: ${escapeStringLiteral(descriptor.schemaName)},\r\n model: ${escapeStringLiteral(descriptor.tableName)},\r\n tableName: ${escapeStringLiteral(`${descriptor.schemaName}.${descriptor.tableName}`)},\r\n primaryKey: [${descriptor.table.primaryKey.map(value => escapeStringLiteral(value)).join(', ')}],\r\n nullable: {\r\n${nullableLines}\r\n }${relationBlock}\r\n }\r\n})\r\n`\r\n\r\n return {\r\n kind: 'model',\r\n path: descriptor.filePath,\r\n content,\r\n }\r\n}\r\n\r\nfunction renderSchemaArtifact(descriptor: SchemaRenderDescriptor): GeneratedArtifact {\r\n const importLines = descriptor.models\r\n .map(modelDescriptor => {\r\n const importPath = toModuleImportPath(descriptor.filePath, modelDescriptor.filePath)\r\n return `import { ${modelDescriptor.modelConstName} } from '${importPath}'`\r\n })\r\n .join('\\n')\r\n\r\n const modelEntries = descriptor.models\r\n .map(modelDescriptor => ` ${renderObjectKey(modelDescriptor.tableName)}: ${modelDescriptor.modelConstName}`)\r\n .join(',\\n')\r\n\r\n const content = `import { defineSchema } from '@xylex-group/athena'\r\n${importLines ? `\\n${importLines}\\n` : '\\n'}\r\nexport const ${descriptor.schemaConstName} = defineSchema({\r\n${modelEntries}\r\n})\r\n`\r\n\r\n return {\r\n kind: 'schema',\r\n path: descriptor.filePath,\r\n content,\r\n }\r\n}\r\n\r\nfunction renderDatabaseArtifact(descriptor: DatabaseRenderDescriptor): GeneratedArtifact {\r\n const importLines = descriptor.schemas\r\n .map(schemaDescriptor => {\r\n const importPath = toModuleImportPath(descriptor.filePath, schemaDescriptor.filePath)\r\n return `import { ${schemaDescriptor.schemaConstName} } from '${importPath}'`\r\n })\r\n .join('\\n')\r\n\r\n const schemaEntries = descriptor.schemas\r\n .map(schemaDescriptor => ` ${renderObjectKey(schemaDescriptor.schemaName)}: ${schemaDescriptor.schemaConstName}`)\r\n .join(',\\n')\r\n\r\n const content = `import { defineDatabase } from '@xylex-group/athena'\r\n${importLines ? `\\n${importLines}\\n` : '\\n'}\r\nexport const ${descriptor.databaseConstName} = defineDatabase({\r\n${schemaEntries}\r\n})\r\n`\r\n\r\n return {\r\n kind: 'database',\r\n path: descriptor.filePath,\r\n content,\r\n }\r\n}\r\n\r\nfunction renderRegistryArtifact(\r\n registryPath: string,\r\n databasePath: string,\r\n databaseConstName: string,\r\n registryConstName: string,\r\n databaseName: string,\r\n): GeneratedArtifact {\r\n const databaseImportPath = toModuleImportPath(registryPath, databasePath)\r\n const content = `import { defineRegistry } from '@xylex-group/athena'\r\nimport { ${databaseConstName} } from '${databaseImportPath}'\r\n\r\nexport const ${registryConstName} = defineRegistry({\r\n ${renderObjectKey(databaseName)}: ${databaseConstName}\r\n})\r\n`\r\n\r\n return {\r\n kind: 'registry',\r\n path: registryPath,\r\n content,\r\n }\r\n}\r\n\r\nfunction assertNoDuplicatePaths(files: GeneratedArtifact[]) {\r\n const seen = new Set<string>()\r\n for (const file of files) {\r\n if (seen.has(file.path)) {\r\n throw new Error(`Generator output collision detected for path: ${file.path}`)\r\n }\r\n seen.add(file.path)\r\n }\r\n}\r\n\r\nclass ArtifactComposer {\r\n constructor(\r\n private readonly snapshot: IntrospectionSnapshot,\r\n private readonly config: NormalizedAthenaGeneratorConfig,\r\n ) {}\r\n\r\n compose(): GeneratedArtifacts {\r\n const providerName = this.snapshot.backend\r\n const databaseName = this.snapshot.database\r\n const modelDescriptors: ModelRenderDescriptor[] = []\r\n\r\n for (const schemaName of Object.keys(this.snapshot.schemas).sort()) {\r\n const schema = this.snapshot.schemas[schemaName]\r\n for (const tableName of Object.keys(schema.tables).sort()) {\r\n const table = schema.tables[tableName]\r\n const rowTypeName = `${toSafeIdentifier(`${schemaName} ${tableName}`, this.config.naming.modelType, 'Model')}Row`\r\n const insertTypeName = `${toSafeIdentifier(`${schemaName} ${tableName}`, this.config.naming.modelType, 'Model')}Insert`\r\n const updateTypeName = `${toSafeIdentifier(`${schemaName} ${tableName}`, this.config.naming.modelType, 'Model')}Update`\r\n const modelConstName = `${toSafeIdentifier(`${schemaName} ${tableName} model`, this.config.naming.modelConst, 'model')}`\r\n\r\n const modelPath = normalizePath(\r\n renderOutputPath(this.config.output.targets.model, {\r\n provider: providerName,\r\n kind: 'model',\r\n database: databaseName,\r\n schema: schemaName,\r\n model: tableName,\r\n }, this.config.output),\r\n )\r\n\r\n modelDescriptors.push({\r\n schemaName,\r\n tableName,\r\n filePath: modelPath,\r\n rowTypeName,\r\n insertTypeName,\r\n updateTypeName,\r\n modelConstName,\r\n table,\r\n })\r\n }\r\n }\r\n\r\n const schemaDescriptors: SchemaRenderDescriptor[] = Object.keys(this.snapshot.schemas)\r\n .sort()\r\n .map(schemaName => {\r\n const schemaPath = normalizePath(\r\n renderOutputPath(this.config.output.targets.schema, {\r\n provider: providerName,\r\n kind: 'schema',\r\n database: databaseName,\r\n schema: schemaName,\r\n model: 'index',\r\n }, this.config.output),\r\n )\r\n\r\n return {\r\n schemaName,\r\n filePath: schemaPath,\r\n schemaConstName: toSafeIdentifier(\r\n `${schemaName} schema`,\r\n this.config.naming.schemaConst,\r\n 'schema',\r\n ),\r\n models: modelDescriptors.filter(model => model.schemaName === schemaName),\r\n }\r\n })\r\n\r\n const databasePath = normalizePath(\r\n renderOutputPath(this.config.output.targets.database, {\r\n provider: providerName,\r\n kind: 'database',\r\n database: databaseName,\r\n schema: 'index',\r\n model: 'index',\r\n }, this.config.output),\r\n )\r\n\r\n const databaseDescriptor: DatabaseRenderDescriptor = {\r\n filePath: databasePath,\r\n databaseConstName: toSafeIdentifier(\r\n `${databaseName} database`,\r\n this.config.naming.databaseConst,\r\n 'database',\r\n ),\r\n schemas: schemaDescriptors,\r\n }\r\n\r\n const files: GeneratedArtifact[] = []\r\n\r\n for (const modelDescriptor of modelDescriptors) {\r\n files.push(renderModelArtifact(this.snapshot, modelDescriptor, this.config))\r\n }\r\n\r\n for (const schemaDescriptor of schemaDescriptors) {\r\n files.push(renderSchemaArtifact(schemaDescriptor))\r\n }\r\n\r\n files.push(renderDatabaseArtifact(databaseDescriptor))\r\n\r\n if (this.config.features.emitRegistry) {\r\n const registryPath = normalizePath(\r\n renderOutputPath(this.config.output.targets.registry, {\r\n provider: providerName,\r\n kind: 'registry',\r\n database: databaseName,\r\n schema: 'index',\r\n model: 'index',\r\n }, this.config.output),\r\n )\r\n files.push(\r\n renderRegistryArtifact(\r\n registryPath,\r\n databaseDescriptor.filePath,\r\n databaseDescriptor.databaseConstName,\r\n toSafeIdentifier('registry', this.config.naming.registryConst, 'registry'),\r\n databaseName,\r\n ),\r\n )\r\n }\r\n\r\n assertNoDuplicatePaths(files)\r\n\r\n return {\r\n snapshot: this.snapshot,\r\n files,\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Generates model/schema/database/registry source artifacts from an introspection snapshot.\r\n */\r\nexport function generateArtifactsFromSnapshot(\r\n snapshot: IntrospectionSnapshot,\r\n config: AthenaGeneratorConfig | NormalizedAthenaGeneratorConfig,\r\n): GeneratedArtifacts {\r\n const normalizedConfig = 'naming' in config && 'features' in config && 'experimental' in config\r\n ? config as NormalizedAthenaGeneratorConfig\r\n : normalizeGeneratorConfig(config as AthenaGeneratorConfig)\r\n return new ArtifactComposer(snapshot, normalizedConfig).compose()\r\n}\r\n","import type {\n AthenaGatewayEndpointPath,\n AthenaGatewayErrorCode,\n AthenaGatewayErrorDetails,\n AthenaGatewayMethod,\n AthenaGatewayResponse,\n} from './types.js'\n\nexport interface AthenaGatewayErrorInput {\n code: AthenaGatewayErrorCode\n message: string\n status?: number\n endpoint?: AthenaGatewayEndpointPath\n method?: AthenaGatewayMethod\n requestId?: string\n hint?: string\n cause?: string\n}\n\n/**\n * Canonical error for gateway failures.\n * Holds request context and machine-readable classification.\n */\nexport class AthenaGatewayError extends Error {\n readonly code: AthenaGatewayErrorCode\n readonly status: number\n readonly endpoint?: AthenaGatewayEndpointPath\n readonly method?: AthenaGatewayMethod\n readonly requestId?: string\n readonly hint?: string\n readonly causeDetail?: string\n\n constructor(input: AthenaGatewayErrorInput) {\n super(input.message)\n this.name = 'AthenaGatewayError'\n this.code = input.code\n this.status = input.status ?? 0\n this.endpoint = input.endpoint\n this.method = input.method\n this.requestId = input.requestId\n this.hint = input.hint\n this.causeDetail = input.cause\n }\n\n toDetails(): AthenaGatewayErrorDetails {\n return {\n code: this.code,\n message: this.message,\n status: this.status,\n endpoint: this.endpoint,\n method: this.method,\n requestId: this.requestId,\n hint: this.hint,\n cause: this.causeDetail,\n }\n }\n\n static fromResponse<T>(\n response: AthenaGatewayResponse<T>,\n fallback: Omit<AthenaGatewayErrorInput, 'code' | 'message' | 'status'>,\n ) {\n const details = response.errorDetails\n if (details) {\n return new AthenaGatewayError({\n code: details.code,\n message: details.message,\n status: details.status,\n endpoint: details.endpoint ?? fallback.endpoint,\n method: details.method ?? fallback.method,\n requestId: details.requestId ?? fallback.requestId,\n hint: details.hint,\n cause: details.cause,\n })\n }\n\n return new AthenaGatewayError({\n code: 'HTTP_ERROR',\n message: response.error ?? 'Gateway request failed',\n status: response.status,\n endpoint: fallback.endpoint,\n method: fallback.method,\n requestId: fallback.requestId,\n })\n }\n}\n\nexport function isAthenaGatewayError(error: unknown): error is AthenaGatewayError {\n return error instanceof AthenaGatewayError\n}\n","import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayErrorDetails,\r\n AthenaGatewayMethod,\r\n AthenaRpcCallOptions,\r\n AthenaRpcPayload,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaRpcFilter,\r\n AthenaUpdatePayload,\r\n AthenaQueryPayload,\r\n} from \"./types.js\";\r\nimport { AthenaGatewayError } from \"./errors.ts\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\nconst FALLBACK_SDK_VERSION = \"1.3.0\";\r\nconst SDK_NAME = \"xylex-group/athena\";\r\n\r\nconst SDK_VERSION =\r\n typeof process !== \"undefined\" && process?.env?.npm_package_version\r\n ? process.env.npm_package_version\r\n : FALLBACK_SDK_VERSION;\r\nconst SDK_HEADER_VALUE = `${SDK_NAME} ${SDK_VERSION}`;\r\n\r\nfunction parseResponseBody(rawText: string, contentType: string | null) {\r\n if (!rawText) {\r\n return { parsed: null as unknown, parseFailed: false };\r\n }\r\n\r\n const contentTypeSuggestsJson =\r\n contentType?.toLowerCase().includes(\"application/json\") ?? false;\r\n const looksJson =\r\n contentTypeSuggestsJson || rawText.startsWith(\"{\") || rawText.startsWith(\"[\");\r\n\r\n if (!looksJson) {\r\n return { parsed: rawText as unknown, parseFailed: false };\r\n }\r\n\r\n try {\r\n return { parsed: JSON.parse(rawText) as unknown, parseFailed: false };\r\n } catch {\r\n return { parsed: rawText as unknown, parseFailed: true };\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\nfunction resolveRequestId(headers: Headers): string | undefined {\r\n return (\r\n headers.get(\"x-request-id\") ??\r\n headers.get(\"x-correlation-id\") ??\r\n headers.get(\"x-athena-request-id\") ??\r\n undefined\r\n );\r\n}\r\n\r\nfunction resolveErrorMessage(payload: unknown, fallback: string) {\r\n if (isRecord(payload)) {\r\n const messageCandidates = [payload.error, payload.message, payload.details];\r\n for (const candidate of messageCandidates) {\r\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\r\n return candidate.trim();\r\n }\r\n }\r\n }\r\n\r\n if (typeof payload === \"string\" && payload.trim().length > 0) {\r\n return payload.trim();\r\n }\r\n\r\n return fallback;\r\n}\r\n\r\nfunction detailsFromError(error: AthenaGatewayError): AthenaGatewayErrorDetails {\r\n return error.toDetails();\r\n}\r\n\r\nfunction toQueryScalar(value: unknown): string {\r\n if (value === null || value === undefined) return \"null\";\r\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\r\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : \"null\";\r\n return String(value);\r\n}\r\n\r\nfunction toQueryArray(values: unknown[]): string {\r\n return `{${values.map(toQueryScalar).join(\",\")}}`;\r\n}\r\n\r\nfunction toRpcArgumentQueryValue(value: unknown): string {\r\n if (Array.isArray(value)) return toQueryArray(value);\r\n if (value && typeof value === \"object\") return JSON.stringify(value);\r\n return toQueryScalar(value);\r\n}\r\n\r\nfunction toRpcFilterQueryValue(filter: AthenaRpcFilter): string {\r\n const value = filter.value;\r\n switch (filter.operator) {\r\n case \"in\": {\r\n if (!Array.isArray(value)) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: `RPC filter \"${filter.column}\" with operator \"in\" requires an array value`,\r\n status: 0,\r\n });\r\n }\r\n return `in.${toQueryArray(value)}`;\r\n }\r\n case \"is\":\r\n return `is.${toQueryScalar(value)}`;\r\n case \"eq\":\r\n case \"neq\":\r\n case \"gt\":\r\n case \"gte\":\r\n case \"lt\":\r\n case \"lte\":\r\n case \"like\":\r\n case \"ilike\":\r\n return `${filter.operator}.${toQueryScalar(value)}`;\r\n }\r\n}\r\n\r\nfunction buildRpcGetEndpoint(payload: AthenaRpcPayload): AthenaGatewayEndpointPath {\r\n const functionName = (payload.function_name ?? payload.function).trim();\r\n if (!functionName) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: \"rpc requires a function name\",\r\n status: 0,\r\n endpoint: \"/gateway/rpc\",\r\n method: \"GET\",\r\n });\r\n }\r\n\r\n const query = new URLSearchParams();\r\n if (payload.schema) query.set(\"schema\", payload.schema);\r\n if (payload.select) query.set(\"select\", payload.select);\r\n if (payload.count) query.set(\"count\", payload.count);\r\n if (payload.head) query.set(\"head\", \"true\");\r\n if (typeof payload.limit === \"number\") query.set(\"limit\", String(payload.limit));\r\n if (typeof payload.offset === \"number\") query.set(\"offset\", String(payload.offset));\r\n if (payload.order?.column) {\r\n query.set(\r\n \"order\",\r\n payload.order.ascending === false\r\n ? `${payload.order.column}.desc`\r\n : payload.order.column,\r\n );\r\n }\r\n\r\n if (payload.args) {\r\n for (const [key, value] of Object.entries(payload.args)) {\r\n query.set(key, toRpcArgumentQueryValue(value));\r\n }\r\n }\r\n\r\n if (payload.filters?.length) {\r\n for (const filter of payload.filters) {\r\n if (payload.args && Object.prototype.hasOwnProperty.call(payload.args, filter.column)) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: `RPC filter \"${filter.column}\" conflicts with RPC argument \"${filter.column}\" in GET mode`,\r\n status: 0,\r\n });\r\n }\r\n query.set(filter.column, toRpcFilterQueryValue(filter));\r\n }\r\n }\r\n\r\n const endpoint = `/rpc/${encodeURIComponent(functionName)}`;\r\n const queryText = query.toString();\r\n const withQuery = queryText ? `${endpoint}?${queryText}` : endpoint;\r\n return withQuery as AthenaGatewayEndpointPath;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? true;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n const headerClient =\r\n extraHeaders[\"x-athena-client\"] ?? extraHeaders[\"X-Athena-Client\"];\r\n const finalClient =\r\n options?.client ??\r\n config.client ??\r\n (typeof headerClient === \"string\" ? headerClient : undefined) ??\r\n DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n \"X-Athena-Sdk\": SDK_HEADER_VALUE,\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n const finalBackend = options?.backend ?? config.backend;\r\n if (finalBackend) {\r\n const type =\r\n typeof finalBackend === \"string\" ? finalBackend : finalBackend.type;\r\n if (type) headers[\"X-Backend-Type\"] = type;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n const athenaClientKeys = [\"x-athena-client\", \"X-Athena-Client\"];\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n if (athenaClientKeys.includes(key)) return;\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const requestInit: RequestInit = {\r\n method,\r\n headers,\r\n };\r\n if (method !== \"GET\") {\r\n requestInit.body = JSON.stringify(payload);\r\n }\r\n\r\n const response = await fetch(url, requestInit);\r\n\r\n const rawText = await response.text();\r\n const requestId = resolveRequestId(response.headers);\r\n const parsedBody = parseResponseBody(\r\n rawText ?? \"\",\r\n response.headers.get(\"content-type\"),\r\n );\r\n\r\n if (parsedBody.parseFailed) {\r\n const invalidJsonError = new AthenaGatewayError({\r\n code: \"INVALID_JSON\",\r\n message: \"Gateway returned malformed JSON\",\r\n status: response.status,\r\n endpoint,\r\n method,\r\n requestId,\r\n hint: \"Verify the gateway response body is valid JSON.\",\r\n cause: rawText.slice(0, 300),\r\n });\r\n return {\r\n ok: false,\r\n status: response.status,\r\n data: null,\r\n error: invalidJsonError.message,\r\n errorDetails: detailsFromError(invalidJsonError),\r\n raw: parsedBody.parsed,\r\n };\r\n }\r\n\r\n const parsed = parsedBody.parsed;\r\n const parsedPayload = isRecord(parsed) ? parsed : null;\r\n\r\n if (!response.ok) {\r\n const httpError = new AthenaGatewayError({\r\n code: \"HTTP_ERROR\",\r\n message: resolveErrorMessage(\r\n parsed,\r\n `Athena gateway ${method} ${endpoint} failed with status ${response.status}`,\r\n ),\r\n status: response.status,\r\n endpoint,\r\n method,\r\n requestId,\r\n });\r\n\r\n return {\r\n ok: false,\r\n status: response.status,\r\n data: null,\r\n error: httpError.message,\r\n errorDetails: detailsFromError(httpError),\r\n raw: parsed,\r\n };\r\n }\r\n\r\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\r\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\r\n const payloadData =\r\n parsedPayload && \"data\" in parsedPayload\r\n ? (parsedPayload.data as T)\r\n : (parsed as T);\r\n const payloadCount =\r\n parsedPayload && \"count\" in parsedPayload\r\n ? typeof parsedPayload.count === \"number\" || parsedPayload.count === null\r\n ? (parsedPayload.count as number | null)\r\n : undefined\r\n : undefined;\r\n\r\n return {\r\n ok: true,\r\n status: response.status,\r\n data: payloadData ?? null,\r\n count: payloadCount,\r\n error: undefined,\r\n errorDetails: null,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message = callError instanceof Error ? callError.message : String(callError);\r\n const networkError = new AthenaGatewayError({\r\n code: \"NETWORK_ERROR\",\r\n message: `Network error while calling ${method} ${endpoint}: ${message}`,\r\n endpoint,\r\n method,\r\n cause: message,\r\n hint: \"Check gateway URL, DNS, and network reachability.\",\r\n });\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: networkError.message,\r\n errorDetails: detailsFromError(networkError),\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n rpcGateway<T>(\r\n payload: AthenaRpcPayload,\r\n options?: AthenaRpcCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n queryGateway<T>(\r\n payload: AthenaQueryPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n rpcGateway(payload, options) {\r\n if (options?.get) {\r\n const endpoint = buildRpcGetEndpoint(payload);\r\n return callAthena(config, endpoint, \"GET\", null, options);\r\n }\r\n return callAthena(config, \"/gateway/rpc\", \"POST\", payload, options);\r\n },\r\n queryGateway(payload, options) {\r\n return callAthena(config, \"/gateway/query\", \"POST\", payload, options);\r\n },\r\n };\r\n}\r\n","const SIMPLE_IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/\r\nconst COMPOSITE_IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*$/\r\nconst ALIAS_PATTERN = /^([A-Za-z_][A-Za-z0-9_.]*)\\s+(?:as\\s+)?([A-Za-z_][A-Za-z0-9_]*)$/i\r\n\r\nfunction quoteIdentifierSegment(identifier: string): string {\r\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`\r\n}\r\n\r\n/**\r\n * Quotes a `schema.table.column`-style identifier path safely for SQL.\r\n */\r\nexport function quoteQualifiedIdentifier(identifier: string): string {\r\n return identifier\r\n .split('.')\r\n .map(segment => quoteIdentifierSegment(segment))\r\n .join('.')\r\n}\r\n\r\nfunction quoteSelectToken(token: string): string {\r\n if (token === '*') return token\r\n if (COMPOSITE_IDENTIFIER_PATTERN.test(token)) {\r\n return quoteQualifiedIdentifier(token)\r\n }\r\n\r\n const aliasMatch = ALIAS_PATTERN.exec(token)\r\n if (!aliasMatch) {\r\n return token\r\n }\r\n\r\n const [, baseIdentifier, aliasIdentifier] = aliasMatch\r\n if (!COMPOSITE_IDENTIFIER_PATTERN.test(baseIdentifier) || !SIMPLE_IDENTIFIER_PATTERN.test(aliasIdentifier)) {\r\n return token\r\n }\r\n return `${quoteQualifiedIdentifier(baseIdentifier)} AS ${quoteIdentifierSegment(aliasIdentifier)}`\r\n}\r\n\r\nfunction canAutoQuoteToken(token: string): boolean {\r\n if (token === '*') return true\r\n if (COMPOSITE_IDENTIFIER_PATTERN.test(token)) return true\r\n\r\n const aliasMatch = ALIAS_PATTERN.exec(token)\r\n if (!aliasMatch) return false\r\n const [, baseIdentifier, aliasIdentifier] = aliasMatch\r\n return COMPOSITE_IDENTIFIER_PATTERN.test(baseIdentifier) && SIMPLE_IDENTIFIER_PATTERN.test(aliasIdentifier)\r\n}\r\n\r\nfunction splitTopLevelCommaSeparated(input: string): string[] | null {\r\n const parts: string[] = []\r\n let buffer = ''\r\n let singleQuoted = false\r\n let doubleQuoted = false\r\n let depth = 0\r\n\r\n for (let index = 0; index < input.length; index += 1) {\r\n const char = input[index]\r\n const next = index + 1 < input.length ? input[index + 1] : ''\r\n\r\n if (singleQuoted) {\r\n buffer += char\r\n if (char === \"'\" && next === \"'\") {\r\n buffer += next\r\n index += 1\r\n continue\r\n }\r\n if (char === \"'\") {\r\n singleQuoted = false\r\n }\r\n continue\r\n }\r\n\r\n if (doubleQuoted) {\r\n buffer += char\r\n if (char === '\"' && next === '\"') {\r\n buffer += next\r\n index += 1\r\n continue\r\n }\r\n if (char === '\"') {\r\n doubleQuoted = false\r\n }\r\n continue\r\n }\r\n\r\n if (char === \"'\") {\r\n singleQuoted = true\r\n buffer += char\r\n continue\r\n }\r\n if (char === '\"') {\r\n doubleQuoted = true\r\n buffer += char\r\n continue\r\n }\r\n\r\n if (char === '(') {\r\n depth += 1\r\n buffer += char\r\n continue\r\n }\r\n if (char === ')') {\r\n depth -= 1\r\n if (depth < 0) return null\r\n buffer += char\r\n continue\r\n }\r\n\r\n if (char === ',' && depth === 0) {\r\n parts.push(buffer.trim())\r\n buffer = ''\r\n continue\r\n }\r\n\r\n buffer += char\r\n }\r\n\r\n if (singleQuoted || doubleQuoted || depth !== 0) {\r\n return null\r\n }\r\n\r\n if (buffer.trim().length > 0) {\r\n parts.push(buffer.trim())\r\n }\r\n\r\n return parts\r\n}\r\n\r\n/**\r\n * Quotes identifier lists while preserving raw SQL expressions.\r\n *\r\n * Examples:\r\n * - `\"table, user\"` -> `\"\\\"table\\\", \\\"user\\\"\"`\r\n * - `concat(name, ',') as label, id` -> unchanged\r\n */\r\nexport function quoteSelectColumnsExpression(columns: string): string {\r\n const trimmed = columns.trim()\r\n if (!trimmed || trimmed === '*') return trimmed || '*'\r\n\r\n const tokens = splitTopLevelCommaSeparated(trimmed)\r\n if (!tokens || tokens.length === 0) {\r\n return trimmed\r\n }\r\n\r\n if (!tokens.every(canAutoQuoteToken)) {\r\n return trimmed\r\n }\r\n\r\n return tokens.map(quoteSelectToken).join(', ')\r\n}\r\n\r\n/**\r\n * Immutable identifier object with consistent SQL rendering.\r\n */\r\nexport interface SqlIdentifier {\r\n readonly segments: string[]\r\n toSql(): string\r\n toString(): string\r\n}\r\n\r\nclass SqlIdentifierPath implements SqlIdentifier {\r\n readonly segments: string[]\r\n\r\n constructor(segments: string[]) {\r\n this.segments = segments\r\n }\r\n\r\n toSql(): string {\r\n return this.segments.map(quoteIdentifierSegment).join('.')\r\n }\r\n\r\n toString(): string {\r\n return this.toSql()\r\n }\r\n}\r\n\r\n/**\r\n * Creates a quoted identifier object from segment or dotted inputs.\r\n */\r\nexport function identifier(...segments: string[]): SqlIdentifier {\r\n const expandedSegments = segments\r\n .flatMap(segment => segment.split('.'))\r\n .map(segment => segment.trim())\r\n .filter(segment => segment.length > 0)\r\n\r\n return new SqlIdentifierPath(expandedSegments)\r\n}\r\n\r\n","import type {\r\n AthenaConditionArrayValue,\r\n AthenaConditionCastType,\r\n AthenaConditionOperator,\r\n AthenaConditionValue,\r\n AthenaDeletePayload,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayCondition,\r\n AthenaGatewayErrorDetails,\r\n AthenaGatewayResponse,\r\n AthenaInsertPayload,\r\n AthenaRpcCallOptions,\r\n AthenaRpcFilter,\r\n AthenaRpcFilterOperator,\r\n AthenaRpcPayload,\r\n AthenaSortBy,\r\n AthenaUpdatePayload,\r\n} from './gateway/types.ts'\r\nimport type { BackendConfig, BackendType } from './gateway/types.ts'\r\nimport { createAthenaGatewayClient } from './gateway/client.ts'\r\nimport { quoteQualifiedIdentifier, quoteSelectColumnsExpression } from './sql-identifiers.ts'\r\n\r\nexport interface AthenaResult<T> {\r\n data: T | null\r\n error: string | null\r\n errorDetails?: AthenaGatewayErrorDetails | null\r\n status: number\r\n count?: number | null\r\n raw: unknown\r\n}\r\n\r\ntype TableBuilderState = {\r\n conditions: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n order?: AthenaSortBy\r\n currentPage?: number\r\n pageSize?: number\r\n totalPages?: number\r\n}\r\n\r\ntype ConditionCastHints = {\r\n valueCast?: AthenaConditionCastType\r\n columnCast?: AthenaConditionCastType\r\n}\r\n\r\ntype MutationSingleResult<Result> = Result extends Array<infer Item> ? Item | null : Result | null\r\nconst DEFAULT_COLUMNS = '*'\r\nconst UUID_PATTERN =\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\r\nconst SAFE_CAST_PATTERN = /^[a-z_][a-z0-9_]*(?:\\[\\])?$/i\r\n\r\nexport interface MutationQuery<Result> extends PromiseLike<AthenaResult<Result>> {\r\n select(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<Result>>\r\n returning(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<Result>>\r\n single(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaResult<MutationSingleResult<Result>>>\r\n maybeSingle(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaResult<MutationSingleResult<Result>>>\r\n then<TResult1 = AthenaResult<Result>, TResult2 = never>(\r\n onfulfilled?: ((value: AthenaResult<Result>) => TResult1 | PromiseLike<TResult1>) | undefined | null,\r\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null,\r\n ): Promise<TResult1 | TResult2>\r\n catch<TResult = never>(\r\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null,\r\n ): Promise<AthenaResult<Result> | TResult>\r\n finally(onfinally?: (() => void) | undefined | null): Promise<AthenaResult<Result>>\r\n}\r\n\r\nfunction formatResult<T>(response: AthenaGatewayResponse<T>): AthenaResult<T> {\r\n const result: AthenaResult<T> = {\r\n data: response.data ?? null,\r\n error: response.error ?? null,\r\n errorDetails: response.errorDetails ?? null,\r\n status: response.status,\r\n raw: response.raw,\r\n }\r\n if (response.count !== undefined) {\r\n result.count = response.count\r\n }\r\n return result\r\n}\r\n\r\nfunction toSingleResult<Result>(response: AthenaResult<Result>): AthenaResult<MutationSingleResult<Result>> {\r\n const payload = response.data\r\n const singleData =\r\n Array.isArray(payload) ? (payload.length ? payload[0] : null) : payload ?? null\r\n return {\r\n ...response,\r\n data: singleData as MutationSingleResult<Result>,\r\n }\r\n}\r\n\r\nfunction mergeOptions<T extends object>(...options: Array<T | undefined>): T | undefined {\r\n return options.reduce<T | undefined>((acc, next) => {\r\n if (!next) return acc\r\n return { ...acc, ...next }\r\n }, undefined)\r\n}\r\n\r\nfunction createMutationQuery<Result>(\r\n executor: (\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaResult<Result>>,\r\n defaultColumns: string | string[] | null = DEFAULT_COLUMNS,\r\n): MutationQuery<Result> {\r\n let selectedColumns: string | string[] | undefined = defaultColumns === null ? undefined : defaultColumns\r\n let selectedOptions: AthenaGatewayCallOptions | undefined\r\n let promise: Promise<AthenaResult<Result>> | null = null\r\n\r\n const run = (columns?: string | string[], options?: AthenaGatewayCallOptions) => {\r\n const payloadColumns = columns ?? selectedColumns\r\n const payloadOptions = options ?? selectedOptions\r\n if (!promise) {\r\n promise = executor(payloadColumns, payloadOptions)\r\n }\r\n return promise\r\n }\r\n\r\n const mutationQuery: MutationQuery<Result> = {\r\n select(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options)\r\n },\r\n returning(columns = selectedColumns, options) {\r\n return mutationQuery.select(columns, options)\r\n },\r\n single(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options).then(toSingleResult)\r\n },\r\n maybeSingle(columns = selectedColumns, options) {\r\n return mutationQuery.single(columns, options)\r\n },\r\n then(onfulfilled, onrejected) {\r\n return run(selectedColumns, selectedOptions).then(onfulfilled, onrejected)\r\n },\r\n catch(onrejected) {\r\n return run(selectedColumns, selectedOptions).catch(onrejected)\r\n },\r\n finally(onfinally) {\r\n return run(selectedColumns, selectedOptions).finally(onfinally)\r\n },\r\n }\r\n\r\n return mutationQuery\r\n}\r\n\r\nexport interface OrderOptions {\r\n ascending?: boolean\r\n}\r\n\r\n/** Shared filter chain - supports eq, limit, etc. in any order relative to select/update */\r\ninterface FilterChain<Self> {\r\n eq(column: string, value: AthenaConditionValue): Self\r\n eqCast(column: string, value: AthenaConditionValue, cast: AthenaConditionCastType): Self\r\n eqUuid(column: string, value: string): Self\r\n match(filters: Record<string, AthenaConditionValue>): Self\r\n range(from: number, to: number): Self\r\n limit(count: number): Self\r\n offset(count: number): Self\r\n currentPage(value: number): Self\r\n pageSize(value: number): Self\r\n totalPages(value: number): Self\r\n order(column: string, options?: OrderOptions): Self\r\n gt(column: string, value: AthenaConditionValue): Self\r\n gte(column: string, value: AthenaConditionValue): Self\r\n lt(column: string, value: AthenaConditionValue): Self\r\n lte(column: string, value: AthenaConditionValue): Self\r\n neq(column: string, value: AthenaConditionValue): Self\r\n like(column: string, value: AthenaConditionValue): Self\r\n ilike(column: string, value: AthenaConditionValue): Self\r\n is(column: string, value: AthenaConditionValue): Self\r\n in(column: string, values: AthenaConditionArrayValue): Self\r\n contains(column: string, values: AthenaConditionArrayValue): Self\r\n containedBy(column: string, values: AthenaConditionArrayValue): Self\r\n not(\r\n columnOrExpression: string,\r\n operator?: AthenaConditionOperator,\r\n value?: AthenaConditionValue,\r\n ): Self\r\n or(expression: string): Self\r\n}\r\n\r\n/** Chain returned by select() - supports filters and single/maybeSingle before execution */\r\nexport interface SelectChain<Row> extends FilterChain<SelectChain<Row>>, PromiseLike<AthenaResult<Row[]>> {\r\n single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<T | null>>\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<T | null>>\r\n}\r\n\r\n/** Chain returned by update() - supports filters before execution, plus select/returning */\r\nexport interface UpdateChain<Row> extends FilterChain<UpdateChain<Row>>, MutationQuery<Row[]> {}\r\n\r\ninterface RpcFilterChain<Self> {\r\n eq(column: string, value: AthenaConditionValue): Self\r\n neq(column: string, value: AthenaConditionValue): Self\r\n gt(column: string, value: AthenaConditionValue): Self\r\n gte(column: string, value: AthenaConditionValue): Self\r\n lt(column: string, value: AthenaConditionValue): Self\r\n lte(column: string, value: AthenaConditionValue): Self\r\n like(column: string, value: AthenaConditionValue): Self\r\n ilike(column: string, value: AthenaConditionValue): Self\r\n is(column: string, value: AthenaConditionValue): Self\r\n in(column: string, values: AthenaConditionArrayValue): Self\r\n}\r\n\r\nexport interface RpcOrderOptions {\r\n ascending?: boolean\r\n}\r\n\r\nexport interface RpcQueryBuilder<Row>\r\n extends RpcFilterChain<RpcQueryBuilder<Row>>, PromiseLike<AthenaResult<Row[]>> {\r\n select(columns?: string | string[], options?: AthenaRpcCallOptions): Promise<AthenaResult<Row[]>>\r\n single<T = Row>(columns?: string | string[], options?: AthenaRpcCallOptions): Promise<AthenaResult<T | null>>\r\n maybeSingle<T = Row>(\r\n columns?: string | string[],\r\n options?: AthenaRpcCallOptions,\r\n ): Promise<AthenaResult<T | null>>\r\n order(column: string, options?: RpcOrderOptions): RpcQueryBuilder<Row>\r\n limit(count: number): RpcQueryBuilder<Row>\r\n offset(count: number): RpcQueryBuilder<Row>\r\n range(from: number, to: number): RpcQueryBuilder<Row>\r\n}\r\n\r\nexport interface TableQueryBuilder<Row> extends FilterChain<TableQueryBuilder<Row>> {\r\n select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): SelectChain<T>\r\n insert(values: Row, options?: AthenaGatewayCallOptions): MutationQuery<Row>\r\n insert(values: Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row[]>\r\n upsert(\r\n values: Row,\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row>\r\n upsert(\r\n values: Row[],\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row[]>\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions): UpdateChain<Row>\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }): MutationQuery<Row | null>\r\n single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<T | null>>\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<T | null>>\r\n reset(): TableQueryBuilder<Row>\r\n}\r\n\r\nfunction getResourceId(state: TableBuilderState): string | undefined {\r\n const candidate = state.conditions.find(\r\n condition =>\r\n condition.operator === 'eq' &&\r\n (condition.column === 'resource_id' || condition.column === 'id'),\r\n )\r\n return candidate?.value?.toString()\r\n}\r\n\r\nfunction stringifyFilterValue(value: AthenaConditionValue | AthenaConditionArrayValue | string): string {\r\n if (Array.isArray(value)) {\r\n return value.join(',')\r\n }\r\n return String(value)\r\n}\r\n\r\nfunction isUuidString(value: string): boolean {\r\n return UUID_PATTERN.test(value.trim())\r\n}\r\n\r\nfunction isUuidIdentifierColumn(column: string): boolean {\r\n return column === 'id' || /(?:^|_)uuid(?:_|$)/i.test(column) || /_id$/i.test(column)\r\n}\r\n\r\nfunction shouldUseUuidTextComparison(column: string, value: AthenaConditionValue): boolean {\r\n return typeof value === 'string' && isUuidString(value) && isUuidIdentifierColumn(column)\r\n}\r\n\r\nfunction normalizeCast(cast: AthenaConditionCastType): string {\r\n const normalized = cast.trim().toLowerCase()\r\n if (!SAFE_CAST_PATTERN.test(normalized)) {\r\n throw new Error(`Invalid cast type \"${cast}\"`)\r\n }\r\n return normalized\r\n}\r\n\r\nfunction escapeSqlStringLiteral(value: string): string {\r\n return value.replace(/'/g, \"''\")\r\n}\r\n\r\nfunction toSqlLiteral(value: AthenaConditionValue): string {\r\n if (value === null) return 'NULL'\r\n if (typeof value === 'number') return Number.isFinite(value) ? String(value) : 'NULL'\r\n if (typeof value === 'boolean') return value ? 'TRUE' : 'FALSE'\r\n return `'${escapeSqlStringLiteral(value)}'`\r\n}\r\n\r\nfunction withCast(expression: string, cast?: AthenaConditionCastType): string {\r\n if (!cast) return expression\r\n return `${expression}::${normalizeCast(cast)}`\r\n}\r\n\r\nfunction buildSelectColumnsClause(columns: string | string[]): string {\r\n if (Array.isArray(columns)) {\r\n return columns.map(column => quoteQualifiedIdentifier(column)).join(', ')\r\n }\r\n return quoteSelectColumnsExpression(columns)\r\n}\r\n\r\nfunction conditionToSqlClause(condition: AthenaGatewayCondition): string | null {\r\n if (!condition.column) return null\r\n const column = withCast(quoteQualifiedIdentifier(condition.column), condition.column_cast)\r\n const value = condition.value\r\n const sqlOperator = {\r\n eq: '=',\r\n neq: '!=',\r\n gt: '>',\r\n gte: '>=',\r\n lt: '<',\r\n lte: '<=',\r\n like: 'LIKE',\r\n ilike: 'ILIKE',\r\n } as const\r\n\r\n switch (condition.operator) {\r\n case 'eq':\r\n case 'neq':\r\n case 'gt':\r\n case 'gte':\r\n case 'lt':\r\n case 'lte':\r\n case 'like':\r\n case 'ilike': {\r\n if (Array.isArray(value) || value === undefined) return null\r\n const rhs = withCast(toSqlLiteral(value), condition.value_cast)\r\n return `${column} ${sqlOperator[condition.operator]} ${rhs}`\r\n }\r\n case 'is': {\r\n if (value === null) return `${column} IS NULL`\r\n if (value === true) return `${column} IS TRUE`\r\n if (value === false) return `${column} IS FALSE`\r\n return null\r\n }\r\n case 'in': {\r\n if (!Array.isArray(value)) return null\r\n if (value.length === 0) return 'FALSE'\r\n const values = value.map(item => withCast(toSqlLiteral(item), condition.value_cast))\r\n return `${column} IN (${values.join(', ')})`\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nfunction buildTypedSelectQuery(input: {\r\n tableName: string\r\n columns: string | string[]\r\n conditions: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n currentPage?: number\r\n pageSize?: number\r\n order?: AthenaSortBy\r\n}): string | null {\r\n const whereClauses: string[] = []\r\n for (const condition of input.conditions) {\r\n const clause = conditionToSqlClause(condition)\r\n if (!clause) return null\r\n whereClauses.push(clause)\r\n }\r\n\r\n let limit = input.limit\r\n let offset = input.offset\r\n if (limit === undefined && input.pageSize !== undefined) {\r\n limit = input.pageSize\r\n }\r\n if (\r\n offset === undefined &&\r\n input.pageSize !== undefined &&\r\n input.currentPage !== undefined &&\r\n input.currentPage > 0\r\n ) {\r\n offset = (input.currentPage - 1) * input.pageSize\r\n }\r\n\r\n const sqlParts = [\r\n `SELECT ${buildSelectColumnsClause(input.columns)} FROM ${quoteQualifiedIdentifier(input.tableName)}`,\r\n ]\r\n\r\n if (whereClauses.length > 0) {\r\n sqlParts.push(`WHERE ${whereClauses.join(' AND ')}`)\r\n }\r\n\r\n if (input.order?.field) {\r\n const direction = input.order.direction === 'descending' ? 'DESC' : 'ASC'\r\n sqlParts.push(`ORDER BY ${quoteQualifiedIdentifier(input.order.field)} ${direction}`)\r\n }\r\n\r\n if (limit !== undefined) {\r\n sqlParts.push(`LIMIT ${Math.max(0, Math.trunc(limit))}`)\r\n }\r\n\r\n if (offset !== undefined) {\r\n sqlParts.push(`OFFSET ${Math.max(0, Math.trunc(offset))}`)\r\n }\r\n\r\n return `${sqlParts.join(' ')};`\r\n}\r\n\r\nfunction createFilterMethods<Self>(\r\n state: TableBuilderState,\r\n addCondition: (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n hints?: ConditionCastHints,\r\n ) => void,\r\n self: Self,\r\n) {\r\n return {\r\n eq(column: string, value: AthenaConditionValue) {\r\n if (shouldUseUuidTextComparison(column, value)) {\r\n addCondition('eq', column, value, { columnCast: 'text' })\r\n } else {\r\n addCondition('eq', column, value)\r\n }\r\n return self\r\n },\r\n eqCast(column: string, value: AthenaConditionValue, cast: AthenaConditionCastType) {\r\n addCondition('eq', column, value, { valueCast: cast })\r\n return self\r\n },\r\n eqUuid(column: string, value: string) {\r\n addCondition('eq', column, value, { valueCast: 'uuid' })\r\n return self\r\n },\r\n match(filters: Record<string, AthenaConditionValue>) {\r\n Object.entries(filters).forEach(([column, value]) => {\r\n if (shouldUseUuidTextComparison(column, value)) {\r\n addCondition('eq', column, value, { columnCast: 'text' })\r\n } else {\r\n addCondition('eq', column, value)\r\n }\r\n })\r\n return self\r\n },\r\n range(from: number, to: number) {\r\n state.offset = from\r\n state.limit = to - from + 1\r\n return self\r\n },\r\n limit(count: number) {\r\n state.limit = count\r\n return self\r\n },\r\n offset(count: number) {\r\n state.offset = count\r\n return self\r\n },\r\n currentPage(value: number) {\r\n state.currentPage = value\r\n return self\r\n },\r\n pageSize(value: number) {\r\n state.pageSize = value\r\n return self\r\n },\r\n totalPages(value: number) {\r\n state.totalPages = value\r\n return self\r\n },\r\n order(column: string, options?: OrderOptions) {\r\n state.order = {\r\n field: column,\r\n direction: options?.ascending === false ? 'descending' : 'ascending',\r\n }\r\n return self\r\n },\r\n gt(column: string, value: AthenaConditionValue) {\r\n addCondition('gt', column, value)\r\n return self\r\n },\r\n gte(column: string, value: AthenaConditionValue) {\r\n addCondition('gte', column, value)\r\n return self\r\n },\r\n lt(column: string, value: AthenaConditionValue) {\r\n addCondition('lt', column, value)\r\n return self\r\n },\r\n lte(column: string, value: AthenaConditionValue) {\r\n addCondition('lte', column, value)\r\n return self\r\n },\r\n neq(column: string, value: AthenaConditionValue) {\r\n addCondition('neq', column, value)\r\n return self\r\n },\r\n like(column: string, value: AthenaConditionValue) {\r\n addCondition('like', column, value)\r\n return self\r\n },\r\n ilike(column: string, value: AthenaConditionValue) {\r\n addCondition('ilike', column, value)\r\n return self\r\n },\r\n is(column: string, value: AthenaConditionValue) {\r\n addCondition('is', column, value)\r\n return self\r\n },\r\n in(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('in', column, values)\r\n return self\r\n },\r\n contains(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('contains', column, values)\r\n return self\r\n },\r\n containedBy(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('containedBy', column, values)\r\n return self\r\n },\r\n not(columnOrExpression: string, operator?: AthenaConditionOperator, value?: AthenaConditionValue) {\r\n if (operator != null && value !== undefined) {\r\n addCondition('not', undefined, `${columnOrExpression}.${operator}.${stringifyFilterValue(value)}`)\r\n } else {\r\n addCondition('not', undefined, columnOrExpression)\r\n }\r\n return self\r\n },\r\n or(expression: string) {\r\n addCondition('or', undefined, expression)\r\n return self\r\n },\r\n }\r\n}\r\n\r\nfunction toRpcSelect(columns?: string | string[]) {\r\n if (!columns) return undefined\r\n return Array.isArray(columns) ? columns.join(',') : columns\r\n}\r\n\r\nfunction createRpcFilterMethods<Self>(\r\n filters: AthenaRpcFilter[],\r\n self: Self,\r\n) {\r\n const addFilter = (\r\n operator: AthenaRpcFilterOperator,\r\n column: string,\r\n value: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n ) => {\r\n filters.push({ column, operator, value })\r\n }\r\n\r\n return {\r\n eq(column: string, value: AthenaConditionValue) {\r\n addFilter('eq', column, value)\r\n return self\r\n },\r\n neq(column: string, value: AthenaConditionValue) {\r\n addFilter('neq', column, value)\r\n return self\r\n },\r\n gt(column: string, value: AthenaConditionValue) {\r\n addFilter('gt', column, value)\r\n return self\r\n },\r\n gte(column: string, value: AthenaConditionValue) {\r\n addFilter('gte', column, value)\r\n return self\r\n },\r\n lt(column: string, value: AthenaConditionValue) {\r\n addFilter('lt', column, value)\r\n return self\r\n },\r\n lte(column: string, value: AthenaConditionValue) {\r\n addFilter('lte', column, value)\r\n return self\r\n },\r\n like(column: string, value: AthenaConditionValue) {\r\n addFilter('like', column, value)\r\n return self\r\n },\r\n ilike(column: string, value: AthenaConditionValue) {\r\n addFilter('ilike', column, value)\r\n return self\r\n },\r\n is(column: string, value: AthenaConditionValue) {\r\n addFilter('is', column, value)\r\n return self\r\n },\r\n in(column: string, values: AthenaConditionArrayValue) {\r\n addFilter('in', column, values)\r\n return self\r\n },\r\n }\r\n}\r\n\r\nfunction createRpcBuilder<Row>(\r\n functionName: string,\r\n args: Record<string, unknown> | undefined,\r\n baseOptions: AthenaRpcCallOptions | undefined,\r\n client: ReturnType<typeof createAthenaGatewayClient>,\r\n): RpcQueryBuilder<Row> {\r\n const state: {\r\n filters: AthenaRpcFilter[]\r\n limit?: number\r\n offset?: number\r\n order?: { column: string; ascending?: boolean }\r\n } = {\r\n filters: [],\r\n }\r\n\r\n let selectedColumns: string | string[] | undefined\r\n let selectedOptions: AthenaRpcCallOptions | undefined\r\n let promise: Promise<AthenaResult<Row[]>> | null = null\r\n\r\n const executeRpc = async <SelectedRow = Row>(\r\n columns?: string | string[],\r\n options?: AthenaRpcCallOptions,\r\n ): Promise<AthenaResult<SelectedRow[]>> => {\r\n const mergedOptions = mergeOptions(baseOptions, options)\r\n const payload: AthenaRpcPayload = {\r\n function: functionName,\r\n args,\r\n schema: mergedOptions?.schema,\r\n select: toRpcSelect(columns),\r\n filters: state.filters.length ? [...state.filters] : undefined,\r\n count: mergedOptions?.count,\r\n head: mergedOptions?.head,\r\n limit: state.limit,\r\n offset: state.offset,\r\n order: state.order,\r\n }\r\n const response = await client.rpcGateway<SelectedRow[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n\r\n const run = (columns?: string | string[], options?: AthenaRpcCallOptions) => {\r\n const payloadColumns = columns ?? selectedColumns\r\n const payloadOptions = options ?? selectedOptions\r\n if (!promise) {\r\n promise = executeRpc<Row>(payloadColumns, payloadOptions)\r\n }\r\n return promise\r\n }\r\n\r\n const builder = {} as RpcQueryBuilder<Row>\r\n const filterMethods = createRpcFilterMethods(state.filters, builder)\r\n\r\n Object.assign(builder, filterMethods, {\r\n select(columns = selectedColumns, options?: AthenaRpcCallOptions) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options)\r\n },\r\n async single<T = Row>(columns?: string | string[], options?: AthenaRpcCallOptions) {\r\n const result = await run(columns, options)\r\n return toSingleResult(result) as AthenaResult<T | null>\r\n },\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaRpcCallOptions) {\r\n return builder.single<T>(columns, options)\r\n },\r\n order(column: string, options?: RpcOrderOptions) {\r\n state.order = { column, ascending: options?.ascending ?? true }\r\n return builder\r\n },\r\n limit(count: number) {\r\n state.limit = count\r\n return builder\r\n },\r\n offset(count: number) {\r\n state.offset = count\r\n return builder\r\n },\r\n range(from: number, to: number) {\r\n state.offset = from\r\n state.limit = to - from + 1\r\n return builder\r\n },\r\n then<T1 = AthenaResult<Row[]>, T2 = never>(\r\n onfulfilled?: (v: AthenaResult<Row[]>) => T1 | PromiseLike<T1>,\r\n onrejected?: (reason: unknown) => T2 | PromiseLike<T2>,\r\n ) {\r\n return run(selectedColumns, selectedOptions).then(onfulfilled, onrejected)\r\n },\r\n catch<T = never>(onrejected?: (reason: unknown) => T | PromiseLike<T>) {\r\n return run(selectedColumns, selectedOptions).catch(onrejected)\r\n },\r\n finally(onfinally?: () => void) {\r\n return run(selectedColumns, selectedOptions).finally(onfinally)\r\n },\r\n })\r\n\r\n return builder\r\n}\r\n\r\nfunction createTableBuilder<Row>(\r\n tableName: string,\r\n client: ReturnType<typeof createAthenaGatewayClient>,\r\n): TableQueryBuilder<Row> {\r\n const state: TableBuilderState = {\r\n conditions: [],\r\n }\r\n\r\n const addCondition = (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n hints?: ConditionCastHints,\r\n ) => {\r\n const condition: AthenaGatewayCondition = { operator }\r\n if (column) {\r\n condition.column = column\r\n if (operator === 'eq') {\r\n // include legacy gateway shape for compatibility\r\n condition.eq_column = column\r\n }\r\n }\r\n if (value !== undefined) {\r\n condition.value = value\r\n if (operator === 'eq') {\r\n condition.eq_value = value\r\n }\r\n }\r\n if (hints?.valueCast) {\r\n condition.value_cast = hints.valueCast\r\n if (operator === 'eq') {\r\n condition.eq_value_cast = hints.valueCast\r\n }\r\n }\r\n if (hints?.columnCast) {\r\n condition.column_cast = hints.columnCast\r\n if (operator === 'eq') {\r\n condition.eq_column_cast = hints.columnCast\r\n }\r\n }\r\n state.conditions.push(condition)\r\n }\r\n\r\n const builder = {} as TableQueryBuilder<Row>\r\n\r\n const filterMethods = createFilterMethods(state, addCondition, builder)\r\n\r\n const runSelect = async <T = Row>(\r\n columns: string | string[] = DEFAULT_COLUMNS,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const conditions = state.conditions.length\r\n ? state.conditions.map(condition => ({ ...condition }))\r\n : undefined\r\n const hasTypedEqualityComparison =\r\n conditions?.some(\r\n condition =>\r\n condition.operator === 'eq' &&\r\n (condition.value_cast !== undefined || condition.column_cast !== undefined),\r\n ) ?? false\r\n\r\n if (hasTypedEqualityComparison && !options?.head && !options?.count && conditions) {\r\n const query = buildTypedSelectQuery({\r\n tableName,\r\n columns,\r\n conditions,\r\n limit: state.limit,\r\n offset: state.offset,\r\n currentPage: state.currentPage,\r\n pageSize: state.pageSize,\r\n order: state.order,\r\n })\r\n if (query) {\r\n const queryResponse = await client.queryGateway<T>({ query }, options)\r\n return formatResult(queryResponse)\r\n }\r\n }\r\n\r\n const payload = {\r\n table_name: tableName,\r\n columns,\r\n conditions,\r\n limit: state.limit,\r\n offset: state.offset,\r\n current_page: state.currentPage,\r\n page_size: state.pageSize,\r\n total_pages: state.totalPages,\r\n sort_by: state.order,\r\n strip_nulls: options?.stripNulls ?? true,\r\n count: options?.count,\r\n head: options?.head,\r\n }\r\n const response = await client.fetchGateway<T>(payload, options)\r\n return formatResult(response)\r\n }\r\n\r\n const createSelectChain = <SelectedRow>(\r\n columns: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): SelectChain<SelectedRow> => {\r\n const chain = {} as SelectChain<SelectedRow>\r\n const filterMethods = createFilterMethods(state, addCondition, chain)\r\n Object.assign(chain, filterMethods, {\r\n async single<T = SelectedRow>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n const r = await runSelect<T[]>(cols ?? columns, opts ?? options)\r\n return toSingleResult(r)\r\n },\r\n maybeSingle<T = SelectedRow>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n return chain.single<T>(cols, opts)\r\n },\r\n then<T1 = AthenaResult<SelectedRow[]>, T2 = never>(\r\n onfulfilled?: (v: AthenaResult<SelectedRow[]>) => T1 | PromiseLike<T1>,\r\n onrejected?: (reason: unknown) => T2 | PromiseLike<T2>,\r\n ) {\r\n return runSelect<SelectedRow[]>(columns, options).then(onfulfilled, onrejected)\r\n },\r\n catch<T = never>(onrejected?: (reason: unknown) => T | PromiseLike<T>) {\r\n return runSelect<SelectedRow[]>(columns, options).catch(onrejected)\r\n },\r\n finally(onfinally?: () => void) {\r\n return runSelect<SelectedRow[]>(columns, options).finally(onfinally)\r\n },\r\n })\r\n return chain\r\n }\r\n\r\n Object.assign(builder, filterMethods, {\r\n reset() {\r\n state.conditions = []\r\n state.limit = undefined\r\n state.offset = undefined\r\n state.order = undefined\r\n state.currentPage = undefined\r\n state.pageSize = undefined\r\n state.totalPages = undefined\r\n return builder\r\n },\r\n select<T = Row>(columns: string | string[] = DEFAULT_COLUMNS, options?: AthenaGatewayCallOptions) {\r\n return createSelectChain<T>(columns, options)\r\n },\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions) {\r\n if (Array.isArray(values)) {\r\n const executeInsertMany = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown>[],\r\n }\r\n if (columns) payload.columns = columns\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeInsertMany)\r\n }\r\n const executeInsertOne = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown>,\r\n }\r\n if (columns) payload.columns = columns\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row>(executeInsertOne)\r\n },\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & { updateBody?: Partial<Row>; onConflict?: string | string[] },\r\n ) {\r\n if (Array.isArray(values)) {\r\n const executeUpsertMany = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown>[],\r\n update_body: options?.updateBody ? (options.updateBody as Record<string, unknown>) : undefined,\r\n }\r\n if (columns) payload.columns = columns\r\n if (options?.onConflict) payload.on_conflict = options.onConflict\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeUpsertMany)\r\n }\r\n const executeUpsertOne = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown>,\r\n update_body: options?.updateBody ? (options.updateBody as Record<string, unknown>) : undefined,\r\n }\r\n if (columns) payload.columns = columns\r\n if (options?.onConflict) payload.on_conflict = options.onConflict\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row>(executeUpsertOne)\r\n },\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions) {\r\n const executeUpdate = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaUpdatePayload = {\r\n table_name: tableName,\r\n set: values,\r\n conditions: filters,\r\n strip_nulls: mergedOptions?.stripNulls ?? true,\r\n }\r\n if (state.order) payload.sort_by = state.order\r\n if (state.currentPage !== undefined) payload.current_page = state.currentPage\r\n if (state.pageSize !== undefined) payload.page_size = state.pageSize\r\n if (state.totalPages !== undefined) payload.total_pages = state.totalPages\r\n if (columns) payload.columns = columns\r\n const response = await client.updateGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n const mutation = createMutationQuery<Row[]>(executeUpdate, null)\r\n const updateChain = {} as UpdateChain<Row>\r\n const filterMethods = createFilterMethods(state, addCondition, updateChain)\r\n Object.assign(updateChain, filterMethods, mutation)\r\n return updateChain\r\n },\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const resourceId = options?.resourceId ?? getResourceId(state)\r\n if (!resourceId && !filters?.length) {\r\n throw new Error('delete requires a resource_id either via eq(\"resource_id\", ...) or options.resourceId')\r\n }\r\n const executeDelete = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaDeletePayload = {\r\n table_name: tableName,\r\n resource_id: resourceId,\r\n conditions: filters,\r\n }\r\n if (state.order) payload.sort_by = state.order\r\n if (state.currentPage !== undefined) payload.current_page = state.currentPage\r\n if (state.pageSize !== undefined) payload.page_size = state.pageSize\r\n if (state.totalPages !== undefined) payload.total_pages = state.totalPages\r\n if (columns) payload.columns = columns\r\n const response = await client.deleteGateway<Row | null>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | null>(executeDelete, null)\r\n },\r\n async single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n const response = await builder.select<T[]>(columns, options)\r\n return toSingleResult(response)\r\n },\r\n async maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n return builder.single<T>(columns, options)\r\n },\r\n })\r\n\r\n return builder\r\n}\r\n\r\nfunction createQueryBuilder(client: ReturnType<typeof createAthenaGatewayClient>) {\r\n return async function query<Row = unknown>(\r\n query: string,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaResult<Row[]>> {\r\n const normalizedQuery = query.trim()\r\n if (!normalizedQuery) {\r\n throw new Error('query requires a non-empty string')\r\n }\r\n const response = await client.queryGateway<Row[]>({ query: normalizedQuery }, options)\r\n return formatResult(response)\r\n }\r\n}\r\n\r\nexport interface AthenaSdkClient {\r\n from<Row = unknown>(table: string): TableQueryBuilder<Row>\r\n rpc<Row = unknown, Args extends Record<string, unknown> = Record<string, unknown>>(\r\n fn: string,\r\n args?: Args,\r\n options?: AthenaRpcCallOptions,\r\n ): RpcQueryBuilder<Row>\r\n query<Row = unknown>(query: string, options?: AthenaGatewayCallOptions): Promise<AthenaResult<Row[]>>\r\n}\r\n\r\n/** Client config for builder */\r\nexport interface AthenaClientConfig {\r\n baseUrl: string\r\n apiKey: string\r\n client?: string\r\n backend?: BackendConfig\r\n headers?: Record<string, string>\r\n healthTracking?: boolean\r\n}\r\n\r\nfunction createClientFromConfig(config: AthenaClientConfig): AthenaSdkClient {\r\n const gateway = createAthenaGatewayClient({\r\n baseUrl: config.baseUrl,\r\n apiKey: config.apiKey,\r\n client: config.client,\r\n backend: config.backend,\r\n headers: config.headers,\r\n })\r\n return {\r\n from<Row = unknown>(table: string) {\r\n return createTableBuilder<Row>(table, gateway)\r\n },\r\n rpc<Row = unknown, Args extends Record<string, unknown> = Record<string, unknown>>(\r\n fn: string,\r\n args?: Args,\r\n options?: AthenaRpcCallOptions,\r\n ) {\r\n const normalizedFn = fn.trim()\r\n if (!normalizedFn) {\r\n throw new Error('rpc requires a function name')\r\n }\r\n return createRpcBuilder<Row>(\r\n normalizedFn,\r\n args as Record<string, unknown> | undefined,\r\n options,\r\n gateway,\r\n )\r\n },\r\n query: createQueryBuilder(gateway) as AthenaSdkClient['query'],\r\n }\r\n}\r\n\r\nexport interface AthenaClientBuilder {\r\n /** Set the gateway base URL. */\r\n url(url: string): AthenaClientBuilder\r\n /** Set the API key used for all requests. */\r\n key(apiKey: string): AthenaClientBuilder\r\n /** Set the default backend routing strategy. */\r\n backend(backend: BackendConfig | BackendType): AthenaClientBuilder\r\n /** Set the default Athena client routing key. */\r\n client(clientName: string): AthenaClientBuilder\r\n /** Attach static headers to every request. */\r\n headers(headers: Record<string, string>): AthenaClientBuilder\r\n /** Enable or disable health tracking metadata. */\r\n healthTracking(enabled: boolean): AthenaClientBuilder\r\n /** Build the immutable Athena SDK client. */\r\n build(): AthenaSdkClient\r\n}\r\n\r\nconst DEFAULT_BACKEND: BackendConfig = { type: 'athena' }\r\n\r\nfunction toBackendConfig(b: BackendConfig | BackendType | undefined): BackendConfig {\r\n if (!b) return DEFAULT_BACKEND\r\n return typeof b === 'string' ? { type: b } : b\r\n}\r\n\r\nclass AthenaClientBuilderImpl implements AthenaClientBuilder {\r\n private baseUrl?: string\r\n private apiKey?: string\r\n private backendConfig: BackendConfig = DEFAULT_BACKEND\r\n private clientName?: string\r\n private defaultHeaders?: Record<string, string>\r\n private isHealthTrackingEnabled = false\r\n\r\n url(url: string): AthenaClientBuilder {\r\n this.baseUrl = url\r\n return this\r\n }\r\n\r\n key(apiKey: string): AthenaClientBuilder {\r\n this.apiKey = apiKey\r\n return this\r\n }\r\n\r\n backend(backend: BackendConfig | BackendType): AthenaClientBuilder {\r\n this.backendConfig = toBackendConfig(backend)\r\n return this\r\n }\r\n\r\n client(clientName: string): AthenaClientBuilder {\r\n this.clientName = clientName\r\n return this\r\n }\r\n\r\n headers(headers: Record<string, string>): AthenaClientBuilder {\r\n this.defaultHeaders = headers\r\n return this\r\n }\r\n\r\n healthTracking(enabled: boolean): AthenaClientBuilder {\r\n this.isHealthTrackingEnabled = enabled\r\n return this\r\n }\r\n\r\n build(): AthenaSdkClient {\r\n if (!this.baseUrl || !this.apiKey) {\r\n throw new Error('AthenaClient requires url and key; call .url() and .key() before .build()')\r\n }\r\n\r\n return createClientFromConfig({\r\n baseUrl: this.baseUrl,\r\n apiKey: this.apiKey,\r\n client: this.clientName,\r\n backend: this.backendConfig,\r\n headers: this.defaultHeaders,\r\n healthTracking: this.isHealthTrackingEnabled,\r\n })\r\n }\r\n}\r\n\r\n/** Canonical Athena client factory with builder-based configuration. */\r\nexport class AthenaClient {\r\n /** Create a fluent builder for a strongly-typed Athena SDK client. */\r\n static builder(): AthenaClientBuilder {\r\n return new AthenaClientBuilderImpl()\r\n }\r\n\r\n /** Build a client from process environment variables. */\r\n static fromEnvironment(): AthenaSdkClient {\r\n const url =\r\n process.env.ATHENA_URL ??\r\n process.env.ATHENA_GATEWAY_URL\r\n const key =\r\n process.env.ATHENA_API_KEY ??\r\n process.env.ATHENA_GATEWAY_API_KEY\r\n\r\n if (!url || !key) {\r\n throw new Error(\r\n 'ATHENA_URL and ATHENA_API_KEY (or ATHENA_GATEWAY_URL and ATHENA_GATEWAY_API_KEY) are required',\r\n )\r\n }\r\n\r\n return AthenaClient.builder()\r\n .url(url)\r\n .key(key)\r\n .build()\r\n }\r\n}\r\n\r\n/** Create client (convenience wrapper; use AthenaClient.builder() for full control) */\r\nexport function createClient(\r\n url: string,\r\n apiKey: string,\r\n options?: Pick<AthenaGatewayCallOptions, 'client' | 'headers' | 'backend'>,\r\n): AthenaSdkClient {\r\n const b = AthenaClient.builder().url(url).key(apiKey).backend(toBackendConfig(options?.backend))\r\n if (options?.client) b.client(options.client)\r\n if (options?.headers && Object.keys(options.headers).length > 0) b.headers(options.headers)\r\n return b.build()\r\n}\r\n","import type {\r\n IntrospectionColumn,\r\n IntrospectionRelation,\r\n IntrospectionSchema,\r\n IntrospectionTable,\r\n ModelRelationKind,\r\n} from './types.ts'\r\n\r\nexport type ColumnQueryRow = {\r\n schema_name: string\r\n table_name: string\r\n column_name: string\r\n data_type: string\r\n udt_name: string\r\n type_kind_code: string\r\n type_oid: number\r\n is_nullable: boolean\r\n has_default: boolean\r\n is_generated: boolean\r\n array_dimensions: number\r\n}\r\n\r\nexport type PrimaryKeyQueryRow = {\r\n schema_name: string\r\n table_name: string\r\n columns: string[]\r\n}\r\n\r\nexport type ForeignKeyQueryRow = {\r\n source_schema: string\r\n source_table: string\r\n constraint_name: string\r\n source_columns: string[]\r\n target_schema: string\r\n target_table: string\r\n target_columns: string[]\r\n source_is_unique: boolean\r\n}\r\n\r\nexport type EnumQueryRow = {\r\n type_oid: number\r\n enum_label: string\r\n}\r\n\r\ntype BridgeCandidate = {\r\n schema: string\r\n table: string\r\n foreignKeys: ForeignKeyQueryRow[]\r\n}\r\n\r\nexport const POSTGRES_CATALOG_SQL = {\r\n columns: `\r\n SELECT\r\n n.nspname AS schema_name,\r\n c.relname AS table_name,\r\n a.attname AS column_name,\r\n format_type(a.atttypid, a.atttypmod) AS data_type,\r\n t.typname AS udt_name,\r\n t.typtype AS type_kind_code,\r\n t.oid AS type_oid,\r\n NOT a.attnotnull AS is_nullable,\r\n (ad.adbin IS NOT NULL) AS has_default,\r\n (a.attgenerated <> '') AS is_generated,\r\n a.attndims AS array_dimensions\r\n FROM pg_attribute a\r\n JOIN pg_class c ON c.oid = a.attrelid\r\n JOIN pg_namespace n ON n.oid = c.relnamespace\r\n JOIN pg_type t ON t.oid = a.atttypid\r\n LEFT JOIN pg_attrdef ad ON ad.adrelid = a.attrelid AND ad.adnum = a.attnum\r\n WHERE c.relkind IN ('r', 'p')\r\n AND a.attnum > 0\r\n AND NOT a.attisdropped\r\n AND n.nspname = ANY($1::text[])\r\n ORDER BY n.nspname, c.relname, a.attnum;\r\n `,\r\n enums: `\r\n SELECT\r\n t.oid AS type_oid,\r\n e.enumlabel AS enum_label\r\n FROM pg_type t\r\n JOIN pg_enum e ON e.enumtypid = t.oid\r\n ORDER BY t.oid, e.enumsortorder;\r\n `,\r\n primaryKeys: `\r\n SELECT\r\n n.nspname AS schema_name,\r\n c.relname AS table_name,\r\n ARRAY_AGG(a.attname ORDER BY ck.ordinality) AS columns\r\n FROM pg_constraint con\r\n JOIN pg_class c ON c.oid = con.conrelid\r\n JOIN pg_namespace n ON n.oid = c.relnamespace\r\n JOIN unnest(con.conkey) WITH ORDINALITY AS ck(attnum, ordinality) ON TRUE\r\n JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = ck.attnum\r\n WHERE con.contype = 'p'\r\n AND n.nspname = ANY($1::text[])\r\n GROUP BY n.nspname, c.relname\r\n ORDER BY n.nspname, c.relname;\r\n `,\r\n foreignKeys: `\r\n SELECT\r\n sn.nspname AS source_schema,\r\n sc.relname AS source_table,\r\n con.conname AS constraint_name,\r\n ARRAY_AGG(sa.attname ORDER BY cols.ordinality) AS source_columns,\r\n tn.nspname AS target_schema,\r\n tc.relname AS target_table,\r\n ARRAY_AGG(ta.attname ORDER BY cols.ordinality) AS target_columns,\r\n EXISTS (\r\n SELECT 1\r\n FROM pg_constraint uq\r\n WHERE uq.conrelid = con.conrelid\r\n AND uq.contype IN ('p', 'u')\r\n AND uq.conkey = con.conkey\r\n ) AS source_is_unique\r\n FROM pg_constraint con\r\n JOIN pg_class sc ON sc.oid = con.conrelid\r\n JOIN pg_namespace sn ON sn.oid = sc.relnamespace\r\n JOIN pg_class tc ON tc.oid = con.confrelid\r\n JOIN pg_namespace tn ON tn.oid = tc.relnamespace\r\n JOIN unnest(con.conkey, con.confkey) WITH ORDINALITY AS cols(source_attnum, target_attnum, ordinality) ON TRUE\r\n JOIN pg_attribute sa ON sa.attrelid = con.conrelid AND sa.attnum = cols.source_attnum\r\n JOIN pg_attribute ta ON ta.attrelid = con.confrelid AND ta.attnum = cols.target_attnum\r\n WHERE con.contype = 'f'\r\n AND sn.nspname = ANY($1::text[])\r\n AND tn.nspname = ANY($1::text[])\r\n GROUP BY\r\n sn.nspname,\r\n sc.relname,\r\n con.conname,\r\n tn.nspname,\r\n tc.relname,\r\n con.conkey,\r\n con.conrelid\r\n ORDER BY sn.nspname, sc.relname, con.conname;\r\n `,\r\n} as const\r\n\r\nfunction tableKey(schema: string, table: string): string {\r\n return `${schema}.${table}`\r\n}\r\n\r\nfunction relationKey(...parts: string[]): string {\r\n const base = parts\r\n .join('_')\r\n .replace(/[^A-Za-z0-9_]+/g, '_')\r\n .replace(/^_+|_+$/g, '')\r\n return base.length > 0 ? base : 'relation'\r\n}\r\n\r\nfunction toTypeKind(code: string): IntrospectionColumn['typeKind'] {\r\n switch (code) {\r\n case 'e':\r\n return 'enum'\r\n case 'd':\r\n return 'domain'\r\n case 'r':\r\n return 'range'\r\n case 'm':\r\n return 'multirange'\r\n case 'c':\r\n return 'composite'\r\n default:\r\n return 'scalar'\r\n }\r\n}\r\n\r\nfunction escapeSqlLiteral(value: string): string {\r\n return value.replace(/'/g, \"''\")\r\n}\r\n\r\nexport function buildSchemaArrayLiteral(schemas: string[]): string {\r\n const normalized = schemas.length > 0 ? schemas : ['public']\r\n const literals = normalized.map(schema => `'${escapeSqlLiteral(schema)}'`).join(', ')\r\n return `ARRAY[${literals}]`\r\n}\r\n\r\nfunction inlineSchemaLiteral(sql: string, schemas: string[]): string {\r\n const schemaArray = `${buildSchemaArrayLiteral(schemas)}::text[]`\r\n return sql.replace(/\\$1::text\\[\\]/g, schemaArray)\r\n}\r\n\r\nexport function buildGatewayCatalogQueries(schemas: string[]): {\r\n columns: string\r\n enums: string\r\n primaryKeys: string\r\n foreignKeys: string\r\n} {\r\n return {\r\n columns: inlineSchemaLiteral(POSTGRES_CATALOG_SQL.columns, schemas),\r\n enums: POSTGRES_CATALOG_SQL.enums,\r\n primaryKeys: inlineSchemaLiteral(POSTGRES_CATALOG_SQL.primaryKeys, schemas),\r\n foreignKeys: inlineSchemaLiteral(POSTGRES_CATALOG_SQL.foreignKeys, schemas),\r\n }\r\n}\r\n\r\nexport class PostgresCatalogSnapshotAssembler {\r\n private readonly schemas: Record<string, IntrospectionSchema> = {}\r\n\r\n addColumnRows(columnRows: ColumnQueryRow[], enumMap: Map<number, string[]>) {\r\n for (const row of columnRows) {\r\n const table = this.ensureTable(row.schema_name, row.table_name)\r\n table.columns[row.column_name] = {\r\n name: row.column_name,\r\n dataType: row.data_type,\r\n udtName: row.udt_name,\r\n typeKind: toTypeKind(row.type_kind_code),\r\n isNullable: row.is_nullable,\r\n isPrimaryKey: false,\r\n hasDefault: row.has_default,\r\n isGenerated: row.is_generated,\r\n arrayDimensions: row.array_dimensions ?? 0,\r\n enumValues: enumMap.get(row.type_oid),\r\n }\r\n }\r\n }\r\n\r\n addPrimaryKeyRows(primaryKeyRows: PrimaryKeyQueryRow[]) {\r\n for (const row of primaryKeyRows) {\r\n const table = this.ensureTable(row.schema_name, row.table_name)\r\n table.primaryKey = row.columns\r\n for (const columnName of row.columns) {\r\n const column = table.columns[columnName]\r\n if (column) {\r\n column.isPrimaryKey = true\r\n }\r\n }\r\n }\r\n }\r\n\r\n addForeignKeyRows(foreignKeyRows: ForeignKeyQueryRow[]) {\r\n for (const row of foreignKeyRows) {\r\n const sourceTable = this.ensureTable(row.source_schema, row.source_table)\r\n const targetTable = this.ensureTable(row.target_schema, row.target_table)\r\n\r\n const sourceRelationKind: ModelRelationKind = row.source_is_unique ? 'one-to-one' : 'many-to-one'\r\n this.upsertRelation(sourceTable, relationKey(row.constraint_name, row.target_table), {\r\n name: row.constraint_name,\r\n kind: sourceRelationKind,\r\n sourceColumns: row.source_columns,\r\n targetSchema: row.target_schema,\r\n targetModel: row.target_table,\r\n targetColumns: row.target_columns,\r\n })\r\n\r\n const targetRelationKind: ModelRelationKind = row.source_is_unique ? 'one-to-one' : 'one-to-many'\r\n this.upsertRelation(targetTable, relationKey(row.source_table), {\r\n name: relationKey(row.source_table, row.constraint_name),\r\n kind: targetRelationKind,\r\n sourceColumns: row.target_columns,\r\n targetSchema: row.source_schema,\r\n targetModel: row.source_table,\r\n targetColumns: row.source_columns,\r\n })\r\n }\r\n }\r\n\r\n addManyToManyRows(foreignKeyRows: ForeignKeyQueryRow[]) {\r\n const bySourceTable = new Map<string, BridgeCandidate>()\r\n for (const fk of foreignKeyRows) {\r\n const key = tableKey(fk.source_schema, fk.source_table)\r\n const current = bySourceTable.get(key) ?? {\r\n schema: fk.source_schema,\r\n table: fk.source_table,\r\n foreignKeys: [],\r\n }\r\n current.foreignKeys.push(fk)\r\n bySourceTable.set(key, current)\r\n }\r\n\r\n for (const candidate of bySourceTable.values()) {\r\n const bridgeTable = this.schemas[candidate.schema]?.tables[candidate.table]\r\n if (!bridgeTable) continue\r\n\r\n const primaryKey = bridgeTable.primaryKey\r\n if (candidate.foreignKeys.length !== 2 || primaryKey.length === 0) continue\r\n\r\n const combinedForeignColumns = Array.from(\r\n new Set(candidate.foreignKeys.flatMap(fk => fk.source_columns)),\r\n )\r\n if (\r\n combinedForeignColumns.length !== primaryKey.length ||\r\n !primaryKey.every(column => combinedForeignColumns.includes(column))\r\n ) {\r\n continue\r\n }\r\n\r\n const [first, second] = candidate.foreignKeys\r\n const firstTarget = this.schemas[first.target_schema]?.tables[first.target_table]\r\n const secondTarget = this.schemas[second.target_schema]?.tables[second.target_table]\r\n if (!firstTarget || !secondTarget) {\r\n continue\r\n }\r\n\r\n this.upsertRelation(firstTarget, relationKey(second.target_table), {\r\n name: relationKey(candidate.table, first.constraint_name, second.constraint_name),\r\n kind: 'many-to-many',\r\n sourceColumns: first.target_columns,\r\n targetSchema: second.target_schema,\r\n targetModel: second.target_table,\r\n targetColumns: second.target_columns,\r\n through: {\r\n schema: candidate.schema,\r\n model: candidate.table,\r\n sourceColumns: first.source_columns,\r\n targetColumns: second.source_columns,\r\n },\r\n })\r\n\r\n this.upsertRelation(secondTarget, relationKey(first.target_table), {\r\n name: relationKey(candidate.table, second.constraint_name, first.constraint_name),\r\n kind: 'many-to-many',\r\n sourceColumns: second.target_columns,\r\n targetSchema: first.target_schema,\r\n targetModel: first.target_table,\r\n targetColumns: first.target_columns,\r\n through: {\r\n schema: candidate.schema,\r\n model: candidate.table,\r\n sourceColumns: second.source_columns,\r\n targetColumns: first.source_columns,\r\n },\r\n })\r\n }\r\n }\r\n\r\n toSchemas(): Record<string, IntrospectionSchema> {\r\n return this.schemas\r\n }\r\n\r\n private ensureTable(schemaName: string, tableName: string): IntrospectionTable {\r\n if (!this.schemas[schemaName]) {\r\n this.schemas[schemaName] = {\r\n name: schemaName,\r\n tables: {},\r\n }\r\n }\r\n\r\n const schema = this.schemas[schemaName]\r\n if (!schema.tables[tableName]) {\r\n schema.tables[tableName] = {\r\n schema: schemaName,\r\n name: tableName,\r\n columns: {},\r\n primaryKey: [],\r\n relations: {},\r\n }\r\n }\r\n\r\n return schema.tables[tableName]\r\n }\r\n\r\n private upsertRelation(\r\n table: IntrospectionTable,\r\n baseKey: string,\r\n relation: IntrospectionRelation,\r\n ) {\r\n let key = baseKey\r\n let suffix = 2\r\n while (table.relations[key]) {\r\n key = `${baseKey}_${suffix}`\r\n suffix += 1\r\n }\r\n table.relations[key] = relation\r\n }\r\n}\r\n","import { Pool } from 'pg'\r\nimport type {\r\n IntrospectionInspectOptions,\r\n IntrospectionSnapshot,\r\n SchemaIntrospectionProvider,\r\n} from './types.ts'\r\nimport {\r\n type ColumnQueryRow,\r\n type EnumQueryRow,\r\n type ForeignKeyQueryRow,\r\n type PrimaryKeyQueryRow,\r\n POSTGRES_CATALOG_SQL,\r\n PostgresCatalogSnapshotAssembler,\r\n} from './postgres-introspection-core.ts'\r\n\r\n/**\r\n * Constructor options for the PostgreSQL introspection provider.\r\n */\r\nexport interface PostgresIntrospectionProviderOptions {\r\n connectionString: string\r\n database?: string\r\n}\r\n\r\nclass PgCatalogClient {\r\n constructor(private readonly pool: Pool) {}\r\n\r\n async queryColumns(schemas: string[]): Promise<ColumnQueryRow[]> {\r\n const result = await this.pool.query<ColumnQueryRow>(POSTGRES_CATALOG_SQL.columns, [schemas])\r\n return result.rows\r\n }\r\n\r\n async queryEnums(): Promise<Map<number, string[]>> {\r\n const result = await this.pool.query<EnumQueryRow>(POSTGRES_CATALOG_SQL.enums)\r\n const enumMap = new Map<number, string[]>()\r\n for (const row of result.rows) {\r\n const existing = enumMap.get(row.type_oid) ?? []\r\n existing.push(row.enum_label)\r\n enumMap.set(row.type_oid, existing)\r\n }\r\n return enumMap\r\n }\r\n\r\n async queryPrimaryKeys(schemas: string[]): Promise<PrimaryKeyQueryRow[]> {\r\n const result = await this.pool.query<PrimaryKeyQueryRow>(POSTGRES_CATALOG_SQL.primaryKeys, [schemas])\r\n return result.rows\r\n }\r\n\r\n async queryForeignKeys(schemas: string[]): Promise<ForeignKeyQueryRow[]> {\r\n const result = await this.pool.query<ForeignKeyQueryRow>(POSTGRES_CATALOG_SQL.foreignKeys, [schemas])\r\n return result.rows\r\n }\r\n}\r\n\r\nclass PostgresIntrospectionProvider implements SchemaIntrospectionProvider {\r\n readonly backend = 'postgresql' as const\r\n\r\n private readonly connectionString: string\r\n private readonly database: string\r\n\r\n constructor(options: PostgresIntrospectionProviderOptions) {\r\n this.connectionString = options.connectionString\r\n this.database = options.database ?? 'postgres'\r\n }\r\n\r\n async inspect(options?: IntrospectionInspectOptions): Promise<IntrospectionSnapshot> {\r\n const schemas = options?.schemas && options.schemas.length > 0 ? options.schemas : ['public']\r\n const pool = new Pool({\r\n connectionString: this.connectionString,\r\n })\r\n const catalogClient = new PgCatalogClient(pool)\r\n\r\n try {\r\n const [columnRows, enumMap, primaryKeyRows, foreignKeyRows] = await Promise.all([\r\n catalogClient.queryColumns(schemas),\r\n catalogClient.queryEnums(),\r\n catalogClient.queryPrimaryKeys(schemas),\r\n catalogClient.queryForeignKeys(schemas),\r\n ])\r\n\r\n const assembler = new PostgresCatalogSnapshotAssembler()\r\n assembler.addColumnRows(columnRows, enumMap)\r\n assembler.addPrimaryKeyRows(primaryKeyRows)\r\n assembler.addForeignKeyRows(foreignKeyRows)\r\n assembler.addManyToManyRows(foreignKeyRows)\r\n\r\n return {\r\n backend: 'postgresql',\r\n database: this.database,\r\n generatedAt: new Date().toISOString(),\r\n schemas: assembler.toSchemas(),\r\n }\r\n } finally {\r\n await pool.end()\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates a PostgreSQL-backed schema introspection provider.\r\n */\r\nexport function createPostgresIntrospectionProvider(\r\n options: PostgresIntrospectionProviderOptions,\r\n): SchemaIntrospectionProvider {\r\n return new PostgresIntrospectionProvider(options)\r\n}\r\n","import { createClient, type AthenaSdkClient } from '../client.ts'\r\nimport {\r\n buildGatewayCatalogQueries,\r\n PostgresCatalogSnapshotAssembler,\r\n type ColumnQueryRow,\r\n type EnumQueryRow,\r\n type ForeignKeyQueryRow,\r\n type PrimaryKeyQueryRow,\r\n} from '../schema/postgres-introspection-core.ts'\r\nimport { createPostgresIntrospectionProvider } from '../schema/postgres-provider.ts'\r\nimport type {\r\n IntrospectionInspectOptions,\r\n IntrospectionSnapshot,\r\n SchemaIntrospectionProvider,\r\n} from '../schema/types.ts'\r\nimport type {\r\n GeneratorExperimentalFlags,\r\n GeneratorProviderConfig,\r\n PostgresDirectProviderConfig,\r\n PostgresGatewayProviderConfig,\r\n ScyllaDirectProviderConfig,\r\n} from './types.ts'\r\n\r\nclass AthenaGatewayCatalogClient {\r\n constructor(private readonly client: AthenaSdkClient) {}\r\n\r\n async queryRows<T extends Record<string, unknown>>(query: string): Promise<T[]> {\r\n const result = await this.client.query<T>(query)\r\n if (result.error || result.status < 200 || result.status >= 300) {\r\n throw new Error(result.error ?? `Gateway query failed with status ${result.status}`)\r\n }\r\n return result.data ?? []\r\n }\r\n\r\n async queryColumns(query: string): Promise<ColumnQueryRow[]> {\r\n return this.queryRows<ColumnQueryRow>(query)\r\n }\r\n\r\n async queryEnums(query: string): Promise<Map<number, string[]>> {\r\n const rows = await this.queryRows<EnumQueryRow>(query)\r\n const enumMap = new Map<number, string[]>()\r\n for (const row of rows) {\r\n const existing = enumMap.get(row.type_oid) ?? []\r\n existing.push(row.enum_label)\r\n enumMap.set(row.type_oid, existing)\r\n }\r\n return enumMap\r\n }\r\n\r\n async queryPrimaryKeys(query: string): Promise<PrimaryKeyQueryRow[]> {\r\n return this.queryRows<PrimaryKeyQueryRow>(query)\r\n }\r\n\r\n async queryForeignKeys(query: string): Promise<ForeignKeyQueryRow[]> {\r\n return this.queryRows<ForeignKeyQueryRow>(query)\r\n }\r\n}\r\n\r\nclass AthenaGatewayPostgresIntrospectionProvider implements SchemaIntrospectionProvider {\r\n readonly backend = 'postgresql' as const\r\n\r\n private readonly client: AthenaSdkClient\r\n\r\n constructor(private readonly config: PostgresGatewayProviderConfig) {\r\n this.client = createClient(this.config.gatewayUrl, this.config.apiKey, {\r\n backend: {\r\n type: this.config.backend ?? 'postgresql',\r\n },\r\n })\r\n }\r\n\r\n async inspect(options?: IntrospectionInspectOptions): Promise<IntrospectionSnapshot> {\r\n const schemas =\r\n options?.schemas && options.schemas.length > 0\r\n ? options.schemas\r\n : this.config.schemas && this.config.schemas.length > 0\r\n ? this.config.schemas\r\n : ['public']\r\n\r\n const catalogClient = new AthenaGatewayCatalogClient(this.client)\r\n const queries = buildGatewayCatalogQueries(schemas)\r\n\r\n const [columnRows, enumMap, primaryKeyRows, foreignKeyRows] = await Promise.all([\r\n catalogClient.queryColumns(queries.columns),\r\n catalogClient.queryEnums(queries.enums),\r\n catalogClient.queryPrimaryKeys(queries.primaryKeys),\r\n catalogClient.queryForeignKeys(queries.foreignKeys),\r\n ])\r\n\r\n const assembler = new PostgresCatalogSnapshotAssembler()\r\n assembler.addColumnRows(columnRows, enumMap)\r\n assembler.addPrimaryKeyRows(primaryKeyRows)\r\n assembler.addForeignKeyRows(foreignKeyRows)\r\n assembler.addManyToManyRows(foreignKeyRows)\r\n\r\n return {\r\n backend: 'postgresql',\r\n database: this.config.database,\r\n generatedAt: new Date().toISOString(),\r\n schemas: assembler.toSchemas(),\r\n }\r\n }\r\n}\r\n\r\nclass ScyllaIntrospectionProvider implements SchemaIntrospectionProvider {\r\n readonly backend = 'scylladb' as const\r\n\r\n constructor(private readonly config: ScyllaDirectProviderConfig) {}\r\n\r\n async inspect(): Promise<IntrospectionSnapshot> {\r\n throw new Error(\r\n `Scylla introspection provider is not implemented yet for keyspace ${this.config.keyspace}.`,\r\n )\r\n }\r\n}\r\n\r\nfunction createPostgresProvider(config: PostgresDirectProviderConfig): SchemaIntrospectionProvider {\r\n return createPostgresIntrospectionProvider({\r\n connectionString: config.connectionString,\r\n database: config.database,\r\n })\r\n}\r\n\r\n/**\r\n * Resolves a runtime introspection provider from generator config.\r\n */\r\nexport function resolveGeneratorProvider(\r\n providerConfig: GeneratorProviderConfig,\r\n experimentalFlags: GeneratorExperimentalFlags,\r\n): SchemaIntrospectionProvider {\r\n if (providerConfig.kind === 'postgres' && providerConfig.mode === 'direct') {\r\n return createPostgresProvider(providerConfig)\r\n }\r\n\r\n if (providerConfig.kind === 'postgres' && providerConfig.mode === 'gateway') {\r\n return new AthenaGatewayPostgresIntrospectionProvider(providerConfig)\r\n }\r\n\r\n if (providerConfig.kind === 'scylla') {\r\n if (!experimentalFlags.scyllaProviderContracts) {\r\n throw new Error(\r\n 'Scylla provider contracts are disabled. Set experimental.scyllaProviderContracts=true to enable placeholders.',\r\n )\r\n }\r\n return new ScyllaIntrospectionProvider(providerConfig)\r\n }\r\n\r\n throw new Error(`Unsupported generator provider kind: ${(providerConfig as { kind?: string }).kind ?? 'unknown'}`)\r\n}\r\n","import { mkdir, writeFile } from 'fs/promises'\r\nimport { dirname, resolve } from 'path'\r\nimport { generateArtifactsFromSnapshot } from './renderer.ts'\r\nimport { loadGeneratorConfig } from './config.ts'\r\nimport { resolveGeneratorProvider } from './providers.ts'\r\nimport type {\r\n GeneratedArtifact,\r\n GeneratorProviderConfig,\r\n LoadGeneratorConfigOptions,\r\n RunGeneratorOptions,\r\n RunGeneratorResult,\r\n} from './types.ts'\r\n\r\nfunction extractProviderSchemas(providerConfig: GeneratorProviderConfig): string[] | undefined {\r\n if (!('schemas' in providerConfig) || !providerConfig.schemas || providerConfig.schemas.length === 0) {\r\n return undefined\r\n }\r\n return providerConfig.schemas\r\n}\r\n\r\nasync function writeArtifacts(\r\n files: GeneratedArtifact[],\r\n cwd: string,\r\n): Promise<string[]> {\r\n const writtenFiles: string[] = []\r\n\r\n for (const file of files) {\r\n const absolutePath = resolve(cwd, file.path)\r\n await mkdir(dirname(absolutePath), { recursive: true })\r\n await writeFile(absolutePath, file.content, 'utf8')\r\n writtenFiles.push(file.path)\r\n }\r\n\r\n return writtenFiles\r\n}\r\n\r\n/**\r\n * End-to-end generator execution: load config, introspect, render, and optionally write files.\r\n */\r\nexport async function runSchemaGenerator(options: RunGeneratorOptions = {}): Promise<RunGeneratorResult> {\r\n const cwd = options.cwd ?? process.cwd()\r\n const configOptions: LoadGeneratorConfigOptions = {\r\n cwd,\r\n configPath: options.configPath,\r\n }\r\n\r\n const { configPath, config } = await loadGeneratorConfig(configOptions)\r\n const provider = options.provider ?? resolveGeneratorProvider(config.provider, config.experimental)\r\n\r\n const snapshot = await provider.inspect({\r\n schemas: extractProviderSchemas(config.provider),\r\n })\r\n\r\n const generated = generateArtifactsFromSnapshot(snapshot, config)\r\n const writtenFiles = options.dryRun ? [] : await writeArtifacts(generated.files, cwd)\r\n\r\n return {\r\n ...generated,\r\n configPath,\r\n writtenFiles,\r\n }\r\n}\r\n","import { runSchemaGenerator } from '../generator/pipeline.ts'\r\n\r\ninterface GenerateCommand {\r\n command: 'generate'\r\n configPath?: string\r\n dryRun: boolean\r\n}\r\n\r\ninterface HelpCommand {\r\n command: 'help'\r\n}\r\n\r\ntype CliCommand = GenerateCommand | HelpCommand\r\n\r\nfunction usage(): string {\r\n return [\r\n 'athena-js CLI',\r\n '',\r\n 'Usage:',\r\n ' athena-js generate [--config <path>] [--dry-run]',\r\n '',\r\n 'Examples:',\r\n ' athena-js generate',\r\n ' athena-js generate --config ./athena.config.ts --dry-run',\r\n ].join('\\n')\r\n}\r\n\r\nfunction parseCommand(argv: string[]): CliCommand {\r\n if (argv.length === 0 || argv[0] === 'help' || argv[0] === '--help' || argv[0] === '-h') {\r\n return { command: 'help' }\r\n }\r\n\r\n const [command, ...rest] = argv\r\n if (command !== 'generate') {\r\n throw new Error(`Unknown command \"${command}\".`)\r\n }\r\n\r\n let configPath: string | undefined\r\n let dryRun = false\r\n\r\n for (let index = 0; index < rest.length; index += 1) {\r\n const token = rest[index]\r\n if (token === '--dry-run') {\r\n dryRun = true\r\n continue\r\n }\r\n\r\n if (token === '--config') {\r\n const nextValue = rest[index + 1]\r\n if (!nextValue) {\r\n throw new Error('Missing value for --config option.')\r\n }\r\n configPath = nextValue\r\n index += 1\r\n continue\r\n }\r\n\r\n throw new Error(`Unknown option \"${token}\".`)\r\n }\r\n\r\n return {\r\n command: 'generate',\r\n configPath,\r\n dryRun,\r\n }\r\n}\r\n\r\n/**\r\n * CLI entrypoint used by `bin/athena-js.js`.\r\n */\r\nexport async function runCLI(argv: string[]): Promise<void> {\r\n const parsed = parseCommand(argv)\r\n if (parsed.command === 'help') {\r\n console.log(usage())\r\n return\r\n }\r\n\r\n const result = await runSchemaGenerator({\r\n configPath: parsed.configPath,\r\n dryRun: parsed.dryRun,\r\n })\r\n\r\n if (parsed.dryRun) {\r\n console.log(`[dry-run] Generated ${result.files.length} files from ${result.configPath}`)\r\n for (const file of result.files) {\r\n console.log(` - ${file.path}`)\r\n }\r\n return\r\n }\r\n\r\n console.log(`Generated ${result.writtenFiles.length} files from ${result.configPath}`)\r\n for (const filePath of result.writtenFiles) {\r\n console.log(` - ${filePath}`)\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/generator/naming.ts","../../src/generator/placeholders.ts","../../src/generator/postgres-type-mapping.ts","../../src/generator/config.ts","../../src/generator/renderer.ts","../../src/gateway/errors.ts","../../src/gateway/client.ts","../../src/sql-identifiers.ts","../../src/client.ts","../../src/schema/postgres-introspection-core.ts","../../src/schema/postgres-provider.ts","../../src/generator/providers.ts","../../src/generator/pipeline.ts","../../src/cli/index.ts"],"names":["relationKey","filterMethods","resolve"],"mappings":"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","file":"index.js","sourcesContent":["import type { NamingStyle } from './types.ts'\r\n\r\nconst IDENTIFIER_PATTERN = /^[A-Za-z_$][A-Za-z0-9_$]*$/\r\nconst RESERVED_IDENTIFIERS = new Set([\r\n 'break',\r\n 'case',\r\n 'catch',\r\n 'class',\r\n 'const',\r\n 'continue',\r\n 'debugger',\r\n 'default',\r\n 'delete',\r\n 'do',\r\n 'else',\r\n 'enum',\r\n 'export',\r\n 'extends',\r\n 'false',\r\n 'finally',\r\n 'for',\r\n 'function',\r\n 'if',\r\n 'import',\r\n 'in',\r\n 'instanceof',\r\n 'new',\r\n 'null',\r\n 'return',\r\n 'super',\r\n 'switch',\r\n 'this',\r\n 'throw',\r\n 'true',\r\n 'try',\r\n 'typeof',\r\n 'var',\r\n 'void',\r\n 'while',\r\n 'with',\r\n 'as',\r\n 'implements',\r\n 'interface',\r\n 'let',\r\n 'package',\r\n 'private',\r\n 'protected',\r\n 'public',\r\n 'static',\r\n 'yield',\r\n 'any',\r\n 'boolean',\r\n 'constructor',\r\n 'declare',\r\n 'get',\r\n 'module',\r\n 'require',\r\n 'number',\r\n 'set',\r\n 'string',\r\n 'symbol',\r\n 'type',\r\n 'from',\r\n 'of',\r\n])\r\n\r\nfunction splitWords(input: string): string[] {\r\n return input\r\n .trim()\r\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\r\n .replace(/([A-Z]+)([A-Z][a-z0-9]+)/g, '$1 $2')\r\n .replace(/[^A-Za-z0-9]+/g, ' ')\r\n .split(' ')\r\n .map(word => word.trim())\r\n .filter(word => word.length > 0)\r\n}\r\n\r\nfunction capitalize(word: string): string {\r\n return word.length > 0 ? `${word[0].toUpperCase()}${word.slice(1).toLowerCase()}` : word\r\n}\r\n\r\nfunction ensureValidIdentifier(candidate: string, fallback: string): string {\r\n const normalized = candidate.length > 0 ? candidate : fallback\r\n const prefixed = /^[0-9]/.test(normalized) ? `_${normalized}` : normalized\r\n if (RESERVED_IDENTIFIERS.has(prefixed)) {\r\n return `${prefixed}_value`\r\n }\r\n return prefixed\r\n}\r\n\r\nexport function applyNamingStyle(input: string, style: NamingStyle): string {\r\n const words = splitWords(input)\r\n if (words.length === 0) {\r\n return ''\r\n }\r\n\r\n switch (style) {\r\n case 'preserve':\r\n return input\r\n case 'camel': {\r\n const [first, ...rest] = words\r\n return `${first.toLowerCase()}${rest.map(capitalize).join('')}`\r\n }\r\n case 'pascal':\r\n return words.map(capitalize).join('')\r\n case 'snake':\r\n return words.map(word => word.toLowerCase()).join('_')\r\n case 'kebab':\r\n return words.map(word => word.toLowerCase()).join('-')\r\n default:\r\n return input\r\n }\r\n}\r\n\r\nexport function toSafeIdentifier(input: string, style: NamingStyle, fallback = 'value'): string {\r\n const transformed = applyNamingStyle(input, style)\r\n const normalized = transformed\r\n .replace(/[^A-Za-z0-9_$]+/g, '_')\r\n .replace(/^_+|_+$/g, '')\r\n const fallbackValue = splitWords(input).join('')\r\n return ensureValidIdentifier(\r\n normalized.length > 0 ? normalized : fallbackValue,\r\n fallback,\r\n )\r\n}\r\n\r\nexport function escapeTypePropertyName(propertyName: string): string {\r\n if (IDENTIFIER_PATTERN.test(propertyName) && !RESERVED_IDENTIFIERS.has(propertyName)) {\r\n return propertyName\r\n }\r\n return `'${propertyName.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\r\n}\r\n\r\nexport function escapeStringLiteral(value: string): string {\r\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\r\n}\r\n","import { applyNamingStyle } from './naming.ts'\r\nimport type { GeneratorArtifactKind, GeneratorOutputConfig } from './types.ts'\r\n\r\nexport interface PlaceholderContext {\r\n provider: string\r\n kind: GeneratorArtifactKind\r\n database: string\r\n schema: string\r\n model: string\r\n}\r\n\r\nfunction createStyleTokens(prefix: string, value: string): Record<string, string> {\r\n return {\r\n [prefix]: value,\r\n [`${prefix}_camel`]: applyNamingStyle(value, 'camel'),\r\n [`${prefix}_pascal`]: applyNamingStyle(value, 'pascal'),\r\n [`${prefix}_snake`]: applyNamingStyle(value, 'snake'),\r\n [`${prefix}_kebab`]: applyNamingStyle(value, 'kebab'),\r\n }\r\n}\r\n\r\nfunction renderTemplate(template: string, tokenMap: Record<string, string>): string {\r\n return template.replace(/\\{([A-Za-z0-9_]+)\\}/g, (_match, token) => {\r\n if (!(token in tokenMap)) {\r\n throw new Error(`Unknown placeholder token \"${token}\" in template \"${template}\"`)\r\n }\r\n return tokenMap[token]\r\n })\r\n}\r\n\r\nfunction resolvePlaceholderMap(\r\n baseTokens: Record<string, string>,\r\n outputConfig: GeneratorOutputConfig,\r\n): Record<string, string> {\r\n const resolved: Record<string, string> = {\r\n ...baseTokens,\r\n }\r\n\r\n const entries = Object.entries(outputConfig.placeholderMap ?? {})\r\n for (let index = 0; index < entries.length; index += 1) {\r\n const [key, value] = entries[index]\r\n let current = value\r\n for (let depth = 0; depth < 8; depth += 1) {\r\n const next = renderTemplate(current, resolved)\r\n if (next === current) {\r\n break\r\n }\r\n current = next\r\n }\r\n resolved[key] = current\r\n }\r\n\r\n return resolved\r\n}\r\n\r\nexport function renderOutputPath(\r\n template: string,\r\n context: PlaceholderContext,\r\n outputConfig: GeneratorOutputConfig,\r\n): string {\r\n const baseTokens: Record<string, string> = {\r\n provider: context.provider,\r\n kind: context.kind,\r\n ...createStyleTokens('database', context.database),\r\n ...createStyleTokens('schema', context.schema),\r\n ...createStyleTokens('model', context.model),\r\n }\r\n\r\n const tokens = resolvePlaceholderMap(baseTokens, outputConfig)\r\n return renderTemplate(template, tokens)\r\n}\r\n","import type { IntrospectionColumn } from '../schema/types.ts'\r\n\r\nconst NUMBER_TYPES = new Set([\r\n 'int2',\r\n 'int4',\r\n 'float4',\r\n 'float8',\r\n 'smallint',\r\n 'integer',\r\n 'real',\r\n 'double precision',\r\n])\r\n\r\nconst STRING_NUMERIC_TYPES = new Set([\r\n 'int8',\r\n 'bigint',\r\n 'serial8',\r\n 'bigserial',\r\n 'numeric',\r\n 'decimal',\r\n 'money',\r\n])\r\n\r\nconst TEXT_TYPES = new Set([\r\n 'char',\r\n 'bpchar',\r\n 'varchar',\r\n 'character varying',\r\n 'text',\r\n 'citext',\r\n 'name',\r\n 'uuid',\r\n 'date',\r\n 'time',\r\n 'timetz',\r\n 'timestamp',\r\n 'timestamptz',\r\n 'interval',\r\n 'inet',\r\n 'cidr',\r\n 'macaddr',\r\n 'macaddr8',\r\n 'point',\r\n 'line',\r\n 'lseg',\r\n 'box',\r\n 'path',\r\n 'polygon',\r\n 'circle',\r\n 'bit',\r\n 'varbit',\r\n 'xml',\r\n 'tsvector',\r\n 'tsquery',\r\n 'jsonpath',\r\n])\r\n\r\nfunction normalizeTypeLabel(column: IntrospectionColumn): string {\r\n const preferred = (column.udtName || column.dataType).toLowerCase().trim()\r\n if (column.arrayDimensions > 0 && preferred.startsWith('_')) {\r\n return preferred.slice(1)\r\n }\r\n return preferred\r\n}\r\n\r\nfunction wrapArrayType(baseType: string, depth: number): string {\r\n let wrapped = baseType\r\n for (let index = 0; index < depth; index += 1) {\r\n wrapped = `Array<${wrapped}>`\r\n }\r\n return wrapped\r\n}\r\n\r\nfunction resolveScalarType(column: IntrospectionColumn): string {\r\n const label = normalizeTypeLabel(column)\r\n\r\n if (NUMBER_TYPES.has(label)) {\r\n return 'number'\r\n }\r\n\r\n if (STRING_NUMERIC_TYPES.has(label)) {\r\n return 'string'\r\n }\r\n\r\n if (label === 'bool' || label === 'boolean') {\r\n return 'boolean'\r\n }\r\n\r\n if (label === 'bytea') {\r\n return 'Buffer'\r\n }\r\n\r\n if (label === 'json' || label === 'jsonb') {\r\n return 'Record<string, unknown>'\r\n }\r\n\r\n if (TEXT_TYPES.has(label)) {\r\n return 'string'\r\n }\r\n\r\n if (label.endsWith('range') || label.endsWith('multirange')) {\r\n return 'string'\r\n }\r\n\r\n return 'unknown'\r\n}\r\n\r\nfunction resolveKindAwareType(column: IntrospectionColumn): string {\r\n if (column.typeKind === 'enum') {\r\n const values = column.enumValues ?? []\r\n if (values.length === 0) {\r\n return 'string'\r\n }\r\n return values.map(value => `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`).join(' | ')\r\n }\r\n\r\n if (column.typeKind === 'composite') {\r\n return 'Record<string, unknown>'\r\n }\r\n\r\n if (column.typeKind === 'domain' || column.typeKind === 'range' || column.typeKind === 'multirange') {\r\n return 'string'\r\n }\r\n\r\n return resolveScalarType(column)\r\n}\r\n\r\nexport function resolvePostgresColumnType(column: IntrospectionColumn): string {\r\n const baseType = resolveKindAwareType(column)\r\n if (!column.arrayDimensions || column.arrayDimensions <= 0) {\r\n return baseType\r\n }\r\n return wrapArrayType(baseType, column.arrayDimensions)\r\n}\r\n","import { existsSync } from 'fs'\r\nimport { resolve } from 'path'\r\nimport { pathToFileURL } from 'url'\r\nimport type {\r\n AthenaGeneratorConfig,\r\n GeneratorExperimentalFlags,\r\n GeneratorFeatureFlags,\r\n GeneratorNamingConfig,\r\n GeneratorOutputConfig,\r\n GeneratorOutputTargets,\r\n LoadGeneratorConfigOptions,\r\n LoadedGeneratorConfig,\r\n NormalizedAthenaGeneratorConfig,\r\n} from './types.ts'\r\n\r\nconst DEFAULT_CONFIG_CANDIDATES = [\r\n 'athena.config.ts',\r\n 'athena.config.js',\r\n 'athena-js.config.ts',\r\n 'athena-js.config.js',\r\n '.athena.config.ts',\r\n '.athena.config.js',\r\n]\r\n\r\nconst DEFAULT_TARGETS: GeneratorOutputTargets = {\r\n model: 'athena/models/{model_kebab}.ts',\r\n schema: 'athena/schema.ts',\r\n database: 'athena/relations.ts',\r\n registry: 'athena/config.ts',\r\n}\r\n\r\nconst DEFAULT_NAMING: GeneratorNamingConfig = {\r\n modelType: 'pascal',\r\n modelConst: 'camel',\r\n schemaConst: 'camel',\r\n databaseConst: 'camel',\r\n registryConst: 'camel',\r\n}\r\n\r\nconst DEFAULT_FEATURES: GeneratorFeatureFlags = {\r\n emitRelations: true,\r\n emitRegistry: true,\r\n}\r\n\r\nconst DEFAULT_EXPERIMENTAL_FLAGS: GeneratorExperimentalFlags = {\r\n postgresGatewayIntrospection: false,\r\n scyllaProviderContracts: true,\r\n}\r\n\r\nfunction normalizeOutputConfig(output: GeneratorOutputConfig): GeneratorOutputConfig {\r\n return {\r\n targets: {\r\n ...DEFAULT_TARGETS,\r\n ...(output.targets ?? {}),\r\n },\r\n placeholderMap: {\r\n ...(output.placeholderMap ?? {}),\r\n },\r\n }\r\n}\r\n\r\nfunction isAthenaGeneratorConfig(value: unknown): value is AthenaGeneratorConfig {\r\n if (!value || typeof value !== 'object') {\r\n return false\r\n }\r\n const record = value as Record<string, unknown>\r\n return Boolean(record.provider && typeof record.provider === 'object') &&\r\n Boolean(record.output && typeof record.output === 'object')\r\n}\r\n\r\nexport function normalizeGeneratorConfig(input: AthenaGeneratorConfig): NormalizedAthenaGeneratorConfig {\r\n return {\r\n provider: input.provider,\r\n output: normalizeOutputConfig(input.output),\r\n naming: {\r\n ...DEFAULT_NAMING,\r\n ...(input.naming ?? {}),\r\n },\r\n features: {\r\n ...DEFAULT_FEATURES,\r\n ...(input.features ?? {}),\r\n },\r\n experimental: {\r\n ...DEFAULT_EXPERIMENTAL_FLAGS,\r\n ...(input.experimental ?? {}),\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Typed identity helper for authoring generator configs.\r\n */\r\nexport function defineGeneratorConfig<TConfig extends AthenaGeneratorConfig>(\r\n config: TConfig,\r\n): TConfig {\r\n return config\r\n}\r\n\r\n/**\r\n * Finds a supported generator config filename in the provided directory.\r\n */\r\nexport function findGeneratorConfigPath(cwd: string = process.cwd()): string | undefined {\r\n for (const candidate of DEFAULT_CONFIG_CANDIDATES) {\r\n const absolutePath = resolve(cwd, candidate)\r\n if (existsSync(absolutePath)) {\r\n return absolutePath\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nfunction extractConfigExport(module: unknown): AthenaGeneratorConfig {\r\n const visited = new Set<unknown>()\r\n const queue: unknown[] = [module]\r\n\r\n while (queue.length > 0) {\r\n const current = queue.shift()\r\n if (!current || typeof current !== 'object' || visited.has(current)) {\r\n continue\r\n }\r\n visited.add(current)\r\n\r\n const record = current as Record<string, unknown>\r\n if (isAthenaGeneratorConfig(record)) {\r\n return record\r\n }\r\n\r\n const defaultExport = record.default\r\n if (defaultExport && typeof defaultExport === 'object') {\r\n queue.push(defaultExport)\r\n }\r\n\r\n const namedConfigExport = record.config\r\n if (namedConfigExport && typeof namedConfigExport === 'object') {\r\n queue.push(namedConfigExport)\r\n }\r\n\r\n const moduleExports = record['module.exports']\r\n if (moduleExports && typeof moduleExports === 'object') {\r\n queue.push(moduleExports)\r\n }\r\n }\r\n\r\n throw new Error(\r\n 'Generator config file must export a config object as default export or `config`.',\r\n )\r\n}\r\n\r\nfunction importConfigModule(moduleSpecifier: string): Promise<unknown> {\r\n // Keep this as an indirect import so bundlers do not try to statically resolve\r\n // runtime file-system config paths when athena-js is consumed in Next.js.\r\n const runtimeImport = new Function(\r\n 'moduleSpecifier',\r\n 'return import(moduleSpecifier)',\r\n ) as (moduleSpecifier: string) => Promise<unknown>\r\n return runtimeImport(moduleSpecifier)\r\n}\r\n\r\n/**\r\n * Loads and normalizes `athena.config.*` from disk.\r\n */\r\nexport async function loadGeneratorConfig(\r\n options: LoadGeneratorConfigOptions = {},\r\n): Promise<LoadedGeneratorConfig> {\r\n const cwd = options.cwd ?? process.cwd()\r\n const resolvedPath = options.configPath\r\n ? resolve(cwd, options.configPath)\r\n : findGeneratorConfigPath(cwd)\r\n\r\n if (!resolvedPath) {\r\n throw new Error(\r\n `No generator config found in ${cwd}. Expected one of: ${DEFAULT_CONFIG_CANDIDATES.join(', ')}`,\r\n )\r\n }\r\n\r\n const moduleUrl = pathToFileURL(resolvedPath)\r\n const module = await importConfigModule(`${moduleUrl.href}?cacheBust=${Date.now()}`)\r\n const rawConfig = extractConfigExport(module)\r\n\r\n return {\r\n configPath: resolvedPath,\r\n config: normalizeGeneratorConfig(rawConfig),\r\n }\r\n}\r\n","import { posix } from 'path'\r\nimport type {\r\n AthenaGeneratorConfig,\r\n GeneratedArtifact,\r\n GeneratedArtifacts,\r\n NormalizedAthenaGeneratorConfig,\r\n} from './types.ts'\r\nimport type {\r\n IntrospectionRelation,\r\n IntrospectionSnapshot,\r\n IntrospectionTable,\r\n} from '../schema/types.ts'\r\nimport {\r\n escapeStringLiteral,\r\n escapeTypePropertyName,\r\n toSafeIdentifier,\r\n} from './naming.ts'\r\nimport { renderOutputPath } from './placeholders.ts'\r\nimport { resolvePostgresColumnType } from './postgres-type-mapping.ts'\r\nimport { normalizeGeneratorConfig } from './config.ts'\r\n\r\ntype ModelRenderDescriptor = {\r\n schemaName: string\r\n tableName: string\r\n filePath: string\r\n rowTypeName: string\r\n insertTypeName: string\r\n updateTypeName: string\r\n modelConstName: string\r\n table: IntrospectionTable\r\n}\r\n\r\ntype SchemaRenderDescriptor = {\r\n schemaName: string\r\n filePath: string\r\n schemaConstName: string\r\n models: ModelRenderDescriptor[]\r\n}\r\n\r\ntype DatabaseRenderDescriptor = {\r\n filePath: string\r\n databaseConstName: string\r\n schemas: SchemaRenderDescriptor[]\r\n}\r\n\r\nfunction normalizePath(pathValue: string): string {\r\n return pathValue.replace(/\\\\/g, '/')\r\n}\r\n\r\nfunction withoutTypeScriptExtension(pathValue: string): string {\r\n return pathValue.replace(/\\.tsx?$/i, '')\r\n}\r\n\r\nfunction toModuleImportPath(fromFile: string, targetFile: string): string {\r\n const relativePath = withoutTypeScriptExtension(\r\n normalizePath(posix.relative(posix.dirname(fromFile), targetFile)),\r\n )\r\n return relativePath.startsWith('.') ? relativePath : `./${relativePath}`\r\n}\r\n\r\nfunction renderObjectKey(key: string): string {\r\n const escaped = escapeTypePropertyName(key)\r\n return escaped.startsWith(\"'\") ? escaped : escaped\r\n}\r\n\r\nfunction renderRelation(relation: IntrospectionRelation): string {\r\n const through = relation.through\r\n ? `,\r\n through: {\r\n schema: ${escapeStringLiteral(relation.through.schema)},\r\n model: ${escapeStringLiteral(relation.through.model)},\r\n sourceColumns: [${relation.through.sourceColumns.map(value => escapeStringLiteral(value)).join(', ')}],\r\n targetColumns: [${relation.through.targetColumns.map(value => escapeStringLiteral(value)).join(', ')}],\r\n }`\r\n : ''\r\n\r\n return `{\r\n kind: ${escapeStringLiteral(relation.kind)},\r\n sourceColumns: [${relation.sourceColumns.map(value => escapeStringLiteral(value)).join(', ')}],\r\n targetSchema: ${escapeStringLiteral(relation.targetSchema)},\r\n targetModel: ${escapeStringLiteral(relation.targetModel)},\r\n targetColumns: [${relation.targetColumns.map(value => escapeStringLiteral(value)).join(', ')}]${through}\r\n }`\r\n}\r\n\r\nfunction renderModelArtifact(\r\n snapshot: IntrospectionSnapshot,\r\n descriptor: ModelRenderDescriptor,\r\n config: NormalizedAthenaGeneratorConfig,\r\n): GeneratedArtifact {\r\n const columnLines = Object.values(descriptor.table.columns)\r\n .map(column => {\r\n const propertyName = escapeTypePropertyName(column.name)\r\n const baseType = resolvePostgresColumnType(column)\r\n const isOptional = column.isNullable\r\n const typeWithNullability = column.isNullable ? `${baseType} | null` : baseType\r\n return ` ${propertyName}${isOptional ? '?' : ''}: ${typeWithNullability}`\r\n })\r\n .join('\\n')\r\n\r\n const nullableLines = Object.values(descriptor.table.columns)\r\n .map(column => ` ${renderObjectKey(column.name)}: ${column.isNullable ? 'true' : 'false'}`)\r\n .join(',\\n')\r\n\r\n const relationEntries = Object.entries(descriptor.table.relations)\r\n const relationBlock = config.features.emitRelations && relationEntries.length > 0\r\n ? `,\r\n relations: {\r\n${relationEntries\r\n .map(([relationKey, relationValue]) => ` ${renderObjectKey(relationKey)}: ${renderRelation(relationValue)}`)\r\n .join(',\\n')}\r\n }`\r\n : ''\r\n\r\n const content = `import { defineModel } from '@xylex-group/athena'\r\n\r\nexport interface ${descriptor.rowTypeName} {\r\n${columnLines}\r\n}\r\n\r\nexport type ${descriptor.insertTypeName} = Partial<${descriptor.rowTypeName}>\r\nexport type ${descriptor.updateTypeName} = Partial<${descriptor.insertTypeName}>\r\n\r\nexport const ${descriptor.modelConstName} = defineModel<${descriptor.rowTypeName}, ${descriptor.insertTypeName}, ${descriptor.updateTypeName}>({\r\n meta: {\r\n database: ${escapeStringLiteral(snapshot.database)},\r\n schema: ${escapeStringLiteral(descriptor.schemaName)},\r\n model: ${escapeStringLiteral(descriptor.tableName)},\r\n tableName: ${escapeStringLiteral(`${descriptor.schemaName}.${descriptor.tableName}`)},\r\n primaryKey: [${descriptor.table.primaryKey.map(value => escapeStringLiteral(value)).join(', ')}],\r\n nullable: {\r\n${nullableLines}\r\n }${relationBlock}\r\n }\r\n})\r\n`\r\n\r\n return {\r\n kind: 'model',\r\n path: descriptor.filePath,\r\n content,\r\n }\r\n}\r\n\r\nfunction renderSchemaArtifact(descriptor: SchemaRenderDescriptor): GeneratedArtifact {\r\n const importLines = descriptor.models\r\n .map(modelDescriptor => {\r\n const importPath = toModuleImportPath(descriptor.filePath, modelDescriptor.filePath)\r\n return `import { ${modelDescriptor.modelConstName} } from '${importPath}'`\r\n })\r\n .join('\\n')\r\n\r\n const modelEntries = descriptor.models\r\n .map(modelDescriptor => ` ${renderObjectKey(modelDescriptor.tableName)}: ${modelDescriptor.modelConstName}`)\r\n .join(',\\n')\r\n\r\n const content = `import { defineSchema } from '@xylex-group/athena'\r\n${importLines ? `\\n${importLines}\\n` : '\\n'}\r\nexport const ${descriptor.schemaConstName} = defineSchema({\r\n${modelEntries}\r\n})\r\n`\r\n\r\n return {\r\n kind: 'schema',\r\n path: descriptor.filePath,\r\n content,\r\n }\r\n}\r\n\r\nfunction renderDatabaseArtifact(descriptor: DatabaseRenderDescriptor): GeneratedArtifact {\r\n const importLines = descriptor.schemas\r\n .map(schemaDescriptor => {\r\n const importPath = toModuleImportPath(descriptor.filePath, schemaDescriptor.filePath)\r\n return `import { ${schemaDescriptor.schemaConstName} } from '${importPath}'`\r\n })\r\n .join('\\n')\r\n\r\n const schemaEntries = descriptor.schemas\r\n .map(schemaDescriptor => ` ${renderObjectKey(schemaDescriptor.schemaName)}: ${schemaDescriptor.schemaConstName}`)\r\n .join(',\\n')\r\n\r\n const content = `import { defineDatabase } from '@xylex-group/athena'\r\n${importLines ? `\\n${importLines}\\n` : '\\n'}\r\nexport const ${descriptor.databaseConstName} = defineDatabase({\r\n${schemaEntries}\r\n})\r\n`\r\n\r\n return {\r\n kind: 'database',\r\n path: descriptor.filePath,\r\n content,\r\n }\r\n}\r\n\r\nfunction renderRegistryArtifact(\r\n registryPath: string,\r\n databasePath: string,\r\n databaseConstName: string,\r\n registryConstName: string,\r\n databaseName: string,\r\n): GeneratedArtifact {\r\n const databaseImportPath = toModuleImportPath(registryPath, databasePath)\r\n const content = `import { defineRegistry } from '@xylex-group/athena'\r\nimport { ${databaseConstName} } from '${databaseImportPath}'\r\n\r\nexport const ${registryConstName} = defineRegistry({\r\n ${renderObjectKey(databaseName)}: ${databaseConstName}\r\n})\r\n`\r\n\r\n return {\r\n kind: 'registry',\r\n path: registryPath,\r\n content,\r\n }\r\n}\r\n\r\nfunction assertNoDuplicatePaths(files: GeneratedArtifact[]) {\r\n const seen = new Set<string>()\r\n for (const file of files) {\r\n if (seen.has(file.path)) {\r\n throw new Error(`Generator output collision detected for path: ${file.path}`)\r\n }\r\n seen.add(file.path)\r\n }\r\n}\r\n\r\nclass ArtifactComposer {\r\n constructor(\r\n private readonly snapshot: IntrospectionSnapshot,\r\n private readonly config: NormalizedAthenaGeneratorConfig,\r\n ) {}\r\n\r\n compose(): GeneratedArtifacts {\r\n const providerName = this.snapshot.backend\r\n const databaseName = this.snapshot.database\r\n const modelDescriptors: ModelRenderDescriptor[] = []\r\n\r\n for (const schemaName of Object.keys(this.snapshot.schemas).sort()) {\r\n const schema = this.snapshot.schemas[schemaName]\r\n for (const tableName of Object.keys(schema.tables).sort()) {\r\n const table = schema.tables[tableName]\r\n const rowTypeName = `${toSafeIdentifier(`${schemaName} ${tableName}`, this.config.naming.modelType, 'Model')}Row`\r\n const insertTypeName = `${toSafeIdentifier(`${schemaName} ${tableName}`, this.config.naming.modelType, 'Model')}Insert`\r\n const updateTypeName = `${toSafeIdentifier(`${schemaName} ${tableName}`, this.config.naming.modelType, 'Model')}Update`\r\n const modelConstName = `${toSafeIdentifier(`${schemaName} ${tableName} model`, this.config.naming.modelConst, 'model')}`\r\n\r\n const modelPath = normalizePath(\r\n renderOutputPath(this.config.output.targets.model, {\r\n provider: providerName,\r\n kind: 'model',\r\n database: databaseName,\r\n schema: schemaName,\r\n model: tableName,\r\n }, this.config.output),\r\n )\r\n\r\n modelDescriptors.push({\r\n schemaName,\r\n tableName,\r\n filePath: modelPath,\r\n rowTypeName,\r\n insertTypeName,\r\n updateTypeName,\r\n modelConstName,\r\n table,\r\n })\r\n }\r\n }\r\n\r\n const schemaDescriptors: SchemaRenderDescriptor[] = Object.keys(this.snapshot.schemas)\r\n .sort()\r\n .map(schemaName => {\r\n const schemaPath = normalizePath(\r\n renderOutputPath(this.config.output.targets.schema, {\r\n provider: providerName,\r\n kind: 'schema',\r\n database: databaseName,\r\n schema: schemaName,\r\n model: 'index',\r\n }, this.config.output),\r\n )\r\n\r\n return {\r\n schemaName,\r\n filePath: schemaPath,\r\n schemaConstName: toSafeIdentifier(\r\n `${schemaName} schema`,\r\n this.config.naming.schemaConst,\r\n 'schema',\r\n ),\r\n models: modelDescriptors.filter(model => model.schemaName === schemaName),\r\n }\r\n })\r\n\r\n const databasePath = normalizePath(\r\n renderOutputPath(this.config.output.targets.database, {\r\n provider: providerName,\r\n kind: 'database',\r\n database: databaseName,\r\n schema: 'index',\r\n model: 'index',\r\n }, this.config.output),\r\n )\r\n\r\n const databaseDescriptor: DatabaseRenderDescriptor = {\r\n filePath: databasePath,\r\n databaseConstName: toSafeIdentifier(\r\n `${databaseName} database`,\r\n this.config.naming.databaseConst,\r\n 'database',\r\n ),\r\n schemas: schemaDescriptors,\r\n }\r\n\r\n const files: GeneratedArtifact[] = []\r\n\r\n for (const modelDescriptor of modelDescriptors) {\r\n files.push(renderModelArtifact(this.snapshot, modelDescriptor, this.config))\r\n }\r\n\r\n for (const schemaDescriptor of schemaDescriptors) {\r\n files.push(renderSchemaArtifact(schemaDescriptor))\r\n }\r\n\r\n files.push(renderDatabaseArtifact(databaseDescriptor))\r\n\r\n if (this.config.features.emitRegistry) {\r\n const registryPath = normalizePath(\r\n renderOutputPath(this.config.output.targets.registry, {\r\n provider: providerName,\r\n kind: 'registry',\r\n database: databaseName,\r\n schema: 'index',\r\n model: 'index',\r\n }, this.config.output),\r\n )\r\n files.push(\r\n renderRegistryArtifact(\r\n registryPath,\r\n databaseDescriptor.filePath,\r\n databaseDescriptor.databaseConstName,\r\n toSafeIdentifier('registry', this.config.naming.registryConst, 'registry'),\r\n databaseName,\r\n ),\r\n )\r\n }\r\n\r\n assertNoDuplicatePaths(files)\r\n\r\n return {\r\n snapshot: this.snapshot,\r\n files,\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Generates model/schema/database/registry source artifacts from an introspection snapshot.\r\n */\r\nexport function generateArtifactsFromSnapshot(\r\n snapshot: IntrospectionSnapshot,\r\n config: AthenaGeneratorConfig | NormalizedAthenaGeneratorConfig,\r\n): GeneratedArtifacts {\r\n const normalizedConfig = 'naming' in config && 'features' in config && 'experimental' in config\r\n ? config as NormalizedAthenaGeneratorConfig\r\n : normalizeGeneratorConfig(config as AthenaGeneratorConfig)\r\n return new ArtifactComposer(snapshot, normalizedConfig).compose()\r\n}\r\n","import type {\n AthenaGatewayEndpointPath,\n AthenaGatewayErrorCode,\n AthenaGatewayErrorDetails,\n AthenaGatewayMethod,\n AthenaGatewayResponse,\n} from './types.js'\n\nexport interface AthenaGatewayErrorInput {\n code: AthenaGatewayErrorCode\n message: string\n status?: number\n endpoint?: AthenaGatewayEndpointPath\n method?: AthenaGatewayMethod\n requestId?: string\n hint?: string\n cause?: string\n}\n\n/**\n * Canonical error for gateway failures.\n * Holds request context and machine-readable classification.\n */\nexport class AthenaGatewayError extends Error {\n readonly code: AthenaGatewayErrorCode\n readonly status: number\n readonly endpoint?: AthenaGatewayEndpointPath\n readonly method?: AthenaGatewayMethod\n readonly requestId?: string\n readonly hint?: string\n readonly causeDetail?: string\n\n constructor(input: AthenaGatewayErrorInput) {\n super(input.message)\n this.name = 'AthenaGatewayError'\n this.code = input.code\n this.status = input.status ?? 0\n this.endpoint = input.endpoint\n this.method = input.method\n this.requestId = input.requestId\n this.hint = input.hint\n this.causeDetail = input.cause\n }\n\n toDetails(): AthenaGatewayErrorDetails {\n return {\n code: this.code,\n message: this.message,\n status: this.status,\n endpoint: this.endpoint,\n method: this.method,\n requestId: this.requestId,\n hint: this.hint,\n cause: this.causeDetail,\n }\n }\n\n static fromResponse<T>(\n response: AthenaGatewayResponse<T>,\n fallback: Omit<AthenaGatewayErrorInput, 'code' | 'message' | 'status'>,\n ) {\n const details = response.errorDetails\n if (details) {\n return new AthenaGatewayError({\n code: details.code,\n message: details.message,\n status: details.status,\n endpoint: details.endpoint ?? fallback.endpoint,\n method: details.method ?? fallback.method,\n requestId: details.requestId ?? fallback.requestId,\n hint: details.hint,\n cause: details.cause,\n })\n }\n\n return new AthenaGatewayError({\n code: 'HTTP_ERROR',\n message: response.error ?? 'Gateway request failed',\n status: response.status,\n endpoint: fallback.endpoint,\n method: fallback.method,\n requestId: fallback.requestId,\n })\n }\n}\n\nexport function isAthenaGatewayError(error: unknown): error is AthenaGatewayError {\n return error instanceof AthenaGatewayError\n}\n","import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayErrorDetails,\r\n AthenaGatewayMethod,\r\n AthenaRpcCallOptions,\r\n AthenaRpcPayload,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaRpcFilter,\r\n AthenaUpdatePayload,\r\n AthenaQueryPayload,\r\n} from \"./types.js\";\r\nimport { AthenaGatewayError } from \"./errors.ts\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\nconst FALLBACK_SDK_VERSION = \"1.3.0\";\r\nconst SDK_NAME = \"xylex-group/athena\";\r\n\r\nconst SDK_VERSION =\r\n typeof process !== \"undefined\" && process?.env?.npm_package_version\r\n ? process.env.npm_package_version\r\n : FALLBACK_SDK_VERSION;\r\nconst SDK_HEADER_VALUE = `${SDK_NAME} ${SDK_VERSION}`;\r\n\r\nfunction parseResponseBody(rawText: string, contentType: string | null) {\r\n if (!rawText) {\r\n return { parsed: null as unknown, parseFailed: false };\r\n }\r\n\r\n const contentTypeSuggestsJson =\r\n contentType?.toLowerCase().includes(\"application/json\") ?? false;\r\n const looksJson =\r\n contentTypeSuggestsJson || rawText.startsWith(\"{\") || rawText.startsWith(\"[\");\r\n\r\n if (!looksJson) {\r\n return { parsed: rawText as unknown, parseFailed: false };\r\n }\r\n\r\n try {\r\n return { parsed: JSON.parse(rawText) as unknown, parseFailed: false };\r\n } catch {\r\n return { parsed: rawText as unknown, parseFailed: true };\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\nfunction resolveRequestId(headers: Headers): string | undefined {\r\n return (\r\n headers.get(\"x-request-id\") ??\r\n headers.get(\"x-correlation-id\") ??\r\n headers.get(\"x-athena-request-id\") ??\r\n undefined\r\n );\r\n}\r\n\r\nfunction resolveErrorMessage(payload: unknown, fallback: string) {\r\n if (isRecord(payload)) {\r\n const messageCandidates = [payload.error, payload.message, payload.details];\r\n for (const candidate of messageCandidates) {\r\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\r\n return candidate.trim();\r\n }\r\n }\r\n }\r\n\r\n if (typeof payload === \"string\" && payload.trim().length > 0) {\r\n return payload.trim();\r\n }\r\n\r\n return fallback;\r\n}\r\n\r\nfunction detailsFromError(error: AthenaGatewayError): AthenaGatewayErrorDetails {\r\n return error.toDetails();\r\n}\r\n\r\nfunction toQueryScalar(value: unknown): string {\r\n if (value === null || value === undefined) return \"null\";\r\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\r\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : \"null\";\r\n return String(value);\r\n}\r\n\r\nfunction toQueryArray(values: unknown[]): string {\r\n return `{${values.map(toQueryScalar).join(\",\")}}`;\r\n}\r\n\r\nfunction toRpcArgumentQueryValue(value: unknown): string {\r\n if (Array.isArray(value)) return toQueryArray(value);\r\n if (value && typeof value === \"object\") return JSON.stringify(value);\r\n return toQueryScalar(value);\r\n}\r\n\r\nfunction toRpcFilterQueryValue(filter: AthenaRpcFilter): string {\r\n const value = filter.value;\r\n switch (filter.operator) {\r\n case \"in\": {\r\n if (!Array.isArray(value)) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: `RPC filter \"${filter.column}\" with operator \"in\" requires an array value`,\r\n status: 0,\r\n });\r\n }\r\n return `in.${toQueryArray(value)}`;\r\n }\r\n case \"is\":\r\n return `is.${toQueryScalar(value)}`;\r\n case \"eq\":\r\n case \"neq\":\r\n case \"gt\":\r\n case \"gte\":\r\n case \"lt\":\r\n case \"lte\":\r\n case \"like\":\r\n case \"ilike\":\r\n return `${filter.operator}.${toQueryScalar(value)}`;\r\n }\r\n}\r\n\r\nfunction buildRpcGetEndpoint(payload: AthenaRpcPayload): AthenaGatewayEndpointPath {\r\n const functionName = (payload.function_name ?? payload.function).trim();\r\n if (!functionName) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: \"rpc requires a function name\",\r\n status: 0,\r\n endpoint: \"/gateway/rpc\",\r\n method: \"GET\",\r\n });\r\n }\r\n\r\n const query = new URLSearchParams();\r\n if (payload.schema) query.set(\"schema\", payload.schema);\r\n if (payload.select) query.set(\"select\", payload.select);\r\n if (payload.count) query.set(\"count\", payload.count);\r\n if (payload.head) query.set(\"head\", \"true\");\r\n if (typeof payload.limit === \"number\") query.set(\"limit\", String(payload.limit));\r\n if (typeof payload.offset === \"number\") query.set(\"offset\", String(payload.offset));\r\n if (payload.order?.column) {\r\n query.set(\r\n \"order\",\r\n payload.order.ascending === false\r\n ? `${payload.order.column}.desc`\r\n : payload.order.column,\r\n );\r\n }\r\n\r\n if (payload.args) {\r\n for (const [key, value] of Object.entries(payload.args)) {\r\n query.set(key, toRpcArgumentQueryValue(value));\r\n }\r\n }\r\n\r\n if (payload.filters?.length) {\r\n for (const filter of payload.filters) {\r\n if (payload.args && Object.prototype.hasOwnProperty.call(payload.args, filter.column)) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: `RPC filter \"${filter.column}\" conflicts with RPC argument \"${filter.column}\" in GET mode`,\r\n status: 0,\r\n });\r\n }\r\n query.set(filter.column, toRpcFilterQueryValue(filter));\r\n }\r\n }\r\n\r\n const endpoint = `/rpc/${encodeURIComponent(functionName)}`;\r\n const queryText = query.toString();\r\n const withQuery = queryText ? `${endpoint}?${queryText}` : endpoint;\r\n return withQuery as AthenaGatewayEndpointPath;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? true;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n const headerClient =\r\n extraHeaders[\"x-athena-client\"] ?? extraHeaders[\"X-Athena-Client\"];\r\n const finalClient =\r\n options?.client ??\r\n config.client ??\r\n (typeof headerClient === \"string\" ? headerClient : undefined) ??\r\n DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n \"X-Athena-Sdk\": SDK_HEADER_VALUE,\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n const finalBackend = options?.backend ?? config.backend;\r\n if (finalBackend) {\r\n const type =\r\n typeof finalBackend === \"string\" ? finalBackend : finalBackend.type;\r\n if (type) headers[\"X-Backend-Type\"] = type;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n const athenaClientKeys = [\"x-athena-client\", \"X-Athena-Client\"];\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n if (athenaClientKeys.includes(key)) return;\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const requestInit: RequestInit = {\r\n method,\r\n headers,\r\n };\r\n if (method !== \"GET\") {\r\n requestInit.body = JSON.stringify(payload);\r\n }\r\n\r\n const response = await fetch(url, requestInit);\r\n\r\n const rawText = await response.text();\r\n const requestId = resolveRequestId(response.headers);\r\n const parsedBody = parseResponseBody(\r\n rawText ?? \"\",\r\n response.headers.get(\"content-type\"),\r\n );\r\n\r\n if (parsedBody.parseFailed) {\r\n const invalidJsonError = new AthenaGatewayError({\r\n code: \"INVALID_JSON\",\r\n message: \"Gateway returned malformed JSON\",\r\n status: response.status,\r\n endpoint,\r\n method,\r\n requestId,\r\n hint: \"Verify the gateway response body is valid JSON.\",\r\n cause: rawText.slice(0, 300),\r\n });\r\n return {\r\n ok: false,\r\n status: response.status,\r\n data: null,\r\n error: invalidJsonError.message,\r\n errorDetails: detailsFromError(invalidJsonError),\r\n raw: parsedBody.parsed,\r\n };\r\n }\r\n\r\n const parsed = parsedBody.parsed;\r\n const parsedPayload = isRecord(parsed) ? parsed : null;\r\n\r\n if (!response.ok) {\r\n const httpError = new AthenaGatewayError({\r\n code: \"HTTP_ERROR\",\r\n message: resolveErrorMessage(\r\n parsed,\r\n `Athena gateway ${method} ${endpoint} failed with status ${response.status}`,\r\n ),\r\n status: response.status,\r\n endpoint,\r\n method,\r\n requestId,\r\n });\r\n\r\n return {\r\n ok: false,\r\n status: response.status,\r\n data: null,\r\n error: httpError.message,\r\n errorDetails: detailsFromError(httpError),\r\n raw: parsed,\r\n };\r\n }\r\n\r\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\r\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\r\n const payloadData =\r\n parsedPayload && \"data\" in parsedPayload\r\n ? (parsedPayload.data as T)\r\n : (parsed as T);\r\n const payloadCount =\r\n parsedPayload && \"count\" in parsedPayload\r\n ? typeof parsedPayload.count === \"number\" || parsedPayload.count === null\r\n ? (parsedPayload.count as number | null)\r\n : undefined\r\n : undefined;\r\n\r\n return {\r\n ok: true,\r\n status: response.status,\r\n data: payloadData ?? null,\r\n count: payloadCount,\r\n error: undefined,\r\n errorDetails: null,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message = callError instanceof Error ? callError.message : String(callError);\r\n const networkError = new AthenaGatewayError({\r\n code: \"NETWORK_ERROR\",\r\n message: `Network error while calling ${method} ${endpoint}: ${message}`,\r\n endpoint,\r\n method,\r\n cause: message,\r\n hint: \"Check gateway URL, DNS, and network reachability.\",\r\n });\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: networkError.message,\r\n errorDetails: detailsFromError(networkError),\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n rpcGateway<T>(\r\n payload: AthenaRpcPayload,\r\n options?: AthenaRpcCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n queryGateway<T>(\r\n payload: AthenaQueryPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n rpcGateway(payload, options) {\r\n if (options?.get) {\r\n const endpoint = buildRpcGetEndpoint(payload);\r\n return callAthena(config, endpoint, \"GET\", null, options);\r\n }\r\n return callAthena(config, \"/gateway/rpc\", \"POST\", payload, options);\r\n },\r\n queryGateway(payload, options) {\r\n return callAthena(config, \"/gateway/query\", \"POST\", payload, options);\r\n },\r\n };\r\n}\r\n","const SIMPLE_IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/\r\nconst COMPOSITE_IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*$/\r\nconst ALIAS_PATTERN = /^([A-Za-z_][A-Za-z0-9_.]*)\\s+(?:as\\s+)?([A-Za-z_][A-Za-z0-9_]*)$/i\r\n\r\nfunction quoteIdentifierSegment(identifier: string): string {\r\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`\r\n}\r\n\r\n/**\r\n * Quotes a `schema.table.column`-style identifier path safely for SQL.\r\n */\r\nexport function quoteQualifiedIdentifier(identifier: string): string {\r\n return identifier\r\n .split('.')\r\n .map(segment => quoteIdentifierSegment(segment))\r\n .join('.')\r\n}\r\n\r\nfunction quoteSelectToken(token: string): string {\r\n if (token === '*') return token\r\n if (COMPOSITE_IDENTIFIER_PATTERN.test(token)) {\r\n return quoteQualifiedIdentifier(token)\r\n }\r\n\r\n const aliasMatch = ALIAS_PATTERN.exec(token)\r\n if (!aliasMatch) {\r\n return token\r\n }\r\n\r\n const [, baseIdentifier, aliasIdentifier] = aliasMatch\r\n if (!COMPOSITE_IDENTIFIER_PATTERN.test(baseIdentifier) || !SIMPLE_IDENTIFIER_PATTERN.test(aliasIdentifier)) {\r\n return token\r\n }\r\n return `${quoteQualifiedIdentifier(baseIdentifier)} AS ${quoteIdentifierSegment(aliasIdentifier)}`\r\n}\r\n\r\nfunction canAutoQuoteToken(token: string): boolean {\r\n if (token === '*') return true\r\n if (COMPOSITE_IDENTIFIER_PATTERN.test(token)) return true\r\n\r\n const aliasMatch = ALIAS_PATTERN.exec(token)\r\n if (!aliasMatch) return false\r\n const [, baseIdentifier, aliasIdentifier] = aliasMatch\r\n return COMPOSITE_IDENTIFIER_PATTERN.test(baseIdentifier) && SIMPLE_IDENTIFIER_PATTERN.test(aliasIdentifier)\r\n}\r\n\r\nfunction splitTopLevelCommaSeparated(input: string): string[] | null {\r\n const parts: string[] = []\r\n let buffer = ''\r\n let singleQuoted = false\r\n let doubleQuoted = false\r\n let depth = 0\r\n\r\n for (let index = 0; index < input.length; index += 1) {\r\n const char = input[index]\r\n const next = index + 1 < input.length ? input[index + 1] : ''\r\n\r\n if (singleQuoted) {\r\n buffer += char\r\n if (char === \"'\" && next === \"'\") {\r\n buffer += next\r\n index += 1\r\n continue\r\n }\r\n if (char === \"'\") {\r\n singleQuoted = false\r\n }\r\n continue\r\n }\r\n\r\n if (doubleQuoted) {\r\n buffer += char\r\n if (char === '\"' && next === '\"') {\r\n buffer += next\r\n index += 1\r\n continue\r\n }\r\n if (char === '\"') {\r\n doubleQuoted = false\r\n }\r\n continue\r\n }\r\n\r\n if (char === \"'\") {\r\n singleQuoted = true\r\n buffer += char\r\n continue\r\n }\r\n if (char === '\"') {\r\n doubleQuoted = true\r\n buffer += char\r\n continue\r\n }\r\n\r\n if (char === '(') {\r\n depth += 1\r\n buffer += char\r\n continue\r\n }\r\n if (char === ')') {\r\n depth -= 1\r\n if (depth < 0) return null\r\n buffer += char\r\n continue\r\n }\r\n\r\n if (char === ',' && depth === 0) {\r\n parts.push(buffer.trim())\r\n buffer = ''\r\n continue\r\n }\r\n\r\n buffer += char\r\n }\r\n\r\n if (singleQuoted || doubleQuoted || depth !== 0) {\r\n return null\r\n }\r\n\r\n if (buffer.trim().length > 0) {\r\n parts.push(buffer.trim())\r\n }\r\n\r\n return parts\r\n}\r\n\r\n/**\r\n * Quotes identifier lists while preserving raw SQL expressions.\r\n *\r\n * Examples:\r\n * - `\"table, user\"` -> `\"\\\"table\\\", \\\"user\\\"\"`\r\n * - `concat(name, ',') as label, id` -> unchanged\r\n */\r\nexport function quoteSelectColumnsExpression(columns: string): string {\r\n const trimmed = columns.trim()\r\n if (!trimmed || trimmed === '*') return trimmed || '*'\r\n\r\n const tokens = splitTopLevelCommaSeparated(trimmed)\r\n if (!tokens || tokens.length === 0) {\r\n return trimmed\r\n }\r\n\r\n if (!tokens.every(canAutoQuoteToken)) {\r\n return trimmed\r\n }\r\n\r\n return tokens.map(quoteSelectToken).join(', ')\r\n}\r\n\r\n/**\r\n * Immutable identifier object with consistent SQL rendering.\r\n */\r\nexport interface SqlIdentifier {\r\n readonly segments: string[]\r\n toSql(): string\r\n toString(): string\r\n}\r\n\r\nclass SqlIdentifierPath implements SqlIdentifier {\r\n readonly segments: string[]\r\n\r\n constructor(segments: string[]) {\r\n this.segments = segments\r\n }\r\n\r\n toSql(): string {\r\n return this.segments.map(quoteIdentifierSegment).join('.')\r\n }\r\n\r\n toString(): string {\r\n return this.toSql()\r\n }\r\n}\r\n\r\n/**\r\n * Creates a quoted identifier object from segment or dotted inputs.\r\n */\r\nexport function identifier(...segments: string[]): SqlIdentifier {\r\n const expandedSegments = segments\r\n .flatMap(segment => segment.split('.'))\r\n .map(segment => segment.trim())\r\n .filter(segment => segment.length > 0)\r\n\r\n return new SqlIdentifierPath(expandedSegments)\r\n}\r\n\r\n","import type {\r\n AthenaConditionArrayValue,\r\n AthenaConditionCastType,\r\n AthenaConditionOperator,\r\n AthenaConditionValue,\r\n AthenaDeletePayload,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayCondition,\r\n AthenaGatewayErrorDetails,\r\n AthenaGatewayResponse,\r\n AthenaInsertPayload,\r\n AthenaRpcCallOptions,\r\n AthenaRpcFilter,\r\n AthenaRpcFilterOperator,\r\n AthenaRpcPayload,\r\n AthenaSortBy,\r\n AthenaUpdatePayload,\r\n} from './gateway/types.ts'\r\nimport type { BackendConfig, BackendType } from './gateway/types.ts'\r\nimport { createAthenaGatewayClient } from './gateway/client.ts'\r\nimport { quoteQualifiedIdentifier, quoteSelectColumnsExpression } from './sql-identifiers.ts'\r\n\r\nexport interface AthenaResult<T> {\r\n data: T | null\r\n error: string | null\r\n errorDetails?: AthenaGatewayErrorDetails | null\r\n status: number\r\n count?: number | null\r\n raw: unknown\r\n}\r\n\r\ntype TableBuilderState = {\r\n conditions: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n order?: AthenaSortBy\r\n currentPage?: number\r\n pageSize?: number\r\n totalPages?: number\r\n}\r\n\r\ntype ConditionCastHints = {\r\n valueCast?: AthenaConditionCastType\r\n columnCast?: AthenaConditionCastType\r\n}\r\n\r\ntype MutationSingleResult<Result> = Result extends Array<infer Item> ? Item | null : Result | null\r\nconst DEFAULT_COLUMNS = '*'\r\nconst UUID_PATTERN =\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\r\nconst SAFE_CAST_PATTERN = /^[a-z_][a-z0-9_]*(?:\\[\\])?$/i\r\n\r\nexport interface MutationQuery<Result> extends PromiseLike<AthenaResult<Result>> {\r\n select(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<Result>>\r\n returning(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<Result>>\r\n single(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaResult<MutationSingleResult<Result>>>\r\n maybeSingle(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaResult<MutationSingleResult<Result>>>\r\n then<TResult1 = AthenaResult<Result>, TResult2 = never>(\r\n onfulfilled?: ((value: AthenaResult<Result>) => TResult1 | PromiseLike<TResult1>) | undefined | null,\r\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null,\r\n ): Promise<TResult1 | TResult2>\r\n catch<TResult = never>(\r\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null,\r\n ): Promise<AthenaResult<Result> | TResult>\r\n finally(onfinally?: (() => void) | undefined | null): Promise<AthenaResult<Result>>\r\n}\r\n\r\nfunction formatResult<T>(response: AthenaGatewayResponse<T>): AthenaResult<T> {\r\n const result: AthenaResult<T> = {\r\n data: response.data ?? null,\r\n error: response.error ?? null,\r\n errorDetails: response.errorDetails ?? null,\r\n status: response.status,\r\n raw: response.raw,\r\n }\r\n if (response.count !== undefined) {\r\n result.count = response.count\r\n }\r\n return result\r\n}\r\n\r\nfunction toSingleResult<Result>(response: AthenaResult<Result>): AthenaResult<MutationSingleResult<Result>> {\r\n const payload = response.data\r\n const singleData =\r\n Array.isArray(payload) ? (payload.length ? payload[0] : null) : payload ?? null\r\n return {\r\n ...response,\r\n data: singleData as MutationSingleResult<Result>,\r\n }\r\n}\r\n\r\nfunction mergeOptions<T extends object>(...options: Array<T | undefined>): T | undefined {\r\n return options.reduce<T | undefined>((acc, next) => {\r\n if (!next) return acc\r\n return { ...acc, ...next }\r\n }, undefined)\r\n}\r\n\r\nfunction createMutationQuery<Result>(\r\n executor: (\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaResult<Result>>,\r\n defaultColumns: string | string[] | null = DEFAULT_COLUMNS,\r\n): MutationQuery<Result> {\r\n let selectedColumns: string | string[] | undefined = defaultColumns === null ? undefined : defaultColumns\r\n let selectedOptions: AthenaGatewayCallOptions | undefined\r\n let promise: Promise<AthenaResult<Result>> | null = null\r\n\r\n const run = (columns?: string | string[], options?: AthenaGatewayCallOptions) => {\r\n const payloadColumns = columns ?? selectedColumns\r\n const payloadOptions = options ?? selectedOptions\r\n if (!promise) {\r\n promise = executor(payloadColumns, payloadOptions)\r\n }\r\n return promise\r\n }\r\n\r\n const mutationQuery: MutationQuery<Result> = {\r\n select(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options)\r\n },\r\n returning(columns = selectedColumns, options) {\r\n return mutationQuery.select(columns, options)\r\n },\r\n single(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options).then(toSingleResult)\r\n },\r\n maybeSingle(columns = selectedColumns, options) {\r\n return mutationQuery.single(columns, options)\r\n },\r\n then(onfulfilled, onrejected) {\r\n return run(selectedColumns, selectedOptions).then(onfulfilled, onrejected)\r\n },\r\n catch(onrejected) {\r\n return run(selectedColumns, selectedOptions).catch(onrejected)\r\n },\r\n finally(onfinally) {\r\n return run(selectedColumns, selectedOptions).finally(onfinally)\r\n },\r\n }\r\n\r\n return mutationQuery\r\n}\r\n\r\nexport interface OrderOptions {\r\n ascending?: boolean\r\n}\r\n\r\n/** Shared filter chain - supports eq, limit, etc. in any order relative to select/update */\r\ninterface FilterChain<Self> {\r\n eq(column: string, value: AthenaConditionValue): Self\r\n eqCast(column: string, value: AthenaConditionValue, cast: AthenaConditionCastType): Self\r\n eqUuid(column: string, value: string): Self\r\n match(filters: Record<string, AthenaConditionValue>): Self\r\n range(from: number, to: number): Self\r\n limit(count: number): Self\r\n offset(count: number): Self\r\n currentPage(value: number): Self\r\n pageSize(value: number): Self\r\n totalPages(value: number): Self\r\n order(column: string, options?: OrderOptions): Self\r\n gt(column: string, value: AthenaConditionValue): Self\r\n gte(column: string, value: AthenaConditionValue): Self\r\n lt(column: string, value: AthenaConditionValue): Self\r\n lte(column: string, value: AthenaConditionValue): Self\r\n neq(column: string, value: AthenaConditionValue): Self\r\n like(column: string, value: AthenaConditionValue): Self\r\n ilike(column: string, value: AthenaConditionValue): Self\r\n is(column: string, value: AthenaConditionValue): Self\r\n in(column: string, values: AthenaConditionArrayValue): Self\r\n contains(column: string, values: AthenaConditionArrayValue): Self\r\n containedBy(column: string, values: AthenaConditionArrayValue): Self\r\n not(\r\n columnOrExpression: string,\r\n operator?: AthenaConditionOperator,\r\n value?: AthenaConditionValue,\r\n ): Self\r\n or(expression: string): Self\r\n}\r\n\r\n/** Chain returned by select() - supports filters and single/maybeSingle before execution */\r\nexport interface SelectChain<Row> extends FilterChain<SelectChain<Row>>, PromiseLike<AthenaResult<Row[]>> {\r\n single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<T | null>>\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<T | null>>\r\n}\r\n\r\n/** Chain returned by update() - supports filters before execution, plus select/returning */\r\nexport interface UpdateChain<Row> extends FilterChain<UpdateChain<Row>>, MutationQuery<Row[]> {}\r\n\r\ninterface RpcFilterChain<Self> {\r\n eq(column: string, value: AthenaConditionValue): Self\r\n neq(column: string, value: AthenaConditionValue): Self\r\n gt(column: string, value: AthenaConditionValue): Self\r\n gte(column: string, value: AthenaConditionValue): Self\r\n lt(column: string, value: AthenaConditionValue): Self\r\n lte(column: string, value: AthenaConditionValue): Self\r\n like(column: string, value: AthenaConditionValue): Self\r\n ilike(column: string, value: AthenaConditionValue): Self\r\n is(column: string, value: AthenaConditionValue): Self\r\n in(column: string, values: AthenaConditionArrayValue): Self\r\n}\r\n\r\nexport interface RpcOrderOptions {\r\n ascending?: boolean\r\n}\r\n\r\nexport interface RpcQueryBuilder<Row>\r\n extends RpcFilterChain<RpcQueryBuilder<Row>>, PromiseLike<AthenaResult<Row[]>> {\r\n select(columns?: string | string[], options?: AthenaRpcCallOptions): Promise<AthenaResult<Row[]>>\r\n single<T = Row>(columns?: string | string[], options?: AthenaRpcCallOptions): Promise<AthenaResult<T | null>>\r\n maybeSingle<T = Row>(\r\n columns?: string | string[],\r\n options?: AthenaRpcCallOptions,\r\n ): Promise<AthenaResult<T | null>>\r\n order(column: string, options?: RpcOrderOptions): RpcQueryBuilder<Row>\r\n limit(count: number): RpcQueryBuilder<Row>\r\n offset(count: number): RpcQueryBuilder<Row>\r\n range(from: number, to: number): RpcQueryBuilder<Row>\r\n}\r\n\r\nexport interface TableQueryBuilder<Row> extends FilterChain<TableQueryBuilder<Row>> {\r\n select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): SelectChain<T>\r\n insert(values: Row, options?: AthenaGatewayCallOptions): MutationQuery<Row>\r\n insert(values: Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row[]>\r\n upsert(\r\n values: Row,\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row>\r\n upsert(\r\n values: Row[],\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row[]>\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions): UpdateChain<Row>\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }): MutationQuery<Row | null>\r\n single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<T | null>>\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<AthenaResult<T | null>>\r\n reset(): TableQueryBuilder<Row>\r\n}\r\n\r\nfunction getResourceId(state: TableBuilderState): string | undefined {\r\n const candidate = state.conditions.find(\r\n condition =>\r\n condition.operator === 'eq' &&\r\n (condition.column === 'resource_id' || condition.column === 'id'),\r\n )\r\n return candidate?.value?.toString()\r\n}\r\n\r\nfunction stringifyFilterValue(value: AthenaConditionValue | AthenaConditionArrayValue | string): string {\r\n if (Array.isArray(value)) {\r\n return value.join(',')\r\n }\r\n return String(value)\r\n}\r\n\r\nfunction isUuidString(value: string): boolean {\r\n return UUID_PATTERN.test(value.trim())\r\n}\r\n\r\nfunction isUuidIdentifierColumn(column: string): boolean {\r\n return column === 'id' || /(?:^|_)uuid(?:_|$)/i.test(column) || /_id$/i.test(column)\r\n}\r\n\r\nfunction shouldUseUuidTextComparison(column: string, value: AthenaConditionValue): boolean {\r\n return typeof value === 'string' && isUuidString(value) && isUuidIdentifierColumn(column)\r\n}\r\n\r\nfunction normalizeCast(cast: AthenaConditionCastType): string {\r\n const normalized = cast.trim().toLowerCase()\r\n if (!SAFE_CAST_PATTERN.test(normalized)) {\r\n throw new Error(`Invalid cast type \"${cast}\"`)\r\n }\r\n return normalized\r\n}\r\n\r\nfunction escapeSqlStringLiteral(value: string): string {\r\n return value.replace(/'/g, \"''\")\r\n}\r\n\r\nfunction toSqlLiteral(value: AthenaConditionValue): string {\r\n if (value === null) return 'NULL'\r\n if (typeof value === 'number') return Number.isFinite(value) ? String(value) : 'NULL'\r\n if (typeof value === 'boolean') return value ? 'TRUE' : 'FALSE'\r\n return `'${escapeSqlStringLiteral(value)}'`\r\n}\r\n\r\nfunction withCast(expression: string, cast?: AthenaConditionCastType): string {\r\n if (!cast) return expression\r\n return `${expression}::${normalizeCast(cast)}`\r\n}\r\n\r\nfunction buildSelectColumnsClause(columns: string | string[]): string {\r\n if (Array.isArray(columns)) {\r\n return columns.map(column => quoteQualifiedIdentifier(column)).join(', ')\r\n }\r\n return quoteSelectColumnsExpression(columns)\r\n}\r\n\r\nfunction conditionToSqlClause(condition: AthenaGatewayCondition): string | null {\r\n if (!condition.column) return null\r\n const column = withCast(quoteQualifiedIdentifier(condition.column), condition.column_cast)\r\n const value = condition.value\r\n const sqlOperator = {\r\n eq: '=',\r\n neq: '!=',\r\n gt: '>',\r\n gte: '>=',\r\n lt: '<',\r\n lte: '<=',\r\n like: 'LIKE',\r\n ilike: 'ILIKE',\r\n } as const\r\n\r\n switch (condition.operator) {\r\n case 'eq':\r\n case 'neq':\r\n case 'gt':\r\n case 'gte':\r\n case 'lt':\r\n case 'lte':\r\n case 'like':\r\n case 'ilike': {\r\n if (Array.isArray(value) || value === undefined) return null\r\n const rhs = withCast(toSqlLiteral(value), condition.value_cast)\r\n return `${column} ${sqlOperator[condition.operator]} ${rhs}`\r\n }\r\n case 'is': {\r\n if (value === null) return `${column} IS NULL`\r\n if (value === true) return `${column} IS TRUE`\r\n if (value === false) return `${column} IS FALSE`\r\n return null\r\n }\r\n case 'in': {\r\n if (!Array.isArray(value)) return null\r\n if (value.length === 0) return 'FALSE'\r\n const values = value.map(item => withCast(toSqlLiteral(item), condition.value_cast))\r\n return `${column} IN (${values.join(', ')})`\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nfunction buildTypedSelectQuery(input: {\r\n tableName: string\r\n columns: string | string[]\r\n conditions: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n currentPage?: number\r\n pageSize?: number\r\n order?: AthenaSortBy\r\n}): string | null {\r\n const whereClauses: string[] = []\r\n for (const condition of input.conditions) {\r\n const clause = conditionToSqlClause(condition)\r\n if (!clause) return null\r\n whereClauses.push(clause)\r\n }\r\n\r\n let limit = input.limit\r\n let offset = input.offset\r\n if (limit === undefined && input.pageSize !== undefined) {\r\n limit = input.pageSize\r\n }\r\n if (\r\n offset === undefined &&\r\n input.pageSize !== undefined &&\r\n input.currentPage !== undefined &&\r\n input.currentPage > 0\r\n ) {\r\n offset = (input.currentPage - 1) * input.pageSize\r\n }\r\n\r\n const sqlParts = [\r\n `SELECT ${buildSelectColumnsClause(input.columns)} FROM ${quoteQualifiedIdentifier(input.tableName)}`,\r\n ]\r\n\r\n if (whereClauses.length > 0) {\r\n sqlParts.push(`WHERE ${whereClauses.join(' AND ')}`)\r\n }\r\n\r\n if (input.order?.field) {\r\n const direction = input.order.direction === 'descending' ? 'DESC' : 'ASC'\r\n sqlParts.push(`ORDER BY ${quoteQualifiedIdentifier(input.order.field)} ${direction}`)\r\n }\r\n\r\n if (limit !== undefined) {\r\n sqlParts.push(`LIMIT ${Math.max(0, Math.trunc(limit))}`)\r\n }\r\n\r\n if (offset !== undefined) {\r\n sqlParts.push(`OFFSET ${Math.max(0, Math.trunc(offset))}`)\r\n }\r\n\r\n return `${sqlParts.join(' ')};`\r\n}\r\n\r\nfunction createFilterMethods<Self>(\r\n state: TableBuilderState,\r\n addCondition: (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n hints?: ConditionCastHints,\r\n ) => void,\r\n self: Self,\r\n) {\r\n return {\r\n eq(column: string, value: AthenaConditionValue) {\r\n if (shouldUseUuidTextComparison(column, value)) {\r\n addCondition('eq', column, value, { columnCast: 'text' })\r\n } else {\r\n addCondition('eq', column, value)\r\n }\r\n return self\r\n },\r\n eqCast(column: string, value: AthenaConditionValue, cast: AthenaConditionCastType) {\r\n addCondition('eq', column, value, { valueCast: cast })\r\n return self\r\n },\r\n eqUuid(column: string, value: string) {\r\n addCondition('eq', column, value, { valueCast: 'uuid' })\r\n return self\r\n },\r\n match(filters: Record<string, AthenaConditionValue>) {\r\n Object.entries(filters).forEach(([column, value]) => {\r\n if (shouldUseUuidTextComparison(column, value)) {\r\n addCondition('eq', column, value, { columnCast: 'text' })\r\n } else {\r\n addCondition('eq', column, value)\r\n }\r\n })\r\n return self\r\n },\r\n range(from: number, to: number) {\r\n state.offset = from\r\n state.limit = to - from + 1\r\n return self\r\n },\r\n limit(count: number) {\r\n state.limit = count\r\n return self\r\n },\r\n offset(count: number) {\r\n state.offset = count\r\n return self\r\n },\r\n currentPage(value: number) {\r\n state.currentPage = value\r\n return self\r\n },\r\n pageSize(value: number) {\r\n state.pageSize = value\r\n return self\r\n },\r\n totalPages(value: number) {\r\n state.totalPages = value\r\n return self\r\n },\r\n order(column: string, options?: OrderOptions) {\r\n state.order = {\r\n field: column,\r\n direction: options?.ascending === false ? 'descending' : 'ascending',\r\n }\r\n return self\r\n },\r\n gt(column: string, value: AthenaConditionValue) {\r\n addCondition('gt', column, value)\r\n return self\r\n },\r\n gte(column: string, value: AthenaConditionValue) {\r\n addCondition('gte', column, value)\r\n return self\r\n },\r\n lt(column: string, value: AthenaConditionValue) {\r\n addCondition('lt', column, value)\r\n return self\r\n },\r\n lte(column: string, value: AthenaConditionValue) {\r\n addCondition('lte', column, value)\r\n return self\r\n },\r\n neq(column: string, value: AthenaConditionValue) {\r\n addCondition('neq', column, value)\r\n return self\r\n },\r\n like(column: string, value: AthenaConditionValue) {\r\n addCondition('like', column, value)\r\n return self\r\n },\r\n ilike(column: string, value: AthenaConditionValue) {\r\n addCondition('ilike', column, value)\r\n return self\r\n },\r\n is(column: string, value: AthenaConditionValue) {\r\n addCondition('is', column, value)\r\n return self\r\n },\r\n in(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('in', column, values)\r\n return self\r\n },\r\n contains(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('contains', column, values)\r\n return self\r\n },\r\n containedBy(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('containedBy', column, values)\r\n return self\r\n },\r\n not(columnOrExpression: string, operator?: AthenaConditionOperator, value?: AthenaConditionValue) {\r\n if (operator != null && value !== undefined) {\r\n addCondition('not', undefined, `${columnOrExpression}.${operator}.${stringifyFilterValue(value)}`)\r\n } else {\r\n addCondition('not', undefined, columnOrExpression)\r\n }\r\n return self\r\n },\r\n or(expression: string) {\r\n addCondition('or', undefined, expression)\r\n return self\r\n },\r\n }\r\n}\r\n\r\nfunction toRpcSelect(columns?: string | string[]) {\r\n if (!columns) return undefined\r\n return Array.isArray(columns) ? columns.join(',') : columns\r\n}\r\n\r\nfunction createRpcFilterMethods<Self>(\r\n filters: AthenaRpcFilter[],\r\n self: Self,\r\n) {\r\n const addFilter = (\r\n operator: AthenaRpcFilterOperator,\r\n column: string,\r\n value: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n ) => {\r\n filters.push({ column, operator, value })\r\n }\r\n\r\n return {\r\n eq(column: string, value: AthenaConditionValue) {\r\n addFilter('eq', column, value)\r\n return self\r\n },\r\n neq(column: string, value: AthenaConditionValue) {\r\n addFilter('neq', column, value)\r\n return self\r\n },\r\n gt(column: string, value: AthenaConditionValue) {\r\n addFilter('gt', column, value)\r\n return self\r\n },\r\n gte(column: string, value: AthenaConditionValue) {\r\n addFilter('gte', column, value)\r\n return self\r\n },\r\n lt(column: string, value: AthenaConditionValue) {\r\n addFilter('lt', column, value)\r\n return self\r\n },\r\n lte(column: string, value: AthenaConditionValue) {\r\n addFilter('lte', column, value)\r\n return self\r\n },\r\n like(column: string, value: AthenaConditionValue) {\r\n addFilter('like', column, value)\r\n return self\r\n },\r\n ilike(column: string, value: AthenaConditionValue) {\r\n addFilter('ilike', column, value)\r\n return self\r\n },\r\n is(column: string, value: AthenaConditionValue) {\r\n addFilter('is', column, value)\r\n return self\r\n },\r\n in(column: string, values: AthenaConditionArrayValue) {\r\n addFilter('in', column, values)\r\n return self\r\n },\r\n }\r\n}\r\n\r\nfunction createRpcBuilder<Row>(\r\n functionName: string,\r\n args: Record<string, unknown> | undefined,\r\n baseOptions: AthenaRpcCallOptions | undefined,\r\n client: ReturnType<typeof createAthenaGatewayClient>,\r\n): RpcQueryBuilder<Row> {\r\n const state: {\r\n filters: AthenaRpcFilter[]\r\n limit?: number\r\n offset?: number\r\n order?: { column: string; ascending?: boolean }\r\n } = {\r\n filters: [],\r\n }\r\n\r\n let selectedColumns: string | string[] | undefined\r\n let selectedOptions: AthenaRpcCallOptions | undefined\r\n let promise: Promise<AthenaResult<Row[]>> | null = null\r\n\r\n const executeRpc = async <SelectedRow = Row>(\r\n columns?: string | string[],\r\n options?: AthenaRpcCallOptions,\r\n ): Promise<AthenaResult<SelectedRow[]>> => {\r\n const mergedOptions = mergeOptions(baseOptions, options)\r\n const payload: AthenaRpcPayload = {\r\n function: functionName,\r\n args,\r\n schema: mergedOptions?.schema,\r\n select: toRpcSelect(columns),\r\n filters: state.filters.length ? [...state.filters] : undefined,\r\n count: mergedOptions?.count,\r\n head: mergedOptions?.head,\r\n limit: state.limit,\r\n offset: state.offset,\r\n order: state.order,\r\n }\r\n const response = await client.rpcGateway<SelectedRow[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n\r\n const run = (columns?: string | string[], options?: AthenaRpcCallOptions) => {\r\n const payloadColumns = columns ?? selectedColumns\r\n const payloadOptions = options ?? selectedOptions\r\n if (!promise) {\r\n promise = executeRpc<Row>(payloadColumns, payloadOptions)\r\n }\r\n return promise\r\n }\r\n\r\n const builder = {} as RpcQueryBuilder<Row>\r\n const filterMethods = createRpcFilterMethods(state.filters, builder)\r\n\r\n Object.assign(builder, filterMethods, {\r\n select(columns = selectedColumns, options?: AthenaRpcCallOptions) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options)\r\n },\r\n async single<T = Row>(columns?: string | string[], options?: AthenaRpcCallOptions) {\r\n const result = await run(columns, options)\r\n return toSingleResult(result) as AthenaResult<T | null>\r\n },\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaRpcCallOptions) {\r\n return builder.single<T>(columns, options)\r\n },\r\n order(column: string, options?: RpcOrderOptions) {\r\n state.order = { column, ascending: options?.ascending ?? true }\r\n return builder\r\n },\r\n limit(count: number) {\r\n state.limit = count\r\n return builder\r\n },\r\n offset(count: number) {\r\n state.offset = count\r\n return builder\r\n },\r\n range(from: number, to: number) {\r\n state.offset = from\r\n state.limit = to - from + 1\r\n return builder\r\n },\r\n then<T1 = AthenaResult<Row[]>, T2 = never>(\r\n onfulfilled?: (v: AthenaResult<Row[]>) => T1 | PromiseLike<T1>,\r\n onrejected?: (reason: unknown) => T2 | PromiseLike<T2>,\r\n ) {\r\n return run(selectedColumns, selectedOptions).then(onfulfilled, onrejected)\r\n },\r\n catch<T = never>(onrejected?: (reason: unknown) => T | PromiseLike<T>) {\r\n return run(selectedColumns, selectedOptions).catch(onrejected)\r\n },\r\n finally(onfinally?: () => void) {\r\n return run(selectedColumns, selectedOptions).finally(onfinally)\r\n },\r\n })\r\n\r\n return builder\r\n}\r\n\r\nfunction createTableBuilder<Row>(\r\n tableName: string,\r\n client: ReturnType<typeof createAthenaGatewayClient>,\r\n): TableQueryBuilder<Row> {\r\n const state: TableBuilderState = {\r\n conditions: [],\r\n }\r\n\r\n const addCondition = (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n hints?: ConditionCastHints,\r\n ) => {\r\n const condition: AthenaGatewayCondition = { operator }\r\n if (column) {\r\n condition.column = column\r\n if (operator === 'eq') {\r\n // include legacy gateway shape for compatibility\r\n condition.eq_column = column\r\n }\r\n }\r\n if (value !== undefined) {\r\n condition.value = value\r\n if (operator === 'eq') {\r\n condition.eq_value = value\r\n }\r\n }\r\n if (hints?.valueCast) {\r\n condition.value_cast = hints.valueCast\r\n if (operator === 'eq') {\r\n condition.eq_value_cast = hints.valueCast\r\n }\r\n }\r\n if (hints?.columnCast) {\r\n condition.column_cast = hints.columnCast\r\n if (operator === 'eq') {\r\n condition.eq_column_cast = hints.columnCast\r\n }\r\n }\r\n state.conditions.push(condition)\r\n }\r\n\r\n const builder = {} as TableQueryBuilder<Row>\r\n\r\n const filterMethods = createFilterMethods(state, addCondition, builder)\r\n\r\n const runSelect = async <T = Row>(\r\n columns: string | string[] = DEFAULT_COLUMNS,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const conditions = state.conditions.length\r\n ? state.conditions.map(condition => ({ ...condition }))\r\n : undefined\r\n const hasTypedEqualityComparison =\r\n conditions?.some(\r\n condition =>\r\n condition.operator === 'eq' &&\r\n (condition.value_cast !== undefined || condition.column_cast !== undefined),\r\n ) ?? false\r\n\r\n if (hasTypedEqualityComparison && !options?.head && !options?.count && conditions) {\r\n const query = buildTypedSelectQuery({\r\n tableName,\r\n columns,\r\n conditions,\r\n limit: state.limit,\r\n offset: state.offset,\r\n currentPage: state.currentPage,\r\n pageSize: state.pageSize,\r\n order: state.order,\r\n })\r\n if (query) {\r\n const queryResponse = await client.queryGateway<T>({ query }, options)\r\n return formatResult(queryResponse)\r\n }\r\n }\r\n\r\n const payload = {\r\n table_name: tableName,\r\n columns,\r\n conditions,\r\n limit: state.limit,\r\n offset: state.offset,\r\n current_page: state.currentPage,\r\n page_size: state.pageSize,\r\n total_pages: state.totalPages,\r\n sort_by: state.order,\r\n strip_nulls: options?.stripNulls ?? true,\r\n count: options?.count,\r\n head: options?.head,\r\n }\r\n const response = await client.fetchGateway<T>(payload, options)\r\n return formatResult(response)\r\n }\r\n\r\n const createSelectChain = <SelectedRow>(\r\n columns: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): SelectChain<SelectedRow> => {\r\n const chain = {} as SelectChain<SelectedRow>\r\n const filterMethods = createFilterMethods(state, addCondition, chain)\r\n Object.assign(chain, filterMethods, {\r\n async single<T = SelectedRow>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n const r = await runSelect<T[]>(cols ?? columns, opts ?? options)\r\n return toSingleResult(r)\r\n },\r\n maybeSingle<T = SelectedRow>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n return chain.single<T>(cols, opts)\r\n },\r\n then<T1 = AthenaResult<SelectedRow[]>, T2 = never>(\r\n onfulfilled?: (v: AthenaResult<SelectedRow[]>) => T1 | PromiseLike<T1>,\r\n onrejected?: (reason: unknown) => T2 | PromiseLike<T2>,\r\n ) {\r\n return runSelect<SelectedRow[]>(columns, options).then(onfulfilled, onrejected)\r\n },\r\n catch<T = never>(onrejected?: (reason: unknown) => T | PromiseLike<T>) {\r\n return runSelect<SelectedRow[]>(columns, options).catch(onrejected)\r\n },\r\n finally(onfinally?: () => void) {\r\n return runSelect<SelectedRow[]>(columns, options).finally(onfinally)\r\n },\r\n })\r\n return chain\r\n }\r\n\r\n Object.assign(builder, filterMethods, {\r\n reset() {\r\n state.conditions = []\r\n state.limit = undefined\r\n state.offset = undefined\r\n state.order = undefined\r\n state.currentPage = undefined\r\n state.pageSize = undefined\r\n state.totalPages = undefined\r\n return builder\r\n },\r\n select<T = Row>(columns: string | string[] = DEFAULT_COLUMNS, options?: AthenaGatewayCallOptions) {\r\n return createSelectChain<T>(columns, options)\r\n },\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions) {\r\n if (Array.isArray(values)) {\r\n const executeInsertMany = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown>[],\r\n }\r\n if (columns) payload.columns = columns\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeInsertMany)\r\n }\r\n const executeInsertOne = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown>,\r\n }\r\n if (columns) payload.columns = columns\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row>(executeInsertOne)\r\n },\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & { updateBody?: Partial<Row>; onConflict?: string | string[] },\r\n ) {\r\n if (Array.isArray(values)) {\r\n const executeUpsertMany = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown>[],\r\n update_body: options?.updateBody ? (options.updateBody as Record<string, unknown>) : undefined,\r\n }\r\n if (columns) payload.columns = columns\r\n if (options?.onConflict) payload.on_conflict = options.onConflict\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeUpsertMany)\r\n }\r\n const executeUpsertOne = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown>,\r\n update_body: options?.updateBody ? (options.updateBody as Record<string, unknown>) : undefined,\r\n }\r\n if (columns) payload.columns = columns\r\n if (options?.onConflict) payload.on_conflict = options.onConflict\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row>(executeUpsertOne)\r\n },\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions) {\r\n const executeUpdate = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaUpdatePayload = {\r\n table_name: tableName,\r\n set: values,\r\n conditions: filters,\r\n strip_nulls: mergedOptions?.stripNulls ?? true,\r\n }\r\n if (state.order) payload.sort_by = state.order\r\n if (state.currentPage !== undefined) payload.current_page = state.currentPage\r\n if (state.pageSize !== undefined) payload.page_size = state.pageSize\r\n if (state.totalPages !== undefined) payload.total_pages = state.totalPages\r\n if (columns) payload.columns = columns\r\n const response = await client.updateGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n const mutation = createMutationQuery<Row[]>(executeUpdate, null)\r\n const updateChain = {} as UpdateChain<Row>\r\n const filterMethods = createFilterMethods(state, addCondition, updateChain)\r\n Object.assign(updateChain, filterMethods, mutation)\r\n return updateChain\r\n },\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const resourceId = options?.resourceId ?? getResourceId(state)\r\n if (!resourceId && !filters?.length) {\r\n throw new Error('delete requires a resource_id either via eq(\"resource_id\", ...) or options.resourceId')\r\n }\r\n const executeDelete = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaDeletePayload = {\r\n table_name: tableName,\r\n resource_id: resourceId,\r\n conditions: filters,\r\n }\r\n if (state.order) payload.sort_by = state.order\r\n if (state.currentPage !== undefined) payload.current_page = state.currentPage\r\n if (state.pageSize !== undefined) payload.page_size = state.pageSize\r\n if (state.totalPages !== undefined) payload.total_pages = state.totalPages\r\n if (columns) payload.columns = columns\r\n const response = await client.deleteGateway<Row | null>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | null>(executeDelete, null)\r\n },\r\n async single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n const response = await builder.select<T[]>(columns, options)\r\n return toSingleResult(response)\r\n },\r\n async maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n return builder.single<T>(columns, options)\r\n },\r\n })\r\n\r\n return builder\r\n}\r\n\r\nfunction createQueryBuilder(client: ReturnType<typeof createAthenaGatewayClient>) {\r\n return async function query<Row = unknown>(\r\n query: string,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaResult<Row[]>> {\r\n const normalizedQuery = query.trim()\r\n if (!normalizedQuery) {\r\n throw new Error('query requires a non-empty string')\r\n }\r\n const response = await client.queryGateway<Row[]>({ query: normalizedQuery }, options)\r\n return formatResult(response)\r\n }\r\n}\r\n\r\nexport interface AthenaSdkClient {\r\n from<Row = unknown>(table: string): TableQueryBuilder<Row>\r\n rpc<Row = unknown, Args extends Record<string, unknown> = Record<string, unknown>>(\r\n fn: string,\r\n args?: Args,\r\n options?: AthenaRpcCallOptions,\r\n ): RpcQueryBuilder<Row>\r\n query<Row = unknown>(query: string, options?: AthenaGatewayCallOptions): Promise<AthenaResult<Row[]>>\r\n}\r\n\r\n/** Client config for builder */\r\nexport interface AthenaClientConfig {\r\n baseUrl: string\r\n apiKey: string\r\n client?: string\r\n backend?: BackendConfig\r\n headers?: Record<string, string>\r\n healthTracking?: boolean\r\n}\r\n\r\nfunction createClientFromConfig(config: AthenaClientConfig): AthenaSdkClient {\r\n const gateway = createAthenaGatewayClient({\r\n baseUrl: config.baseUrl,\r\n apiKey: config.apiKey,\r\n client: config.client,\r\n backend: config.backend,\r\n headers: config.headers,\r\n })\r\n return {\r\n from<Row = unknown>(table: string) {\r\n return createTableBuilder<Row>(table, gateway)\r\n },\r\n rpc<Row = unknown, Args extends Record<string, unknown> = Record<string, unknown>>(\r\n fn: string,\r\n args?: Args,\r\n options?: AthenaRpcCallOptions,\r\n ) {\r\n const normalizedFn = fn.trim()\r\n if (!normalizedFn) {\r\n throw new Error('rpc requires a function name')\r\n }\r\n return createRpcBuilder<Row>(\r\n normalizedFn,\r\n args as Record<string, unknown> | undefined,\r\n options,\r\n gateway,\r\n )\r\n },\r\n query: createQueryBuilder(gateway) as AthenaSdkClient['query'],\r\n }\r\n}\r\n\r\nexport interface AthenaClientBuilder {\r\n /** Set the gateway base URL. */\r\n url(url: string): AthenaClientBuilder\r\n /** Set the API key used for all requests. */\r\n key(apiKey: string): AthenaClientBuilder\r\n /** Set the default backend routing strategy. */\r\n backend(backend: BackendConfig | BackendType): AthenaClientBuilder\r\n /** Set the default Athena client routing key. */\r\n client(clientName: string): AthenaClientBuilder\r\n /** Attach static headers to every request. */\r\n headers(headers: Record<string, string>): AthenaClientBuilder\r\n /** Enable or disable health tracking metadata. */\r\n healthTracking(enabled: boolean): AthenaClientBuilder\r\n /** Build the immutable Athena SDK client. */\r\n build(): AthenaSdkClient\r\n}\r\n\r\nconst DEFAULT_BACKEND: BackendConfig = { type: 'athena' }\r\n\r\nfunction toBackendConfig(b: BackendConfig | BackendType | undefined): BackendConfig {\r\n if (!b) return DEFAULT_BACKEND\r\n return typeof b === 'string' ? { type: b } : b\r\n}\r\n\r\nclass AthenaClientBuilderImpl implements AthenaClientBuilder {\r\n private baseUrl?: string\r\n private apiKey?: string\r\n private backendConfig: BackendConfig = DEFAULT_BACKEND\r\n private clientName?: string\r\n private defaultHeaders?: Record<string, string>\r\n private isHealthTrackingEnabled = false\r\n\r\n url(url: string): AthenaClientBuilder {\r\n this.baseUrl = url\r\n return this\r\n }\r\n\r\n key(apiKey: string): AthenaClientBuilder {\r\n this.apiKey = apiKey\r\n return this\r\n }\r\n\r\n backend(backend: BackendConfig | BackendType): AthenaClientBuilder {\r\n this.backendConfig = toBackendConfig(backend)\r\n return this\r\n }\r\n\r\n client(clientName: string): AthenaClientBuilder {\r\n this.clientName = clientName\r\n return this\r\n }\r\n\r\n headers(headers: Record<string, string>): AthenaClientBuilder {\r\n this.defaultHeaders = headers\r\n return this\r\n }\r\n\r\n healthTracking(enabled: boolean): AthenaClientBuilder {\r\n this.isHealthTrackingEnabled = enabled\r\n return this\r\n }\r\n\r\n build(): AthenaSdkClient {\r\n if (!this.baseUrl || !this.apiKey) {\r\n throw new Error('AthenaClient requires url and key; call .url() and .key() before .build()')\r\n }\r\n\r\n return createClientFromConfig({\r\n baseUrl: this.baseUrl,\r\n apiKey: this.apiKey,\r\n client: this.clientName,\r\n backend: this.backendConfig,\r\n headers: this.defaultHeaders,\r\n healthTracking: this.isHealthTrackingEnabled,\r\n })\r\n }\r\n}\r\n\r\n/** Canonical Athena client factory with builder-based configuration. */\r\nexport class AthenaClient {\r\n /** Create a fluent builder for a strongly-typed Athena SDK client. */\r\n static builder(): AthenaClientBuilder {\r\n return new AthenaClientBuilderImpl()\r\n }\r\n\r\n /** Build a client from process environment variables. */\r\n static fromEnvironment(): AthenaSdkClient {\r\n const url =\r\n process.env.ATHENA_URL ??\r\n process.env.ATHENA_GATEWAY_URL\r\n const key =\r\n process.env.ATHENA_API_KEY ??\r\n process.env.ATHENA_GATEWAY_API_KEY\r\n\r\n if (!url || !key) {\r\n throw new Error(\r\n 'ATHENA_URL and ATHENA_API_KEY (or ATHENA_GATEWAY_URL and ATHENA_GATEWAY_API_KEY) are required',\r\n )\r\n }\r\n\r\n return AthenaClient.builder()\r\n .url(url)\r\n .key(key)\r\n .build()\r\n }\r\n}\r\n\r\n/** Create client (convenience wrapper; use AthenaClient.builder() for full control) */\r\nexport function createClient(\r\n url: string,\r\n apiKey: string,\r\n options?: Pick<AthenaGatewayCallOptions, 'client' | 'headers' | 'backend'>,\r\n): AthenaSdkClient {\r\n const b = AthenaClient.builder().url(url).key(apiKey).backend(toBackendConfig(options?.backend))\r\n if (options?.client) b.client(options.client)\r\n if (options?.headers && Object.keys(options.headers).length > 0) b.headers(options.headers)\r\n return b.build()\r\n}\r\n","import type {\r\n IntrospectionColumn,\r\n IntrospectionRelation,\r\n IntrospectionSchema,\r\n IntrospectionTable,\r\n ModelRelationKind,\r\n} from './types.ts'\r\n\r\nexport type ColumnQueryRow = {\r\n schema_name: string\r\n table_name: string\r\n column_name: string\r\n data_type: string\r\n udt_name: string\r\n type_kind_code: string\r\n type_oid: number\r\n is_nullable: boolean\r\n has_default: boolean\r\n is_generated: boolean\r\n array_dimensions: number\r\n}\r\n\r\nexport type PrimaryKeyQueryRow = {\r\n schema_name: string\r\n table_name: string\r\n columns: string[]\r\n}\r\n\r\nexport type ForeignKeyQueryRow = {\r\n source_schema: string\r\n source_table: string\r\n constraint_name: string\r\n source_columns: string[]\r\n target_schema: string\r\n target_table: string\r\n target_columns: string[]\r\n source_is_unique: boolean\r\n}\r\n\r\nexport type EnumQueryRow = {\r\n type_oid: number\r\n enum_label: string\r\n}\r\n\r\ntype BridgeCandidate = {\r\n schema: string\r\n table: string\r\n foreignKeys: ForeignKeyQueryRow[]\r\n}\r\n\r\nexport const POSTGRES_CATALOG_SQL = {\r\n columns: `\r\n SELECT\r\n n.nspname AS schema_name,\r\n c.relname AS table_name,\r\n a.attname AS column_name,\r\n format_type(a.atttypid, a.atttypmod) AS data_type,\r\n t.typname AS udt_name,\r\n t.typtype AS type_kind_code,\r\n t.oid AS type_oid,\r\n NOT a.attnotnull AS is_nullable,\r\n (ad.adbin IS NOT NULL) AS has_default,\r\n (a.attgenerated <> '') AS is_generated,\r\n a.attndims AS array_dimensions\r\n FROM pg_attribute a\r\n JOIN pg_class c ON c.oid = a.attrelid\r\n JOIN pg_namespace n ON n.oid = c.relnamespace\r\n JOIN pg_type t ON t.oid = a.atttypid\r\n LEFT JOIN pg_attrdef ad ON ad.adrelid = a.attrelid AND ad.adnum = a.attnum\r\n WHERE c.relkind IN ('r', 'p')\r\n AND a.attnum > 0\r\n AND NOT a.attisdropped\r\n AND n.nspname = ANY($1::text[])\r\n ORDER BY n.nspname, c.relname, a.attnum;\r\n `,\r\n enums: `\r\n SELECT\r\n t.oid AS type_oid,\r\n e.enumlabel AS enum_label\r\n FROM pg_type t\r\n JOIN pg_enum e ON e.enumtypid = t.oid\r\n ORDER BY t.oid, e.enumsortorder;\r\n `,\r\n primaryKeys: `\r\n SELECT\r\n n.nspname AS schema_name,\r\n c.relname AS table_name,\r\n ARRAY_AGG(a.attname ORDER BY ck.ordinality) AS columns\r\n FROM pg_constraint con\r\n JOIN pg_class c ON c.oid = con.conrelid\r\n JOIN pg_namespace n ON n.oid = c.relnamespace\r\n JOIN unnest(con.conkey) WITH ORDINALITY AS ck(attnum, ordinality) ON TRUE\r\n JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = ck.attnum\r\n WHERE con.contype = 'p'\r\n AND n.nspname = ANY($1::text[])\r\n GROUP BY n.nspname, c.relname\r\n ORDER BY n.nspname, c.relname;\r\n `,\r\n foreignKeys: `\r\n SELECT\r\n sn.nspname AS source_schema,\r\n sc.relname AS source_table,\r\n con.conname AS constraint_name,\r\n ARRAY_AGG(sa.attname ORDER BY cols.ordinality) AS source_columns,\r\n tn.nspname AS target_schema,\r\n tc.relname AS target_table,\r\n ARRAY_AGG(ta.attname ORDER BY cols.ordinality) AS target_columns,\r\n EXISTS (\r\n SELECT 1\r\n FROM pg_constraint uq\r\n WHERE uq.conrelid = con.conrelid\r\n AND uq.contype IN ('p', 'u')\r\n AND uq.conkey = con.conkey\r\n ) AS source_is_unique\r\n FROM pg_constraint con\r\n JOIN pg_class sc ON sc.oid = con.conrelid\r\n JOIN pg_namespace sn ON sn.oid = sc.relnamespace\r\n JOIN pg_class tc ON tc.oid = con.confrelid\r\n JOIN pg_namespace tn ON tn.oid = tc.relnamespace\r\n JOIN unnest(con.conkey, con.confkey) WITH ORDINALITY AS cols(source_attnum, target_attnum, ordinality) ON TRUE\r\n JOIN pg_attribute sa ON sa.attrelid = con.conrelid AND sa.attnum = cols.source_attnum\r\n JOIN pg_attribute ta ON ta.attrelid = con.confrelid AND ta.attnum = cols.target_attnum\r\n WHERE con.contype = 'f'\r\n AND sn.nspname = ANY($1::text[])\r\n AND tn.nspname = ANY($1::text[])\r\n GROUP BY\r\n sn.nspname,\r\n sc.relname,\r\n con.conname,\r\n tn.nspname,\r\n tc.relname,\r\n con.conkey,\r\n con.conrelid\r\n ORDER BY sn.nspname, sc.relname, con.conname;\r\n `,\r\n} as const\r\n\r\nfunction tableKey(schema: string, table: string): string {\r\n return `${schema}.${table}`\r\n}\r\n\r\nfunction relationKey(...parts: string[]): string {\r\n const base = parts\r\n .join('_')\r\n .replace(/[^A-Za-z0-9_]+/g, '_')\r\n .replace(/^_+|_+$/g, '')\r\n return base.length > 0 ? base : 'relation'\r\n}\r\n\r\nfunction toTypeKind(code: string): IntrospectionColumn['typeKind'] {\r\n switch (code) {\r\n case 'e':\r\n return 'enum'\r\n case 'd':\r\n return 'domain'\r\n case 'r':\r\n return 'range'\r\n case 'm':\r\n return 'multirange'\r\n case 'c':\r\n return 'composite'\r\n default:\r\n return 'scalar'\r\n }\r\n}\r\n\r\nfunction escapeSqlLiteral(value: string): string {\r\n return value.replace(/'/g, \"''\")\r\n}\r\n\r\nfunction parsePostgresArrayLiteral(text: string): string[] {\r\n const body = text.slice(1, -1).trim()\r\n if (!body) return []\r\n\r\n const values: string[] = []\r\n let current = ''\r\n let inQuotes = false\r\n let escaped = false\r\n\r\n for (const char of body) {\r\n if (escaped) {\r\n current += char\r\n escaped = false\r\n continue\r\n }\r\n if (char === '\\\\') {\r\n escaped = true\r\n continue\r\n }\r\n if (char === '\"') {\r\n inQuotes = !inQuotes\r\n continue\r\n }\r\n if (char === ',' && !inQuotes) {\r\n values.push(current)\r\n current = ''\r\n continue\r\n }\r\n current += char\r\n }\r\n\r\n values.push(current)\r\n return values.map(value => value.trim()).filter(value => value.length > 0)\r\n}\r\n\r\nfunction coerceStringArray(value: unknown): string[] {\r\n if (Array.isArray(value)) {\r\n return value\r\n .map(item => (typeof item === 'string' ? item : String(item)))\r\n .map(item => item.trim())\r\n .filter(item => item.length > 0)\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim()\r\n if (!trimmed) return []\r\n\r\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\r\n try {\r\n const parsed = JSON.parse(trimmed) as unknown\r\n return coerceStringArray(parsed)\r\n } catch {\r\n // Fall through to more permissive parsing paths.\r\n }\r\n }\r\n\r\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\r\n return parsePostgresArrayLiteral(trimmed)\r\n }\r\n\r\n return trimmed\r\n .split(',')\r\n .map(item => item.trim())\r\n .filter(item => item.length > 0)\r\n }\r\n\r\n return []\r\n}\r\n\r\nexport function buildSchemaArrayLiteral(schemas: string[]): string {\r\n const normalized = schemas.length > 0 ? schemas : ['public']\r\n const literals = normalized.map(schema => `'${escapeSqlLiteral(schema)}'`).join(', ')\r\n return `ARRAY[${literals}]`\r\n}\r\n\r\nfunction inlineSchemaLiteral(sql: string, schemas: string[]): string {\r\n const schemaArray = `${buildSchemaArrayLiteral(schemas)}::text[]`\r\n return sql.replace(/\\$1::text\\[\\]/g, schemaArray)\r\n}\r\n\r\nexport function buildGatewayCatalogQueries(schemas: string[]): {\r\n columns: string\r\n enums: string\r\n primaryKeys: string\r\n foreignKeys: string\r\n} {\r\n return {\r\n columns: inlineSchemaLiteral(POSTGRES_CATALOG_SQL.columns, schemas),\r\n enums: POSTGRES_CATALOG_SQL.enums,\r\n primaryKeys: inlineSchemaLiteral(POSTGRES_CATALOG_SQL.primaryKeys, schemas),\r\n foreignKeys: inlineSchemaLiteral(POSTGRES_CATALOG_SQL.foreignKeys, schemas),\r\n }\r\n}\r\n\r\nexport class PostgresCatalogSnapshotAssembler {\r\n private readonly schemas: Record<string, IntrospectionSchema> = {}\r\n\r\n addColumnRows(columnRows: ColumnQueryRow[], enumMap: Map<number, string[]>) {\r\n for (const row of columnRows) {\r\n const table = this.ensureTable(row.schema_name, row.table_name)\r\n table.columns[row.column_name] = {\r\n name: row.column_name,\r\n dataType: row.data_type,\r\n udtName: row.udt_name,\r\n typeKind: toTypeKind(row.type_kind_code),\r\n isNullable: row.is_nullable,\r\n isPrimaryKey: false,\r\n hasDefault: row.has_default,\r\n isGenerated: row.is_generated,\r\n arrayDimensions: row.array_dimensions ?? 0,\r\n enumValues: enumMap.get(row.type_oid),\r\n }\r\n }\r\n }\r\n\r\n addPrimaryKeyRows(primaryKeyRows: PrimaryKeyQueryRow[]) {\r\n for (const row of primaryKeyRows) {\r\n const table = this.ensureTable(row.schema_name, row.table_name)\r\n const primaryKeyColumns = coerceStringArray(row.columns)\r\n row.columns = primaryKeyColumns\r\n table.primaryKey = primaryKeyColumns\r\n for (const columnName of primaryKeyColumns) {\r\n const column = table.columns[columnName]\r\n if (column) {\r\n column.isPrimaryKey = true\r\n }\r\n }\r\n }\r\n }\r\n\r\n addForeignKeyRows(foreignKeyRows: ForeignKeyQueryRow[]) {\r\n for (const row of foreignKeyRows) {\r\n const sourceTable = this.ensureTable(row.source_schema, row.source_table)\r\n const targetTable = this.ensureTable(row.target_schema, row.target_table)\r\n const sourceColumns = coerceStringArray(row.source_columns)\r\n const targetColumns = coerceStringArray(row.target_columns)\r\n row.source_columns = sourceColumns\r\n row.target_columns = targetColumns\r\n\r\n const sourceRelationKind: ModelRelationKind = row.source_is_unique ? 'one-to-one' : 'many-to-one'\r\n this.upsertRelation(sourceTable, relationKey(row.constraint_name, row.target_table), {\r\n name: row.constraint_name,\r\n kind: sourceRelationKind,\r\n sourceColumns,\r\n targetSchema: row.target_schema,\r\n targetModel: row.target_table,\r\n targetColumns,\r\n })\r\n\r\n const targetRelationKind: ModelRelationKind = row.source_is_unique ? 'one-to-one' : 'one-to-many'\r\n this.upsertRelation(targetTable, relationKey(row.source_table), {\r\n name: relationKey(row.source_table, row.constraint_name),\r\n kind: targetRelationKind,\r\n sourceColumns: targetColumns,\r\n targetSchema: row.source_schema,\r\n targetModel: row.source_table,\r\n targetColumns: sourceColumns,\r\n })\r\n }\r\n }\r\n\r\n addManyToManyRows(foreignKeyRows: ForeignKeyQueryRow[]) {\r\n const bySourceTable = new Map<string, BridgeCandidate>()\r\n for (const fk of foreignKeyRows) {\r\n const key = tableKey(fk.source_schema, fk.source_table)\r\n const current = bySourceTable.get(key) ?? {\r\n schema: fk.source_schema,\r\n table: fk.source_table,\r\n foreignKeys: [],\r\n }\r\n current.foreignKeys.push(fk)\r\n bySourceTable.set(key, current)\r\n }\r\n\r\n for (const candidate of bySourceTable.values()) {\r\n const bridgeTable = this.schemas[candidate.schema]?.tables[candidate.table]\r\n if (!bridgeTable) continue\r\n\r\n const primaryKey = bridgeTable.primaryKey\r\n if (candidate.foreignKeys.length !== 2 || primaryKey.length === 0) continue\r\n\r\n const combinedForeignColumns = Array.from(\r\n new Set(candidate.foreignKeys.flatMap(fk => fk.source_columns)),\r\n )\r\n if (\r\n combinedForeignColumns.length !== primaryKey.length ||\r\n !primaryKey.every(column => combinedForeignColumns.includes(column))\r\n ) {\r\n continue\r\n }\r\n\r\n const [first, second] = candidate.foreignKeys\r\n const firstTarget = this.schemas[first.target_schema]?.tables[first.target_table]\r\n const secondTarget = this.schemas[second.target_schema]?.tables[second.target_table]\r\n if (!firstTarget || !secondTarget) {\r\n continue\r\n }\r\n\r\n this.upsertRelation(firstTarget, relationKey(second.target_table), {\r\n name: relationKey(candidate.table, first.constraint_name, second.constraint_name),\r\n kind: 'many-to-many',\r\n sourceColumns: first.target_columns,\r\n targetSchema: second.target_schema,\r\n targetModel: second.target_table,\r\n targetColumns: second.target_columns,\r\n through: {\r\n schema: candidate.schema,\r\n model: candidate.table,\r\n sourceColumns: first.source_columns,\r\n targetColumns: second.source_columns,\r\n },\r\n })\r\n\r\n this.upsertRelation(secondTarget, relationKey(first.target_table), {\r\n name: relationKey(candidate.table, second.constraint_name, first.constraint_name),\r\n kind: 'many-to-many',\r\n sourceColumns: second.target_columns,\r\n targetSchema: first.target_schema,\r\n targetModel: first.target_table,\r\n targetColumns: first.target_columns,\r\n through: {\r\n schema: candidate.schema,\r\n model: candidate.table,\r\n sourceColumns: second.source_columns,\r\n targetColumns: first.source_columns,\r\n },\r\n })\r\n }\r\n }\r\n\r\n toSchemas(): Record<string, IntrospectionSchema> {\r\n return this.schemas\r\n }\r\n\r\n private ensureTable(schemaName: string, tableName: string): IntrospectionTable {\r\n if (!this.schemas[schemaName]) {\r\n this.schemas[schemaName] = {\r\n name: schemaName,\r\n tables: {},\r\n }\r\n }\r\n\r\n const schema = this.schemas[schemaName]\r\n if (!schema.tables[tableName]) {\r\n schema.tables[tableName] = {\r\n schema: schemaName,\r\n name: tableName,\r\n columns: {},\r\n primaryKey: [],\r\n relations: {},\r\n }\r\n }\r\n\r\n return schema.tables[tableName]\r\n }\r\n\r\n private upsertRelation(\r\n table: IntrospectionTable,\r\n baseKey: string,\r\n relation: IntrospectionRelation,\r\n ) {\r\n let key = baseKey\r\n let suffix = 2\r\n while (table.relations[key]) {\r\n key = `${baseKey}_${suffix}`\r\n suffix += 1\r\n }\r\n table.relations[key] = relation\r\n }\r\n}\r\n","import { Pool } from 'pg'\r\nimport type {\r\n IntrospectionInspectOptions,\r\n IntrospectionSnapshot,\r\n SchemaIntrospectionProvider,\r\n} from './types.ts'\r\nimport {\r\n type ColumnQueryRow,\r\n type EnumQueryRow,\r\n type ForeignKeyQueryRow,\r\n type PrimaryKeyQueryRow,\r\n POSTGRES_CATALOG_SQL,\r\n PostgresCatalogSnapshotAssembler,\r\n} from './postgres-introspection-core.ts'\r\n\r\n/**\r\n * Constructor options for the PostgreSQL introspection provider.\r\n */\r\nexport interface PostgresIntrospectionProviderOptions {\r\n connectionString: string\r\n database?: string\r\n}\r\n\r\nclass PgCatalogClient {\r\n constructor(private readonly pool: Pool) {}\r\n\r\n async queryColumns(schemas: string[]): Promise<ColumnQueryRow[]> {\r\n const result = await this.pool.query<ColumnQueryRow>(POSTGRES_CATALOG_SQL.columns, [schemas])\r\n return result.rows\r\n }\r\n\r\n async queryEnums(): Promise<Map<number, string[]>> {\r\n const result = await this.pool.query<EnumQueryRow>(POSTGRES_CATALOG_SQL.enums)\r\n const enumMap = new Map<number, string[]>()\r\n for (const row of result.rows) {\r\n const existing = enumMap.get(row.type_oid) ?? []\r\n existing.push(row.enum_label)\r\n enumMap.set(row.type_oid, existing)\r\n }\r\n return enumMap\r\n }\r\n\r\n async queryPrimaryKeys(schemas: string[]): Promise<PrimaryKeyQueryRow[]> {\r\n const result = await this.pool.query<PrimaryKeyQueryRow>(POSTGRES_CATALOG_SQL.primaryKeys, [schemas])\r\n return result.rows\r\n }\r\n\r\n async queryForeignKeys(schemas: string[]): Promise<ForeignKeyQueryRow[]> {\r\n const result = await this.pool.query<ForeignKeyQueryRow>(POSTGRES_CATALOG_SQL.foreignKeys, [schemas])\r\n return result.rows\r\n }\r\n}\r\n\r\nclass PostgresIntrospectionProvider implements SchemaIntrospectionProvider {\r\n readonly backend = 'postgresql' as const\r\n\r\n private readonly connectionString: string\r\n private readonly database: string\r\n\r\n constructor(options: PostgresIntrospectionProviderOptions) {\r\n this.connectionString = options.connectionString\r\n this.database = options.database ?? 'postgres'\r\n }\r\n\r\n async inspect(options?: IntrospectionInspectOptions): Promise<IntrospectionSnapshot> {\r\n const schemas = options?.schemas && options.schemas.length > 0 ? options.schemas : ['public']\r\n const pool = new Pool({\r\n connectionString: this.connectionString,\r\n })\r\n const catalogClient = new PgCatalogClient(pool)\r\n\r\n try {\r\n const [columnRows, enumMap, primaryKeyRows, foreignKeyRows] = await Promise.all([\r\n catalogClient.queryColumns(schemas),\r\n catalogClient.queryEnums(),\r\n catalogClient.queryPrimaryKeys(schemas),\r\n catalogClient.queryForeignKeys(schemas),\r\n ])\r\n\r\n const assembler = new PostgresCatalogSnapshotAssembler()\r\n assembler.addColumnRows(columnRows, enumMap)\r\n assembler.addPrimaryKeyRows(primaryKeyRows)\r\n assembler.addForeignKeyRows(foreignKeyRows)\r\n assembler.addManyToManyRows(foreignKeyRows)\r\n\r\n return {\r\n backend: 'postgresql',\r\n database: this.database,\r\n generatedAt: new Date().toISOString(),\r\n schemas: assembler.toSchemas(),\r\n }\r\n } finally {\r\n await pool.end()\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates a PostgreSQL-backed schema introspection provider.\r\n */\r\nexport function createPostgresIntrospectionProvider(\r\n options: PostgresIntrospectionProviderOptions,\r\n): SchemaIntrospectionProvider {\r\n return new PostgresIntrospectionProvider(options)\r\n}\r\n","import { createClient, type AthenaSdkClient } from '../client.ts'\r\nimport {\r\n buildGatewayCatalogQueries,\r\n PostgresCatalogSnapshotAssembler,\r\n type ColumnQueryRow,\r\n type EnumQueryRow,\r\n type ForeignKeyQueryRow,\r\n type PrimaryKeyQueryRow,\r\n} from '../schema/postgres-introspection-core.ts'\r\nimport { createPostgresIntrospectionProvider } from '../schema/postgres-provider.ts'\r\nimport type {\r\n IntrospectionInspectOptions,\r\n IntrospectionSnapshot,\r\n SchemaIntrospectionProvider,\r\n} from '../schema/types.ts'\r\nimport type {\r\n GeneratorExperimentalFlags,\r\n GeneratorProviderConfig,\r\n PostgresDirectProviderConfig,\r\n PostgresGatewayProviderConfig,\r\n ScyllaDirectProviderConfig,\r\n} from './types.ts'\r\n\r\nclass AthenaGatewayCatalogClient {\r\n constructor(private readonly client: AthenaSdkClient) {}\r\n\r\n async queryRows<T extends Record<string, unknown>>(query: string): Promise<T[]> {\r\n const result = await this.client.query<T>(query)\r\n if (result.error || result.status < 200 || result.status >= 300) {\r\n throw new Error(result.error ?? `Gateway query failed with status ${result.status}`)\r\n }\r\n return result.data ?? []\r\n }\r\n\r\n async queryColumns(query: string): Promise<ColumnQueryRow[]> {\r\n return this.queryRows<ColumnQueryRow>(query)\r\n }\r\n\r\n async queryEnums(query: string): Promise<Map<number, string[]>> {\r\n const rows = await this.queryRows<EnumQueryRow>(query)\r\n const enumMap = new Map<number, string[]>()\r\n for (const row of rows) {\r\n const existing = enumMap.get(row.type_oid) ?? []\r\n existing.push(row.enum_label)\r\n enumMap.set(row.type_oid, existing)\r\n }\r\n return enumMap\r\n }\r\n\r\n async queryPrimaryKeys(query: string): Promise<PrimaryKeyQueryRow[]> {\r\n return this.queryRows<PrimaryKeyQueryRow>(query)\r\n }\r\n\r\n async queryForeignKeys(query: string): Promise<ForeignKeyQueryRow[]> {\r\n return this.queryRows<ForeignKeyQueryRow>(query)\r\n }\r\n}\r\n\r\nclass AthenaGatewayPostgresIntrospectionProvider implements SchemaIntrospectionProvider {\r\n readonly backend = 'postgresql' as const\r\n\r\n private readonly client: AthenaSdkClient\r\n\r\n constructor(private readonly config: PostgresGatewayProviderConfig) {\r\n this.client = createClient(this.config.gatewayUrl, this.config.apiKey, {\r\n backend: {\r\n type: this.config.backend ?? 'postgresql',\r\n },\r\n })\r\n }\r\n\r\n async inspect(options?: IntrospectionInspectOptions): Promise<IntrospectionSnapshot> {\r\n const schemas =\r\n options?.schemas && options.schemas.length > 0\r\n ? options.schemas\r\n : this.config.schemas && this.config.schemas.length > 0\r\n ? this.config.schemas\r\n : ['public']\r\n\r\n const catalogClient = new AthenaGatewayCatalogClient(this.client)\r\n const queries = buildGatewayCatalogQueries(schemas)\r\n\r\n const [columnRows, enumMap, primaryKeyRows, foreignKeyRows] = await Promise.all([\r\n catalogClient.queryColumns(queries.columns),\r\n catalogClient.queryEnums(queries.enums),\r\n catalogClient.queryPrimaryKeys(queries.primaryKeys),\r\n catalogClient.queryForeignKeys(queries.foreignKeys),\r\n ])\r\n\r\n const assembler = new PostgresCatalogSnapshotAssembler()\r\n assembler.addColumnRows(columnRows, enumMap)\r\n assembler.addPrimaryKeyRows(primaryKeyRows)\r\n assembler.addForeignKeyRows(foreignKeyRows)\r\n assembler.addManyToManyRows(foreignKeyRows)\r\n\r\n return {\r\n backend: 'postgresql',\r\n database: this.config.database,\r\n generatedAt: new Date().toISOString(),\r\n schemas: assembler.toSchemas(),\r\n }\r\n }\r\n}\r\n\r\nclass ScyllaIntrospectionProvider implements SchemaIntrospectionProvider {\r\n readonly backend = 'scylladb' as const\r\n\r\n constructor(private readonly config: ScyllaDirectProviderConfig) {}\r\n\r\n async inspect(): Promise<IntrospectionSnapshot> {\r\n throw new Error(\r\n `Scylla introspection provider is not implemented yet for keyspace ${this.config.keyspace}.`,\r\n )\r\n }\r\n}\r\n\r\nfunction createPostgresProvider(config: PostgresDirectProviderConfig): SchemaIntrospectionProvider {\r\n return createPostgresIntrospectionProvider({\r\n connectionString: config.connectionString,\r\n database: config.database,\r\n })\r\n}\r\n\r\n/**\r\n * Resolves a runtime introspection provider from generator config.\r\n */\r\nexport function resolveGeneratorProvider(\r\n providerConfig: GeneratorProviderConfig,\r\n experimentalFlags: GeneratorExperimentalFlags,\r\n): SchemaIntrospectionProvider {\r\n if (providerConfig.kind === 'postgres' && providerConfig.mode === 'direct') {\r\n return createPostgresProvider(providerConfig)\r\n }\r\n\r\n if (providerConfig.kind === 'postgres' && providerConfig.mode === 'gateway') {\r\n return new AthenaGatewayPostgresIntrospectionProvider(providerConfig)\r\n }\r\n\r\n if (providerConfig.kind === 'scylla') {\r\n if (!experimentalFlags.scyllaProviderContracts) {\r\n throw new Error(\r\n 'Scylla provider contracts are disabled. Set experimental.scyllaProviderContracts=true to enable placeholders.',\r\n )\r\n }\r\n return new ScyllaIntrospectionProvider(providerConfig)\r\n }\r\n\r\n throw new Error(`Unsupported generator provider kind: ${(providerConfig as { kind?: string }).kind ?? 'unknown'}`)\r\n}\r\n","import { mkdir, writeFile } from 'fs/promises'\r\nimport { dirname, resolve } from 'path'\r\nimport { generateArtifactsFromSnapshot } from './renderer.ts'\r\nimport { loadGeneratorConfig } from './config.ts'\r\nimport { resolveGeneratorProvider } from './providers.ts'\r\nimport type {\r\n GeneratedArtifact,\r\n GeneratorProviderConfig,\r\n LoadGeneratorConfigOptions,\r\n RunGeneratorOptions,\r\n RunGeneratorResult,\r\n} from './types.ts'\r\n\r\nfunction extractProviderSchemas(providerConfig: GeneratorProviderConfig): string[] | undefined {\r\n if (!('schemas' in providerConfig) || !providerConfig.schemas || providerConfig.schemas.length === 0) {\r\n return undefined\r\n }\r\n return providerConfig.schemas\r\n}\r\n\r\nasync function writeArtifacts(\r\n files: GeneratedArtifact[],\r\n cwd: string,\r\n): Promise<string[]> {\r\n const writtenFiles: string[] = []\r\n\r\n for (const file of files) {\r\n const absolutePath = resolve(cwd, file.path)\r\n await mkdir(dirname(absolutePath), { recursive: true })\r\n await writeFile(absolutePath, file.content, 'utf8')\r\n writtenFiles.push(file.path)\r\n }\r\n\r\n return writtenFiles\r\n}\r\n\r\n/**\r\n * End-to-end generator execution: load config, introspect, render, and optionally write files.\r\n */\r\nexport async function runSchemaGenerator(options: RunGeneratorOptions = {}): Promise<RunGeneratorResult> {\r\n const cwd = options.cwd ?? process.cwd()\r\n const configOptions: LoadGeneratorConfigOptions = {\r\n cwd,\r\n configPath: options.configPath,\r\n }\r\n\r\n const { configPath, config } = await loadGeneratorConfig(configOptions)\r\n const provider = options.provider ?? resolveGeneratorProvider(config.provider, config.experimental)\r\n\r\n const snapshot = await provider.inspect({\r\n schemas: extractProviderSchemas(config.provider),\r\n })\r\n\r\n const generated = generateArtifactsFromSnapshot(snapshot, config)\r\n const writtenFiles = options.dryRun ? [] : await writeArtifacts(generated.files, cwd)\r\n\r\n return {\r\n ...generated,\r\n configPath,\r\n writtenFiles,\r\n }\r\n}\r\n","import { runSchemaGenerator } from '../generator/pipeline.ts'\n\ninterface GenerateCommand {\n command: 'generate'\n configPath?: string\n dryRun: boolean\n}\n\ninterface HelpCommand {\n command: 'help'\n topic: 'root' | 'generate'\n}\n\ntype CliCommand = GenerateCommand | HelpCommand\n\nexport interface CliRuntime {\n runGenerator?: typeof runSchemaGenerator\n log?: (message: string) => void\n}\n\ntype ErrorWithCode = {\n code?: unknown\n message?: unknown\n}\n\nfunction rootUsage(): string {\n return [\n 'athena-js CLI',\n '',\n 'Usage:',\n ' athena-js generate [--config <path>] [--dry-run]',\n '',\n 'Examples:',\n ' athena-js generate',\n ' athena-js generate --config ./athena.config.ts --dry-run',\n ' athena-js generate --help',\n ].join('\\n')\n}\n\nfunction generateUsage(): string {\n return [\n 'athena-js generate',\n '',\n 'Usage:',\n ' athena-js generate [--config <path>] [--dry-run]',\n '',\n 'Options:',\n ' --config <path> Explicit path to athena.config.ts or athena-js.config.ts',\n ' --dry-run Build generated files in memory without writing them to disk',\n ' -h, --help Show help for generate',\n '',\n 'Examples:',\n ' athena-js generate',\n ' athena-js generate --config ./athena.config.ts --dry-run',\n ].join('\\n')\n}\n\nexport function usage(topic: HelpCommand['topic'] = 'root'): string {\n return topic === 'generate' ? generateUsage() : rootUsage()\n}\n\nexport function parseCommand(argv: string[]): CliCommand {\n if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {\n return { command: 'help', topic: 'root' }\n }\n\n if (argv[0] === 'help') {\n if (argv.length === 1) {\n return { command: 'help', topic: 'root' }\n }\n\n if (argv[1] === 'generate') {\n return { command: 'help', topic: 'generate' }\n }\n\n throw new Error(`Unknown command \"${argv[1]}\".`)\n }\n\n const [command, ...rest] = argv\n if (command !== 'generate') {\n throw new Error(`Unknown command \"${command}\".`)\n }\r\n\r\n let configPath: string | undefined\r\n let dryRun = false\n\n for (let index = 0; index < rest.length; index += 1) {\n const token = rest[index]\n if (token === '--help' || token === '-h') {\n return { command: 'help', topic: 'generate' }\n }\n\n if (token === '--dry-run') {\n dryRun = true\n continue\n }\n\n if (token === '--config') {\n const nextValue = rest[index + 1]\n if (!nextValue || nextValue.startsWith('-')) {\n throw new Error('Missing value for --config option.')\n }\n configPath = nextValue\n index += 1\n continue\n }\r\n\r\n throw new Error(`Unknown option \"${token}\".`)\r\n }\r\n\r\n return {\r\n command: 'generate',\r\n configPath,\r\n dryRun,\n }\n}\n\nfunction normalizeErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message\n }\n if (typeof error === 'string') {\n return error\n }\n return 'Unknown generator error.'\n}\n\nfunction extractMissingDatabaseName(message: string): string | undefined {\n const match = message.match(/database \"([^\"]+)\" does not exist/i)\n return match?.[1]\n}\n\nfunction isErrorWithCode(error: unknown): error is ErrorWithCode {\n return typeof error === 'object' && error !== null && 'code' in error\n}\n\nfunction formatGeneratorError(error: unknown, configPath?: string): Error {\n if (isErrorWithCode(error) && error.code === '3D000') {\n const message = normalizeErrorMessage(error)\n const databaseName = extractMissingDatabaseName(message)\n const databaseLabel = databaseName\n ? `PostgreSQL database \"${databaseName}\" does not exist`\n : 'The target PostgreSQL database does not exist'\n const configLabel = configPath\n ? `config \"${configPath}\"`\n : 'the resolved athena config'\n\n return new Error(\n [\n `${databaseLabel} (code 3D000).`,\n `Update provider.connectionString (and provider.database, if set) in ${configLabel}, or create that database before running generate.`,\n ].join('\\n'),\n )\n }\n\n if (error instanceof Error) {\n return error\n }\n\n return new Error(normalizeErrorMessage(error))\n}\n\n/**\n * CLI entrypoint used by `bin/athena-js.js`.\n */\nexport async function runCLI(argv: string[], runtime: CliRuntime = {}): Promise<void> {\n const log = runtime.log ?? console.log\n const runGenerator = runtime.runGenerator ?? runSchemaGenerator\n const parsed = parseCommand(argv)\n if (parsed.command === 'help') {\n log(usage(parsed.topic))\n return\n }\n\n let result: Awaited<ReturnType<typeof runSchemaGenerator>>\n try {\n result = await runGenerator({\n configPath: parsed.configPath,\n dryRun: parsed.dryRun,\n })\n } catch (error) {\n throw formatGeneratorError(error, parsed.configPath)\n }\n\n if (parsed.dryRun) {\n log(`[dry-run] Generated ${result.files.length} files from ${result.configPath}`)\n for (const file of result.files) {\n log(` - ${file.path}`)\n }\n return\n }\n\n log(`Generated ${result.writtenFiles.length} files from ${result.configPath}`)\n for (const filePath of result.writtenFiles) {\n log(` - ${filePath}`)\n }\n}\n"]}
|