@drzl/cli 4.23.0 → 4.24.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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../generator-json-schema/dist/index.js"],"sourcesContent":["// src/index.ts\nimport { fileWriter } from \"@drzl/validation-core\";\nimport {\n formatCode,\n moduleFileName,\n moduleSpecifier,\n resolveAffix,\n schemaName,\n typeName\n} from \"@drzl/validation-core\";\n\n// src/openapi.ts\nimport { qualifiedForeignTable, qualifiedTableName } from \"@drzl/analyzer\";\n\n// src/schemas.ts\nimport {\n applyWirePolicy,\n canonicalMembers,\n comparisonWire,\n COLUMN_FORMATS,\n insertColumns,\n isIntegerColumn,\n parseCheck,\n selectColumns,\n updateColumns\n} from \"@drzl/validation-core\";\n\n// src/enums.ts\nvar identity = (values) => JSON.stringify([...values]);\nfunction enumKey(name) {\n const safe = name.replace(/[^A-Za-z0-9.\\-_]/g, \"_\").replace(/^_+|_+$/g, \"\");\n return safe.length ? safe : void 0;\n}\nfunction declaredEnumColumns(columns) {\n return columns.filter((c) => !c.shape && c.enumValues && c.enumValues.length);\n}\nfunction planSharedEnums(columns, enums, ref2, reserved = /* @__PURE__ */ new Set()) {\n if (!enums?.length) return void 0;\n const uses = /* @__PURE__ */ new Map();\n for (const c of declaredEnumColumns(columns)) {\n const id = identity(c.enumValues);\n uses.set(id, (uses.get(id) ?? 0) + 1);\n }\n const keyed = /* @__PURE__ */ new Map();\n const taken = new Set(reserved);\n for (const e of enums) {\n const id = identity(e.values);\n if ((uses.get(id) ?? 0) < 2) continue;\n if (keyed.has(id)) continue;\n const key = enumKey(e.name);\n if (!key || taken.has(key)) continue;\n taken.add(key);\n keyed.set(id, { key, values: [...e.values] });\n }\n if (!keyed.size) return void 0;\n const used = /* @__PURE__ */ new Set();\n return {\n resolve(values) {\n const hit = keyed.get(identity(values));\n if (!hit) return void 0;\n used.add(hit.key);\n return ref2(hit.key);\n },\n definitions() {\n const out = {};\n for (const { key, values } of keyed.values()) {\n if (used.has(key)) out[key] = { enum: [...values] };\n }\n return out;\n }\n };\n}\nvar allColumns = (tables) => tables.flatMap((t) => t.columns);\n\n// src/schemas.ts\nvar DRAFT = \"https://json-schema.org/draft/2020-12/schema\";\nvar UUID_FORMAT = \"uuid\";\nvar base64 = (target) => target === \"openapi-3.0\" ? { type: \"string\", format: \"byte\" } : { type: \"string\", contentEncoding: \"base64\" };\nfunction canonicalSetPattern(values, integerOnly) {\n const branches = canonicalMembers(values).map((member) => {\n if (member === \"0\") return integerOnly ? \"[+-]?0+\" : \"[+-]?(?:0+(?:\\\\.0*)?|0*\\\\.0+)\";\n const sign = member.startsWith(\"-\") ? \"-\" : \"\\\\+?\";\n const body = member.startsWith(\"-\") ? member.slice(1) : member;\n const [int = \"\", frac = \"\"] = body.split(\".\");\n if (integerOnly) return `${sign}0*${int}`;\n if (!frac) return `${sign}0*${int}(?:\\\\.0*)?`;\n return int === \"0\" ? `${sign}0*\\\\.${frac}0*` : `${sign}0*${int}\\\\.${frac}0*`;\n });\n return `^(?:${branches.join(\"|\")})$`;\n}\nfunction baseSchema(c, mode, target, checks, sets, lengths, enumRef) {\n const s = c.shape;\n if (s) {\n switch (s.kind) {\n case \"json\":\n return {};\n case \"custom\":\n return {};\n case \"buffer\": {\n const bin = base64(target);\n applyBinaryLengths(bin, c, lengths);\n return bin;\n }\n case \"tuple\":\n return target === \"openapi-3.0\" ? { type: \"array\", items: { type: \"number\" }, minItems: s.length, maxItems: s.length } : {\n type: \"array\",\n prefixItems: Array.from({ length: s.length }, () => ({ type: \"number\" })),\n minItems: s.length,\n maxItems: s.length\n };\n case \"numberObject\":\n return {\n type: \"object\",\n properties: Object.fromEntries(s.fields.map((f) => [f, { type: \"number\" }])),\n required: [...s.fields]\n };\n case \"numberVector\":\n return {\n type: \"array\",\n items: { type: \"number\" },\n ...s.length ? { minItems: s.length, maxItems: s.length } : {}\n };\n case \"bitstring\":\n return {\n type: \"string\",\n pattern: \"^[01]*$\",\n ...s.length ? s.exact ? { minLength: s.length, maxLength: s.length } : { maxLength: s.length } : {}\n };\n case \"byteString\":\n return { type: \"string\", ...s.length ? { maxLength: s.length } : {} };\n }\n }\n const set = sets.find((x) => x.column === c.name);\n if (set) {\n if (comparisonWire(c) === \"numeric-string\") {\n return { type: \"string\", pattern: canonicalSetPattern(set.values, c.dbType === \"BIGINT\") };\n }\n return {\n enum: set.values.map(\n (v) => set.kind === \"string\" || c.tsType === \"bigint\" ? v : Number(v)\n )\n };\n }\n if (c.enumValues && c.enumValues.length) {\n const ref2 = enumRef?.(c.enumValues);\n return ref2 ? { $ref: ref2 } : { enum: [...c.enumValues] };\n }\n const mine = c.arrayDimensions ? [] : checks.filter((k) => k.column === c.name);\n const eq = mine.find((k) => k.operator === \"=\");\n if (eq) {\n if (comparisonWire(c) === \"numeric-string\") {\n return { type: \"string\", pattern: canonicalSetPattern([eq.value], c.dbType === \"BIGINT\") };\n }\n const only = eq.kind === \"string\" || c.tsType === \"bigint\" ? eq.value : Number(eq.value);\n return target === \"openapi-3.0\" ? { enum: [only] } : { const: only };\n }\n switch (c.tsType) {\n case \"string\": {\n const out = { type: \"string\" };\n if (c.format === \"uuid\") out.format = UUID_FORMAT;\n else if (c.format && COLUMN_FORMATS[c.format]) out.pattern = COLUMN_FORMATS[c.format];\n if (c.maxLength !== void 0) out.maxLength = c.maxLength;\n applyByteCap(out, c, lengths);\n applyLengths(out, c, lengths);\n return out;\n }\n case \"number\": {\n const out = { type: isIntegerColumn(c) ? \"integer\" : \"number\" };\n if (!c.arrayDimensions) applyNumericBounds(out, c, checks, target);\n return out;\n }\n case \"bigint\":\n return {\n type: \"string\",\n pattern: typeof c.min === \"string\" && !c.min.startsWith(\"-\") ? \"^\\\\d+$\" : \"^-?\\\\d+$\"\n };\n case \"boolean\":\n return { type: \"boolean\" };\n case \"Date\":\n return { type: \"string\", format: \"date-time\" };\n case \"Uint8Array\":\n return base64(target);\n default:\n return {};\n }\n}\nfunction applyByteCap(out, c, lengths) {\n const budget = byteBudget(c, lengths);\n if (budget === void 0) return;\n out.maxLength = Math.min(Number(out.maxLength ?? Infinity), budget);\n out.description = BYTE_BUDGET_NOTE(budget);\n}\nfunction ceilingOf(k) {\n if (k.operator === \"<=\" || k.operator === \"=\") return Number(k.value);\n if (k.operator === \"<\") return Number(k.value) - 1;\n return void 0;\n}\nfunction byteBudget(c, lengths) {\n const bounds = [\n ...c.maxBytes ? [c.maxBytes] : [],\n ...lengths.filter((k) => k.column === c.name && k.unit === \"bytes\").map(ceilingOf).filter((n) => n !== void 0)\n ];\n return bounds.length ? Math.min(...bounds) : void 0;\n}\nfunction applyLengths(out, c, lengths) {\n for (const k of lengths.filter((x) => x.column === c.name && x.unit !== \"bytes\")) {\n const n = Number(k.value);\n if (k.operator === \">=\") out.minLength = Math.max(Number(out.minLength ?? 0), n);\n else if (k.operator === \">\") out.minLength = Math.max(Number(out.minLength ?? 0), n + 1);\n else if (k.operator === \"<=\") out.maxLength = Math.min(Number(out.maxLength ?? Infinity), n);\n else if (k.operator === \"<\") out.maxLength = Math.min(Number(out.maxLength ?? Infinity), n - 1);\n else if (k.operator === \"=\") {\n out.minLength = n;\n out.maxLength = n;\n }\n }\n}\nfunction applyBinaryLengths(out, c, lengths) {\n const budget = byteBudget(c, lengths);\n if (budget === void 0) return;\n out.maxLength = 4 * Math.ceil(budget / 3);\n out.description = `At most ${budget} bytes, which JSON Schema has no keyword for. The value travels as base64, and maxLength counts the characters of that encoding: it refuses nothing the column accepts, and a value one or two bytes over the limit encodes to the same number of characters as one inside it.`;\n}\nvar BYTE_BUDGET_NOTE = (n) => `At most ${n} bytes of UTF-8, which JSON Schema has no keyword for. maxLength counts characters: it refuses nothing the column accepts, and a string of multi-byte characters can satisfy it and still be too long for the column.`;\nfunction applyNumericBounds(out, c, checks, target) {\n let min = c.min !== void 0 ? { value: Number(c.min), exclusive: false } : void 0;\n let max = c.max !== void 0 ? { value: Number(c.max), exclusive: false } : void 0;\n for (const k of checks.filter((x) => x.column === c.name && x.kind === \"number\")) {\n if (k.operator === \">=\") min = { value: Number(k.value), exclusive: false };\n else if (k.operator === \">\") min = { value: Number(k.value), exclusive: true };\n else if (k.operator === \"<=\") max = { value: Number(k.value), exclusive: false };\n else if (k.operator === \"<\") max = { value: Number(k.value), exclusive: true };\n }\n const old = target === \"openapi-3.0\";\n if (min) {\n if (min.exclusive && !old) out.exclusiveMinimum = min.value;\n else {\n out.minimum = min.value;\n if (min.exclusive) out.exclusiveMinimum = true;\n }\n }\n if (max) {\n if (max.exclusive && !old) out.exclusiveMaximum = max.value;\n else {\n out.maximum = max.value;\n if (max.exclusive) out.exclusiveMaximum = true;\n }\n }\n}\nfunction cardinalityBounds(c, cardinalities) {\n if (!c.arrayDimensions) return {};\n const out = {};\n for (const k of cardinalities.filter((x) => x.column === c.name)) {\n const n = Number(k.value);\n if (k.operator === \">=\") out.minItems = n;\n else if (k.operator === \">\") out.minItems = n + 1;\n else if (k.operator === \"<=\") out.maxItems = n;\n else if (k.operator === \"<\") out.maxItems = n - 1;\n else if (k.operator === \"=\") {\n out.minItems = n;\n out.maxItems = n;\n }\n }\n return out;\n}\nfunction makeNullable(s, target) {\n if (target === \"openapi-3.0\") return { ...s, nullable: true };\n if (\"$ref\" in s) return { anyOf: [s, { type: \"null\" }] };\n if (s.type === void 0) {\n if (Array.isArray(s.enum)) return { ...s, enum: [...s.enum, null] };\n if (\"const\" in s) {\n const { const: k, ...rest } = s;\n return { ...rest, enum: [k, null] };\n }\n return s;\n }\n return { ...s, type: [s.type, \"null\"] };\n}\nfunction columnSchema(c, mode, target, checks, sets, lengths, cardinalities, applyDefault, enumRef) {\n const wantsDefault = mode === \"insert\" && applyDefault && c.defaultValue !== void 0;\n const refBlockedBy30 = target === \"openapi-3.0\" && !c.arrayDimensions && (c.nullable || wantsDefault);\n let s = baseSchema(c, mode, target, checks, sets, lengths, refBlockedBy30 ? void 0 : enumRef);\n const dims = c.arrayDimensions ?? 0;\n for (let i = 0; i < dims; i++) {\n s = { type: \"array\", items: s, ...i === dims - 1 ? cardinalityBounds(c, cardinalities) : {} };\n }\n if (c.nullable) s = makeNullable(s, target);\n if (mode === \"insert\" && applyDefault && c.defaultValue !== void 0) {\n s = { ...s, default: c.defaultValue };\n }\n return s;\n}\nfunction rowDescription(rows, cols) {\n const present = new Set(cols.map((c) => c.name));\n const applicable = rows.filter((r) => present.has(r.left) && present.has(r.right));\n if (!applicable.length) return void 0;\n const list = applicable.map((r) => `${r.name ? `${r.name}: ` : \"\"}${r.left} ${r.operator} ${r.right}`).join(\"; \");\n return `Row constraints not expressible in JSON Schema: ${list}`;\n}\nfunction tableSchema(table, cols, mode, target, applyDefaults, parsed, enums, localDefs) {\n const properties = {};\n const required = [];\n for (const c of cols) {\n properties[c.name] = columnSchema(\n c,\n mode,\n target,\n parsed.checks,\n parsed.sets,\n parsed.lengths,\n parsed.cardinalities,\n applyDefaults,\n enums?.resolve\n );\n const suppliedOnInsert = c.hasDefault || applyDefaults && c.defaultValue !== void 0 || c.isGenerated;\n const optional = mode === \"update\" || mode === \"insert\" && suppliedOnInsert;\n if (!optional) required.push(c.name);\n }\n const desc = rowDescription(parsed.rows, cols);\n const defs = localDefs ? enums?.definitions() ?? {} : {};\n return {\n ...target === \"draft-2020-12\" ? { $schema: DRAFT } : {},\n $id: `${table.tsName}.${mode}`,\n title: `${mode} ${table.tsName}`,\n ...desc ? { description: desc } : {},\n type: \"object\",\n properties,\n ...required.length ? { required } : {},\n additionalProperties: false,\n ...Object.keys(defs).length ? { $defs: defs } : {}\n };\n}\nfunction collect(table) {\n const parsed = (table.checks ?? []).map((k) => parseCheck(k.expression, k.name));\n const { checks, sets } = applyWirePolicy(\n table.columns,\n parsed.flatMap((p) => p.ok ? p.checks : []),\n parsed.flatMap((p) => p.ok ? p.sets ?? [] : [])\n );\n return {\n checks,\n sets,\n rows: parsed.flatMap((p) => p.ok ? p.rows ?? [] : []),\n lengths: parsed.flatMap((p) => p.ok ? p.lengths ?? [] : []),\n cardinalities: parsed.flatMap((p) => p.ok ? p.cardinalities ?? [] : [])\n };\n}\nfunction tableSchemas(table, opts = {}) {\n const target = opts.target ?? \"draft-2020-12\";\n const parsed = collect(table);\n const localDefs = target === \"draft-2020-12\";\n const build2 = (cols, mode) => {\n const plan = localDefs ? planSharedEnums(cols, opts.enums, (key) => `#/$defs/${key}`) : void 0;\n return tableSchema(table, cols, mode, target, !!opts.applyDefaults, parsed, plan, localDefs);\n };\n return {\n insert: build2(insertColumns(table), \"insert\"),\n update: build2(updateColumns(table), \"update\"),\n select: build2(selectColumns(table), \"select\")\n };\n}\nfunction tableSchemasWith(table, target, applyDefaults, plan, modes = MODES) {\n const parsed = collect(table);\n const columns = {\n insert: () => insertColumns(table),\n update: () => updateColumns(table),\n select: () => selectColumns(table)\n };\n const out = {};\n for (const mode of modes) {\n out[mode] = tableSchema(\n table,\n columns[mode](),\n mode,\n target,\n applyDefaults,\n parsed,\n plan,\n false\n );\n }\n return out;\n}\nfunction componentsDocument(tables, opts = {}) {\n const target = opts.target ?? \"draft-2020-12\";\n const schemas = {};\n for (const table of tables) {\n const built = tableSchemasWith(table, target, !!opts.applyDefaults, void 0);\n for (const mode of MODES) {\n const { $schema: _dialect, $id: _id, ...rest } = built[mode];\n schemas[componentSchemaName(table, mode)] = rest;\n }\n }\n return { schemas };\n}\nvar MODES = [\"insert\", \"update\", \"select\"];\nvar componentSchemaName = (table, mode) => `${table.tsName}${mode[0].toUpperCase()}${mode.slice(1)}`;\nfunction documentSchemas(tables, opts) {\n const plan = planSharedEnums(\n tables.flatMap((t) => t.columns),\n opts.enums,\n (key) => `#/components/schemas/${key}`,\n opts.reserved\n );\n const built = /* @__PURE__ */ new Map();\n for (const table of tables) {\n const all = tableSchemasWith(table, opts.target, opts.applyDefaults, plan, opts.modes(table));\n built.set(table, all);\n }\n return { built, definitions: () => plan?.definitions() ?? {} };\n}\n\n// src/openapi.ts\nvar ERROR_SCHEMA = \"Error\";\nvar componentName = componentSchemaName;\nvar ref = (name) => ({ $ref: `#/components/schemas/${name}` });\nvar pascal = (s) => s.charAt(0).toUpperCase() + s.slice(1);\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 modesFor = (table, key) => [\n ...table.readOnly ? [] : [\"insert\"],\n ...table.readOnly || !key ? [] : [\"update\"],\n \"select\"\n];\nvar resourceSegment = (table) => table.schema ? `${encodeURIComponent(table.schema)}/${encodeURIComponent(table.name)}` : encodeURIComponent(table.name);\nfunction foreignKeysOf(table) {\n if (table.foreignKeys?.length) return table.foreignKeys;\n return table.columns.filter((c) => c.references).map((c) => ({\n columns: [c.name],\n foreignTable: c.references.table,\n ...c.references.schema ? { foreignSchema: c.references.schema } : {},\n foreignColumns: [c.references.column]\n }));\n}\nvar jsonBody = (schema) => ({ content: { \"application/json\": { schema } } });\nfunction build(tables, opts) {\n const target = opts.target ?? \"draft-2020-12\";\n const schemaTarget = target === \"openapi-3.0\" ? \"openapi-3.0\" : \"openapi-3.1\";\n const failure = String(opts.validationStatus ?? 400);\n const paths = {};\n const schemas = {};\n const tags = [];\n const operationIds = /* @__PURE__ */ new Map();\n const owner = /* @__PURE__ */ new Map();\n const claim = (path, by, label) => {\n const taken = owner.get(path);\n if (taken !== void 0 && taken.by !== by) {\n throw new Error(\n `@drzl/generator-json-schema: the OpenAPI path \"${path}\" is claimed twice: by table \"${taken.label}\" (exported as ${taken.by}) and by table \"${label}\" (exported as ${by}). A path names one resource, so one of the two has to be left out of this generator with the config's \"exclude\" list.`\n );\n }\n owner.set(path, { by, label });\n };\n const operation = (id, table, rest) => {\n const clash = operationIds.get(id);\n if (clash !== void 0) {\n throw new Error(\n `@drzl/generator-json-schema: the operationId \"${id}\" would be emitted for both \"${clash}\" and \"${qualifiedTableName(table)}\". An operationId is the method name a client generator derives, and the specification requires it to be unique across the document.`\n );\n }\n operationIds.set(id, qualifiedTableName(table));\n return { operationId: id, tags: [qualifiedTableName(table)], ...rest };\n };\n const keys = new Map(tables.map((t) => [t, keyColumns(t)]));\n const carried = new Map(tables.map((t) => [t, modesFor(t, keys.get(t))]));\n const reserved = /* @__PURE__ */ new Set([\n ERROR_SCHEMA,\n ...tables.flatMap((t) => carried.get(t).map((m) => componentName(t, m)))\n ]);\n const shared = documentSchemas(tables, {\n target: schemaTarget,\n applyDefaults: !!opts.applyDefaults,\n reserved,\n modes: (t) => carried.get(t),\n ...opts.enums ? { enums: opts.enums } : {}\n });\n const built = tables.map((table) => ({\n table,\n key: keys.get(table),\n segment: resourceSegment(table),\n schemas: shared.built.get(table)\n }));\n for (const { table, key, segment, schemas: built3 } of built) {\n for (const mode of carried.get(table)) {\n const { $schema: _dialect, $id: _id, ...rest } = built3[mode];\n schemas[componentName(table, mode)] = rest;\n }\n const notes = [];\n if (!key) notes.push(\"It has no primary key, so no path addresses a single row.\");\n if (table.readOnly) {\n notes.push(\"It refuses every write, so only reads are described.\");\n }\n tags.push({\n name: qualifiedTableName(table),\n description: [`Table \"${qualifiedTableName(table)}\".`, ...notes].join(\" \")\n });\n const T = pascal(table.tsName);\n const select = ref(componentName(table, \"select\"));\n const validationFailed = {\n description: \"The request does not match the schema for this operation.\",\n ...jsonBody(ref(ERROR_SCHEMA))\n };\n const collidable = [\n ...table.primaryKey ? [`primary key (${table.primaryKey.columns.join(\", \")})`] : [],\n ...table.unique.map((u) => `${u.name ? `${u.name} ` : \"\"}(${u.columns.join(\", \")})`)\n ];\n const conflict = (constraints) => ({\n description: `The row collides with an existing one on ${constraints.join(\"; \")}.`,\n ...jsonBody(ref(ERROR_SCHEMA))\n });\n const collection = `/${segment}`;\n claim(collection, table.tsName, qualifiedTableName(table));\n const item = {\n get: operation(`list${T}`, table, {\n summary: `List every ${table.name} row.`,\n // No pagination parameters. Whether the server implements a limit, an offset or a cursor is\n // not something a Drizzle schema states, and a declared parameter nothing honours is worse\n // than an undeclared one.\n responses: {\n \"200\": {\n description: `Every ${table.name} row.`,\n ...jsonBody({ type: \"array\", items: select })\n }\n }\n })\n };\n if (!table.readOnly) {\n item.post = operation(`create${T}`, table, {\n summary: `Create a ${table.name} row.`,\n requestBody: { required: true, ...jsonBody(ref(componentName(table, \"insert\"))) },\n responses: {\n \"201\": { description: `The ${table.name} row that was created.`, ...jsonBody(select) },\n [failure]: validationFailed,\n ...collidable.length ? { \"409\": conflict(collidable) } : {}\n }\n });\n }\n paths[collection] = item;\n if (!key) continue;\n const itemPath = `${collection}/${key.map((c) => `{${c.name}}`).join(\"/\")}`;\n claim(itemPath, table.tsName, qualifiedTableName(table));\n const parameters = key.map((c) => ({\n name: c.name,\n in: \"path\",\n required: true,\n description: `${c.name}, from the primary key of ${table.name}.`,\n // The column's own schema rather than a string, so an integer key is declared as one and a\n // uuid key carries its format. This is the whole point of reading the real key.\n schema: built3.select.properties[c.name] ?? {}\n }));\n const missing = {\n description: `No ${table.name} row has that ${key.map((c) => c.name).join(\" and \")}.`,\n ...jsonBody(ref(ERROR_SCHEMA))\n };\n const byId = {\n parameters,\n get: operation(`get${T}`, table, {\n summary: `Read one ${table.name} row.`,\n responses: {\n \"200\": { description: `The requested ${table.name} row.`, ...jsonBody(select) },\n [failure]: validationFailed,\n \"404\": missing\n }\n })\n };\n if (!table.readOnly) {\n byId.patch = operation(`update${T}`, table, {\n summary: `Patch one ${table.name} row.`,\n requestBody: { required: true, ...jsonBody(ref(componentName(table, \"update\"))) },\n responses: {\n \"200\": { description: `The ${table.name} row after the patch.`, ...jsonBody(select) },\n [failure]: validationFailed,\n \"404\": missing,\n // The primary key is not in the update schema, so a patch cannot collide on it. Only a\n // unique constraint over other columns can.\n ...table.unique.length ? {\n \"409\": conflict(\n table.unique.map((u) => `${u.name ? `${u.name} ` : \"\"}(${u.columns.join(\", \")})`)\n )\n } : {}\n }\n });\n byId.delete = operation(`delete${T}`, table, {\n summary: `Delete one ${table.name} row.`,\n responses: {\n // No body. Handing back the deleted row is the alternative and it is not a true statement\n // on every dialect DRZL supports: RETURNING is Postgres and SQLite, and MySQL has no such\n // clause, so an implementation there has nothing to send.\n \"204\": { description: `The ${table.name} row was deleted. No content is returned.` },\n [failure]: validationFailed,\n \"404\": missing\n }\n });\n }\n paths[itemPath] = byId;\n if (!opts.includeRelations) continue;\n for (const child of built) {\n if (child.table === table) continue;\n const matching = foreignKeysOf(child.table).filter(\n (fk) => (\n // Qualified on both sides. On the bare name a key pointing at `reporting.users` also\n // answered for `public.users`, so the child was hung under a parent in another schema.\n qualifiedForeignTable(fk) === qualifiedTableName(table) && fk.foreignColumns.length === key.length && fk.foreignColumns.every((c, i) => c === key[i].name)\n )\n );\n if (matching.length !== 1) continue;\n const subPath = `${itemPath}/${child.segment}`;\n claim(\n subPath,\n `${table.tsName} -> ${child.table.tsName}`,\n `${qualifiedTableName(table)} -> ${qualifiedTableName(child.table)}`\n );\n paths[subPath] = {\n parameters,\n get: operation(`list${T}${pascal(child.table.tsName)}`, child.table, {\n summary: `List the ${child.table.name} rows belonging to one ${table.name} row.`,\n responses: {\n \"200\": {\n description: `The ${child.table.name} rows whose ${matching[0].columns.join(\", \")} names this ${table.name} row.`,\n ...jsonBody({ type: \"array\", items: ref(componentName(child.table, \"select\")) })\n },\n [failure]: validationFailed,\n \"404\": missing\n }\n })\n };\n }\n }\n return { paths, schemas: { ...schemas, ...shared.definitions() }, tags };\n}\nvar errorSchema = () => ({\n title: \"error\",\n description: \"What an operation returns when it does not return the row.\",\n type: \"object\",\n properties: {\n message: { type: \"string\" },\n code: { type: \"string\" }\n },\n required: [\"message\"],\n additionalProperties: true\n});\nfunction openApiDocument(tables, opts = {}) {\n const target = opts.target ?? \"draft-2020-12\";\n const { paths, schemas, tags } = build(tables, opts);\n if (ERROR_SCHEMA in schemas) {\n throw new Error(\n `@drzl/generator-json-schema: a table produced the component schema name \"${ERROR_SCHEMA}\", which the document already uses for its error responses.`\n );\n }\n return {\n openapi: target === \"openapi-3.0\" ? \"3.0.3\" : \"3.1.1\",\n info: {\n title: opts.info?.title ?? \"API\",\n version: opts.info?.version ?? \"0.0.0\",\n description: opts.info?.description ?? \"Generated by DRZL from a Drizzle schema. Paths, request bodies and response bodies are derived from the schema alone; nothing here has been checked against a running server.\"\n },\n ...opts.servers?.length ? { servers: opts.servers } : {},\n paths,\n components: { schemas: { ...schemas, [ERROR_SCHEMA]: errorSchema() } },\n tags\n };\n}\n\n// src/index.ts\nvar DEFAULT_FILE_SUFFIX = \".schema.ts\";\nfunction renderTableModule(table, affix, target, applyDefaults, enums) {\n const T = table.tsName;\n const schemas = tableSchemas(table, { target, applyDefaults, ...enums ? { enums } : {} });\n const decl = (mode) => `export const ${schemaName(mode, T, affix)} = ${JSON.stringify(schemas[mode], null, 2)} as const;\n\nexport type ${typeName(mode, T, affix)} = typeof ${schemaName(mode, T, affix)};`;\n return [decl(\"insert\"), decl(\"update\"), decl(\"select\")].join(\"\\n\\n\") + \"\\n\";\n}\nfunction resolveDocument(opt) {\n if (!opt) return null;\n const o = opt === true ? {} : opt;\n if (o.enabled === false) return null;\n return { ...o, format: o.format ?? \"ts\" };\n}\nvar JsonSchemaGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n this.library = \"json-schema\";\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.outDir);\n const files = [];\n await fs.mkdir(out, { recursive: true });\n const affix = resolveAffix(opts);\n const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;\n const target = opts.target ?? \"draft-2020-12\";\n const document = resolveDocument(opts.document);\n for (const table of this.analysis.tables) {\n const filePath = path.join(out, moduleFileName(table.tsName, fileSuffix));\n const code = renderTableModule(\n table,\n affix,\n target,\n !!opts.applyDefaults,\n opts.sharedEnums ? this.analysis.enums : void 0\n );\n const formatted = await formatCode(\n buildHeader(opts.outputHeader) + code,\n filePath,\n opts.format\n );\n await fs.writeFile(filePath, formatted, \"utf8\");\n files.push(filePath);\n }\n if (opts.components) {\n const doc = componentsDocument(this.analysis.tables, {\n target,\n applyDefaults: !!opts.applyDefaults\n });\n const componentsPath = path.join(out, \"components.ts\");\n const code = `export const components = ${JSON.stringify(doc, null, 2)} as const;\n`;\n await fs.writeFile(\n componentsPath,\n await formatCode(buildHeader(opts.outputHeader) + code, componentsPath, opts.format),\n \"utf8\"\n );\n files.push(componentsPath);\n }\n if (document) {\n const built = openApiDocument(this.analysis.tables, {\n target,\n applyDefaults: !!opts.applyDefaults,\n includeRelations: !!opts.includeRelations,\n enums: this.analysis.enums,\n info: document.info,\n servers: document.servers,\n validationStatus: document.validationStatus\n });\n const body = JSON.stringify(built, null, 2);\n if (document.format !== \"json\") {\n const tsPath = path.join(out, \"openapi.ts\");\n const code = `export const openapi = ${body} as const;\n`;\n await fs.writeFile(\n tsPath,\n await formatCode(buildHeader(opts.outputHeader) + code, tsPath, opts.format),\n \"utf8\"\n );\n files.push(tsPath);\n }\n if (document.format !== \"ts\") {\n const jsonPath = path.join(out, \"openapi.json\");\n await fs.writeFile(jsonPath, body + \"\\n\", \"utf8\");\n files.push(jsonPath);\n }\n }\n const ext = opts.importExtension === \"none\" ? \"\" : \".js\";\n const indexPath = path.join(out, \"index.ts\");\n const index = this.analysis.tables.map(\n (t) => `export * from '${moduleSpecifier(t.tsName, fileSuffix, opts.importExtension)}';`\n ).concat(opts.components ? [`export * from './components${ext}';`] : []).concat(document && document.format !== \"json\" ? [`export * from './openapi${ext}';`] : []).join(\"\\n\") + \"\\n\";\n const indexFormatted = await formatCode(\n buildHeader(opts.outputHeader) + index,\n indexPath,\n opts.format\n );\n await fs.writeFile(indexPath, indexFormatted, \"utf8\");\n files.push(indexPath);\n return files;\n }\n renderTable(table, opts) {\n return renderTableModule(\n table,\n resolveAffix(opts),\n opts?.target ?? \"draft-2020-12\",\n !!opts?.applyDefaults,\n opts?.sharedEnums ? this.analysis.enums : void 0\n );\n }\n};\nvar index_default = JsonSchemaGenerator;\nfunction buildHeader(h) {\n if (h?.enabled === false) return \"\";\n const text = h?.text ?? \"// Generated by DRZL. Do not edit by hand.\";\n return `${text}\n\n`;\n}\nexport {\n DRAFT,\n JsonSchemaGenerator,\n allColumns,\n componentSchemaName,\n componentsDocument,\n index_default as default,\n documentSchemas,\n enumKey,\n openApiDocument,\n planSharedEnums,\n tableSchemas\n};\n"],"mappings":"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","names":[]}
@@ -1,350 +0,0 @@
1
- import {
2
- tableSchemas
3
- } from "./chunk-KKPDOZOD.js";
4
-
5
- // ../generator-fastify/dist/index.js
6
- import { fileWriter } from "@drzl/validation-core";
7
- import { formatCode, importSpecifier, selectColumns } from "@drzl/validation-core";
8
- var APP_MODULE = "index";
9
- var lit = (v) => /['\\]/.test(v) ? JSON.stringify(v) : `'${v}'`;
10
- var NUMERIC_SEGMENT_PATTERN = "^-?\\d+(\\.\\d+)?$";
11
- var BIGINT_SEGMENT_PATTERN = "^-?\\d+$";
12
- var NOT_FOUND_SCHEMA = "{ type: 'object', properties: { message: { type: 'string' } }, required: ['message'], additionalProperties: false }";
13
- var cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);
14
- var isIdent = (s) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(s);
15
- function keyColumns(table) {
16
- const names = table.primaryKey?.columns ?? [];
17
- if (!names.length) return null;
18
- const cols = names.map((n) => table.columns.find((c) => c.name === n));
19
- if (cols.some((c) => !c)) return null;
20
- return cols;
21
- }
22
- function segmentSchema(column) {
23
- if (column.enumValues && column.enumValues.length) return { enum: [...column.enumValues] };
24
- switch (column.tsType) {
25
- case "number":
26
- return { type: "string", pattern: NUMERIC_SEGMENT_PATTERN };
27
- case "bigint":
28
- return { type: "string", pattern: BIGINT_SEGMENT_PATTERN };
29
- case "Date":
30
- return { type: "string", format: "date-time" };
31
- default:
32
- return { type: "string" };
33
- }
34
- }
35
- function paramsSchema(cols) {
36
- return {
37
- type: "object",
38
- properties: Object.fromEntries(cols.map((c) => [c.name, segmentSchema(c)])),
39
- required: cols.map((c) => c.name),
40
- additionalProperties: false
41
- };
42
- }
43
- function adaptForFastify(schema) {
44
- const { $schema: _dialect, $id: _id, ...rest } = walk(schema);
45
- return rest;
46
- }
47
- function walk(value) {
48
- if (Array.isArray(value)) return value.map(walk);
49
- if (value && typeof value === "object") {
50
- const out = {};
51
- for (const [k, v] of Object.entries(value)) {
52
- if (k === "prefixItems") continue;
53
- out[k] = walk(v);
54
- }
55
- const prefix = value.prefixItems;
56
- if (Array.isArray(prefix) && prefix.length) out.items = walk(prefix[0]);
57
- return out;
58
- }
59
- return value;
60
- }
61
- function rowFieldType(column) {
62
- if (column.enumValues && column.enumValues.length) {
63
- return column.enumValues.map((v) => `'${v.replace(/'/g, "\\'")}'`).join(" | ");
64
- }
65
- const s = column.shape;
66
- if (s) {
67
- switch (s.kind) {
68
- case "tuple":
69
- return `[${Array.from({ length: s.length }, () => "number").join(", ")}]`;
70
- case "numberObject":
71
- return `{ ${s.fields.map((f) => `${f}: number`).join("; ")} }`;
72
- case "numberVector":
73
- return "number[]";
74
- default:
75
- return "unknown";
76
- }
77
- }
78
- switch (column.tsType) {
79
- case "number":
80
- return "number";
81
- case "string":
82
- return "string";
83
- case "boolean":
84
- return "boolean";
85
- case "Date":
86
- return "Date";
87
- case "bigint":
88
- return "bigint";
89
- default:
90
- return "unknown";
91
- }
92
- }
93
- function objectKey(name) {
94
- return isIdent(name) ? name : JSON.stringify(name);
95
- }
96
- function toCase(s, c) {
97
- if (!c) return s;
98
- const parts = s.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]/g, " ").split(/\s+/);
99
- if (c === "camel") {
100
- return parts.map(
101
- (p, i) => i === 0 ? p.toLowerCase() : p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()
102
- ).join("");
103
- }
104
- if (c === "kebab") return parts.map((p) => p.toLowerCase()).join("-");
105
- if (c === "snake") return parts.map((p) => p.toLowerCase()).join("_");
106
- return s;
107
- }
108
- function routesExportName(table, naming) {
109
- const base = `${table.tsName}${naming?.routerSuffix ?? "Routes"}`;
110
- const c = naming?.procedureCase;
111
- return toCase(base, c === "kebab" ? "camel" : c);
112
- }
113
- function mountPath(table, naming) {
114
- return `/${toCase(table.tsName, naming?.procedureCase)}`;
115
- }
116
- var FastifyGenerator = class {
117
- constructor(analysis) {
118
- this.analysis = analysis;
119
- }
120
- async generate(opts) {
121
- const fs = fileWriter(opts.fileSink);
122
- const path = await import("path");
123
- const out = path.resolve(process.cwd(), opts.outputDir);
124
- const ctx = { out };
125
- await fs.mkdir(out, { recursive: true });
126
- const files = [];
127
- const write = async (filePath, content) => {
128
- const formatted = await formatCode(
129
- buildHeader(opts.outputHeader) + content,
130
- filePath,
131
- opts.format
132
- );
133
- await fs.writeFile(filePath, formatted, "utf8");
134
- files.push(filePath);
135
- };
136
- const barrelPath = path.join(out, `${APP_MODULE}.ts`);
137
- const modules = [];
138
- const total = this.analysis.tables.length;
139
- let index = 0;
140
- for (const table of this.analysis.tables) {
141
- const base = `${table.tsName}${opts.naming?.routerSuffix ?? ""}`;
142
- const filePath = path.join(out, `${toCase(base, opts.naming?.procedureCase)}.ts`);
143
- if (filePath === barrelPath) {
144
- throw new Error(
145
- `@drzl/generator-fastify: the routes for table "${table.name}" would be written to ${filePath}, which is the barrel this generator also writes. Set naming.routerSuffix to move it out of the way.`
146
- );
147
- }
148
- await write(filePath, renderRoutes(table, opts));
149
- modules.push({ table, filePath, exportName: routesExportName(table, opts.naming) });
150
- index++;
151
- opts.onProgress?.({ index, total, table: table.name, filePath });
152
- }
153
- await write(barrelPath, renderBarrel(modules, ctx, path, opts));
154
- return { files };
155
- }
156
- };
157
- var index_default = FastifyGenerator;
158
- function buildHeader(h) {
159
- if (h && h.enabled === false) return "";
160
- const text = h?.text?.trim();
161
- const lines = text ? text.split(/\r?\n/).map((l) => `// ${l}`) : [
162
- "// Generated by DRZL (@drzl/*)",
163
- "// Generated output is granted to you under your project's license.",
164
- "// You may use, copy, modify, and distribute without attribution."
165
- ];
166
- return lines.join("\n") + "\n\n";
167
- }
168
- function renderRoutes(table, opts) {
169
- const insertName = `Insert${table.tsName}Schema`;
170
- const updateName = `Update${table.tsName}Schema`;
171
- const selectName = `Select${table.tsName}Schema`;
172
- const paramsName = `${cap(table.tsName)}ParamsSchema`;
173
- const rowType = `Select${table.tsName}Row`;
174
- const writable = !table.readOnly;
175
- const key = keyColumns(table);
176
- const routes = [];
177
- const notImplemented = (what) => `throw new Error('Not implemented: ${what} ${table.tsName}.');`;
178
- const paramHint = `// Fastify has already validated req.params against ${paramsName}; numeric key segments stay strings here.`;
179
- routes.push({
180
- name: "list",
181
- method: "get",
182
- path: "/",
183
- schema: [`response: { 200: { type: 'array', items: ${selectName} } }`],
184
- replyType: `${rowType}[]`,
185
- // The stub states its contract twice over: the annotated local is what a reader sees, and the
186
- // Reply generic is what Fastify's own types hold the handler to. The response schema is what
187
- // the serializer runs; nothing infers a client from any of them, which the docs say plainly.
188
- body: [`const rows: ${rowType}[] = [];`, "return rows;"]
189
- });
190
- if (key) {
191
- const keyPath = "/" + key.map((c) => `:${c.name}`).join("/");
192
- routes.push({
193
- name: "byId",
194
- method: "get",
195
- path: keyPath,
196
- schema: [
197
- `params: ${paramsName}`,
198
- `response: { 200: ${selectName}, 404: ${NOT_FOUND_SCHEMA} }`
199
- ],
200
- replyType: `${rowType} | { message: string }`,
201
- body: [
202
- paramHint,
203
- `const row: ${rowType} | null = null;`,
204
- "if (row !== null) return row;",
205
- `return reply.code(404).send({ message: ${lit(`${table.tsName} row not found`)} });`
206
- ]
207
- });
208
- if (writable) {
209
- routes.push({
210
- name: "update",
211
- method: "patch",
212
- path: keyPath,
213
- schema: [
214
- `params: ${paramsName}`,
215
- `body: ${updateName}`,
216
- `response: { 200: ${selectName} }`
217
- ],
218
- replyType: rowType,
219
- body: [notImplemented("update")]
220
- });
221
- routes.push({
222
- name: "delete",
223
- method: "delete",
224
- path: keyPath,
225
- schema: [`params: ${paramsName}`, `response: { 200: { type: 'boolean' } }`],
226
- replyType: "boolean",
227
- body: [paramHint, "return true;"]
228
- });
229
- }
230
- }
231
- if (writable) {
232
- routes.push({
233
- name: "create",
234
- method: "post",
235
- path: "/",
236
- schema: [`body: ${insertName}`, `response: { 200: ${selectName} }`],
237
- replyType: rowType,
238
- body: [notImplemented("create")]
239
- });
240
- }
241
- if (opts.includeRelations) {
242
- routes.push(...relationRoutes(table, rowType, selectName, opts));
243
- }
244
- const order = ["list", "byId", "create", "update", "delete"];
245
- const rank = (n) => order.indexOf(n) === -1 ? order.length : order.indexOf(n);
246
- routes.sort((a, b) => rank(a.name) - rank(b.name));
247
- const exportName = routesExportName(table, opts.naming);
248
- const statements = routes.map((r) => {
249
- const reads = (what) => r.body.some((line) => !line.startsWith("//") && what.test(line));
250
- const params = reads(/\breply\./) ? reads(/\breq\./) ? "(req, reply)" : "(_req, reply)" : reads(/\breq\./) ? "(req)" : "()";
251
- return [
252
- ` app.${r.method}<{ Reply: ${r.replyType} }>(${lit(r.path)}, {`,
253
- ` schema: { ${r.schema.join(", ")} },`,
254
- ` }, async ${params} => {`,
255
- ...r.body.map((line) => ` ${line}`),
256
- ` });`
257
- ].join("\n");
258
- }).join("\n\n");
259
- const plugin = `export const ${exportName}: FastifyPluginAsync = async (app) => {
260
- ${statements}
261
- };
262
- `;
263
- const schemas = tableSchemas(table);
264
- const declared = [];
265
- const emit = (name, schema) => `export const ${name} = ${JSON.stringify(adaptForFastify(schema), null, 2)} as const;`;
266
- if (writable) {
267
- declared.push(emit(insertName, schemas.insert));
268
- declared.push(emit(updateName, schemas.update));
269
- }
270
- declared.push(emit(selectName, schemas.select));
271
- if (key) {
272
- declared.push(emit(paramsName, paramsSchema(key)));
273
- }
274
- const rowFields = selectColumns(table).map((c) => ` ${objectKey(c.name)}: ${rowFieldType(c)}${c.nullable ? " | null" : ""};`).join("\n");
275
- declared.push(`export interface ${rowType} {
276
- ${rowFields}
277
- }`);
278
- const wide = selectColumns(table).filter((c) => rowFieldType(c) === "unknown").map((c) => c.name);
279
- const wideNote = wide.length ? `// No precise type for ${wide.length === 1 ? "this column" : "these columns"}: ${wide.join(", ")}.
280
- // DRZL could not derive one from the schema, so these routes carry it as unknown and its
281
- // schema constrains only what the builder could state.
282
- ` : "";
283
- return `// Generated by @drzl/generator-fastify
284
- // Routes for table: ${table.name}
285
- ${wideNote}import type { FastifyPluginAsync } from 'fastify';
286
-
287
- ${declared.join("\n\n")}
288
-
289
- ${plugin}`;
290
- }
291
- function relationRoutes(table, rowType, selectName, opts) {
292
- const out = [];
293
- const taken = /* @__PURE__ */ new Set();
294
- for (const fk of table.foreignKeys ?? []) {
295
- if (fk.columns.length !== 1) continue;
296
- const colName = fk.columns[0];
297
- const column = table.columns.find((c) => c.name === colName);
298
- if (!column) continue;
299
- const segment = toCase(`by-${colName}`, opts.naming?.procedureCase ?? "kebab");
300
- if (taken.has(segment)) continue;
301
- taken.add(segment);
302
- const params = JSON.stringify(paramsSchema([column]));
303
- out.push({
304
- name: `listBy${cap(colName)}`,
305
- method: "get",
306
- path: `/${segment}/:${colName}`,
307
- schema: [`params: ${params}`, `response: { 200: { type: 'array', items: ${selectName} } }`],
308
- replyType: `${rowType}[]`,
309
- body: [`const rows: ${rowType}[] = [];`, "return rows;"]
310
- });
311
- }
312
- return out;
313
- }
314
- function renderBarrel(modules, ctx, path, opts) {
315
- if (!modules.length) {
316
- return `// Generated by @drzl/generator-fastify
317
- // No tables detected in analysis. Add tables to your schema and regenerate.
318
- import type { FastifyPluginAsync } from 'fastify';
319
-
320
- export const routes: FastifyPluginAsync = async () => {};
321
- `;
322
- }
323
- const entries = modules.map(({ filePath, exportName, table }) => ({
324
- rel: importSpecifier(
325
- "./" + path.relative(ctx.out, filePath).replace(/\\/g, "/"),
326
- opts.importExtension
327
- ),
328
- exportName,
329
- mount: mountPath(table, opts.naming)
330
- }));
331
- const imports = entries.map((e) => `import { ${e.exportName} } from '${e.rel}';`).join("\n");
332
- const registrations = entries.map((e) => ` app.register(${e.exportName}, { prefix: ${lit(e.mount)} });`).join("\n");
333
- const reExports = entries.map((e) => `export * from '${e.rel}';`).join("\n");
334
- return `// Generated by @drzl/generator-fastify
335
- import type { FastifyPluginAsync } from 'fastify';
336
- ${imports}
337
-
338
- export const routes: FastifyPluginAsync = async (app) => {
339
- ${registrations}
340
- };
341
-
342
- ${reExports}
343
- `;
344
- }
345
- export {
346
- APP_MODULE,
347
- FastifyGenerator,
348
- index_default as default
349
- };
350
- //# sourceMappingURL=dist-KQMPKOFK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../generator-fastify/dist/index.js"],"sourcesContent":["// src/index.ts\nimport { fileWriter } from \"@drzl/validation-core\";\nimport { tableSchemas } from \"@drzl/generator-json-schema\";\nimport { formatCode, importSpecifier, selectColumns } from \"@drzl/validation-core\";\nvar APP_MODULE = \"index\";\nvar lit = (v) => /['\\\\]/.test(v) ? JSON.stringify(v) : `'${v}'`;\nvar NUMERIC_SEGMENT_PATTERN = \"^-?\\\\d+(\\\\.\\\\d+)?$\";\nvar BIGINT_SEGMENT_PATTERN = \"^-?\\\\d+$\";\nvar NOT_FOUND_SCHEMA = \"{ type: 'object', properties: { message: { type: 'string' } }, required: ['message'], additionalProperties: false }\";\nvar cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);\nvar isIdent = (s) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(s);\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 segmentSchema(column) {\n if (column.enumValues && column.enumValues.length) return { enum: [...column.enumValues] };\n switch (column.tsType) {\n case \"number\":\n return { type: \"string\", pattern: NUMERIC_SEGMENT_PATTERN };\n case \"bigint\":\n return { type: \"string\", pattern: BIGINT_SEGMENT_PATTERN };\n case \"Date\":\n return { type: \"string\", format: \"date-time\" };\n default:\n return { type: \"string\" };\n }\n}\nfunction paramsSchema(cols) {\n return {\n type: \"object\",\n properties: Object.fromEntries(cols.map((c) => [c.name, segmentSchema(c)])),\n required: cols.map((c) => c.name),\n additionalProperties: false\n };\n}\nfunction adaptForFastify(schema) {\n const { $schema: _dialect, $id: _id, ...rest } = walk(schema);\n return rest;\n}\nfunction walk(value) {\n if (Array.isArray(value)) return value.map(walk);\n if (value && typeof value === \"object\") {\n const out = {};\n for (const [k, v] of Object.entries(value)) {\n if (k === \"prefixItems\") continue;\n out[k] = walk(v);\n }\n const prefix = value.prefixItems;\n if (Array.isArray(prefix) && prefix.length) out.items = walk(prefix[0]);\n return out;\n }\n return value;\n}\nfunction rowFieldType(column) {\n if (column.enumValues && column.enumValues.length) {\n return column.enumValues.map((v) => `'${v.replace(/'/g, \"\\\\'\")}'`).join(\" | \");\n }\n const s = column.shape;\n if (s) {\n switch (s.kind) {\n case \"tuple\":\n return `[${Array.from({ length: s.length }, () => \"number\").join(\", \")}]`;\n case \"numberObject\":\n return `{ ${s.fields.map((f) => `${f}: number`).join(\"; \")} }`;\n case \"numberVector\":\n return \"number[]\";\n default:\n return \"unknown\";\n }\n }\n switch (column.tsType) {\n case \"number\":\n return \"number\";\n case \"string\":\n return \"string\";\n case \"boolean\":\n return \"boolean\";\n case \"Date\":\n return \"Date\";\n case \"bigint\":\n return \"bigint\";\n default:\n return \"unknown\";\n }\n}\nfunction objectKey(name) {\n return isIdent(name) ? name : JSON.stringify(name);\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}\nfunction routesExportName(table, naming) {\n const base = `${table.tsName}${naming?.routerSuffix ?? \"Routes\"}`;\n const c = naming?.procedureCase;\n return toCase(base, c === \"kebab\" ? \"camel\" : c);\n}\nfunction mountPath(table, naming) {\n return `/${toCase(table.tsName, naming?.procedureCase)}`;\n}\nvar FastifyGenerator = 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 = { out };\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 modules = [];\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 === barrelPath) {\n throw new Error(\n `@drzl/generator-fastify: the routes for table \"${table.name}\" would be written to ${filePath}, which is the barrel this generator also writes. Set naming.routerSuffix to move it out of the way.`\n );\n }\n await write(filePath, renderRoutes(table, opts));\n modules.push({ table, filePath, exportName: routesExportName(table, opts.naming) });\n index++;\n opts.onProgress?.({ index, total, table: table.name, filePath });\n }\n await write(barrelPath, renderBarrel(modules, ctx, path, opts));\n return { files };\n }\n};\nvar index_default = FastifyGenerator;\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 renderRoutes(table, opts) {\n const insertName = `Insert${table.tsName}Schema`;\n const updateName = `Update${table.tsName}Schema`;\n const selectName = `Select${table.tsName}Schema`;\n const paramsName = `${cap(table.tsName)}ParamsSchema`;\n const rowType = `Select${table.tsName}Row`;\n const writable = !table.readOnly;\n const key = keyColumns(table);\n const routes = [];\n const notImplemented = (what) => `throw new Error('Not implemented: ${what} ${table.tsName}.');`;\n const paramHint = `// Fastify has already validated req.params against ${paramsName}; numeric key segments stay strings here.`;\n routes.push({\n name: \"list\",\n method: \"get\",\n path: \"/\",\n schema: [`response: { 200: { type: 'array', items: ${selectName} } }`],\n replyType: `${rowType}[]`,\n // The stub states its contract twice over: the annotated local is what a reader sees, and the\n // Reply generic is what Fastify's own types hold the handler to. The response schema is what\n // the serializer runs; nothing infers a client from any of them, which the docs say plainly.\n body: [`const rows: ${rowType}[] = [];`, \"return rows;\"]\n });\n if (key) {\n const keyPath = \"/\" + key.map((c) => `:${c.name}`).join(\"/\");\n routes.push({\n name: \"byId\",\n method: \"get\",\n path: keyPath,\n schema: [\n `params: ${paramsName}`,\n `response: { 200: ${selectName}, 404: ${NOT_FOUND_SCHEMA} }`\n ],\n replyType: `${rowType} | { message: string }`,\n body: [\n paramHint,\n `const row: ${rowType} | null = null;`,\n \"if (row !== null) return row;\",\n `return reply.code(404).send({ message: ${lit(`${table.tsName} row not found`)} });`\n ]\n });\n if (writable) {\n routes.push({\n name: \"update\",\n method: \"patch\",\n path: keyPath,\n schema: [\n `params: ${paramsName}`,\n `body: ${updateName}`,\n `response: { 200: ${selectName} }`\n ],\n replyType: rowType,\n body: [notImplemented(\"update\")]\n });\n routes.push({\n name: \"delete\",\n method: \"delete\",\n path: keyPath,\n schema: [`params: ${paramsName}`, `response: { 200: { type: 'boolean' } }`],\n replyType: \"boolean\",\n body: [paramHint, \"return true;\"]\n });\n }\n }\n if (writable) {\n routes.push({\n name: \"create\",\n method: \"post\",\n path: \"/\",\n schema: [`body: ${insertName}`, `response: { 200: ${selectName} }`],\n replyType: rowType,\n body: [notImplemented(\"create\")]\n });\n }\n if (opts.includeRelations) {\n routes.push(...relationRoutes(table, rowType, selectName, opts));\n }\n const order = [\"list\", \"byId\", \"create\", \"update\", \"delete\"];\n const rank = (n) => order.indexOf(n) === -1 ? order.length : order.indexOf(n);\n routes.sort((a, b) => rank(a.name) - rank(b.name));\n const exportName = routesExportName(table, opts.naming);\n const statements = routes.map((r) => {\n const reads = (what) => r.body.some((line) => !line.startsWith(\"//\") && what.test(line));\n const params = reads(/\\breply\\./) ? reads(/\\breq\\./) ? \"(req, reply)\" : \"(_req, reply)\" : reads(/\\breq\\./) ? \"(req)\" : \"()\";\n return [\n ` app.${r.method}<{ Reply: ${r.replyType} }>(${lit(r.path)}, {`,\n ` schema: { ${r.schema.join(\", \")} },`,\n ` }, async ${params} => {`,\n ...r.body.map((line) => ` ${line}`),\n ` });`\n ].join(\"\\n\");\n }).join(\"\\n\\n\");\n const plugin = `export const ${exportName}: FastifyPluginAsync = async (app) => {\n${statements}\n};\n`;\n const schemas = tableSchemas(table);\n const declared = [];\n const emit = (name, schema) => `export const ${name} = ${JSON.stringify(adaptForFastify(schema), null, 2)} as const;`;\n if (writable) {\n declared.push(emit(insertName, schemas.insert));\n declared.push(emit(updateName, schemas.update));\n }\n declared.push(emit(selectName, schemas.select));\n if (key) {\n declared.push(emit(paramsName, paramsSchema(key)));\n }\n const rowFields = selectColumns(table).map((c) => ` ${objectKey(c.name)}: ${rowFieldType(c)}${c.nullable ? \" | null\" : \"\"};`).join(\"\\n\");\n declared.push(`export interface ${rowType} {\n${rowFields}\n}`);\n const wide = selectColumns(table).filter((c) => rowFieldType(c) === \"unknown\").map((c) => c.name);\n const wideNote = wide.length ? `// No precise type for ${wide.length === 1 ? \"this column\" : \"these columns\"}: ${wide.join(\", \")}.\n// DRZL could not derive one from the schema, so these routes carry it as unknown and its\n// schema constrains only what the builder could state.\n` : \"\";\n return `// Generated by @drzl/generator-fastify\n// Routes for table: ${table.name}\n${wideNote}import type { FastifyPluginAsync } from 'fastify';\n\n${declared.join(\"\\n\\n\")}\n\n${plugin}`;\n}\nfunction relationRoutes(table, rowType, selectName, opts) {\n const out = [];\n const taken = /* @__PURE__ */ new Set();\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 segment = toCase(`by-${colName}`, opts.naming?.procedureCase ?? \"kebab\");\n if (taken.has(segment)) continue;\n taken.add(segment);\n const params = JSON.stringify(paramsSchema([column]));\n out.push({\n name: `listBy${cap(colName)}`,\n method: \"get\",\n path: `/${segment}/:${colName}`,\n schema: [`params: ${params}`, `response: { 200: { type: 'array', items: ${selectName} } }`],\n replyType: `${rowType}[]`,\n body: [`const rows: ${rowType}[] = [];`, \"return rows;\"]\n });\n }\n return out;\n}\nfunction renderBarrel(modules, ctx, path, opts) {\n if (!modules.length) {\n return `// Generated by @drzl/generator-fastify\n// No tables detected in analysis. Add tables to your schema and regenerate.\nimport type { FastifyPluginAsync } from 'fastify';\n\nexport const routes: FastifyPluginAsync = async () => {};\n`;\n }\n const entries = modules.map(({ filePath, exportName, table }) => ({\n rel: importSpecifier(\n \"./\" + path.relative(ctx.out, filePath).replace(/\\\\/g, \"/\"),\n opts.importExtension\n ),\n exportName,\n mount: mountPath(table, opts.naming)\n }));\n const imports = entries.map((e) => `import { ${e.exportName} } from '${e.rel}';`).join(\"\\n\");\n const registrations = entries.map((e) => ` app.register(${e.exportName}, { prefix: ${lit(e.mount)} });`).join(\"\\n\");\n const reExports = entries.map((e) => `export * from '${e.rel}';`).join(\"\\n\");\n return `// Generated by @drzl/generator-fastify\nimport type { FastifyPluginAsync } from 'fastify';\n${imports}\n\nexport const routes: FastifyPluginAsync = async (app) => {\n${registrations}\n};\n\n${reExports}\n`;\n}\nexport {\n APP_MODULE,\n FastifyGenerator,\n index_default as default\n};\n"],"mappings":"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","names":[]}