@postxl/generator 0.0.10 → 0.0.12
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/changelog.md
CHANGED
package/dist/src/generator.js
CHANGED
|
@@ -58,6 +58,45 @@ const stubs_generator_1 = require("./generators/indices/stubs.generator");
|
|
|
58
58
|
const seed_generator_2 = require("./generators/indices/seed.generator");
|
|
59
59
|
const types_generator_3 = require("./generators/indices/types.generator");
|
|
60
60
|
const testdataservice_generator_1 = require("./generators/indices/testdataservice.generator");
|
|
61
|
+
const zod_1 = require("zod");
|
|
62
|
+
const configDecoder = zod_1.z
|
|
63
|
+
.object({
|
|
64
|
+
project: zod_1.z.string(),
|
|
65
|
+
pathToTypes: zod_1.z.string().optional(),
|
|
66
|
+
pathToDataLib: zod_1.z.string().optional(),
|
|
67
|
+
pathToSeedLib: zod_1.z.string().optional(),
|
|
68
|
+
trpcRoutesFolder: zod_1.z.string().optional(),
|
|
69
|
+
reactFolderOutput: zod_1.z.string().optional(),
|
|
70
|
+
randomSeed: zod_1.z
|
|
71
|
+
.string()
|
|
72
|
+
.optional()
|
|
73
|
+
.transform((v) => (v === undefined ? 1 : parseInt(v))),
|
|
74
|
+
force: zod_1.z
|
|
75
|
+
.string()
|
|
76
|
+
.optional()
|
|
77
|
+
.transform((v) => (v === undefined ? false : v === 'true')),
|
|
78
|
+
})
|
|
79
|
+
.transform((s) => {
|
|
80
|
+
return {
|
|
81
|
+
project: s.project,
|
|
82
|
+
paths: {
|
|
83
|
+
dataLibPath: (0, types_1.toPath)(s.pathToDataLib || 'repos'),
|
|
84
|
+
reactFolderPath: (0, types_1.toPath)(s.reactFolderOutput || 'react'),
|
|
85
|
+
modelTypeDefinitionsPath: (0, types_1.toPath)(s.pathToTypes || 'types'),
|
|
86
|
+
seedPath: (0, types_1.toPath)(s.pathToSeedLib || 'seed'),
|
|
87
|
+
trpcRoutesFolderPath: (0, types_1.toPath)(s.trpcRoutesFolder || 'trpc'),
|
|
88
|
+
},
|
|
89
|
+
randomSeed: s.randomSeed,
|
|
90
|
+
force: s.force,
|
|
91
|
+
disableGenerators: {
|
|
92
|
+
types: s.pathToTypes === undefined,
|
|
93
|
+
data: s.pathToDataLib === undefined,
|
|
94
|
+
seed: s.pathToSeedLib === undefined,
|
|
95
|
+
trpc: s.trpcRoutesFolder === undefined,
|
|
96
|
+
react: s.reactFolderOutput === undefined,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
});
|
|
61
100
|
(0, generator_helper_1.generatorHandler)({
|
|
62
101
|
onManifest() {
|
|
63
102
|
internals_1.logger.info(`PXL Registered`);
|
|
@@ -70,18 +109,11 @@ const testdataservice_generator_1 = require("./generators/indices/testdataservic
|
|
|
70
109
|
onGenerate: ({ generator, otherGenerators, dmmf }) => __awaiter(void 0, void 0, void 0, function* () {
|
|
71
110
|
internals_1.logger.info(`PXL started generating code...`);
|
|
72
111
|
const prismaClientPath = (0, client_path_1.getClientImportPath)(otherGenerators);
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
modelTypeDefinitionsPath: (0, types_1.toPath)(generator.config['pathToTypes'] || 'types'),
|
|
79
|
-
seedPath: (0, types_1.toPath)(generator.config['pathToSeedLib'] || 'seed'),
|
|
80
|
-
trpcRoutesFolderPath: (0, types_1.toPath)(generator.config['trpcRoutesFolder'] || 'trpc'),
|
|
81
|
-
},
|
|
82
|
-
randomSeed: parseInt(generator.config['randomSeed']) || 1,
|
|
83
|
-
force: generator.config['force'] === 'true',
|
|
84
|
-
};
|
|
112
|
+
const decodedConfig = configDecoder.safeParse(generator.config);
|
|
113
|
+
if (!decodedConfig.success) {
|
|
114
|
+
throw new Error(`Invalid generator config: ${decodedConfig.error.message}`);
|
|
115
|
+
}
|
|
116
|
+
const config = decodedConfig.data;
|
|
85
117
|
internals_1.logger.log(`Parsing DMMF...`);
|
|
86
118
|
const { models, enums } = (0, parse_1.parsePrismaSchema)({ datamodel: dmmf.datamodel, config });
|
|
87
119
|
internals_1.logger.log(`Generating...`);
|
|
@@ -99,36 +131,58 @@ const generate = ({ models, enums, config, prismaClientPath, logger, }) => __awa
|
|
|
99
131
|
for (const model of models) {
|
|
100
132
|
const meta = (0, meta_1.getModelMetadata)({ model });
|
|
101
133
|
// Types
|
|
102
|
-
|
|
134
|
+
if (!config.disableGenerators.types) {
|
|
135
|
+
vfs.write(`/${meta.types.filePath}.ts`, (0, types_generator_1.generateModelTypes)({ model, meta }));
|
|
136
|
+
}
|
|
103
137
|
// Seed
|
|
104
|
-
|
|
138
|
+
if (!config.disableGenerators.seed) {
|
|
139
|
+
vfs.write(`/${meta.seed.filePath}.ts`, (0, seed_generator_1.generateSeedModel)({ model, itemCount: 5, meta }));
|
|
140
|
+
}
|
|
105
141
|
// Generate Repositories
|
|
106
|
-
|
|
107
|
-
|
|
142
|
+
if (!config.disableGenerators.data) {
|
|
143
|
+
vfs.write(`/${meta.data.stubFilePath}.ts`, (0, stub_generator_1.generateStub)({ model, meta }));
|
|
144
|
+
vfs.write(`/${meta.data.repoFilePath}.ts`, (0, repository_generator_1.generateRepository)({ model, meta }));
|
|
145
|
+
}
|
|
108
146
|
// Routes
|
|
109
|
-
|
|
147
|
+
if (!config.disableGenerators.trpc) {
|
|
148
|
+
vfs.write(`/${meta.trpc.routerFilePath}.ts`, (0, route_generator_1.generateRoute)({ model, meta }));
|
|
149
|
+
}
|
|
110
150
|
// React
|
|
111
|
-
|
|
151
|
+
if (!config.disableGenerators.react) {
|
|
152
|
+
vfs.copy((0, react_generator_1.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
|
|
153
|
+
}
|
|
112
154
|
logger.log(`✅ ${model.name} generated!`);
|
|
113
155
|
}
|
|
114
156
|
// Generate Enums
|
|
115
157
|
for (const enumerator of enums.values()) {
|
|
116
158
|
const meta = (0, meta_1.getEnumMetadata)({ enumerator });
|
|
117
|
-
|
|
118
|
-
|
|
159
|
+
if (!config.disableGenerators.types) {
|
|
160
|
+
vfs.write(`/${meta.types.filePath}.ts`, (0, types_generator_2.generateEnumType)({ enumerator, prismaClientPath, meta }));
|
|
161
|
+
}
|
|
162
|
+
if (!config.disableGenerators.react) {
|
|
163
|
+
vfs.copy((0, react_generator_2.generateEnumReactComponents)({ enumerator, meta }), meta.react.folderPath);
|
|
164
|
+
}
|
|
119
165
|
}
|
|
120
166
|
// Generate Index Files and Services
|
|
121
167
|
const meta = (0, meta_1.getSchemaMetadata)({ config });
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
168
|
+
if (!config.disableGenerators.data) {
|
|
169
|
+
vfs.write(`/${meta.data.dataMockModuleFilePath}.ts`, (0, datamockmodule_generator_1.generateDataMockModule)({ models, meta }));
|
|
170
|
+
vfs.write(`/${meta.data.dataModuleFilePath}.ts`, (0, datamodule_generator_1.generateDataModule)({ models, meta }));
|
|
171
|
+
vfs.write(`/${meta.data.dataServiceFilePath}.ts`, (0, dataservice_generator_1.generateDataService)({ models, meta }));
|
|
172
|
+
vfs.write(`/${meta.data.testDataServiceFilePath}.ts`, (0, testdataservice_generator_1.generateTestDataService)({ meta }));
|
|
173
|
+
vfs.write(`/${meta.data.repositoriesConstFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesArray)({ models, meta }));
|
|
174
|
+
vfs.write(`/${meta.data.repositoriesIndexFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesIndex)({ models, meta }));
|
|
175
|
+
vfs.write(`/${meta.data.stubIndexFilePath}.ts`, (0, stubs_generator_1.generateStubsIndex)({ models, meta }));
|
|
176
|
+
}
|
|
177
|
+
if (!config.disableGenerators.seed) {
|
|
178
|
+
vfs.write(`/${meta.seed.indexFilePath}.ts`, (0, seed_generator_2.generateSeedIndex)({ models, meta }));
|
|
179
|
+
}
|
|
180
|
+
if (!config.disableGenerators.trpc) {
|
|
181
|
+
vfs.write(`/${meta.trpc.routesFilePath}.ts`, (0, route_generator_1.generateRoutesIndex)({ models, meta }));
|
|
182
|
+
}
|
|
183
|
+
if (!config.disableGenerators.types) {
|
|
184
|
+
vfs.write(`/${meta.types.indexFilePath}.ts`, (0, types_generator_3.generateTypesIndex)({ models, enums, meta }));
|
|
185
|
+
}
|
|
132
186
|
// -------------------------------------------------------------------------
|
|
133
187
|
// Add disclaimer and format.
|
|
134
188
|
const prettierConfig = yield prettier.resolveConfig(process.cwd());
|
|
@@ -134,12 +134,8 @@ export class ${meta.data.repositoryClassName} implements Repository<
|
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
public async createWithId(item: Omit<${model.typeName}, '${idField.name}'> & {
|
|
137
|
-
id: ${model.brandedIdType}
|
|
138
|
-
}): Promise<${model.typeName}> {
|
|
139
|
-
if (item.${idField.name} === undefined) {
|
|
140
|
-
return this.create(item)
|
|
141
|
-
}
|
|
142
|
-
|
|
137
|
+
id: ${model.brandedIdType}
|
|
138
|
+
}): Promise<${model.typeName}> {
|
|
143
139
|
const newItem = this.${decoder}(
|
|
144
140
|
await this.db.${meta.data.repository.getMethodFnName}.create({
|
|
145
141
|
data: this.toCreateItem(item as ${model.typeName}),
|
|
@@ -187,13 +183,12 @@ export class ${meta.data.repositoryClassName} implements Repository<
|
|
|
187
183
|
}
|
|
188
184
|
|
|
189
185
|
public async update(item: Partial<${model.typeName}> & {
|
|
190
|
-
id: ${model.brandedIdType}
|
|
186
|
+
id: ${model.brandedIdType}
|
|
191
187
|
}): Promise<${model.typeName}> {
|
|
192
|
-
const
|
|
193
|
-
const existingItem = this.get(id)
|
|
188
|
+
const existingItem = this.get(item.id)
|
|
194
189
|
|
|
195
190
|
if (!existingItem) {
|
|
196
|
-
throw new Error(\`Could not update ${meta.userFriendlyName} with id \${id}. Not found!\`)
|
|
191
|
+
throw new Error(\`Could not update ${meta.userFriendlyName} with id \${item.id}. Not found!\`)
|
|
197
192
|
}
|
|
198
193
|
|
|
199
194
|
${uniqueStringFields
|
|
@@ -11,6 +11,31 @@ export type SchemaConfig = {
|
|
|
11
11
|
* Project scope to use in TypeScript imports (e.g. `mca` for `@mca/types`).
|
|
12
12
|
*/
|
|
13
13
|
project: string;
|
|
14
|
+
/**
|
|
15
|
+
* Indicates whether the generator should be ignored
|
|
16
|
+
*/
|
|
17
|
+
disableGenerators: {
|
|
18
|
+
/**
|
|
19
|
+
* If true, type definitions for models will not be generated.
|
|
20
|
+
*/
|
|
21
|
+
types: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* If true, data module will not be generated.
|
|
24
|
+
*/
|
|
25
|
+
data: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* If true, seed data will not be generated.
|
|
28
|
+
*/
|
|
29
|
+
seed: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* If true, React components will not be generated.
|
|
32
|
+
*/
|
|
33
|
+
react: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* If true, trpc routes will not be generated.
|
|
36
|
+
*/
|
|
37
|
+
trpc: boolean;
|
|
38
|
+
};
|
|
14
39
|
paths: {
|
|
15
40
|
/**
|
|
16
41
|
* Path to the directory containing model type definitions.
|