@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.
@@ -1,4 +1,5 @@
1
1
  // ../generator-json-schema/dist/index.js
2
+ import { fileWriter } from "@drzl/validation-core";
2
3
  import {
3
4
  formatCode,
4
5
  moduleFileName,
@@ -7,7 +8,11 @@ import {
7
8
  schemaName,
8
9
  typeName
9
10
  } from "@drzl/validation-core";
11
+ import { qualifiedForeignTable, qualifiedTableName } from "@drzl/analyzer";
10
12
  import {
13
+ applyWirePolicy,
14
+ canonicalMembers,
15
+ comparisonWire,
11
16
  COLUMN_FORMATS,
12
17
  insertColumns,
13
18
  isIntegerColumn,
@@ -15,10 +20,67 @@ import {
15
20
  selectColumns,
16
21
  updateColumns
17
22
  } from "@drzl/validation-core";
23
+ var identity = (values) => JSON.stringify([...values]);
24
+ function enumKey(name) {
25
+ const safe = name.replace(/[^A-Za-z0-9.\-_]/g, "_").replace(/^_+|_+$/g, "");
26
+ return safe.length ? safe : void 0;
27
+ }
28
+ function declaredEnumColumns(columns) {
29
+ return columns.filter((c) => !c.shape && c.enumValues && c.enumValues.length);
30
+ }
31
+ function planSharedEnums(columns, enums, ref2, reserved = /* @__PURE__ */ new Set()) {
32
+ if (!enums?.length) return void 0;
33
+ const uses = /* @__PURE__ */ new Map();
34
+ for (const c of declaredEnumColumns(columns)) {
35
+ const id = identity(c.enumValues);
36
+ uses.set(id, (uses.get(id) ?? 0) + 1);
37
+ }
38
+ const keyed = /* @__PURE__ */ new Map();
39
+ const taken = new Set(reserved);
40
+ for (const e of enums) {
41
+ const id = identity(e.values);
42
+ if ((uses.get(id) ?? 0) < 2) continue;
43
+ if (keyed.has(id)) continue;
44
+ const key = enumKey(e.name);
45
+ if (!key || taken.has(key)) continue;
46
+ taken.add(key);
47
+ keyed.set(id, { key, values: [...e.values] });
48
+ }
49
+ if (!keyed.size) return void 0;
50
+ const used = /* @__PURE__ */ new Set();
51
+ return {
52
+ resolve(values) {
53
+ const hit = keyed.get(identity(values));
54
+ if (!hit) return void 0;
55
+ used.add(hit.key);
56
+ return ref2(hit.key);
57
+ },
58
+ definitions() {
59
+ const out = {};
60
+ for (const { key, values } of keyed.values()) {
61
+ if (used.has(key)) out[key] = { enum: [...values] };
62
+ }
63
+ return out;
64
+ }
65
+ };
66
+ }
67
+ var allColumns = (tables) => tables.flatMap((t) => t.columns);
18
68
  var DRAFT = "https://json-schema.org/draft/2020-12/schema";
19
69
  var UUID_FORMAT = "uuid";
20
70
  var base64 = (target) => target === "openapi-3.0" ? { type: "string", format: "byte" } : { type: "string", contentEncoding: "base64" };
21
- function baseSchema(c, mode, target, checks, sets, lengths) {
71
+ function canonicalSetPattern(values, integerOnly) {
72
+ const branches = canonicalMembers(values).map((member) => {
73
+ if (member === "0") return integerOnly ? "[+-]?0+" : "[+-]?(?:0+(?:\\.0*)?|0*\\.0+)";
74
+ const sign = member.startsWith("-") ? "-" : "\\+?";
75
+ const body = member.startsWith("-") ? member.slice(1) : member;
76
+ const [int = "", frac = ""] = body.split(".");
77
+ if (integerOnly) return `${sign}0*${int}`;
78
+ if (!frac) return `${sign}0*${int}(?:\\.0*)?`;
79
+ return int === "0" ? `${sign}0*\\.${frac}0*` : `${sign}0*${int}\\.${frac}0*`;
80
+ });
81
+ return `^(?:${branches.join("|")})$`;
82
+ }
83
+ function baseSchema(c, mode, target, checks, sets, lengths, enumRef) {
22
84
  const s = c.shape;
23
85
  if (s) {
24
86
  switch (s.kind) {
@@ -26,8 +88,11 @@ function baseSchema(c, mode, target, checks, sets, lengths) {
26
88
  return {};
27
89
  case "custom":
28
90
  return {};
29
- case "buffer":
30
- return base64(target);
91
+ case "buffer": {
92
+ const bin = base64(target);
93
+ applyBinaryLengths(bin, c, lengths);
94
+ return bin;
95
+ }
31
96
  case "tuple":
32
97
  return target === "openapi-3.0" ? { type: "array", items: { type: "number" }, minItems: s.length, maxItems: s.length } : {
33
98
  type: "array",
@@ -58,12 +123,27 @@ function baseSchema(c, mode, target, checks, sets, lengths) {
58
123
  }
59
124
  }
60
125
  const set = sets.find((x) => x.column === c.name);
61
- if (set) return { enum: set.values.map((v) => set.kind === "string" ? v : Number(v)) };
62
- if (c.enumValues && c.enumValues.length) return { enum: [...c.enumValues] };
126
+ if (set) {
127
+ if (comparisonWire(c) === "numeric-string") {
128
+ return { type: "string", pattern: canonicalSetPattern(set.values, c.dbType === "BIGINT") };
129
+ }
130
+ return {
131
+ enum: set.values.map(
132
+ (v) => set.kind === "string" || c.tsType === "bigint" ? v : Number(v)
133
+ )
134
+ };
135
+ }
136
+ if (c.enumValues && c.enumValues.length) {
137
+ const ref2 = enumRef?.(c.enumValues);
138
+ return ref2 ? { $ref: ref2 } : { enum: [...c.enumValues] };
139
+ }
63
140
  const mine = c.arrayDimensions ? [] : checks.filter((k) => k.column === c.name);
64
141
  const eq = mine.find((k) => k.operator === "=");
65
142
  if (eq) {
66
- const only = eq.kind === "string" ? eq.value : Number(eq.value);
143
+ if (comparisonWire(c) === "numeric-string") {
144
+ return { type: "string", pattern: canonicalSetPattern([eq.value], c.dbType === "BIGINT") };
145
+ }
146
+ const only = eq.kind === "string" || c.tsType === "bigint" ? eq.value : Number(eq.value);
67
147
  return target === "openapi-3.0" ? { enum: [only] } : { const: only };
68
148
  }
69
149
  switch (c.tsType) {
@@ -72,7 +152,7 @@ function baseSchema(c, mode, target, checks, sets, lengths) {
72
152
  if (c.format === "uuid") out.format = UUID_FORMAT;
73
153
  else if (c.format && COLUMN_FORMATS[c.format]) out.pattern = COLUMN_FORMATS[c.format];
74
154
  if (c.maxLength !== void 0) out.maxLength = c.maxLength;
75
- applyByteCap(out, c);
155
+ applyByteCap(out, c, lengths);
76
156
  applyLengths(out, c, lengths);
77
157
  return out;
78
158
  }
@@ -82,7 +162,10 @@ function baseSchema(c, mode, target, checks, sets, lengths) {
82
162
  return out;
83
163
  }
84
164
  case "bigint":
85
- return { type: "string", pattern: "^-?\\d+$" };
165
+ return {
166
+ type: "string",
167
+ pattern: typeof c.min === "string" && !c.min.startsWith("-") ? "^\\d+$" : "^-?\\d+$"
168
+ };
86
169
  case "boolean":
87
170
  return { type: "boolean" };
88
171
  case "Date":
@@ -93,13 +176,26 @@ function baseSchema(c, mode, target, checks, sets, lengths) {
93
176
  return {};
94
177
  }
95
178
  }
96
- function applyByteCap(out, c) {
97
- if (!c.maxBytes) return;
98
- out.maxLength = Math.min(Number(out.maxLength ?? Infinity), c.maxBytes);
99
- out.description = `At most ${c.maxBytes} 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.`;
179
+ function applyByteCap(out, c, lengths) {
180
+ const budget = byteBudget(c, lengths);
181
+ if (budget === void 0) return;
182
+ out.maxLength = Math.min(Number(out.maxLength ?? Infinity), budget);
183
+ out.description = BYTE_BUDGET_NOTE(budget);
184
+ }
185
+ function ceilingOf(k) {
186
+ if (k.operator === "<=" || k.operator === "=") return Number(k.value);
187
+ if (k.operator === "<") return Number(k.value) - 1;
188
+ return void 0;
189
+ }
190
+ function byteBudget(c, lengths) {
191
+ const bounds = [
192
+ ...c.maxBytes ? [c.maxBytes] : [],
193
+ ...lengths.filter((k) => k.column === c.name && k.unit === "bytes").map(ceilingOf).filter((n) => n !== void 0)
194
+ ];
195
+ return bounds.length ? Math.min(...bounds) : void 0;
100
196
  }
101
197
  function applyLengths(out, c, lengths) {
102
- for (const k of lengths.filter((x) => x.column === c.name)) {
198
+ for (const k of lengths.filter((x) => x.column === c.name && x.unit !== "bytes")) {
103
199
  const n = Number(k.value);
104
200
  if (k.operator === ">=") out.minLength = Math.max(Number(out.minLength ?? 0), n);
105
201
  else if (k.operator === ">") out.minLength = Math.max(Number(out.minLength ?? 0), n + 1);
@@ -111,6 +207,13 @@ function applyLengths(out, c, lengths) {
111
207
  }
112
208
  }
113
209
  }
210
+ function applyBinaryLengths(out, c, lengths) {
211
+ const budget = byteBudget(c, lengths);
212
+ if (budget === void 0) return;
213
+ out.maxLength = 4 * Math.ceil(budget / 3);
214
+ 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.`;
215
+ }
216
+ var 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.`;
114
217
  function applyNumericBounds(out, c, checks, target) {
115
218
  let min = c.min !== void 0 ? { value: Number(c.min), exclusive: false } : void 0;
116
219
  let max = c.max !== void 0 ? { value: Number(c.max), exclusive: false } : void 0;
@@ -154,6 +257,7 @@ function cardinalityBounds(c, cardinalities) {
154
257
  }
155
258
  function makeNullable(s, target) {
156
259
  if (target === "openapi-3.0") return { ...s, nullable: true };
260
+ if ("$ref" in s) return { anyOf: [s, { type: "null" }] };
157
261
  if (s.type === void 0) {
158
262
  if (Array.isArray(s.enum)) return { ...s, enum: [...s.enum, null] };
159
263
  if ("const" in s) {
@@ -164,8 +268,10 @@ function makeNullable(s, target) {
164
268
  }
165
269
  return { ...s, type: [s.type, "null"] };
166
270
  }
167
- function columnSchema(c, mode, target, checks, sets, lengths, cardinalities, applyDefault) {
168
- let s = baseSchema(c, mode, target, checks, sets, lengths);
271
+ function columnSchema(c, mode, target, checks, sets, lengths, cardinalities, applyDefault, enumRef) {
272
+ const wantsDefault = mode === "insert" && applyDefault && c.defaultValue !== void 0;
273
+ const refBlockedBy30 = target === "openapi-3.0" && !c.arrayDimensions && (c.nullable || wantsDefault);
274
+ let s = baseSchema(c, mode, target, checks, sets, lengths, refBlockedBy30 ? void 0 : enumRef);
169
275
  const dims = c.arrayDimensions ?? 0;
170
276
  for (let i = 0; i < dims; i++) {
171
277
  s = { type: "array", items: s, ...i === dims - 1 ? cardinalityBounds(c, cardinalities) : {} };
@@ -183,7 +289,7 @@ function rowDescription(rows, cols) {
183
289
  const list = applicable.map((r) => `${r.name ? `${r.name}: ` : ""}${r.left} ${r.operator} ${r.right}`).join("; ");
184
290
  return `Row constraints not expressible in JSON Schema: ${list}`;
185
291
  }
186
- function tableSchema(table, cols, mode, target, applyDefaults, parsed) {
292
+ function tableSchema(table, cols, mode, target, applyDefaults, parsed, enums, localDefs) {
187
293
  const properties = {};
188
294
  const required = [];
189
295
  for (const c of cols) {
@@ -195,13 +301,15 @@ function tableSchema(table, cols, mode, target, applyDefaults, parsed) {
195
301
  parsed.sets,
196
302
  parsed.lengths,
197
303
  parsed.cardinalities,
198
- applyDefaults
304
+ applyDefaults,
305
+ enums?.resolve
199
306
  );
200
307
  const suppliedOnInsert = c.hasDefault || applyDefaults && c.defaultValue !== void 0 || c.isGenerated;
201
308
  const optional = mode === "update" || mode === "insert" && suppliedOnInsert;
202
309
  if (!optional) required.push(c.name);
203
310
  }
204
311
  const desc = rowDescription(parsed.rows, cols);
312
+ const defs = localDefs ? enums?.definitions() ?? {} : {};
205
313
  return {
206
314
  ...target === "draft-2020-12" ? { $schema: DRAFT } : {},
207
315
  $id: `${table.tsName}.${mode}`,
@@ -210,14 +318,20 @@ function tableSchema(table, cols, mode, target, applyDefaults, parsed) {
210
318
  type: "object",
211
319
  properties,
212
320
  ...required.length ? { required } : {},
213
- additionalProperties: false
321
+ additionalProperties: false,
322
+ ...Object.keys(defs).length ? { $defs: defs } : {}
214
323
  };
215
324
  }
216
325
  function collect(table) {
217
326
  const parsed = (table.checks ?? []).map((k) => parseCheck(k.expression, k.name));
327
+ const { checks, sets } = applyWirePolicy(
328
+ table.columns,
329
+ parsed.flatMap((p) => p.ok ? p.checks : []),
330
+ parsed.flatMap((p) => p.ok ? p.sets ?? [] : [])
331
+ );
218
332
  return {
219
- checks: parsed.flatMap((p) => p.ok ? p.checks : []),
220
- sets: parsed.flatMap((p) => p.ok ? p.sets ?? [] : []),
333
+ checks,
334
+ sets,
221
335
  rows: parsed.flatMap((p) => p.ok ? p.rows ?? [] : []),
222
336
  lengths: parsed.flatMap((p) => p.ok ? p.lengths ?? [] : []),
223
337
  cardinalities: parsed.flatMap((p) => p.ok ? p.cardinalities ?? [] : [])
@@ -226,27 +340,69 @@ function collect(table) {
226
340
  function tableSchemas(table, opts = {}) {
227
341
  const target = opts.target ?? "draft-2020-12";
228
342
  const parsed = collect(table);
229
- const build2 = (cols, mode) => tableSchema(table, cols, mode, target, !!opts.applyDefaults, parsed);
343
+ const localDefs = target === "draft-2020-12";
344
+ const build2 = (cols, mode) => {
345
+ const plan = localDefs ? planSharedEnums(cols, opts.enums, (key) => `#/$defs/${key}`) : void 0;
346
+ return tableSchema(table, cols, mode, target, !!opts.applyDefaults, parsed, plan, localDefs);
347
+ };
230
348
  return {
231
349
  insert: build2(insertColumns(table), "insert"),
232
350
  update: build2(updateColumns(table), "update"),
233
351
  select: build2(selectColumns(table), "select")
234
352
  };
235
353
  }
354
+ function tableSchemasWith(table, target, applyDefaults, plan, modes = MODES) {
355
+ const parsed = collect(table);
356
+ const columns = {
357
+ insert: () => insertColumns(table),
358
+ update: () => updateColumns(table),
359
+ select: () => selectColumns(table)
360
+ };
361
+ const out = {};
362
+ for (const mode of modes) {
363
+ out[mode] = tableSchema(
364
+ table,
365
+ columns[mode](),
366
+ mode,
367
+ target,
368
+ applyDefaults,
369
+ parsed,
370
+ plan,
371
+ false
372
+ );
373
+ }
374
+ return out;
375
+ }
236
376
  function componentsDocument(tables, opts = {}) {
377
+ const target = opts.target ?? "draft-2020-12";
237
378
  const schemas = {};
238
379
  for (const table of tables) {
239
- const built = tableSchemas(table, opts);
240
- for (const mode of ["insert", "update", "select"]) {
241
- const name = `${table.tsName}${mode[0].toUpperCase()}${mode.slice(1)}`;
380
+ const built = tableSchemasWith(table, target, !!opts.applyDefaults, void 0);
381
+ for (const mode of MODES) {
242
382
  const { $schema: _dialect, $id: _id, ...rest } = built[mode];
243
- schemas[name] = rest;
383
+ schemas[componentSchemaName(table, mode)] = rest;
244
384
  }
245
385
  }
246
386
  return { schemas };
247
387
  }
388
+ var MODES = ["insert", "update", "select"];
389
+ var componentSchemaName = (table, mode) => `${table.tsName}${mode[0].toUpperCase()}${mode.slice(1)}`;
390
+ function documentSchemas(tables, opts) {
391
+ const plan = planSharedEnums(
392
+ tables.flatMap((t) => t.columns),
393
+ opts.enums,
394
+ (key) => `#/components/schemas/${key}`,
395
+ opts.reserved
396
+ );
397
+ const built = /* @__PURE__ */ new Map();
398
+ for (const table of tables) {
399
+ const all = tableSchemasWith(table, opts.target, opts.applyDefaults, plan, opts.modes(table));
400
+ built.set(table, all);
401
+ }
402
+ return { built, definitions: () => plan?.definitions() ?? {} };
403
+ }
248
404
  var ERROR_SCHEMA = "Error";
249
- var componentName = (table, mode) => `${table.tsName}${mode[0].toUpperCase()}${mode.slice(1)}`;
405
+ var componentName = componentSchemaName;
250
406
  var ref = (name) => ({ $ref: `#/components/schemas/${name}` });
251
407
  var pascal = (s) => s.charAt(0).toUpperCase() + s.slice(1);
252
408
  function keyColumns(table) {
@@ -261,12 +417,13 @@ var modesFor = (table, key) => [
261
417
  ...table.readOnly || !key ? [] : ["update"],
262
418
  "select"
263
419
  ];
264
- var resourceSegment = (table) => encodeURIComponent(table.name);
420
+ var resourceSegment = (table) => table.schema ? `${encodeURIComponent(table.schema)}/${encodeURIComponent(table.name)}` : encodeURIComponent(table.name);
265
421
  function foreignKeysOf(table) {
266
422
  if (table.foreignKeys?.length) return table.foreignKeys;
267
423
  return table.columns.filter((c) => c.references).map((c) => ({
268
424
  columns: [c.name],
269
425
  foreignTable: c.references.table,
426
+ ...c.references.schema ? { foreignSchema: c.references.schema } : {},
270
427
  foreignColumns: [c.references.column]
271
428
  }));
272
429
  }
@@ -293,20 +450,33 @@ function build(tables, opts) {
293
450
  const clash = operationIds.get(id);
294
451
  if (clash !== void 0) {
295
452
  throw new Error(
296
- `@drzl/generator-json-schema: the operationId "${id}" would be emitted for both "${clash}" and "${table.name}". An operationId is the method name a client generator derives, and the specification requires it to be unique across the document.`
453
+ `@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.`
297
454
  );
298
455
  }
299
- operationIds.set(id, table.name);
300
- return { operationId: id, tags: [table.name], ...rest };
456
+ operationIds.set(id, qualifiedTableName(table));
457
+ return { operationId: id, tags: [qualifiedTableName(table)], ...rest };
301
458
  };
459
+ const keys = new Map(tables.map((t) => [t, keyColumns(t)]));
460
+ const carried = new Map(tables.map((t) => [t, modesFor(t, keys.get(t))]));
461
+ const reserved = /* @__PURE__ */ new Set([
462
+ ERROR_SCHEMA,
463
+ ...tables.flatMap((t) => carried.get(t).map((m) => componentName(t, m)))
464
+ ]);
465
+ const shared = documentSchemas(tables, {
466
+ target: schemaTarget,
467
+ applyDefaults: !!opts.applyDefaults,
468
+ reserved,
469
+ modes: (t) => carried.get(t),
470
+ ...opts.enums ? { enums: opts.enums } : {}
471
+ });
302
472
  const built = tables.map((table) => ({
303
473
  table,
304
- key: keyColumns(table),
474
+ key: keys.get(table),
305
475
  segment: resourceSegment(table),
306
- schemas: tableSchemas(table, { target: schemaTarget, applyDefaults: opts.applyDefaults })
476
+ schemas: shared.built.get(table)
307
477
  }));
308
478
  for (const { table, key, segment, schemas: built3 } of built) {
309
- for (const mode of modesFor(table, key)) {
479
+ for (const mode of carried.get(table)) {
310
480
  const { $schema: _dialect, $id: _id, ...rest } = built3[mode];
311
481
  schemas[componentName(table, mode)] = rest;
312
482
  }
@@ -315,7 +485,10 @@ function build(tables, opts) {
315
485
  if (table.readOnly) {
316
486
  notes.push("It refuses every write, so only reads are described.");
317
487
  }
318
- tags.push({ name: table.name, description: [`Table "${table.name}".`, ...notes].join(" ") });
488
+ tags.push({
489
+ name: qualifiedTableName(table),
490
+ description: [`Table "${qualifiedTableName(table)}".`, ...notes].join(" ")
491
+ });
319
492
  const T = pascal(table.tsName);
320
493
  const select = ref(componentName(table, "select"));
321
494
  const validationFailed = {
@@ -331,7 +504,7 @@ function build(tables, opts) {
331
504
  ...jsonBody(ref(ERROR_SCHEMA))
332
505
  });
333
506
  const collection = `/${segment}`;
334
- claim(collection, table.tsName, table.name);
507
+ claim(collection, table.tsName, qualifiedTableName(table));
335
508
  const item = {
336
509
  get: operation(`list${T}`, table, {
337
510
  summary: `List every ${table.name} row.`,
@@ -360,7 +533,7 @@ function build(tables, opts) {
360
533
  paths[collection] = item;
361
534
  if (!key) continue;
362
535
  const itemPath = `${collection}/${key.map((c) => `{${c.name}}`).join("/")}`;
363
- claim(itemPath, table.tsName, table.name);
536
+ claim(itemPath, table.tsName, qualifiedTableName(table));
364
537
  const parameters = key.map((c) => ({
365
538
  name: c.name,
366
539
  in: "path",
@@ -419,14 +592,18 @@ function build(tables, opts) {
419
592
  for (const child of built) {
420
593
  if (child.table === table) continue;
421
594
  const matching = foreignKeysOf(child.table).filter(
422
- (fk) => fk.foreignTable === table.name && fk.foreignColumns.length === key.length && fk.foreignColumns.every((c, i) => c === key[i].name)
595
+ (fk) => (
596
+ // Qualified on both sides. On the bare name a key pointing at `reporting.users` also
597
+ // answered for `public.users`, so the child was hung under a parent in another schema.
598
+ qualifiedForeignTable(fk) === qualifiedTableName(table) && fk.foreignColumns.length === key.length && fk.foreignColumns.every((c, i) => c === key[i].name)
599
+ )
423
600
  );
424
601
  if (matching.length !== 1) continue;
425
602
  const subPath = `${itemPath}/${child.segment}`;
426
603
  claim(
427
604
  subPath,
428
605
  `${table.tsName} -> ${child.table.tsName}`,
429
- `${table.name} -> ${child.table.name}`
606
+ `${qualifiedTableName(table)} -> ${qualifiedTableName(child.table)}`
430
607
  );
431
608
  paths[subPath] = {
432
609
  parameters,
@@ -444,7 +621,7 @@ function build(tables, opts) {
444
621
  };
445
622
  }
446
623
  }
447
- return { paths, schemas, tags };
624
+ return { paths, schemas: { ...schemas, ...shared.definitions() }, tags };
448
625
  }
449
626
  var errorSchema = () => ({
450
627
  title: "error",
@@ -479,9 +656,9 @@ function openApiDocument(tables, opts = {}) {
479
656
  };
480
657
  }
481
658
  var DEFAULT_FILE_SUFFIX = ".schema.ts";
482
- function renderTableModule(table, affix, target, applyDefaults) {
659
+ function renderTableModule(table, affix, target, applyDefaults, enums) {
483
660
  const T = table.tsName;
484
- const schemas = tableSchemas(table, { target, applyDefaults });
661
+ const schemas = tableSchemas(table, { target, applyDefaults, ...enums ? { enums } : {} });
485
662
  const decl = (mode) => `export const ${schemaName(mode, T, affix)} = ${JSON.stringify(schemas[mode], null, 2)} as const;
486
663
 
487
664
  export type ${typeName(mode, T, affix)} = typeof ${schemaName(mode, T, affix)};`;
@@ -499,7 +676,7 @@ var JsonSchemaGenerator = class {
499
676
  this.library = "json-schema";
500
677
  }
501
678
  async generate(opts) {
502
- const fs = await import("fs/promises");
679
+ const fs = fileWriter(opts.fileSink);
503
680
  const path = await import("path");
504
681
  const out = path.resolve(process.cwd(), opts.outDir);
505
682
  const files = [];
@@ -510,7 +687,13 @@ var JsonSchemaGenerator = class {
510
687
  const document = resolveDocument(opts.document);
511
688
  for (const table of this.analysis.tables) {
512
689
  const filePath = path.join(out, moduleFileName(table.tsName, fileSuffix));
513
- const code = renderTableModule(table, affix, target, !!opts.applyDefaults);
690
+ const code = renderTableModule(
691
+ table,
692
+ affix,
693
+ target,
694
+ !!opts.applyDefaults,
695
+ opts.sharedEnums ? this.analysis.enums : void 0
696
+ );
514
697
  const formatted = await formatCode(
515
698
  buildHeader(opts.outputHeader) + code,
516
699
  filePath,
@@ -539,6 +722,7 @@ var JsonSchemaGenerator = class {
539
722
  target,
540
723
  applyDefaults: !!opts.applyDefaults,
541
724
  includeRelations: !!opts.includeRelations,
725
+ enums: this.analysis.enums,
542
726
  info: document.info,
543
727
  servers: document.servers,
544
728
  validationStatus: document.validationStatus
@@ -580,7 +764,8 @@ var JsonSchemaGenerator = class {
580
764
  table,
581
765
  resolveAffix(opts),
582
766
  opts?.target ?? "draft-2020-12",
583
- !!opts?.applyDefaults
767
+ !!opts?.applyDefaults,
768
+ opts?.sharedEnums ? this.analysis.enums : void 0
584
769
  );
585
770
  }
586
771
  };
@@ -592,12 +777,18 @@ function buildHeader(h) {
592
777
 
593
778
  `;
594
779
  }
780
+
595
781
  export {
782
+ enumKey,
783
+ planSharedEnums,
784
+ allColumns,
596
785
  DRAFT,
597
- JsonSchemaGenerator,
786
+ tableSchemas,
598
787
  componentsDocument,
599
- index_default as default,
788
+ componentSchemaName,
789
+ documentSchemas,
600
790
  openApiDocument,
601
- tableSchemas
791
+ JsonSchemaGenerator,
792
+ index_default
602
793
  };
603
- //# sourceMappingURL=dist-TRJLPIWT.js.map
794
+ //# sourceMappingURL=chunk-KKPDOZOD.js.map
@@ -0,0 +1 @@
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":[]}