@drzl/cli 4.17.0 → 4.19.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-I4KMDCQR.js → chunk-V2IXXAC2.js} +13 -2
- package/dist/chunk-V2IXXAC2.js.map +1 -0
- package/dist/cli.cjs +986 -95
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +406 -67
- package/dist/cli.js.map +1 -1
- package/dist/config.cjs +12 -1
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +4 -2
- package/dist/config.d.ts +4 -2
- package/dist/config.js +1 -1
- package/dist/dist-CZDVFYFW.js +559 -0
- package/dist/dist-CZDVFYFW.js.map +1 -0
- package/package.json +7 -6
- package/dist/chunk-I4KMDCQR.js.map +0 -1
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
// ../generator-effect/dist/index.js
|
|
2
|
+
import {
|
|
3
|
+
buildNestedPlan,
|
|
4
|
+
formatCode,
|
|
5
|
+
nestedArmNotes,
|
|
6
|
+
nestedNodeColumns,
|
|
7
|
+
nestedSchemaName,
|
|
8
|
+
nestedTypeName,
|
|
9
|
+
resolveNestedDepth,
|
|
10
|
+
CODEPOINT_LENGTH,
|
|
11
|
+
COERCIBLE_DATE_STRING,
|
|
12
|
+
COLUMN_FORMATS,
|
|
13
|
+
insertColumns,
|
|
14
|
+
isIntegerColumn,
|
|
15
|
+
moduleFileName,
|
|
16
|
+
moduleSpecifier,
|
|
17
|
+
nonFiniteAccepted,
|
|
18
|
+
parseCheck,
|
|
19
|
+
parsesToADate,
|
|
20
|
+
renderDuplicateFinder,
|
|
21
|
+
resolveAffix,
|
|
22
|
+
resolveConfiguredImport,
|
|
23
|
+
schemaName,
|
|
24
|
+
selectColumns,
|
|
25
|
+
typeName,
|
|
26
|
+
updateColumns
|
|
27
|
+
} from "@drzl/validation-core";
|
|
28
|
+
var DEFAULT_FILE_SUFFIX = ".effect.ts";
|
|
29
|
+
var STANDARD_PREFIX = "Standard";
|
|
30
|
+
var NS = "Schema";
|
|
31
|
+
var OPS = {
|
|
32
|
+
">=": ">=",
|
|
33
|
+
">": ">",
|
|
34
|
+
"<=": "<=",
|
|
35
|
+
"<": "<",
|
|
36
|
+
"=": "===",
|
|
37
|
+
"<>": "!=="
|
|
38
|
+
};
|
|
39
|
+
function filter(expr, description) {
|
|
40
|
+
return `${NS}.filter((v) => ${expr}, { description: ${JSON.stringify(description)} })`;
|
|
41
|
+
}
|
|
42
|
+
function piped(base, steps) {
|
|
43
|
+
return steps.length ? `${base}.pipe(${steps.join(", ")})` : base;
|
|
44
|
+
}
|
|
45
|
+
var JSON_CONST = "DrzlJsonValue";
|
|
46
|
+
var JSON_PREAMBLE = `type ${JSON_CONST}Type =
|
|
47
|
+
| string
|
|
48
|
+
| number
|
|
49
|
+
| boolean
|
|
50
|
+
| null
|
|
51
|
+
| readonly ${JSON_CONST}Type[]
|
|
52
|
+
| { readonly [key: string]: ${JSON_CONST}Type };
|
|
53
|
+
|
|
54
|
+
const ${JSON_CONST}: ${NS}.Schema<${JSON_CONST}Type, unknown> = ${NS}.suspend(() =>
|
|
55
|
+
${NS}.Union(
|
|
56
|
+
${NS}.String,
|
|
57
|
+
${NS}.Finite,
|
|
58
|
+
${NS}.Boolean,
|
|
59
|
+
${NS}.Null,
|
|
60
|
+
${NS}.Array(${JSON_CONST}),
|
|
61
|
+
// The plain-object test comes before the record, not after it. \`Schema.Record\` rebuilds its
|
|
62
|
+
// output, so a check placed after it inspects that new object and reports every input as
|
|
63
|
+
// plain. A Date sailed through: it has no own enumerable keys, so the record accepted it and
|
|
64
|
+
// rebuilt it as \`{}\`.
|
|
65
|
+
${NS}.Unknown.pipe(
|
|
66
|
+
${NS}.filter(
|
|
67
|
+
(o) => {
|
|
68
|
+
if (typeof o !== 'object' || o === null || Array.isArray(o)) return false;
|
|
69
|
+
const p = Object.getPrototypeOf(o);
|
|
70
|
+
return p === Object.prototype || p === null;
|
|
71
|
+
},
|
|
72
|
+
{ description: 'a plain object' }
|
|
73
|
+
),
|
|
74
|
+
${NS}.compose(${NS}.Record({ key: ${NS}.String, value: ${JSON_CONST} }), { strict: false })
|
|
75
|
+
)
|
|
76
|
+
)
|
|
77
|
+
);
|
|
78
|
+
`;
|
|
79
|
+
var UNKNOWN_EXPR = `${NS}.Unknown`;
|
|
80
|
+
function isUnknownExpr(expr) {
|
|
81
|
+
return expr === UNKNOWN_EXPR;
|
|
82
|
+
}
|
|
83
|
+
function withNarrowedType(expr, ref) {
|
|
84
|
+
return `${expr} as unknown as ${NS}.Schema<${ref}>`;
|
|
85
|
+
}
|
|
86
|
+
function numericBounds(c, checks) {
|
|
87
|
+
let lo = c.min !== void 0 ? { fn: "greaterThanOrEqualTo", value: c.min } : void 0;
|
|
88
|
+
let hi = c.max !== void 0 ? { fn: "lessThanOrEqualTo", value: c.max } : void 0;
|
|
89
|
+
for (const k of checks.filter((x) => x.column === c.name && x.kind === "number")) {
|
|
90
|
+
if (k.operator === ">=") lo = { fn: "greaterThanOrEqualTo", value: k.value };
|
|
91
|
+
else if (k.operator === ">") lo = { fn: "greaterThan", value: k.value };
|
|
92
|
+
else if (k.operator === "<=") hi = { fn: "lessThanOrEqualTo", value: k.value };
|
|
93
|
+
else if (k.operator === "<") hi = { fn: "lessThan", value: k.value };
|
|
94
|
+
}
|
|
95
|
+
return [lo, hi].filter(Boolean).map((x) => `${NS}.${x.fn}(${x.value})`);
|
|
96
|
+
}
|
|
97
|
+
function foldedIntoBounds(c, checks) {
|
|
98
|
+
if (c.arrayDimensions || c.shape) return /* @__PURE__ */ new Set();
|
|
99
|
+
if (c.tsType !== "number" && c.tsType !== "bigint") return /* @__PURE__ */ new Set();
|
|
100
|
+
return new Set(
|
|
101
|
+
checks.filter(
|
|
102
|
+
(k) => k.column === c.name && k.kind === "number" && k.operator !== "=" && k.operator !== "<>"
|
|
103
|
+
)
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
function nonFiniteBranches(c) {
|
|
107
|
+
const { nan, infinity } = nonFiniteAccepted(c);
|
|
108
|
+
return [
|
|
109
|
+
...nan ? [`${NS}.Number.pipe(${filter("Number.isNaN(v)", "NaN, which this column stores")})`] : [],
|
|
110
|
+
...infinity ? [`${NS}.Literal(Infinity, -Infinity)`] : []
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
function withNonFinite(c, base) {
|
|
114
|
+
const branches = nonFiniteBranches(c);
|
|
115
|
+
return branches.length ? `${NS}.Union(${base}, ${branches.join(", ")})` : base;
|
|
116
|
+
}
|
|
117
|
+
function dateExpr(mode, coerceDates) {
|
|
118
|
+
const plain = `${NS}.ValidDateFromSelf`;
|
|
119
|
+
if (coerceDates === "none") return plain;
|
|
120
|
+
const fromString = piped(`${NS}.String`, [
|
|
121
|
+
`${NS}.pattern(new RegExp(${JSON.stringify(COERCIBLE_DATE_STRING)}))`,
|
|
122
|
+
filter(parsesToADate("new Date(v)"), "a date the runtime can parse")
|
|
123
|
+
]);
|
|
124
|
+
const fromNumber = piped(`${NS}.Number`, [
|
|
125
|
+
filter(parsesToADate("new Date(v)"), "a date the runtime can parse")
|
|
126
|
+
]);
|
|
127
|
+
const union = `${NS}.Union(${plain}, ${fromString}, ${fromNumber})`;
|
|
128
|
+
if (coerceDates === "all") return union;
|
|
129
|
+
return mode === "select" ? plain : union;
|
|
130
|
+
}
|
|
131
|
+
function capSteps(c, mode) {
|
|
132
|
+
const steps = [];
|
|
133
|
+
if (c.shape?.kind === "byteString") {
|
|
134
|
+
const n = c.shape.length;
|
|
135
|
+
if (!n) return steps;
|
|
136
|
+
return mode === "select" ? [filter(`${CODEPOINT_LENGTH} <= ${n}`, `at most ${n} characters`)] : [filter(`new TextEncoder().encode(v).length <= ${n}`, `at most ${n} bytes`)];
|
|
137
|
+
}
|
|
138
|
+
if (c.maxLength) {
|
|
139
|
+
steps.push(
|
|
140
|
+
filter(`${CODEPOINT_LENGTH} <= ${c.maxLength}`, `at most ${c.maxLength} characters`)
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
if (c.maxBytes) {
|
|
144
|
+
steps.push(
|
|
145
|
+
filter(`new TextEncoder().encode(v).length <= ${c.maxBytes}`, `at most ${c.maxBytes} bytes`)
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
return steps;
|
|
149
|
+
}
|
|
150
|
+
function lengthSteps(c, lengths) {
|
|
151
|
+
if (c.arrayDimensions || c.shape) return [];
|
|
152
|
+
return lengths.filter((k) => k.column === c.name).map(
|
|
153
|
+
(k) => filter(
|
|
154
|
+
`${CODEPOINT_LENGTH} ${OPS[k.operator]} ${k.value}`,
|
|
155
|
+
`${k.name ? `${k.name}: ` : ""}length(${c.name}) ${k.operator} ${k.value}`
|
|
156
|
+
)
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
function cardinalitySteps(c, cardinalities) {
|
|
160
|
+
if (!c.arrayDimensions) return [];
|
|
161
|
+
return cardinalities.filter((k) => k.column === c.name).map(
|
|
162
|
+
(k) => filter(
|
|
163
|
+
`v.length ${OPS[k.operator]} ${k.value}`,
|
|
164
|
+
`${k.name ? `${k.name}: ` : ""}cardinality(${c.name}) ${k.operator} ${k.value}`
|
|
165
|
+
)
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
function checkSteps(c, checks) {
|
|
169
|
+
if (c.arrayDimensions || c.shape) return [];
|
|
170
|
+
const folded = foldedIntoBounds(c, checks);
|
|
171
|
+
return checks.filter((k) => k.column === c.name && !folded.has(k)).map((k) => {
|
|
172
|
+
const literal = k.kind === "string" ? JSON.stringify(k.value) : k.value;
|
|
173
|
+
return filter(
|
|
174
|
+
`v ${OPS[k.operator]} ${literal}`,
|
|
175
|
+
`${k.name ? `${k.name}: ` : ""}${c.name} ${k.operator} ${k.value}`
|
|
176
|
+
);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function hasNoRuntimeType(c) {
|
|
180
|
+
return c.tsType === "any" || c.shape?.kind === "custom" || c.shape?.kind === "json";
|
|
181
|
+
}
|
|
182
|
+
function shapeExpr(c, mode, replaced = false) {
|
|
183
|
+
const s = c.shape;
|
|
184
|
+
if (!s) return void 0;
|
|
185
|
+
switch (s.kind) {
|
|
186
|
+
case "json":
|
|
187
|
+
return replaced ? UNKNOWN_EXPR : JSON_CONST;
|
|
188
|
+
case "custom":
|
|
189
|
+
return UNKNOWN_EXPR;
|
|
190
|
+
case "buffer":
|
|
191
|
+
return `${NS}.Uint8ArrayFromSelf`;
|
|
192
|
+
case "tuple":
|
|
193
|
+
return `${NS}.Tuple(${Array.from({ length: s.length }, () => `${NS}.Number`).join(", ")})`;
|
|
194
|
+
case "numberObject":
|
|
195
|
+
return `${NS}.Struct({ ${s.fields.map((f) => `${f}: ${NS}.Number`).join(", ")} })`;
|
|
196
|
+
case "numberVector":
|
|
197
|
+
return piped(
|
|
198
|
+
`${NS}.Array(${NS}.Number)`,
|
|
199
|
+
s.length ? [filter(`v.length === ${s.length}`, `exactly ${s.length} elements`)] : []
|
|
200
|
+
);
|
|
201
|
+
case "bitstring":
|
|
202
|
+
return piped(`${NS}.String`, [
|
|
203
|
+
`${NS}.pattern(/^[01]*$/)`,
|
|
204
|
+
...s.length ? [
|
|
205
|
+
s.exact ? filter(`v.length === ${s.length}`, `exactly ${s.length} binary digits`) : filter(`v.length <= ${s.length}`, `at most ${s.length} binary digits`)
|
|
206
|
+
] : []
|
|
207
|
+
]);
|
|
208
|
+
case "byteString":
|
|
209
|
+
return piped(`${NS}.String`, capSteps(c, mode));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function exprForColumn(c, mode, coerceDates, checks, sets, lengths, replaced) {
|
|
213
|
+
const shaped = shapeExpr(c, mode, replaced);
|
|
214
|
+
if (shaped) return shaped;
|
|
215
|
+
const set = sets.find((x) => x.column === c.name);
|
|
216
|
+
if (set) {
|
|
217
|
+
const values = set.values.map((v) => set.kind === "string" ? JSON.stringify(v) : v);
|
|
218
|
+
return `${NS}.Literal(${values.join(", ")})`;
|
|
219
|
+
}
|
|
220
|
+
if (c.arrayDimensions) checks = [];
|
|
221
|
+
if (c.enumValues && c.enumValues.length) {
|
|
222
|
+
return `${NS}.Literal(${c.enumValues.map((v) => JSON.stringify(v)).join(", ")})`;
|
|
223
|
+
}
|
|
224
|
+
const eq = checks.find((k) => k.column === c.name && k.operator === "=");
|
|
225
|
+
if (eq && !c.shape) {
|
|
226
|
+
return `${NS}.Literal(${eq.kind === "string" ? JSON.stringify(eq.value) : eq.value})`;
|
|
227
|
+
}
|
|
228
|
+
const rest = [...checkSteps(c, checks), ...lengthSteps(c, lengths)];
|
|
229
|
+
switch (c.tsType) {
|
|
230
|
+
case "string": {
|
|
231
|
+
const base = c.format === "uuid" ? `${NS}.UUID` : `${NS}.String`;
|
|
232
|
+
const pattern = c.format && c.format !== "uuid" && COLUMN_FORMATS[c.format] ? [`${NS}.pattern(new RegExp(${JSON.stringify(COLUMN_FORMATS[c.format])}))`] : [];
|
|
233
|
+
return piped(base, [...pattern, ...capSteps(c, mode), ...rest]);
|
|
234
|
+
}
|
|
235
|
+
case "number": {
|
|
236
|
+
const base = isIntegerColumn(c) ? `${NS}.Int` : `${NS}.Finite`;
|
|
237
|
+
return withNonFinite(c, piped(base, [...numericBounds(c, checks), ...rest]));
|
|
238
|
+
}
|
|
239
|
+
case "bigint":
|
|
240
|
+
return piped(`${NS}.BigIntFromSelf`, [
|
|
241
|
+
...c.min !== void 0 ? [`${NS}.greaterThanOrEqualToBigInt(${c.min}n)`] : [],
|
|
242
|
+
...c.max !== void 0 ? [`${NS}.lessThanOrEqualToBigInt(${c.max}n)`] : [],
|
|
243
|
+
...rest
|
|
244
|
+
]);
|
|
245
|
+
case "boolean":
|
|
246
|
+
return `${NS}.Boolean`;
|
|
247
|
+
case "Date":
|
|
248
|
+
return dateExpr(mode, coerceDates);
|
|
249
|
+
case "Uint8Array":
|
|
250
|
+
return `${NS}.Uint8ArrayFromSelf`;
|
|
251
|
+
case "any":
|
|
252
|
+
return UNKNOWN_EXPR;
|
|
253
|
+
default:
|
|
254
|
+
return UNKNOWN_EXPR;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
function renderField(c, mode, coerceDates, checks, sets, lengths, cardinalities, applyDefault, narrowRef) {
|
|
258
|
+
let expr = exprForColumn(
|
|
259
|
+
c,
|
|
260
|
+
mode,
|
|
261
|
+
coerceDates,
|
|
262
|
+
checks,
|
|
263
|
+
sets,
|
|
264
|
+
lengths,
|
|
265
|
+
!!narrowRef && hasNoRuntimeType(c)
|
|
266
|
+
);
|
|
267
|
+
const dims = c.arrayDimensions ?? 0;
|
|
268
|
+
for (let i = 0; i < dims; i++) {
|
|
269
|
+
expr = `${NS}.Array(${expr})`;
|
|
270
|
+
if (i === dims - 1) expr = piped(expr, cardinalitySteps(c, cardinalities));
|
|
271
|
+
}
|
|
272
|
+
if (c.nullable && !isUnknownExpr(expr)) expr = `${NS}.NullOr(${expr})`;
|
|
273
|
+
if (narrowRef) expr = withNarrowedType(expr, narrowRef);
|
|
274
|
+
if (mode === "select") return expr;
|
|
275
|
+
const wantsDefault = mode === "insert" && applyDefault && c.defaultValue !== void 0;
|
|
276
|
+
if (wantsDefault) {
|
|
277
|
+
return `${NS}.optionalWith(${expr}, { default: () => ${JSON.stringify(c.defaultValue)} })`;
|
|
278
|
+
}
|
|
279
|
+
if (mode === "update" || c.nullable || c.hasDefault) return `${NS}.optional(${expr})`;
|
|
280
|
+
return expr;
|
|
281
|
+
}
|
|
282
|
+
function wantsRef(c, allColumns) {
|
|
283
|
+
return allColumns || hasNoRuntimeType(c);
|
|
284
|
+
}
|
|
285
|
+
function renderObjectShape(cols, mode, coerceDates, checks, sets, lengths, cardinalities, typedJson, applyDefaults) {
|
|
286
|
+
return cols.map((c) => {
|
|
287
|
+
const ref = typedJson && wantsRef(c, !!typedJson.allColumns) ? `(typeof ${typedJson.table}.$infer${typedJson.mode === "insert" ? "Insert" : "Select"})[${JSON.stringify(c.name)}]` : void 0;
|
|
288
|
+
const field = renderField(
|
|
289
|
+
c,
|
|
290
|
+
mode,
|
|
291
|
+
coerceDates,
|
|
292
|
+
checks,
|
|
293
|
+
sets,
|
|
294
|
+
lengths,
|
|
295
|
+
cardinalities,
|
|
296
|
+
applyDefaults,
|
|
297
|
+
ref
|
|
298
|
+
);
|
|
299
|
+
return ` ${JSON.stringify(c.name)}: ${field},`;
|
|
300
|
+
}).join("\n");
|
|
301
|
+
}
|
|
302
|
+
function rowSteps(rows, cols) {
|
|
303
|
+
const present = new Set(cols.map((c) => c.name));
|
|
304
|
+
return rows.filter((r) => present.has(r.left) && present.has(r.right)).map((r) => {
|
|
305
|
+
const l = `o[${JSON.stringify(r.left)}]`;
|
|
306
|
+
const rt = `o[${JSON.stringify(r.right)}]`;
|
|
307
|
+
const msg = `${r.name ? `${r.name}: ` : ""}${r.left} ${r.operator} ${r.right}`;
|
|
308
|
+
return `${NS}.filter((o) => ${l} == null || ${rt} == null || ${l} ${OPS[r.operator]} ${rt}, { description: ${JSON.stringify(msg)} })`;
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
function indentBlock(code, by = " ") {
|
|
312
|
+
return code.split("\n").map((line) => line ? by + line : line).join("\n");
|
|
313
|
+
}
|
|
314
|
+
function parsedChecksFor(table) {
|
|
315
|
+
const parsed = (table.checks ?? []).map((k) => parseCheck(k.expression, k.name));
|
|
316
|
+
return {
|
|
317
|
+
checks: parsed.flatMap((p) => p.ok ? p.checks : []),
|
|
318
|
+
sets: parsed.flatMap((p) => p.ok ? p.sets ?? [] : []),
|
|
319
|
+
rows: parsed.flatMap((p) => p.ok ? p.rows ?? [] : []),
|
|
320
|
+
lengths: parsed.flatMap((p) => p.ok ? p.lengths ?? [] : []),
|
|
321
|
+
cardinalities: parsed.flatMap((p) => p.ok ? p.cardinalities ?? [] : [])
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
function nestedNodeCols(node, mode) {
|
|
325
|
+
const all = mode === "insert" ? insertColumns(node.table) : selectColumns(node.table);
|
|
326
|
+
return nestedNodeColumns(all, node);
|
|
327
|
+
}
|
|
328
|
+
function nestedNodes(node, into = []) {
|
|
329
|
+
into.push(node);
|
|
330
|
+
for (const arm of node.arms) nestedNodes(arm.child, into);
|
|
331
|
+
return into;
|
|
332
|
+
}
|
|
333
|
+
function renderNestedObject(node, mode, coerceDates, typedJson, applyDefaults) {
|
|
334
|
+
const cols = nestedNodeCols(node, mode);
|
|
335
|
+
const { checks, sets, rows, lengths, cardinalities } = parsedChecksFor(node.table);
|
|
336
|
+
const tj = typedJson ? { table: node.table.tsName, mode, allColumns: typedJson.allColumns } : void 0;
|
|
337
|
+
const fields = renderObjectShape(
|
|
338
|
+
cols,
|
|
339
|
+
mode,
|
|
340
|
+
coerceDates,
|
|
341
|
+
checks,
|
|
342
|
+
sets,
|
|
343
|
+
lengths,
|
|
344
|
+
cardinalities,
|
|
345
|
+
tj,
|
|
346
|
+
applyDefaults
|
|
347
|
+
);
|
|
348
|
+
const arms = node.arms.map((arm) => {
|
|
349
|
+
const notes = nestedArmNotes(arm).map((n) => ` // ${n}
|
|
350
|
+
`).join("");
|
|
351
|
+
const child = renderNestedObject(arm.child, mode, coerceDates, typedJson, applyDefaults);
|
|
352
|
+
const inner = arm.single ? `${NS}.NullOr(
|
|
353
|
+
${indentBlock(indentBlock(child))}
|
|
354
|
+
)` : `${NS}.Array(
|
|
355
|
+
${indentBlock(indentBlock(child))}
|
|
356
|
+
)`;
|
|
357
|
+
return `${notes} ${JSON.stringify(arm.key)}: ${NS}.optional(${inner}),`;
|
|
358
|
+
});
|
|
359
|
+
const body = [fields, ...arms].filter(Boolean).join("\n");
|
|
360
|
+
return piped(`${NS}.Struct({
|
|
361
|
+
${body}
|
|
362
|
+
})`, rowSteps(rows, cols));
|
|
363
|
+
}
|
|
364
|
+
function renderNestedSchemas(table, affix, coerceDates, typedJson, applyDefaults, plans) {
|
|
365
|
+
const out = [];
|
|
366
|
+
for (const mode of ["insert", "select"]) {
|
|
367
|
+
const plan = plans[mode];
|
|
368
|
+
if (!plan) continue;
|
|
369
|
+
const name = nestedSchemaName(mode, table.tsName, affix);
|
|
370
|
+
const tname = nestedTypeName(mode, table.tsName, affix);
|
|
371
|
+
const expr = renderNestedObject(plan, mode, coerceDates, typedJson, applyDefaults);
|
|
372
|
+
out.push(
|
|
373
|
+
`export const ${name} = ${expr};
|
|
374
|
+
|
|
375
|
+
export type ${tname} = ${NS}.Schema.Type<typeof ${name}>;
|
|
376
|
+
|
|
377
|
+
export const ${STANDARD_PREFIX}${name} = ${NS}.standardSchemaV1(${name});`
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
return out.length ? `
|
|
381
|
+
${out.join("\n\n")}
|
|
382
|
+
` : "";
|
|
383
|
+
}
|
|
384
|
+
function nestedPlansFor(table, analysis, depth) {
|
|
385
|
+
const out = {};
|
|
386
|
+
for (const mode of ["insert", "select"]) {
|
|
387
|
+
if (mode === "insert" && table.readOnly) continue;
|
|
388
|
+
const plan = buildNestedPlan(table, analysis.tables, analysis.relations ?? [], mode, depth);
|
|
389
|
+
if (plan) out[mode] = plan;
|
|
390
|
+
}
|
|
391
|
+
return out;
|
|
392
|
+
}
|
|
393
|
+
function renderTableSchemas(table, affix, coerceDates, typedJson, applyDefaults = false, wantsDuplicateFinder = false, nested = {}) {
|
|
394
|
+
const T = table.tsName;
|
|
395
|
+
const insertCols = insertColumns(table);
|
|
396
|
+
const updateCols = updateColumns(table);
|
|
397
|
+
const selectCols = selectColumns(table);
|
|
398
|
+
const { checks, sets, rows, lengths, cardinalities } = parsedChecksFor(table);
|
|
399
|
+
const tj = typedJson ? { table: T, allColumns: typedJson.allColumns } : void 0;
|
|
400
|
+
const modes = [
|
|
401
|
+
["insert", insertCols],
|
|
402
|
+
["update", updateCols],
|
|
403
|
+
["select", selectCols]
|
|
404
|
+
];
|
|
405
|
+
const blocks = modes.map(([mode, cols]) => {
|
|
406
|
+
const name = schemaName(mode, T, affix);
|
|
407
|
+
const tname = typeName(mode, T, affix);
|
|
408
|
+
const body = renderObjectShape(
|
|
409
|
+
cols,
|
|
410
|
+
mode,
|
|
411
|
+
coerceDates,
|
|
412
|
+
checks,
|
|
413
|
+
sets,
|
|
414
|
+
lengths,
|
|
415
|
+
cardinalities,
|
|
416
|
+
// The update schema references the insert-side inferred types: both describe a value going
|
|
417
|
+
// in, and `$inferSelect` would name the post-default type for a column a write may omit.
|
|
418
|
+
tj ? { ...tj, mode: mode === "select" ? "select" : "insert" } : void 0,
|
|
419
|
+
applyDefaults
|
|
420
|
+
);
|
|
421
|
+
const expr = piped(`${NS}.Struct({
|
|
422
|
+
${body}
|
|
423
|
+
})`, rowSteps(rows, cols));
|
|
424
|
+
return `export const ${name} = ${expr};
|
|
425
|
+
|
|
426
|
+
export type ${tname} = ${NS}.Schema.Type<typeof ${name}>;
|
|
427
|
+
|
|
428
|
+
export const ${STANDARD_PREFIX}${name} = ${NS}.standardSchemaV1(${name});`;
|
|
429
|
+
});
|
|
430
|
+
const nestedByTable = ["insert", "select"].flatMap((m) => {
|
|
431
|
+
const plan = nested[m];
|
|
432
|
+
return plan ? nestedNodes(plan).map((n) => [n.table.tsName, nestedNodeCols(n, m)]) : [];
|
|
433
|
+
});
|
|
434
|
+
const nestedCols = nestedByTable.flatMap(([, cs]) => cs);
|
|
435
|
+
const referenced = /* @__PURE__ */ new Set();
|
|
436
|
+
if (typedJson) {
|
|
437
|
+
const all = !!typedJson.allColumns;
|
|
438
|
+
if ([...insertCols, ...updateCols, ...selectCols].some((c) => wantsRef(c, all))) {
|
|
439
|
+
referenced.add(T);
|
|
440
|
+
}
|
|
441
|
+
for (const [name, cs] of nestedByTable) {
|
|
442
|
+
if (cs.some((c) => wantsRef(c, all))) referenced.add(name);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
const schemaImport = referenced.size ? `import type { ${[...referenced].join(", ")} } from '${typedJson.schemaSpecifier}';
|
|
446
|
+
` : "";
|
|
447
|
+
const needsJson = !typedJson && [...insertCols, ...updateCols, ...selectCols, ...nestedCols].some(
|
|
448
|
+
(c) => c.shape?.kind === "json"
|
|
449
|
+
);
|
|
450
|
+
const finder = wantsDuplicateFinder ? renderDuplicateFinder(table, `findDuplicate${T}`, typeName("insert", T, affix)) : void 0;
|
|
451
|
+
const duplicates = finder ? `
|
|
452
|
+
${finder}
|
|
453
|
+
` : "";
|
|
454
|
+
const nestedCode = renderNestedSchemas(
|
|
455
|
+
table,
|
|
456
|
+
affix,
|
|
457
|
+
coerceDates,
|
|
458
|
+
typedJson,
|
|
459
|
+
applyDefaults,
|
|
460
|
+
nested
|
|
461
|
+
);
|
|
462
|
+
return `import * as ${NS} from 'effect/Schema';
|
|
463
|
+
${schemaImport}${needsJson ? `
|
|
464
|
+
${JSON_PREAMBLE}` : ""}
|
|
465
|
+
${blocks.join("\n\n")}
|
|
466
|
+
${nestedCode}${duplicates}`;
|
|
467
|
+
}
|
|
468
|
+
var EffectGenerator = class {
|
|
469
|
+
constructor(analysis) {
|
|
470
|
+
this.analysis = analysis;
|
|
471
|
+
this.library = "effect";
|
|
472
|
+
}
|
|
473
|
+
async generate(opts) {
|
|
474
|
+
const fs = await import("fs/promises");
|
|
475
|
+
const path = await import("path");
|
|
476
|
+
const out = path.resolve(process.cwd(), opts.outDir);
|
|
477
|
+
const files = [];
|
|
478
|
+
await fs.mkdir(out, { recursive: true });
|
|
479
|
+
const affix = resolveAffix(opts);
|
|
480
|
+
const coerceDates = opts.coerceDates ?? "input";
|
|
481
|
+
const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;
|
|
482
|
+
const wantsTypes = opts.typedJson || opts.typedColumns;
|
|
483
|
+
const typedJson = wantsTypes && opts.schemaPath ? {
|
|
484
|
+
schemaSpecifier: resolveConfiguredImport(
|
|
485
|
+
opts.schemaPath,
|
|
486
|
+
out,
|
|
487
|
+
process.cwd(),
|
|
488
|
+
opts.importExtension
|
|
489
|
+
),
|
|
490
|
+
allColumns: !!opts.typedColumns
|
|
491
|
+
} : void 0;
|
|
492
|
+
if (wantsTypes && !opts.schemaPath) {
|
|
493
|
+
console.warn(
|
|
494
|
+
"[drzl] typedJson was requested but the schema path is unknown, so json columns keep their wide type."
|
|
495
|
+
);
|
|
496
|
+
}
|
|
497
|
+
const nestedDepth = opts.nestedSchemas ? resolveNestedDepth(opts.nestedDepth, (m) => console.warn(m)) : 0;
|
|
498
|
+
for (const table of this.analysis.tables) {
|
|
499
|
+
const filePath = path.join(out, moduleFileName(table.tsName, fileSuffix));
|
|
500
|
+
const code = renderTableSchemas(
|
|
501
|
+
table,
|
|
502
|
+
affix,
|
|
503
|
+
coerceDates,
|
|
504
|
+
typedJson,
|
|
505
|
+
!!opts.applyDefaults,
|
|
506
|
+
!!opts?.duplicateFinder,
|
|
507
|
+
opts.nestedSchemas ? nestedPlansFor(table, this.analysis, nestedDepth) : {}
|
|
508
|
+
);
|
|
509
|
+
const formatted = await formatCode(
|
|
510
|
+
buildHeader(opts.outputHeader) + code,
|
|
511
|
+
filePath,
|
|
512
|
+
opts.format
|
|
513
|
+
);
|
|
514
|
+
await fs.writeFile(filePath, formatted, "utf8");
|
|
515
|
+
files.push(filePath);
|
|
516
|
+
}
|
|
517
|
+
const indexPath = path.join(out, "index.ts");
|
|
518
|
+
const indexFormatted = await formatCode(
|
|
519
|
+
buildHeader(opts.outputHeader) + this.defaultIndex(this.analysis, opts),
|
|
520
|
+
indexPath,
|
|
521
|
+
opts.format
|
|
522
|
+
);
|
|
523
|
+
await fs.writeFile(indexPath, indexFormatted, "utf8");
|
|
524
|
+
files.push(indexPath);
|
|
525
|
+
return files;
|
|
526
|
+
}
|
|
527
|
+
renderTable(table, opts) {
|
|
528
|
+
return renderTableSchemas(
|
|
529
|
+
table,
|
|
530
|
+
resolveAffix(opts),
|
|
531
|
+
opts?.coerceDates ?? "input",
|
|
532
|
+
void 0,
|
|
533
|
+
!!opts?.applyDefaults,
|
|
534
|
+
!!opts?.duplicateFinder
|
|
535
|
+
);
|
|
536
|
+
}
|
|
537
|
+
defaultIndex(analysis, opts) {
|
|
538
|
+
const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;
|
|
539
|
+
return analysis.tables.map(
|
|
540
|
+
(t) => `export * from '${moduleSpecifier(t.tsName, fileSuffix, opts.importExtension)}';`
|
|
541
|
+
).join("\n") + "\n";
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
var index_default = EffectGenerator;
|
|
545
|
+
function buildHeader(h) {
|
|
546
|
+
if (h && h.enabled === false) return "";
|
|
547
|
+
const text = h?.text?.trim();
|
|
548
|
+
const lines = text ? text.split(/\r?\n/).map((l) => `// ${l}`) : [
|
|
549
|
+
"// Generated by DRZL (@drzl/*)",
|
|
550
|
+
"// Generated output is granted to you under your project's license.",
|
|
551
|
+
"// You may use, copy, modify, and distribute without attribution."
|
|
552
|
+
];
|
|
553
|
+
return lines.join("\n") + "\n\n";
|
|
554
|
+
}
|
|
555
|
+
export {
|
|
556
|
+
EffectGenerator,
|
|
557
|
+
index_default as default
|
|
558
|
+
};
|
|
559
|
+
//# sourceMappingURL=dist-CZDVFYFW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../generator-effect/dist/index.js"],"sourcesContent":["// src/index.ts\nimport {\n buildNestedPlan,\n formatCode,\n nestedArmNotes,\n nestedNodeColumns,\n nestedSchemaName,\n nestedTypeName,\n resolveNestedDepth,\n CODEPOINT_LENGTH,\n COERCIBLE_DATE_STRING,\n COLUMN_FORMATS,\n insertColumns,\n isIntegerColumn,\n moduleFileName,\n moduleSpecifier,\n nonFiniteAccepted,\n parseCheck,\n parsesToADate,\n renderDuplicateFinder,\n resolveAffix,\n resolveConfiguredImport,\n schemaName,\n selectColumns,\n typeName,\n updateColumns\n} from \"@drzl/validation-core\";\nvar DEFAULT_FILE_SUFFIX = \".effect.ts\";\nvar STANDARD_PREFIX = \"Standard\";\nvar NS = \"Schema\";\nvar OPS = {\n \">=\": \">=\",\n \">\": \">\",\n \"<=\": \"<=\",\n \"<\": \"<\",\n \"=\": \"===\",\n \"<>\": \"!==\"\n};\nfunction filter(expr, description) {\n return `${NS}.filter((v) => ${expr}, { description: ${JSON.stringify(description)} })`;\n}\nfunction piped(base, steps) {\n return steps.length ? `${base}.pipe(${steps.join(\", \")})` : base;\n}\nvar JSON_CONST = \"DrzlJsonValue\";\nvar JSON_PREAMBLE = `type ${JSON_CONST}Type =\n | string\n | number\n | boolean\n | null\n | readonly ${JSON_CONST}Type[]\n | { readonly [key: string]: ${JSON_CONST}Type };\n\nconst ${JSON_CONST}: ${NS}.Schema<${JSON_CONST}Type, unknown> = ${NS}.suspend(() =>\n ${NS}.Union(\n ${NS}.String,\n ${NS}.Finite,\n ${NS}.Boolean,\n ${NS}.Null,\n ${NS}.Array(${JSON_CONST}),\n // The plain-object test comes before the record, not after it. \\`Schema.Record\\` rebuilds its\n // output, so a check placed after it inspects that new object and reports every input as\n // plain. A Date sailed through: it has no own enumerable keys, so the record accepted it and\n // rebuilt it as \\`{}\\`.\n ${NS}.Unknown.pipe(\n ${NS}.filter(\n (o) => {\n if (typeof o !== 'object' || o === null || Array.isArray(o)) return false;\n const p = Object.getPrototypeOf(o);\n return p === Object.prototype || p === null;\n },\n { description: 'a plain object' }\n ),\n ${NS}.compose(${NS}.Record({ key: ${NS}.String, value: ${JSON_CONST} }), { strict: false })\n )\n )\n);\n`;\nvar UNKNOWN_EXPR = `${NS}.Unknown`;\nfunction isUnknownExpr(expr) {\n return expr === UNKNOWN_EXPR;\n}\nfunction withNarrowedType(expr, ref) {\n return `${expr} as unknown as ${NS}.Schema<${ref}>`;\n}\nfunction numericBounds(c, checks) {\n let lo = c.min !== void 0 ? { fn: \"greaterThanOrEqualTo\", value: c.min } : void 0;\n let hi = c.max !== void 0 ? { fn: \"lessThanOrEqualTo\", value: c.max } : void 0;\n for (const k of checks.filter((x) => x.column === c.name && x.kind === \"number\")) {\n if (k.operator === \">=\") lo = { fn: \"greaterThanOrEqualTo\", value: k.value };\n else if (k.operator === \">\") lo = { fn: \"greaterThan\", value: k.value };\n else if (k.operator === \"<=\") hi = { fn: \"lessThanOrEqualTo\", value: k.value };\n else if (k.operator === \"<\") hi = { fn: \"lessThan\", value: k.value };\n }\n return [lo, hi].filter(Boolean).map((x) => `${NS}.${x.fn}(${x.value})`);\n}\nfunction foldedIntoBounds(c, checks) {\n if (c.arrayDimensions || c.shape) return /* @__PURE__ */ new Set();\n if (c.tsType !== \"number\" && c.tsType !== \"bigint\") return /* @__PURE__ */ new Set();\n return new Set(\n checks.filter(\n (k) => k.column === c.name && k.kind === \"number\" && k.operator !== \"=\" && k.operator !== \"<>\"\n )\n );\n}\nfunction nonFiniteBranches(c) {\n const { nan, infinity } = nonFiniteAccepted(c);\n return [\n ...nan ? [`${NS}.Number.pipe(${filter(\"Number.isNaN(v)\", \"NaN, which this column stores\")})`] : [],\n ...infinity ? [`${NS}.Literal(Infinity, -Infinity)`] : []\n ];\n}\nfunction withNonFinite(c, base) {\n const branches = nonFiniteBranches(c);\n return branches.length ? `${NS}.Union(${base}, ${branches.join(\", \")})` : base;\n}\nfunction dateExpr(mode, coerceDates) {\n const plain = `${NS}.ValidDateFromSelf`;\n if (coerceDates === \"none\") return plain;\n const fromString = piped(`${NS}.String`, [\n `${NS}.pattern(new RegExp(${JSON.stringify(COERCIBLE_DATE_STRING)}))`,\n filter(parsesToADate(\"new Date(v)\"), \"a date the runtime can parse\")\n ]);\n const fromNumber = piped(`${NS}.Number`, [\n filter(parsesToADate(\"new Date(v)\"), \"a date the runtime can parse\")\n ]);\n const union = `${NS}.Union(${plain}, ${fromString}, ${fromNumber})`;\n if (coerceDates === \"all\") return union;\n return mode === \"select\" ? plain : union;\n}\nfunction capSteps(c, mode) {\n const steps = [];\n if (c.shape?.kind === \"byteString\") {\n const n = c.shape.length;\n if (!n) return steps;\n return mode === \"select\" ? [filter(`${CODEPOINT_LENGTH} <= ${n}`, `at most ${n} characters`)] : [filter(`new TextEncoder().encode(v).length <= ${n}`, `at most ${n} bytes`)];\n }\n if (c.maxLength) {\n steps.push(\n filter(`${CODEPOINT_LENGTH} <= ${c.maxLength}`, `at most ${c.maxLength} characters`)\n );\n }\n if (c.maxBytes) {\n steps.push(\n filter(`new TextEncoder().encode(v).length <= ${c.maxBytes}`, `at most ${c.maxBytes} bytes`)\n );\n }\n return steps;\n}\nfunction lengthSteps(c, lengths) {\n if (c.arrayDimensions || c.shape) return [];\n return lengths.filter((k) => k.column === c.name).map(\n (k) => filter(\n `${CODEPOINT_LENGTH} ${OPS[k.operator]} ${k.value}`,\n `${k.name ? `${k.name}: ` : \"\"}length(${c.name}) ${k.operator} ${k.value}`\n )\n );\n}\nfunction cardinalitySteps(c, cardinalities) {\n if (!c.arrayDimensions) return [];\n return cardinalities.filter((k) => k.column === c.name).map(\n (k) => filter(\n `v.length ${OPS[k.operator]} ${k.value}`,\n `${k.name ? `${k.name}: ` : \"\"}cardinality(${c.name}) ${k.operator} ${k.value}`\n )\n );\n}\nfunction checkSteps(c, checks) {\n if (c.arrayDimensions || c.shape) return [];\n const folded = foldedIntoBounds(c, checks);\n return checks.filter((k) => k.column === c.name && !folded.has(k)).map((k) => {\n const literal = k.kind === \"string\" ? JSON.stringify(k.value) : k.value;\n return filter(\n `v ${OPS[k.operator]} ${literal}`,\n `${k.name ? `${k.name}: ` : \"\"}${c.name} ${k.operator} ${k.value}`\n );\n });\n}\nfunction hasNoRuntimeType(c) {\n return c.tsType === \"any\" || c.shape?.kind === \"custom\" || c.shape?.kind === \"json\";\n}\nfunction shapeExpr(c, mode, replaced = false) {\n const s = c.shape;\n if (!s) return void 0;\n switch (s.kind) {\n case \"json\":\n return replaced ? UNKNOWN_EXPR : JSON_CONST;\n case \"custom\":\n return UNKNOWN_EXPR;\n case \"buffer\":\n return `${NS}.Uint8ArrayFromSelf`;\n case \"tuple\":\n return `${NS}.Tuple(${Array.from({ length: s.length }, () => `${NS}.Number`).join(\", \")})`;\n case \"numberObject\":\n return `${NS}.Struct({ ${s.fields.map((f) => `${f}: ${NS}.Number`).join(\", \")} })`;\n case \"numberVector\":\n return piped(\n `${NS}.Array(${NS}.Number)`,\n s.length ? [filter(`v.length === ${s.length}`, `exactly ${s.length} elements`)] : []\n );\n case \"bitstring\":\n return piped(`${NS}.String`, [\n `${NS}.pattern(/^[01]*$/)`,\n ...s.length ? [\n s.exact ? filter(`v.length === ${s.length}`, `exactly ${s.length} binary digits`) : filter(`v.length <= ${s.length}`, `at most ${s.length} binary digits`)\n ] : []\n ]);\n case \"byteString\":\n return piped(`${NS}.String`, capSteps(c, mode));\n }\n}\nfunction exprForColumn(c, mode, coerceDates, checks, sets, lengths, replaced) {\n const shaped = shapeExpr(c, mode, replaced);\n if (shaped) return shaped;\n const set = sets.find((x) => x.column === c.name);\n if (set) {\n const values = set.values.map((v) => set.kind === \"string\" ? JSON.stringify(v) : v);\n return `${NS}.Literal(${values.join(\", \")})`;\n }\n if (c.arrayDimensions) checks = [];\n if (c.enumValues && c.enumValues.length) {\n return `${NS}.Literal(${c.enumValues.map((v) => JSON.stringify(v)).join(\", \")})`;\n }\n const eq = checks.find((k) => k.column === c.name && k.operator === \"=\");\n if (eq && !c.shape) {\n return `${NS}.Literal(${eq.kind === \"string\" ? JSON.stringify(eq.value) : eq.value})`;\n }\n const rest = [...checkSteps(c, checks), ...lengthSteps(c, lengths)];\n switch (c.tsType) {\n case \"string\": {\n const base = c.format === \"uuid\" ? `${NS}.UUID` : `${NS}.String`;\n const pattern = c.format && c.format !== \"uuid\" && COLUMN_FORMATS[c.format] ? [`${NS}.pattern(new RegExp(${JSON.stringify(COLUMN_FORMATS[c.format])}))`] : [];\n return piped(base, [...pattern, ...capSteps(c, mode), ...rest]);\n }\n case \"number\": {\n const base = isIntegerColumn(c) ? `${NS}.Int` : `${NS}.Finite`;\n return withNonFinite(c, piped(base, [...numericBounds(c, checks), ...rest]));\n }\n case \"bigint\":\n return piped(`${NS}.BigIntFromSelf`, [\n ...c.min !== void 0 ? [`${NS}.greaterThanOrEqualToBigInt(${c.min}n)`] : [],\n ...c.max !== void 0 ? [`${NS}.lessThanOrEqualToBigInt(${c.max}n)`] : [],\n ...rest\n ]);\n case \"boolean\":\n return `${NS}.Boolean`;\n case \"Date\":\n return dateExpr(mode, coerceDates);\n case \"Uint8Array\":\n return `${NS}.Uint8ArrayFromSelf`;\n case \"any\":\n return UNKNOWN_EXPR;\n default:\n return UNKNOWN_EXPR;\n }\n}\nfunction renderField(c, mode, coerceDates, checks, sets, lengths, cardinalities, applyDefault, narrowRef) {\n let expr = exprForColumn(\n c,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n !!narrowRef && hasNoRuntimeType(c)\n );\n const dims = c.arrayDimensions ?? 0;\n for (let i = 0; i < dims; i++) {\n expr = `${NS}.Array(${expr})`;\n if (i === dims - 1) expr = piped(expr, cardinalitySteps(c, cardinalities));\n }\n if (c.nullable && !isUnknownExpr(expr)) expr = `${NS}.NullOr(${expr})`;\n if (narrowRef) expr = withNarrowedType(expr, narrowRef);\n if (mode === \"select\") return expr;\n const wantsDefault = mode === \"insert\" && applyDefault && c.defaultValue !== void 0;\n if (wantsDefault) {\n return `${NS}.optionalWith(${expr}, { default: () => ${JSON.stringify(c.defaultValue)} })`;\n }\n if (mode === \"update\" || c.nullable || c.hasDefault) return `${NS}.optional(${expr})`;\n return expr;\n}\nfunction wantsRef(c, allColumns) {\n return allColumns || hasNoRuntimeType(c);\n}\nfunction renderObjectShape(cols, mode, coerceDates, checks, sets, lengths, cardinalities, typedJson, applyDefaults) {\n return cols.map((c) => {\n const ref = typedJson && wantsRef(c, !!typedJson.allColumns) ? `(typeof ${typedJson.table}.$infer${typedJson.mode === \"insert\" ? \"Insert\" : \"Select\"})[${JSON.stringify(c.name)}]` : void 0;\n const field = renderField(\n c,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n cardinalities,\n applyDefaults,\n ref\n );\n return ` ${JSON.stringify(c.name)}: ${field},`;\n }).join(\"\\n\");\n}\nfunction rowSteps(rows, cols) {\n const present = new Set(cols.map((c) => c.name));\n return rows.filter((r) => present.has(r.left) && present.has(r.right)).map((r) => {\n const l = `o[${JSON.stringify(r.left)}]`;\n const rt = `o[${JSON.stringify(r.right)}]`;\n const msg = `${r.name ? `${r.name}: ` : \"\"}${r.left} ${r.operator} ${r.right}`;\n return `${NS}.filter((o) => ${l} == null || ${rt} == null || ${l} ${OPS[r.operator]} ${rt}, { description: ${JSON.stringify(msg)} })`;\n });\n}\nfunction indentBlock(code, by = \" \") {\n return code.split(\"\\n\").map((line) => line ? by + line : line).join(\"\\n\");\n}\nfunction parsedChecksFor(table) {\n const parsed = (table.checks ?? []).map((k) => parseCheck(k.expression, k.name));\n return {\n checks: parsed.flatMap((p) => p.ok ? p.checks : []),\n sets: parsed.flatMap((p) => p.ok ? p.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 nestedNodeCols(node, mode) {\n const all = mode === \"insert\" ? insertColumns(node.table) : selectColumns(node.table);\n return nestedNodeColumns(all, node);\n}\nfunction nestedNodes(node, into = []) {\n into.push(node);\n for (const arm of node.arms) nestedNodes(arm.child, into);\n return into;\n}\nfunction renderNestedObject(node, mode, coerceDates, typedJson, applyDefaults) {\n const cols = nestedNodeCols(node, mode);\n const { checks, sets, rows, lengths, cardinalities } = parsedChecksFor(node.table);\n const tj = typedJson ? { table: node.table.tsName, mode, allColumns: typedJson.allColumns } : void 0;\n const fields = renderObjectShape(\n cols,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n cardinalities,\n tj,\n applyDefaults\n );\n const arms = node.arms.map((arm) => {\n const notes = nestedArmNotes(arm).map((n) => ` // ${n}\n`).join(\"\");\n const child = renderNestedObject(arm.child, mode, coerceDates, typedJson, applyDefaults);\n const inner = arm.single ? `${NS}.NullOr(\n${indentBlock(indentBlock(child))}\n )` : `${NS}.Array(\n${indentBlock(indentBlock(child))}\n )`;\n return `${notes} ${JSON.stringify(arm.key)}: ${NS}.optional(${inner}),`;\n });\n const body = [fields, ...arms].filter(Boolean).join(\"\\n\");\n return piped(`${NS}.Struct({\n${body}\n})`, rowSteps(rows, cols));\n}\nfunction renderNestedSchemas(table, affix, coerceDates, typedJson, applyDefaults, plans) {\n const out = [];\n for (const mode of [\"insert\", \"select\"]) {\n const plan = plans[mode];\n if (!plan) continue;\n const name = nestedSchemaName(mode, table.tsName, affix);\n const tname = nestedTypeName(mode, table.tsName, affix);\n const expr = renderNestedObject(plan, mode, coerceDates, typedJson, applyDefaults);\n out.push(\n `export const ${name} = ${expr};\n\nexport type ${tname} = ${NS}.Schema.Type<typeof ${name}>;\n\nexport const ${STANDARD_PREFIX}${name} = ${NS}.standardSchemaV1(${name});`\n );\n }\n return out.length ? `\n${out.join(\"\\n\\n\")}\n` : \"\";\n}\nfunction nestedPlansFor(table, analysis, depth) {\n const out = {};\n for (const mode of [\"insert\", \"select\"]) {\n if (mode === \"insert\" && table.readOnly) continue;\n const plan = buildNestedPlan(table, analysis.tables, analysis.relations ?? [], mode, depth);\n if (plan) out[mode] = plan;\n }\n return out;\n}\nfunction renderTableSchemas(table, affix, coerceDates, typedJson, applyDefaults = false, wantsDuplicateFinder = false, nested = {}) {\n const T = table.tsName;\n const insertCols = insertColumns(table);\n const updateCols = updateColumns(table);\n const selectCols = selectColumns(table);\n const { checks, sets, rows, lengths, cardinalities } = parsedChecksFor(table);\n const tj = typedJson ? { table: T, allColumns: typedJson.allColumns } : void 0;\n const modes = [\n [\"insert\", insertCols],\n [\"update\", updateCols],\n [\"select\", selectCols]\n ];\n const blocks = modes.map(([mode, cols]) => {\n const name = schemaName(mode, T, affix);\n const tname = typeName(mode, T, affix);\n const body = renderObjectShape(\n cols,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n cardinalities,\n // The update schema references the insert-side inferred types: both describe a value going\n // in, and `$inferSelect` would name the post-default type for a column a write may omit.\n tj ? { ...tj, mode: mode === \"select\" ? \"select\" : \"insert\" } : void 0,\n applyDefaults\n );\n const expr = piped(`${NS}.Struct({\n${body}\n})`, rowSteps(rows, cols));\n return `export const ${name} = ${expr};\n\nexport type ${tname} = ${NS}.Schema.Type<typeof ${name}>;\n\nexport const ${STANDARD_PREFIX}${name} = ${NS}.standardSchemaV1(${name});`;\n });\n const nestedByTable = [\"insert\", \"select\"].flatMap((m) => {\n const plan = nested[m];\n return plan ? nestedNodes(plan).map((n) => [n.table.tsName, nestedNodeCols(n, m)]) : [];\n });\n const nestedCols = nestedByTable.flatMap(([, cs]) => cs);\n const referenced = /* @__PURE__ */ new Set();\n if (typedJson) {\n const all = !!typedJson.allColumns;\n if ([...insertCols, ...updateCols, ...selectCols].some((c) => wantsRef(c, all))) {\n referenced.add(T);\n }\n for (const [name, cs] of nestedByTable) {\n if (cs.some((c) => wantsRef(c, all))) referenced.add(name);\n }\n }\n const schemaImport = referenced.size ? `import type { ${[...referenced].join(\", \")} } from '${typedJson.schemaSpecifier}';\n` : \"\";\n const needsJson = !typedJson && [...insertCols, ...updateCols, ...selectCols, ...nestedCols].some(\n (c) => c.shape?.kind === \"json\"\n );\n const finder = wantsDuplicateFinder ? renderDuplicateFinder(table, `findDuplicate${T}`, typeName(\"insert\", T, affix)) : void 0;\n const duplicates = finder ? `\n${finder}\n` : \"\";\n const nestedCode = renderNestedSchemas(\n table,\n affix,\n coerceDates,\n typedJson,\n applyDefaults,\n nested\n );\n return `import * as ${NS} from 'effect/Schema';\n${schemaImport}${needsJson ? `\n${JSON_PREAMBLE}` : \"\"}\n${blocks.join(\"\\n\\n\")}\n${nestedCode}${duplicates}`;\n}\nvar EffectGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n this.library = \"effect\";\n }\n async generate(opts) {\n const fs = await import(\"fs/promises\");\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 coerceDates = opts.coerceDates ?? \"input\";\n const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;\n const wantsTypes = opts.typedJson || opts.typedColumns;\n const typedJson = wantsTypes && opts.schemaPath ? {\n schemaSpecifier: resolveConfiguredImport(\n opts.schemaPath,\n out,\n process.cwd(),\n opts.importExtension\n ),\n allColumns: !!opts.typedColumns\n } : void 0;\n if (wantsTypes && !opts.schemaPath) {\n console.warn(\n \"[drzl] typedJson was requested but the schema path is unknown, so json columns keep their wide type.\"\n );\n }\n const nestedDepth = opts.nestedSchemas ? resolveNestedDepth(opts.nestedDepth, (m) => console.warn(m)) : 0;\n for (const table of this.analysis.tables) {\n const filePath = path.join(out, moduleFileName(table.tsName, fileSuffix));\n const code = renderTableSchemas(\n table,\n affix,\n coerceDates,\n typedJson,\n !!opts.applyDefaults,\n !!opts?.duplicateFinder,\n opts.nestedSchemas ? nestedPlansFor(table, this.analysis, nestedDepth) : {}\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 const indexPath = path.join(out, \"index.ts\");\n const indexFormatted = await formatCode(\n buildHeader(opts.outputHeader) + this.defaultIndex(this.analysis, opts),\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 renderTableSchemas(\n table,\n resolveAffix(opts),\n opts?.coerceDates ?? \"input\",\n void 0,\n !!opts?.applyDefaults,\n !!opts?.duplicateFinder\n );\n }\n defaultIndex(analysis, opts) {\n const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;\n return analysis.tables.map(\n (t) => `export * from '${moduleSpecifier(t.tsName, fileSuffix, opts.importExtension)}';`\n ).join(\"\\n\") + \"\\n\";\n }\n};\nvar index_default = EffectGenerator;\nfunction buildHeader(h) {\n if (h && h.enabled === false) return \"\";\n const text = h?.text?.trim();\n const lines = text ? text.split(/\\r?\\n/).map((l) => `// ${l}`) : [\n \"// Generated by DRZL (@drzl/*)\",\n \"// Generated output is granted to you under your project's license.\",\n \"// You may use, copy, modify, and distribute without attribution.\"\n ];\n return lines.join(\"\\n\") + \"\\n\\n\";\n}\nexport {\n EffectGenerator,\n index_default as default\n};\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@drzl/cli",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.19.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -29,14 +29,14 @@
|
|
|
29
29
|
"jiti": "^2.7.0",
|
|
30
30
|
"ora": "^9.4.1",
|
|
31
31
|
"zod": "^4.4.3",
|
|
32
|
+
"@drzl/analyzer": "^1.18.0",
|
|
32
33
|
"@drzl/generator-arktype": "^3.14.0",
|
|
33
|
-
"@drzl/analyzer": "^1.17.7",
|
|
34
34
|
"@drzl/generator-orpc": "^2.8.0",
|
|
35
35
|
"@drzl/generator-service": "^2.4.0",
|
|
36
36
|
"@drzl/generator-typebox": "^0.11.0",
|
|
37
37
|
"@drzl/generator-valibot": "^3.17.0",
|
|
38
|
-
"@drzl/
|
|
39
|
-
"@drzl/
|
|
38
|
+
"@drzl/generator-zod": "^3.18.0",
|
|
39
|
+
"@drzl/validation-core": "^3.18.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"drizzle-orm": "^0.45.2",
|
|
@@ -62,8 +62,9 @@
|
|
|
62
62
|
"url": "https://github.com/sponsors/omar-dulaimi"
|
|
63
63
|
},
|
|
64
64
|
"optionalDependencies": {
|
|
65
|
-
"@drzl/generator-
|
|
66
|
-
"@drzl/generator-json-schema": "^0.6.0"
|
|
65
|
+
"@drzl/generator-effect": "^0.2.0",
|
|
66
|
+
"@drzl/generator-json-schema": "^0.6.0",
|
|
67
|
+
"@drzl/generator-trpc": "^0.2.0"
|
|
67
68
|
},
|
|
68
69
|
"scripts": {
|
|
69
70
|
"build": "tsup src/cli.ts src/config.ts --format esm,cjs --sourcemap --dts --clean",
|