@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.
- package/dist/chunk-54E2IO7N.js +1030 -0
- package/dist/chunk-54E2IO7N.js.map +1 -0
- package/dist/{dist-TRJLPIWT.js → chunk-KKPDOZOD.js} +239 -48
- package/dist/chunk-KKPDOZOD.js.map +1 -0
- package/dist/cli.cjs +6850 -1434
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +2958 -679
- package/dist/cli.js.map +1 -1
- package/dist/config.cjs +632 -70
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +314 -6
- package/dist/config.d.ts +314 -6
- package/dist/config.js +29 -1
- package/dist/dist-KQMPKOFK.js +350 -0
- package/dist/dist-KQMPKOFK.js.map +1 -0
- package/dist/{dist-CZDVFYFW.js → dist-KX62ETKK.js} +112 -37
- package/dist/dist-KX62ETKK.js.map +1 -0
- package/dist/dist-P24ILO5N.js +431 -0
- package/dist/dist-P24ILO5N.js.map +1 -0
- package/dist/dist-QYH7DRFY.js +27 -0
- package/dist/dist-QYH7DRFY.js.map +1 -0
- package/dist/dist-SGI2I53L.js +434 -0
- package/dist/dist-SGI2I53L.js.map +1 -0
- package/dist/dist-T5376MW7.js +489 -0
- package/dist/dist-T5376MW7.js.map +1 -0
- package/dist/dist-UVP6B4XJ.js +646 -0
- package/dist/dist-UVP6B4XJ.js.map +1 -0
- package/dist/{dist-XBGVORL3.js → dist-ZIHNXQ7U.js} +16 -6
- package/dist/dist-ZIHNXQ7U.js.map +1 -0
- package/dist/drzl.config.schema.json +717 -0
- package/package.json +19 -13
- package/dist/chunk-V2IXXAC2.js +0 -465
- package/dist/chunk-V2IXXAC2.js.map +0 -1
- package/dist/dist-CZDVFYFW.js.map +0 -1
- package/dist/dist-TRJLPIWT.js.map +0 -1
- package/dist/dist-XBGVORL3.js.map +0 -1
|
@@ -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
|
|
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
|
-
|
|
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)
|
|
62
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
out.
|
|
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
|
-
|
|
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
|
|
220
|
-
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
|
|
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 =
|
|
240
|
-
for (const mode of
|
|
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[
|
|
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 =
|
|
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
|
|
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
|
|
300
|
-
return { operationId: id, tags: [table
|
|
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:
|
|
474
|
+
key: keys.get(table),
|
|
305
475
|
segment: resourceSegment(table),
|
|
306
|
-
schemas:
|
|
476
|
+
schemas: shared.built.get(table)
|
|
307
477
|
}));
|
|
308
478
|
for (const { table, key, segment, schemas: built3 } of built) {
|
|
309
|
-
for (const mode of
|
|
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({
|
|
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
|
|
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
|
|
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) =>
|
|
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
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
786
|
+
tableSchemas,
|
|
598
787
|
componentsDocument,
|
|
599
|
-
|
|
788
|
+
componentSchemaName,
|
|
789
|
+
documentSchemas,
|
|
600
790
|
openApiDocument,
|
|
601
|
-
|
|
791
|
+
JsonSchemaGenerator,
|
|
792
|
+
index_default
|
|
602
793
|
};
|
|
603
|
-
//# sourceMappingURL=
|
|
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":[]}
|