ormbridge 0.0.0-stage → 0.3.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.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +459 -2
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +20 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/cliRunner.d.ts +20 -0
  7. package/dist/cliRunner.js +363 -0
  8. package/dist/cliRunner.js.map +1 -0
  9. package/dist/config.d.ts +44 -0
  10. package/dist/config.js +220 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/convert.d.ts +20 -0
  13. package/dist/convert.js +61 -0
  14. package/dist/convert.js.map +1 -0
  15. package/dist/emitters/django.d.ts +4 -0
  16. package/dist/emitters/django.js +501 -0
  17. package/dist/emitters/django.js.map +1 -0
  18. package/dist/emitters/doctrine.d.ts +20 -0
  19. package/dist/emitters/doctrine.js +1134 -0
  20. package/dist/emitters/doctrine.js.map +1 -0
  21. package/dist/emitters/gorm.d.ts +38 -0
  22. package/dist/emitters/gorm.js +1507 -0
  23. package/dist/emitters/gorm.js.map +1 -0
  24. package/dist/emitters/graphene.d.ts +4 -0
  25. package/dist/emitters/graphene.js +431 -0
  26. package/dist/emitters/graphene.js.map +1 -0
  27. package/dist/emitters/laravel.d.ts +33 -0
  28. package/dist/emitters/laravel.js +1695 -0
  29. package/dist/emitters/laravel.js.map +1 -0
  30. package/dist/emitters/prisma.d.ts +21 -0
  31. package/dist/emitters/prisma.js +1058 -0
  32. package/dist/emitters/prisma.js.map +1 -0
  33. package/dist/emitters/typeorm.d.ts +9 -0
  34. package/dist/emitters/typeorm.js +838 -0
  35. package/dist/emitters/typeorm.js.map +1 -0
  36. package/dist/emitters/typescriptInterfaces.d.ts +15 -0
  37. package/dist/emitters/typescriptInterfaces.js +350 -0
  38. package/dist/emitters/typescriptInterfaces.js.map +1 -0
  39. package/dist/formats.d.ts +82 -0
  40. package/dist/formats.js +238 -0
  41. package/dist/formats.js.map +1 -0
  42. package/dist/index.d.ts +37 -0
  43. package/dist/index.js +20 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/io.d.ts +48 -0
  46. package/dist/io.js +343 -0
  47. package/dist/io.js.map +1 -0
  48. package/dist/ir.d.ts +197 -0
  49. package/dist/ir.js +10 -0
  50. package/dist/ir.js.map +1 -0
  51. package/dist/naming.d.ts +11 -0
  52. package/dist/naming.js +88 -0
  53. package/dist/naming.js.map +1 -0
  54. package/dist/parsers/django.d.ts +14 -0
  55. package/dist/parsers/django.js +1161 -0
  56. package/dist/parsers/django.js.map +1 -0
  57. package/dist/parsers/doctrine.d.ts +12 -0
  58. package/dist/parsers/doctrine.js +1984 -0
  59. package/dist/parsers/doctrine.js.map +1 -0
  60. package/dist/parsers/goSyntax.d.ts +105 -0
  61. package/dist/parsers/goSyntax.js +435 -0
  62. package/dist/parsers/goSyntax.js.map +1 -0
  63. package/dist/parsers/gorm.d.ts +16 -0
  64. package/dist/parsers/gorm.js +1857 -0
  65. package/dist/parsers/gorm.js.map +1 -0
  66. package/dist/parsers/laravel.d.ts +17 -0
  67. package/dist/parsers/laravel.js +2824 -0
  68. package/dist/parsers/laravel.js.map +1 -0
  69. package/dist/parsers/phpSyntax.d.ts +124 -0
  70. package/dist/parsers/phpSyntax.js +429 -0
  71. package/dist/parsers/phpSyntax.js.map +1 -0
  72. package/dist/parsers/prisma.d.ts +12 -0
  73. package/dist/parsers/prisma.js +964 -0
  74. package/dist/parsers/prisma.js.map +1 -0
  75. package/dist/parsers/pythonSyntax.d.ts +38 -0
  76. package/dist/parsers/pythonSyntax.js +120 -0
  77. package/dist/parsers/pythonSyntax.js.map +1 -0
  78. package/dist/parsers/typeorm.d.ts +12 -0
  79. package/dist/parsers/typeorm.js +1614 -0
  80. package/dist/parsers/typeorm.js.map +1 -0
  81. package/dist/parsers/typescriptSyntax.d.ts +57 -0
  82. package/dist/parsers/typescriptSyntax.js +200 -0
  83. package/dist/parsers/typescriptSyntax.js.map +1 -0
  84. package/dist/prismaOnlyConstructs.d.ts +7 -0
  85. package/dist/prismaOnlyConstructs.js +76 -0
  86. package/dist/prismaOnlyConstructs.js.map +1 -0
  87. package/dist/result.d.ts +20 -0
  88. package/dist/result.js +18 -0
  89. package/dist/result.js.map +1 -0
  90. package/dist/transforms.d.ts +13 -0
  91. package/dist/transforms.js +142 -0
  92. package/dist/transforms.js.map +1 -0
  93. package/package.json +83 -4
@@ -0,0 +1,501 @@
1
+ import { prismaOnlyWarnings } from '../prismaOnlyConstructs.js';
2
+ import { limitIdentifier, splitWords, toSnakeCase } from '../naming.js';
3
+ const ON_DELETE_NAMES = {
4
+ cascade: 'models.CASCADE',
5
+ setNull: 'models.SET_NULL',
6
+ restrict: 'models.PROTECT',
7
+ noAction: 'models.DO_NOTHING',
8
+ setDefault: 'models.SET_DEFAULT',
9
+ };
10
+ const DJANGO_INDEX_NAME_LIMIT = 30;
11
+ const IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
12
+ const RANGE_FIELD_CLASSES = {
13
+ int: 'IntegerRangeField',
14
+ bigInt: 'BigIntegerRangeField',
15
+ decimal: 'DecimalRangeField',
16
+ date: 'DateRangeField',
17
+ dateTime: 'DateTimeRangeField',
18
+ };
19
+ /** Names a GeneratedField expression may use without a module prefix, and where they come from. */
20
+ const EXPRESSION_MODEL_NAMES = [
21
+ 'F',
22
+ 'Q',
23
+ 'Value',
24
+ 'Case',
25
+ 'When',
26
+ 'ExpressionWrapper',
27
+ 'Func',
28
+ 'Count',
29
+ 'Sum',
30
+ 'Avg',
31
+ 'Min',
32
+ 'Max',
33
+ ];
34
+ const EXPRESSION_FUNCTION_NAMES = [
35
+ 'Abs',
36
+ 'Cast',
37
+ 'Ceil',
38
+ 'Coalesce',
39
+ 'Concat',
40
+ 'Floor',
41
+ 'Greatest',
42
+ 'Least',
43
+ 'Left',
44
+ 'Length',
45
+ 'Lower',
46
+ 'LPad',
47
+ 'LTrim',
48
+ 'Mod',
49
+ 'Now',
50
+ 'Power',
51
+ 'Replace',
52
+ 'Right',
53
+ 'Round',
54
+ 'RPad',
55
+ 'RTrim',
56
+ 'Substr',
57
+ 'Trim',
58
+ 'Upper',
59
+ ];
60
+ /** Writes the IR as a Django models.py file. */
61
+ export function emitDjango(schema) {
62
+ const prepared = toDjangoNaming(schema);
63
+ const context = {
64
+ schema: prepared,
65
+ warnings: prismaOnlyWarnings(schema),
66
+ postgresFields: new Set(),
67
+ expressions: [],
68
+ };
69
+ const blocks = [];
70
+ for (const enumDefinition of prepared.enums) {
71
+ blocks.push(emitEnum(enumDefinition));
72
+ }
73
+ for (const model of prepared.models) {
74
+ blocks.push(emitModel(context, model));
75
+ }
76
+ const body = blocks.join('\n\n\n');
77
+ const imports = [];
78
+ if (body.includes('uuid.uuid4')) {
79
+ imports.push('import uuid');
80
+ imports.push('');
81
+ }
82
+ const postgresNames = [...context.postgresFields].sort();
83
+ if (postgresNames.length > 0) {
84
+ imports.push(`from django.contrib.postgres.fields import ${postgresNames.join(', ')}`);
85
+ }
86
+ if (body.includes('RandomUUID()')) {
87
+ imports.push('from django.contrib.postgres.functions import RandomUUID');
88
+ }
89
+ imports.push('from django.db import models');
90
+ const usedModelNames = usedExpressionNames(context.expressions, EXPRESSION_MODEL_NAMES);
91
+ if (usedModelNames.length > 0) {
92
+ imports.push(`from django.db.models import ${usedModelNames.join(', ')}`);
93
+ }
94
+ const functionNames = usedExpressionNames(context.expressions, EXPRESSION_FUNCTION_NAMES);
95
+ if (/(^|[^.\w])Now\(\)/.test(body) && !functionNames.includes('Now')) {
96
+ functionNames.push('Now');
97
+ functionNames.sort();
98
+ }
99
+ if (functionNames.length > 0) {
100
+ imports.push(`from django.db.models.functions import ${functionNames.join(', ')}`);
101
+ }
102
+ if (body.includes('timezone.now')) {
103
+ imports.push('from django.utils import timezone');
104
+ }
105
+ const header = '# Generated by ormbridge. Review the output before running migrations.';
106
+ const text = `${header}\n${imports.join('\n')}\n\n\n${body}\n`;
107
+ return { text, warnings: context.warnings };
108
+ }
109
+ /** Returns the names from `candidates` that appear as unprefixed calls in any expression. */
110
+ function usedExpressionNames(expressions, candidates) {
111
+ return candidates
112
+ .filter((name) => expressions.some((expression) => new RegExp(`(^|[^.\\w])${name}\\(`).test(expression)))
113
+ .sort();
114
+ }
115
+ function pyString(value) {
116
+ return JSON.stringify(value);
117
+ }
118
+ /**
119
+ * Django fields are conventionally snake_case, while Prisma fields are usually camelCase.
120
+ * Renames every field and relation to snake_case; the original column name is kept, so a
121
+ * db_column is emitted whenever it differs from the new field name.
122
+ */
123
+ function toDjangoNaming(schema) {
124
+ const renames = new Map();
125
+ for (const model of schema.models) {
126
+ const modelRenames = new Map();
127
+ for (const field of model.fields) {
128
+ modelRenames.set(field.name, toSnakeCase(field.name) || field.name);
129
+ }
130
+ for (const relation of model.relations) {
131
+ modelRenames.set(relation.name, toSnakeCase(relation.name) || relation.name);
132
+ }
133
+ renames.set(model.name, modelRenames);
134
+ }
135
+ const rename = (modelName, name) => renames.get(modelName)?.get(name) ?? name;
136
+ const models = schema.models.map((model) => ({
137
+ ...model,
138
+ fields: model.fields.map((field) => ({
139
+ ...field,
140
+ name: rename(model.name, field.name),
141
+ })),
142
+ relations: model.relations.map((relation) => ({
143
+ ...relation,
144
+ name: rename(model.name, relation.name),
145
+ ...(relation.toField === undefined
146
+ ? {}
147
+ : { toField: rename(relation.targetModel, relation.toField) }),
148
+ ...(relation.relatedName === undefined
149
+ ? {}
150
+ : { relatedName: toSnakeCase(relation.relatedName) }),
151
+ })),
152
+ indexes: model.indexes.map((index) => ({
153
+ ...index,
154
+ fields: index.fields.map((fieldName) => rename(model.name, fieldName)),
155
+ })),
156
+ ...(model.compositePrimaryKey === undefined
157
+ ? {}
158
+ : {
159
+ compositePrimaryKey: model.compositePrimaryKey.map((fieldName) => rename(model.name, fieldName)),
160
+ }),
161
+ }));
162
+ return { ...schema, models };
163
+ }
164
+ function labelFrom(memberName) {
165
+ return splitWords(memberName)
166
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
167
+ .join(' ');
168
+ }
169
+ function emitEnum(enumDefinition) {
170
+ const lines = [`class ${enumDefinition.name}(models.TextChoices):`];
171
+ if (enumDefinition.values.length === 0) {
172
+ lines.push(' pass');
173
+ }
174
+ for (const value of enumDefinition.values) {
175
+ const label = value.label ?? labelFrom(value.name);
176
+ lines.push(` ${value.name} = ${pyString(value.dbValue)}, ${pyString(label)}`);
177
+ }
178
+ return lines.join('\n');
179
+ }
180
+ /** Notes the fields that need a newer Django release or a specific database. */
181
+ function warnAboutVersionedFields(context, model) {
182
+ const describe = (fields) => fields.map((field) => `${model.name}.${field.name}`).join(', ');
183
+ const postgresFields = model.fields.filter(isPostgresOnly);
184
+ if (postgresFields.length > 0) {
185
+ context.warnings.push(`${describe(postgresFields)}: array, HStore and range fields come from django.contrib.postgres and only work on PostgreSQL.`);
186
+ }
187
+ const generatedFields = model.fields.filter((field) => field.generated !== undefined);
188
+ if (generatedFields.length > 0) {
189
+ context.warnings.push(`${describe(generatedFields)}: models.GeneratedField requires Django 5.0 or newer; review the expression before running migrations.`);
190
+ }
191
+ const dbDefaultFields = model.fields.filter((field) => field.isDbDefault === true && field.default !== undefined);
192
+ if (dbDefaultFields.length > 0) {
193
+ context.warnings.push(`${describe(dbDefaultFields)}: db_default requires Django 5.0 or newer.`);
194
+ }
195
+ }
196
+ function emitModel(context, model) {
197
+ warnAboutVersionedFields(context, model);
198
+ const lines = [`class ${model.name}(models.Model):`];
199
+ const hasCompositeKey = model.compositePrimaryKey !== undefined &&
200
+ model.compositePrimaryKey.length > 0;
201
+ for (const field of model.fields) {
202
+ lines.push(` ${field.name} = ${buildFieldCall(context, model, field)}`);
203
+ }
204
+ for (const relation of model.relations) {
205
+ lines.push(` ${relation.name} = ${buildRelationCall(context, model, relation)}`);
206
+ }
207
+ if (hasCompositeKey && model.compositePrimaryKey !== undefined) {
208
+ const keyNames = model.compositePrimaryKey.map(pyString).join(', ');
209
+ lines.push(` pk = models.CompositePrimaryKey(${keyNames})`);
210
+ context.warnings.push(`${model.name}: the composite primary key (@@id) was emitted as models.CompositePrimaryKey, which requires Django 5.2 or newer.`);
211
+ }
212
+ if (model.fields.length === 0 && model.relations.length === 0) {
213
+ lines.push(' pass');
214
+ }
215
+ const uniqueIndexes = model.indexes.filter((index) => index.isUnique);
216
+ const plainIndexes = model.indexes.filter((index) => !index.isUnique);
217
+ lines.push('', ' class Meta:', ` db_table = ${pyString(model.tableName)}`);
218
+ if (uniqueIndexes.length > 0) {
219
+ lines.push(' constraints = [');
220
+ for (const index of uniqueIndexes) {
221
+ const name = index.name ?? `${model.tableName}_${index.fields.join('_')}_uniq`;
222
+ lines.push(` models.UniqueConstraint(fields=[${index.fields.map(pyString).join(', ')}], name=${pyString(limitIdentifier(name, 63))}),`);
223
+ }
224
+ lines.push(' ]');
225
+ }
226
+ if (plainIndexes.length > 0) {
227
+ lines.push(' indexes = [');
228
+ for (const index of plainIndexes) {
229
+ const requested = index.name ??
230
+ `${toSnakeCase(model.name)}_${index.fields.join('_')}_idx`;
231
+ const name = limitIdentifier(requested, DJANGO_INDEX_NAME_LIMIT);
232
+ if (name !== requested) {
233
+ context.warnings.push(`${model.name}: the index name "${requested}" exceeds Django's ${DJANGO_INDEX_NAME_LIMIT}-character limit and was shortened to "${name}".`);
234
+ }
235
+ lines.push(` models.Index(fields=[${index.fields.map(pyString).join(', ')}], name=${pyString(name)}),`);
236
+ }
237
+ lines.push(' ]');
238
+ }
239
+ return lines.join('\n');
240
+ }
241
+ // ---------------------------------------------------------------------------
242
+ // Fields
243
+ // ---------------------------------------------------------------------------
244
+ function djangoFieldClass(field) {
245
+ const isAutoKey = field.isPrimaryKey &&
246
+ field.default !== undefined &&
247
+ field.default.kind === 'autoIncrement';
248
+ switch (field.type) {
249
+ case 'string':
250
+ return 'CharField';
251
+ case 'text':
252
+ return 'TextField';
253
+ case 'int':
254
+ return isAutoKey ? 'AutoField' : 'IntegerField';
255
+ case 'bigInt':
256
+ return isAutoKey ? 'BigAutoField' : 'BigIntegerField';
257
+ case 'float':
258
+ return 'FloatField';
259
+ case 'decimal':
260
+ return 'DecimalField';
261
+ case 'boolean':
262
+ return 'BooleanField';
263
+ case 'dateTime':
264
+ return 'DateTimeField';
265
+ case 'date':
266
+ return 'DateField';
267
+ case 'time':
268
+ return 'TimeField';
269
+ case 'uuid':
270
+ return 'UUIDField';
271
+ case 'json':
272
+ return 'JSONField';
273
+ case 'bytes':
274
+ return 'BinaryField';
275
+ case 'duration':
276
+ return 'DurationField';
277
+ case 'ipAddress':
278
+ return 'GenericIPAddressField';
279
+ case 'hstore':
280
+ return 'HStoreField';
281
+ case 'range':
282
+ return RANGE_FIELD_CLASSES[field.rangeOf ?? 'int'];
283
+ default:
284
+ return 'CharField';
285
+ }
286
+ }
287
+ /** True for the field types that live in django.contrib.postgres. */
288
+ function isPostgresOnly(field) {
289
+ return ((field.arrayDepth ?? 0) > 0 ||
290
+ field.type === 'hstore' ||
291
+ field.type === 'range');
292
+ }
293
+ /**
294
+ * Writes the column type with its type-specific arguments (length, precision, choices,
295
+ * array element), without constraints such as null or unique.
296
+ */
297
+ function buildTypeCall(context, model, field) {
298
+ const label = `${model.name}.${field.name}`;
299
+ const depth = field.arrayDepth ?? 0;
300
+ if (depth > 0) {
301
+ const element = {
302
+ ...field,
303
+ arrayDepth: depth - 1 > 0 ? depth - 1 : undefined,
304
+ isPrimaryKey: false,
305
+ isUnique: false,
306
+ isNullable: false,
307
+ isAutoUpdated: false,
308
+ default: undefined,
309
+ generated: undefined,
310
+ isDbDefault: undefined,
311
+ };
312
+ context.postgresFields.add('ArrayField');
313
+ return `ArrayField(${buildTypeCall(context, model, element)})`;
314
+ }
315
+ const className = djangoFieldClass(field);
316
+ const args = [];
317
+ if (field.enumName !== undefined) {
318
+ const enumDefinition = context.schema.enums.find((candidate) => candidate.name === field.enumName);
319
+ const longestValue = Math.max(32, ...(enumDefinition?.values ?? []).map((value) => value.dbValue.length));
320
+ args.push(`max_length=${longestValue}`, `choices=${field.enumName}.choices`);
321
+ }
322
+ else if (className === 'CharField') {
323
+ args.push(`max_length=${field.maxLength ?? 255}`);
324
+ }
325
+ else if (className === 'DecimalField') {
326
+ args.push(`max_digits=${field.maxDigits ?? 65}`, `decimal_places=${field.decimalPlaces ?? 30}`);
327
+ }
328
+ if (field.type === 'hstore' || field.type === 'range') {
329
+ context.postgresFields.add(className);
330
+ if (field.type === 'range' && field.rangeOf === undefined) {
331
+ context.warnings.push(`${label}: the range field has no element type; it was written as IntegerRangeField.`);
332
+ }
333
+ return `${className}(${args.join(', ')})`;
334
+ }
335
+ return `models.${className}(${args.join(', ')})`;
336
+ }
337
+ function buildFieldCall(context, model, field) {
338
+ if (field.generated !== undefined) {
339
+ return buildGeneratedCall(context, model, field, field.generated);
340
+ }
341
+ const typeCall = buildTypeCall(context, model, field);
342
+ const args = [];
343
+ const openIndex = typeCall.indexOf('(');
344
+ const innerArgs = typeCall.slice(openIndex + 1, -1);
345
+ if (innerArgs.length > 0) {
346
+ args.push(innerArgs);
347
+ }
348
+ if (field.isPrimaryKey) {
349
+ args.push('primary_key=True');
350
+ }
351
+ if (field.isUnique && !field.isPrimaryKey) {
352
+ args.push('unique=True');
353
+ }
354
+ if (field.isNullable) {
355
+ args.push('null=True', 'blank=True');
356
+ }
357
+ if (field.columnName !== field.name) {
358
+ args.push(`db_column=${pyString(field.columnName)}`);
359
+ }
360
+ if (field.isAutoUpdated) {
361
+ args.push('auto_now=True');
362
+ }
363
+ else {
364
+ const defaultArgument = defaultArgumentOf(context, model, field);
365
+ if (defaultArgument !== undefined) {
366
+ args.push(defaultArgument);
367
+ }
368
+ }
369
+ if (field.isPrimaryKey &&
370
+ field.default !== undefined &&
371
+ field.default.kind === 'uuid') {
372
+ args.push('editable=False');
373
+ }
374
+ return `${typeCall.slice(0, openIndex)}(${args.join(', ')})`;
375
+ }
376
+ function buildGeneratedCall(context, model, field, generated) {
377
+ const output = {
378
+ ...field,
379
+ columnName: field.name,
380
+ isPrimaryKey: false,
381
+ isUnique: false,
382
+ isAutoUpdated: false,
383
+ default: undefined,
384
+ generated: undefined,
385
+ isDbDefault: undefined,
386
+ };
387
+ context.expressions.push(generated.expression);
388
+ const args = [
389
+ `expression=${generated.expression}`,
390
+ `output_field=${buildFieldCall(context, model, output)}`,
391
+ `db_persist=${generated.isStored ? 'True' : 'False'}`,
392
+ ];
393
+ if (field.columnName !== field.name) {
394
+ args.push(`db_column=${pyString(field.columnName)}`);
395
+ }
396
+ if (field.isUnique) {
397
+ args.push('unique=True');
398
+ }
399
+ return `models.GeneratedField(${args.join(', ')})`;
400
+ }
401
+ function defaultArgumentOf(context, model, field) {
402
+ const argument = plainDefaultArgumentOf(context, model, field);
403
+ if (argument === undefined || field.isDbDefault !== true) {
404
+ return argument;
405
+ }
406
+ if (argument === 'default=timezone.now') {
407
+ return 'db_default=Now()';
408
+ }
409
+ if (argument === 'default=uuid.uuid4') {
410
+ return 'db_default=RandomUUID()';
411
+ }
412
+ if (argument === 'default=list' || argument === 'default=dict') {
413
+ // db_default takes SQL expressions, which have no empty list or dict shorthand.
414
+ return argument;
415
+ }
416
+ return argument.replace(/^default=/, 'db_default=');
417
+ }
418
+ function plainDefaultArgumentOf(context, model, field) {
419
+ const defaultValue = field.default;
420
+ if (defaultValue === undefined) {
421
+ return undefined;
422
+ }
423
+ switch (defaultValue.kind) {
424
+ case 'autoIncrement':
425
+ return undefined;
426
+ case 'now':
427
+ return 'default=timezone.now';
428
+ case 'uuid':
429
+ return 'default=uuid.uuid4';
430
+ case 'enumValue':
431
+ return field.enumName === undefined
432
+ ? undefined
433
+ : `default=${field.enumName}.${defaultValue.value}`;
434
+ case 'literal': {
435
+ const literal = defaultValue.value;
436
+ if (typeof literal === 'boolean') {
437
+ return `default=${literal ? 'True' : 'False'}`;
438
+ }
439
+ if (typeof literal === 'number') {
440
+ return `default=${String(literal)}`;
441
+ }
442
+ if ((field.type === 'json' || (field.arrayDepth ?? 0) > 0) &&
443
+ literal === '[]') {
444
+ return 'default=list';
445
+ }
446
+ if ((field.type === 'json' || field.type === 'hstore') &&
447
+ literal === '{}') {
448
+ return 'default=dict';
449
+ }
450
+ if (field.type === 'json') {
451
+ context.warnings.push(`${model.name}.${field.name}: the JSON default ${pyString(literal)} was emitted as a string; adjust it if a dict or list was intended.`);
452
+ }
453
+ return `default=${pyString(literal)}`;
454
+ }
455
+ default:
456
+ return undefined;
457
+ }
458
+ }
459
+ // ---------------------------------------------------------------------------
460
+ // Relations
461
+ // ---------------------------------------------------------------------------
462
+ function buildRelationCall(context, model, relation) {
463
+ const targetLiteral = pyString(relation.targetModel);
464
+ const args = [targetLiteral];
465
+ if (relation.kind === 'manyToMany') {
466
+ if (relation.relatedName !== undefined &&
467
+ IDENTIFIER_PATTERN.test(relation.relatedName)) {
468
+ args.push(`related_name=${pyString(relation.relatedName)}`);
469
+ }
470
+ args.push('blank=True');
471
+ return `models.ManyToManyField(${args.join(', ')})`;
472
+ }
473
+ let onDelete = relation.onDelete;
474
+ if (onDelete === 'setNull' && !relation.isNullable) {
475
+ context.warnings.push(`${model.name}.${relation.name}: onDelete SetNull requires a nullable relation in Django; it was converted to PROTECT.`);
476
+ onDelete = 'restrict';
477
+ }
478
+ if (onDelete === 'setDefault') {
479
+ context.warnings.push(`${model.name}.${relation.name}: Django's SET_DEFAULT needs a default= value on the field; add one manually.`);
480
+ }
481
+ args.push(`on_delete=${ON_DELETE_NAMES[onDelete]}`);
482
+ if (relation.isNullable) {
483
+ args.push('null=True', 'blank=True');
484
+ }
485
+ if (relation.relatedName !== undefined &&
486
+ IDENTIFIER_PATTERN.test(relation.relatedName)) {
487
+ args.push(`related_name=${pyString(relation.relatedName)}`);
488
+ }
489
+ if (relation.columnName !== `${relation.name}_id`) {
490
+ args.push(`db_column=${pyString(relation.columnName)}`);
491
+ }
492
+ if (relation.toField !== undefined) {
493
+ args.push(`to_field=${pyString(relation.toField)}`);
494
+ }
495
+ if (relation.isPrimaryKey === true) {
496
+ args.push('primary_key=True');
497
+ }
498
+ const className = relation.kind === 'oneToOne' ? 'OneToOneField' : 'ForeignKey';
499
+ return `models.${className}(${args.join(', ')})`;
500
+ }
501
+ //# sourceMappingURL=django.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"django.js","sourceRoot":"","sources":["../../src/emitters/django.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { MultiFileEmitOutput } from '../formats.js';
2
+ import type { IrSchema } from '../ir.js';
3
+ import type { PrismaProvider } from './prisma.js';
4
+ /**
5
+ * Doctrine ORM emitter (PHP 8.1+ attributes). Writes one PSR-4 file per entity
6
+ * (`src/Entity/Post.php`) and one per backed enum (`src/Enum/PostStatus.php`),
7
+ * so it returns the multi-file form of the emit contract.
8
+ */
9
+ export interface DoctrineEmitOptions {
10
+ /** Database provider; chooses timezone-aware date types and JSONB on PostgreSQL. */
11
+ provider: PrismaProvider;
12
+ /** Use camelCase property names and map them to the original column names. */
13
+ camelFields: boolean;
14
+ /** PHP namespace of the entities (default `App\Entity`). Enums go in the sibling `Enum` namespace. */
15
+ namespace?: string;
16
+ }
17
+ export declare const DEFAULT_DOCTRINE_NAMESPACE: string;
18
+ /** True when `value` is a valid PHP namespace such as `App\Entity` (no leading or trailing backslash). */
19
+ export declare function isValidPhpNamespace(value: string): boolean;
20
+ export declare function emitDoctrine(schema: IrSchema, options: DoctrineEmitOptions): MultiFileEmitOutput;