ormbridge 0.3.0 → 0.5.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/README.md +239 -37
- package/dist/cliRunner.js +14 -1
- package/dist/cliRunner.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/emitters/drizzle.d.ts +19 -0
- package/dist/emitters/drizzle.js +1337 -0
- package/dist/emitters/drizzle.js.map +1 -0
- package/dist/emitters/jsonSchema.d.ts +20 -0
- package/dist/emitters/jsonSchema.js +503 -0
- package/dist/emitters/jsonSchema.js.map +1 -0
- package/dist/emitters/sqlDdl.d.ts +29 -0
- package/dist/emitters/sqlDdl.js +1741 -0
- package/dist/emitters/sqlDdl.js.map +1 -0
- package/dist/emitters/sqlalchemy.d.ts +30 -0
- package/dist/emitters/sqlalchemy.js +1725 -0
- package/dist/emitters/sqlalchemy.js.map +1 -0
- package/dist/emitters/typeorm.js +53 -1
- package/dist/emitters/typeorm.js.map +1 -1
- package/dist/emitters/zod.d.ts +40 -0
- package/dist/emitters/zod.js +498 -0
- package/dist/emitters/zod.js.map +1 -0
- package/dist/formats.d.ts +11 -1
- package/dist/formats.js +84 -0
- package/dist/formats.js.map +1 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/io.js +82 -8
- package/dist/io.js.map +1 -1
- package/dist/parsers/drizzle.d.ts +12 -0
- package/dist/parsers/drizzle.js +2040 -0
- package/dist/parsers/drizzle.js.map +1 -0
- package/dist/parsers/jsonSchema.d.ts +21 -0
- package/dist/parsers/jsonSchema.js +1432 -0
- package/dist/parsers/jsonSchema.js.map +1 -0
- package/dist/parsers/pythonSyntax.d.ts +7 -1
- package/dist/parsers/pythonSyntax.js +47 -8
- package/dist/parsers/pythonSyntax.js.map +1 -1
- package/dist/parsers/sqlDdl.d.ts +18 -0
- package/dist/parsers/sqlDdl.js +2302 -0
- package/dist/parsers/sqlDdl.js.map +1 -0
- package/dist/parsers/sqlSyntax.d.ts +79 -0
- package/dist/parsers/sqlSyntax.js +698 -0
- package/dist/parsers/sqlSyntax.js.map +1 -0
- package/dist/parsers/sqlTypes.d.ts +53 -0
- package/dist/parsers/sqlTypes.js +742 -0
- package/dist/parsers/sqlTypes.js.map +1 -0
- package/dist/parsers/sqlalchemy.d.ts +12 -0
- package/dist/parsers/sqlalchemy.js +3191 -0
- package/dist/parsers/sqlalchemy.js.map +1 -0
- package/dist/parsers/typeorm.js +22 -7
- package/dist/parsers/typeorm.js.map +1 -1
- package/dist/prismaOnlyConstructs.d.ts +2 -2
- package/dist/prismaOnlyConstructs.js +5 -5
- package/dist/prismaOnlyConstructs.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
import { prismaOnlyWarnings } from '../prismaOnlyConstructs.js';
|
|
2
|
+
import { findModel } from '../ir.js';
|
|
3
|
+
import { toCamelCase, toSnakeCase } from '../naming.js';
|
|
4
|
+
const IDENTIFIER_PATTERN = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
5
|
+
const MAX_KEY_DEPTH = 5;
|
|
6
|
+
/** Prisma default functions that the database fills in from a counter. */
|
|
7
|
+
const COUNTER_FUNCTIONS = new Set([
|
|
8
|
+
'auto()',
|
|
9
|
+
'sequence()',
|
|
10
|
+
]);
|
|
11
|
+
/** Suffixes of the names written for a model, besides the model's own type name. */
|
|
12
|
+
const MODEL_SUFFIXES = [
|
|
13
|
+
'Schema',
|
|
14
|
+
'Create',
|
|
15
|
+
'CreateSchema',
|
|
16
|
+
'Update',
|
|
17
|
+
'UpdateSchema',
|
|
18
|
+
'WithRelations',
|
|
19
|
+
'WithRelationsSchema',
|
|
20
|
+
];
|
|
21
|
+
export function emitZod(schema, options) {
|
|
22
|
+
const context = {
|
|
23
|
+
schema,
|
|
24
|
+
options,
|
|
25
|
+
dates: options.dates ?? 'coerce',
|
|
26
|
+
bigints: options.bigints ?? 'string',
|
|
27
|
+
warnings: prismaOnlyWarnings(schema, true),
|
|
28
|
+
names: new Map(),
|
|
29
|
+
inverseNames: new Map(),
|
|
30
|
+
typeNames: new Map(),
|
|
31
|
+
};
|
|
32
|
+
allocateTypeNames(context);
|
|
33
|
+
allocateMemberNames(context);
|
|
34
|
+
const reverseMembers = new Map();
|
|
35
|
+
const forward = new Map();
|
|
36
|
+
for (const model of schema.models) {
|
|
37
|
+
forward.set(model.name, buildForwardMembers(context, model, reverseMembers));
|
|
38
|
+
}
|
|
39
|
+
const blocks = [];
|
|
40
|
+
for (const enumDefinition of schema.enums) {
|
|
41
|
+
blocks.push(emitEnum(context, enumDefinition));
|
|
42
|
+
}
|
|
43
|
+
for (const model of schema.models) {
|
|
44
|
+
const members = forward.get(model.name) ?? { scalars: [], relations: [] };
|
|
45
|
+
blocks.push(emitModel(context, model, members.scalars, [
|
|
46
|
+
...members.relations,
|
|
47
|
+
...(reverseMembers.get(model.name) ?? []),
|
|
48
|
+
]));
|
|
49
|
+
}
|
|
50
|
+
if (blocks.length === 0) {
|
|
51
|
+
return { text: '', warnings: context.warnings };
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
text: `import { z } from 'zod';\n\n${blocks.join('\n\n')}\n`,
|
|
55
|
+
warnings: context.warnings,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Names
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
function quote(value) {
|
|
62
|
+
const escaped = value.replace(/\\/g, '\\\\').replace(/\n/g, '\\n');
|
|
63
|
+
return `'${escaped.replace(/'/g, "\\'")}'`;
|
|
64
|
+
}
|
|
65
|
+
/** Writes a property or enum member name, quoting it when it is not a valid identifier. */
|
|
66
|
+
function memberKey(name) {
|
|
67
|
+
return IDENTIFIER_PATTERN.test(name) ? name : quote(name);
|
|
68
|
+
}
|
|
69
|
+
function typeIdentifier(context, description, raw) {
|
|
70
|
+
if (IDENTIFIER_PATTERN.test(raw)) {
|
|
71
|
+
return raw;
|
|
72
|
+
}
|
|
73
|
+
const replaced = raw.replace(/[^A-Za-z0-9_$]/g, '_');
|
|
74
|
+
const safe = /^[0-9]/.test(replaced) ? `_${replaced}` : replaced;
|
|
75
|
+
const result = safe === '' ? '_' : safe;
|
|
76
|
+
context.warnings.push(`${description}: "${raw}" is not a valid TypeScript identifier; it was written as "${result}".`);
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
function uniqueName(baseName, used) {
|
|
80
|
+
let candidate = baseName;
|
|
81
|
+
let suffix = 2;
|
|
82
|
+
while (used.has(candidate)) {
|
|
83
|
+
candidate = `${baseName}${suffix}`;
|
|
84
|
+
suffix += 1;
|
|
85
|
+
}
|
|
86
|
+
used.add(candidate);
|
|
87
|
+
return candidate;
|
|
88
|
+
}
|
|
89
|
+
function propertyName(context, rawName) {
|
|
90
|
+
return context.options.camelFields ? toCamelCase(rawName) : rawName;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Picks the base name of a type so that none of the names derived from it (`<Base>Schema`, ...)
|
|
94
|
+
* is taken. The derived names are reserved together with the base.
|
|
95
|
+
*/
|
|
96
|
+
function reserveBase(base, suffixes, used) {
|
|
97
|
+
let candidate = base;
|
|
98
|
+
let counter = 2;
|
|
99
|
+
const clashes = (name) => used.has(name) ||
|
|
100
|
+
suffixes.some((suffix) => used.has(name + suffix));
|
|
101
|
+
while (clashes(candidate)) {
|
|
102
|
+
candidate = `${base}${counter}`;
|
|
103
|
+
counter += 1;
|
|
104
|
+
}
|
|
105
|
+
used.add(candidate);
|
|
106
|
+
for (const suffix of suffixes) {
|
|
107
|
+
used.add(candidate + suffix);
|
|
108
|
+
}
|
|
109
|
+
return candidate;
|
|
110
|
+
}
|
|
111
|
+
function allocateTypeNames(context) {
|
|
112
|
+
// "z" is the imported namespace.
|
|
113
|
+
const used = new Set(['z']);
|
|
114
|
+
for (const enumDefinition of context.schema.enums) {
|
|
115
|
+
const safe = typeIdentifier(context, `enum ${enumDefinition.name}`, enumDefinition.name);
|
|
116
|
+
const unique = reserveBase(safe, ['Schema'], used);
|
|
117
|
+
if (unique !== safe) {
|
|
118
|
+
context.warnings.push(`enum ${enumDefinition.name}: the name is already used by another type; it was written as "${unique}".`);
|
|
119
|
+
}
|
|
120
|
+
context.typeNames.set(`enum:${enumDefinition.name}`, unique);
|
|
121
|
+
}
|
|
122
|
+
for (const model of context.schema.models) {
|
|
123
|
+
const safe = typeIdentifier(context, model.name, model.name);
|
|
124
|
+
const unique = reserveBase(safe, MODEL_SUFFIXES, used);
|
|
125
|
+
if (unique !== safe) {
|
|
126
|
+
context.warnings.push(`${model.name}: the name is already used by an enum, another model or a name derived from one; the schema was written as "${unique}Schema".`);
|
|
127
|
+
}
|
|
128
|
+
context.typeNames.set(`model:${model.name}`, unique);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function modelTypeName(context, model) {
|
|
132
|
+
return context.typeNames.get(`model:${model.name}`) ?? model.name;
|
|
133
|
+
}
|
|
134
|
+
function enumTypeName(context, enumDefinition) {
|
|
135
|
+
return (context.typeNames.get(`enum:${enumDefinition.name}`) ?? enumDefinition.name);
|
|
136
|
+
}
|
|
137
|
+
function namesOf(context, model) {
|
|
138
|
+
return (context.names.get(model.name) ?? {
|
|
139
|
+
fields: new Map(),
|
|
140
|
+
relations: new Map(),
|
|
141
|
+
scalars: new Map(),
|
|
142
|
+
used: new Set(),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
function allocateMemberNames(context) {
|
|
146
|
+
for (const model of context.schema.models) {
|
|
147
|
+
const names = {
|
|
148
|
+
fields: new Map(),
|
|
149
|
+
relations: new Map(),
|
|
150
|
+
scalars: new Map(),
|
|
151
|
+
used: new Set(),
|
|
152
|
+
};
|
|
153
|
+
for (const field of model.fields) {
|
|
154
|
+
names.fields.set(field.name, uniqueName(propertyName(context, field.name), names.used));
|
|
155
|
+
}
|
|
156
|
+
for (const relation of model.relations) {
|
|
157
|
+
if (relation.kind !== 'manyToMany') {
|
|
158
|
+
// The foreign-key scalar is written first; skip it when a field already provides it.
|
|
159
|
+
const scalarName = propertyName(context, relation.columnName);
|
|
160
|
+
if (!names.used.has(scalarName)) {
|
|
161
|
+
names.used.add(scalarName);
|
|
162
|
+
names.scalars.set(relation.name, scalarName);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
names.relations.set(relation.name, uniqueName(propertyName(context, relation.name), names.used));
|
|
166
|
+
}
|
|
167
|
+
context.names.set(model.name, names);
|
|
168
|
+
}
|
|
169
|
+
for (const model of context.schema.models) {
|
|
170
|
+
for (const relation of model.relations) {
|
|
171
|
+
const targetNames = context.names.get(relation.targetModel);
|
|
172
|
+
if (targetNames === undefined) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const defaultName = relation.kind === 'oneToOne'
|
|
176
|
+
? toSnakeCase(model.name)
|
|
177
|
+
: `${toSnakeCase(model.name)}_set`;
|
|
178
|
+
context.inverseNames.set(`${model.name}.${relation.name}`, uniqueName(propertyName(context, relation.relatedName ?? defaultName), targetNames.used));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
// Enums
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
/**
|
|
186
|
+
* Writes the enum as a const object (so `Role.ADMIN` works like the member of the interface
|
|
187
|
+
* emitter's `enum Role`), the `z.enum` schema built from it and the union type.
|
|
188
|
+
*/
|
|
189
|
+
function emitEnum(context, enumDefinition) {
|
|
190
|
+
const name = enumTypeName(context, enumDefinition);
|
|
191
|
+
const lines = [`export const ${name} = {`];
|
|
192
|
+
const usedMembers = new Set();
|
|
193
|
+
for (const value of enumDefinition.values) {
|
|
194
|
+
const memberName = enumMemberName(context, enumDefinition, value, usedMembers);
|
|
195
|
+
if (value.label !== undefined && value.label !== '') {
|
|
196
|
+
lines.push(` /** ${escapeComment(value.label)} */`);
|
|
197
|
+
}
|
|
198
|
+
lines.push(` ${memberKey(memberName)}: ${quote(value.dbValue)},`);
|
|
199
|
+
}
|
|
200
|
+
lines.push('} as const;');
|
|
201
|
+
lines.push(`export const ${name}Schema = z.enum(${name});`);
|
|
202
|
+
lines.push(`export type ${name} = z.infer<typeof ${name}Schema>;`);
|
|
203
|
+
return lines.join('\n');
|
|
204
|
+
}
|
|
205
|
+
function enumMemberName(context, enumDefinition, value, used) {
|
|
206
|
+
const unique = uniqueName(value.name, used);
|
|
207
|
+
if (unique !== value.name) {
|
|
208
|
+
context.warnings.push(`enum ${enumDefinition.name}: the member "${value.name}" is declared more than once; the repeat was written as "${unique}".`);
|
|
209
|
+
}
|
|
210
|
+
return unique;
|
|
211
|
+
}
|
|
212
|
+
function escapeComment(text) {
|
|
213
|
+
return text.replace(/\*\//g, '*\\/').replace(/\s*\n\s*/g, ' ');
|
|
214
|
+
}
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
// Types
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
function dateSchema(context, type) {
|
|
219
|
+
if (context.dates === 'coerce') {
|
|
220
|
+
return 'z.coerce.date()';
|
|
221
|
+
}
|
|
222
|
+
return type === 'date' ? 'z.iso.date()' : 'z.iso.datetime({ offset: true })';
|
|
223
|
+
}
|
|
224
|
+
function bigIntSchema(context) {
|
|
225
|
+
return context.bigints === 'bigint'
|
|
226
|
+
? 'z.coerce.bigint()'
|
|
227
|
+
: 'z.string().regex(/^-?\\d+$/)';
|
|
228
|
+
}
|
|
229
|
+
/** A string of digits that fits `DECIMAL(maxDigits, decimalPlaces)`; any decimal number when unsized. */
|
|
230
|
+
function decimalSchema(field) {
|
|
231
|
+
const digits = field?.maxDigits;
|
|
232
|
+
if (digits === undefined) {
|
|
233
|
+
return 'z.string().regex(/^-?\\d+(\\.\\d+)?$/)';
|
|
234
|
+
}
|
|
235
|
+
const places = field?.decimalPlaces ?? 0;
|
|
236
|
+
const integerDigits = Math.max(digits - places, 1);
|
|
237
|
+
const fraction = places > 0 ? `(\\.\\d{1,${places}})?` : '';
|
|
238
|
+
return `z.string().regex(/^-?\\d{1,${integerDigits}}${fraction}$/)`;
|
|
239
|
+
}
|
|
240
|
+
function rangeBoundSchema(context, field) {
|
|
241
|
+
switch (field.rangeOf) {
|
|
242
|
+
case 'int':
|
|
243
|
+
return 'z.number().int()';
|
|
244
|
+
case 'bigInt':
|
|
245
|
+
return bigIntSchema(context);
|
|
246
|
+
case 'decimal':
|
|
247
|
+
return decimalSchema(undefined);
|
|
248
|
+
case 'dateTime':
|
|
249
|
+
return dateSchema(context, 'dateTime');
|
|
250
|
+
case 'date':
|
|
251
|
+
return dateSchema(context, 'date');
|
|
252
|
+
default:
|
|
253
|
+
return 'z.string()';
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Returns the Zod expression of a scalar field, without `.nullable()`. Problems are only
|
|
258
|
+
* reported when `report` is true, so a type that is looked up twice produces one warning.
|
|
259
|
+
*/
|
|
260
|
+
function fieldSchema(context, label, field, report) {
|
|
261
|
+
const element = elementSchema(context, label, field, report);
|
|
262
|
+
let result = element;
|
|
263
|
+
for (let level = 0; level < (field.arrayDepth ?? 0); level += 1) {
|
|
264
|
+
result = `z.array(${result})`;
|
|
265
|
+
}
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
function elementSchema(context, label, field, report) {
|
|
269
|
+
if (field.enumName !== undefined) {
|
|
270
|
+
const enumDefinition = context.schema.enums.find((candidate) => candidate.name === field.enumName);
|
|
271
|
+
if (enumDefinition !== undefined) {
|
|
272
|
+
return `${enumTypeName(context, enumDefinition)}Schema`;
|
|
273
|
+
}
|
|
274
|
+
if (report) {
|
|
275
|
+
context.warnings.push(`${label}: enum "${field.enumName}" does not exist in the schema; the property is validated as a string.`);
|
|
276
|
+
}
|
|
277
|
+
return 'z.string()';
|
|
278
|
+
}
|
|
279
|
+
switch (field.type) {
|
|
280
|
+
case 'string':
|
|
281
|
+
case 'text':
|
|
282
|
+
return field.maxLength === undefined
|
|
283
|
+
? 'z.string()'
|
|
284
|
+
: `z.string().max(${field.maxLength})`;
|
|
285
|
+
case 'uuid':
|
|
286
|
+
return 'z.uuid()';
|
|
287
|
+
case 'time':
|
|
288
|
+
case 'duration':
|
|
289
|
+
return 'z.string()';
|
|
290
|
+
case 'bytes':
|
|
291
|
+
// Binary data travels as base64 text.
|
|
292
|
+
return 'z.base64()';
|
|
293
|
+
case 'bigInt':
|
|
294
|
+
return bigIntSchema(context);
|
|
295
|
+
case 'decimal':
|
|
296
|
+
return decimalSchema(field);
|
|
297
|
+
case 'int':
|
|
298
|
+
return 'z.number().int()';
|
|
299
|
+
case 'float':
|
|
300
|
+
return 'z.number()';
|
|
301
|
+
case 'boolean':
|
|
302
|
+
return 'z.boolean()';
|
|
303
|
+
case 'dateTime':
|
|
304
|
+
return dateSchema(context, 'dateTime');
|
|
305
|
+
case 'date':
|
|
306
|
+
return dateSchema(context, 'date');
|
|
307
|
+
case 'json':
|
|
308
|
+
return 'z.unknown()';
|
|
309
|
+
case 'ipAddress':
|
|
310
|
+
return 'z.union([z.ipv4(), z.ipv6()])';
|
|
311
|
+
case 'hstore':
|
|
312
|
+
return 'z.record(z.string(), z.string().nullable())';
|
|
313
|
+
case 'range': {
|
|
314
|
+
const bound = rangeBoundSchema(context, field);
|
|
315
|
+
return `z.object({ lower: ${bound}.nullable(), upper: ${bound}.nullable(), bounds: z.string().optional() })`;
|
|
316
|
+
}
|
|
317
|
+
default:
|
|
318
|
+
if (report) {
|
|
319
|
+
context.warnings.push(`${label}: unknown field type "${String(field.type)}"; the property is validated as unknown.`);
|
|
320
|
+
}
|
|
321
|
+
return 'z.unknown()';
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/** Resolves the schema of the column a relation points at (an explicit to_field, else the primary key). */
|
|
325
|
+
function referencedSchema(context, target, toField, depth = 0) {
|
|
326
|
+
if (depth > MAX_KEY_DEPTH) {
|
|
327
|
+
return undefined;
|
|
328
|
+
}
|
|
329
|
+
const explicit = toField === undefined
|
|
330
|
+
? undefined
|
|
331
|
+
: target.fields.find((field) => field.name === toField);
|
|
332
|
+
const column = explicit ?? target.fields.find((field) => field.isPrimaryKey);
|
|
333
|
+
if (column !== undefined) {
|
|
334
|
+
return fieldSchema(context, `${target.name}.${column.name}`, column, false);
|
|
335
|
+
}
|
|
336
|
+
const primaryRelation = target.relations.find((relation) => relation.isPrimaryKey === true);
|
|
337
|
+
if (primaryRelation === undefined) {
|
|
338
|
+
return undefined;
|
|
339
|
+
}
|
|
340
|
+
const chained = findModel(context.schema, primaryRelation.targetModel);
|
|
341
|
+
return chained === undefined
|
|
342
|
+
? undefined
|
|
343
|
+
: referencedSchema(context, chained, primaryRelation.toField, depth + 1);
|
|
344
|
+
}
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
// Members
|
|
347
|
+
// ---------------------------------------------------------------------------
|
|
348
|
+
/** True when the database fills the column in itself, so a create payload must not carry it. */
|
|
349
|
+
function isGeneratedByDatabase(field) {
|
|
350
|
+
if (field.generated !== undefined || field.isAutoUpdated) {
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
const fallback = field.default;
|
|
354
|
+
if (fallback === undefined) {
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
return (fallback.kind === 'autoIncrement' ||
|
|
358
|
+
(fallback.kind === 'dbExpression' &&
|
|
359
|
+
fallback.isFunction === true &&
|
|
360
|
+
COUNTER_FUNCTIONS.has(fallback.expression)));
|
|
361
|
+
}
|
|
362
|
+
function buildForwardMembers(context, model, reverseMembers) {
|
|
363
|
+
const scalars = [];
|
|
364
|
+
const relations = [];
|
|
365
|
+
const names = namesOf(context, model);
|
|
366
|
+
for (const field of model.fields) {
|
|
367
|
+
const label = `${model.name}.${field.name}`;
|
|
368
|
+
const omitOnCreate = isGeneratedByDatabase(field);
|
|
369
|
+
scalars.push({
|
|
370
|
+
name: names.fields.get(field.name) ?? field.name,
|
|
371
|
+
schema: fieldSchema(context, label, field, true),
|
|
372
|
+
nullable: field.isNullable,
|
|
373
|
+
omitOnCreate,
|
|
374
|
+
optionalOnCreate: !omitOnCreate &&
|
|
375
|
+
(field.isNullable ||
|
|
376
|
+
field.default !== undefined ||
|
|
377
|
+
field.isDbDefault === true),
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
for (const relation of model.relations) {
|
|
381
|
+
const label = `${model.name}.${relation.name}`;
|
|
382
|
+
const target = findModel(context.schema, relation.targetModel);
|
|
383
|
+
if (target === undefined) {
|
|
384
|
+
context.warnings.push(`${label}: target model "${relation.targetModel}" does not exist in the schema; the relation was skipped.`);
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
const targetName = modelTypeName(context, target);
|
|
388
|
+
const relationProp = names.relations.get(relation.name) ?? relation.name;
|
|
389
|
+
const inverseProp = context.inverseNames.get(label) ?? toSnakeCase(model.name);
|
|
390
|
+
if (relation.kind === 'manyToMany') {
|
|
391
|
+
relations.push({
|
|
392
|
+
name: relationProp,
|
|
393
|
+
target: targetName,
|
|
394
|
+
list: true,
|
|
395
|
+
nullable: false,
|
|
396
|
+
});
|
|
397
|
+
addReverse(reverseMembers, target.name, {
|
|
398
|
+
name: inverseProp,
|
|
399
|
+
target: modelTypeName(context, model),
|
|
400
|
+
list: true,
|
|
401
|
+
nullable: false,
|
|
402
|
+
});
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
const scalarProp = names.scalars.get(relation.name);
|
|
406
|
+
if (scalarProp !== undefined) {
|
|
407
|
+
let keySchema = referencedSchema(context, target, relation.toField);
|
|
408
|
+
if (keySchema === undefined) {
|
|
409
|
+
context.warnings.push(`${label}: target model "${target.name}" has no single-column primary key to reference; the foreign key "${scalarProp}" is validated as unknown.`);
|
|
410
|
+
keySchema = 'z.unknown()';
|
|
411
|
+
}
|
|
412
|
+
scalars.push({
|
|
413
|
+
name: scalarProp,
|
|
414
|
+
schema: keySchema,
|
|
415
|
+
nullable: relation.isNullable && keySchema !== 'z.unknown()',
|
|
416
|
+
omitOnCreate: false,
|
|
417
|
+
optionalOnCreate: relation.isNullable,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
relations.push({
|
|
421
|
+
name: relationProp,
|
|
422
|
+
target: targetName,
|
|
423
|
+
list: false,
|
|
424
|
+
nullable: relation.isNullable,
|
|
425
|
+
});
|
|
426
|
+
addReverse(reverseMembers, target.name, {
|
|
427
|
+
name: inverseProp,
|
|
428
|
+
target: modelTypeName(context, model),
|
|
429
|
+
list: relation.kind !== 'oneToOne',
|
|
430
|
+
nullable: relation.kind === 'oneToOne',
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
return { scalars, relations };
|
|
434
|
+
}
|
|
435
|
+
function addReverse(reverseMembers, targetName, member) {
|
|
436
|
+
const existing = reverseMembers.get(targetName) ?? [];
|
|
437
|
+
existing.push(member);
|
|
438
|
+
reverseMembers.set(targetName, existing);
|
|
439
|
+
}
|
|
440
|
+
// ---------------------------------------------------------------------------
|
|
441
|
+
// Models
|
|
442
|
+
// ---------------------------------------------------------------------------
|
|
443
|
+
function scalarLine(scalar) {
|
|
444
|
+
return ` ${memberKey(scalar.name)}: ${scalar.schema}${scalar.nullable ? '.nullable()' : ''},`;
|
|
445
|
+
}
|
|
446
|
+
/** Writes `{ a: true, b: true }` for the given property names. */
|
|
447
|
+
function mask(names) {
|
|
448
|
+
return `{ ${names.map((name) => `${memberKey(name)}: true`).join(', ')} }`;
|
|
449
|
+
}
|
|
450
|
+
function emitModel(context, model, scalars, relations) {
|
|
451
|
+
const name = modelTypeName(context, model);
|
|
452
|
+
const lines = [`export const ${name}Schema = z.object({`];
|
|
453
|
+
for (const scalar of scalars) {
|
|
454
|
+
lines.push(scalarLine(scalar));
|
|
455
|
+
}
|
|
456
|
+
lines.push('});', `export type ${name} = z.infer<typeof ${name}Schema>;`);
|
|
457
|
+
if (model.isView !== true) {
|
|
458
|
+
const omitted = scalars
|
|
459
|
+
.filter((scalar) => scalar.omitOnCreate)
|
|
460
|
+
.map((scalar) => scalar.name);
|
|
461
|
+
const optional = scalars
|
|
462
|
+
.filter((scalar) => scalar.optionalOnCreate)
|
|
463
|
+
.map((scalar) => scalar.name);
|
|
464
|
+
const create = `${name}Schema${omitted.length === 0 ? '' : `.omit(${mask(omitted)})`}${optional.length === 0 ? '' : `.partial(${mask(optional)})`}`;
|
|
465
|
+
lines.push('', `export const ${name}CreateSchema = ${create};`, `export type ${name}Create = z.infer<typeof ${name}CreateSchema>;`, '', `export const ${name}UpdateSchema = ${name}CreateSchema.partial();`, `export type ${name}Update = z.infer<typeof ${name}UpdateSchema>;`);
|
|
466
|
+
}
|
|
467
|
+
if (relations.length > 0) {
|
|
468
|
+
lines.push('', ...relationLines(name, relations));
|
|
469
|
+
}
|
|
470
|
+
return lines.join('\n');
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* The `WithRelations` type is written out by hand and annotates the schema, because the
|
|
474
|
+
* schemas refer to each other and TypeScript cannot infer a type that depends on itself.
|
|
475
|
+
*/
|
|
476
|
+
function relationLines(name, relations) {
|
|
477
|
+
const typeLines = [];
|
|
478
|
+
const schemaLines = [];
|
|
479
|
+
for (const relation of relations) {
|
|
480
|
+
const key = memberKey(relation.name);
|
|
481
|
+
const related = `${relation.target}WithRelations`;
|
|
482
|
+
const typeText = `${related}${relation.list ? '[]' : ''}${relation.nullable ? ' | null' : ''}`;
|
|
483
|
+
typeLines.push(` ${key}?: ${typeText};`);
|
|
484
|
+
const lazy = relation.list
|
|
485
|
+
? `z.array(z.lazy(() => ${related}Schema))`
|
|
486
|
+
: `z.lazy(() => ${related}Schema)`;
|
|
487
|
+
schemaLines.push(` ${key}: ${lazy}${relation.nullable ? '.nullable()' : ''}.optional(),`);
|
|
488
|
+
}
|
|
489
|
+
return [
|
|
490
|
+
`export type ${name}WithRelations = ${name} & {`,
|
|
491
|
+
...typeLines,
|
|
492
|
+
'};',
|
|
493
|
+
`export const ${name}WithRelationsSchema: z.ZodType<${name}WithRelations> = ${name}Schema.extend({`,
|
|
494
|
+
...schemaLines,
|
|
495
|
+
'});',
|
|
496
|
+
];
|
|
497
|
+
}
|
|
498
|
+
//# sourceMappingURL=zod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod.js","sourceRoot":"","sources":["../../src/emitters/zod.ts"],"names":[],"mappings":"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"}
|
package/dist/formats.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type EmitOutput, type PrismaProvider } from './emitters/prisma.js';
|
|
2
|
+
import { type SqlAlchemyStyle } from './emitters/sqlalchemy.js';
|
|
2
3
|
import type { IrSchema } from './ir.js';
|
|
3
4
|
import { type Result } from './result.js';
|
|
4
5
|
import { type NamingMode } from './transforms.js';
|
|
@@ -15,7 +16,10 @@ export interface SourceText {
|
|
|
15
16
|
export interface FormatOptions {
|
|
16
17
|
/** "preserve" keeps existing database names; "normalize" applies a fresh-schema style. */
|
|
17
18
|
naming: NamingMode;
|
|
18
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* Database provider. Prisma uses it for native column types such as @db.VarChar, Drizzle and GORM
|
|
21
|
+
* for the dialect, and the SQL DDL emitter for the SQL it writes (postgresql, mysql, sqlite, sqlserver).
|
|
22
|
+
*/
|
|
19
23
|
provider: PrismaProvider;
|
|
20
24
|
/** Emit Prisma generator and datasource blocks. */
|
|
21
25
|
header: boolean;
|
|
@@ -32,6 +36,12 @@ export interface FormatOptions {
|
|
|
32
36
|
namespace?: string;
|
|
33
37
|
/** Go package name of the generated GORM models (default `models`); also the output directory. */
|
|
34
38
|
goPackage?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Flavour of the SQLAlchemy output: `sqlalchemy` (default; `DeclarativeBase`, `Mapped[...]` and
|
|
41
|
+
* `mapped_column`) or `sqlmodel` (`SQLModel, table=True` classes with `Field` and `Relationship`).
|
|
42
|
+
* Only the `sqlalchemy` format reads it.
|
|
43
|
+
*/
|
|
44
|
+
style?: SqlAlchemyStyle;
|
|
35
45
|
}
|
|
36
46
|
/**
|
|
37
47
|
* Output of an emitter that produces several files. `files` maps a relative
|