@postxl/generator 0.74.2 → 1.0.1

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 (189) hide show
  1. package/LICENSE +50 -0
  2. package/README.md +79 -1
  3. package/dist/generator-manager.class.d.ts +59 -0
  4. package/dist/generator-manager.class.js +221 -0
  5. package/dist/generator.class.d.ts +90 -0
  6. package/dist/generator.class.js +32 -0
  7. package/dist/generator.context.d.ts +174 -0
  8. package/dist/generator.context.js +125 -0
  9. package/dist/helpers/branded.types.d.ts +149 -0
  10. package/dist/helpers/branded.types.js +111 -0
  11. package/dist/helpers/config-builder.class.d.ts +27 -0
  12. package/dist/helpers/config-builder.class.js +54 -0
  13. package/dist/helpers/import-generator.class.d.ts +70 -0
  14. package/dist/helpers/import-generator.class.js +166 -0
  15. package/dist/helpers/importable.types.d.ts +52 -0
  16. package/dist/helpers/importable.types.js +15 -0
  17. package/dist/helpers/index-generator.class.d.ts +10 -0
  18. package/dist/helpers/index-generator.class.js +46 -0
  19. package/dist/helpers/index.d.ts +8 -0
  20. package/dist/helpers/index.js +24 -0
  21. package/dist/helpers/package-json.generator.d.ts +56 -0
  22. package/dist/helpers/package-json.generator.js +36 -0
  23. package/dist/helpers/tsconfig.generator.d.ts +1 -0
  24. package/dist/helpers/tsconfig.generator.js +14 -0
  25. package/dist/helpers/verify-context.d.ts +4 -0
  26. package/dist/helpers/verify-context.js +23 -0
  27. package/dist/index.d.ts +5 -0
  28. package/dist/index.js +21 -0
  29. package/dist/utils/checksum.d.ts +10 -0
  30. package/dist/utils/checksum.js +132 -0
  31. package/dist/utils/fs-utils.d.ts +34 -0
  32. package/dist/utils/fs-utils.js +126 -0
  33. package/dist/utils/index.d.ts +10 -0
  34. package/dist/utils/index.js +26 -0
  35. package/dist/utils/jsdoc.d.ts +12 -0
  36. package/dist/utils/jsdoc.js +37 -0
  37. package/dist/utils/lint.d.ts +46 -0
  38. package/dist/utils/lint.js +154 -0
  39. package/dist/utils/lockfile.d.ts +7 -0
  40. package/dist/utils/lockfile.js +80 -0
  41. package/dist/utils/logger.class.d.ts +25 -0
  42. package/dist/utils/logger.class.js +55 -0
  43. package/dist/utils/merge-conflict.d.ts +55 -0
  44. package/dist/utils/merge-conflict.js +264 -0
  45. package/dist/utils/path.d.ts +52 -0
  46. package/dist/utils/path.js +183 -0
  47. package/dist/utils/prettier-config.d.ts +2 -0
  48. package/dist/utils/prettier-config.js +13 -0
  49. package/dist/utils/prettier.d.ts +5 -0
  50. package/dist/utils/prettier.js +67 -0
  51. package/dist/utils/prettier.skiptest.d.ts +1 -0
  52. package/dist/utils/prettier.skiptest.js +22 -0
  53. package/dist/utils/promise.d.ts +2 -0
  54. package/dist/utils/promise.js +10 -0
  55. package/dist/utils/string-functions.d.ts +9 -0
  56. package/dist/utils/string-functions.js +23 -0
  57. package/dist/utils/sync-log-result.d.ts +9 -0
  58. package/dist/utils/sync-log-result.js +90 -0
  59. package/dist/utils/sync.d.ts +143 -0
  60. package/dist/utils/sync.js +325 -0
  61. package/dist/utils/template.d.ts +66 -0
  62. package/dist/utils/template.js +159 -0
  63. package/dist/utils/vfs.class.d.ts +115 -0
  64. package/dist/utils/vfs.class.js +239 -0
  65. package/dist/utils/zip.d.ts +13 -0
  66. package/dist/utils/zip.js +40 -0
  67. package/package.json +57 -34
  68. package/dist/generator.d.ts +0 -13
  69. package/dist/generator.js +0 -455
  70. package/dist/generators/enums/react.generator.d.ts +0 -10
  71. package/dist/generators/enums/react.generator.js +0 -110
  72. package/dist/generators/enums/types.generator.d.ts +0 -10
  73. package/dist/generators/enums/types.generator.js +0 -39
  74. package/dist/generators/indices/data/module.generator.d.ts +0 -9
  75. package/dist/generators/indices/data/module.generator.js +0 -60
  76. package/dist/generators/indices/data/service.generator.d.ts +0 -9
  77. package/dist/generators/indices/data/service.generator.js +0 -249
  78. package/dist/generators/indices/data/types.generator.d.ts +0 -9
  79. package/dist/generators/indices/data/types.generator.js +0 -49
  80. package/dist/generators/indices/dispatcher-service.generator.d.ts +0 -9
  81. package/dist/generators/indices/dispatcher-service.generator.js +0 -107
  82. package/dist/generators/indices/export/class.generator.d.ts +0 -9
  83. package/dist/generators/indices/export/class.generator.js +0 -140
  84. package/dist/generators/indices/export/encoder.generator.d.ts +0 -9
  85. package/dist/generators/indices/export/encoder.generator.js +0 -50
  86. package/dist/generators/indices/import/convert-functions.generator.d.ts +0 -9
  87. package/dist/generators/indices/import/convert-functions.generator.js +0 -509
  88. package/dist/generators/indices/import/decoder.generator.d.ts +0 -9
  89. package/dist/generators/indices/import/decoder.generator.js +0 -40
  90. package/dist/generators/indices/import/service.generator.d.ts +0 -9
  91. package/dist/generators/indices/import/service.generator.js +0 -573
  92. package/dist/generators/indices/import/types.generator.d.ts +0 -9
  93. package/dist/generators/indices/import/types.generator.js +0 -242
  94. package/dist/generators/indices/repositories.generator.d.ts +0 -9
  95. package/dist/generators/indices/repositories.generator.js +0 -25
  96. package/dist/generators/indices/routes.generator.d.ts +0 -9
  97. package/dist/generators/indices/routes.generator.js +0 -29
  98. package/dist/generators/indices/seed-migration.generator.d.ts +0 -9
  99. package/dist/generators/indices/seed-migration.generator.js +0 -36
  100. package/dist/generators/indices/seed-template.generator.d.ts +0 -9
  101. package/dist/generators/indices/seed-template.generator.js +0 -80
  102. package/dist/generators/indices/testids.generator.d.ts +0 -7
  103. package/dist/generators/indices/testids.generator.js +0 -71
  104. package/dist/generators/indices/types.generator.d.ts +0 -10
  105. package/dist/generators/indices/types.generator.js +0 -35
  106. package/dist/generators/indices/update/actiontypes.generator.d.ts +0 -9
  107. package/dist/generators/indices/update/actiontypes.generator.js +0 -49
  108. package/dist/generators/indices/update/module.generator.d.ts +0 -9
  109. package/dist/generators/indices/update/module.generator.js +0 -41
  110. package/dist/generators/indices/update/service.generator.d.ts +0 -9
  111. package/dist/generators/indices/update/service.generator.js +0 -34
  112. package/dist/generators/indices/view/module.generator.d.ts +0 -9
  113. package/dist/generators/indices/view/module.generator.js +0 -39
  114. package/dist/generators/indices/view/service.generator.d.ts +0 -9
  115. package/dist/generators/indices/view/service.generator.js +0 -34
  116. package/dist/generators/models/admin.page.generator.d.ts +0 -7
  117. package/dist/generators/models/admin.page.generator.js +0 -74
  118. package/dist/generators/models/export/encoder.generator.d.ts +0 -9
  119. package/dist/generators/models/export/encoder.generator.js +0 -51
  120. package/dist/generators/models/import/decoder.generator.d.ts +0 -9
  121. package/dist/generators/models/import/decoder.generator.js +0 -148
  122. package/dist/generators/models/react/context.generator.d.ts +0 -9
  123. package/dist/generators/models/react/context.generator.js +0 -71
  124. package/dist/generators/models/react/index.d.ts +0 -10
  125. package/dist/generators/models/react/index.js +0 -31
  126. package/dist/generators/models/react/library.generator.d.ts +0 -10
  127. package/dist/generators/models/react/library.generator.js +0 -94
  128. package/dist/generators/models/react/lookup.generator.d.ts +0 -9
  129. package/dist/generators/models/react/lookup.generator.js +0 -175
  130. package/dist/generators/models/react/modals.generator.d.ts +0 -23
  131. package/dist/generators/models/react/modals.generator.js +0 -710
  132. package/dist/generators/models/repository.generator.d.ts +0 -9
  133. package/dist/generators/models/repository.generator.js +0 -955
  134. package/dist/generators/models/route.generator.d.ts +0 -9
  135. package/dist/generators/models/route.generator.js +0 -92
  136. package/dist/generators/models/seed.generator.d.ts +0 -21
  137. package/dist/generators/models/seed.generator.js +0 -285
  138. package/dist/generators/models/stub.generator.d.ts +0 -9
  139. package/dist/generators/models/stub.generator.js +0 -92
  140. package/dist/generators/models/types.generator.d.ts +0 -9
  141. package/dist/generators/models/types.generator.js +0 -125
  142. package/dist/generators/models/update/service.generator.d.ts +0 -10
  143. package/dist/generators/models/update/service.generator.js +0 -302
  144. package/dist/generators/models/view/service.generator.d.ts +0 -10
  145. package/dist/generators/models/view/service.generator.js +0 -239
  146. package/dist/lib/attributes.d.ts +0 -114
  147. package/dist/lib/attributes.js +0 -2
  148. package/dist/lib/exports.d.ts +0 -45
  149. package/dist/lib/exports.js +0 -90
  150. package/dist/lib/imports.d.ts +0 -65
  151. package/dist/lib/imports.js +0 -114
  152. package/dist/lib/meta.d.ts +0 -1191
  153. package/dist/lib/meta.js +0 -434
  154. package/dist/lib/schema/fields.d.ts +0 -46
  155. package/dist/lib/schema/fields.js +0 -62
  156. package/dist/lib/schema/schema.d.ts +0 -466
  157. package/dist/lib/schema/schema.js +0 -18
  158. package/dist/lib/schema/types.d.ts +0 -201
  159. package/dist/lib/schema/types.js +0 -112
  160. package/dist/lib/serializer.d.ts +0 -15
  161. package/dist/lib/serializer.js +0 -24
  162. package/dist/lib/test-id-collector.d.ts +0 -42
  163. package/dist/lib/test-id-collector.js +0 -53
  164. package/dist/lib/types.d.ts +0 -7
  165. package/dist/lib/types.js +0 -13
  166. package/dist/lib/typescript.d.ts +0 -5
  167. package/dist/lib/typescript.js +0 -22
  168. package/dist/lib/utils/ast.d.ts +0 -29
  169. package/dist/lib/utils/ast.js +0 -23
  170. package/dist/lib/utils/error.d.ts +0 -17
  171. package/dist/lib/utils/error.js +0 -52
  172. package/dist/lib/utils/file.d.ts +0 -10
  173. package/dist/lib/utils/file.js +0 -56
  174. package/dist/lib/utils/jsdoc.d.ts +0 -9
  175. package/dist/lib/utils/jsdoc.js +0 -37
  176. package/dist/lib/utils/logger.d.ts +0 -17
  177. package/dist/lib/utils/logger.js +0 -12
  178. package/dist/lib/utils/string.d.ts +0 -40
  179. package/dist/lib/utils/string.js +0 -187
  180. package/dist/lib/utils/types.d.ts +0 -12
  181. package/dist/lib/utils/types.js +0 -2
  182. package/dist/lib/zod.d.ts +0 -8
  183. package/dist/lib/zod.js +0 -60
  184. package/dist/prisma/attributes.d.ts +0 -21
  185. package/dist/prisma/attributes.js +0 -175
  186. package/dist/prisma/client-path.d.ts +0 -7
  187. package/dist/prisma/client-path.js +0 -29
  188. package/dist/prisma/parse.d.ts +0 -12
  189. package/dist/prisma/parse.js +0 -452
@@ -1,452 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.parsePrismaSchema = void 0;
27
- const Types = __importStar(require("../lib/schema/types"));
28
- const error_1 = require("../lib/utils/error");
29
- const logger_1 = require("../lib/utils/logger");
30
- const string_1 = require("../lib/utils/string");
31
- const attributes_1 = require("./attributes");
32
- /**
33
- * Converts a Prisma schema (DMMF) document to a Schema that's passed around generators.
34
- */
35
- function parsePrismaSchema({ datamodel: { enums: enumsRaw, models: modelsRaw }, config, }) {
36
- ensurePXLSystemModelsExist(modelsRaw);
37
- ensureConsistency({ models: modelsRaw, enums: enumsRaw });
38
- // NOTE: We preprocess models and enums so that we can populate relationships.
39
- const models = modelsRaw.map((dmmfModel) => parseModelCore({ dmmfModel, config }));
40
- const enums = enumsRaw.map((dmmfEnum) => parseEnum({ dmmfEnum, config }));
41
- // NOTE: Then we parse the fields of the models.
42
- const modelsWithFields = modelsRaw
43
- .map((dmmfModel) => parseModel({ dmmfModel, models, enums, config }))
44
- .filter(isModelNotIgnored);
45
- // NOTE: Lastly we link back-relations to models.
46
- for (const mwf of modelsWithFields) {
47
- for (const field of mwf.fields) {
48
- if (field.kind !== 'relation') {
49
- continue;
50
- }
51
- const referencedModel = modelsWithFields.find((m) => m.sourceName === field.relationToModel.sourceName);
52
- if (!referencedModel) {
53
- // NOTE: This should never happen because Prisma should validate the validity of the relation.
54
- (0, error_1.throwError)(`Model ${(0, logger_1.highlight)(mwf.name)} not found!`);
55
- }
56
- referencedModel.references.push({
57
- referencingModel: mwf,
58
- referencingField: field,
59
- });
60
- }
61
- }
62
- return { models: modelsWithFields, enums };
63
- }
64
- exports.parsePrismaSchema = parsePrismaSchema;
65
- /**
66
- * These models are required for the generators/backend to work.
67
- */
68
- const SYSTEM_MODELS = ['User', 'File', 'Action', 'Mutation'];
69
- function ensurePXLSystemModelsExist(models) {
70
- for (const requiredModel of SYSTEM_MODELS) {
71
- if (!models.find((m) => m.name === requiredModel)) {
72
- (0, error_1.throwError)(`Required model ${(0, logger_1.highlight)(requiredModel)} not found in schema!`);
73
- }
74
- }
75
- }
76
- /**
77
- * Validates:
78
- * - That there are no duplicate model names
79
- * - That model names are singular
80
- * - That model attributes are valid
81
- * - That field attributes are valid
82
- * - That enum attributes are valid
83
- */
84
- function ensureConsistency({ models, enums }) {
85
- const errors = [];
86
- const modelNames = models.map((m) => m.name);
87
- const duplicateModelName = modelNames.find((name, i) => modelNames.indexOf(name) !== i);
88
- if (duplicateModelName) {
89
- errors.push(`Model ${duplicateModelName} is defined more than once.`);
90
- }
91
- for (const model of models) {
92
- if ((0, string_1.isPlural)(model.name)) {
93
- errors.push(`Model ${(0, logger_1.highlight)(model.name)} is plural. Please use singular names for models.`);
94
- }
95
- try {
96
- (0, attributes_1.getModelAttributes)(model);
97
- }
98
- catch (e) {
99
- errors.push(`Model ${(0, logger_1.highlight)(model.name)} has invalid model attributes: ${(0, error_1.extractError)(e)}`);
100
- }
101
- }
102
- for (const model of models) {
103
- for (const field of model.fields) {
104
- try {
105
- (0, attributes_1.getFieldAttributes)(field);
106
- }
107
- catch (e) {
108
- errors.push(`Model ${(0, logger_1.highlight)(model.name)} has invalid attributes for field ${(0, logger_1.highlight)(field.name)}:
109
- ${(0, error_1.extractError)(e)}`);
110
- }
111
- }
112
- }
113
- for (const enumDef of enums) {
114
- try {
115
- (0, attributes_1.getEnumAttributes)(enumDef);
116
- }
117
- catch (e) {
118
- errors.push(`Enum ${(0, logger_1.highlight)(enumDef.name)} has invalid attributes:
119
- ${(0, error_1.extractError)(e)}`);
120
- }
121
- }
122
- if (errors.length > 0) {
123
- (0, error_1.throwError)(`${errors.length} ${(0, string_1.pluralize)('issue', errors.length)} detected in schema:\n * ${errors.join('\n * ')}`);
124
- }
125
- }
126
- function isModelNotIgnored(model) {
127
- return model !== undefined && !model.attributes.ignore;
128
- }
129
- /**
130
- * Parses the core properties of a model without fields.
131
- */
132
- function parseModelCore({ dmmfModel, config, }) {
133
- if ((0, string_1.isPlural)(dmmfModel.name)) {
134
- (0, error_1.throwError)(`Model ${dmmfModel.name} is plural. Please use singular names for models.`);
135
- }
136
- const attributes = (0, attributes_1.getModelAttributes)(dmmfModel);
137
- return {
138
- name: Types.toModelName((0, string_1.toPascalCase)(dmmfModel.name)),
139
- description: attributes.description,
140
- typeName: Types.toTypeName((0, string_1.toPascalCase)(dmmfModel.name)),
141
- sourceName: dmmfModel.name,
142
- sourceSchemaName: attributes.databaseSchema,
143
- brandedIdType: Types.toTypeName(`${(0, string_1.toPascalCase)(dmmfModel.name)}Id`),
144
- attributes,
145
- schemaConfig: config,
146
- };
147
- }
148
- /**
149
- * Converts a preprocessed model (with DMMF model) to a complete Schema.Model
150
- * by extracting/converting fields from DMMF and attaching them to the model
151
- */
152
- function parseModel({ dmmfModel, enums, models, config, }) {
153
- const core = parseModelCore({ dmmfModel, config });
154
- // NOTE: We ignore models which are marked as ignored.
155
- if (core.attributes.ignore) {
156
- return undefined;
157
- }
158
- // NOTE: We assume that each relation may only reference one field.
159
- // Because of this, we can "relate" a given relation to a scalar field
160
- // used as a foreign key.
161
- //
162
- // Since Prisma doesn't mark foreign-key fields as relations,
163
- // we need to preprocess relations and then figure out which scalar
164
- // fields are actually foreign-keys.
165
- const referencedModels = {};
166
- for (const dmmfField of dmmfModel.fields) {
167
- if (dmmfField.kind !== 'object' || !dmmfField.relationName) {
168
- continue;
169
- }
170
- const referencedModel = models.find((m) => m.sourceName === dmmfField.type);
171
- if (!referencedModel) {
172
- (0, error_1.throwError)(`Field ${(0, logger_1.highlight)(`${dmmfModel.name}.${dmmfField.name}`)} references unknown model ${(0, logger_1.highlight)(dmmfField.type)}.`);
173
- }
174
- if (!dmmfField.relationFromFields || dmmfField.relationFromFields.length === 0) {
175
- // NOTE: This field has no foreign-key values in this model so it must be a back-relation.
176
- continue;
177
- }
178
- if (dmmfField.relationFromFields.length > 1) {
179
- (0, error_1.throwError)(`Field ${(0, logger_1.highlight)(`${dmmfModel.name}.${dmmfField.relationName}`)} has more than one "from" field`);
180
- }
181
- if (dmmfField.relationOnDelete && dmmfField.relationOnDelete !== 'NoAction') {
182
- (0, error_1.throwError)(`Investigate model ${(0, logger_1.highlight)(dmmfModel.name)}: "onDelete" attribute for relationship ${(0, logger_1.highlight)(dmmfField.relationName)} must be "NoAction": any deletes must be handled in the application layer, e.g. to update repository and search caches!`);
183
- }
184
- // NOTE: At this point, we only have the `ModelCore`. After all models are parsed, we need to updated
185
- // the relations with the full `Model`. This is done in the `linkModels` function.
186
- referencedModels[dmmfField.relationFromFields[0]] = referencedModel;
187
- }
188
- const relationFields = dmmfModel.fields
189
- .filter((f) => { var _a, _b; return f.kind === 'object' && ((_a = f.relationToFields) === null || _a === void 0 ? void 0 : _a.length) === 1 && ((_b = f.relationFromFields) === null || _b === void 0 ? void 0 : _b.length) === 1; })
190
- .reduce((acc, f) => {
191
- // NOTE: It's safe to assume that `relationFromFields` and `relationToFields` are defined because of the filter above.
192
- acc[f.relationFromFields[0]] = f;
193
- return acc;
194
- }, {});
195
- const fields = dmmfModel.fields
196
- .filter((dmmfField) => {
197
- // NOTE: This is a relation field that we'll handle when we process its foreign-key. If it's a back relation
198
- // then it won't have a foreign-key and we simply ignore it.
199
- if (dmmfField.kind === 'object') {
200
- return false;
201
- }
202
- return true;
203
- })
204
- .map((dmmfField) => {
205
- const attributes = (0, attributes_1.getFieldAttributes)(dmmfField);
206
- const fieldName = (0, logger_1.highlight)(`${dmmfModel.name}.${dmmfField.name}`);
207
- const shared = {
208
- name: Types.toFieldName((0, string_1.toCamelCase)(dmmfField.name)),
209
- description: attributes.description,
210
- sourceName: dmmfField.name,
211
- isRequired: dmmfField.isRequired,
212
- isUnique: dmmfField.isUnique,
213
- attributes,
214
- schemaConfig: config,
215
- schemaType: dmmfField.type,
216
- };
217
- // NOTE: We mark scalar fields which are used in relations as relation fields by Purple Schema standards.
218
- if (dmmfField.name in referencedModels) {
219
- const refModel = referencedModels[dmmfField.name];
220
- const refField = relationFields[dmmfField.name];
221
- if (!refField) {
222
- (0, error_1.throwError)(`${fieldName}: Relation field ${(0, logger_1.highlight)(dmmfField.name)} not found.`);
223
- }
224
- const _field = Object.assign(Object.assign({ kind: 'relation' }, shared), { relationFieldName: Types.toFieldName(refField.name), unbrandedTypeName: getTsTypeForId(dmmfField), relationToModel: refModel });
225
- return _field;
226
- }
227
- if (dmmfField.isId) {
228
- const isGeneratedField = isAutoIncrementField(dmmfField) || isUUIDField(dmmfField);
229
- const _field = Object.assign(Object.assign({ kind: 'id' }, shared), { name: Types.ID_FIELD_NAME, isUnique: isUniqueField(dmmfField), isGenerated: isGeneratedField, unbrandedTypeName: getTsTypeForId(dmmfField), model: core });
230
- return _field;
231
- }
232
- if (dmmfField.kind === 'scalar') {
233
- let validation = undefined;
234
- if (dmmfField.isList) {
235
- (0, error_1.throwError)(`${fieldName}: Array fields with scalars (e.g. String[]) aren't supported! Use a relation instead. `);
236
- }
237
- if (dmmfField.type === 'Int') {
238
- validation = { type: 'int' };
239
- }
240
- if (dmmfField.type === 'Float') {
241
- validation = { type: 'float' };
242
- }
243
- const _field = Object.assign(Object.assign({ kind: 'scalar', validation }, shared), { isUnique: isUniqueField(dmmfField), isGenerated: isAutoIncrementField(dmmfField), tsTypeName: getTsTypeForScalar(dmmfField) });
244
- if (_field.tsTypeName === 'boolean' && !_field.isRequired) {
245
- (0, error_1.throwError)(`${(0, logger_1.highlight)(`${dmmfModel.name}.${fieldName}`)}: Boolean fields cannot be nullable!`);
246
- }
247
- return _field;
248
- }
249
- if (dmmfField.kind === 'enum') {
250
- const fieldEnumDef = enums.find((e) => e.sourceName === dmmfField.type);
251
- if (!fieldEnumDef) {
252
- (0, error_1.throwError)(`${fieldName}: Field references unknown enum ${(0, logger_1.highlight)(dmmfField.type)}.`);
253
- }
254
- const _field = Object.assign(Object.assign({ kind: 'enum' }, shared), { typeName: getTsTypeForEnum(dmmfField), enumerator: fieldEnumDef });
255
- return _field;
256
- }
257
- (0, error_1.throwError)(`${fieldName} is not scalar, enum nor relation.`);
258
- })
259
- .filter((field) => !isFieldIgnored({ field }));
260
- const { idField, defaultField, nameField, createdAtField, updatedAtField } = getTaggedFields({ fields, model: core });
261
- return Object.assign(Object.assign({}, core), { idField,
262
- defaultField,
263
- nameField,
264
- fields,
265
- createdAtField,
266
- updatedAtField,
267
- // NOTE: This is only a stub because we link references after all models were parsed above.
268
- references: [] });
269
- }
270
- /**
271
- * Returns special fields that are tagged with special attributes.
272
- */
273
- function getTaggedFields({ fields, model: { name }, }) {
274
- var _a;
275
- let idField = undefined;
276
- let createdAtField = undefined;
277
- let updatedAtField = undefined;
278
- let nameField = undefined;
279
- let isNameField = undefined;
280
- let defaultField = undefined;
281
- for (const field of fields) {
282
- const fieldName = (0, logger_1.highlight)(`${name}.${field.name}`);
283
- switch (field.kind) {
284
- case 'id': {
285
- if (idField) {
286
- (0, error_1.throwError)(`${fieldName} has multiple id fields - ${idField.name} and ${field.name}`);
287
- }
288
- idField = field;
289
- break;
290
- }
291
- case 'scalar':
292
- if (field.name === 'name') {
293
- nameField = field;
294
- }
295
- if (field.attributes.isNameField) {
296
- if (isNameField != null) {
297
- (0, error_1.throwError)(`${fieldName} has multiple name fields - ${isNameField.name} and ${field.name}`);
298
- }
299
- isNameField = field;
300
- }
301
- if (field.attributes.isCreatedAt) {
302
- if (createdAtField != null) {
303
- (0, error_1.throwError)(`${fieldName} has multiple createdAt fields - ${createdAtField.name} and ${field.name}`);
304
- }
305
- createdAtField = field;
306
- }
307
- if (field.attributes.isUpdatedAt) {
308
- if (updatedAtField != null) {
309
- (0, error_1.throwError)(`${fieldName} has multiple updatedAt fields - ${updatedAtField.name} and ${field.name}`);
310
- }
311
- updatedAtField = field;
312
- }
313
- if (field.attributes.isDefaultField) {
314
- if (defaultField != null) {
315
- (0, error_1.throwError)(`${fieldName} has multiple default fields - ${defaultField.name} and ${field.name}`);
316
- }
317
- defaultField = field;
318
- }
319
- break;
320
- case 'relation':
321
- break;
322
- case 'enum':
323
- break;
324
- }
325
- }
326
- if (!idField) {
327
- (0, error_1.throwError)(`Model ${(0, logger_1.highlight)(name)} does not have an id field`);
328
- }
329
- return {
330
- idField,
331
- defaultField,
332
- nameField: (_a = isNameField !== null && isNameField !== void 0 ? isNameField : nameField) !== null && _a !== void 0 ? _a : idField,
333
- createdAtField,
334
- updatedAtField,
335
- };
336
- }
337
- function isAutoIncrementField(fieldDmmf) {
338
- if (fieldDmmf.default === undefined) {
339
- return false;
340
- }
341
- if (Array.isArray(fieldDmmf.default)) {
342
- return false;
343
- }
344
- if (typeof fieldDmmf.default === 'object') {
345
- return fieldDmmf.default.name === 'autoincrement';
346
- }
347
- return false;
348
- }
349
- function isUUIDField(fieldDmmf) {
350
- if (fieldDmmf.default === undefined) {
351
- return false;
352
- }
353
- if (Array.isArray(fieldDmmf.default)) {
354
- return false;
355
- }
356
- if (typeof fieldDmmf.default === 'object') {
357
- return fieldDmmf.default.name === 'uuid' || fieldDmmf.default.name === 'cuid';
358
- }
359
- return false;
360
- }
361
- function isUniqueField(fieldRaw) {
362
- return fieldRaw.isUnique && fieldRaw.type === 'String';
363
- }
364
- /**
365
- * Tells whether the parsed schema should skip a given field.
366
- */
367
- function isFieldIgnored({ field }) {
368
- if (Object.hasOwn(field.attributes, 'ignore') && field.attributes.ignore) {
369
- return true;
370
- }
371
- if (field.kind === 'relation' && field.relationToModel.attributes.ignore) {
372
- return true;
373
- }
374
- return false;
375
- }
376
- /**
377
- * Parses a given enumerator type.
378
- */
379
- function parseEnum({ dmmfEnum, config }) {
380
- const attributes = (0, attributes_1.getEnumAttributes)(dmmfEnum);
381
- return {
382
- name: Types.toEnumName(dmmfEnum.name),
383
- description: attributes.description,
384
- attributes,
385
- tsTypeName: Types.toTypeName((0, string_1.toPascalCase)(dmmfEnum.name)),
386
- sourceName: dmmfEnum.name,
387
- values: dmmfEnum.values.map((v) => v.name),
388
- schemaConfig: config,
389
- };
390
- }
391
- /**
392
- * Returns the TypeScript type of a scalar database field
393
- */
394
- function getTsTypeForScalar(field) {
395
- switch (field.type) {
396
- case 'BigInt':
397
- case 'String':
398
- return Types.toTypeName('string');
399
- case 'Boolean':
400
- return Types.toTypeName('boolean');
401
- case 'DateTime':
402
- return Types.toTypeName('Date');
403
- case 'Decimal':
404
- case 'Float':
405
- case 'Int':
406
- return Types.toTypeName('number');
407
- case 'Json':
408
- case 'Bytes':
409
- (0, error_1.throwError)(`Field ${(0, logger_1.highlight)(field.name)}: Type ${field.type} Not implemented yet`);
410
- // While TypeScript understands that throwError never returns, eslint doesn't and complains.
411
- // Hence we ignore the fallthrough error.
412
- // eslint-disable-next-line no-fallthrough
413
- default:
414
- (0, error_1.throwError)(`Investigate: 'default' case in getTsTypeForScalar for field ${(0, logger_1.highlight)(field.name)} of type ${field.type}`);
415
- }
416
- }
417
- /**
418
- * Returns the TypeScript type of a scalar id field.
419
- */
420
- function getTsTypeForId(field) {
421
- switch (field.type) {
422
- case 'BigInt':
423
- case 'String':
424
- return Types.toTypeName('string');
425
- case 'Boolean':
426
- return Types.toTypeName('boolean');
427
- case 'Decimal':
428
- case 'Float':
429
- case 'Int':
430
- return Types.toTypeName('number');
431
- default:
432
- (0, error_1.throwError)(`The id field ${(0, logger_1.highlight)(field.name)} is of type ${field.type} - but only BigInt, Boolean, Decimal, Float, Int and String are supported for Ids.`);
433
- }
434
- }
435
- /**
436
- * Returns the TypeScript type of an enum field.
437
- */
438
- function getTsTypeForEnum(field) {
439
- switch (field.type) {
440
- case 'String':
441
- return Types.toTypeName('string');
442
- case 'BigInt':
443
- case 'Boolean':
444
- case 'Decimal':
445
- case 'Float':
446
- case 'Int':
447
- (0, error_1.throwError)(`The enum field ${(0, logger_1.highlight)(field.name)} is of type ${field.type} - but only String fields are supported for enums so far.`);
448
- break;
449
- default:
450
- return Types.toTypeName(field.type);
451
- }
452
- }