@postxl/generator 0.7.0 → 0.8.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.js +1 -1
- package/dist/generators/indices/testdataservice.generator.d.ts +3 -1
- package/dist/generators/indices/testdataservice.generator.js +19 -3
- package/dist/generators/models/repository.generator.js +34 -2
- package/dist/lib/schema/fields.d.ts +4 -0
- package/dist/lib/schema/fields.js +7 -1
- package/package.json +1 -1
package/dist/generator.js
CHANGED
|
@@ -178,7 +178,7 @@ const generate = ({ models, enums, config, prismaClientPath, logger, }) => __awa
|
|
|
178
178
|
generated.write(`/${meta.data.dataMockModuleFilePath}.ts`, (0, datamockmodule_generator_1.generateDataMockModule)({ models, meta }));
|
|
179
179
|
generated.write(`/${meta.data.dataModuleFilePath}.ts`, (0, datamodule_generator_1.generateDataModule)({ models, meta }));
|
|
180
180
|
generated.write(`/${meta.data.dataServiceFilePath}.ts`, (0, dataservice_generator_1.generateDataService)({ models, meta }));
|
|
181
|
-
generated.write(`/${meta.data.testDataServiceFilePath}.ts`, (0, testdataservice_generator_1.generateTestDataService)({ meta }));
|
|
181
|
+
generated.write(`/${meta.data.testDataServiceFilePath}.ts`, (0, testdataservice_generator_1.generateTestDataService)({ models, meta }));
|
|
182
182
|
generated.write(`/${meta.data.repositoriesConstFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesArray)({ models, meta }));
|
|
183
183
|
generated.write(`/${meta.data.repositoriesIndexFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesIndex)({ models, meta }));
|
|
184
184
|
generated.write(`/${meta.data.stubIndexFilePath}.ts`, (0, stubs_generator_1.generateStubsIndex)({ models, meta }));
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { SchemaMetaData } from '../../lib/meta';
|
|
2
|
+
import { Model } from '../../lib/schema/schema';
|
|
2
3
|
/**
|
|
3
4
|
* Generates a generic data service object that may be used on the server to access database.
|
|
4
5
|
*/
|
|
5
|
-
export declare function generateTestDataService({ meta }: {
|
|
6
|
+
export declare function generateTestDataService({ meta, models }: {
|
|
6
7
|
meta: SchemaMetaData;
|
|
8
|
+
models: Model[];
|
|
7
9
|
}): string;
|
|
@@ -24,16 +24,27 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.generateTestDataService = void 0;
|
|
27
|
+
const meta_1 = require("../../lib/meta");
|
|
27
28
|
const Types = __importStar(require("../../lib/schema/types"));
|
|
28
29
|
const imports_1 = require("../../lib/imports");
|
|
29
30
|
/**
|
|
30
31
|
* Generates a generic data service object that may be used on the server to access database.
|
|
31
32
|
*/
|
|
32
|
-
function generateTestDataService({ meta }) {
|
|
33
|
+
function generateTestDataService({ meta, models }) {
|
|
33
34
|
const imports = imports_1.ImportsGenerator.from(meta.data.testDataServiceFilePath).addImport({
|
|
34
35
|
items: [Types.toVariableName('MockData')],
|
|
35
36
|
from: meta.data.dataMockModuleFilePath,
|
|
36
37
|
});
|
|
38
|
+
const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
|
|
39
|
+
for (const { meta } of mm) {
|
|
40
|
+
imports.addImport({
|
|
41
|
+
items: [meta.data.repositoryClassName],
|
|
42
|
+
from: meta.data.repoFilePath,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const constructor = mm
|
|
46
|
+
.map(({ meta }) => `private ${meta.data.dataServiceName} :${meta.data.repositoryClassName}`)
|
|
47
|
+
.join(',\n');
|
|
37
48
|
return `
|
|
38
49
|
import { Injectable, Logger } from '@nestjs/common'
|
|
39
50
|
|
|
@@ -47,14 +58,19 @@ function generateTestDataService({ meta }) {
|
|
|
47
58
|
private logger = new Logger(TestDataService.name)
|
|
48
59
|
constructor(
|
|
49
60
|
private db: DbService,
|
|
50
|
-
|
|
51
61
|
private resetService: ResetService,
|
|
62
|
+
${constructor}
|
|
52
63
|
) {}
|
|
53
64
|
|
|
54
65
|
public async resetTestData(data: MockData) {
|
|
55
66
|
this.logger.log(\`✅ Reset test data\`)
|
|
56
67
|
await this.db.emptyDatabase()
|
|
57
|
-
|
|
68
|
+
|
|
69
|
+
${mm
|
|
70
|
+
.map(({ meta }) => `await this.${meta.data.dataServiceName}.reInit(data.${meta.data.mockDataPropertyName} ?? [])`)
|
|
71
|
+
.join('\n')}
|
|
72
|
+
|
|
73
|
+
return this.resetService.reset()
|
|
58
74
|
}
|
|
59
75
|
}
|
|
60
76
|
`;
|
|
@@ -12,6 +12,7 @@ function generateRepository({ model, meta }) {
|
|
|
12
12
|
const { idField, fields } = model;
|
|
13
13
|
const decoder = meta.data.repository.decoderFnName;
|
|
14
14
|
const uniqueStringFields = fields.filter(fields_1.isUniqueStringField);
|
|
15
|
+
const maxLengthStringFields = fields.filter(fields_1.isMaxLengthStringField);
|
|
15
16
|
const defaultValueInitFn = `
|
|
16
17
|
if (item.${(_a = model.defaultField) === null || _a === void 0 ? void 0 : _a.name}) {
|
|
17
18
|
if (this.defaultValue) {
|
|
@@ -36,7 +37,7 @@ function generateRepository({ model, meta }) {
|
|
|
36
37
|
return `
|
|
37
38
|
import { Injectable, Logger } from '@nestjs/common'
|
|
38
39
|
import { DbService, ${model.sourceName} as DbType } from '@${model.schemaConfig.project}/db'
|
|
39
|
-
import { format, pluralize } from '
|
|
40
|
+
import { format, pluralize } from '@pxl/common'
|
|
40
41
|
|
|
41
42
|
import { Repository } from '../repository.type'
|
|
42
43
|
|
|
@@ -145,6 +146,8 @@ export class ${meta.data.repositoryClassName} implements Repository<
|
|
|
145
146
|
}`
|
|
146
147
|
: ''}
|
|
147
148
|
|
|
149
|
+
${maxLengthStringFields.map((f) => `this.${getEnsureMaxLengthFnName(f)}(item)`).join('\n')}
|
|
150
|
+
|
|
148
151
|
${uniqueStringFields.map((f) => `this.${getEnsureUniqueFnName(f)}(item)`).join('\n')}
|
|
149
152
|
|
|
150
153
|
return {
|
|
@@ -156,6 +159,7 @@ export class ${meta.data.repositoryClassName} implements Repository<
|
|
|
156
159
|
}): Promise<${model.typeName}> {
|
|
157
160
|
${model.attributes.inMemoryOnly
|
|
158
161
|
? `
|
|
162
|
+
${maxLengthStringFields.map((f) => `this.${getEnsureMaxLengthFnName(f)}(item)`).join('\n')}
|
|
159
163
|
${uniqueStringFields.map((f) => `this.${getEnsureUniqueFnName(f)}(item)`).join('\n')}
|
|
160
164
|
const newItem = await Promise.resolve(item)`
|
|
161
165
|
: `
|
|
@@ -180,6 +184,8 @@ export class ${meta.data.repositoryClassName} implements Repository<
|
|
|
180
184
|
|
|
181
185
|
${isGenerated ? `const id = ++this.currentMaxId\n` : ''}
|
|
182
186
|
|
|
187
|
+
${maxLengthStringFields.map((f) => `this.${getEnsureMaxLengthFnName(f)}(item)`).join('\n')}
|
|
188
|
+
|
|
183
189
|
${uniqueStringFields.map((f) => `this.${getEnsureUniqueFnName(f)}(item)`).join('\n')}
|
|
184
190
|
|
|
185
191
|
${model.attributes.inMemoryOnly
|
|
@@ -206,9 +212,10 @@ export class ${meta.data.repositoryClassName} implements Repository<
|
|
|
206
212
|
}
|
|
207
213
|
|
|
208
214
|
public async createMany(items: ${model.typeName}[]) {
|
|
209
|
-
${uniqueStringFields.length > 0
|
|
215
|
+
${uniqueStringFields.length > 0 || maxLengthStringFields.length > 0
|
|
210
216
|
? `
|
|
211
217
|
for (const item of items) {
|
|
218
|
+
${maxLengthStringFields.map((f) => `this.${getEnsureMaxLengthFnName(f)}(item)`).join('\n')}
|
|
212
219
|
${uniqueStringFields.map((f) => `this.${getEnsureUniqueFnName(f)}(item)`).join('\n')}
|
|
213
220
|
}`
|
|
214
221
|
: ''}
|
|
@@ -238,6 +245,16 @@ export class ${meta.data.repositoryClassName} implements Repository<
|
|
|
238
245
|
throw new Error(\`Could not update ${meta.userFriendlyName} with id \${item.id}. Not found!\`)
|
|
239
246
|
}
|
|
240
247
|
|
|
248
|
+
|
|
249
|
+
${maxLengthStringFields
|
|
250
|
+
.map((f) => {
|
|
251
|
+
return `
|
|
252
|
+
if (item.${f.name} !== undefined && existingItem.${f.name} !== item.${f.name}) {
|
|
253
|
+
this.${getEnsureMaxLengthFnName(f)}(item)
|
|
254
|
+
}
|
|
255
|
+
`;
|
|
256
|
+
})
|
|
257
|
+
.join('\n')}
|
|
241
258
|
${uniqueStringFields
|
|
242
259
|
.map((f) => {
|
|
243
260
|
return `
|
|
@@ -305,6 +322,18 @@ export class ${meta.data.repositoryClassName} implements Repository<
|
|
|
305
322
|
this.data.delete(${meta.types.toBrandedIdTypeFnName}(id))
|
|
306
323
|
}
|
|
307
324
|
|
|
325
|
+
${maxLengthStringFields.map((f) => {
|
|
326
|
+
return `
|
|
327
|
+
/**
|
|
328
|
+
* Utility function that ensures that the ${f.name} field has a max length of ${f.attributes.maxLength}
|
|
329
|
+
*/
|
|
330
|
+
private ${getEnsureMaxLengthFnName(f)}(item: { ${f.name}?: string }) {
|
|
331
|
+
if (!item.${f.name}) return
|
|
332
|
+
if (item.${f.name}.length <= ${f.attributes.maxLength}) return
|
|
333
|
+
item.${f.name} = item.${f.name}.substring(0, ${f.attributes.maxLength - 4}) + \`...\`
|
|
334
|
+
}`;
|
|
335
|
+
})}
|
|
336
|
+
|
|
308
337
|
${uniqueStringFields
|
|
309
338
|
.map((f) => {
|
|
310
339
|
return `
|
|
@@ -347,3 +376,6 @@ exports.generateRepository = generateRepository;
|
|
|
347
376
|
function getEnsureUniqueFnName(field) {
|
|
348
377
|
return `ensureUnique${(0, string_1.toPascalCase)(field.name)}`;
|
|
349
378
|
}
|
|
379
|
+
function getEnsureMaxLengthFnName(field) {
|
|
380
|
+
return `ensureMaxLength${(0, string_1.toPascalCase)(field.name)}`;
|
|
381
|
+
}
|
|
@@ -33,3 +33,7 @@ export declare const getDefaultValueForType: (type: string) => string;
|
|
|
33
33
|
* Returns true if the given field is unique and a string field.
|
|
34
34
|
*/
|
|
35
35
|
export declare const isUniqueStringField: (f: Field) => boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Returns true if the given field has a maxLength attribute.
|
|
38
|
+
*/
|
|
39
|
+
export declare const isMaxLengthStringField: (f: Field) => boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isUniqueStringField = exports.getDefaultValueForType = exports.getEnumFields = exports.getRelationFields = exports.getScalarFields = exports.getDefaultField = void 0;
|
|
3
|
+
exports.isMaxLengthStringField = exports.isUniqueStringField = exports.getDefaultValueForType = exports.getEnumFields = exports.getRelationFields = exports.getScalarFields = exports.getDefaultField = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* The default field of the model.
|
|
6
6
|
* Note: A model can only have one or no default field!
|
|
@@ -47,3 +47,9 @@ exports.getDefaultValueForType = getDefaultValueForType;
|
|
|
47
47
|
const isUniqueStringField = (f) => (f.kind === 'id' && f.isUnique && f.unbrandedTypeName === 'string') ||
|
|
48
48
|
(f.kind === 'scalar' && f.isUnique && f.typeName === 'string');
|
|
49
49
|
exports.isUniqueStringField = isUniqueStringField;
|
|
50
|
+
/**
|
|
51
|
+
* Returns true if the given field has a maxLength attribute.
|
|
52
|
+
*/
|
|
53
|
+
const isMaxLengthStringField = (f) => (f.kind === 'id' && !!f.attributes.maxLength && f.unbrandedTypeName === 'string') ||
|
|
54
|
+
(f.kind === 'scalar' && !!f.attributes.maxLength && f.typeName === 'string');
|
|
55
|
+
exports.isMaxLengthStringField = isMaxLengthStringField;
|