@postxl/generator 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generator.d.ts +2 -2
- package/dist/generator.js +76 -74
- package/dist/generators/indices/dataservice.generator.js +2 -2
- package/dist/generators/indices/emptydatabasemigration.generator.d.ts +1 -1
- package/dist/generators/indices/emptydatabasemigration.generator.js +4 -2
- package/dist/generators/models/react.generator/modals.generator.js +1 -1
- package/dist/generators/models/repository.generator.js +10 -3
- package/dist/prisma/attributes.js +1 -1
- package/package.json +2 -2
package/dist/generator.d.ts
CHANGED
|
@@ -4,10 +4,10 @@ import { Logger } from './lib/utils/logger';
|
|
|
4
4
|
/**
|
|
5
5
|
* Generates PXL files and flushes them to disk.
|
|
6
6
|
*/
|
|
7
|
-
export declare
|
|
7
|
+
export declare function generate({ models, enums, config, prismaClientPath, logger, }: {
|
|
8
8
|
models: Schema.Model[];
|
|
9
9
|
enums: Schema.Enum[];
|
|
10
10
|
config: Schema.SchemaConfig;
|
|
11
11
|
prismaClientPath: string;
|
|
12
12
|
logger: Logger;
|
|
13
|
-
})
|
|
13
|
+
}): Promise<void>;
|
package/dist/generator.js
CHANGED
|
@@ -61,7 +61,7 @@ const meta_1 = require("./lib/meta");
|
|
|
61
61
|
const types_1 = require("./lib/schema/types");
|
|
62
62
|
const client_path_1 = require("./prisma/client-path");
|
|
63
63
|
const parse_1 = require("./prisma/parse");
|
|
64
|
-
const
|
|
64
|
+
const CONFIG_SCHEMA = zod_1.z
|
|
65
65
|
.object({
|
|
66
66
|
project: zod_1.z.string(),
|
|
67
67
|
pathToTypes: zod_1.z.string().optional(),
|
|
@@ -113,7 +113,7 @@ const configDecoder = zod_1.z
|
|
|
113
113
|
onGenerate: ({ generator, otherGenerators, dmmf }) => __awaiter(void 0, void 0, void 0, function* () {
|
|
114
114
|
internals_1.logger.info(`PXL started generating code...`);
|
|
115
115
|
const prismaClientPath = (0, client_path_1.getClientImportPath)(otherGenerators);
|
|
116
|
-
const decodedConfig =
|
|
116
|
+
const decodedConfig = CONFIG_SCHEMA.safeParse(generator.config);
|
|
117
117
|
if (!decodedConfig.success) {
|
|
118
118
|
throw new Error(`Invalid generator config: ${decodedConfig.error.message}`);
|
|
119
119
|
}
|
|
@@ -121,92 +121,94 @@ const configDecoder = zod_1.z
|
|
|
121
121
|
internals_1.logger.log(`Parsing DMMF...`);
|
|
122
122
|
const { models, enums } = (0, parse_1.parsePrismaSchema)({ datamodel: dmmf.datamodel, config });
|
|
123
123
|
internals_1.logger.log(`Generating...`);
|
|
124
|
-
yield
|
|
124
|
+
yield generate({ models, enums, config, prismaClientPath, logger: internals_1.logger });
|
|
125
125
|
internals_1.logger.info(`PXL finished!`);
|
|
126
126
|
}),
|
|
127
127
|
});
|
|
128
128
|
/**
|
|
129
129
|
* Generates PXL files and flushes them to disk.
|
|
130
130
|
*/
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
faker_1.faker.seed(config.randomSeed);
|
|
137
|
-
const vfs = yield lock_1.VirtualFS.fromLockFile(root);
|
|
138
|
-
const generated = new lock_1.VirtualFS();
|
|
139
|
-
// Generate Models
|
|
140
|
-
for (const model of models) {
|
|
141
|
-
const meta = (0, meta_1.getModelMetadata)({ model });
|
|
142
|
-
// Types
|
|
143
|
-
if (!config.disableGenerators.types) {
|
|
144
|
-
generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_3.generateModelTypes)({ model, meta }));
|
|
131
|
+
function generate({ models, enums, config, prismaClientPath, logger, }) {
|
|
132
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
+
const root = yield lock_1.LockUtils.findProjectRoot();
|
|
134
|
+
if (root == undefined) {
|
|
135
|
+
throw new Error(`Could not find lock file. Make sure you are running the generator in a project folder.`);
|
|
145
136
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
137
|
+
faker_1.faker.seed(config.randomSeed);
|
|
138
|
+
const vfs = yield lock_1.VirtualFS.fromLockFile(root);
|
|
139
|
+
const generated = new lock_1.VirtualFS();
|
|
140
|
+
// Generate Models
|
|
141
|
+
for (const model of models) {
|
|
142
|
+
const meta = (0, meta_1.getModelMetadata)({ model });
|
|
143
|
+
// Types
|
|
144
|
+
if (!config.disableGenerators.types) {
|
|
145
|
+
generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_3.generateModelTypes)({ model, meta }));
|
|
146
|
+
}
|
|
147
|
+
// Seed
|
|
148
|
+
if (!config.disableGenerators.seed) {
|
|
149
|
+
generated.write(`/${meta.seed.filePath}.ts`, (0, seed_generator_2.generateSeedModel)({ model, itemCount: 5, meta }));
|
|
150
|
+
}
|
|
151
|
+
// Generate Repositories
|
|
152
|
+
if (!config.disableGenerators.data) {
|
|
153
|
+
generated.write(`/${meta.data.stubFilePath}.ts`, (0, stub_generator_1.generateStub)({ model, meta }));
|
|
154
|
+
generated.write(`/${meta.data.repoFilePath}.ts`, (0, repository_generator_1.generateRepository)({ model, meta }));
|
|
155
|
+
generated.write(`/${meta.data.mockRepoFilePath}.ts`, (0, repository_generator_1.generateMockRepository)({ model, meta }));
|
|
156
|
+
}
|
|
157
|
+
// Routes
|
|
158
|
+
if (!config.disableGenerators.trpc) {
|
|
159
|
+
generated.write(`/${meta.trpc.routerFilePath}.ts`, (0, route_generator_1.generateRoute)({ model, meta }));
|
|
160
|
+
}
|
|
161
|
+
// React
|
|
162
|
+
if (!config.disableGenerators.react) {
|
|
163
|
+
generated.copy((0, react_generator_2.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
|
|
164
|
+
}
|
|
165
|
+
logger.log(`- ${model.name} processed`);
|
|
166
|
+
}
|
|
167
|
+
// Generate Enums
|
|
168
|
+
for (const enumerator of enums.values()) {
|
|
169
|
+
const meta = (0, meta_1.getEnumMetadata)({ enumerator });
|
|
170
|
+
if (!config.disableGenerators.types) {
|
|
171
|
+
generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_1.generateEnumType)({ enumerator, prismaClientPath, meta }));
|
|
172
|
+
}
|
|
173
|
+
if (!config.disableGenerators.react) {
|
|
174
|
+
generated.copy((0, react_generator_1.generateEnumReactComponents)({ enumerator, meta }), meta.react.folderPath);
|
|
175
|
+
}
|
|
149
176
|
}
|
|
150
|
-
// Generate
|
|
177
|
+
// Generate Index Files and Services
|
|
178
|
+
const meta = (0, meta_1.getSchemaMetadata)({ config });
|
|
151
179
|
if (!config.disableGenerators.data) {
|
|
152
|
-
generated.write(`/${meta.data.
|
|
153
|
-
generated.write(`/${meta.data.
|
|
154
|
-
generated.write(`/${meta.data.
|
|
180
|
+
generated.write(`/${meta.data.dataMockModuleFilePath}.ts`, (0, datamockmodule_generator_1.generateDataMockModule)({ models, meta }));
|
|
181
|
+
generated.write(`/${meta.data.dataModuleFilePath}.ts`, (0, datamodule_generator_1.generateDataModule)({ models, meta }));
|
|
182
|
+
generated.write(`/${meta.data.dataServiceFilePath}.ts`, (0, dataservice_generator_1.generateDataService)({ models, meta }));
|
|
183
|
+
generated.write(`/${meta.data.testDataServiceFilePath}.ts`, (0, testdataservice_generator_1.generateTestDataService)({ models, meta }));
|
|
184
|
+
generated.write(`/${meta.data.repositoriesConstFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesArray)({ models, meta }));
|
|
185
|
+
generated.write(`/${meta.data.repositoriesIndexFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesIndex)({ models, meta }));
|
|
186
|
+
generated.write(`/${meta.data.stubIndexFilePath}.ts`, (0, stubs_generator_1.generateStubsIndex)({ models, meta }));
|
|
187
|
+
generated.write(`/${meta.migrationsPath}/emptyDatabase.template.sql`, (0, emptydatabasemigration_generator_1.generateEmptyDatabaseStoredProcedure)({ models, meta }));
|
|
155
188
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
generated.write(`/${meta.trpc.routerFilePath}.ts`, (0, route_generator_1.generateRoute)({ model, meta }));
|
|
189
|
+
if (!config.disableGenerators.seed) {
|
|
190
|
+
generated.write(`/${meta.seed.indexFilePath}.ts`, (0, seed_generator_1.generateSeedIndex)({ models, meta }));
|
|
159
191
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
generated.copy((0, react_generator_2.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
|
|
192
|
+
if (!config.disableGenerators.trpc) {
|
|
193
|
+
generated.write(`/${meta.trpc.routesFilePath}.ts`, (0, route_generator_1.generateRoutesIndex)({ models, meta }));
|
|
163
194
|
}
|
|
164
|
-
logger.log(`- ${model.name} processed`);
|
|
165
|
-
}
|
|
166
|
-
// Generate Enums
|
|
167
|
-
for (const enumerator of enums.values()) {
|
|
168
|
-
const meta = (0, meta_1.getEnumMetadata)({ enumerator });
|
|
169
195
|
if (!config.disableGenerators.types) {
|
|
170
|
-
generated.write(`/${meta.types.
|
|
196
|
+
generated.write(`/${meta.types.indexFilePath}.ts`, (0, types_generator_2.generateTypesIndex)({ models, enums, meta }));
|
|
171
197
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
generated.write(`/${meta.migrationsPath}/emptyDatabase.template.sql`, (0, emptydatabasemigration_generator_1.generateEmptyDatabaseStoredProcedure)({ models, meta }));
|
|
187
|
-
}
|
|
188
|
-
if (!config.disableGenerators.seed) {
|
|
189
|
-
generated.write(`/${meta.seed.indexFilePath}.ts`, (0, seed_generator_1.generateSeedIndex)({ models, meta }));
|
|
190
|
-
}
|
|
191
|
-
if (!config.disableGenerators.trpc) {
|
|
192
|
-
generated.write(`/${meta.trpc.routesFilePath}.ts`, (0, route_generator_1.generateRoutesIndex)({ models, meta }));
|
|
193
|
-
}
|
|
194
|
-
if (!config.disableGenerators.types) {
|
|
195
|
-
generated.write(`/${meta.types.indexFilePath}.ts`, (0, types_generator_2.generateTypesIndex)({ models, enums, meta }));
|
|
196
|
-
}
|
|
197
|
-
// -------------------------------------------------------------------------
|
|
198
|
-
// Add disclaimer and format.
|
|
199
|
-
const prettierConfig = yield prettier.resolveConfig(process.cwd());
|
|
200
|
-
generated.transformUTF8Files((path, content) => `${DISCLAIMER}\n${content}`);
|
|
201
|
-
generated.format(prettierConfig);
|
|
202
|
-
// -------------------------------------------------------------------------
|
|
203
|
-
// Merge with existing files.
|
|
204
|
-
vfs.copy(generated, './');
|
|
205
|
-
// Flush to disk.
|
|
206
|
-
const changes = yield vfs.flush(process.cwd(), { force: config.force });
|
|
207
|
-
const log = lock_1.ConsoleUtils.getFilesChangelog(changes);
|
|
208
|
-
console.info(log);
|
|
209
|
-
});
|
|
198
|
+
// -------------------------------------------------------------------------
|
|
199
|
+
// Add disclaimer and format.
|
|
200
|
+
const prettierConfig = yield prettier.resolveConfig(process.cwd());
|
|
201
|
+
generated.transformUTF8Files((path, content) => `${DISCLAIMER}\n${content}`);
|
|
202
|
+
generated.formatUTF8Files(prettierConfig);
|
|
203
|
+
// -------------------------------------------------------------------------
|
|
204
|
+
// Merge with existing files.
|
|
205
|
+
vfs.copy(generated, './');
|
|
206
|
+
// Flush to disk.
|
|
207
|
+
const changes = yield vfs.flush(process.cwd(), { force: config.force });
|
|
208
|
+
const log = lock_1.ConsoleUtils.getFilesChangelog(changes.filter((c) => !c.static));
|
|
209
|
+
console.info(log);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
210
212
|
exports.generate = generate;
|
|
211
213
|
const DISCLAIMER = `
|
|
212
214
|
/**
|
|
@@ -18,7 +18,7 @@ function generateDataService({ models, meta }) {
|
|
|
18
18
|
const constructor = mm
|
|
19
19
|
.map(({ meta }) => `public ${meta.data.dataServiceName} :${meta.data.repositoryClassName}`)
|
|
20
20
|
.join(',\n');
|
|
21
|
-
const initializer = mm.map(({ meta }) => `
|
|
21
|
+
const initializer = mm.map(({ meta }) => `this.${meta.data.dataServiceName}.init()`).join(',\n');
|
|
22
22
|
const excelExports = mm
|
|
23
23
|
.map(({ meta }) => `${meta.data.excelExportTableName}: mapValues(this.${meta.data.dataServiceName}.getAll()),`)
|
|
24
24
|
.join('\n');
|
|
@@ -40,7 +40,7 @@ export class DataService {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
public async init(): Promise<void> {
|
|
43
|
-
${initializer}
|
|
43
|
+
await Promise.all([${initializer}])
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
public isEmpty(): boolean {
|
|
@@ -3,7 +3,7 @@ import { Model } from '../../lib/schema/schema';
|
|
|
3
3
|
/**
|
|
4
4
|
* Generates a data module class.
|
|
5
5
|
*/
|
|
6
|
-
export declare function generateEmptyDatabaseStoredProcedure({ models
|
|
6
|
+
export declare function generateEmptyDatabaseStoredProcedure({ models }: {
|
|
7
7
|
models: Model[];
|
|
8
8
|
meta: SchemaMetaData;
|
|
9
9
|
}): string;
|
|
@@ -4,14 +4,16 @@ exports.generateEmptyDatabaseStoredProcedure = void 0;
|
|
|
4
4
|
/**
|
|
5
5
|
* Generates a data module class.
|
|
6
6
|
*/
|
|
7
|
-
function generateEmptyDatabaseStoredProcedure({ models
|
|
7
|
+
function generateEmptyDatabaseStoredProcedure({ models }) {
|
|
8
8
|
const tables = models
|
|
9
9
|
.map((model) => `\t${model.sourceSchemaName !== undefined ? `"${model.sourceSchemaName}".` : ''}"${model.sourceName}"`)
|
|
10
10
|
.join(',\n');
|
|
11
|
+
const useSchemas = models.some((model) => model.sourceSchemaName !== undefined);
|
|
12
|
+
const configTableName = useSchemas ? ' "Configuration"."Config"' : '"Config"';
|
|
11
13
|
return `
|
|
12
14
|
CREATE OR REPLACE PROCEDURE "emptyDatabase"() AS $BODY$ BEGIN IF EXISTS (
|
|
13
15
|
SELECT
|
|
14
|
-
FROM
|
|
16
|
+
FROM ${configTableName}
|
|
15
17
|
WHERE NOT "isTest"
|
|
16
18
|
) THEN RETURN;
|
|
17
19
|
END IF;
|
|
@@ -75,7 +75,7 @@ function generateRepository({ model, meta }) {
|
|
|
75
75
|
return `
|
|
76
76
|
import { Injectable, Logger } from '@nestjs/common'
|
|
77
77
|
import { DbService, ${model.sourceName} as DbType } from '@${model.schemaConfig.project}/db'
|
|
78
|
-
import { format, pluralize, NestedMap } from '@pxl/common'
|
|
78
|
+
import { format, pluralize ${indexes.length === 0 ? '' : ', NestedMap'} } from '@pxl/common'
|
|
79
79
|
|
|
80
80
|
${imports.generate()}
|
|
81
81
|
|
|
@@ -140,8 +140,6 @@ export class ${meta.data.repositoryClassName} implements Repository<
|
|
|
140
140
|
this.set(item)
|
|
141
141
|
|
|
142
142
|
${model.defaultField ? defaultValueInitFn : ''}
|
|
143
|
-
${uniqueStringFields.map((f) => `this.uniqueIds.${f.name}.set(item.${f.name}, item)`).join('\n')}
|
|
144
|
-
${indexes.map((i) => `this.${i.name}.set(item)`).join('\n')}
|
|
145
143
|
}
|
|
146
144
|
|
|
147
145
|
${isGenerated ? idIntInitFn : ''}
|
|
@@ -173,6 +171,15 @@ export class ${meta.data.repositoryClassName} implements Repository<
|
|
|
173
171
|
`}
|
|
174
172
|
}
|
|
175
173
|
|
|
174
|
+
public async deleteAll(): Promise<void> {
|
|
175
|
+
${model.attributes.inMemoryOnly
|
|
176
|
+
? ''
|
|
177
|
+
: `
|
|
178
|
+
await this.db.runOnlyOnTestDb(() => this.db.$executeRaw\`DELETE FROM ${model.sourceSchemaName !== undefined ? `"${model.sourceSchemaName}".` : ''}"${model.sourceName}"\`)
|
|
179
|
+
`}
|
|
180
|
+
return this.init()
|
|
181
|
+
}
|
|
182
|
+
|
|
176
183
|
public get(id: ${model.brandedIdType} | null): ${model.typeName} | null {
|
|
177
184
|
if (id === null) {
|
|
178
185
|
return null
|
|
@@ -79,7 +79,7 @@ function getModelAttributes(model) {
|
|
|
79
79
|
skipDelete: obj.skipDelete || obj.customDelete,
|
|
80
80
|
inMemoryOnly: obj.inMemoryOnly,
|
|
81
81
|
description: obj.description,
|
|
82
|
-
|
|
82
|
+
databaseSchema: obj.schema,
|
|
83
83
|
index: obj.index,
|
|
84
84
|
}));
|
|
85
85
|
const result = decoder.safeParse(attributes);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@postxl/generator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"main": "./dist/generator.js",
|
|
5
5
|
"typings": "./dist/generator.d.ts",
|
|
6
6
|
"bin": {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"prettier": "^2.8.7",
|
|
22
22
|
"remeda": "1.9.4",
|
|
23
23
|
"zod": "3.21.4",
|
|
24
|
-
"@postxl/lock": "0.
|
|
24
|
+
"@postxl/lock": "0.3.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@prisma/client": "4.12.0",
|