@postxl/generator 0.74.2 → 1.0.3
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/LICENSE +50 -0
- package/README.md +79 -1
- package/dist/generator-manager.class.d.ts +59 -0
- package/dist/generator-manager.class.js +221 -0
- package/dist/generator.class.d.ts +90 -0
- package/dist/generator.class.js +32 -0
- package/dist/generator.context.d.ts +174 -0
- package/dist/generator.context.js +125 -0
- package/dist/helpers/branded.types.d.ts +149 -0
- package/dist/helpers/branded.types.js +111 -0
- package/dist/helpers/config-builder.class.d.ts +27 -0
- package/dist/helpers/config-builder.class.js +54 -0
- package/dist/helpers/import-generator.class.d.ts +70 -0
- package/dist/helpers/import-generator.class.js +166 -0
- package/dist/helpers/importable.types.d.ts +52 -0
- package/dist/helpers/importable.types.js +15 -0
- package/dist/helpers/index-generator.class.d.ts +10 -0
- package/dist/helpers/index-generator.class.js +46 -0
- package/dist/helpers/index.d.ts +8 -0
- package/dist/helpers/index.js +24 -0
- package/dist/helpers/package-json.generator.d.ts +56 -0
- package/dist/helpers/package-json.generator.js +36 -0
- package/dist/helpers/tsconfig.generator.d.ts +1 -0
- package/dist/helpers/tsconfig.generator.js +14 -0
- package/dist/helpers/verify-context.d.ts +4 -0
- package/dist/helpers/verify-context.js +23 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +21 -0
- package/dist/utils/checksum.d.ts +10 -0
- package/dist/utils/checksum.js +132 -0
- package/dist/utils/fs-utils.d.ts +34 -0
- package/dist/utils/fs-utils.js +126 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.js +26 -0
- package/dist/utils/jsdoc.d.ts +12 -0
- package/dist/utils/jsdoc.js +37 -0
- package/dist/utils/lint.d.ts +46 -0
- package/dist/utils/lint.js +154 -0
- package/dist/utils/lockfile.d.ts +7 -0
- package/dist/utils/lockfile.js +80 -0
- package/dist/utils/logger.class.d.ts +25 -0
- package/dist/utils/logger.class.js +55 -0
- package/dist/utils/merge-conflict.d.ts +55 -0
- package/dist/utils/merge-conflict.js +264 -0
- package/dist/utils/path.d.ts +52 -0
- package/dist/utils/path.js +183 -0
- package/dist/utils/prettier-config.d.ts +2 -0
- package/dist/utils/prettier-config.js +13 -0
- package/dist/utils/prettier.d.ts +5 -0
- package/dist/utils/prettier.js +67 -0
- package/dist/utils/prettier.skiptest.d.ts +1 -0
- package/dist/utils/prettier.skiptest.js +22 -0
- package/dist/utils/promise.d.ts +2 -0
- package/dist/utils/promise.js +10 -0
- package/dist/utils/string-functions.d.ts +9 -0
- package/dist/utils/string-functions.js +23 -0
- package/dist/utils/sync-log-result.d.ts +9 -0
- package/dist/utils/sync-log-result.js +90 -0
- package/dist/utils/sync.d.ts +143 -0
- package/dist/utils/sync.js +325 -0
- package/dist/utils/template.d.ts +66 -0
- package/dist/utils/template.js +159 -0
- package/dist/utils/vfs.class.d.ts +115 -0
- package/dist/utils/vfs.class.js +239 -0
- package/dist/utils/zip.d.ts +13 -0
- package/dist/utils/zip.js +40 -0
- package/package.json +53 -31
- package/dist/generator.d.ts +0 -13
- package/dist/generator.js +0 -455
- package/dist/generators/enums/react.generator.d.ts +0 -10
- package/dist/generators/enums/react.generator.js +0 -110
- package/dist/generators/enums/types.generator.d.ts +0 -10
- package/dist/generators/enums/types.generator.js +0 -39
- package/dist/generators/indices/data/module.generator.d.ts +0 -9
- package/dist/generators/indices/data/module.generator.js +0 -60
- package/dist/generators/indices/data/service.generator.d.ts +0 -9
- package/dist/generators/indices/data/service.generator.js +0 -249
- package/dist/generators/indices/data/types.generator.d.ts +0 -9
- package/dist/generators/indices/data/types.generator.js +0 -49
- package/dist/generators/indices/dispatcher-service.generator.d.ts +0 -9
- package/dist/generators/indices/dispatcher-service.generator.js +0 -107
- package/dist/generators/indices/export/class.generator.d.ts +0 -9
- package/dist/generators/indices/export/class.generator.js +0 -140
- package/dist/generators/indices/export/encoder.generator.d.ts +0 -9
- package/dist/generators/indices/export/encoder.generator.js +0 -50
- package/dist/generators/indices/import/convert-functions.generator.d.ts +0 -9
- package/dist/generators/indices/import/convert-functions.generator.js +0 -509
- package/dist/generators/indices/import/decoder.generator.d.ts +0 -9
- package/dist/generators/indices/import/decoder.generator.js +0 -40
- package/dist/generators/indices/import/service.generator.d.ts +0 -9
- package/dist/generators/indices/import/service.generator.js +0 -573
- package/dist/generators/indices/import/types.generator.d.ts +0 -9
- package/dist/generators/indices/import/types.generator.js +0 -242
- package/dist/generators/indices/repositories.generator.d.ts +0 -9
- package/dist/generators/indices/repositories.generator.js +0 -25
- package/dist/generators/indices/routes.generator.d.ts +0 -9
- package/dist/generators/indices/routes.generator.js +0 -29
- package/dist/generators/indices/seed-migration.generator.d.ts +0 -9
- package/dist/generators/indices/seed-migration.generator.js +0 -36
- package/dist/generators/indices/seed-template.generator.d.ts +0 -9
- package/dist/generators/indices/seed-template.generator.js +0 -80
- package/dist/generators/indices/testids.generator.d.ts +0 -7
- package/dist/generators/indices/testids.generator.js +0 -71
- package/dist/generators/indices/types.generator.d.ts +0 -10
- package/dist/generators/indices/types.generator.js +0 -35
- package/dist/generators/indices/update/actiontypes.generator.d.ts +0 -9
- package/dist/generators/indices/update/actiontypes.generator.js +0 -49
- package/dist/generators/indices/update/module.generator.d.ts +0 -9
- package/dist/generators/indices/update/module.generator.js +0 -41
- package/dist/generators/indices/update/service.generator.d.ts +0 -9
- package/dist/generators/indices/update/service.generator.js +0 -34
- package/dist/generators/indices/view/module.generator.d.ts +0 -9
- package/dist/generators/indices/view/module.generator.js +0 -39
- package/dist/generators/indices/view/service.generator.d.ts +0 -9
- package/dist/generators/indices/view/service.generator.js +0 -34
- package/dist/generators/models/admin.page.generator.d.ts +0 -7
- package/dist/generators/models/admin.page.generator.js +0 -74
- package/dist/generators/models/export/encoder.generator.d.ts +0 -9
- package/dist/generators/models/export/encoder.generator.js +0 -51
- package/dist/generators/models/import/decoder.generator.d.ts +0 -9
- package/dist/generators/models/import/decoder.generator.js +0 -148
- package/dist/generators/models/react/context.generator.d.ts +0 -9
- package/dist/generators/models/react/context.generator.js +0 -71
- package/dist/generators/models/react/index.d.ts +0 -10
- package/dist/generators/models/react/index.js +0 -31
- package/dist/generators/models/react/library.generator.d.ts +0 -10
- package/dist/generators/models/react/library.generator.js +0 -94
- package/dist/generators/models/react/lookup.generator.d.ts +0 -9
- package/dist/generators/models/react/lookup.generator.js +0 -175
- package/dist/generators/models/react/modals.generator.d.ts +0 -23
- package/dist/generators/models/react/modals.generator.js +0 -710
- package/dist/generators/models/repository.generator.d.ts +0 -9
- package/dist/generators/models/repository.generator.js +0 -955
- package/dist/generators/models/route.generator.d.ts +0 -9
- package/dist/generators/models/route.generator.js +0 -92
- package/dist/generators/models/seed.generator.d.ts +0 -21
- package/dist/generators/models/seed.generator.js +0 -285
- package/dist/generators/models/stub.generator.d.ts +0 -9
- package/dist/generators/models/stub.generator.js +0 -92
- package/dist/generators/models/types.generator.d.ts +0 -9
- package/dist/generators/models/types.generator.js +0 -125
- package/dist/generators/models/update/service.generator.d.ts +0 -10
- package/dist/generators/models/update/service.generator.js +0 -302
- package/dist/generators/models/view/service.generator.d.ts +0 -10
- package/dist/generators/models/view/service.generator.js +0 -239
- package/dist/lib/attributes.d.ts +0 -114
- package/dist/lib/attributes.js +0 -2
- package/dist/lib/exports.d.ts +0 -45
- package/dist/lib/exports.js +0 -90
- package/dist/lib/imports.d.ts +0 -65
- package/dist/lib/imports.js +0 -114
- package/dist/lib/meta.d.ts +0 -1191
- package/dist/lib/meta.js +0 -434
- package/dist/lib/schema/fields.d.ts +0 -46
- package/dist/lib/schema/fields.js +0 -62
- package/dist/lib/schema/schema.d.ts +0 -466
- package/dist/lib/schema/schema.js +0 -18
- package/dist/lib/schema/types.d.ts +0 -201
- package/dist/lib/schema/types.js +0 -112
- package/dist/lib/serializer.d.ts +0 -15
- package/dist/lib/serializer.js +0 -24
- package/dist/lib/test-id-collector.d.ts +0 -42
- package/dist/lib/test-id-collector.js +0 -53
- package/dist/lib/types.d.ts +0 -7
- package/dist/lib/types.js +0 -13
- package/dist/lib/typescript.d.ts +0 -5
- package/dist/lib/typescript.js +0 -22
- package/dist/lib/utils/ast.d.ts +0 -29
- package/dist/lib/utils/ast.js +0 -23
- package/dist/lib/utils/error.d.ts +0 -17
- package/dist/lib/utils/error.js +0 -52
- package/dist/lib/utils/file.d.ts +0 -10
- package/dist/lib/utils/file.js +0 -56
- package/dist/lib/utils/jsdoc.d.ts +0 -9
- package/dist/lib/utils/jsdoc.js +0 -37
- package/dist/lib/utils/logger.d.ts +0 -17
- package/dist/lib/utils/logger.js +0 -12
- package/dist/lib/utils/string.d.ts +0 -40
- package/dist/lib/utils/string.js +0 -187
- package/dist/lib/utils/types.d.ts +0 -12
- package/dist/lib/utils/types.js +0 -2
- package/dist/lib/zod.d.ts +0 -8
- package/dist/lib/zod.js +0 -60
- package/dist/prisma/attributes.d.ts +0 -21
- package/dist/prisma/attributes.js +0 -175
- package/dist/prisma/client-path.d.ts +0 -7
- package/dist/prisma/client-path.js +0 -29
- package/dist/prisma/parse.d.ts +0 -12
- package/dist/prisma/parse.js +0 -452
package/dist/prisma/parse.js
DELETED
|
@@ -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
|
-
}
|