@514labs/moose-lib 0.6.277 → 0.6.278

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/compilerPlugin.ts","../src/compilerPluginHelper.ts","../src/commons.ts","../src/dmv2/dataModelMetadata.ts","../src/dataModels/typeConvert.ts","../src/dataModels/enumConvert.ts","../src/dataModels/dataModelTypes.ts","../src/dataModels/types.ts","../src/utilities/json.ts","../src/consumption-apis/typiaValidation.ts"],"sourcesContent":["import ts, { factory } from \"typescript\";\nimport { avoidTypiaNameClash, replaceProgram } from \"./compilerPluginHelper\";\nimport { compilerLog } from \"./commons\";\nimport {\n isNewMooseResourceWithTypeParam,\n transformNewMooseResource,\n} from \"./dmv2/dataModelMetadata\";\nimport {\n isCreateApi,\n isCreateApiV2,\n transformCreateApi,\n transformLegacyApi,\n} from \"./consumption-apis/typiaValidation\";\n\n/**\n * Creates the typia import statement to avoid name clashes\n */\nexport const createTypiaImport = () =>\n factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n false,\n factory.createIdentifier(avoidTypiaNameClash),\n undefined,\n ),\n factory.createStringLiteral(\"typia\"),\n undefined,\n );\n\n/**\n * Applies the appropriate transformation based on node type\n * Returns both the transformed node and whether a transformation occurred\n */\nconst applyTransformation = (\n node: ts.Node,\n typeChecker: ts.TypeChecker,\n): { transformed: ts.Node; wasTransformed: boolean } => {\n if (isCreateApi(node, typeChecker)) {\n compilerLog(\"[CompilerPlugin] Found legacy API, transforming...\");\n return {\n transformed: transformLegacyApi(node, typeChecker),\n wasTransformed: true,\n };\n }\n\n if (isCreateApiV2(node, typeChecker)) {\n compilerLog(\"[CompilerPlugin] Found API v2, transforming...\");\n return {\n transformed: transformCreateApi(node, typeChecker),\n wasTransformed: true,\n };\n }\n\n if (isNewMooseResourceWithTypeParam(node, typeChecker)) {\n compilerLog(\n \"[CompilerPlugin] Found Moose resource with type param, transforming...\",\n );\n return {\n transformed: transformNewMooseResource(node, typeChecker),\n wasTransformed: true,\n };\n }\n\n return { transformed: node, wasTransformed: false };\n};\n\n/**\n * Checks if typia import already exists in the source file\n */\nconst hasExistingTypiaImport = (sourceFile: ts.SourceFile): boolean => {\n const hasImport = sourceFile.statements.some((stmt) => {\n if (\n !ts.isImportDeclaration(stmt) ||\n !ts.isStringLiteral(stmt.moduleSpecifier)\n ) {\n return false;\n }\n\n if (stmt.moduleSpecifier.text !== \"typia\") {\n return false;\n }\n\n // Check if it has our specific aliased import\n const importClause = stmt.importClause;\n if (\n importClause &&\n importClause.name &&\n importClause.name.text === avoidTypiaNameClash\n ) {\n return true;\n }\n\n return false;\n });\n compilerLog(\n `[CompilerPlugin] Checking for existing typia import (${avoidTypiaNameClash}) in ${sourceFile.fileName}: ${hasImport}`,\n );\n return hasImport;\n};\n\n/**\n * Adds typia import to the source file if transformations were applied\n */\nconst addTypiaImport = (sourceFile: ts.SourceFile): ts.SourceFile => {\n if (hasExistingTypiaImport(sourceFile)) {\n compilerLog(\n `[CompilerPlugin] Typia import already exists in ${sourceFile.fileName}, skipping...`,\n );\n return sourceFile;\n }\n\n compilerLog(`[CompilerPlugin] Adding typia import to ${sourceFile.fileName}`);\n const statementsWithImport = factory.createNodeArray([\n createTypiaImport(),\n ...sourceFile.statements,\n ]);\n\n return factory.updateSourceFile(sourceFile, statementsWithImport);\n};\n\n/**\n * Main transformation function that processes TypeScript source files\n */\nconst transform =\n (typeChecker: ts.TypeChecker) =>\n (_context: ts.TransformationContext) =>\n (sourceFile: ts.SourceFile): ts.SourceFile => {\n compilerLog(\n `\\n[CompilerPlugin] ========== Processing file: ${sourceFile.fileName} ==========`,\n );\n\n let transformationCount = 0;\n let hasTypiaTransformations = false;\n\n const visitNode = (node: ts.Node): ts.Node => {\n // Apply transformation and check if it was transformed\n const { transformed, wasTransformed } = applyTransformation(\n node,\n typeChecker,\n );\n\n if (wasTransformed) {\n transformationCount++;\n hasTypiaTransformations = true;\n compilerLog(\n `[CompilerPlugin] Transformation #${transformationCount} applied at position ${node.pos}`,\n );\n }\n\n return ts.visitEachChild(transformed, visitNode, undefined);\n };\n\n const transformedSourceFile = ts.visitEachChild(\n sourceFile,\n visitNode,\n undefined,\n );\n\n compilerLog(\n `[CompilerPlugin] Total transformations applied: ${transformationCount}`,\n );\n\n // Use transformation tracking instead of scanning for typia references\n compilerLog(\n `[CompilerPlugin] Needs typia import: ${hasTypiaTransformations}`,\n );\n\n if (hasTypiaTransformations) {\n const result = addTypiaImport(transformedSourceFile);\n compilerLog(\n `[CompilerPlugin] ========== Completed processing ${sourceFile.fileName} (with import) ==========\\n`,\n );\n return result;\n } else {\n compilerLog(\n `[CompilerPlugin] ========== Completed processing ${sourceFile.fileName} (no import needed) ==========\\n`,\n );\n return transformedSourceFile;\n }\n };\n\nexport default replaceProgram(transform);\n","import ts, { factory, TypeNode } from \"typescript\";\nimport path from \"path\";\nimport { PluginConfig, ProgramTransformerExtras } from \"ts-patch\";\nimport process from \"process\";\nimport fs from \"node:fs\";\n\nexport const getPatchedHost = (\n maybeHost: ts.CompilerHost | undefined,\n tsInstance: typeof ts,\n compilerOptions: ts.CompilerOptions,\n): ts.CompilerHost & { fileCache: Map<string, ts.SourceFile> } => {\n const fileCache = new Map();\n const compilerHost =\n maybeHost ?? tsInstance.createCompilerHost(compilerOptions, true);\n const originalGetSourceFile = compilerHost.getSourceFile;\n\n return Object.assign(compilerHost, {\n getSourceFile(fileName: string, languageVersion: ts.ScriptTarget) {\n fileName = tsInstance.server.toNormalizedPath(fileName);\n if (fileCache.has(fileName)) return fileCache.get(fileName);\n\n const sourceFile = originalGetSourceFile.apply(\n void 0,\n Array.from(arguments) as any,\n );\n fileCache.set(fileName, sourceFile);\n\n return sourceFile;\n },\n fileCache,\n });\n};\n\nexport const isMooseFile = (sourceFile: ts.SourceFile): boolean => {\n const location: string = path.resolve(sourceFile.fileName);\n\n return (\n location.includes(\"@514labs/moose-lib\") ||\n // workaround for e2e test\n location.includes(\"packages/ts-moose-lib/dist\") ||\n // support local development with symlinked packages\n location.includes(\"packages/ts-moose-lib/src\")\n );\n};\n\nexport const replaceProgram =\n (\n transform: (\n typeChecker: ts.TypeChecker,\n ) => (\n _context: ts.TransformationContext,\n ) => (sourceFile: ts.SourceFile) => ts.SourceFile,\n ) =>\n (\n program: ts.Program,\n host: ts.CompilerHost | undefined,\n config: PluginConfig,\n { ts: tsInstance }: ProgramTransformerExtras,\n ): ts.Program => {\n const transformFunction = transform(program.getTypeChecker());\n\n const compilerOptions = program.getCompilerOptions();\n\n const compilerHost = getPatchedHost(host, tsInstance, compilerOptions);\n const rootFileNames = program\n .getRootFileNames()\n .map(tsInstance.server.toNormalizedPath);\n\n const transformedSource = tsInstance.transform(\n program.getSourceFiles().filter(\n (sourceFile) =>\n // relative path, or\n !sourceFile.fileName.startsWith(\"/\") ||\n // current directory but not in node_modules\n (sourceFile.fileName.startsWith(`${process.cwd()}`) &&\n !sourceFile.fileName.startsWith(`${process.cwd()}/node_modules`)),\n ),\n [transformFunction],\n compilerOptions,\n ).transformed;\n\n const { printFile } = tsInstance.createPrinter();\n for (const sourceFile of transformedSource) {\n const { fileName, languageVersion } = sourceFile;\n const newFile = printFile(sourceFile);\n\n try {\n const path = fileName.split(\"/\").pop() || fileName;\n const dir = `${process.cwd()}/.moose/api-compile-step/`;\n fs.mkdirSync(dir, {\n recursive: true,\n });\n fs.writeFileSync(`${dir}/${path}`, newFile);\n } catch (e) {\n // this file is just for debugging purposes\n // TODO even printing in std err will fail the import process\n }\n\n const updatedSourceFile = tsInstance.createSourceFile(\n fileName,\n newFile,\n languageVersion,\n );\n (updatedSourceFile as any).version = (sourceFile as any).version;\n compilerHost.fileCache.set(fileName, updatedSourceFile);\n }\n\n return tsInstance.createProgram(\n rootFileNames,\n compilerOptions,\n compilerHost,\n );\n };\n\nexport const avoidTypiaNameClash = \"____moose____typia\";\n\n// Wraps a type parameter with import(\"@514labs/moose-lib\").StripDateIntersection<>\nexport const sanitizeTypeParameter = (typeNode: TypeNode): ts.ImportTypeNode =>\n factory.createImportTypeNode(\n factory.createLiteralTypeNode(\n factory.createStringLiteral(\"@514labs/moose-lib\"),\n ),\n undefined,\n factory.createIdentifier(\"StripDateIntersection\"),\n [typeNode],\n false,\n );\n\nexport const typiaJsonSchemas = (typeNode: TypeNode) =>\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"json\"),\n ),\n factory.createIdentifier(\"schemas\"),\n ),\n [factory.createTupleTypeNode([sanitizeTypeParameter(typeNode)])],\n [],\n );\n","import http from \"http\";\nimport { createClient } from \"@clickhouse/client\";\nimport { KafkaJS } from \"@confluentinc/kafka-javascript\";\nimport { SASLOptions } from \"@confluentinc/kafka-javascript/types/kafkajs\";\nconst { Kafka } = KafkaJS;\ntype Kafka = KafkaJS.Kafka;\ntype Consumer = KafkaJS.Consumer;\nexport type Producer = KafkaJS.Producer;\n\n/**\n * Utility function for compiler-related logging that can be disabled via environment variable.\n * Set MOOSE_DISABLE_COMPILER_LOGS=true to suppress these logs (useful for testing environments).\n */\n\n/**\n * Returns true if the value is a common truthy string: \"1\", \"true\", \"yes\", \"on\" (case-insensitive).\n */\nfunction isTruthy(value: string | undefined): boolean {\n if (!value) return false;\n switch (value.trim().toLowerCase()) {\n case \"1\":\n case \"true\":\n case \"yes\":\n case \"on\":\n return true;\n default:\n return false;\n }\n}\n\nexport const compilerLog = (message: string) => {\n if (!isTruthy(process.env.MOOSE_DISABLE_COMPILER_LOGS)) {\n console.log(message);\n }\n};\n\nexport const antiCachePath = (path: string) =>\n `${path}?num=${Math.random().toString()}&time=${Date.now()}`;\n\nexport const getFileName = (filePath: string) => {\n const regex = /\\/([^\\/]+)\\.ts/;\n const matches = filePath.match(regex);\n if (matches && matches.length > 1) {\n return matches[1];\n }\n return \"\";\n};\n\ninterface ClientConfig {\n username: string;\n password: string;\n database: string;\n useSSL: string;\n host: string;\n port: string;\n}\n\nexport const getClickhouseClient = ({\n username,\n password,\n database,\n useSSL,\n host,\n port,\n}: ClientConfig) => {\n const protocol =\n useSSL === \"1\" || useSSL.toLowerCase() === \"true\" ? \"https\" : \"http\";\n console.log(`Connecting to Clickhouse at ${protocol}://${host}:${port}`);\n return createClient({\n url: `${protocol}://${host}:${port}`,\n username: username,\n password: password,\n database: database,\n application: \"moose\",\n // Note: wait_end_of_query is configured per operation type, not globally\n // to preserve SELECT query performance while ensuring INSERT/DDL reliability\n });\n};\n\nexport type CliLogData = {\n message_type?: \"Info\" | \"Success\" | \"Error\" | \"Highlight\";\n action: string;\n message: string;\n};\n\nexport const cliLog: (log: CliLogData) => void = (log) => {\n const req = http.request({\n port: parseInt(process.env.MOOSE_MANAGEMENT_PORT ?? \"5001\"),\n method: \"POST\",\n path: \"/logs\",\n });\n\n req.on(\"error\", (err: Error) => {\n console.log(`Error ${err.name} sending CLI log.`, err.message);\n });\n\n req.write(JSON.stringify({ message_type: \"Info\", ...log }));\n req.end();\n};\n\n/**\n * Method to change .ts, .cts, and .mts to .js, .cjs, and .mjs\n * This is needed because 'import' does not support .ts, .cts, and .mts\n */\nexport function mapTstoJs(filePath: string): string {\n return filePath\n .replace(/\\.ts$/, \".js\")\n .replace(/\\.cts$/, \".cjs\")\n .replace(/\\.mts$/, \".mjs\");\n}\n\nexport const MAX_RETRIES = 150;\nexport const MAX_RETRY_TIME_MS = 1000;\nexport const RETRY_INITIAL_TIME_MS = 100;\n\nexport const MAX_RETRIES_PRODUCER = 150;\nexport const RETRY_FACTOR_PRODUCER = 0.2;\n// Means all replicas need to acknowledge the message\nexport const ACKs = -1;\n\n/**\n * Creates the base producer configuration for Kafka.\n * Used by both the SDK stream publishing and streaming function workers.\n *\n * @param maxMessageBytes - Optional max message size in bytes (synced with topic config)\n * @returns Producer configuration object for the Confluent Kafka client\n */\nexport function createProducerConfig(maxMessageBytes?: number) {\n return {\n kafkaJS: {\n idempotent: false, // Not needed for at-least-once delivery\n acks: ACKs,\n retry: {\n retries: MAX_RETRIES_PRODUCER,\n maxRetryTime: MAX_RETRY_TIME_MS,\n },\n },\n \"linger.ms\": 0, // This is to make sure at least once delivery with immediate feedback on the send\n ...(maxMessageBytes && { \"message.max.bytes\": maxMessageBytes }),\n };\n}\n\n/**\n * Parses a comma-separated broker string into an array of valid broker addresses.\n * Handles whitespace trimming and filters out empty elements.\n *\n * @param brokerString - Comma-separated broker addresses (e.g., \"broker1:9092, broker2:9092, , broker3:9092\")\n * @returns Array of trimmed, non-empty broker addresses\n */\nconst parseBrokerString = (brokerString: string): string[] =>\n brokerString\n .split(\",\")\n .map((b) => b.trim())\n .filter((b) => b.length > 0);\n\nexport type KafkaClientConfig = {\n clientId: string;\n broker: string;\n securityProtocol?: string; // e.g. \"SASL_SSL\" or \"PLAINTEXT\"\n saslUsername?: string;\n saslPassword?: string;\n saslMechanism?: string; // e.g. \"scram-sha-256\", \"plain\"\n};\n\n/**\n * Dynamically creates and connects a KafkaJS producer using the provided configuration.\n * Returns a connected producer instance.\n *\n * @param cfg - Kafka client configuration\n * @param logger - Logger instance\n * @param maxMessageBytes - Optional max message size in bytes (synced with topic config)\n */\nexport async function getKafkaProducer(\n cfg: KafkaClientConfig,\n logger: Logger,\n maxMessageBytes?: number,\n): Promise<Producer> {\n const kafka = await getKafkaClient(cfg, logger);\n\n const producer = kafka.producer(createProducerConfig(maxMessageBytes));\n await producer.connect();\n return producer;\n}\n\n/**\n * Interface for logging functionality\n */\nexport interface Logger {\n logPrefix: string;\n log: (message: string) => void;\n error: (message: string) => void;\n warn: (message: string) => void;\n}\n\nexport const logError = (logger: Logger, e: Error): void => {\n logger.error(e.message);\n const stack = e.stack;\n if (stack) {\n logger.error(stack);\n }\n};\n\n/**\n * Builds SASL configuration for Kafka client authentication\n */\nconst buildSaslConfig = (\n logger: Logger,\n args: KafkaClientConfig,\n): SASLOptions | undefined => {\n const mechanism = args.saslMechanism ? args.saslMechanism.toLowerCase() : \"\";\n switch (mechanism) {\n case \"plain\":\n case \"scram-sha-256\":\n case \"scram-sha-512\":\n return {\n mechanism: mechanism,\n username: args.saslUsername || \"\",\n password: args.saslPassword || \"\",\n };\n default:\n logger.warn(`Unsupported SASL mechanism: ${args.saslMechanism}`);\n return undefined;\n }\n};\n\n/**\n * Dynamically creates a KafkaJS client configured with provided settings.\n * Use this to construct producers/consumers with custom options.\n */\nexport const getKafkaClient = async (\n cfg: KafkaClientConfig,\n logger: Logger,\n): Promise<Kafka> => {\n const brokers = parseBrokerString(cfg.broker || \"\");\n if (brokers.length === 0) {\n throw new Error(`No valid broker addresses found in: \"${cfg.broker}\"`);\n }\n\n logger.log(`Creating Kafka client with brokers: ${brokers.join(\", \")}`);\n logger.log(`Security protocol: ${cfg.securityProtocol || \"plaintext\"}`);\n logger.log(`Client ID: ${cfg.clientId}`);\n\n const saslConfig = buildSaslConfig(logger, cfg);\n\n return new Kafka({\n kafkaJS: {\n clientId: cfg.clientId,\n brokers,\n ssl: cfg.securityProtocol === \"SASL_SSL\",\n ...(saslConfig && { sasl: saslConfig }),\n retry: {\n initialRetryTime: RETRY_INITIAL_TIME_MS,\n maxRetryTime: MAX_RETRY_TIME_MS,\n retries: MAX_RETRIES,\n },\n },\n });\n};\n","import ts, { factory } from \"typescript\";\nimport {\n avoidTypiaNameClash,\n isMooseFile,\n typiaJsonSchemas,\n sanitizeTypeParameter,\n} from \"../compilerPluginHelper\";\nimport { toColumns } from \"../dataModels/typeConvert\";\nimport { IJsonSchemaCollection } from \"typia/src/schemas/json/IJsonSchemaCollection\";\nimport { dlqSchema } from \"./internal\";\n\nconst typesToArgsLength = new Map([\n [\"OlapTable\", 2],\n [\"Stream\", 2],\n [\"DeadLetterQueue\", 2],\n [\"IngestPipeline\", 2],\n [\"IngestApi\", 2],\n [\"Api\", 2],\n [\"MaterializedView\", 1],\n [\"Task\", 2],\n]);\n\nexport const isNewMooseResourceWithTypeParam = (\n node: ts.Node,\n checker: ts.TypeChecker,\n): node is ts.NewExpression => {\n if (!ts.isNewExpression(node)) {\n return false;\n }\n\n const declaration: ts.Declaration | undefined =\n checker.getResolvedSignature(node)?.declaration;\n\n if (!declaration || !isMooseFile(declaration.getSourceFile())) {\n return false;\n }\n const sym = checker.getSymbolAtLocation(node.expression);\n const typeName = sym?.name ?? \"\";\n if (!typesToArgsLength.has(typeName)) {\n return false;\n }\n\n return (\n // name only\n (node.arguments?.length === 1 ||\n // config param\n node.arguments?.length === 2) &&\n node.typeArguments?.length === 1\n );\n};\n\nexport const parseAsAny = (s: string) =>\n factory.createAsExpression(\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"JSON\"),\n factory.createIdentifier(\"parse\"),\n ),\n undefined,\n [factory.createStringLiteral(s)],\n ),\n factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n );\n\nconst typiaTypeGuard = (node: ts.NewExpression) => {\n const typeNode = node.typeArguments![0];\n return factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"createAssert\"),\n ),\n [sanitizeTypeParameter(typeNode)],\n [],\n );\n};\n\nexport const transformNewMooseResource = (\n node: ts.NewExpression,\n checker: ts.TypeChecker,\n): ts.Node => {\n const typeName = checker.getSymbolAtLocation(node.expression)!.name;\n\n const typeNode = node.typeArguments![0];\n\n // For IngestPipeline, check if table is configured in the config object\n // Index signatures are only allowed when table is false/not configured\n // (because OlapTable requires a fixed schema)\n let ingestPipelineHasTable = true; // Default to true (safe: disallows index signatures)\n if (\n typeName === \"IngestPipeline\" &&\n node.arguments &&\n node.arguments.length >= 2\n ) {\n const configArg = node.arguments[1];\n if (ts.isObjectLiteralExpression(configArg)) {\n const tableProperty = configArg.properties.find(\n (prop): prop is ts.PropertyAssignment =>\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === \"table\",\n );\n if (tableProperty) {\n const tableValue = tableProperty.initializer;\n // Check if table value is explicitly false\n ingestPipelineHasTable = tableValue.kind !== ts.SyntaxKind.FalseKeyword;\n }\n // If table property is not found, keep default (true = has table)\n // This is the safe default since 'table' is a required property\n }\n }\n\n // Allow index signatures for IngestApi, Stream, and IngestPipeline (when table is not configured)\n // These resources accept arbitrary payload fields that pass through to streaming functions\n const allowIndexSignatures =\n [\"IngestApi\", \"Stream\"].includes(typeName) ||\n (typeName === \"IngestPipeline\" && !ingestPipelineHasTable);\n\n // Check if the type actually has an index signature\n const typeAtLocation = checker.getTypeAtLocation(typeNode);\n const indexSignatures = checker.getIndexInfosOfType(typeAtLocation);\n const hasIndexSignature = allowIndexSignatures && indexSignatures.length > 0;\n\n // Validate: IngestPipeline with table=true cannot have index signatures\n // because extra fields would be silently dropped when writing to ClickHouse\n if (\n typeName === \"IngestPipeline\" &&\n ingestPipelineHasTable &&\n indexSignatures.length > 0\n ) {\n throw new Error(\n `IngestPipeline cannot use a type with index signatures when 'table' is configured. ` +\n `Extra fields would be silently dropped when writing to the ClickHouse table. ` +\n `Either:\\n` +\n ` 1. Remove the index signature from your type to use a fixed schema, or\\n` +\n ` 2. Set 'table: false' in your IngestPipeline config if you only need the API and stream`,\n );\n }\n\n const internalArguments =\n typeName === \"DeadLetterQueue\" ?\n [typiaTypeGuard(node)]\n : [\n typiaJsonSchemas(typeNode),\n parseAsAny(\n JSON.stringify(\n toColumns(typeAtLocation, checker, {\n allowIndexSignatures,\n }),\n ),\n ),\n ];\n const resourceName = checker.getSymbolAtLocation(node.expression)!.name;\n\n const argLength = typesToArgsLength.get(resourceName)!;\n const needsExtraArg = node.arguments!.length === argLength - 1; // provide empty config if undefined\n\n let updatedArgs = [\n ...node.arguments!,\n ...(needsExtraArg ?\n [factory.createObjectLiteralExpression([], false)]\n : []),\n ...internalArguments,\n ];\n\n // For OlapTable and IngestPipeline, also inject typia validation functions\n if (resourceName === \"OlapTable\" || resourceName === \"IngestPipeline\") {\n // Create a single TypiaValidators object with all three validation functions\n const validatorsObject = factory.createObjectLiteralExpression(\n [\n factory.createPropertyAssignment(\n factory.createIdentifier(\"validate\"),\n createTypiaValidator(typeNode),\n ),\n factory.createPropertyAssignment(\n factory.createIdentifier(\"assert\"),\n createTypiaAssert(typeNode),\n ),\n factory.createPropertyAssignment(\n factory.createIdentifier(\"is\"),\n createTypiaIs(typeNode),\n ),\n ],\n true,\n );\n\n updatedArgs = [...updatedArgs, validatorsObject];\n\n // For IngestPipeline, also pass allowExtraFields so it can propagate to internal Stream/IngestApi\n if (resourceName === \"IngestPipeline\") {\n updatedArgs = [\n ...updatedArgs,\n hasIndexSignature ? factory.createTrue() : factory.createFalse(),\n ];\n }\n }\n\n // For IngestApi and Stream, add the allowExtraFields flag after undefined validators\n // This enables passing extra fields through to streaming functions when the type has an index signature\n if (resourceName === \"IngestApi\" || resourceName === \"Stream\") {\n updatedArgs = [\n ...updatedArgs,\n factory.createIdentifier(\"undefined\"), // validators (not used for these types)\n hasIndexSignature ? factory.createTrue() : factory.createFalse(),\n ];\n }\n\n return ts.factory.updateNewExpression(\n node,\n node.expression,\n node.typeArguments,\n updatedArgs,\n );\n};\n\n/**\n * Creates a typia validator function call for the given type\n * e.g., ____moose____typia.createValidate<T>()\n */\nexport const createTypiaValidator = (typeNode: ts.TypeNode) => {\n // Create the typia validator call\n const typiaValidator = factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"createValidate\"),\n ),\n [sanitizeTypeParameter(typeNode)],\n [],\n );\n\n // Wrap it to transform the result to match our expected interface\n // (data: unknown) => {\n // const result = typiaValidator(data);\n // return {\n // success: result.success,\n // data: result.success ? result.data : undefined,\n // errors: result.success ? undefined : result.errors\n // };\n // }\n return factory.createArrowFunction(\n undefined,\n undefined,\n [\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(\"data\"),\n undefined,\n factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword),\n undefined,\n ),\n ],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createBlock(\n [\n // const result = typiaValidator(data);\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"result\"),\n undefined,\n undefined,\n factory.createCallExpression(typiaValidator, undefined, [\n factory.createIdentifier(\"data\"),\n ]),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // return { success: result.success, data: result.success ? result.data : undefined, errors: result.success ? undefined : result.errors };\n factory.createReturnStatement(\n factory.createObjectLiteralExpression(\n [\n factory.createPropertyAssignment(\n factory.createIdentifier(\"success\"),\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"result\"),\n factory.createIdentifier(\"success\"),\n ),\n ),\n factory.createPropertyAssignment(\n factory.createIdentifier(\"data\"),\n factory.createConditionalExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"result\"),\n factory.createIdentifier(\"success\"),\n ),\n factory.createToken(ts.SyntaxKind.QuestionToken),\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"result\"),\n factory.createIdentifier(\"data\"),\n ),\n factory.createToken(ts.SyntaxKind.ColonToken),\n factory.createIdentifier(\"undefined\"),\n ),\n ),\n factory.createPropertyAssignment(\n factory.createIdentifier(\"errors\"),\n factory.createConditionalExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"result\"),\n factory.createIdentifier(\"success\"),\n ),\n factory.createToken(ts.SyntaxKind.QuestionToken),\n factory.createIdentifier(\"undefined\"),\n factory.createToken(ts.SyntaxKind.ColonToken),\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"result\"),\n factory.createIdentifier(\"errors\"),\n ),\n ),\n ),\n ],\n true,\n ),\n ),\n ],\n true,\n ),\n );\n};\n\n/**\n * Creates a typia assert function call for the given type\n * e.g., ____moose____typia.createAssert<T>()\n */\nexport const createTypiaAssert = (typeNode: ts.TypeNode) =>\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"createAssert\"),\n ),\n [sanitizeTypeParameter(typeNode)],\n [],\n );\n\n/**\n * Creates a typia is function call for the given type\n * e.g., ____moose____typia.createIs<T>()\n */\nexport const createTypiaIs = (typeNode: ts.TypeNode) =>\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"createIs\"),\n ),\n [sanitizeTypeParameter(typeNode)],\n [],\n );\n","import ts, {\n isIdentifier,\n isTypeReferenceNode,\n SymbolFlags,\n TupleType,\n TypeChecker,\n TypeFlags,\n} from \"typescript\";\nimport { enumConvert, isEnum } from \"./enumConvert\";\nimport {\n ArrayType,\n Column,\n DataType,\n DataEnum,\n Nested,\n NamedTupleType,\n NullType,\n UnknownType,\n UnsupportedFeature,\n IndexType,\n MapType,\n} from \"./dataModelTypes\";\nimport { ClickHouseNamedTuple, DecimalRegex } from \"./types\";\nimport { STRING_DATE_ANNOTATION } from \"../utilities/json\";\n\nconst dateType = (checker: TypeChecker) =>\n checker\n .getTypeOfSymbol(\n checker.resolveName(\"Date\", undefined, SymbolFlags.Type, false)!,\n )\n .getConstructSignatures()[0]\n .getReturnType();\n\n// making throws expressions so that they can be used in ternaries\n\nconst throwUnknownType = (\n t: ts.Type,\n fieldName: string,\n typeName: string,\n): never => {\n throw new UnknownType(t, fieldName, typeName);\n};\n\nconst throwNullType = (fieldName: string, typeName: string): never => {\n throw new NullType(fieldName, typeName);\n};\n\nconst throwIndexTypeError = (t: ts.Type, checker: TypeChecker): never => {\n const interfaceName = t.symbol?.name || \"unknown type\";\n const indexInfos = checker.getIndexInfosOfType(t);\n const signatures = indexInfos.map((info) => {\n const keyType = checker.typeToString(info.keyType);\n const valueType = checker.typeToString(info.type);\n return `[${keyType}]: ${valueType}`;\n });\n\n throw new IndexType(interfaceName, signatures);\n};\n\n/** Recursively search for a property on a type, traversing intersections */\nconst getPropertyDeep = (t: ts.Type, name: string): ts.Symbol | undefined => {\n const direct = t.getProperty(name);\n if (direct !== undefined) return direct;\n // TODO: investigate if this logic is needed.\n // the properties in types in intersection should be reachable by t.getProperty\n // Intersection constituents may carry the marker symbols\n if (t.isIntersection()) {\n for (const sub of t.types) {\n const found = getPropertyDeep(sub, name);\n if (found) return found;\n }\n }\n return undefined;\n};\n\nconst toArrayType = ([elementNullable, _, elementType]: [\n boolean,\n [string, any][],\n DataType,\n]): ArrayType => {\n return {\n elementNullable,\n elementType,\n };\n};\n\nconst isNumberType = (t: ts.Type, checker: TypeChecker): boolean => {\n return checker.isTypeAssignableTo(t, checker.getNumberType());\n};\n\nconst handleAggregated = (\n t: ts.Type,\n checker: TypeChecker,\n fieldName: string,\n typeName: string,\n): AggregationFunction | undefined => {\n const functionSymbol = t.getProperty(\"_aggregationFunction\");\n const argsTypesSymbol = t.getProperty(\"_argTypes\");\n\n if (functionSymbol === undefined || argsTypesSymbol === undefined) {\n return undefined;\n }\n const functionStringLiteral = checker.getNonNullableType(\n checker.getTypeOfSymbol(functionSymbol),\n );\n const types = checker.getNonNullableType(\n checker.getTypeOfSymbol(argsTypesSymbol),\n );\n\n if (functionStringLiteral.isStringLiteral() && checker.isTupleType(types)) {\n const argumentTypes = ((types as TupleType).typeArguments || []).map(\n (argT) => {\n return tsTypeToDataType(argT, checker, fieldName, typeName, false)[2];\n },\n );\n return { functionName: functionStringLiteral.value, argumentTypes };\n } else {\n console.log(\n \"[CompilerPlugin] Unexpected type inside Aggregated\",\n functionStringLiteral,\n );\n return undefined;\n }\n};\n\nconst getTaggedType = (\n t: ts.Type,\n checker: TypeChecker,\n propertyName: string,\n): ts.Type | null => {\n // Ensure we check the non-nullable part so the tag property is there\n const nonNull = t.getNonNullableType();\n const ttlSymbol = nonNull.getProperty(propertyName);\n if (ttlSymbol === undefined) return null;\n return checker.getNonNullableType(checker.getTypeOfSymbol(ttlSymbol));\n};\n\n// JSON mapping: recognize SomeInterface & ClickHouseJson<...>\nconst getJsonMappedType = (\n t: ts.Type,\n checker: TypeChecker,\n): DataType | null => {\n const mappingSymbol = getPropertyDeep(t, \"_clickhouse_mapped_type\");\n if (mappingSymbol === undefined) return null;\n const mappedType = checker.getNonNullableType(\n checker.getTypeOfSymbol(mappingSymbol),\n );\n if (!mappedType.isStringLiteral() || mappedType.value !== \"JSON\") {\n return null;\n }\n\n // Extract settings from the type properties\n let maxDynamicPaths: number | undefined = undefined;\n let maxDynamicTypes: number | undefined = undefined;\n let skipPaths: string[] = [];\n let skipRegexes: string[] = [];\n\n const settingsSymbol = getPropertyDeep(t, \"_clickhouse_json_settings\");\n if (settingsSymbol !== undefined) {\n const settingsType = checker.getNonNullableType(\n checker.getTypeOfSymbol(settingsSymbol),\n );\n\n const maxPathsSymbol = getPropertyDeep(settingsType, \"maxDynamicPaths\");\n if (maxPathsSymbol !== undefined) {\n const maxPathsType = checker.getNonNullableType(\n checker.getTypeOfSymbol(maxPathsSymbol),\n );\n if (maxPathsType.isNumberLiteral()) {\n maxDynamicPaths = maxPathsType.value;\n }\n }\n\n const maxTypesSymbol = getPropertyDeep(settingsType, \"maxDynamicTypes\");\n if (maxTypesSymbol !== undefined) {\n const maxTypesType = checker.getNonNullableType(\n checker.getTypeOfSymbol(maxTypesSymbol),\n );\n if (maxTypesType.isNumberLiteral()) {\n maxDynamicTypes = maxTypesType.value;\n }\n }\n\n const skipPathsSymbol = getPropertyDeep(settingsType, \"skipPaths\");\n if (skipPathsSymbol !== undefined) {\n const skipPathsType = checker.getNonNullableType(\n checker.getTypeOfSymbol(skipPathsSymbol),\n );\n if (checker.isTupleType(skipPathsType)) {\n const tuple = skipPathsType as TupleType;\n skipPaths = (tuple.typeArguments || [])\n .filter((t) => t.isStringLiteral())\n .map((t) => (t as ts.StringLiteralType).value);\n }\n }\n\n const skipRegexesSymbol = getPropertyDeep(settingsType, \"skipRegexes\");\n if (skipRegexesSymbol !== undefined) {\n const skipRegexesType = checker.getNonNullableType(\n checker.getTypeOfSymbol(skipRegexesSymbol),\n );\n if (checker.isTupleType(skipRegexesType)) {\n const tuple = skipRegexesType as TupleType;\n skipRegexes = (tuple.typeArguments || [])\n .filter((t) => t.isStringLiteral())\n .map((t) => (t as ts.StringLiteralType).value);\n }\n }\n }\n\n // For typed paths, try to find the interface part of the intersection\n let base: ts.Type = t.getNonNullableType();\n if (base.isIntersection()) {\n const candidates = base.types.filter((sub) => {\n const m = getPropertyDeep(sub, \"_clickhouse_mapped_type\");\n if (!m) return true;\n const mt = checker.getNonNullableType(checker.getTypeOfSymbol(m));\n return !(mt.isStringLiteral() && mt.value === \"JSON\");\n });\n if (candidates.length > 0) base = candidates[0];\n }\n\n // Build typed paths from the base interface's columns (top-level only)\n let typedPaths: Array<[string, DataType]> = [];\n try {\n const cols = toColumns(base, checker);\n typedPaths = cols.map((c) => [c.name, c.data_type]);\n } catch (_) {\n // Fallback silently if we cannot derive columns\n typedPaths = [];\n }\n\n const hasAnyOption =\n typeof maxDynamicPaths === \"number\" ||\n typeof maxDynamicTypes === \"number\" ||\n typedPaths.length > 0 ||\n skipPaths.length > 0 ||\n skipRegexes.length > 0;\n\n if (!hasAnyOption) return \"Json\";\n\n const result: Record<string, any> = {\n typed_paths: typedPaths,\n skip_paths: skipPaths,\n skip_regexps: skipRegexes,\n };\n\n // Only include these fields if they have actual values\n if (typeof maxDynamicPaths === \"number\") {\n result.max_dynamic_paths = maxDynamicPaths;\n }\n if (typeof maxDynamicTypes === \"number\") {\n result.max_dynamic_types = maxDynamicTypes;\n }\n\n return result as unknown as DataType;\n};\n\nconst handleSimpleAggregated = (\n t: ts.Type,\n checker: TypeChecker,\n fieldName: string,\n typeName: string,\n): SimpleAggregationFunction | undefined => {\n const functionSymbol = t.getProperty(\"_simpleAggregationFunction\");\n const argTypeSymbol = t.getProperty(\"_argType\");\n\n if (functionSymbol === undefined || argTypeSymbol === undefined) {\n return undefined;\n }\n const functionStringLiteral = checker.getNonNullableType(\n checker.getTypeOfSymbol(functionSymbol),\n );\n const argType = checker.getNonNullableType(\n checker.getTypeOfSymbol(argTypeSymbol),\n );\n\n if (functionStringLiteral.isStringLiteral()) {\n const argumentType = tsTypeToDataType(\n argType,\n checker,\n fieldName,\n typeName,\n false,\n )[2];\n return { functionName: functionStringLiteral.value, argumentType };\n } else {\n console.log(\n \"[CompilerPlugin] Unexpected type inside SimpleAggregated\",\n functionStringLiteral,\n );\n return undefined;\n }\n};\n/** Detect ClickHouse default annotation on a type and return raw sql */\nconst handleDefault = (t: ts.Type, checker: TypeChecker): string | null => {\n const defaultType = getTaggedType(t, checker, \"_clickhouse_default\");\n if (defaultType === null) {\n return null;\n }\n if (!defaultType.isStringLiteral()) {\n throw new UnsupportedFeature(\n 'ClickHouseDefault must use a string literal, e.g. ClickHouseDefault<\"now()\">',\n );\n }\n return defaultType.value;\n};\n\n/** Detect ClickHouse materialized annotation on a type and return raw sql */\nconst handleMaterialized = (\n t: ts.Type,\n checker: TypeChecker,\n): string | null => {\n const materializedType = getTaggedType(\n t,\n checker,\n \"_clickhouse_materialized\",\n );\n if (materializedType === null) {\n return null;\n }\n if (!materializedType.isStringLiteral()) {\n throw new UnsupportedFeature(\n 'ClickHouseMaterialized must use a string literal, e.g. ClickHouseMaterialized<\"toDate(timestamp)\">',\n );\n }\n return materializedType.value;\n};\n\n/** Detect ClickHouse TTL annotation on a type and return raw sql */\nconst handleTtl = (t: ts.Type, checker: TypeChecker): string | null => {\n const ttlType = getTaggedType(t, checker, \"_clickhouse_ttl\");\n if (ttlType === null) {\n return null;\n }\n if (!ttlType.isStringLiteral()) {\n throw new UnsupportedFeature(\n 'ClickHouseTTL must use a string literal, e.g. ClickHouseTTL<\"timestamp + INTERVAL 1 WEEK\">',\n );\n }\n return ttlType.value;\n};\n\nconst handleNumberType = (\n t: ts.Type,\n checker: TypeChecker,\n fieldName: string,\n): string => {\n // Detect Decimal(P, S) annotation on number via ClickHouseDecimal\n const decimalPrecisionSymbol = getPropertyDeep(t, \"_clickhouse_precision\");\n const decimalScaleSymbol = getPropertyDeep(t, \"_clickhouse_scale\");\n if (\n decimalPrecisionSymbol !== undefined &&\n decimalScaleSymbol !== undefined\n ) {\n const precisionType = checker.getNonNullableType(\n checker.getTypeOfSymbol(decimalPrecisionSymbol),\n );\n const scaleType = checker.getNonNullableType(\n checker.getTypeOfSymbol(decimalScaleSymbol),\n );\n if (precisionType.isNumberLiteral() && scaleType.isNumberLiteral()) {\n return `Decimal(${precisionType.value}, ${scaleType.value})`;\n }\n }\n\n const tagSymbol = t.getProperty(\"typia.tag\");\n if (tagSymbol === undefined) {\n return \"Float64\";\n } else {\n const typiaProps = checker.getNonNullableType(\n checker.getTypeOfSymbol(tagSymbol),\n );\n const props: ts.Type[] =\n typiaProps.isIntersection() ? typiaProps.types : [typiaProps];\n\n for (const prop of props) {\n const valueSymbol = prop.getProperty(\"value\");\n if (valueSymbol === undefined) {\n console.log(\n `[CompilerPlugin] Props.value is undefined for ${fieldName}`,\n );\n } else {\n const valueTypeLiteral = checker.getTypeOfSymbol(valueSymbol);\n const numberTypeMappings = {\n float: \"Float32\",\n double: \"Float64\",\n int8: \"Int8\",\n int16: \"Int16\",\n int32: \"Int32\",\n int64: \"Int64\",\n uint8: \"UInt8\",\n uint16: \"UInt16\",\n uint32: \"UInt32\",\n uint64: \"UInt64\",\n };\n const match = Object.entries(numberTypeMappings).find(([k, _]) =>\n isStringLiteral(valueTypeLiteral, checker, k),\n );\n if (match) {\n return match[1];\n } else {\n const typeString =\n valueTypeLiteral.isStringLiteral() ?\n valueTypeLiteral.value\n : \"unknown\";\n\n console.log(\n `[CompilerPlugin] Other number types are not supported: ${typeString} in field ${fieldName}`,\n );\n }\n }\n }\n\n return \"Float64\";\n }\n};\n\nexport interface AggregationFunction {\n functionName: string;\n argumentTypes: DataType[];\n}\n\nexport interface SimpleAggregationFunction {\n functionName: string;\n argumentType: DataType;\n}\n\nconst isStringLiteral = (\n t: ts.Type,\n checker: TypeChecker,\n lit: string,\n): boolean => checker.isTypeAssignableTo(t, checker.getStringLiteralType(lit));\n\nconst handleStringType = (\n t: ts.Type,\n checker: TypeChecker,\n fieldName: string,\n annotations: [string, any][],\n): string => {\n // Check for FixedString(N) annotation\n const fixedStringSizeSymbol = getPropertyDeep(\n t,\n \"_clickhouse_fixed_string_size\",\n );\n if (fixedStringSizeSymbol !== undefined) {\n const sizeType = checker.getNonNullableType(\n checker.getTypeOfSymbol(fixedStringSizeSymbol),\n );\n if (sizeType.isNumberLiteral()) {\n return `FixedString(${sizeType.value})`;\n }\n }\n\n const tagSymbol = t.getProperty(\"typia.tag\");\n if (tagSymbol === undefined) {\n if (t.isUnion() && t.types.every((v) => v.isStringLiteral())) {\n annotations.push([\"LowCardinality\", true]);\n }\n\n return \"String\";\n } else {\n const typiaProps = checker.getNonNullableType(\n checker.getTypeOfSymbol(tagSymbol),\n );\n const props: ts.Type[] =\n typiaProps.isIntersection() ? typiaProps.types : [typiaProps];\n\n for (const prop of props) {\n const valueSymbol = prop.getProperty(\"value\");\n if (valueSymbol === undefined) {\n console.log(\n `[CompilerPlugin] Props.value is undefined for ${fieldName}`,\n );\n } else {\n const valueTypeLiteral = checker.getTypeOfSymbol(valueSymbol);\n if (isStringLiteral(valueTypeLiteral, checker, \"uuid\")) {\n return \"UUID\";\n } else if (isStringLiteral(valueTypeLiteral, checker, \"date-time\")) {\n let precision = 9;\n\n const precisionSymbol = t.getProperty(\"_clickhouse_precision\");\n if (precisionSymbol !== undefined) {\n const precisionType = checker.getNonNullableType(\n checker.getTypeOfSymbol(precisionSymbol),\n );\n if (precisionType.isNumberLiteral()) {\n precision = precisionType.value;\n }\n }\n // Mark this as a string-based date field so it won't be parsed to Date at runtime\n annotations.push([STRING_DATE_ANNOTATION, true]);\n return `DateTime(${precision})`;\n } else if (isStringLiteral(valueTypeLiteral, checker, \"date\")) {\n let size = 4;\n const sizeSymbol = t.getProperty(\"_clickhouse_byte_size\");\n if (sizeSymbol !== undefined) {\n const sizeType = checker.getNonNullableType(\n checker.getTypeOfSymbol(sizeSymbol),\n );\n if (sizeType.isNumberLiteral()) {\n size = sizeType.value;\n }\n }\n\n if (size === 4) {\n return \"Date\";\n } else if (size === 2) {\n return \"Date16\";\n } else {\n throw new UnsupportedFeature(`Date with size ${size}`);\n }\n } else if (isStringLiteral(valueTypeLiteral, checker, \"ipv4\")) {\n return \"IPv4\";\n } else if (isStringLiteral(valueTypeLiteral, checker, \"ipv6\")) {\n return \"IPv6\";\n } else if (isStringLiteral(valueTypeLiteral, checker, DecimalRegex)) {\n let precision = 10;\n let scale = 0;\n\n const precisionSymbol = t.getProperty(\"_clickhouse_precision\");\n if (precisionSymbol !== undefined) {\n const precisionType = checker.getNonNullableType(\n checker.getTypeOfSymbol(precisionSymbol),\n );\n if (precisionType.isNumberLiteral()) {\n precision = precisionType.value;\n }\n }\n\n const scaleSymbol = t.getProperty(\"_clickhouse_scale\");\n if (scaleSymbol !== undefined) {\n const scaleType = checker.getNonNullableType(\n checker.getTypeOfSymbol(scaleSymbol),\n );\n if (scaleType.isNumberLiteral()) {\n scale = scaleType.value;\n }\n }\n\n return `Decimal(${precision}, ${scale})`;\n } else {\n const typeString =\n valueTypeLiteral.isStringLiteral() ?\n valueTypeLiteral.value\n : \"unknown\";\n\n console.log(\n `[CompilerPlugin] Unknown format: ${typeString} in field ${fieldName}`,\n );\n }\n }\n }\n\n return \"String\";\n }\n};\n\nconst isStringAnyRecord = (t: ts.Type, checker: ts.TypeChecker): boolean => {\n const indexInfos = checker.getIndexInfosOfType(t);\n if (indexInfos && indexInfos.length === 1) {\n const indexInfo = indexInfos[0];\n return (\n indexInfo.keyType == checker.getStringType() &&\n indexInfo.type == checker.getAnyType()\n );\n }\n\n return false;\n};\n\n/**\n * Check if a type is a Record<K, V> type (generic map/dictionary type)\n */\nconst isRecordType = (t: ts.Type, checker: ts.TypeChecker): boolean => {\n const indexInfos = checker.getIndexInfosOfType(t);\n return indexInfos && indexInfos.length === 1;\n};\n\n/**\n * Detects a tag-like object type that only carries metadata, e.g. { _tag: ... }\n */\nconst isSingleUnderscoreMetaObject = (\n t: ts.Type,\n checker: ts.TypeChecker,\n): boolean => {\n const props = checker.getPropertiesOfType(t);\n if (props.length !== 1) return false;\n const onlyProp = props[0];\n const name = onlyProp.name;\n return typeof name === \"string\" && name.startsWith(\"_\");\n};\n\n/**\n * Handle Record<K, V> types and convert them to Map types\n */\nconst handleRecordType = (\n t: ts.Type,\n checker: ts.TypeChecker,\n fieldName: string,\n typeName: string,\n isJwt: boolean,\n): MapType => {\n const indexInfos = checker.getIndexInfosOfType(t);\n if (indexInfos && indexInfos.length !== 1) {\n throwIndexTypeError(t, checker);\n }\n const indexInfo = indexInfos[0];\n\n // Convert key type\n const [, , keyType] = tsTypeToDataType(\n indexInfo.keyType,\n checker,\n `${fieldName}_key`,\n typeName,\n isJwt,\n );\n\n // Convert value type\n const [, , valueType] = tsTypeToDataType(\n indexInfo.type,\n checker,\n `${fieldName}_value`,\n typeName,\n isJwt,\n );\n\n return {\n keyType,\n valueType,\n };\n};\n\n/**\n * see {@link ClickHouseNamedTuple}\n */\nconst isNamedTuple = (t: ts.Type, checker: ts.TypeChecker) => {\n const mappingSymbol = t.getProperty(\"_clickhouse_mapped_type\");\n if (mappingSymbol === undefined) {\n return false;\n }\n return isStringLiteral(\n checker.getNonNullableType(checker.getTypeOfSymbol(mappingSymbol)),\n checker,\n \"namedTuple\",\n );\n};\n\n// Validate that the underlying TS type matches the mapped geometry shape\nconst getGeometryMappedType = (\n t: ts.Type,\n checker: ts.TypeChecker,\n): string | null => {\n const mappingSymbol = getPropertyDeep(t, \"_clickhouse_mapped_type\");\n if (mappingSymbol === undefined) return null;\n const mapped = checker.getNonNullableType(\n checker.getTypeOfSymbol(mappingSymbol),\n );\n\n // Helper: exact tuple [number, number]\n const isPointTuple = (candidate: ts.Type): boolean => {\n if (candidate.isIntersection()) {\n return candidate.types.some(isPointTuple);\n }\n if (!checker.isTupleType(candidate)) return false;\n const tuple = candidate as TupleType;\n const args = tuple.typeArguments || [];\n if (args.length !== 2) return false;\n return isNumberType(args[0], checker) && isNumberType(args[1], checker);\n };\n\n // Helper: Array<T> predicate\n const isArrayOf = (\n arrType: ts.Type,\n elementPredicate: (elType: ts.Type) => boolean,\n ): boolean => {\n if (arrType.isIntersection()) {\n return arrType.types.some((t) => isArrayOf(t, elementPredicate));\n }\n if (!checker.isArrayType(arrType)) return false;\n const elementType = arrType.getNumberIndexType();\n if (!elementType) return false;\n return elementPredicate(elementType);\n };\n\n const expectAndValidate = (shapeName: string, validator: () => boolean) => {\n if (!validator()) {\n throw new UnsupportedFeature(\n `Type annotated as ${shapeName} must be assignable to the expected geometry shape`,\n );\n }\n return shapeName;\n };\n\n if (mapped.isStringLiteral()) {\n const v = mapped.value;\n switch (v) {\n case \"Point\":\n return expectAndValidate(\"Point\", () => isPointTuple(t));\n case \"Ring\":\n case \"LineString\":\n return expectAndValidate(v, () =>\n isArrayOf(t, (el) => isPointTuple(el)),\n );\n case \"MultiLineString\":\n case \"Polygon\":\n return expectAndValidate(v, () =>\n isArrayOf(t, (el) => isArrayOf(el, (inner) => isPointTuple(inner))),\n );\n case \"MultiPolygon\":\n return expectAndValidate(v, () =>\n isArrayOf(t, (el) =>\n isArrayOf(el, (inner) => isArrayOf(inner, isPointTuple)),\n ),\n );\n }\n }\n return null;\n};\n\nconst checkColumnHasNoDefault = (c: Column) => {\n if (c.default !== null) {\n throw new UnsupportedFeature(\n \"Default in inner field. Put ClickHouseDefault in top level field.\",\n );\n }\n};\n\nconst handleNested = (\n t: ts.Type,\n checker: ts.TypeChecker,\n fieldName: string,\n jwt: boolean,\n): Nested => {\n const columns = toColumns(t, checker);\n columns.forEach(checkColumnHasNoDefault);\n return {\n name: getNestedName(t, fieldName),\n columns,\n jwt,\n };\n};\n\nconst handleNamedTuple = (\n t: ts.Type,\n checker: ts.TypeChecker,\n): NamedTupleType => {\n return {\n fields: toColumns(t, checker).flatMap((c) => {\n if (c.name === \"_clickhouse_mapped_type\") return [];\n\n checkColumnHasNoDefault(c);\n const t = c.required ? c.data_type : { nullable: c.data_type };\n return [[c.name, t]];\n }),\n };\n};\n\nconst tsTypeToDataType = (\n t: ts.Type,\n checker: TypeChecker,\n fieldName: string,\n typeName: string,\n isJwt: boolean,\n typeNode?: ts.TypeNode,\n): [boolean, [string, any][], DataType] => {\n const nonNull = t.getNonNullableType();\n const nullable = nonNull != t;\n\n const aggregationFunction = handleAggregated(t, checker, fieldName, typeName);\n const simpleAggregationFunction = handleSimpleAggregated(\n t,\n checker,\n fieldName,\n typeName,\n );\n\n let withoutTags = nonNull;\n // clean up intersection type tags\n if (nonNull.isIntersection()) {\n const nonTagTypes = nonNull.types.filter(\n (candidate) => !isSingleUnderscoreMetaObject(candidate, checker),\n );\n\n if (nonTagTypes.length == 1) {\n withoutTags = nonTagTypes[0];\n }\n }\n\n // Recognize Date aliases (DateTime, DateTime64<P>) as DateTime-like\n let datePrecisionFromNode: number | undefined = undefined;\n if (typeNode && isTypeReferenceNode(typeNode)) {\n const tn = typeNode.typeName;\n const name = isIdentifier(tn) ? tn.text : tn.right.text;\n if (name === \"DateTime64\") {\n const arg = typeNode.typeArguments?.[0];\n if (\n arg &&\n ts.isLiteralTypeNode(arg) &&\n ts.isNumericLiteral(arg.literal)\n ) {\n datePrecisionFromNode = Number(arg.literal.text);\n }\n } else if (name === \"DateTime\") {\n datePrecisionFromNode = undefined; // DateTime without explicit precision\n }\n }\n\n const annotations: [string, any][] = [];\n\n const typeSymbolName = nonNull.symbol?.name || t.symbol?.name;\n const isDateLike =\n typeSymbolName === \"DateTime\" ||\n typeSymbolName === \"DateTime64\" ||\n checker.isTypeAssignableTo(nonNull, dateType(checker));\n\n let dataType: DataType;\n if (isEnum(nonNull)) {\n dataType = enumConvert(nonNull);\n } else {\n const jsonCandidate = getJsonMappedType(nonNull, checker);\n if (jsonCandidate !== null) {\n dataType = jsonCandidate;\n } else if (isStringAnyRecord(nonNull, checker)) {\n dataType = \"Json\";\n } else if (isDateLike) {\n // Prefer precision from AST (DateTime64<P>) if available\n if (datePrecisionFromNode !== undefined) {\n dataType = `DateTime(${datePrecisionFromNode})` as DataType;\n } else {\n // Add precision support for Date via ClickHousePrecision<P>\n const precisionSymbol =\n getPropertyDeep(nonNull, \"_clickhouse_precision\") ||\n getPropertyDeep(t, \"_clickhouse_precision\");\n if (precisionSymbol !== undefined) {\n const precisionType = checker.getNonNullableType(\n checker.getTypeOfSymbol(precisionSymbol),\n );\n if (precisionType.isNumberLiteral()) {\n dataType = `DateTime(${precisionType.value})` as DataType;\n } else {\n dataType = \"DateTime\";\n }\n } else {\n dataType = \"DateTime\";\n }\n }\n } else if (checker.isTypeAssignableTo(nonNull, checker.getStringType())) {\n dataType = handleStringType(nonNull, checker, fieldName, annotations);\n } else if (isNumberType(nonNull, checker)) {\n dataType = handleNumberType(nonNull, checker, fieldName);\n } else if (checker.isTypeAssignableTo(nonNull, checker.getBooleanType())) {\n dataType = \"Boolean\";\n } else if (getGeometryMappedType(nonNull, checker) !== null) {\n dataType = getGeometryMappedType(nonNull, checker)!;\n } else if (checker.isArrayType(withoutTags)) {\n dataType = toArrayType(\n tsTypeToDataType(\n nonNull.getNumberIndexType()!,\n checker,\n fieldName,\n typeName,\n isJwt,\n undefined,\n ),\n );\n } else if (isNamedTuple(nonNull, checker)) {\n dataType = handleNamedTuple(nonNull, checker);\n } else if (isRecordType(nonNull, checker)) {\n dataType = handleRecordType(nonNull, checker, fieldName, typeName, isJwt);\n } else if (\n withoutTags.isClassOrInterface() ||\n (withoutTags.flags & TypeFlags.Object) !== 0\n ) {\n dataType = handleNested(withoutTags, checker, fieldName, isJwt);\n } else if (nonNull == checker.getNeverType()) {\n dataType = throwNullType(fieldName, typeName);\n } else {\n dataType = throwUnknownType(t, fieldName, typeName);\n }\n }\n if (aggregationFunction !== undefined) {\n annotations.push([\"aggregationFunction\", aggregationFunction]);\n }\n if (simpleAggregationFunction !== undefined) {\n annotations.push([\"simpleAggregationFunction\", simpleAggregationFunction]);\n }\n\n const lowCardinalitySymbol = t.getProperty(\"_LowCardinality\");\n if (lowCardinalitySymbol !== undefined) {\n const lowCardinalityType = checker.getNonNullableType(\n checker.getTypeOfSymbol(lowCardinalitySymbol),\n );\n\n if (lowCardinalityType == checker.getTrueType()) {\n annotations.push([\"LowCardinality\", true]);\n }\n }\n\n return [nullable, annotations, dataType];\n};\n\nconst getNestedName = (t: ts.Type, fieldName: string) => {\n const name = t.symbol.name;\n // replace default name\n return name === \"__type\" ? fieldName : name;\n};\n\nconst hasWrapping = (\n typeNode: ts.TypeNode | undefined,\n wrapperName: string,\n) => {\n if (typeNode !== undefined && isTypeReferenceNode(typeNode)) {\n const typeName = typeNode.typeName;\n const name = isIdentifier(typeName) ? typeName.text : typeName.right.text;\n return name === wrapperName && typeNode.typeArguments?.length === 1;\n } else {\n return false;\n }\n};\n\nconst hasKeyWrapping = (typeNode: ts.TypeNode | undefined) => {\n return hasWrapping(typeNode, \"Key\");\n};\n\nconst hasJwtWrapping = (typeNode: ts.TypeNode | undefined) => {\n return hasWrapping(typeNode, \"JWT\");\n};\n\nconst handleDefaultWrapping = (\n typeNode: ts.TypeNode | undefined,\n): string | undefined => {\n if (typeNode !== undefined && isTypeReferenceNode(typeNode)) {\n const typeName = typeNode.typeName;\n const name = isIdentifier(typeName) ? typeName.text : typeName.right.text;\n if (name === \"WithDefault\" && typeNode.typeArguments?.length === 2) {\n const defaultValueType = typeNode.typeArguments[1];\n if (\n ts.isLiteralTypeNode(defaultValueType) &&\n ts.isStringLiteral(defaultValueType.literal)\n ) {\n return defaultValueType.literal.text;\n }\n }\n }\n return undefined;\n};\n\n/** Detect ClickHouse Codec annotation on a type and return codec expression */\nconst handleCodec = (t: ts.Type, checker: TypeChecker): string | null => {\n const codecType = getTaggedType(t, checker, \"_clickhouse_codec\");\n if (codecType === null) {\n return null;\n }\n if (!codecType.isStringLiteral()) {\n throw new UnsupportedFeature(\n 'ClickHouseCodec must use a string literal, e.g. ClickHouseCodec<\"ZSTD(3)\">',\n );\n }\n return codecType.value;\n};\n\nexport interface ToColumnsOptions {\n /**\n * When true, allows types with index signatures (e.g., [key: string]: any).\n * Only named properties will be extracted as columns.\n * This is useful for IngestApi where arbitrary fields should be accepted\n * and passed through to streaming functions.\n */\n allowIndexSignatures?: boolean;\n}\n\nexport const toColumns = (\n t: ts.Type,\n checker: TypeChecker,\n options?: ToColumnsOptions,\n): Column[] => {\n // Only check for index signatures if not explicitly allowed\n if (\n !options?.allowIndexSignatures &&\n checker.getIndexInfosOfType(t).length !== 0\n ) {\n console.log(\"[CompilerPlugin]\", checker.getIndexInfosOfType(t));\n throwIndexTypeError(t, checker);\n }\n\n return checker.getPropertiesOfType(t).map((prop) => {\n let declarations = prop.getDeclarations();\n const node =\n declarations && declarations.length > 0 ?\n (declarations[0] as ts.PropertyDeclaration)\n : undefined;\n const type =\n node !== undefined ?\n checker.getTypeOfSymbolAtLocation(prop, node)\n : checker.getTypeOfSymbol(prop);\n\n const isKey = hasKeyWrapping(node?.type);\n const isJwt = hasJwtWrapping(node?.type);\n\n const defaultExpression = handleDefaultWrapping(node?.type);\n\n const [nullable, annotations, dataType] = tsTypeToDataType(\n type,\n checker,\n prop.name,\n t.symbol?.name || \"inline_type\",\n isJwt,\n node?.type,\n );\n\n const defaultValue = defaultExpression ?? handleDefault(type, checker);\n const materializedValue = handleMaterialized(type, checker);\n\n // Validate mutual exclusivity of DEFAULT and MATERIALIZED\n if (defaultValue && materializedValue) {\n throw new UnsupportedFeature(\n `Column '${prop.name}' cannot have both ClickHouseDefault and ClickHouseMaterialized. Use one or the other.`,\n );\n }\n\n return {\n name: prop.name,\n data_type: dataType,\n primary_key: isKey,\n required: !nullable,\n unique: false,\n default: defaultValue,\n materialized: materializedValue,\n ttl: handleTtl(type, checker),\n codec: handleCodec(type, checker),\n annotations,\n };\n });\n};\n","import ts, {\n NumberLiteralType,\n StringLiteralType,\n UnionType,\n} from \"typescript\";\nimport { DataEnum, UnsupportedEnum } from \"./dataModelTypes\";\n\nexport const isEnum = (t: ts.Type): boolean =>\n !!(t.getFlags() & ts.TypeFlags.EnumLiteral);\n\nexport const enumConvert = (enumType: ts.Type): DataEnum => {\n const name = enumType.symbol.name;\n\n const values =\n enumType.isUnion() ?\n // an enum is the union of the values\n (enumType as UnionType).types\n // unless there's only one element\n : [enumType];\n const allStrings = values.every((v) => v.isStringLiteral());\n const allIntegers = values.every(\n (v) => v.isNumberLiteral() && Number.isInteger(v.value),\n );\n\n if (!allIntegers && !allStrings) {\n throw new UnsupportedEnum(name);\n }\n\n const enumMember =\n allStrings ?\n values.map((v) => ({\n name: v.symbol.name,\n value: { String: (v as StringLiteralType).value },\n }))\n : values.map((v) => ({\n name: v.symbol.name,\n value: { Int: (v as NumberLiteralType).value },\n }));\n\n return { name, values: enumMember };\n};\n","import ts from \"typescript\";\nimport { IdentifierBrandedString } from \"../sqlHelpers\";\n\nexport type EnumValues =\n | { name: string; value: { Int: number } }[]\n | { name: string; value: { String: string } }[];\nexport type DataEnum = { name: string; values: EnumValues };\nexport type Nested = { name: string; columns: Column[]; jwt: boolean };\nexport type ArrayType = { elementType: DataType; elementNullable: boolean };\nexport type NamedTupleType = { fields: Array<[string, DataType]> };\nexport type MapType = { keyType: DataType; valueType: DataType };\nexport type JsonOptions = {\n max_dynamic_paths?: number;\n max_dynamic_types?: number;\n typed_paths?: Array<[string, DataType]>;\n skip_paths?: string[];\n skip_regexps?: string[];\n};\nexport type DataType =\n | string\n | DataEnum\n | ArrayType\n | Nested\n | NamedTupleType\n | MapType\n | JsonOptions\n | { nullable: DataType };\nexport interface Column {\n name: IdentifierBrandedString;\n data_type: DataType;\n required: boolean;\n unique: false; // what is this for?\n primary_key: boolean;\n default: string | null;\n materialized: string | null;\n ttl: string | null;\n codec: string | null;\n annotations: [string, any][];\n}\n\nexport interface DataModel {\n columns: Column[];\n name: string;\n}\n\nexport class UnknownType extends Error {\n t: ts.Type;\n fieldName: string;\n typeName: string;\n constructor(t: ts.Type, fieldName: string, typeName: string) {\n super();\n this.t = t;\n this.fieldName = fieldName;\n this.typeName = typeName;\n }\n}\n\nexport class NullType extends Error {\n fieldName: string;\n typeName: string;\n constructor(fieldName: string, typeName: string) {\n super();\n this.fieldName = fieldName;\n this.typeName = typeName;\n }\n}\n\nexport class UnsupportedEnum extends Error {\n enumName: string;\n constructor(enumName: string) {\n super();\n this.enumName = enumName;\n }\n}\n\nexport class UnsupportedFeature extends Error {\n featureName: string;\n constructor(featureName: string) {\n super();\n this.featureName = featureName;\n }\n}\n\nexport class IndexType extends Error {\n typeName: string;\n indexSignatures: string[];\n\n constructor(typeName: string, indexSignatures: string[]) {\n const explanation =\n \"Index signatures (e.g. [key: string]: value) are not supported in data models.\";\n\n const suggestion =\n \"Consider splitting this into separate types or using a single Record<K, V> type.\";\n\n const signatures = `Found index signatures: ${indexSignatures.join(\", \")}`;\n\n super(\n `${explanation}\\n\\nType: ${typeName}\\n\\n${signatures}\\n\\nSuggestion: ${suggestion}`,\n );\n\n this.typeName = typeName;\n this.indexSignatures = indexSignatures;\n }\n}\n\n/**\n * Type guard: is this DataType an Array(Nested(...))?\n * Uses the ArrayType and Nested types for type safety.\n */\nexport function isArrayNestedType(\n dt: DataType,\n): dt is ArrayType & { elementType: Nested } {\n return (\n typeof dt === \"object\" &&\n dt !== null &&\n (dt as ArrayType).elementType !== null &&\n typeof (dt as ArrayType).elementType === \"object\" &&\n (dt as ArrayType).elementType.hasOwnProperty(\"columns\") &&\n Array.isArray(((dt as ArrayType).elementType as Nested).columns)\n );\n}\n\n/**\n * Type guard: is this DataType a Nested struct (not array)?\n */\nexport function isNestedType(dt: DataType): dt is Nested {\n return (\n typeof dt === \"object\" &&\n dt !== null &&\n Array.isArray((dt as Nested).columns)\n );\n}\n","import { Pattern, TagBase } from \"typia/lib/tags\";\nimport { tags } from \"typia\";\n\nexport type ClickHousePrecision<P extends number> = {\n _clickhouse_precision?: P;\n};\n\nexport const DecimalRegex: \"^-?\\\\d+(\\\\.\\\\d+)?$\" = \"^-?\\\\d+(\\\\.\\\\d+)?$\";\n\nexport type ClickHouseDecimal<P extends number, S extends number> = {\n _clickhouse_precision?: P;\n _clickhouse_scale?: S;\n} & Pattern<typeof DecimalRegex>;\n\nexport type ClickHouseFixedStringSize<N extends number> = {\n _clickhouse_fixed_string_size?: N;\n};\n\n/**\n * FixedString(N) - Fixed-length string of exactly N bytes.\n *\n * ClickHouse stores exactly N bytes, padding shorter values with null bytes.\n * Values exceeding N bytes will throw an exception.\n *\n * Use for binary data: hashes, IP addresses, UUIDs, MAC addresses.\n *\n * @example\n * interface BinaryData {\n * md5_hash: string & FixedString<16>; // 16-byte MD5\n * sha256_hash: string & FixedString<32>; // 32-byte SHA256\n * }\n */\nexport type FixedString<N extends number> = string &\n ClickHouseFixedStringSize<N>;\n\nexport type ClickHouseByteSize<N extends number> = {\n _clickhouse_byte_size?: N;\n};\n\nexport type LowCardinality = {\n _LowCardinality?: true;\n};\n\n// ClickHouse-friendly helper aliases for clarity in user schemas\n// These are erased at compile time but guide the ClickHouse mapping logic.\nexport type DateTime = Date;\nexport type DateTime64<P extends number> = Date & ClickHousePrecision<P>;\n\nexport type DateTimeString = string & tags.Format<\"date-time\">;\n/**\n * JS Date objects cannot hold microsecond precision.\n * Use string as the runtime type to avoid losing information.\n */\nexport type DateTime64String<P extends number> = string &\n tags.Format<\"date-time\"> &\n ClickHousePrecision<P>;\n\n// Numeric convenience tags mirroring ClickHouse integer and float families\nexport type Float32 = number & ClickHouseFloat<\"float32\">;\nexport type Float64 = number & ClickHouseFloat<\"float64\">;\n\nexport type Int8 = number & ClickHouseInt<\"int8\">;\nexport type Int16 = number & ClickHouseInt<\"int16\">;\nexport type Int32 = number & ClickHouseInt<\"int32\">;\nexport type Int64 = number & ClickHouseInt<\"int64\">;\n\nexport type UInt8 = number & ClickHouseInt<\"uint8\">;\nexport type UInt16 = number & ClickHouseInt<\"uint16\">;\nexport type UInt32 = number & ClickHouseInt<\"uint32\">;\nexport type UInt64 = number & ClickHouseInt<\"uint64\">;\n\n// Decimal(P, S) annotation\nexport type Decimal<P extends number, S extends number> = string &\n ClickHouseDecimal<P, S>;\n\n/**\n * Attach compression codec to a column type.\n *\n * Any valid ClickHouse codec expression is allowed. ClickHouse validates the codec at runtime.\n *\n * @template T The base data type\n * @template CodecExpr The codec expression (single codec or chain)\n *\n * @example\n * interface Metrics {\n * // Single codec\n * log_blob: string & ClickHouseCodec<\"ZSTD(3)\">;\n *\n * // Codec chain (processed left-to-right)\n * timestamp: Date & ClickHouseCodec<\"Delta, LZ4\">;\n * temperature: number & ClickHouseCodec<\"Gorilla, ZSTD\">;\n *\n * // Specialized codecs\n * counter: number & ClickHouseCodec<\"DoubleDelta\">;\n *\n * // Can combine with other annotations\n * count: UInt64 & ClickHouseCodec<\"DoubleDelta, LZ4\">;\n * }\n */\nexport type ClickHouseCodec<CodecExpr extends string> = {\n _clickhouse_codec?: CodecExpr;\n};\n\nexport type ClickHouseFloat<Value extends \"float32\" | \"float64\"> = tags.Type<\n Value extends \"float32\" ? \"float\" : \"double\"\n>;\n\nexport type ClickHouseInt<\n Value extends\n | \"int8\"\n | \"int16\"\n | \"int32\"\n | \"int64\"\n // | \"int128\"\n // | \"int256\"\n | \"uint8\"\n | \"uint16\"\n | \"uint32\"\n | \"uint64\",\n // | \"uint128\"\n // | \"uint256\",\n> =\n Value extends \"int32\" | \"int64\" | \"uint32\" | \"uint64\" ? tags.Type<Value>\n : TagBase<{\n target: \"number\";\n kind: \"type\";\n value: Value;\n validate: Value extends \"int8\" ? \"-128 <= $input && $input <= 127\"\n : Value extends \"int16\" ? \"-32768 <= $input && $input <= 32767\"\n : Value extends \"uint8\" ? \"0 <= $input && $input <= 255\"\n : Value extends \"uint16\" ? \"0 <= $input && $input <= 65535\"\n : never;\n exclusive: true;\n schema: {\n type: \"integer\";\n };\n }>;\n\n/**\n * By default, nested objects map to the `Nested` type in clickhouse.\n * Write `nestedObject: AnotherInterfaceType & ClickHouseNamedTuple`\n * to map AnotherInterfaceType to the named tuple type.\n */\nexport type ClickHouseNamedTuple = {\n _clickhouse_mapped_type?: \"namedTuple\";\n};\n\nexport type ClickHouseJson<\n maxDynamicPaths extends number | undefined = undefined,\n maxDynamicTypes extends number | undefined = undefined,\n skipPaths extends string[] = [],\n skipRegexes extends string[] = [],\n> = {\n _clickhouse_mapped_type?: \"JSON\";\n _clickhouse_json_settings?: {\n maxDynamicPaths?: maxDynamicPaths;\n maxDynamicTypes?: maxDynamicTypes;\n skipPaths?: skipPaths;\n skipRegexes?: skipRegexes;\n };\n};\n\n// Geometry helper types\nexport type ClickHousePoint = [number, number] & {\n _clickhouse_mapped_type?: \"Point\";\n};\nexport type ClickHouseRing = ClickHousePoint[] & {\n _clickhouse_mapped_type?: \"Ring\";\n};\nexport type ClickHouseLineString = ClickHousePoint[] & {\n _clickhouse_mapped_type?: \"LineString\";\n};\nexport type ClickHouseMultiLineString = ClickHouseLineString[] & {\n _clickhouse_mapped_type?: \"MultiLineString\";\n};\nexport type ClickHousePolygon = ClickHouseRing[] & {\n _clickhouse_mapped_type?: \"Polygon\";\n};\nexport type ClickHouseMultiPolygon = ClickHousePolygon[] & {\n _clickhouse_mapped_type?: \"MultiPolygon\";\n};\n\n/**\n * typia may have trouble handling this type.\n * In which case, use {@link WithDefault} as a workaround\n *\n * @example\n * { field: number & ClickHouseDefault<\"0\"> }\n */\nexport type ClickHouseDefault<SqlExpression extends string> = {\n _clickhouse_default?: SqlExpression;\n};\n\n/**\n * @example\n * {\n * ...\n * timestamp: Date;\n * debugMessage: string & ClickHouseTTL<\"timestamp + INTERVAL 1 WEEK\">;\n * }\n */\nexport type ClickHouseTTL<SqlExpression extends string> = {\n _clickhouse_ttl?: SqlExpression;\n};\n\n/**\n * ClickHouse MATERIALIZED column annotation.\n * The column value is computed at INSERT time and physically stored.\n * Cannot be explicitly inserted by users.\n *\n * @example\n * interface Events {\n * eventTime: DateTime;\n * // Extract date component - computed and stored at insert time\n * eventDate: Date & ClickHouseMaterialized<\"toDate(event_time)\">;\n *\n * userId: string;\n * // Precompute hash for fast lookups\n * userHash: UInt64 & ClickHouseMaterialized<\"cityHash64(userId)\">;\n * }\n *\n * @remarks\n * - MATERIALIZED and DEFAULT are mutually exclusive\n * - Can be combined with ClickHouseCodec for compression\n * - Changing the expression modifies the column in-place (existing values preserved)\n */\nexport type ClickHouseMaterialized<SqlExpression extends string> = {\n _clickhouse_materialized?: SqlExpression;\n};\n\n/**\n * See also {@link ClickHouseDefault}\n *\n * @example{ updated_at: WithDefault<Date, \"now()\"> }\n */\nexport type WithDefault<T, _SqlExpression extends string> = T;\n","import type {\n Column,\n DataType,\n Nested,\n ArrayType,\n} from \"../dataModels/dataModelTypes\";\n\n/**\n * Annotation key used to mark DateTime fields that should remain as strings\n * rather than being parsed into Date objects at runtime.\n */\nexport const STRING_DATE_ANNOTATION = \"stringDate\";\n\n/**\n * Type guard to check if a DataType is a nullable wrapper\n */\nfunction isNullableType(dt: DataType): dt is { nullable: DataType } {\n return (\n typeof dt === \"object\" &&\n dt !== null &&\n \"nullable\" in dt &&\n typeof dt.nullable !== \"undefined\"\n );\n}\n\n/**\n * Type guard to check if a DataType is a Nested type\n */\nfunction isNestedType(dt: DataType): dt is Nested {\n return (\n typeof dt === \"object\" &&\n dt !== null &&\n \"columns\" in dt &&\n Array.isArray(dt.columns)\n );\n}\n\n/**\n * Type guard to check if a DataType is an ArrayType\n */\nfunction isArrayType(dt: DataType): dt is ArrayType {\n return (\n typeof dt === \"object\" &&\n dt !== null &&\n \"elementType\" in dt &&\n typeof dt.elementType !== \"undefined\"\n );\n}\n\n/**\n * Revives ISO 8601 date strings into Date objects during JSON parsing\n * This is useful for automatically converting date strings to Date objects\n */\nexport function jsonDateReviver(key: string, value: unknown): unknown {\n const iso8601Format =\n /^([\\+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24\\:?00)([\\.,]\\d+(?!:))?)?(\\17[0-5]\\d([\\.,]\\d+)?)?([zZ]|([\\+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)$/;\n\n if (typeof value === \"string\" && iso8601Format.test(value)) {\n return new Date(value);\n }\n\n return value;\n}\n\n/**\n * Checks if a DataType represents a datetime column (not just date)\n * AND if the column should be parsed from string to Date at runtime\n *\n * Note: Date and Date16 are date-only types and should remain as strings.\n * Only DateTime types are candidates for parsing to JavaScript Date objects.\n */\nfunction isDateType(dataType: DataType, annotations: [string, any][]): boolean {\n // Check if this is marked as a string-based date (from typia.tags.Format)\n // If so, it should remain as a string, not be parsed to Date\n if (\n annotations.some(\n ([key, value]) => key === STRING_DATE_ANNOTATION && value === true,\n )\n ) {\n return false;\n }\n\n if (typeof dataType === \"string\") {\n // Only DateTime types should be parsed to Date objects\n // Date and Date16 are date-only and should stay as strings\n return dataType === \"DateTime\" || dataType.startsWith(\"DateTime(\");\n }\n // Handle nullable wrapper\n if (isNullableType(dataType)) {\n return isDateType(dataType.nullable, annotations);\n }\n return false;\n}\n\n/**\n * Type of mutation to apply to a field during parsing\n */\nexport type Mutation = \"parseDate\"; // | \"parseBigInt\" - to be added later\n\n/**\n * Recursive tuple array structure representing field mutation operations\n * Each entry is [fieldName, mutation]:\n * - mutation is Mutation[] for leaf fields that need operations applied\n * - mutation is FieldMutations for nested objects/arrays (auto-applies to array elements)\n */\nexport type FieldMutations = [string, Mutation[] | FieldMutations][];\n\n/**\n * Recursively builds field mutations from column definitions\n *\n * @param columns - Array of Column definitions\n * @returns Tuple array of field mutations\n */\nfunction buildFieldMutations(columns: Column[]): FieldMutations {\n const mutations: FieldMutations = [];\n\n for (const column of columns) {\n const dataType = column.data_type;\n\n // Check if this is a date field that should be converted\n if (isDateType(dataType, column.annotations)) {\n mutations.push([column.name, [\"parseDate\"]]);\n continue;\n }\n\n // Handle nested structures\n if (typeof dataType === \"object\" && dataType !== null) {\n // Handle nullable wrapper\n let unwrappedType: DataType = dataType;\n if (isNullableType(dataType)) {\n unwrappedType = dataType.nullable;\n }\n\n // Handle nested objects\n if (isNestedType(unwrappedType)) {\n const nestedMutations = buildFieldMutations(unwrappedType.columns);\n if (nestedMutations.length > 0) {\n mutations.push([column.name, nestedMutations]);\n }\n continue;\n }\n\n // Handle arrays with nested columns\n // The mutations will be auto-applied to each array element at runtime\n if (isArrayType(unwrappedType)) {\n const elementType = unwrappedType.elementType;\n if (isNestedType(elementType)) {\n const nestedMutations = buildFieldMutations(elementType.columns);\n if (nestedMutations.length > 0) {\n mutations.push([column.name, nestedMutations]);\n }\n continue;\n }\n }\n }\n }\n\n return mutations;\n}\n\n/**\n * Applies a mutation operation to a field value\n *\n * @param value - The value to handle\n * @param mutation - The mutation operation to apply\n * @returns The handled value\n */\nfunction applyMutation(value: any, mutation: Mutation): any {\n if (mutation === \"parseDate\") {\n if (typeof value === \"string\") {\n try {\n const date = new Date(value);\n return !isNaN(date.getTime()) ? date : value;\n } catch {\n return value;\n }\n }\n }\n return value;\n}\n\n/**\n * Recursively mutates an object by applying field mutations\n *\n * @param obj - The object to mutate\n * @param mutations - The field mutations to apply\n */\nfunction applyFieldMutations(obj: any, mutations: FieldMutations): void {\n if (!obj || typeof obj !== \"object\") {\n return;\n }\n\n for (const [fieldName, mutation] of mutations) {\n if (!(fieldName in obj)) {\n continue;\n }\n\n if (Array.isArray(mutation)) {\n // Check if it's Mutation[] (leaf) or FieldMutations (nested)\n if (mutation.length > 0 && typeof mutation[0] === \"string\") {\n // It's Mutation[] - apply operations to this field\n const operations = mutation as Mutation[];\n for (const operation of operations) {\n obj[fieldName] = applyMutation(obj[fieldName], operation);\n }\n } else {\n // It's FieldMutations - recurse into nested structure\n const nestedMutations = mutation as FieldMutations;\n const fieldValue = obj[fieldName];\n\n if (Array.isArray(fieldValue)) {\n // Auto-apply to each array element\n for (const item of fieldValue) {\n applyFieldMutations(item, nestedMutations);\n }\n } else if (fieldValue && typeof fieldValue === \"object\") {\n // Apply to nested object\n applyFieldMutations(fieldValue, nestedMutations);\n }\n }\n }\n }\n}\n\n/**\n * Pre-builds field mutations from column schema for efficient reuse\n *\n * @param columns - Column definitions from the Stream schema\n * @returns Field mutations tuple array, or undefined if no columns\n *\n * @example\n * ```typescript\n * const fieldMutations = buildFieldMutationsFromColumns(stream.columnArray);\n * // Reuse fieldMutations for every message\n * ```\n */\nexport function buildFieldMutationsFromColumns(\n columns: Column[] | undefined,\n): FieldMutations | undefined {\n if (!columns || columns.length === 0) {\n return undefined;\n }\n const mutations = buildFieldMutations(columns);\n return mutations.length > 0 ? mutations : undefined;\n}\n\n/**\n * Applies field mutations to parsed data\n * Mutates the object in place for performance\n *\n * @param data - The parsed JSON object to mutate\n * @param fieldMutations - Pre-built field mutations from buildFieldMutationsFromColumns\n *\n * @example\n * ```typescript\n * const fieldMutations = buildFieldMutationsFromColumns(stream.columnArray);\n * const data = JSON.parse(jsonString);\n * mutateParsedJson(data, fieldMutations);\n * // data now has transformations applied per the field mutations\n * ```\n */\nexport function mutateParsedJson(\n data: any,\n fieldMutations: FieldMutations | undefined,\n): void {\n if (!fieldMutations || !data) {\n return;\n }\n\n applyFieldMutations(data, fieldMutations);\n}\n","import ts, { factory, SyntaxKind } from \"typescript\";\nimport {\n avoidTypiaNameClash,\n isMooseFile,\n typiaJsonSchemas,\n sanitizeTypeParameter,\n} from \"../compilerPluginHelper\";\nimport { toColumns } from \"../dataModels/typeConvert\";\nimport { parseAsAny } from \"../dmv2/dataModelMetadata\";\nimport type { ApiUtil } from \"./helpers\";\n\nconst iife = (statements: ts.Statement[]): ts.CallExpression =>\n factory.createCallExpression(\n factory.createParenthesizedExpression(\n factory.createArrowFunction(\n undefined,\n undefined,\n [],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createBlock(statements, true),\n ),\n ),\n undefined,\n [],\n );\n\nexport const isCreateApi = (\n node: ts.Node,\n checker: ts.TypeChecker,\n): node is ts.CallExpression => {\n if (!ts.isCallExpression(node)) {\n return false;\n }\n\n const declaration: ts.Declaration | undefined =\n checker.getResolvedSignature(node)?.declaration;\n if (!declaration || !isMooseFile(declaration.getSourceFile())) {\n return false;\n }\n\n return checker.getTypeAtLocation(declaration).symbol?.name == \"createApi\";\n};\n\nexport const isCreateApiV2 = (\n node: ts.Node,\n checker: ts.TypeChecker,\n): node is ts.NewExpression => {\n if (!ts.isNewExpression(node)) {\n return false;\n }\n\n const declaration: ts.Declaration | undefined =\n checker.getResolvedSignature(node)?.declaration;\n if (!declaration || !isMooseFile(declaration.getSourceFile())) {\n return false;\n }\n\n const sym = checker.getSymbolAtLocation(node.expression);\n return sym?.name === \"Api\" || sym?.name === \"ConsumptionApi\";\n};\n\nconst getParamType = (\n funcType: ts.Type,\n checker: ts.TypeChecker,\n): ts.TypeNode | undefined => {\n const sig = funcType.getCallSignatures()[0];\n const firstParam = sig && sig.getParameters()[0];\n const t = firstParam && checker.getTypeOfSymbol(firstParam);\n return t && checker.typeToTypeNode(t, undefined, undefined);\n};\n\nconst typeToOutputSchema = (t: ts.Type, checker: ts.TypeChecker): ts.Type => {\n if (\n t.isIntersection() &&\n t.types.some((inner) => inner.getSymbol()?.name === \"ResultSet\")\n ) {\n const queryResultSymbol = t.getProperty(\"__query_result_t\");\n if (queryResultSymbol) {\n return checker.getNonNullableType(\n checker.getTypeOfSymbol(queryResultSymbol),\n );\n } else {\n return checker.getAnyType();\n }\n } else if (\n t.getProperty(\"status\") !== undefined &&\n t.getProperty(\"body\") !== undefined\n ) {\n return checker.getTypeOfSymbol(t.getProperty(\"body\")!);\n } else {\n return t;\n }\n};\n\nexport const transformCreateApi = (\n node: ts.Node,\n checker: ts.TypeChecker,\n): ts.Node => {\n if (isCreateApi(node, checker)) {\n return transformLegacyApi(node, checker);\n } else if (isCreateApiV2(node, checker)) {\n return transformNewApi(node as ts.NewExpression, checker);\n }\n\n return node;\n};\n\nexport const transformLegacyApi = (\n node: ts.Node,\n checker: ts.TypeChecker,\n): ts.Node => {\n if (!isCreateApi(node, checker)) {\n return node;\n }\n\n const handlerFunc = node.arguments[0];\n const paramType =\n (node.typeArguments && node.typeArguments[0]) ||\n getParamType(checker.getTypeAtLocation(handlerFunc), checker);\n\n if (paramType === undefined) {\n throw new Error(\"Unknown type for params\");\n }\n\n const handlerType = checker.getTypeAtLocation(handlerFunc);\n const returnType = handlerType.getCallSignatures()[0]?.getReturnType();\n const awaitedType = checker.getAwaitedType(returnType) || returnType;\n\n const queryResultType =\n awaitedType.isUnion() ?\n factory.createUnionTypeNode(\n awaitedType.types.flatMap((t) => {\n const typeNode = checker.typeToTypeNode(\n typeToOutputSchema(t, checker),\n undefined,\n undefined,\n );\n return typeNode === undefined ? [] : [typeNode];\n }),\n )\n : checker.typeToTypeNode(\n typeToOutputSchema(awaitedType, checker),\n undefined,\n undefined,\n );\n\n const wrappedFunc = factory.createArrowFunction(\n undefined,\n undefined,\n [\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(\"params\"),\n undefined,\n undefined,\n undefined,\n ),\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(\"utils\"),\n undefined,\n undefined,\n undefined,\n ),\n ],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createBlock(\n [\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"processedParams\"),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createIdentifier(\"assertGuard\"),\n undefined,\n [\n factory.createNewExpression(\n factory.createIdentifier(\"URLSearchParams\"),\n undefined,\n [factory.createIdentifier(\"params\")],\n ),\n ],\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n factory.createReturnStatement(\n factory.createCallExpression(\n factory.createIdentifier(\"handlerFunc\"),\n undefined,\n [\n factory.createIdentifier(\"processedParams\"),\n factory.createIdentifier(\"utils\"),\n ],\n ),\n ),\n ],\n true,\n ),\n );\n\n return iife([\n // const assertGuard = ____moose____typia.http.createAssertQuery<T>()\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"assertGuard\"),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"http\"),\n ),\n factory.createIdentifier(\"createAssertQuery\"),\n ),\n [sanitizeTypeParameter(paramType)],\n [],\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // the user provided function\n // the Parameters of createApi is a trick to avoid extra imports\n // const handlerFunc: Parameters<typeof createApi<DailyActiveUsersParams>>[0] = async(...) => ...\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"handlerFunc\"),\n undefined,\n factory.createIndexedAccessTypeNode(\n factory.createTypeReferenceNode(\n factory.createIdentifier(\"Parameters\"),\n [\n factory.createTypeQueryNode(\n factory.createIdentifier(\"createApi\"),\n [paramType],\n ),\n ],\n ),\n factory.createLiteralTypeNode(factory.createNumericLiteral(\"0\")),\n ),\n handlerFunc,\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // const wrappedFunc = (params, utils) => {\n // const processedParams = assertGuard(new URLSearchParams(params))\n // return handlerFunc(params, utils)\n // }\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"wrappedFunc\"),\n undefined,\n undefined,\n wrappedFunc,\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // wrappedFunc[\"moose_input_schema\"] = ____moose____typia.json.schemas<[T]>()\n factory.createExpressionStatement(\n factory.createBinaryExpression(\n factory.createElementAccessExpression(\n factory.createIdentifier(\"wrappedFunc\"),\n factory.createStringLiteral(\"moose_input_schema\"),\n ),\n factory.createToken(ts.SyntaxKind.EqualsToken),\n typiaJsonSchemas(paramType),\n ),\n ),\n\n // wrappedFunc[\"moose_output_schema\"] = ____moose____typia.json.schemas<[Output]>()\n factory.createExpressionStatement(\n factory.createBinaryExpression(\n factory.createElementAccessExpression(\n factory.createIdentifier(\"wrappedFunc\"),\n factory.createStringLiteral(\"moose_output_schema\"),\n ),\n factory.createToken(ts.SyntaxKind.EqualsToken),\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"json\"),\n ),\n factory.createIdentifier(\"schemas\"),\n ),\n [\n factory.createTupleTypeNode([\n sanitizeTypeParameter(\n queryResultType ||\n factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n ),\n ]),\n ],\n [],\n ),\n ),\n ),\n\n factory.createReturnStatement(factory.createIdentifier(\"wrappedFunc\")),\n ]);\n};\n\n// TODO: When the legacy api is removed, follow the args\n// pattern in transformNewMooseResource\nconst transformNewApi = (\n node: ts.NewExpression,\n checker: ts.TypeChecker,\n): ts.Node => {\n if (!isCreateApiV2(node, checker)) {\n return node;\n }\n\n if (!node.arguments || node.arguments.length < 2 || !node.typeArguments) {\n return node;\n }\n\n // Get both type parameters from Api<T, R>\n const typeNode = node.typeArguments[0];\n const responseTypeNode =\n node.typeArguments[1] ||\n factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);\n\n // Get the handler function (second argument)\n const handlerFunc = node.arguments[1];\n\n // Create a new handler function that includes validation\n const wrappedHandler = factory.createArrowFunction(\n undefined,\n undefined,\n [\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(\"params\"),\n undefined,\n undefined,\n undefined,\n ),\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(\"utils\"),\n undefined,\n undefined,\n undefined,\n ),\n ],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createBlock(\n [\n // const assertGuard = ____moose____typia.http.createAssertQuery<T>()\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"assertGuard\"),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"http\"),\n ),\n factory.createIdentifier(\"createAssertQuery\"),\n ),\n [typeNode],\n [],\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // const searchParams = new URLSearchParams(params as any)\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"searchParams\"),\n undefined,\n undefined,\n factory.createNewExpression(\n factory.createIdentifier(\"URLSearchParams\"),\n undefined,\n [\n factory.createAsExpression(\n factory.createIdentifier(\"params\"),\n factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n ),\n ],\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // const processedParams = assertGuard(searchParams)\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"processedParams\"),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createIdentifier(\"assertGuard\"),\n undefined,\n [factory.createIdentifier(\"searchParams\")],\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"originalHandler\"),\n undefined,\n factory.createFunctionTypeNode(\n undefined,\n [\n factory.createParameterDeclaration(\n undefined,\n undefined,\n \"params\",\n undefined,\n typeNode,\n ),\n factory.createParameterDeclaration(\n undefined,\n undefined,\n \"utils\",\n undefined,\n factory.createImportTypeNode(\n factory.createLiteralTypeNode(\n factory.createStringLiteral(\"@514labs/moose-lib\"),\n ),\n undefined,\n factory.createIdentifier(\"ApiUtil\"),\n [],\n false,\n ),\n ),\n ],\n factory.createKeywordTypeNode(SyntaxKind.AnyKeyword),\n ),\n factory.createParenthesizedExpression(handlerFunc),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // return originalHandler(processedParams, utils)\n factory.createReturnStatement(\n factory.createCallExpression(\n factory.createIdentifier(\"originalHandler\"),\n undefined,\n [\n factory.createIdentifier(\"processedParams\"),\n factory.createIdentifier(\"utils\"),\n ],\n ),\n ),\n ],\n true,\n ),\n );\n\n // Create the schema arguments\n const inputSchemaArg =\n node.arguments.length > 3 ? node.arguments[3] : typiaJsonSchemas(typeNode);\n const responseSchemaArg = typiaJsonSchemas(responseTypeNode);\n\n // Create the columns argument if it doesn't exist\n const inputColumnsArg = toColumns(\n checker.getTypeAtLocation(typeNode),\n checker,\n );\n\n // Create the config argument if it doesn't exist\n const configArg =\n node.arguments.length > 2 ?\n node.arguments[2]\n : factory.createObjectLiteralExpression([], false);\n\n // Update the Api constructor call with all necessary arguments\n return factory.updateNewExpression(\n node,\n node.expression,\n node.typeArguments,\n [\n node.arguments[0], // name\n wrappedHandler, // wrapped handler\n configArg, // config object\n inputSchemaArg, // input schema\n parseAsAny(JSON.stringify(inputColumnsArg)), // input columns\n responseSchemaArg, // response schema\n ],\n );\n};\n"],"mappings":"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","names":["import_typescript","path","transform","process","fs","import_typescript","import_typescript","import_typescript","ts","t","ts","ts","import_typescript","ts","ts"]}
1
+ {"version":3,"sources":["../src/compilerPlugin.ts","../src/compilerPluginHelper.ts","../src/commons.ts","../src/dmv2/dataModelMetadata.ts","../src/dataModels/typeConvert.ts","../src/dataModels/enumConvert.ts","../src/dataModels/dataModelTypes.ts","../src/dataModels/types.ts","../src/utilities/json.ts","../src/consumption-apis/typiaValidation.ts"],"sourcesContent":["import ts, { factory } from \"typescript\";\nimport { avoidTypiaNameClash, replaceProgram } from \"./compilerPluginHelper\";\nimport { compilerLog } from \"./commons\";\nimport {\n isNewMooseResourceWithTypeParam,\n transformNewMooseResource,\n} from \"./dmv2/dataModelMetadata\";\nimport {\n isCreateApi,\n isCreateApiV2,\n transformCreateApi,\n transformLegacyApi,\n} from \"./consumption-apis/typiaValidation\";\n\n/**\n * Creates the typia import statement to avoid name clashes\n */\nexport const createTypiaImport = () =>\n factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n false,\n factory.createIdentifier(avoidTypiaNameClash),\n undefined,\n ),\n factory.createStringLiteral(\"typia\"),\n undefined,\n );\n\n/**\n * Applies the appropriate transformation based on node type\n * Returns both the transformed node and whether a transformation occurred\n */\nconst applyTransformation = (\n node: ts.Node,\n typeChecker: ts.TypeChecker,\n): { transformed: ts.Node; wasTransformed: boolean } => {\n if (isCreateApi(node, typeChecker)) {\n compilerLog(\"[CompilerPlugin] Found legacy API, transforming...\");\n return {\n transformed: transformLegacyApi(node, typeChecker),\n wasTransformed: true,\n };\n }\n\n if (isCreateApiV2(node, typeChecker)) {\n compilerLog(\"[CompilerPlugin] Found API v2, transforming...\");\n return {\n transformed: transformCreateApi(node, typeChecker),\n wasTransformed: true,\n };\n }\n\n if (isNewMooseResourceWithTypeParam(node, typeChecker)) {\n compilerLog(\n \"[CompilerPlugin] Found Moose resource with type param, transforming...\",\n );\n return {\n transformed: transformNewMooseResource(node, typeChecker),\n wasTransformed: true,\n };\n }\n\n return { transformed: node, wasTransformed: false };\n};\n\n/**\n * Checks if typia import already exists in the source file\n */\nconst hasExistingTypiaImport = (sourceFile: ts.SourceFile): boolean => {\n const hasImport = sourceFile.statements.some((stmt) => {\n if (\n !ts.isImportDeclaration(stmt) ||\n !ts.isStringLiteral(stmt.moduleSpecifier)\n ) {\n return false;\n }\n\n if (stmt.moduleSpecifier.text !== \"typia\") {\n return false;\n }\n\n // Check if it has our specific aliased import\n const importClause = stmt.importClause;\n if (\n importClause &&\n importClause.name &&\n importClause.name.text === avoidTypiaNameClash\n ) {\n return true;\n }\n\n return false;\n });\n compilerLog(\n `[CompilerPlugin] Checking for existing typia import (${avoidTypiaNameClash}) in ${sourceFile.fileName}: ${hasImport}`,\n );\n return hasImport;\n};\n\n/**\n * Adds typia import to the source file if transformations were applied\n */\nconst addTypiaImport = (sourceFile: ts.SourceFile): ts.SourceFile => {\n if (hasExistingTypiaImport(sourceFile)) {\n compilerLog(\n `[CompilerPlugin] Typia import already exists in ${sourceFile.fileName}, skipping...`,\n );\n return sourceFile;\n }\n\n compilerLog(`[CompilerPlugin] Adding typia import to ${sourceFile.fileName}`);\n const statementsWithImport = factory.createNodeArray([\n createTypiaImport(),\n ...sourceFile.statements,\n ]);\n\n return factory.updateSourceFile(sourceFile, statementsWithImport);\n};\n\n/**\n * Main transformation function that processes TypeScript source files\n */\nconst transform =\n (typeChecker: ts.TypeChecker) =>\n (_context: ts.TransformationContext) =>\n (sourceFile: ts.SourceFile): ts.SourceFile => {\n compilerLog(\n `\\n[CompilerPlugin] ========== Processing file: ${sourceFile.fileName} ==========`,\n );\n\n let transformationCount = 0;\n let hasTypiaTransformations = false;\n\n const visitNode = (node: ts.Node): ts.Node => {\n // Apply transformation and check if it was transformed\n const { transformed, wasTransformed } = applyTransformation(\n node,\n typeChecker,\n );\n\n if (wasTransformed) {\n transformationCount++;\n hasTypiaTransformations = true;\n compilerLog(\n `[CompilerPlugin] Transformation #${transformationCount} applied at position ${node.pos}`,\n );\n }\n\n return ts.visitEachChild(transformed, visitNode, undefined);\n };\n\n const transformedSourceFile = ts.visitEachChild(\n sourceFile,\n visitNode,\n undefined,\n );\n\n compilerLog(\n `[CompilerPlugin] Total transformations applied: ${transformationCount}`,\n );\n\n // Use transformation tracking instead of scanning for typia references\n compilerLog(\n `[CompilerPlugin] Needs typia import: ${hasTypiaTransformations}`,\n );\n\n if (hasTypiaTransformations) {\n const result = addTypiaImport(transformedSourceFile);\n compilerLog(\n `[CompilerPlugin] ========== Completed processing ${sourceFile.fileName} (with import) ==========\\n`,\n );\n return result;\n } else {\n compilerLog(\n `[CompilerPlugin] ========== Completed processing ${sourceFile.fileName} (no import needed) ==========\\n`,\n );\n return transformedSourceFile;\n }\n };\n\nexport default replaceProgram(transform);\n","import ts, { factory, TypeNode } from \"typescript\";\nimport path from \"path\";\nimport { PluginConfig, ProgramTransformerExtras } from \"ts-patch\";\nimport process from \"process\";\nimport fs from \"node:fs\";\n\nexport const getPatchedHost = (\n maybeHost: ts.CompilerHost | undefined,\n tsInstance: typeof ts,\n compilerOptions: ts.CompilerOptions,\n): ts.CompilerHost & { fileCache: Map<string, ts.SourceFile> } => {\n const fileCache = new Map();\n const compilerHost =\n maybeHost ?? tsInstance.createCompilerHost(compilerOptions, true);\n const originalGetSourceFile = compilerHost.getSourceFile;\n\n return Object.assign(compilerHost, {\n getSourceFile(fileName: string, languageVersion: ts.ScriptTarget) {\n fileName = tsInstance.server.toNormalizedPath(fileName);\n if (fileCache.has(fileName)) return fileCache.get(fileName);\n\n const sourceFile = originalGetSourceFile.apply(\n void 0,\n Array.from(arguments) as any,\n );\n fileCache.set(fileName, sourceFile);\n\n return sourceFile;\n },\n fileCache,\n });\n};\n\nexport const isMooseFile = (sourceFile: ts.SourceFile): boolean => {\n const location: string = path.resolve(sourceFile.fileName);\n\n return (\n location.includes(\"@514labs/moose-lib\") ||\n // workaround for e2e test\n location.includes(\"packages/ts-moose-lib/dist\") ||\n // support local development with symlinked packages\n location.includes(\"packages/ts-moose-lib/src\")\n );\n};\n\nexport const replaceProgram =\n (\n transform: (\n typeChecker: ts.TypeChecker,\n ) => (\n _context: ts.TransformationContext,\n ) => (sourceFile: ts.SourceFile) => ts.SourceFile,\n ) =>\n (\n program: ts.Program,\n host: ts.CompilerHost | undefined,\n config: PluginConfig,\n { ts: tsInstance }: ProgramTransformerExtras,\n ): ts.Program => {\n const transformFunction = transform(program.getTypeChecker());\n\n const compilerOptions = program.getCompilerOptions();\n\n const compilerHost = getPatchedHost(host, tsInstance, compilerOptions);\n const rootFileNames = program\n .getRootFileNames()\n .map(tsInstance.server.toNormalizedPath);\n\n const transformedSource = tsInstance.transform(\n program.getSourceFiles().filter(\n (sourceFile) =>\n // relative path, or\n !sourceFile.fileName.startsWith(\"/\") ||\n // current directory but not in node_modules\n (sourceFile.fileName.startsWith(`${process.cwd()}`) &&\n !sourceFile.fileName.startsWith(`${process.cwd()}/node_modules`)),\n ),\n [transformFunction],\n compilerOptions,\n ).transformed;\n\n const { printFile } = tsInstance.createPrinter();\n for (const sourceFile of transformedSource) {\n const { fileName, languageVersion } = sourceFile;\n const newFile = printFile(sourceFile);\n\n try {\n const path = fileName.split(\"/\").pop() || fileName;\n const dir = `${process.cwd()}/.moose/api-compile-step/`;\n fs.mkdirSync(dir, {\n recursive: true,\n });\n fs.writeFileSync(`${dir}/${path}`, newFile);\n } catch (e) {\n // this file is just for debugging purposes\n // TODO even printing in std err will fail the import process\n }\n\n const updatedSourceFile = tsInstance.createSourceFile(\n fileName,\n newFile,\n languageVersion,\n );\n (updatedSourceFile as any).version = (sourceFile as any).version;\n compilerHost.fileCache.set(fileName, updatedSourceFile);\n }\n\n return tsInstance.createProgram(\n rootFileNames,\n compilerOptions,\n compilerHost,\n );\n };\n\nexport const avoidTypiaNameClash = \"____moose____typia\";\n\n// Wraps a type parameter with import(\"@514labs/moose-lib\").StripDateIntersection<>\nexport const sanitizeTypeParameter = (typeNode: TypeNode): ts.ImportTypeNode =>\n factory.createImportTypeNode(\n factory.createLiteralTypeNode(\n factory.createStringLiteral(\"@514labs/moose-lib\"),\n ),\n undefined,\n factory.createIdentifier(\"StripDateIntersection\"),\n [typeNode],\n false,\n );\n\nexport const typiaJsonSchemas = (typeNode: TypeNode) =>\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"json\"),\n ),\n factory.createIdentifier(\"schemas\"),\n ),\n [factory.createTupleTypeNode([sanitizeTypeParameter(typeNode)])],\n [],\n );\n","import http from \"http\";\nimport { createClient } from \"@clickhouse/client\";\nimport { KafkaJS } from \"@514labs/kafka-javascript\";\nimport { SASLOptions } from \"@514labs/kafka-javascript/types/kafkajs\";\nconst { Kafka } = KafkaJS;\ntype Kafka = KafkaJS.Kafka;\ntype Consumer = KafkaJS.Consumer;\nexport type Producer = KafkaJS.Producer;\n\n/**\n * Utility function for compiler-related logging that can be disabled via environment variable.\n * Set MOOSE_DISABLE_COMPILER_LOGS=true to suppress these logs (useful for testing environments).\n */\n\n/**\n * Returns true if the value is a common truthy string: \"1\", \"true\", \"yes\", \"on\" (case-insensitive).\n */\nfunction isTruthy(value: string | undefined): boolean {\n if (!value) return false;\n switch (value.trim().toLowerCase()) {\n case \"1\":\n case \"true\":\n case \"yes\":\n case \"on\":\n return true;\n default:\n return false;\n }\n}\n\nexport const compilerLog = (message: string) => {\n if (!isTruthy(process.env.MOOSE_DISABLE_COMPILER_LOGS)) {\n console.log(message);\n }\n};\n\nexport const antiCachePath = (path: string) =>\n `${path}?num=${Math.random().toString()}&time=${Date.now()}`;\n\nexport const getFileName = (filePath: string) => {\n const regex = /\\/([^\\/]+)\\.ts/;\n const matches = filePath.match(regex);\n if (matches && matches.length > 1) {\n return matches[1];\n }\n return \"\";\n};\n\ninterface ClientConfig {\n username: string;\n password: string;\n database: string;\n useSSL: string;\n host: string;\n port: string;\n}\n\nexport const getClickhouseClient = ({\n username,\n password,\n database,\n useSSL,\n host,\n port,\n}: ClientConfig) => {\n const protocol =\n useSSL === \"1\" || useSSL.toLowerCase() === \"true\" ? \"https\" : \"http\";\n console.log(`Connecting to Clickhouse at ${protocol}://${host}:${port}`);\n return createClient({\n url: `${protocol}://${host}:${port}`,\n username: username,\n password: password,\n database: database,\n application: \"moose\",\n // Note: wait_end_of_query is configured per operation type, not globally\n // to preserve SELECT query performance while ensuring INSERT/DDL reliability\n });\n};\n\nexport type CliLogData = {\n message_type?: \"Info\" | \"Success\" | \"Error\" | \"Highlight\";\n action: string;\n message: string;\n};\n\nexport const cliLog: (log: CliLogData) => void = (log) => {\n const req = http.request({\n port: parseInt(process.env.MOOSE_MANAGEMENT_PORT ?? \"5001\"),\n method: \"POST\",\n path: \"/logs\",\n });\n\n req.on(\"error\", (err: Error) => {\n console.log(`Error ${err.name} sending CLI log.`, err.message);\n });\n\n req.write(JSON.stringify({ message_type: \"Info\", ...log }));\n req.end();\n};\n\n/**\n * Method to change .ts, .cts, and .mts to .js, .cjs, and .mjs\n * This is needed because 'import' does not support .ts, .cts, and .mts\n */\nexport function mapTstoJs(filePath: string): string {\n return filePath\n .replace(/\\.ts$/, \".js\")\n .replace(/\\.cts$/, \".cjs\")\n .replace(/\\.mts$/, \".mjs\");\n}\n\nexport const MAX_RETRIES = 150;\nexport const MAX_RETRY_TIME_MS = 1000;\nexport const RETRY_INITIAL_TIME_MS = 100;\n\nexport const MAX_RETRIES_PRODUCER = 150;\nexport const RETRY_FACTOR_PRODUCER = 0.2;\n// Means all replicas need to acknowledge the message\nexport const ACKs = -1;\n\n/**\n * Creates the base producer configuration for Kafka.\n * Used by both the SDK stream publishing and streaming function workers.\n *\n * @param maxMessageBytes - Optional max message size in bytes (synced with topic config)\n * @returns Producer configuration object for the Confluent Kafka client\n */\nexport function createProducerConfig(maxMessageBytes?: number) {\n return {\n kafkaJS: {\n idempotent: false, // Not needed for at-least-once delivery\n acks: ACKs,\n retry: {\n retries: MAX_RETRIES_PRODUCER,\n maxRetryTime: MAX_RETRY_TIME_MS,\n },\n },\n \"linger.ms\": 0, // This is to make sure at least once delivery with immediate feedback on the send\n ...(maxMessageBytes && { \"message.max.bytes\": maxMessageBytes }),\n };\n}\n\n/**\n * Parses a comma-separated broker string into an array of valid broker addresses.\n * Handles whitespace trimming and filters out empty elements.\n *\n * @param brokerString - Comma-separated broker addresses (e.g., \"broker1:9092, broker2:9092, , broker3:9092\")\n * @returns Array of trimmed, non-empty broker addresses\n */\nconst parseBrokerString = (brokerString: string): string[] =>\n brokerString\n .split(\",\")\n .map((b) => b.trim())\n .filter((b) => b.length > 0);\n\nexport type KafkaClientConfig = {\n clientId: string;\n broker: string;\n securityProtocol?: string; // e.g. \"SASL_SSL\" or \"PLAINTEXT\"\n saslUsername?: string;\n saslPassword?: string;\n saslMechanism?: string; // e.g. \"scram-sha-256\", \"plain\"\n};\n\n/**\n * Dynamically creates and connects a KafkaJS producer using the provided configuration.\n * Returns a connected producer instance.\n *\n * @param cfg - Kafka client configuration\n * @param logger - Logger instance\n * @param maxMessageBytes - Optional max message size in bytes (synced with topic config)\n */\nexport async function getKafkaProducer(\n cfg: KafkaClientConfig,\n logger: Logger,\n maxMessageBytes?: number,\n): Promise<Producer> {\n const kafka = await getKafkaClient(cfg, logger);\n\n const producer = kafka.producer(createProducerConfig(maxMessageBytes));\n await producer.connect();\n return producer;\n}\n\n/**\n * Interface for logging functionality\n */\nexport interface Logger {\n logPrefix: string;\n log: (message: string) => void;\n error: (message: string) => void;\n warn: (message: string) => void;\n}\n\nexport const logError = (logger: Logger, e: Error): void => {\n logger.error(e.message);\n const stack = e.stack;\n if (stack) {\n logger.error(stack);\n }\n};\n\n/**\n * Builds SASL configuration for Kafka client authentication\n */\nconst buildSaslConfig = (\n logger: Logger,\n args: KafkaClientConfig,\n): SASLOptions | undefined => {\n const mechanism = args.saslMechanism ? args.saslMechanism.toLowerCase() : \"\";\n switch (mechanism) {\n case \"plain\":\n case \"scram-sha-256\":\n case \"scram-sha-512\":\n return {\n mechanism: mechanism,\n username: args.saslUsername || \"\",\n password: args.saslPassword || \"\",\n };\n default:\n logger.warn(`Unsupported SASL mechanism: ${args.saslMechanism}`);\n return undefined;\n }\n};\n\n/**\n * Dynamically creates a KafkaJS client configured with provided settings.\n * Use this to construct producers/consumers with custom options.\n */\nexport const getKafkaClient = async (\n cfg: KafkaClientConfig,\n logger: Logger,\n): Promise<Kafka> => {\n const brokers = parseBrokerString(cfg.broker || \"\");\n if (brokers.length === 0) {\n throw new Error(`No valid broker addresses found in: \"${cfg.broker}\"`);\n }\n\n logger.log(`Creating Kafka client with brokers: ${brokers.join(\", \")}`);\n logger.log(`Security protocol: ${cfg.securityProtocol || \"plaintext\"}`);\n logger.log(`Client ID: ${cfg.clientId}`);\n\n const saslConfig = buildSaslConfig(logger, cfg);\n\n return new Kafka({\n kafkaJS: {\n clientId: cfg.clientId,\n brokers,\n ssl: cfg.securityProtocol === \"SASL_SSL\",\n ...(saslConfig && { sasl: saslConfig }),\n retry: {\n initialRetryTime: RETRY_INITIAL_TIME_MS,\n maxRetryTime: MAX_RETRY_TIME_MS,\n retries: MAX_RETRIES,\n },\n },\n });\n};\n","import ts, { factory } from \"typescript\";\nimport {\n avoidTypiaNameClash,\n isMooseFile,\n typiaJsonSchemas,\n sanitizeTypeParameter,\n} from \"../compilerPluginHelper\";\nimport { toColumns } from \"../dataModels/typeConvert\";\nimport { IJsonSchemaCollection } from \"typia/src/schemas/json/IJsonSchemaCollection\";\nimport { dlqSchema } from \"./internal\";\n\nconst typesToArgsLength = new Map([\n [\"OlapTable\", 2],\n [\"Stream\", 2],\n [\"DeadLetterQueue\", 2],\n [\"IngestPipeline\", 2],\n [\"IngestApi\", 2],\n [\"Api\", 2],\n [\"MaterializedView\", 1],\n [\"Task\", 2],\n]);\n\nexport const isNewMooseResourceWithTypeParam = (\n node: ts.Node,\n checker: ts.TypeChecker,\n): node is ts.NewExpression => {\n if (!ts.isNewExpression(node)) {\n return false;\n }\n\n const declaration: ts.Declaration | undefined =\n checker.getResolvedSignature(node)?.declaration;\n\n if (!declaration || !isMooseFile(declaration.getSourceFile())) {\n return false;\n }\n const sym = checker.getSymbolAtLocation(node.expression);\n const typeName = sym?.name ?? \"\";\n if (!typesToArgsLength.has(typeName)) {\n return false;\n }\n\n return (\n // name only\n (node.arguments?.length === 1 ||\n // config param\n node.arguments?.length === 2) &&\n node.typeArguments?.length === 1\n );\n};\n\nexport const parseAsAny = (s: string) =>\n factory.createAsExpression(\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"JSON\"),\n factory.createIdentifier(\"parse\"),\n ),\n undefined,\n [factory.createStringLiteral(s)],\n ),\n factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n );\n\nconst typiaTypeGuard = (node: ts.NewExpression) => {\n const typeNode = node.typeArguments![0];\n return factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"createAssert\"),\n ),\n [sanitizeTypeParameter(typeNode)],\n [],\n );\n};\n\nexport const transformNewMooseResource = (\n node: ts.NewExpression,\n checker: ts.TypeChecker,\n): ts.Node => {\n const typeName = checker.getSymbolAtLocation(node.expression)!.name;\n\n const typeNode = node.typeArguments![0];\n\n // For IngestPipeline, check if table is configured in the config object\n // Index signatures are only allowed when table is false/not configured\n // (because OlapTable requires a fixed schema)\n let ingestPipelineHasTable = true; // Default to true (safe: disallows index signatures)\n if (\n typeName === \"IngestPipeline\" &&\n node.arguments &&\n node.arguments.length >= 2\n ) {\n const configArg = node.arguments[1];\n if (ts.isObjectLiteralExpression(configArg)) {\n const tableProperty = configArg.properties.find(\n (prop): prop is ts.PropertyAssignment =>\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === \"table\",\n );\n if (tableProperty) {\n const tableValue = tableProperty.initializer;\n // Check if table value is explicitly false\n ingestPipelineHasTable = tableValue.kind !== ts.SyntaxKind.FalseKeyword;\n }\n // If table property is not found, keep default (true = has table)\n // This is the safe default since 'table' is a required property\n }\n }\n\n // Allow index signatures for IngestApi, Stream, and IngestPipeline (when table is not configured)\n // These resources accept arbitrary payload fields that pass through to streaming functions\n const allowIndexSignatures =\n [\"IngestApi\", \"Stream\"].includes(typeName) ||\n (typeName === \"IngestPipeline\" && !ingestPipelineHasTable);\n\n // Check if the type actually has an index signature\n const typeAtLocation = checker.getTypeAtLocation(typeNode);\n const indexSignatures = checker.getIndexInfosOfType(typeAtLocation);\n const hasIndexSignature = allowIndexSignatures && indexSignatures.length > 0;\n\n // Validate: IngestPipeline with table=true cannot have index signatures\n // because extra fields would be silently dropped when writing to ClickHouse\n if (\n typeName === \"IngestPipeline\" &&\n ingestPipelineHasTable &&\n indexSignatures.length > 0\n ) {\n throw new Error(\n `IngestPipeline cannot use a type with index signatures when 'table' is configured. ` +\n `Extra fields would be silently dropped when writing to the ClickHouse table. ` +\n `Either:\\n` +\n ` 1. Remove the index signature from your type to use a fixed schema, or\\n` +\n ` 2. Set 'table: false' in your IngestPipeline config if you only need the API and stream`,\n );\n }\n\n const internalArguments =\n typeName === \"DeadLetterQueue\" ?\n [typiaTypeGuard(node)]\n : [\n typiaJsonSchemas(typeNode),\n parseAsAny(\n JSON.stringify(\n toColumns(typeAtLocation, checker, {\n allowIndexSignatures,\n }),\n ),\n ),\n ];\n const resourceName = checker.getSymbolAtLocation(node.expression)!.name;\n\n const argLength = typesToArgsLength.get(resourceName)!;\n const needsExtraArg = node.arguments!.length === argLength - 1; // provide empty config if undefined\n\n let updatedArgs = [\n ...node.arguments!,\n ...(needsExtraArg ?\n [factory.createObjectLiteralExpression([], false)]\n : []),\n ...internalArguments,\n ];\n\n // For OlapTable and IngestPipeline, also inject typia validation functions\n if (resourceName === \"OlapTable\" || resourceName === \"IngestPipeline\") {\n // Create a single TypiaValidators object with all three validation functions\n const validatorsObject = factory.createObjectLiteralExpression(\n [\n factory.createPropertyAssignment(\n factory.createIdentifier(\"validate\"),\n createTypiaValidator(typeNode),\n ),\n factory.createPropertyAssignment(\n factory.createIdentifier(\"assert\"),\n createTypiaAssert(typeNode),\n ),\n factory.createPropertyAssignment(\n factory.createIdentifier(\"is\"),\n createTypiaIs(typeNode),\n ),\n ],\n true,\n );\n\n updatedArgs = [...updatedArgs, validatorsObject];\n\n // For IngestPipeline, also pass allowExtraFields so it can propagate to internal Stream/IngestApi\n if (resourceName === \"IngestPipeline\") {\n updatedArgs = [\n ...updatedArgs,\n hasIndexSignature ? factory.createTrue() : factory.createFalse(),\n ];\n }\n }\n\n // For IngestApi and Stream, add the allowExtraFields flag after undefined validators\n // This enables passing extra fields through to streaming functions when the type has an index signature\n if (resourceName === \"IngestApi\" || resourceName === \"Stream\") {\n updatedArgs = [\n ...updatedArgs,\n factory.createIdentifier(\"undefined\"), // validators (not used for these types)\n hasIndexSignature ? factory.createTrue() : factory.createFalse(),\n ];\n }\n\n return ts.factory.updateNewExpression(\n node,\n node.expression,\n node.typeArguments,\n updatedArgs,\n );\n};\n\n/**\n * Creates a typia validator function call for the given type\n * e.g., ____moose____typia.createValidate<T>()\n */\nexport const createTypiaValidator = (typeNode: ts.TypeNode) => {\n // Create the typia validator call\n const typiaValidator = factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"createValidate\"),\n ),\n [sanitizeTypeParameter(typeNode)],\n [],\n );\n\n // Wrap it to transform the result to match our expected interface\n // (data: unknown) => {\n // const result = typiaValidator(data);\n // return {\n // success: result.success,\n // data: result.success ? result.data : undefined,\n // errors: result.success ? undefined : result.errors\n // };\n // }\n return factory.createArrowFunction(\n undefined,\n undefined,\n [\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(\"data\"),\n undefined,\n factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword),\n undefined,\n ),\n ],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createBlock(\n [\n // const result = typiaValidator(data);\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"result\"),\n undefined,\n undefined,\n factory.createCallExpression(typiaValidator, undefined, [\n factory.createIdentifier(\"data\"),\n ]),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // return { success: result.success, data: result.success ? result.data : undefined, errors: result.success ? undefined : result.errors };\n factory.createReturnStatement(\n factory.createObjectLiteralExpression(\n [\n factory.createPropertyAssignment(\n factory.createIdentifier(\"success\"),\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"result\"),\n factory.createIdentifier(\"success\"),\n ),\n ),\n factory.createPropertyAssignment(\n factory.createIdentifier(\"data\"),\n factory.createConditionalExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"result\"),\n factory.createIdentifier(\"success\"),\n ),\n factory.createToken(ts.SyntaxKind.QuestionToken),\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"result\"),\n factory.createIdentifier(\"data\"),\n ),\n factory.createToken(ts.SyntaxKind.ColonToken),\n factory.createIdentifier(\"undefined\"),\n ),\n ),\n factory.createPropertyAssignment(\n factory.createIdentifier(\"errors\"),\n factory.createConditionalExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"result\"),\n factory.createIdentifier(\"success\"),\n ),\n factory.createToken(ts.SyntaxKind.QuestionToken),\n factory.createIdentifier(\"undefined\"),\n factory.createToken(ts.SyntaxKind.ColonToken),\n factory.createPropertyAccessExpression(\n factory.createIdentifier(\"result\"),\n factory.createIdentifier(\"errors\"),\n ),\n ),\n ),\n ],\n true,\n ),\n ),\n ],\n true,\n ),\n );\n};\n\n/**\n * Creates a typia assert function call for the given type\n * e.g., ____moose____typia.createAssert<T>()\n */\nexport const createTypiaAssert = (typeNode: ts.TypeNode) =>\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"createAssert\"),\n ),\n [sanitizeTypeParameter(typeNode)],\n [],\n );\n\n/**\n * Creates a typia is function call for the given type\n * e.g., ____moose____typia.createIs<T>()\n */\nexport const createTypiaIs = (typeNode: ts.TypeNode) =>\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"createIs\"),\n ),\n [sanitizeTypeParameter(typeNode)],\n [],\n );\n","import ts, {\n isIdentifier,\n isTypeReferenceNode,\n SymbolFlags,\n TupleType,\n TypeChecker,\n TypeFlags,\n} from \"typescript\";\nimport { enumConvert, isEnum } from \"./enumConvert\";\nimport {\n ArrayType,\n Column,\n DataType,\n DataEnum,\n Nested,\n NamedTupleType,\n NullType,\n UnknownType,\n UnsupportedFeature,\n IndexType,\n MapType,\n} from \"./dataModelTypes\";\nimport { ClickHouseNamedTuple, DecimalRegex } from \"./types\";\nimport { STRING_DATE_ANNOTATION } from \"../utilities/json\";\n\nconst dateType = (checker: TypeChecker) =>\n checker\n .getTypeOfSymbol(\n checker.resolveName(\"Date\", undefined, SymbolFlags.Type, false)!,\n )\n .getConstructSignatures()[0]\n .getReturnType();\n\n// making throws expressions so that they can be used in ternaries\n\nconst throwUnknownType = (\n t: ts.Type,\n fieldName: string,\n typeName: string,\n): never => {\n throw new UnknownType(t, fieldName, typeName);\n};\n\nconst throwNullType = (fieldName: string, typeName: string): never => {\n throw new NullType(fieldName, typeName);\n};\n\nconst throwIndexTypeError = (t: ts.Type, checker: TypeChecker): never => {\n const interfaceName = t.symbol?.name || \"unknown type\";\n const indexInfos = checker.getIndexInfosOfType(t);\n const signatures = indexInfos.map((info) => {\n const keyType = checker.typeToString(info.keyType);\n const valueType = checker.typeToString(info.type);\n return `[${keyType}]: ${valueType}`;\n });\n\n throw new IndexType(interfaceName, signatures);\n};\n\n/** Recursively search for a property on a type, traversing intersections */\nconst getPropertyDeep = (t: ts.Type, name: string): ts.Symbol | undefined => {\n const direct = t.getProperty(name);\n if (direct !== undefined) return direct;\n // TODO: investigate if this logic is needed.\n // the properties in types in intersection should be reachable by t.getProperty\n // Intersection constituents may carry the marker symbols\n if (t.isIntersection()) {\n for (const sub of t.types) {\n const found = getPropertyDeep(sub, name);\n if (found) return found;\n }\n }\n return undefined;\n};\n\nconst toArrayType = ([elementNullable, _, elementType]: [\n boolean,\n [string, any][],\n DataType,\n]): ArrayType => {\n return {\n elementNullable,\n elementType,\n };\n};\n\nconst isNumberType = (t: ts.Type, checker: TypeChecker): boolean => {\n return checker.isTypeAssignableTo(t, checker.getNumberType());\n};\n\nconst handleAggregated = (\n t: ts.Type,\n checker: TypeChecker,\n fieldName: string,\n typeName: string,\n): AggregationFunction | undefined => {\n const functionSymbol = t.getProperty(\"_aggregationFunction\");\n const argsTypesSymbol = t.getProperty(\"_argTypes\");\n\n if (functionSymbol === undefined || argsTypesSymbol === undefined) {\n return undefined;\n }\n const functionStringLiteral = checker.getNonNullableType(\n checker.getTypeOfSymbol(functionSymbol),\n );\n const types = checker.getNonNullableType(\n checker.getTypeOfSymbol(argsTypesSymbol),\n );\n\n if (functionStringLiteral.isStringLiteral() && checker.isTupleType(types)) {\n const argumentTypes = ((types as TupleType).typeArguments || []).map(\n (argT) => {\n return tsTypeToDataType(argT, checker, fieldName, typeName, false)[2];\n },\n );\n return { functionName: functionStringLiteral.value, argumentTypes };\n } else {\n console.log(\n \"[CompilerPlugin] Unexpected type inside Aggregated\",\n functionStringLiteral,\n );\n return undefined;\n }\n};\n\nconst getTaggedType = (\n t: ts.Type,\n checker: TypeChecker,\n propertyName: string,\n): ts.Type | null => {\n // Ensure we check the non-nullable part so the tag property is there\n const nonNull = t.getNonNullableType();\n const ttlSymbol = nonNull.getProperty(propertyName);\n if (ttlSymbol === undefined) return null;\n return checker.getNonNullableType(checker.getTypeOfSymbol(ttlSymbol));\n};\n\n// JSON mapping: recognize SomeInterface & ClickHouseJson<...>\nconst getJsonMappedType = (\n t: ts.Type,\n checker: TypeChecker,\n): DataType | null => {\n const mappingSymbol = getPropertyDeep(t, \"_clickhouse_mapped_type\");\n if (mappingSymbol === undefined) return null;\n const mappedType = checker.getNonNullableType(\n checker.getTypeOfSymbol(mappingSymbol),\n );\n if (!mappedType.isStringLiteral() || mappedType.value !== \"JSON\") {\n return null;\n }\n\n // Extract settings from the type properties\n let maxDynamicPaths: number | undefined = undefined;\n let maxDynamicTypes: number | undefined = undefined;\n let skipPaths: string[] = [];\n let skipRegexes: string[] = [];\n\n const settingsSymbol = getPropertyDeep(t, \"_clickhouse_json_settings\");\n if (settingsSymbol !== undefined) {\n const settingsType = checker.getNonNullableType(\n checker.getTypeOfSymbol(settingsSymbol),\n );\n\n const maxPathsSymbol = getPropertyDeep(settingsType, \"maxDynamicPaths\");\n if (maxPathsSymbol !== undefined) {\n const maxPathsType = checker.getNonNullableType(\n checker.getTypeOfSymbol(maxPathsSymbol),\n );\n if (maxPathsType.isNumberLiteral()) {\n maxDynamicPaths = maxPathsType.value;\n }\n }\n\n const maxTypesSymbol = getPropertyDeep(settingsType, \"maxDynamicTypes\");\n if (maxTypesSymbol !== undefined) {\n const maxTypesType = checker.getNonNullableType(\n checker.getTypeOfSymbol(maxTypesSymbol),\n );\n if (maxTypesType.isNumberLiteral()) {\n maxDynamicTypes = maxTypesType.value;\n }\n }\n\n const skipPathsSymbol = getPropertyDeep(settingsType, \"skipPaths\");\n if (skipPathsSymbol !== undefined) {\n const skipPathsType = checker.getNonNullableType(\n checker.getTypeOfSymbol(skipPathsSymbol),\n );\n if (checker.isTupleType(skipPathsType)) {\n const tuple = skipPathsType as TupleType;\n skipPaths = (tuple.typeArguments || [])\n .filter((t) => t.isStringLiteral())\n .map((t) => (t as ts.StringLiteralType).value);\n }\n }\n\n const skipRegexesSymbol = getPropertyDeep(settingsType, \"skipRegexes\");\n if (skipRegexesSymbol !== undefined) {\n const skipRegexesType = checker.getNonNullableType(\n checker.getTypeOfSymbol(skipRegexesSymbol),\n );\n if (checker.isTupleType(skipRegexesType)) {\n const tuple = skipRegexesType as TupleType;\n skipRegexes = (tuple.typeArguments || [])\n .filter((t) => t.isStringLiteral())\n .map((t) => (t as ts.StringLiteralType).value);\n }\n }\n }\n\n // For typed paths, try to find the interface part of the intersection\n let base: ts.Type = t.getNonNullableType();\n if (base.isIntersection()) {\n const candidates = base.types.filter((sub) => {\n const m = getPropertyDeep(sub, \"_clickhouse_mapped_type\");\n if (!m) return true;\n const mt = checker.getNonNullableType(checker.getTypeOfSymbol(m));\n return !(mt.isStringLiteral() && mt.value === \"JSON\");\n });\n if (candidates.length > 0) base = candidates[0];\n }\n\n // Build typed paths from the base interface's columns (top-level only)\n let typedPaths: Array<[string, DataType]> = [];\n try {\n const cols = toColumns(base, checker);\n typedPaths = cols.map((c) => [c.name, c.data_type]);\n } catch (_) {\n // Fallback silently if we cannot derive columns\n typedPaths = [];\n }\n\n const hasAnyOption =\n typeof maxDynamicPaths === \"number\" ||\n typeof maxDynamicTypes === \"number\" ||\n typedPaths.length > 0 ||\n skipPaths.length > 0 ||\n skipRegexes.length > 0;\n\n if (!hasAnyOption) return \"Json\";\n\n const result: Record<string, any> = {\n typed_paths: typedPaths,\n skip_paths: skipPaths,\n skip_regexps: skipRegexes,\n };\n\n // Only include these fields if they have actual values\n if (typeof maxDynamicPaths === \"number\") {\n result.max_dynamic_paths = maxDynamicPaths;\n }\n if (typeof maxDynamicTypes === \"number\") {\n result.max_dynamic_types = maxDynamicTypes;\n }\n\n return result as unknown as DataType;\n};\n\nconst handleSimpleAggregated = (\n t: ts.Type,\n checker: TypeChecker,\n fieldName: string,\n typeName: string,\n): SimpleAggregationFunction | undefined => {\n const functionSymbol = t.getProperty(\"_simpleAggregationFunction\");\n const argTypeSymbol = t.getProperty(\"_argType\");\n\n if (functionSymbol === undefined || argTypeSymbol === undefined) {\n return undefined;\n }\n const functionStringLiteral = checker.getNonNullableType(\n checker.getTypeOfSymbol(functionSymbol),\n );\n const argType = checker.getNonNullableType(\n checker.getTypeOfSymbol(argTypeSymbol),\n );\n\n if (functionStringLiteral.isStringLiteral()) {\n const argumentType = tsTypeToDataType(\n argType,\n checker,\n fieldName,\n typeName,\n false,\n )[2];\n return { functionName: functionStringLiteral.value, argumentType };\n } else {\n console.log(\n \"[CompilerPlugin] Unexpected type inside SimpleAggregated\",\n functionStringLiteral,\n );\n return undefined;\n }\n};\n/** Detect ClickHouse default annotation on a type and return raw sql */\nconst handleDefault = (t: ts.Type, checker: TypeChecker): string | null => {\n const defaultType = getTaggedType(t, checker, \"_clickhouse_default\");\n if (defaultType === null) {\n return null;\n }\n if (!defaultType.isStringLiteral()) {\n throw new UnsupportedFeature(\n 'ClickHouseDefault must use a string literal, e.g. ClickHouseDefault<\"now()\">',\n );\n }\n return defaultType.value;\n};\n\n/** Detect ClickHouse materialized annotation on a type and return raw sql */\nconst handleMaterialized = (\n t: ts.Type,\n checker: TypeChecker,\n): string | null => {\n const materializedType = getTaggedType(\n t,\n checker,\n \"_clickhouse_materialized\",\n );\n if (materializedType === null) {\n return null;\n }\n if (!materializedType.isStringLiteral()) {\n throw new UnsupportedFeature(\n 'ClickHouseMaterialized must use a string literal, e.g. ClickHouseMaterialized<\"toDate(timestamp)\">',\n );\n }\n return materializedType.value;\n};\n\n/** Detect ClickHouse TTL annotation on a type and return raw sql */\nconst handleTtl = (t: ts.Type, checker: TypeChecker): string | null => {\n const ttlType = getTaggedType(t, checker, \"_clickhouse_ttl\");\n if (ttlType === null) {\n return null;\n }\n if (!ttlType.isStringLiteral()) {\n throw new UnsupportedFeature(\n 'ClickHouseTTL must use a string literal, e.g. ClickHouseTTL<\"timestamp + INTERVAL 1 WEEK\">',\n );\n }\n return ttlType.value;\n};\n\nconst handleNumberType = (\n t: ts.Type,\n checker: TypeChecker,\n fieldName: string,\n): string => {\n // Detect Decimal(P, S) annotation on number via ClickHouseDecimal\n const decimalPrecisionSymbol = getPropertyDeep(t, \"_clickhouse_precision\");\n const decimalScaleSymbol = getPropertyDeep(t, \"_clickhouse_scale\");\n if (\n decimalPrecisionSymbol !== undefined &&\n decimalScaleSymbol !== undefined\n ) {\n const precisionType = checker.getNonNullableType(\n checker.getTypeOfSymbol(decimalPrecisionSymbol),\n );\n const scaleType = checker.getNonNullableType(\n checker.getTypeOfSymbol(decimalScaleSymbol),\n );\n if (precisionType.isNumberLiteral() && scaleType.isNumberLiteral()) {\n return `Decimal(${precisionType.value}, ${scaleType.value})`;\n }\n }\n\n const tagSymbol = t.getProperty(\"typia.tag\");\n if (tagSymbol === undefined) {\n return \"Float64\";\n } else {\n const typiaProps = checker.getNonNullableType(\n checker.getTypeOfSymbol(tagSymbol),\n );\n const props: ts.Type[] =\n typiaProps.isIntersection() ? typiaProps.types : [typiaProps];\n\n for (const prop of props) {\n const valueSymbol = prop.getProperty(\"value\");\n if (valueSymbol === undefined) {\n console.log(\n `[CompilerPlugin] Props.value is undefined for ${fieldName}`,\n );\n } else {\n const valueTypeLiteral = checker.getTypeOfSymbol(valueSymbol);\n const numberTypeMappings = {\n float: \"Float32\",\n double: \"Float64\",\n int8: \"Int8\",\n int16: \"Int16\",\n int32: \"Int32\",\n int64: \"Int64\",\n uint8: \"UInt8\",\n uint16: \"UInt16\",\n uint32: \"UInt32\",\n uint64: \"UInt64\",\n };\n const match = Object.entries(numberTypeMappings).find(([k, _]) =>\n isStringLiteral(valueTypeLiteral, checker, k),\n );\n if (match) {\n return match[1];\n } else {\n const typeString =\n valueTypeLiteral.isStringLiteral() ?\n valueTypeLiteral.value\n : \"unknown\";\n\n console.log(\n `[CompilerPlugin] Other number types are not supported: ${typeString} in field ${fieldName}`,\n );\n }\n }\n }\n\n return \"Float64\";\n }\n};\n\nexport interface AggregationFunction {\n functionName: string;\n argumentTypes: DataType[];\n}\n\nexport interface SimpleAggregationFunction {\n functionName: string;\n argumentType: DataType;\n}\n\nconst isStringLiteral = (\n t: ts.Type,\n checker: TypeChecker,\n lit: string,\n): boolean => checker.isTypeAssignableTo(t, checker.getStringLiteralType(lit));\n\nconst handleStringType = (\n t: ts.Type,\n checker: TypeChecker,\n fieldName: string,\n annotations: [string, any][],\n): string => {\n // Check for FixedString(N) annotation\n const fixedStringSizeSymbol = getPropertyDeep(\n t,\n \"_clickhouse_fixed_string_size\",\n );\n if (fixedStringSizeSymbol !== undefined) {\n const sizeType = checker.getNonNullableType(\n checker.getTypeOfSymbol(fixedStringSizeSymbol),\n );\n if (sizeType.isNumberLiteral()) {\n return `FixedString(${sizeType.value})`;\n }\n }\n\n const tagSymbol = t.getProperty(\"typia.tag\");\n if (tagSymbol === undefined) {\n if (t.isUnion() && t.types.every((v) => v.isStringLiteral())) {\n annotations.push([\"LowCardinality\", true]);\n }\n\n return \"String\";\n } else {\n const typiaProps = checker.getNonNullableType(\n checker.getTypeOfSymbol(tagSymbol),\n );\n const props: ts.Type[] =\n typiaProps.isIntersection() ? typiaProps.types : [typiaProps];\n\n for (const prop of props) {\n const valueSymbol = prop.getProperty(\"value\");\n if (valueSymbol === undefined) {\n console.log(\n `[CompilerPlugin] Props.value is undefined for ${fieldName}`,\n );\n } else {\n const valueTypeLiteral = checker.getTypeOfSymbol(valueSymbol);\n if (isStringLiteral(valueTypeLiteral, checker, \"uuid\")) {\n return \"UUID\";\n } else if (isStringLiteral(valueTypeLiteral, checker, \"date-time\")) {\n let precision = 9;\n\n const precisionSymbol = t.getProperty(\"_clickhouse_precision\");\n if (precisionSymbol !== undefined) {\n const precisionType = checker.getNonNullableType(\n checker.getTypeOfSymbol(precisionSymbol),\n );\n if (precisionType.isNumberLiteral()) {\n precision = precisionType.value;\n }\n }\n // Mark this as a string-based date field so it won't be parsed to Date at runtime\n annotations.push([STRING_DATE_ANNOTATION, true]);\n return `DateTime(${precision})`;\n } else if (isStringLiteral(valueTypeLiteral, checker, \"date\")) {\n let size = 4;\n const sizeSymbol = t.getProperty(\"_clickhouse_byte_size\");\n if (sizeSymbol !== undefined) {\n const sizeType = checker.getNonNullableType(\n checker.getTypeOfSymbol(sizeSymbol),\n );\n if (sizeType.isNumberLiteral()) {\n size = sizeType.value;\n }\n }\n\n if (size === 4) {\n return \"Date\";\n } else if (size === 2) {\n return \"Date16\";\n } else {\n throw new UnsupportedFeature(`Date with size ${size}`);\n }\n } else if (isStringLiteral(valueTypeLiteral, checker, \"ipv4\")) {\n return \"IPv4\";\n } else if (isStringLiteral(valueTypeLiteral, checker, \"ipv6\")) {\n return \"IPv6\";\n } else if (isStringLiteral(valueTypeLiteral, checker, DecimalRegex)) {\n let precision = 10;\n let scale = 0;\n\n const precisionSymbol = t.getProperty(\"_clickhouse_precision\");\n if (precisionSymbol !== undefined) {\n const precisionType = checker.getNonNullableType(\n checker.getTypeOfSymbol(precisionSymbol),\n );\n if (precisionType.isNumberLiteral()) {\n precision = precisionType.value;\n }\n }\n\n const scaleSymbol = t.getProperty(\"_clickhouse_scale\");\n if (scaleSymbol !== undefined) {\n const scaleType = checker.getNonNullableType(\n checker.getTypeOfSymbol(scaleSymbol),\n );\n if (scaleType.isNumberLiteral()) {\n scale = scaleType.value;\n }\n }\n\n return `Decimal(${precision}, ${scale})`;\n } else {\n const typeString =\n valueTypeLiteral.isStringLiteral() ?\n valueTypeLiteral.value\n : \"unknown\";\n\n console.log(\n `[CompilerPlugin] Unknown format: ${typeString} in field ${fieldName}`,\n );\n }\n }\n }\n\n return \"String\";\n }\n};\n\nconst isStringAnyRecord = (t: ts.Type, checker: ts.TypeChecker): boolean => {\n const indexInfos = checker.getIndexInfosOfType(t);\n if (indexInfos && indexInfos.length === 1) {\n const indexInfo = indexInfos[0];\n return (\n indexInfo.keyType == checker.getStringType() &&\n indexInfo.type == checker.getAnyType()\n );\n }\n\n return false;\n};\n\n/**\n * Check if a type is a Record<K, V> type (generic map/dictionary type)\n */\nconst isRecordType = (t: ts.Type, checker: ts.TypeChecker): boolean => {\n const indexInfos = checker.getIndexInfosOfType(t);\n return indexInfos && indexInfos.length === 1;\n};\n\n/**\n * Detects a tag-like object type that only carries metadata, e.g. { _tag: ... }\n */\nconst isSingleUnderscoreMetaObject = (\n t: ts.Type,\n checker: ts.TypeChecker,\n): boolean => {\n const props = checker.getPropertiesOfType(t);\n if (props.length !== 1) return false;\n const onlyProp = props[0];\n const name = onlyProp.name;\n return typeof name === \"string\" && name.startsWith(\"_\");\n};\n\n/**\n * Handle Record<K, V> types and convert them to Map types\n */\nconst handleRecordType = (\n t: ts.Type,\n checker: ts.TypeChecker,\n fieldName: string,\n typeName: string,\n isJwt: boolean,\n): MapType => {\n const indexInfos = checker.getIndexInfosOfType(t);\n if (indexInfos && indexInfos.length !== 1) {\n throwIndexTypeError(t, checker);\n }\n const indexInfo = indexInfos[0];\n\n // Convert key type\n const [, , keyType] = tsTypeToDataType(\n indexInfo.keyType,\n checker,\n `${fieldName}_key`,\n typeName,\n isJwt,\n );\n\n // Convert value type\n const [, , valueType] = tsTypeToDataType(\n indexInfo.type,\n checker,\n `${fieldName}_value`,\n typeName,\n isJwt,\n );\n\n return {\n keyType,\n valueType,\n };\n};\n\n/**\n * see {@link ClickHouseNamedTuple}\n */\nconst isNamedTuple = (t: ts.Type, checker: ts.TypeChecker) => {\n const mappingSymbol = t.getProperty(\"_clickhouse_mapped_type\");\n if (mappingSymbol === undefined) {\n return false;\n }\n return isStringLiteral(\n checker.getNonNullableType(checker.getTypeOfSymbol(mappingSymbol)),\n checker,\n \"namedTuple\",\n );\n};\n\n// Validate that the underlying TS type matches the mapped geometry shape\nconst getGeometryMappedType = (\n t: ts.Type,\n checker: ts.TypeChecker,\n): string | null => {\n const mappingSymbol = getPropertyDeep(t, \"_clickhouse_mapped_type\");\n if (mappingSymbol === undefined) return null;\n const mapped = checker.getNonNullableType(\n checker.getTypeOfSymbol(mappingSymbol),\n );\n\n // Helper: exact tuple [number, number]\n const isPointTuple = (candidate: ts.Type): boolean => {\n if (candidate.isIntersection()) {\n return candidate.types.some(isPointTuple);\n }\n if (!checker.isTupleType(candidate)) return false;\n const tuple = candidate as TupleType;\n const args = tuple.typeArguments || [];\n if (args.length !== 2) return false;\n return isNumberType(args[0], checker) && isNumberType(args[1], checker);\n };\n\n // Helper: Array<T> predicate\n const isArrayOf = (\n arrType: ts.Type,\n elementPredicate: (elType: ts.Type) => boolean,\n ): boolean => {\n if (arrType.isIntersection()) {\n return arrType.types.some((t) => isArrayOf(t, elementPredicate));\n }\n if (!checker.isArrayType(arrType)) return false;\n const elementType = arrType.getNumberIndexType();\n if (!elementType) return false;\n return elementPredicate(elementType);\n };\n\n const expectAndValidate = (shapeName: string, validator: () => boolean) => {\n if (!validator()) {\n throw new UnsupportedFeature(\n `Type annotated as ${shapeName} must be assignable to the expected geometry shape`,\n );\n }\n return shapeName;\n };\n\n if (mapped.isStringLiteral()) {\n const v = mapped.value;\n switch (v) {\n case \"Point\":\n return expectAndValidate(\"Point\", () => isPointTuple(t));\n case \"Ring\":\n case \"LineString\":\n return expectAndValidate(v, () =>\n isArrayOf(t, (el) => isPointTuple(el)),\n );\n case \"MultiLineString\":\n case \"Polygon\":\n return expectAndValidate(v, () =>\n isArrayOf(t, (el) => isArrayOf(el, (inner) => isPointTuple(inner))),\n );\n case \"MultiPolygon\":\n return expectAndValidate(v, () =>\n isArrayOf(t, (el) =>\n isArrayOf(el, (inner) => isArrayOf(inner, isPointTuple)),\n ),\n );\n }\n }\n return null;\n};\n\nconst checkColumnHasNoDefault = (c: Column) => {\n if (c.default !== null) {\n throw new UnsupportedFeature(\n \"Default in inner field. Put ClickHouseDefault in top level field.\",\n );\n }\n};\n\nconst handleNested = (\n t: ts.Type,\n checker: ts.TypeChecker,\n fieldName: string,\n jwt: boolean,\n): Nested => {\n const columns = toColumns(t, checker);\n columns.forEach(checkColumnHasNoDefault);\n return {\n name: getNestedName(t, fieldName),\n columns,\n jwt,\n };\n};\n\nconst handleNamedTuple = (\n t: ts.Type,\n checker: ts.TypeChecker,\n): NamedTupleType => {\n return {\n fields: toColumns(t, checker).flatMap((c) => {\n if (c.name === \"_clickhouse_mapped_type\") return [];\n\n checkColumnHasNoDefault(c);\n const t = c.required ? c.data_type : { nullable: c.data_type };\n return [[c.name, t]];\n }),\n };\n};\n\nconst tsTypeToDataType = (\n t: ts.Type,\n checker: TypeChecker,\n fieldName: string,\n typeName: string,\n isJwt: boolean,\n typeNode?: ts.TypeNode,\n): [boolean, [string, any][], DataType] => {\n const nonNull = t.getNonNullableType();\n const nullable = nonNull != t;\n\n const aggregationFunction = handleAggregated(t, checker, fieldName, typeName);\n const simpleAggregationFunction = handleSimpleAggregated(\n t,\n checker,\n fieldName,\n typeName,\n );\n\n let withoutTags = nonNull;\n // clean up intersection type tags\n if (nonNull.isIntersection()) {\n const nonTagTypes = nonNull.types.filter(\n (candidate) => !isSingleUnderscoreMetaObject(candidate, checker),\n );\n\n if (nonTagTypes.length == 1) {\n withoutTags = nonTagTypes[0];\n }\n }\n\n // Recognize Date aliases (DateTime, DateTime64<P>) as DateTime-like\n let datePrecisionFromNode: number | undefined = undefined;\n if (typeNode && isTypeReferenceNode(typeNode)) {\n const tn = typeNode.typeName;\n const name = isIdentifier(tn) ? tn.text : tn.right.text;\n if (name === \"DateTime64\") {\n const arg = typeNode.typeArguments?.[0];\n if (\n arg &&\n ts.isLiteralTypeNode(arg) &&\n ts.isNumericLiteral(arg.literal)\n ) {\n datePrecisionFromNode = Number(arg.literal.text);\n }\n } else if (name === \"DateTime\") {\n datePrecisionFromNode = undefined; // DateTime without explicit precision\n }\n }\n\n const annotations: [string, any][] = [];\n\n const typeSymbolName = nonNull.symbol?.name || t.symbol?.name;\n const isDateLike =\n typeSymbolName === \"DateTime\" ||\n typeSymbolName === \"DateTime64\" ||\n checker.isTypeAssignableTo(nonNull, dateType(checker));\n\n let dataType: DataType;\n if (isEnum(nonNull)) {\n dataType = enumConvert(nonNull);\n } else {\n const jsonCandidate = getJsonMappedType(nonNull, checker);\n if (jsonCandidate !== null) {\n dataType = jsonCandidate;\n } else if (isStringAnyRecord(nonNull, checker)) {\n dataType = \"Json\";\n } else if (isDateLike) {\n // Prefer precision from AST (DateTime64<P>) if available\n if (datePrecisionFromNode !== undefined) {\n dataType = `DateTime(${datePrecisionFromNode})` as DataType;\n } else {\n // Add precision support for Date via ClickHousePrecision<P>\n const precisionSymbol =\n getPropertyDeep(nonNull, \"_clickhouse_precision\") ||\n getPropertyDeep(t, \"_clickhouse_precision\");\n if (precisionSymbol !== undefined) {\n const precisionType = checker.getNonNullableType(\n checker.getTypeOfSymbol(precisionSymbol),\n );\n if (precisionType.isNumberLiteral()) {\n dataType = `DateTime(${precisionType.value})` as DataType;\n } else {\n dataType = \"DateTime\";\n }\n } else {\n dataType = \"DateTime\";\n }\n }\n } else if (checker.isTypeAssignableTo(nonNull, checker.getStringType())) {\n dataType = handleStringType(nonNull, checker, fieldName, annotations);\n } else if (isNumberType(nonNull, checker)) {\n dataType = handleNumberType(nonNull, checker, fieldName);\n } else if (checker.isTypeAssignableTo(nonNull, checker.getBooleanType())) {\n dataType = \"Boolean\";\n } else if (getGeometryMappedType(nonNull, checker) !== null) {\n dataType = getGeometryMappedType(nonNull, checker)!;\n } else if (checker.isArrayType(withoutTags)) {\n dataType = toArrayType(\n tsTypeToDataType(\n nonNull.getNumberIndexType()!,\n checker,\n fieldName,\n typeName,\n isJwt,\n undefined,\n ),\n );\n } else if (isNamedTuple(nonNull, checker)) {\n dataType = handleNamedTuple(nonNull, checker);\n } else if (isRecordType(nonNull, checker)) {\n dataType = handleRecordType(nonNull, checker, fieldName, typeName, isJwt);\n } else if (\n withoutTags.isClassOrInterface() ||\n (withoutTags.flags & TypeFlags.Object) !== 0\n ) {\n dataType = handleNested(withoutTags, checker, fieldName, isJwt);\n } else if (nonNull == checker.getNeverType()) {\n dataType = throwNullType(fieldName, typeName);\n } else {\n dataType = throwUnknownType(t, fieldName, typeName);\n }\n }\n if (aggregationFunction !== undefined) {\n annotations.push([\"aggregationFunction\", aggregationFunction]);\n }\n if (simpleAggregationFunction !== undefined) {\n annotations.push([\"simpleAggregationFunction\", simpleAggregationFunction]);\n }\n\n const lowCardinalitySymbol = t.getProperty(\"_LowCardinality\");\n if (lowCardinalitySymbol !== undefined) {\n const lowCardinalityType = checker.getNonNullableType(\n checker.getTypeOfSymbol(lowCardinalitySymbol),\n );\n\n if (lowCardinalityType == checker.getTrueType()) {\n annotations.push([\"LowCardinality\", true]);\n }\n }\n\n return [nullable, annotations, dataType];\n};\n\nconst getNestedName = (t: ts.Type, fieldName: string) => {\n const name = t.symbol.name;\n // replace default name\n return name === \"__type\" ? fieldName : name;\n};\n\nconst hasWrapping = (\n typeNode: ts.TypeNode | undefined,\n wrapperName: string,\n) => {\n if (typeNode !== undefined && isTypeReferenceNode(typeNode)) {\n const typeName = typeNode.typeName;\n const name = isIdentifier(typeName) ? typeName.text : typeName.right.text;\n return name === wrapperName && typeNode.typeArguments?.length === 1;\n } else {\n return false;\n }\n};\n\nconst hasKeyWrapping = (typeNode: ts.TypeNode | undefined) => {\n return hasWrapping(typeNode, \"Key\");\n};\n\nconst hasJwtWrapping = (typeNode: ts.TypeNode | undefined) => {\n return hasWrapping(typeNode, \"JWT\");\n};\n\nconst handleDefaultWrapping = (\n typeNode: ts.TypeNode | undefined,\n): string | undefined => {\n if (typeNode !== undefined && isTypeReferenceNode(typeNode)) {\n const typeName = typeNode.typeName;\n const name = isIdentifier(typeName) ? typeName.text : typeName.right.text;\n if (name === \"WithDefault\" && typeNode.typeArguments?.length === 2) {\n const defaultValueType = typeNode.typeArguments[1];\n if (\n ts.isLiteralTypeNode(defaultValueType) &&\n ts.isStringLiteral(defaultValueType.literal)\n ) {\n return defaultValueType.literal.text;\n }\n }\n }\n return undefined;\n};\n\n/** Detect ClickHouse Codec annotation on a type and return codec expression */\nconst handleCodec = (t: ts.Type, checker: TypeChecker): string | null => {\n const codecType = getTaggedType(t, checker, \"_clickhouse_codec\");\n if (codecType === null) {\n return null;\n }\n if (!codecType.isStringLiteral()) {\n throw new UnsupportedFeature(\n 'ClickHouseCodec must use a string literal, e.g. ClickHouseCodec<\"ZSTD(3)\">',\n );\n }\n return codecType.value;\n};\n\nexport interface ToColumnsOptions {\n /**\n * When true, allows types with index signatures (e.g., [key: string]: any).\n * Only named properties will be extracted as columns.\n * This is useful for IngestApi where arbitrary fields should be accepted\n * and passed through to streaming functions.\n */\n allowIndexSignatures?: boolean;\n}\n\nexport const toColumns = (\n t: ts.Type,\n checker: TypeChecker,\n options?: ToColumnsOptions,\n): Column[] => {\n // Only check for index signatures if not explicitly allowed\n if (\n !options?.allowIndexSignatures &&\n checker.getIndexInfosOfType(t).length !== 0\n ) {\n console.log(\"[CompilerPlugin]\", checker.getIndexInfosOfType(t));\n throwIndexTypeError(t, checker);\n }\n\n return checker.getPropertiesOfType(t).map((prop) => {\n let declarations = prop.getDeclarations();\n const node =\n declarations && declarations.length > 0 ?\n (declarations[0] as ts.PropertyDeclaration)\n : undefined;\n const type =\n node !== undefined ?\n checker.getTypeOfSymbolAtLocation(prop, node)\n : checker.getTypeOfSymbol(prop);\n\n const isKey = hasKeyWrapping(node?.type);\n const isJwt = hasJwtWrapping(node?.type);\n\n const defaultExpression = handleDefaultWrapping(node?.type);\n\n const [nullable, annotations, dataType] = tsTypeToDataType(\n type,\n checker,\n prop.name,\n t.symbol?.name || \"inline_type\",\n isJwt,\n node?.type,\n );\n\n const defaultValue = defaultExpression ?? handleDefault(type, checker);\n const materializedValue = handleMaterialized(type, checker);\n\n // Validate mutual exclusivity of DEFAULT and MATERIALIZED\n if (defaultValue && materializedValue) {\n throw new UnsupportedFeature(\n `Column '${prop.name}' cannot have both ClickHouseDefault and ClickHouseMaterialized. Use one or the other.`,\n );\n }\n\n return {\n name: prop.name,\n data_type: dataType,\n primary_key: isKey,\n required: !nullable,\n unique: false,\n default: defaultValue,\n materialized: materializedValue,\n ttl: handleTtl(type, checker),\n codec: handleCodec(type, checker),\n annotations,\n };\n });\n};\n","import ts, {\n NumberLiteralType,\n StringLiteralType,\n UnionType,\n} from \"typescript\";\nimport { DataEnum, UnsupportedEnum } from \"./dataModelTypes\";\n\nexport const isEnum = (t: ts.Type): boolean =>\n !!(t.getFlags() & ts.TypeFlags.EnumLiteral);\n\nexport const enumConvert = (enumType: ts.Type): DataEnum => {\n const name = enumType.symbol.name;\n\n const values =\n enumType.isUnion() ?\n // an enum is the union of the values\n (enumType as UnionType).types\n // unless there's only one element\n : [enumType];\n const allStrings = values.every((v) => v.isStringLiteral());\n const allIntegers = values.every(\n (v) => v.isNumberLiteral() && Number.isInteger(v.value),\n );\n\n if (!allIntegers && !allStrings) {\n throw new UnsupportedEnum(name);\n }\n\n const enumMember =\n allStrings ?\n values.map((v) => ({\n name: v.symbol.name,\n value: { String: (v as StringLiteralType).value },\n }))\n : values.map((v) => ({\n name: v.symbol.name,\n value: { Int: (v as NumberLiteralType).value },\n }));\n\n return { name, values: enumMember };\n};\n","import ts from \"typescript\";\nimport { IdentifierBrandedString } from \"../sqlHelpers\";\n\nexport type EnumValues =\n | { name: string; value: { Int: number } }[]\n | { name: string; value: { String: string } }[];\nexport type DataEnum = { name: string; values: EnumValues };\nexport type Nested = { name: string; columns: Column[]; jwt: boolean };\nexport type ArrayType = { elementType: DataType; elementNullable: boolean };\nexport type NamedTupleType = { fields: Array<[string, DataType]> };\nexport type MapType = { keyType: DataType; valueType: DataType };\nexport type JsonOptions = {\n max_dynamic_paths?: number;\n max_dynamic_types?: number;\n typed_paths?: Array<[string, DataType]>;\n skip_paths?: string[];\n skip_regexps?: string[];\n};\nexport type DataType =\n | string\n | DataEnum\n | ArrayType\n | Nested\n | NamedTupleType\n | MapType\n | JsonOptions\n | { nullable: DataType };\nexport interface Column {\n name: IdentifierBrandedString;\n data_type: DataType;\n required: boolean;\n unique: false; // what is this for?\n primary_key: boolean;\n default: string | null;\n materialized: string | null;\n ttl: string | null;\n codec: string | null;\n annotations: [string, any][];\n}\n\nexport interface DataModel {\n columns: Column[];\n name: string;\n}\n\nexport class UnknownType extends Error {\n t: ts.Type;\n fieldName: string;\n typeName: string;\n constructor(t: ts.Type, fieldName: string, typeName: string) {\n super();\n this.t = t;\n this.fieldName = fieldName;\n this.typeName = typeName;\n }\n}\n\nexport class NullType extends Error {\n fieldName: string;\n typeName: string;\n constructor(fieldName: string, typeName: string) {\n super();\n this.fieldName = fieldName;\n this.typeName = typeName;\n }\n}\n\nexport class UnsupportedEnum extends Error {\n enumName: string;\n constructor(enumName: string) {\n super();\n this.enumName = enumName;\n }\n}\n\nexport class UnsupportedFeature extends Error {\n featureName: string;\n constructor(featureName: string) {\n super();\n this.featureName = featureName;\n }\n}\n\nexport class IndexType extends Error {\n typeName: string;\n indexSignatures: string[];\n\n constructor(typeName: string, indexSignatures: string[]) {\n const explanation =\n \"Index signatures (e.g. [key: string]: value) are not supported in data models.\";\n\n const suggestion =\n \"Consider splitting this into separate types or using a single Record<K, V> type.\";\n\n const signatures = `Found index signatures: ${indexSignatures.join(\", \")}`;\n\n super(\n `${explanation}\\n\\nType: ${typeName}\\n\\n${signatures}\\n\\nSuggestion: ${suggestion}`,\n );\n\n this.typeName = typeName;\n this.indexSignatures = indexSignatures;\n }\n}\n\n/**\n * Type guard: is this DataType an Array(Nested(...))?\n * Uses the ArrayType and Nested types for type safety.\n */\nexport function isArrayNestedType(\n dt: DataType,\n): dt is ArrayType & { elementType: Nested } {\n return (\n typeof dt === \"object\" &&\n dt !== null &&\n (dt as ArrayType).elementType !== null &&\n typeof (dt as ArrayType).elementType === \"object\" &&\n (dt as ArrayType).elementType.hasOwnProperty(\"columns\") &&\n Array.isArray(((dt as ArrayType).elementType as Nested).columns)\n );\n}\n\n/**\n * Type guard: is this DataType a Nested struct (not array)?\n */\nexport function isNestedType(dt: DataType): dt is Nested {\n return (\n typeof dt === \"object\" &&\n dt !== null &&\n Array.isArray((dt as Nested).columns)\n );\n}\n","import { Pattern, TagBase } from \"typia/lib/tags\";\nimport { tags } from \"typia\";\n\nexport type ClickHousePrecision<P extends number> = {\n _clickhouse_precision?: P;\n};\n\nexport const DecimalRegex: \"^-?\\\\d+(\\\\.\\\\d+)?$\" = \"^-?\\\\d+(\\\\.\\\\d+)?$\";\n\nexport type ClickHouseDecimal<P extends number, S extends number> = {\n _clickhouse_precision?: P;\n _clickhouse_scale?: S;\n} & Pattern<typeof DecimalRegex>;\n\nexport type ClickHouseFixedStringSize<N extends number> = {\n _clickhouse_fixed_string_size?: N;\n};\n\n/**\n * FixedString(N) - Fixed-length string of exactly N bytes.\n *\n * ClickHouse stores exactly N bytes, padding shorter values with null bytes.\n * Values exceeding N bytes will throw an exception.\n *\n * Use for binary data: hashes, IP addresses, UUIDs, MAC addresses.\n *\n * @example\n * interface BinaryData {\n * md5_hash: string & FixedString<16>; // 16-byte MD5\n * sha256_hash: string & FixedString<32>; // 32-byte SHA256\n * }\n */\nexport type FixedString<N extends number> = string &\n ClickHouseFixedStringSize<N>;\n\nexport type ClickHouseByteSize<N extends number> = {\n _clickhouse_byte_size?: N;\n};\n\nexport type LowCardinality = {\n _LowCardinality?: true;\n};\n\n// ClickHouse-friendly helper aliases for clarity in user schemas\n// These are erased at compile time but guide the ClickHouse mapping logic.\nexport type DateTime = Date;\nexport type DateTime64<P extends number> = Date & ClickHousePrecision<P>;\n\nexport type DateTimeString = string & tags.Format<\"date-time\">;\n/**\n * JS Date objects cannot hold microsecond precision.\n * Use string as the runtime type to avoid losing information.\n */\nexport type DateTime64String<P extends number> = string &\n tags.Format<\"date-time\"> &\n ClickHousePrecision<P>;\n\n// Numeric convenience tags mirroring ClickHouse integer and float families\nexport type Float32 = number & ClickHouseFloat<\"float32\">;\nexport type Float64 = number & ClickHouseFloat<\"float64\">;\n\nexport type Int8 = number & ClickHouseInt<\"int8\">;\nexport type Int16 = number & ClickHouseInt<\"int16\">;\nexport type Int32 = number & ClickHouseInt<\"int32\">;\nexport type Int64 = number & ClickHouseInt<\"int64\">;\n\nexport type UInt8 = number & ClickHouseInt<\"uint8\">;\nexport type UInt16 = number & ClickHouseInt<\"uint16\">;\nexport type UInt32 = number & ClickHouseInt<\"uint32\">;\nexport type UInt64 = number & ClickHouseInt<\"uint64\">;\n\n// Decimal(P, S) annotation\nexport type Decimal<P extends number, S extends number> = string &\n ClickHouseDecimal<P, S>;\n\n/**\n * Attach compression codec to a column type.\n *\n * Any valid ClickHouse codec expression is allowed. ClickHouse validates the codec at runtime.\n *\n * @template T The base data type\n * @template CodecExpr The codec expression (single codec or chain)\n *\n * @example\n * interface Metrics {\n * // Single codec\n * log_blob: string & ClickHouseCodec<\"ZSTD(3)\">;\n *\n * // Codec chain (processed left-to-right)\n * timestamp: Date & ClickHouseCodec<\"Delta, LZ4\">;\n * temperature: number & ClickHouseCodec<\"Gorilla, ZSTD\">;\n *\n * // Specialized codecs\n * counter: number & ClickHouseCodec<\"DoubleDelta\">;\n *\n * // Can combine with other annotations\n * count: UInt64 & ClickHouseCodec<\"DoubleDelta, LZ4\">;\n * }\n */\nexport type ClickHouseCodec<CodecExpr extends string> = {\n _clickhouse_codec?: CodecExpr;\n};\n\nexport type ClickHouseFloat<Value extends \"float32\" | \"float64\"> = tags.Type<\n Value extends \"float32\" ? \"float\" : \"double\"\n>;\n\nexport type ClickHouseInt<\n Value extends\n | \"int8\"\n | \"int16\"\n | \"int32\"\n | \"int64\"\n // | \"int128\"\n // | \"int256\"\n | \"uint8\"\n | \"uint16\"\n | \"uint32\"\n | \"uint64\",\n // | \"uint128\"\n // | \"uint256\",\n> =\n Value extends \"int32\" | \"int64\" | \"uint32\" | \"uint64\" ? tags.Type<Value>\n : TagBase<{\n target: \"number\";\n kind: \"type\";\n value: Value;\n validate: Value extends \"int8\" ? \"-128 <= $input && $input <= 127\"\n : Value extends \"int16\" ? \"-32768 <= $input && $input <= 32767\"\n : Value extends \"uint8\" ? \"0 <= $input && $input <= 255\"\n : Value extends \"uint16\" ? \"0 <= $input && $input <= 65535\"\n : never;\n exclusive: true;\n schema: {\n type: \"integer\";\n };\n }>;\n\n/**\n * By default, nested objects map to the `Nested` type in clickhouse.\n * Write `nestedObject: AnotherInterfaceType & ClickHouseNamedTuple`\n * to map AnotherInterfaceType to the named tuple type.\n */\nexport type ClickHouseNamedTuple = {\n _clickhouse_mapped_type?: \"namedTuple\";\n};\n\nexport type ClickHouseJson<\n maxDynamicPaths extends number | undefined = undefined,\n maxDynamicTypes extends number | undefined = undefined,\n skipPaths extends string[] = [],\n skipRegexes extends string[] = [],\n> = {\n _clickhouse_mapped_type?: \"JSON\";\n _clickhouse_json_settings?: {\n maxDynamicPaths?: maxDynamicPaths;\n maxDynamicTypes?: maxDynamicTypes;\n skipPaths?: skipPaths;\n skipRegexes?: skipRegexes;\n };\n};\n\n// Geometry helper types\nexport type ClickHousePoint = [number, number] & {\n _clickhouse_mapped_type?: \"Point\";\n};\nexport type ClickHouseRing = ClickHousePoint[] & {\n _clickhouse_mapped_type?: \"Ring\";\n};\nexport type ClickHouseLineString = ClickHousePoint[] & {\n _clickhouse_mapped_type?: \"LineString\";\n};\nexport type ClickHouseMultiLineString = ClickHouseLineString[] & {\n _clickhouse_mapped_type?: \"MultiLineString\";\n};\nexport type ClickHousePolygon = ClickHouseRing[] & {\n _clickhouse_mapped_type?: \"Polygon\";\n};\nexport type ClickHouseMultiPolygon = ClickHousePolygon[] & {\n _clickhouse_mapped_type?: \"MultiPolygon\";\n};\n\n/**\n * typia may have trouble handling this type.\n * In which case, use {@link WithDefault} as a workaround\n *\n * @example\n * { field: number & ClickHouseDefault<\"0\"> }\n */\nexport type ClickHouseDefault<SqlExpression extends string> = {\n _clickhouse_default?: SqlExpression;\n};\n\n/**\n * @example\n * {\n * ...\n * timestamp: Date;\n * debugMessage: string & ClickHouseTTL<\"timestamp + INTERVAL 1 WEEK\">;\n * }\n */\nexport type ClickHouseTTL<SqlExpression extends string> = {\n _clickhouse_ttl?: SqlExpression;\n};\n\n/**\n * ClickHouse MATERIALIZED column annotation.\n * The column value is computed at INSERT time and physically stored.\n * Cannot be explicitly inserted by users.\n *\n * @example\n * interface Events {\n * eventTime: DateTime;\n * // Extract date component - computed and stored at insert time\n * eventDate: Date & ClickHouseMaterialized<\"toDate(event_time)\">;\n *\n * userId: string;\n * // Precompute hash for fast lookups\n * userHash: UInt64 & ClickHouseMaterialized<\"cityHash64(userId)\">;\n * }\n *\n * @remarks\n * - MATERIALIZED and DEFAULT are mutually exclusive\n * - Can be combined with ClickHouseCodec for compression\n * - Changing the expression modifies the column in-place (existing values preserved)\n */\nexport type ClickHouseMaterialized<SqlExpression extends string> = {\n _clickhouse_materialized?: SqlExpression;\n};\n\n/**\n * See also {@link ClickHouseDefault}\n *\n * @example{ updated_at: WithDefault<Date, \"now()\"> }\n */\nexport type WithDefault<T, _SqlExpression extends string> = T;\n","import type {\n Column,\n DataType,\n Nested,\n ArrayType,\n} from \"../dataModels/dataModelTypes\";\n\n/**\n * Annotation key used to mark DateTime fields that should remain as strings\n * rather than being parsed into Date objects at runtime.\n */\nexport const STRING_DATE_ANNOTATION = \"stringDate\";\n\n/**\n * Type guard to check if a DataType is a nullable wrapper\n */\nfunction isNullableType(dt: DataType): dt is { nullable: DataType } {\n return (\n typeof dt === \"object\" &&\n dt !== null &&\n \"nullable\" in dt &&\n typeof dt.nullable !== \"undefined\"\n );\n}\n\n/**\n * Type guard to check if a DataType is a Nested type\n */\nfunction isNestedType(dt: DataType): dt is Nested {\n return (\n typeof dt === \"object\" &&\n dt !== null &&\n \"columns\" in dt &&\n Array.isArray(dt.columns)\n );\n}\n\n/**\n * Type guard to check if a DataType is an ArrayType\n */\nfunction isArrayType(dt: DataType): dt is ArrayType {\n return (\n typeof dt === \"object\" &&\n dt !== null &&\n \"elementType\" in dt &&\n typeof dt.elementType !== \"undefined\"\n );\n}\n\n/**\n * Revives ISO 8601 date strings into Date objects during JSON parsing\n * This is useful for automatically converting date strings to Date objects\n */\nexport function jsonDateReviver(key: string, value: unknown): unknown {\n const iso8601Format =\n /^([\\+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24\\:?00)([\\.,]\\d+(?!:))?)?(\\17[0-5]\\d([\\.,]\\d+)?)?([zZ]|([\\+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)$/;\n\n if (typeof value === \"string\" && iso8601Format.test(value)) {\n return new Date(value);\n }\n\n return value;\n}\n\n/**\n * Checks if a DataType represents a datetime column (not just date)\n * AND if the column should be parsed from string to Date at runtime\n *\n * Note: Date and Date16 are date-only types and should remain as strings.\n * Only DateTime types are candidates for parsing to JavaScript Date objects.\n */\nfunction isDateType(dataType: DataType, annotations: [string, any][]): boolean {\n // Check if this is marked as a string-based date (from typia.tags.Format)\n // If so, it should remain as a string, not be parsed to Date\n if (\n annotations.some(\n ([key, value]) => key === STRING_DATE_ANNOTATION && value === true,\n )\n ) {\n return false;\n }\n\n if (typeof dataType === \"string\") {\n // Only DateTime types should be parsed to Date objects\n // Date and Date16 are date-only and should stay as strings\n return dataType === \"DateTime\" || dataType.startsWith(\"DateTime(\");\n }\n // Handle nullable wrapper\n if (isNullableType(dataType)) {\n return isDateType(dataType.nullable, annotations);\n }\n return false;\n}\n\n/**\n * Type of mutation to apply to a field during parsing\n */\nexport type Mutation = \"parseDate\"; // | \"parseBigInt\" - to be added later\n\n/**\n * Recursive tuple array structure representing field mutation operations\n * Each entry is [fieldName, mutation]:\n * - mutation is Mutation[] for leaf fields that need operations applied\n * - mutation is FieldMutations for nested objects/arrays (auto-applies to array elements)\n */\nexport type FieldMutations = [string, Mutation[] | FieldMutations][];\n\n/**\n * Recursively builds field mutations from column definitions\n *\n * @param columns - Array of Column definitions\n * @returns Tuple array of field mutations\n */\nfunction buildFieldMutations(columns: Column[]): FieldMutations {\n const mutations: FieldMutations = [];\n\n for (const column of columns) {\n const dataType = column.data_type;\n\n // Check if this is a date field that should be converted\n if (isDateType(dataType, column.annotations)) {\n mutations.push([column.name, [\"parseDate\"]]);\n continue;\n }\n\n // Handle nested structures\n if (typeof dataType === \"object\" && dataType !== null) {\n // Handle nullable wrapper\n let unwrappedType: DataType = dataType;\n if (isNullableType(dataType)) {\n unwrappedType = dataType.nullable;\n }\n\n // Handle nested objects\n if (isNestedType(unwrappedType)) {\n const nestedMutations = buildFieldMutations(unwrappedType.columns);\n if (nestedMutations.length > 0) {\n mutations.push([column.name, nestedMutations]);\n }\n continue;\n }\n\n // Handle arrays with nested columns\n // The mutations will be auto-applied to each array element at runtime\n if (isArrayType(unwrappedType)) {\n const elementType = unwrappedType.elementType;\n if (isNestedType(elementType)) {\n const nestedMutations = buildFieldMutations(elementType.columns);\n if (nestedMutations.length > 0) {\n mutations.push([column.name, nestedMutations]);\n }\n continue;\n }\n }\n }\n }\n\n return mutations;\n}\n\n/**\n * Applies a mutation operation to a field value\n *\n * @param value - The value to handle\n * @param mutation - The mutation operation to apply\n * @returns The handled value\n */\nfunction applyMutation(value: any, mutation: Mutation): any {\n if (mutation === \"parseDate\") {\n if (typeof value === \"string\") {\n try {\n const date = new Date(value);\n return !isNaN(date.getTime()) ? date : value;\n } catch {\n return value;\n }\n }\n }\n return value;\n}\n\n/**\n * Recursively mutates an object by applying field mutations\n *\n * @param obj - The object to mutate\n * @param mutations - The field mutations to apply\n */\nfunction applyFieldMutations(obj: any, mutations: FieldMutations): void {\n if (!obj || typeof obj !== \"object\") {\n return;\n }\n\n for (const [fieldName, mutation] of mutations) {\n if (!(fieldName in obj)) {\n continue;\n }\n\n if (Array.isArray(mutation)) {\n // Check if it's Mutation[] (leaf) or FieldMutations (nested)\n if (mutation.length > 0 && typeof mutation[0] === \"string\") {\n // It's Mutation[] - apply operations to this field\n const operations = mutation as Mutation[];\n for (const operation of operations) {\n obj[fieldName] = applyMutation(obj[fieldName], operation);\n }\n } else {\n // It's FieldMutations - recurse into nested structure\n const nestedMutations = mutation as FieldMutations;\n const fieldValue = obj[fieldName];\n\n if (Array.isArray(fieldValue)) {\n // Auto-apply to each array element\n for (const item of fieldValue) {\n applyFieldMutations(item, nestedMutations);\n }\n } else if (fieldValue && typeof fieldValue === \"object\") {\n // Apply to nested object\n applyFieldMutations(fieldValue, nestedMutations);\n }\n }\n }\n }\n}\n\n/**\n * Pre-builds field mutations from column schema for efficient reuse\n *\n * @param columns - Column definitions from the Stream schema\n * @returns Field mutations tuple array, or undefined if no columns\n *\n * @example\n * ```typescript\n * const fieldMutations = buildFieldMutationsFromColumns(stream.columnArray);\n * // Reuse fieldMutations for every message\n * ```\n */\nexport function buildFieldMutationsFromColumns(\n columns: Column[] | undefined,\n): FieldMutations | undefined {\n if (!columns || columns.length === 0) {\n return undefined;\n }\n const mutations = buildFieldMutations(columns);\n return mutations.length > 0 ? mutations : undefined;\n}\n\n/**\n * Applies field mutations to parsed data\n * Mutates the object in place for performance\n *\n * @param data - The parsed JSON object to mutate\n * @param fieldMutations - Pre-built field mutations from buildFieldMutationsFromColumns\n *\n * @example\n * ```typescript\n * const fieldMutations = buildFieldMutationsFromColumns(stream.columnArray);\n * const data = JSON.parse(jsonString);\n * mutateParsedJson(data, fieldMutations);\n * // data now has transformations applied per the field mutations\n * ```\n */\nexport function mutateParsedJson(\n data: any,\n fieldMutations: FieldMutations | undefined,\n): void {\n if (!fieldMutations || !data) {\n return;\n }\n\n applyFieldMutations(data, fieldMutations);\n}\n","import ts, { factory, SyntaxKind } from \"typescript\";\nimport {\n avoidTypiaNameClash,\n isMooseFile,\n typiaJsonSchemas,\n sanitizeTypeParameter,\n} from \"../compilerPluginHelper\";\nimport { toColumns } from \"../dataModels/typeConvert\";\nimport { parseAsAny } from \"../dmv2/dataModelMetadata\";\nimport type { ApiUtil } from \"./helpers\";\n\nconst iife = (statements: ts.Statement[]): ts.CallExpression =>\n factory.createCallExpression(\n factory.createParenthesizedExpression(\n factory.createArrowFunction(\n undefined,\n undefined,\n [],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createBlock(statements, true),\n ),\n ),\n undefined,\n [],\n );\n\nexport const isCreateApi = (\n node: ts.Node,\n checker: ts.TypeChecker,\n): node is ts.CallExpression => {\n if (!ts.isCallExpression(node)) {\n return false;\n }\n\n const declaration: ts.Declaration | undefined =\n checker.getResolvedSignature(node)?.declaration;\n if (!declaration || !isMooseFile(declaration.getSourceFile())) {\n return false;\n }\n\n return checker.getTypeAtLocation(declaration).symbol?.name == \"createApi\";\n};\n\nexport const isCreateApiV2 = (\n node: ts.Node,\n checker: ts.TypeChecker,\n): node is ts.NewExpression => {\n if (!ts.isNewExpression(node)) {\n return false;\n }\n\n const declaration: ts.Declaration | undefined =\n checker.getResolvedSignature(node)?.declaration;\n if (!declaration || !isMooseFile(declaration.getSourceFile())) {\n return false;\n }\n\n const sym = checker.getSymbolAtLocation(node.expression);\n return sym?.name === \"Api\" || sym?.name === \"ConsumptionApi\";\n};\n\nconst getParamType = (\n funcType: ts.Type,\n checker: ts.TypeChecker,\n): ts.TypeNode | undefined => {\n const sig = funcType.getCallSignatures()[0];\n const firstParam = sig && sig.getParameters()[0];\n const t = firstParam && checker.getTypeOfSymbol(firstParam);\n return t && checker.typeToTypeNode(t, undefined, undefined);\n};\n\nconst typeToOutputSchema = (t: ts.Type, checker: ts.TypeChecker): ts.Type => {\n if (\n t.isIntersection() &&\n t.types.some((inner) => inner.getSymbol()?.name === \"ResultSet\")\n ) {\n const queryResultSymbol = t.getProperty(\"__query_result_t\");\n if (queryResultSymbol) {\n return checker.getNonNullableType(\n checker.getTypeOfSymbol(queryResultSymbol),\n );\n } else {\n return checker.getAnyType();\n }\n } else if (\n t.getProperty(\"status\") !== undefined &&\n t.getProperty(\"body\") !== undefined\n ) {\n return checker.getTypeOfSymbol(t.getProperty(\"body\")!);\n } else {\n return t;\n }\n};\n\nexport const transformCreateApi = (\n node: ts.Node,\n checker: ts.TypeChecker,\n): ts.Node => {\n if (isCreateApi(node, checker)) {\n return transformLegacyApi(node, checker);\n } else if (isCreateApiV2(node, checker)) {\n return transformNewApi(node as ts.NewExpression, checker);\n }\n\n return node;\n};\n\nexport const transformLegacyApi = (\n node: ts.Node,\n checker: ts.TypeChecker,\n): ts.Node => {\n if (!isCreateApi(node, checker)) {\n return node;\n }\n\n const handlerFunc = node.arguments[0];\n const paramType =\n (node.typeArguments && node.typeArguments[0]) ||\n getParamType(checker.getTypeAtLocation(handlerFunc), checker);\n\n if (paramType === undefined) {\n throw new Error(\"Unknown type for params\");\n }\n\n const handlerType = checker.getTypeAtLocation(handlerFunc);\n const returnType = handlerType.getCallSignatures()[0]?.getReturnType();\n const awaitedType = checker.getAwaitedType(returnType) || returnType;\n\n const queryResultType =\n awaitedType.isUnion() ?\n factory.createUnionTypeNode(\n awaitedType.types.flatMap((t) => {\n const typeNode = checker.typeToTypeNode(\n typeToOutputSchema(t, checker),\n undefined,\n undefined,\n );\n return typeNode === undefined ? [] : [typeNode];\n }),\n )\n : checker.typeToTypeNode(\n typeToOutputSchema(awaitedType, checker),\n undefined,\n undefined,\n );\n\n const wrappedFunc = factory.createArrowFunction(\n undefined,\n undefined,\n [\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(\"params\"),\n undefined,\n undefined,\n undefined,\n ),\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(\"utils\"),\n undefined,\n undefined,\n undefined,\n ),\n ],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createBlock(\n [\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"processedParams\"),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createIdentifier(\"assertGuard\"),\n undefined,\n [\n factory.createNewExpression(\n factory.createIdentifier(\"URLSearchParams\"),\n undefined,\n [factory.createIdentifier(\"params\")],\n ),\n ],\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n factory.createReturnStatement(\n factory.createCallExpression(\n factory.createIdentifier(\"handlerFunc\"),\n undefined,\n [\n factory.createIdentifier(\"processedParams\"),\n factory.createIdentifier(\"utils\"),\n ],\n ),\n ),\n ],\n true,\n ),\n );\n\n return iife([\n // const assertGuard = ____moose____typia.http.createAssertQuery<T>()\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"assertGuard\"),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"http\"),\n ),\n factory.createIdentifier(\"createAssertQuery\"),\n ),\n [sanitizeTypeParameter(paramType)],\n [],\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // the user provided function\n // the Parameters of createApi is a trick to avoid extra imports\n // const handlerFunc: Parameters<typeof createApi<DailyActiveUsersParams>>[0] = async(...) => ...\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"handlerFunc\"),\n undefined,\n factory.createIndexedAccessTypeNode(\n factory.createTypeReferenceNode(\n factory.createIdentifier(\"Parameters\"),\n [\n factory.createTypeQueryNode(\n factory.createIdentifier(\"createApi\"),\n [paramType],\n ),\n ],\n ),\n factory.createLiteralTypeNode(factory.createNumericLiteral(\"0\")),\n ),\n handlerFunc,\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // const wrappedFunc = (params, utils) => {\n // const processedParams = assertGuard(new URLSearchParams(params))\n // return handlerFunc(params, utils)\n // }\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"wrappedFunc\"),\n undefined,\n undefined,\n wrappedFunc,\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // wrappedFunc[\"moose_input_schema\"] = ____moose____typia.json.schemas<[T]>()\n factory.createExpressionStatement(\n factory.createBinaryExpression(\n factory.createElementAccessExpression(\n factory.createIdentifier(\"wrappedFunc\"),\n factory.createStringLiteral(\"moose_input_schema\"),\n ),\n factory.createToken(ts.SyntaxKind.EqualsToken),\n typiaJsonSchemas(paramType),\n ),\n ),\n\n // wrappedFunc[\"moose_output_schema\"] = ____moose____typia.json.schemas<[Output]>()\n factory.createExpressionStatement(\n factory.createBinaryExpression(\n factory.createElementAccessExpression(\n factory.createIdentifier(\"wrappedFunc\"),\n factory.createStringLiteral(\"moose_output_schema\"),\n ),\n factory.createToken(ts.SyntaxKind.EqualsToken),\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"json\"),\n ),\n factory.createIdentifier(\"schemas\"),\n ),\n [\n factory.createTupleTypeNode([\n sanitizeTypeParameter(\n queryResultType ||\n factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n ),\n ]),\n ],\n [],\n ),\n ),\n ),\n\n factory.createReturnStatement(factory.createIdentifier(\"wrappedFunc\")),\n ]);\n};\n\n// TODO: When the legacy api is removed, follow the args\n// pattern in transformNewMooseResource\nconst transformNewApi = (\n node: ts.NewExpression,\n checker: ts.TypeChecker,\n): ts.Node => {\n if (!isCreateApiV2(node, checker)) {\n return node;\n }\n\n if (!node.arguments || node.arguments.length < 2 || !node.typeArguments) {\n return node;\n }\n\n // Get both type parameters from Api<T, R>\n const typeNode = node.typeArguments[0];\n const responseTypeNode =\n node.typeArguments[1] ||\n factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);\n\n // Get the handler function (second argument)\n const handlerFunc = node.arguments[1];\n\n // Create a new handler function that includes validation\n const wrappedHandler = factory.createArrowFunction(\n undefined,\n undefined,\n [\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(\"params\"),\n undefined,\n undefined,\n undefined,\n ),\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(\"utils\"),\n undefined,\n undefined,\n undefined,\n ),\n ],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createBlock(\n [\n // const assertGuard = ____moose____typia.http.createAssertQuery<T>()\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"assertGuard\"),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier(avoidTypiaNameClash),\n factory.createIdentifier(\"http\"),\n ),\n factory.createIdentifier(\"createAssertQuery\"),\n ),\n [typeNode],\n [],\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // const searchParams = new URLSearchParams(params as any)\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"searchParams\"),\n undefined,\n undefined,\n factory.createNewExpression(\n factory.createIdentifier(\"URLSearchParams\"),\n undefined,\n [\n factory.createAsExpression(\n factory.createIdentifier(\"params\"),\n factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n ),\n ],\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // const processedParams = assertGuard(searchParams)\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"processedParams\"),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createIdentifier(\"assertGuard\"),\n undefined,\n [factory.createIdentifier(\"searchParams\")],\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(\"originalHandler\"),\n undefined,\n factory.createFunctionTypeNode(\n undefined,\n [\n factory.createParameterDeclaration(\n undefined,\n undefined,\n \"params\",\n undefined,\n typeNode,\n ),\n factory.createParameterDeclaration(\n undefined,\n undefined,\n \"utils\",\n undefined,\n factory.createImportTypeNode(\n factory.createLiteralTypeNode(\n factory.createStringLiteral(\"@514labs/moose-lib\"),\n ),\n undefined,\n factory.createIdentifier(\"ApiUtil\"),\n [],\n false,\n ),\n ),\n ],\n factory.createKeywordTypeNode(SyntaxKind.AnyKeyword),\n ),\n factory.createParenthesizedExpression(handlerFunc),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n // return originalHandler(processedParams, utils)\n factory.createReturnStatement(\n factory.createCallExpression(\n factory.createIdentifier(\"originalHandler\"),\n undefined,\n [\n factory.createIdentifier(\"processedParams\"),\n factory.createIdentifier(\"utils\"),\n ],\n ),\n ),\n ],\n true,\n ),\n );\n\n // Create the schema arguments\n const inputSchemaArg =\n node.arguments.length > 3 ? node.arguments[3] : typiaJsonSchemas(typeNode);\n const responseSchemaArg = typiaJsonSchemas(responseTypeNode);\n\n // Create the columns argument if it doesn't exist\n const inputColumnsArg = toColumns(\n checker.getTypeAtLocation(typeNode),\n checker,\n );\n\n // Create the config argument if it doesn't exist\n const configArg =\n node.arguments.length > 2 ?\n node.arguments[2]\n : factory.createObjectLiteralExpression([], false);\n\n // Update the Api constructor call with all necessary arguments\n return factory.updateNewExpression(\n node,\n node.expression,\n node.typeArguments,\n [\n node.arguments[0], // name\n wrappedHandler, // wrapped handler\n configArg, // config object\n inputSchemaArg, // input schema\n parseAsAny(JSON.stringify(inputColumnsArg)), // input columns\n responseSchemaArg, // response schema\n ],\n );\n};\n"],"mappings":"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","names":["import_typescript","path","transform","process","fs","import_typescript","import_typescript","import_typescript","ts","t","ts","ts","import_typescript","ts","ts"]}