@drzl/cli 4.19.0 → 4.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../generator-graphql/dist/index.js"],"sourcesContent":["// src/index.ts\nimport { fileWriter } from \"@drzl/validation-core\";\nimport {\n formatCode,\n importSpecifier,\n insertColumns,\n isIntegerColumn,\n selectColumns,\n updateColumns\n} from \"@drzl/validation-core\";\nvar APP_MODULE = \"index\";\nvar SCALARS_MODULE = \"scalars\";\nvar GRAPHQL_NAME = /^[_A-Za-z][_0-9A-Za-z]*$/;\nvar RESERVED_ENUM_VALUES = /* @__PURE__ */ new Set([\"true\", \"false\", \"null\"]);\nvar INT32_MIN = -2147483648n;\nvar INT32_MAX = 2147483647n;\nvar cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);\nvar isIdent = (s) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(s);\nvar q = (v) => `'${v.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\")}'`;\nfunction gqlIdent(s) {\n const cleaned = s.replace(/[^_0-9A-Za-z]+/g, \"_\");\n return /^[0-9]/.test(cleaned) ? `_${cleaned}` : cleaned;\n}\nfunction tpl(s) {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\").replace(/\\$\\{/g, \"\\\\${\");\n}\nfunction keyColumns(table) {\n const names = table.primaryKey?.columns ?? [];\n if (!names.length) return null;\n const cols = names.map((n) => table.columns.find((c) => c.name === n));\n if (cols.some((c) => !c)) return null;\n return cols;\n}\nfunction fitsInt32(c) {\n if (c.min === void 0 || c.max === void 0) return false;\n try {\n return BigInt(c.min) >= INT32_MIN && BigInt(c.max) <= INT32_MAX;\n } catch {\n return false;\n }\n}\nfunction planEnum(typeName, values) {\n const members = values.map((value) => {\n const verbatimOk = GRAPHQL_NAME.test(value) && !RESERVED_ENUM_VALUES.has(value) && !value.startsWith(\"__\");\n if (verbatimOk) return { name: value, value, renamed: false };\n let name = gqlIdent(value.toUpperCase());\n name = name.replace(/^_+/, \"_\");\n if (!GRAPHQL_NAME.test(name) || RESERVED_ENUM_VALUES.has(name) || name.startsWith(\"__\")) {\n return { name: \"\", value, renamed: true };\n }\n return { name, value, renamed: true };\n });\n if (members.some((m) => !m.name)) return null;\n const seen = /* @__PURE__ */ new Set();\n for (const m of members) {\n if (seen.has(m.name)) return null;\n seen.add(m.name);\n }\n return { typeName, members };\n}\nfunction mapped(sdl, rowTs, inputTs = rowTs, scalars = []) {\n return { sdl, rowTs, inputTs, scalars };\n}\nfunction planColumn(table, c) {\n const field = GRAPHQL_NAME.test(c.name) ? c.name : gqlIdent(c.name);\n const base = (() => {\n if (c.enumValues && c.enumValues.length) {\n const typeName = `${cap(gqlIdent(table.tsName))}${cap(gqlIdent(c.name))}Enum`;\n const plan = planEnum(typeName, c.enumValues);\n if (!plan) {\n return {\n ...mapped(\"String\", \"string\"),\n note: `Column \"${c.name}\": the enum values ${c.enumValues.join(\", \")} cannot all be spelled as distinct GraphQL enum members, so the column is exposed as String carrying the database values verbatim.`\n };\n }\n const union = c.enumValues.map(q).join(\" | \");\n return { ...mapped(plan.typeName, union), enumPlan: plan };\n }\n switch (c.shape?.kind) {\n case \"tuple\":\n return mapped(\"[Float!]\", \"number[]\");\n case \"numberObject\":\n return mapped(\"JSON\", \"unknown\", \"unknown\", [\"JSON\"]);\n case \"buffer\":\n return {\n ...mapped(\"JSON\", \"unknown\", \"unknown\", [\"JSON\"]),\n note: `Column \"${c.name}\" is binary; GraphQL has no binary type, so it rides the JSON scalar and your resolver picks an encoding.`\n };\n case \"json\":\n return mapped(\"JSON\", \"unknown\", \"unknown\", [\"JSON\"]);\n case \"bitstring\":\n case \"byteString\":\n return mapped(\"String\", \"string\");\n default:\n break;\n }\n if (c.dbType === \"VECTOR\") return mapped(\"[Float!]\", \"number[]\");\n switch (c.tsType) {\n case \"number\":\n return mapped(isIntegerColumn(c) && fitsInt32(c) ? \"Int\" : \"Float\", \"number\");\n case \"string\":\n return mapped(c.format === \"uuid\" ? \"ID\" : \"String\", \"string\");\n case \"boolean\":\n return mapped(\"Boolean\", \"boolean\");\n case \"Date\":\n return mapped(\"DateTime\", \"Date\", \"Date\", [\"DateTime\"]);\n case \"bigint\":\n return mapped(\"BigInt\", \"string | bigint\", \"string\", [\"BigInt\"]);\n default:\n return {\n ...mapped(\"JSON\", \"unknown\", \"unknown\", [\"JSON\"]),\n note: `No GraphQL type for column \"${c.name}\": DRZL could not derive one from the schema, so it is exposed through the JSON scalar and accepts any value there.`\n };\n }\n })();\n let { sdl, rowTs, inputTs } = base;\n const dims = c.arrayDimensions ?? 0;\n for (let i = 0; i < dims; i++) {\n sdl = `[${sdl}]`;\n rowTs = `(${rowTs} | null)[]`;\n inputTs = `(${inputTs} | null)[]`;\n }\n return {\n column: c,\n field,\n renamed: field !== c.name,\n sdl,\n rowTs,\n inputTs,\n scalars: base.scalars,\n enumPlan: base.enumPlan,\n note: base.note\n };\n}\nfunction planTable(table) {\n const typeName = cap(gqlIdent(table.tsName));\n const fieldBase = gqlIdent(table.tsName);\n const select = selectColumns(table).map((c) => planColumn(table, c));\n const writable = !table.readOnly;\n const insert = writable ? insertColumns(table).map((c) => planColumn(table, c)) : [];\n const update = writable ? updateColumns(table).map((c) => planColumn(table, c)) : [];\n const keyCols = keyColumns(table);\n const key = keyCols ? keyCols.map((c) => planColumn(table, c)) : null;\n const scalars = /* @__PURE__ */ new Set();\n const enums = [];\n const notes = [];\n for (const p of select) {\n for (const s of p.scalars) scalars.add(s);\n if (p.enumPlan) enums.push(p.enumPlan);\n if (p.note) notes.push(p.note);\n }\n const createInput = `Create${typeName}Input`;\n const updateInput = `Update${typeName}Input`;\n const hasCreate = writable && insert.length > 0;\n const hasUpdate = writable && key !== null && update.length > 0;\n const keyArgsSdl = key ? key.map((p) => `${p.field}: ${p.sdl}!`).join(\", \") : \"\";\n const keyArgsTs = key ? key.map((p) => `${p.field}: ${p.inputTs}`).join(\"; \") : \"\";\n const ops = [];\n ops.push({\n parent: \"Query\",\n name: fieldBase,\n argsSdl: \"\",\n resultSdl: `[${typeName}!]!`,\n argsTs: \"Record<string, never>\",\n resultTs: `${typeName}[]`\n });\n if (key) {\n ops.push({\n parent: \"Query\",\n name: `${fieldBase}ById`,\n argsSdl: keyArgsSdl,\n resultSdl: typeName,\n argsTs: `{ ${keyArgsTs} }`,\n resultTs: `${typeName} | null`\n });\n }\n if (hasCreate) {\n ops.push({\n parent: \"Mutation\",\n name: `create${typeName}`,\n argsSdl: `input: ${createInput}!`,\n resultSdl: `${typeName}!`,\n argsTs: `{ input: ${createInput} }`,\n resultTs: typeName\n });\n }\n if (hasUpdate) {\n ops.push({\n parent: \"Mutation\",\n name: `update${typeName}`,\n argsSdl: `${keyArgsSdl}, input: ${updateInput}!`,\n resultSdl: `${typeName}!`,\n argsTs: `{ ${keyArgsTs}; input: ${updateInput} }`,\n resultTs: typeName\n });\n }\n if (writable && key) {\n ops.push({\n parent: \"Mutation\",\n name: `delete${typeName}`,\n argsSdl: keyArgsSdl,\n resultSdl: \"Boolean!\",\n argsTs: `{ ${keyArgsTs} }`,\n resultTs: \"boolean\"\n });\n }\n const renamedSelect = select.filter((p) => p.renamed);\n for (const p of renamedSelect) {\n notes.push(\n `Column \"${p.column.name}\" is not a valid GraphQL field name, so it is exposed as \"${p.field}\": output is mapped back by the emitted field resolver, and on inputs the value arrives under \"${p.field}\" for your resolver to write back.`\n );\n }\n return {\n table,\n typeName,\n createInput,\n updateInput,\n select,\n insert,\n update,\n key,\n writable,\n hasCreate,\n hasUpdate,\n ops,\n scalars,\n enums,\n notes,\n renamedSelect\n };\n}\nfunction renderEnumSdl(plan) {\n const lines = [`enum ${plan.typeName} {`];\n for (const m of plan.members) {\n if (m.renamed) lines.push(` ${JSON.stringify(`Database value: ${m.value}`)}`);\n lines.push(` ${m.name}`);\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\nfunction renderTypeSdl(plan) {\n const parts = [];\n for (const e of plan.enums) parts.push(renderEnumSdl(e));\n parts.push(\n [\n `type ${plan.typeName} {`,\n ...plan.select.map((p) => ` ${p.field}: ${p.sdl}${p.column.nullable ? \"\" : \"!\"}`),\n \"}\"\n ].join(\"\\n\")\n );\n if (plan.hasCreate) {\n parts.push(\n [\n `input ${plan.createInput} {`,\n ...plan.insert.map((p) => {\n const required = !p.column.nullable && !p.column.hasDefault;\n return ` ${p.field}: ${p.sdl}${required ? \"!\" : \"\"}`;\n }),\n \"}\"\n ].join(\"\\n\")\n );\n }\n if (plan.hasUpdate) {\n parts.push(\n [\n `input ${plan.updateInput} {`,\n ...plan.update.map((p) => ` ${p.field}: ${p.sdl}`),\n \"}\"\n ].join(\"\\n\")\n );\n }\n return parts.join(\"\\n\\n\");\n}\nfunction rowField(p) {\n const key = isIdent(p.column.name) ? p.column.name : q(p.column.name);\n return ` ${key}: ${p.rowTs}${p.column.nullable ? \" | null\" : \"\"};`;\n}\nfunction inputField(p, mode) {\n const required = mode === \"insert\" && !p.column.nullable && !p.column.hasDefault;\n return required ? ` ${p.field}: ${p.inputTs};` : ` ${p.field}?: ${p.inputTs} | null;`;\n}\nvar stubBody = (parent, name) => `throw new Error('Not implemented: ${parent}.${name}. Replace this stub with your data layer.');`;\nfunction renderResolvers(plan) {\n const lines = [\"{\"];\n const byParent = (parent) => plan.ops.filter((o) => o.parent === parent);\n const renderOps = (parent) => {\n lines.push(` ${parent}: {`);\n for (const op of byParent(parent)) {\n lines.push(\n ` ${op.name}: (_parent: unknown, _args: ${op.argsTs}): ${op.resultTs} => {`,\n ` ${stubBody(parent, op.name)}`,\n ` },`\n );\n }\n lines.push(\" },\");\n };\n renderOps(\"Query\");\n if (byParent(\"Mutation\").length) renderOps(\"Mutation\");\n for (const e of plan.enums) {\n const mapped2 = e.members.filter((m) => m.renamed);\n if (!mapped2.length) continue;\n lines.push(\n ` ${e.typeName}: { ${mapped2.map((m) => `${m.name}: ${q(m.value)}`).join(\", \")} },`\n );\n }\n if (plan.renamedSelect.length) {\n lines.push(` ${plan.typeName}: {`);\n for (const p of plan.renamedSelect) {\n const type = `${p.rowTs}${p.column.nullable ? \" | null\" : \"\"}`;\n lines.push(` ${p.field}: (parent: ${plan.typeName}): ${type} => parent[${q(p.column.name)}],`);\n }\n lines.push(\" },\");\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\nfunction renderTable(plan) {\n const t = plan.table;\n const declared = [];\n declared.push(\n `/** One ${t.name} row, as your resolvers return it: database values, database spellings. */`,\n `export interface ${plan.typeName} {`,\n ...plan.select.map(rowField),\n \"}\"\n );\n if (plan.hasCreate) {\n declared.push(\n \"\",\n `/** The create${plan.typeName} input, as GraphQL hands it to your resolver. */`,\n `export interface ${plan.createInput} {`,\n ...plan.insert.map((p) => inputField(p, \"insert\")),\n \"}\"\n );\n }\n if (plan.hasUpdate) {\n declared.push(\n \"\",\n `/** The update${plan.typeName} patch: every field optional, primary key excluded. */`,\n `export interface ${plan.updateInput} {`,\n ...plan.update.map((p) => inputField(p, \"update\")),\n \"}\"\n );\n }\n const tsName = gqlIdent(t.tsName);\n const notes = plan.notes.length ? plan.notes.map((n) => `// ${n.replace(/\\n/g, \" \")}`).join(\"\\n\") + \"\\n\" : \"\";\n return `// Generated by @drzl/generator-graphql\n// GraphQL SDL and resolver stubs for table: ${t.name}\n${notes}${declared.join(\"\\n\")}\n\n/** The SDL for this table's types. The Query and Mutation fields live in the barrel. */\nexport const ${tsName}TypeDefs = \\`${tpl(renderTypeSdl(plan))}\\`;\n\n/** Stubs that throw until replaced, plus the enum value maps and field resolvers the schema needs. */\nexport const ${tsName}Resolvers = ${renderResolvers(plan)};\n`;\n}\nfunction renderScalarsModule() {\n return `// Generated by @drzl/generator-graphql\n// Dependency-free scalar configs for the resolvers map. Each hook is named twice because\n// graphql 17 renamed serialize/parseValue/parseLiteral to coerceOutputValue/coerceInputValue/\n// coerceInputLiteral, and the schema builder assigns whichever names the running graphql reads.\n\n/** The literal AST shape the literal hooks read, structurally, so nothing is imported. */\nexport interface LiteralNode {\n kind: string;\n value?: unknown;\n values?: LiteralNode[];\n fields?: { name: { value: string }; value: LiteralNode }[];\n name?: { value: string };\n}\n\n// Strict ISO 8601 datetime with seconds and an offset: new Date('1') is the year 2001.\nconst ISO_DATETIME = /^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?(Z|[+-]\\\\d{2}:\\\\d{2})$/;\n\nconst toIso = (value: unknown): string => {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value.toISOString();\n throw new Error('DateTime.serialize: expected a Date');\n};\nconst fromIso = (value: unknown): Date => {\n if (typeof value !== 'string' || !ISO_DATETIME.test(value)) {\n throw new Error('DateTime: expected a strict ISO 8601 datetime string');\n }\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) throw new Error('DateTime: unreadable datetime string');\n return parsed;\n};\nconst fromIsoLiteral = (ast: LiteralNode): Date => {\n if (ast.kind !== 'StringValue') throw new Error('DateTime: expected a string literal');\n return fromIso(ast.value);\n};\n\n/** ISO 8601 datetime string in, real Date to the resolver, toISOString() out. */\nexport const DateTimeScalar = {\n name: 'DateTime',\n description: 'A strict ISO 8601 datetime string, e.g. 2026-01-02T03:04:05.000Z.',\n serialize: toIso,\n parseValue: fromIso,\n parseLiteral: fromIsoLiteral,\n coerceOutputValue: toIso,\n coerceInputValue: fromIso,\n coerceInputLiteral: fromIsoLiteral,\n};\n\nconst DIGITS = /^-?\\\\d+$/;\n\nconst toDigits = (value: unknown): string => {\n if (typeof value === 'bigint') return value.toString();\n if (typeof value === 'string' && DIGITS.test(value)) return value;\n throw new Error('BigInt.serialize: expected a bigint or a decimal digit string');\n};\n// Variables take the digit string only: a JSON number was already rounded by JSON.parse.\nconst fromDigits = (value: unknown): string => {\n if (typeof value !== 'string' || !DIGITS.test(value)) {\n throw new Error('BigInt: expected a string of decimal digits');\n }\n return value;\n};\n// An inline integer literal is lossless: the AST carries its raw digits as a string.\nconst fromDigitsLiteral = (ast: LiteralNode): string => {\n if (ast.kind === 'IntValue') return String(ast.value);\n if (ast.kind === 'StringValue' && typeof ast.value === 'string' && DIGITS.test(ast.value)) {\n return ast.value;\n }\n throw new Error('BigInt: expected an integer literal or a string of decimal digits');\n};\n\n/** A 64-bit-safe integer crossing the wire as its decimal digits. */\nexport const BigIntScalar = {\n name: 'BigInt',\n description: 'An arbitrary-precision integer as a string of decimal digits.',\n serialize: toDigits,\n parseValue: fromDigits,\n parseLiteral: fromDigitsLiteral,\n coerceOutputValue: toDigits,\n coerceInputValue: fromDigits,\n coerceInputLiteral: fromDigitsLiteral,\n};\n\nconst identity = (value: unknown): unknown => value;\nconst fromJSONLiteral = (ast: LiteralNode, variables?: Record<string, unknown> | null): unknown => {\n switch (ast.kind) {\n case 'StringValue':\n case 'BooleanValue':\n case 'EnumValue':\n return ast.value;\n case 'IntValue':\n case 'FloatValue':\n return Number(ast.value);\n case 'NullValue':\n return null;\n case 'ListValue':\n return (ast.values ?? []).map((v) => fromJSONLiteral(v, variables));\n case 'ObjectValue': {\n const out: Record<string, unknown> = {};\n for (const f of ast.fields ?? []) out[f.name.value] = fromJSONLiteral(f.value, variables);\n return out;\n }\n case 'Variable':\n return variables ? variables[ast.name?.value ?? ''] : undefined;\n default:\n throw new Error('JSON: unsupported literal kind ' + ast.kind);\n }\n};\n\n/** Any JSON value, untouched on both value paths, rebuilt from the AST for inline literals. */\nexport const JSONScalar = {\n name: 'JSON',\n description: 'Any JSON value, passed through as-is.',\n serialize: identity,\n parseValue: identity,\n parseLiteral: fromJSONLiteral,\n coerceOutputValue: identity,\n coerceInputValue: identity,\n coerceInputLiteral: fromJSONLiteral,\n};\n`;\n}\nvar SCALAR_EXPORTS = {\n DateTime: \"DateTimeScalar\",\n BigInt: \"BigIntScalar\",\n JSON: \"JSONScalar\"\n};\nfunction renderBarrel(plans, modules, usedScalars, scalarsSpec) {\n if (!plans.length) {\n return `// Generated by @drzl/generator-graphql\n// No tables detected in analysis. Add tables to your schema and regenerate.\n// A GraphQL schema needs a Query type with at least one field, so no typeDefs are composed.\nexport * from '${scalarsSpec}';\n\nexport const typeDefs = '';\n\nexport const resolvers = {};\n`;\n }\n const imports = [];\n if (usedScalars.length) {\n const names = usedScalars.map((s) => SCALAR_EXPORTS[s]).sort();\n imports.push(`import { ${names.join(\", \")} } from '${scalarsSpec}';`);\n }\n for (const plan of plans) {\n const tsName = gqlIdent(plan.table.tsName);\n imports.push(\n `import { ${tsName}Resolvers, ${tsName}TypeDefs } from '${modules.get(plan)}';`\n );\n }\n const reExports = [\n `export * from '${scalarsSpec}';`,\n ...plans.map((p) => `export * from '${modules.get(p)}';`)\n ];\n const queryLines = plans.flatMap(\n (p) => p.ops.filter((o) => o.parent === \"Query\").map((o) => ` ${o.name}${o.argsSdl ? `(${o.argsSdl})` : \"\"}: ${o.resultSdl}`)\n );\n const mutationLines = plans.flatMap(\n (p) => p.ops.filter((o) => o.parent === \"Mutation\").map((o) => ` ${o.name}(${o.argsSdl}): ${o.resultSdl}`)\n );\n const typeDefParts = [\n ...usedScalars.map((s) => `'scalar ${s}'`),\n ...plans.map((p) => `${gqlIdent(p.table.tsName)}TypeDefs`),\n `\\`${tpl([\"type Query {\", ...queryLines, \"}\"].join(\"\\n\"))}\\``\n ];\n if (mutationLines.length) {\n typeDefParts.push(`\\`${tpl([\"type Mutation {\", ...mutationLines, \"}\"].join(\"\\n\"))}\\``);\n }\n const resolverLines = [\"export const resolvers = {\"];\n for (const s of usedScalars) resolverLines.push(` ${s}: ${SCALAR_EXPORTS[s]},`);\n for (const p of plans) {\n const tsName = gqlIdent(p.table.tsName);\n for (const e of p.enums) {\n if (e.members.some((m) => m.renamed)) {\n resolverLines.push(` ${e.typeName}: ${tsName}Resolvers.${e.typeName},`);\n }\n }\n if (p.renamedSelect.length) {\n resolverLines.push(` ${p.typeName}: ${tsName}Resolvers.${p.typeName},`);\n }\n }\n resolverLines.push(\" Query: {\");\n for (const p of plans) resolverLines.push(` ...${gqlIdent(p.table.tsName)}Resolvers.Query,`);\n resolverLines.push(\" },\");\n const mutating = plans.filter((p) => p.ops.some((o) => o.parent === \"Mutation\"));\n if (mutating.length) {\n resolverLines.push(\" Mutation: {\");\n for (const p of mutating) {\n resolverLines.push(` ...${gqlIdent(p.table.tsName)}Resolvers.Mutation,`);\n }\n resolverLines.push(\" },\");\n }\n resolverLines.push(\"};\");\n return `// Generated by @drzl/generator-graphql\n// The whole schema in one pair: hand typeDefs and resolvers to makeExecutableSchema,\n// createSchema (graphql-yoga) or new ApolloServer(...). Plain buildSchema(typeDefs) accepts\n// the SDL too, but takes no resolvers, so scalar and enum behaviour will not attach there.\n${imports.join(\"\\n\")}\n\n${reExports.join(\"\\n\")}\n\n/** The whole schema's SDL. */\nexport const typeDefs = [\n${typeDefParts.map((p) => ` ${p},`).join(\"\\n\")}\n].join('\\\\n\\\\n');\n\n/** Everything merged. Override per field: { ...resolvers, Query: { ...resolvers.Query, users: yours } } */\n${resolverLines.join(\"\\n\")}\n`;\n}\nfunction buildHeader(h) {\n if (h && h.enabled === false) return \"\";\n const text = h?.text?.trim();\n const lines = text ? text.split(/\\r?\\n/).map((l) => `// ${l}`) : [\n \"// Generated by DRZL (@drzl/*)\",\n \"// Generated output is granted to you under your project's license.\",\n \"// You may use, copy, modify, and distribute without attribution.\"\n ];\n return lines.join(\"\\n\") + \"\\n\\n\";\n}\nfunction toCase(s, c) {\n if (!c) return s;\n const parts = s.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").replace(/[_-]/g, \" \").split(/\\s+/);\n if (c === \"camel\") {\n return parts.map(\n (p, i) => i === 0 ? p.toLowerCase() : p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()\n ).join(\"\");\n }\n if (c === \"kebab\") return parts.map((p) => p.toLowerCase()).join(\"-\");\n if (c === \"snake\") return parts.map((p) => p.toLowerCase()).join(\"_\");\n return s;\n}\nvar GraphQLGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n }\n async generate(opts) {\n const fs = fileWriter(opts.fileSink);\n const path = await import(\"path\");\n const out = path.resolve(process.cwd(), opts.outputDir);\n await fs.mkdir(out, { recursive: true });\n const files = [];\n const write = async (filePath, content) => {\n const formatted = await formatCode(\n buildHeader(opts.outputHeader) + content,\n filePath,\n opts.format\n );\n await fs.writeFile(filePath, formatted, \"utf8\");\n files.push(filePath);\n };\n const barrelPath = path.join(out, `${APP_MODULE}.ts`);\n const scalarsPath = path.join(out, `${SCALARS_MODULE}.ts`);\n const plans = this.analysis.tables.map(planTable);\n const modules = /* @__PURE__ */ new Map();\n const total = plans.length;\n let index = 0;\n for (const plan of plans) {\n const base = `${plan.table.tsName}${opts.naming?.routerSuffix ?? \"\"}`;\n const filePath = path.join(out, `${toCase(base, opts.naming?.procedureCase)}.ts`);\n if (filePath === barrelPath || filePath === scalarsPath) {\n const which = filePath === barrelPath ? \"the barrel\" : \"the scalars module\";\n throw new Error(\n `@drzl/generator-graphql: the module for table \"${plan.table.name}\" would be written to ${filePath}, which is ${which} this generator also writes. Set naming.routerSuffix to move it out of the way.`\n );\n }\n await write(filePath, renderTable(plan));\n modules.set(\n plan,\n importSpecifier(\"./\" + path.relative(out, filePath).replace(/\\\\/g, \"/\"), opts.importExtension)\n );\n index++;\n opts.onProgress?.({ index, total, table: plan.table.name, filePath });\n }\n const usedScalars = [\"DateTime\", \"BigInt\", \"JSON\"].filter(\n (s) => plans.some((p) => p.scalars.has(s))\n );\n const scalarsSpec = importSpecifier(`./${SCALARS_MODULE}.ts`, opts.importExtension);\n await write(scalarsPath, renderScalarsModule());\n await write(barrelPath, renderBarrel(plans, modules, usedScalars, scalarsSpec));\n return { files };\n }\n};\nvar index_default = GraphQLGenerator;\nexport {\n APP_MODULE,\n GraphQLGenerator,\n SCALARS_MODULE,\n index_default as default\n};\n"],"mappings":"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","names":[]}
@@ -1,4 +1,5 @@
1
1
  // ../generator-trpc/dist/index.js
2
+ import { fileWriter } from "@drzl/validation-core";
2
3
  import {
3
4
  formatCode,
4
5
  importSpecifier,
@@ -155,7 +156,7 @@ var TRPCGenerator = class {
155
156
  this.analysis = analysis;
156
157
  }
157
158
  async generate(opts) {
158
- const fs = await import("fs/promises");
159
+ const fs = fileWriter(opts.fileSink);
159
160
  const path = await import("path");
160
161
  const out = path.resolve(process.cwd(), opts.outputDir);
161
162
  const ctx = {
@@ -259,8 +260,8 @@ function renderRouter(table, opts, ctx) {
259
260
  const writable = !table.readOnly;
260
261
  const key = keyColumns(table);
261
262
  const Service = `${cap(singularize(table.tsName))}Service`;
262
- const serviceKeyable = !!key && key.length === 1 && key[0].tsType === "number";
263
- const keyArg = key && key.length === 1 ? `input.${key[0].name}` : "";
263
+ const serviceKeyable = !!key && key.every(serviceKeyExpressible);
264
+ const keyArg = key ? key.map((c) => `input.${c.name}`).join(", ") : "";
264
265
  const dbArg = injection ? "ctx.db, " : "";
265
266
  const wiredParams = injection ? "{ ctx, input }" : "{ input }";
266
267
  const procedures = [];
@@ -469,10 +470,19 @@ export type AppRouter = typeof appRouter;
469
470
 
470
471
  ${reExports}`;
471
472
  }
473
+ function serviceKeyExpressible(c) {
474
+ if (c.enumValues && c.enumValues.length) return true;
475
+ return ["number", "string", "boolean", "Date"].includes(c.tsType);
476
+ }
472
477
  function serviceKeyNote(table) {
473
478
  const cols = table.primaryKey?.columns ?? [];
474
- const shape = cols.length > 1 ? `has a composite primary key (${cols.join(", ")})` : `has a non-numeric primary key (${cols[0]})`;
475
- return `// ${table.name} ${shape}, and @drzl/generator-service types its key parameter as one number.
479
+ const untyped = cols.filter((n) => {
480
+ const c = table.columns.find((x) => x.name === n);
481
+ return !c || !serviceKeyExpressible(c);
482
+ });
483
+ const what = untyped.length === 1 ? `its column ${untyped[0]}` : `its columns ${untyped.join(", ")}`;
484
+ return `// ${table.name} is keyed on (${cols.join(", ")}) and DRZL cannot type ${what}: the input
485
+ // schema carries unknown there, which the service's typed key parameter does not accept.
476
486
  // Wire this to your own lookup.`;
477
487
  }
478
488
  function routerExportName(table, naming) {
@@ -509,4 +519,4 @@ export {
509
519
  TRPC_MAJOR,
510
520
  index_default as default
511
521
  };
512
- //# sourceMappingURL=dist-XBGVORL3.js.map
522
+ //# sourceMappingURL=dist-ZIHNXQ7U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../generator-trpc/dist/index.js"],"sourcesContent":["// src/index.ts\nimport { fileWriter } from \"@drzl/validation-core\";\nimport {\n formatCode,\n importSpecifier,\n resolveAffix,\n resolveConfiguredImport,\n schemaName\n} from \"@drzl/validation-core\";\nvar TRPC_MAJOR = 11;\nvar q = (v) => JSON.stringify(v);\nvar LIB_IMPORTS = {\n zod: \"import { z } from 'zod';\",\n valibot: \"import * as v from 'valibot';\",\n arktype: \"import { type } from 'arktype';\"\n};\nvar LIB_USAGE = {\n zod: /\\bz\\./,\n valibot: /\\bv\\./,\n arktype: /\\btype\\(/\n};\nvar LIBS = {\n zod: {\n number: \"z.number()\",\n string: \"z.string()\",\n boolean: \"z.boolean()\",\n date: \"z.date()\",\n unknown: \"z.unknown()\",\n tuple: (n) => `z.tuple([${Array.from({ length: n }, () => \"z.number()\").join(\", \")}])`,\n numberObject: (fields) => `z.object({ ${fields.map((f) => `${f}: z.number()`).join(\", \")} })`,\n enum: (vals) => `z.enum([${vals.map(q).join(\", \")}] as const)`,\n nullable: (b) => `${b}.nullable()`,\n optional: (b) => `${b}.optional()`,\n object: (body) => `z.object({\n${body}\n})`,\n objectInline: (body) => `z.object({ ${body} })`,\n partialUpdate: (s) => `${s}.partial()`,\n arrayOf: (s) => `z.array(${s})`,\n nullableOf: (s) => `${s}.nullable()`,\n booleanSchema: \"z.boolean()\"\n },\n valibot: {\n number: \"v.number()\",\n string: \"v.string()\",\n boolean: \"v.boolean()\",\n date: \"v.date()\",\n unknown: \"v.unknown()\",\n tuple: (n) => `v.tuple([${Array.from({ length: n }, () => \"v.number()\").join(\", \")}])`,\n numberObject: (fields) => `v.object({ ${fields.map((f) => `${f}: v.number()`).join(\", \")} })`,\n enum: (vals) => `v.picklist([${vals.map(q).join(\", \")}] as const)`,\n nullable: (b) => `v.nullable(${b})`,\n optional: (b) => `v.optional(${b})`,\n object: (body) => `v.object({\n${body}\n})`,\n objectInline: (body) => `v.object({ ${body} })`,\n arrayOf: (s) => `v.array(${s})`,\n nullableOf: (s) => `v.nullable(${s})`,\n booleanSchema: \"v.boolean()\"\n },\n arktype: {\n number: \"number\",\n string: \"string\",\n boolean: \"boolean\",\n date: \"Date\",\n unknown: \"unknown\",\n // The surrounding encode adds the quotes, so the union is built with the inner quoting\n // ArkType expects. Emitting `'${...}'` here produces `''admin' | 'user''`, which does not parse.\n enum: (vals) => vals.map((x) => `'${x.replace(/'/g, \"\\\\'\")}'`).join(\" | \"),\n nullable: (b) => `(${b} | null)`,\n optional: (b) => `${b}?`,\n object: (body) => `type({\n${body}\n})`,\n objectInline: (body) => `type({ ${body} })`,\n fieldIsString: true,\n arrayOf: (s) => `${s}.array()`,\n nullableOf: (s) => `${s}.or('null')`,\n booleanSchema: `type('boolean')`\n }\n};\nfunction isWide(column) {\n if (column.enumValues && column.enumValues.length) return false;\n if (column.shape?.kind === \"tuple\" || column.shape?.kind === \"numberObject\") return false;\n return ![\"number\", \"string\", \"boolean\", \"Date\"].includes(column.tsType);\n}\nfunction mapExpr(column, lib, mode) {\n const d = LIBS[lib];\n let base = (() => {\n if (column.enumValues && column.enumValues.length) return d.enum(column.enumValues);\n if (column.shape?.kind === \"tuple\" && d.tuple) return d.tuple(column.shape.length);\n if (column.shape?.kind === \"numberObject\" && d.numberObject) {\n return d.numberObject(column.shape.fields);\n }\n switch (column.tsType) {\n case \"number\":\n return d.number;\n case \"string\":\n return d.string;\n case \"boolean\":\n return d.boolean;\n case \"Date\":\n return d.date;\n default:\n return d.unknown;\n }\n })();\n if (column.nullable) base = d.nullable(base);\n if (mode !== \"select\") {\n const optional = mode === \"update\" || column.nullable || column.hasDefault;\n if (optional) base = d.optional(base);\n }\n return base;\n}\nfunction field(column, lib, mode) {\n const d = LIBS[lib];\n const expr = mapExpr(column, lib, mode);\n return `${objectKey(column.name)}: ${d.fieldIsString ? JSON.stringify(expr) : expr}`;\n}\nfunction objectKey(name) {\n return isIdent(name) ? name : JSON.stringify(name);\n}\nfunction renderSchema(table, lib, mode) {\n const d = LIBS[lib];\n const cols = table.columns.filter((c) => mode === \"select\" ? true : !c.isGenerated);\n const body = cols.map((c) => ` ${field(c, lib, mode)},`).join(\"\\n\");\n const schema = d.object(body);\n return mode === \"update\" && d.partialUpdate ? d.partialUpdate(schema) : schema;\n}\nfunction toCase(s, c) {\n if (!c) return s;\n const parts = s.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").replace(/[_-]/g, \" \").split(/\\s+/);\n if (c === \"camel\") {\n return parts.map(\n (p, i) => i === 0 ? p.toLowerCase() : p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()\n ).join(\"\");\n }\n if (c === \"kebab\") return parts.map((p) => p.toLowerCase()).join(\"-\");\n if (c === \"snake\") return parts.map((p) => p.toLowerCase()).join(\"_\");\n return s;\n}\nvar cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);\nvar singularize = (s) => s.endsWith(\"ies\") ? s.slice(0, -3) + \"y\" : s.endsWith(\"s\") ? s.slice(0, -1) : s;\nvar isIdent = (s) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(s);\nvar BASE_MODULE = \"trpc\";\nfunction keyColumns(table) {\n const names = table.primaryKey?.columns ?? [];\n if (!names.length) return null;\n const cols = names.map((n) => table.columns.find((c) => c.name === n));\n if (cols.some((c) => !c)) return null;\n return cols;\n}\nvar TRPCGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n }\n async generate(opts) {\n const fs = fileWriter(opts.fileSink);\n const path = await import(\"path\");\n const out = path.resolve(process.cwd(), opts.outputDir);\n const ctx = {\n out,\n services: path.resolve(process.cwd(), opts.servicesDir ?? \"src/services\")\n };\n await fs.mkdir(out, { recursive: true });\n const files = [];\n const write = async (filePath, content) => {\n const formatted = await formatCode(\n buildHeader(opts.outputHeader) + content,\n filePath,\n opts.format\n );\n await fs.writeFile(filePath, formatted, \"utf8\");\n files.push(filePath);\n };\n const basePath = path.join(out, `${BASE_MODULE}.ts`);\n await write(basePath, renderBase(opts));\n const routers = [];\n const total = this.analysis.tables.length;\n let index = 0;\n for (const table of this.analysis.tables) {\n const base = `${table.tsName}${opts.naming?.routerSuffix ?? \"\"}`;\n const filePath = path.join(out, `${toCase(base, opts.naming?.procedureCase)}.ts`);\n if (filePath === basePath) {\n throw new Error(\n `@drzl/generator-trpc: the router for table \"${table.name}\" would be written to ${filePath}, which is the shared tRPC base module this generator also writes. Set naming.routerSuffix to move it out of the way.`\n );\n }\n await write(filePath, renderRouter(table, opts, ctx));\n routers.push({ table, filePath, exportName: routerExportName(table, opts.naming) });\n index++;\n opts.onProgress?.({ index, total, table: table.name, filePath });\n }\n await write(path.join(out, \"index.ts\"), renderBarrel(routers, ctx, path, opts));\n return { files };\n }\n};\nvar index_default = TRPCGenerator;\nfunction renderBase(opts) {\n const injection = opts.databaseInjection?.enabled === true;\n const dbType = opts.databaseInjection?.databaseType ?? \"unknown\";\n const typeImport = opts.databaseInjection?.databaseTypeImport ? `import type { ${opts.databaseInjection.databaseTypeImport.name} } from '${opts.databaseInjection.databaseTypeImport.from}';\n` : \"\";\n const trpcImport = injection ? `import { initTRPC, TRPCError } from '@trpc/server';` : `import { initTRPC } from '@trpc/server';`;\n const context = injection ? `/**\n * What your \\`createContext\\` hands every procedure.\n *\n * \\`db\\` is optional here and required by \\`dbProcedure\\` below. That split is what lets an adapter\n * build a context without a handle, for a health check or a public route, while every generated\n * procedure still sees one that is present.\n */\nexport interface Context {\n db?: ${dbType};\n}` : `/**\n * What your \\`createContext\\` hands every procedure. Nothing generated reads it, so it is left\n * open; narrow it to the shape your own context really has.\n */\nexport type Context = Record<string, unknown>;`;\n const middleware = injection ? `\n/**\n * The builder every generated procedure is built from: it refuses to run without a database\n * handle, and narrows \\`ctx.db\\` from optional to present for everything downstream.\n */\nexport const dbProcedure = t.procedure.use(async ({ ctx, next }) => {\n if (!ctx.db) {\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'No database handle on the tRPC context. Provide one from createContext.',\n });\n }\n return next({ ctx: { db: ctx.db } });\n});\n` : \"\";\n return `// Generated by @drzl/generator-trpc\n// The shared tRPC base. Every generated router imports from here.\n${trpcImport}\n${typeImport}\n${context}\n\nconst t = initTRPC.context<Context>().create();\n\nexport const router = t.router;\nexport const mergeRouters = t.mergeRouters;\nexport const middleware = t.middleware;\n/** Needed to call this router in-process, from a test or from SSR. */\nexport const createCallerFactory = t.createCallerFactory;\nexport const publicProcedure = t.procedure;\n${middleware}`;\n}\nfunction renderRouter(table, opts, ctx) {\n const lib = opts.validation?.library ?? \"zod\";\n const d = LIBS[lib];\n const service = opts.template === \"service\";\n const injection = opts.databaseInjection?.enabled === true;\n const builder = injection ? \"dbProcedure\" : \"publicProcedure\";\n const insertName = `Insert${table.tsName}Schema`;\n const updateName = `Update${table.tsName}Schema`;\n const selectName = `Select${table.tsName}Schema`;\n const writable = !table.readOnly;\n const key = keyColumns(table);\n const Service = `${cap(singularize(table.tsName))}Service`;\n const serviceKeyable = !!key && key.every(serviceKeyExpressible);\n const keyArg = key ? key.map((c) => `input.${c.name}`).join(\", \") : \"\";\n const dbArg = injection ? \"ctx.db, \" : \"\";\n const wiredParams = injection ? \"{ ctx, input }\" : \"{ input }\";\n const procedures = [];\n const notImplemented = (what) => `throw new Error('Not implemented: ${what} ${table.tsName}.');`;\n procedures.push({\n name: \"list\",\n kind: \"query\",\n output: d.arrayOf(selectName),\n params: service && injection ? \"{ ctx }\" : \"\",\n body: service ? [`return await ${Service}.getAll(${injection ? \"ctx.db\" : \"\"});`] : [\"return [];\"]\n });\n const keyInput = key ? d.objectInline(key.map((c) => field(c, lib, \"select\")).join(\", \")) : void 0;\n if (key && keyInput) {\n const wired = service && serviceKeyable;\n procedures.push({\n name: \"byId\",\n kind: \"query\",\n input: keyInput,\n output: d.nullableOf(selectName),\n params: wired ? wiredParams : \"{ input: _input }\",\n body: wired ? [`return await ${Service}.getById(${dbArg}${keyArg});`] : service ? [serviceKeyNote(table), notImplemented(\"byId\")] : [\"return null;\"]\n });\n if (writable) {\n const updateInput = d.objectInline(\n [...key.map((c) => field(c, lib, \"select\")), `data: ${updateName}`].join(\", \")\n );\n procedures.push({\n name: \"update\",\n kind: \"mutation\",\n input: updateInput,\n output: selectName,\n params: wired ? wiredParams : \"{ input: _input }\",\n body: wired ? [`return await ${Service}.update(${dbArg}${keyArg}, input.data);`] : service ? [serviceKeyNote(table), notImplemented(\"update\")] : [notImplemented(\"update\")]\n });\n procedures.push({\n name: \"delete\",\n kind: \"mutation\",\n input: keyInput,\n output: d.booleanSchema,\n params: wired ? wiredParams : \"{ input: _input }\",\n body: wired ? [`return await ${Service}.delete(${dbArg}${keyArg});`] : service ? [serviceKeyNote(table), notImplemented(\"delete\")] : [\"return true;\"]\n });\n }\n }\n if (writable) {\n procedures.push({\n name: \"create\",\n kind: \"mutation\",\n input: insertName,\n output: selectName,\n params: service ? wiredParams : \"{ input: _input }\",\n body: service ? [`return await ${Service}.create(${dbArg}input);`] : [notImplemented(\"create\")]\n });\n }\n if (opts.includeRelations) {\n const taken = new Set(procedures.map((p) => p.name));\n procedures.push(...relationProcedures(table, lib, selectName, taken, service));\n }\n const order = [\"list\", \"byId\", \"create\", \"update\", \"delete\"];\n const rank = (n) => order.indexOf(n) === -1 ? order.length : order.indexOf(n);\n procedures.sort((a, b) => rank(a.name) - rank(b.name));\n const routerName = routerExportName(table, opts.naming);\n const entries = procedures.map((p) => {\n const rawKey = toCase(p.name, opts.naming?.procedureCase);\n const propKey = isIdent(rawKey) ? rawKey : JSON.stringify(rawKey);\n return [\n ` ${propKey}: ${builder}`,\n ...p.input ? [` .input(${p.input})`] : [],\n ` .output(${p.output})`,\n ` .${p.kind}(async (${p.params}) => {`,\n ...p.body.map((line) => ` ${line}`),\n ` }),`\n ].join(\"\\n\");\n }).join(\"\\n\");\n const body = `export const ${routerName} = router({\n${entries}\n});\n`;\n const useShared = !!opts.validation?.useShared && !!opts.validation?.importPath;\n const declared = [];\n if (!useShared) {\n if (writable) {\n declared.push(`export const ${insertName} = ${renderSchema(table, lib, \"insert\")};`);\n declared.push(`export const ${updateName} = ${renderSchema(table, lib, \"update\")};`);\n }\n declared.push(`export const ${selectName} = ${renderSchema(table, lib, \"select\")};`);\n }\n const decided = [...declared, body].join(\"\\n\\n\");\n const imports = [];\n if (useShared) {\n const sharedAffix = resolveAffix({\n affix: opts.validation?.affix,\n schemaSuffix: opts.validation?.schemaSuffix\n });\n const wanted = [\n [\"insert\", insertName],\n [\"update\", updateName],\n [\"select\", selectName]\n ].filter(([, local]) => decided.includes(local));\n if (wanted.length) {\n const spec = resolveConfiguredImport(\n opts.validation.importPath,\n ctx.out,\n process.cwd(),\n opts.importExtension\n );\n const names = wanted.map(([mode, local]) => {\n const exported = schemaName(mode, table.tsName, sharedAffix);\n return exported === local ? local : `${exported} as ${local}`;\n }).join(\", \");\n imports.push(`import { ${names} } from '${spec}';`);\n }\n }\n imports.push(\n `import { ${[builder, \"router\"].sort().join(\", \")} } from '${importSpecifier(\n `./${BASE_MODULE}.ts`,\n opts.importExtension\n )}';`\n );\n if (service) {\n imports.push(`import { ${Service} } from '${serviceImportSpecifier(table, ctx, opts)}';`);\n }\n if (LIB_USAGE[lib].test(decided)) imports.unshift(LIB_IMPORTS[lib]);\n const wide = table.columns.filter(isWide).map((c) => c.name);\n const wideNote = wide.length ? `// No validated type for ${wide.length === 1 ? \"this column\" : \"these columns\"}: ${wide.join(\", \")}.\n// DRZL could not derive one from the schema, so the router accepts any value there.\n` : \"\";\n return `// Generated by @drzl/generator-trpc\n// Router for table: ${table.name}\n${wideNote}${imports.join(\"\\n\")}\n\n${decided}`;\n}\nfunction relationProcedures(table, lib, selectSchemaName, taken, service) {\n const d = LIBS[lib];\n const out = [];\n for (const fk of table.foreignKeys ?? []) {\n if (fk.columns.length !== 1) continue;\n const colName = fk.columns[0];\n const column = table.columns.find((c) => c.name === colName);\n if (!column) continue;\n const name = `listBy${cap(colName)}`;\n if (taken.has(name)) continue;\n taken.add(name);\n out.push({\n name,\n kind: \"query\",\n input: d.objectInline(field(column, lib, \"select\")),\n output: d.arrayOf(selectSchemaName),\n params: \"{ input: _input }\",\n body: [\n `// Rows of ${table.name} whose ${JSON.stringify(colName)} matches _input.${colName}.`,\n // In `service` mode every other procedure really does reach the database, so a lookup\n // quietly answering with an empty array would read as \"no matching rows\". There is no\n // generated service method for it, so it says so instead. In `standard` mode everything\n // is a stub and `[]` is consistent with `list`.\n service ? `throw new Error('Not implemented: ${name} ${table.tsName}.');` : \"return [];\"\n ]\n });\n }\n return out;\n}\nfunction renderBarrel(routers, ctx, path, opts) {\n const baseSpec = importSpecifier(`./${BASE_MODULE}.ts`, opts.importExtension);\n const reExports = `export { createCallerFactory, publicProcedure, router } from '${baseSpec}';\n` + (opts.databaseInjection?.enabled === true ? `export { dbProcedure } from '${baseSpec}';\n` : \"\") + `export type { Context } from '${baseSpec}';\n`;\n if (!routers.length) {\n return `// Generated by @drzl/generator-trpc\n// No tables detected in analysis. Add tables to your schema and regenerate.\nimport { router } from '${baseSpec}';\n\nexport const appRouter = router({});\n\n/** The type a tRPC client is parameterised by: \\`createTRPCClient<AppRouter>()\\`. */\nexport type AppRouter = typeof appRouter;\n\n${reExports}`;\n }\n const entries = routers.map(({ filePath, exportName, table }) => ({\n rel: importSpecifier(\n \"./\" + path.relative(ctx.out, filePath).replace(/\\\\/g, \"/\"),\n opts.importExtension\n ),\n exportName,\n // The namespace a client reaches this table's procedures through: `trpc.userProfiles.list`.\n // `tsName` verbatim, because it is already a valid identifier and it is the name the user\n // wrote in their schema. The oRPC barrel lowercases this key, turning `userProfiles` into\n // `userprofiles`: harmless in an object literal nobody reads, and not harmless when the key\n // is the public API of a typed client.\n key: table.tsName\n }));\n const importLines = entries.map(({ rel, exportName }) => `import { ${exportName} } from '${rel}';`).join(\"\\n\");\n const bodyLines = entries.map(({ key, exportName }) => ` ${isIdent(key) ? key : JSON.stringify(key)}: ${exportName},`).join(\"\\n\");\n return `// Generated by @drzl/generator-trpc\nimport { router } from '${baseSpec}';\n${importLines}\n\nexport const appRouter = router({\n${bodyLines}\n});\n\n/** The type a tRPC client is parameterised by: \\`createTRPCClient<AppRouter>()\\`. */\nexport type AppRouter = typeof appRouter;\n\n${reExports}`;\n}\nfunction serviceKeyExpressible(c) {\n if (c.enumValues && c.enumValues.length) return true;\n return [\"number\", \"string\", \"boolean\", \"Date\"].includes(c.tsType);\n}\nfunction serviceKeyNote(table) {\n const cols = table.primaryKey?.columns ?? [];\n const untyped = cols.filter((n) => {\n const c = table.columns.find((x) => x.name === n);\n return !c || !serviceKeyExpressible(c);\n });\n const what = untyped.length === 1 ? `its column ${untyped[0]}` : `its columns ${untyped.join(\", \")}`;\n return `// ${table.name} is keyed on (${cols.join(\", \")}) and DRZL cannot type ${what}: the input\n// schema carries unknown there, which the service's typed key parameter does not accept.\n// Wire this to your own lookup.`;\n}\nfunction routerExportName(table, naming) {\n const base = `${table.tsName}${naming?.routerSuffix ?? \"Router\"}`;\n const c = naming?.procedureCase;\n return toCase(base, c === \"kebab\" ? \"camel\" : c);\n}\nfunction serviceImportSpecifier(table, ctx, opts) {\n const rel = relativePosix(ctx.out, ctx.services);\n const dir = !rel ? \".\" : rel.startsWith(\".\") ? rel : `./${rel}`;\n return importSpecifier(`${dir}/${singularize(table.tsName)}Service.ts`, opts.importExtension);\n}\nfunction relativePosix(from, to) {\n const norm = (p) => p.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const a = norm(from).split(\"/\");\n const b = norm(to).split(\"/\");\n let i = 0;\n while (i < a.length && i < b.length && a[i] === b[i]) i++;\n return [...Array.from({ length: a.length - i }, () => \"..\"), ...b.slice(i)].join(\"/\");\n}\nfunction buildHeader(h) {\n if (h && h.enabled === false) return \"\";\n const text = h?.text?.trim();\n const lines = text ? text.split(/\\r?\\n/).map((l) => `// ${l}`) : [\n \"// Generated by DRZL (@drzl/*)\",\n \"// Generated output is granted to you under your project's license.\",\n \"// You may use, copy, modify, and distribute without attribution.\"\n ];\n return lines.join(\"\\n\") + \"\\n\\n\";\n}\nexport {\n BASE_MODULE,\n TRPCGenerator,\n TRPC_MAJOR,\n index_default as default\n};\n"],"mappings":"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","names":[]}