@postxl/generator 0.38.2 → 0.40.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.
Files changed (56) hide show
  1. package/dist/generator.js +43 -21
  2. package/dist/generators/enums/types.generator.js +1 -1
  3. package/dist/generators/indices/businesslogic-actiontypes.generator.js +1 -1
  4. package/dist/generators/indices/businesslogic-update-module.generator.js +2 -2
  5. package/dist/generators/indices/businesslogic-update-service.generator.js +1 -1
  6. package/dist/generators/indices/businesslogic-view-module.generator.js +2 -2
  7. package/dist/generators/indices/businesslogic-view-service.generator.js +1 -1
  8. package/dist/generators/indices/{seed-service.generator.d.ts → data-types.generator.d.ts} +2 -2
  9. package/dist/generators/indices/data-types.generator.js +48 -0
  10. package/dist/generators/indices/datamock-module.generator.js +11 -11
  11. package/dist/generators/indices/datamocker.generator.js +1 -1
  12. package/dist/generators/indices/datamodule.generator.js +34 -52
  13. package/dist/generators/indices/dataservice.generator.js +202 -9
  14. package/dist/generators/indices/dispatcher-service.generator.js +20 -10
  15. package/dist/generators/indices/emptydatabasemigration.generator.d.ts +2 -0
  16. package/dist/generators/indices/emptydatabasemigration.generator.js +14 -7
  17. package/dist/generators/indices/importexport-convert-import-functions.generator.d.ts +9 -0
  18. package/dist/generators/indices/importexport-convert-import-functions.generator.js +528 -0
  19. package/dist/generators/indices/importexport-exporter-class.generator.d.ts +9 -0
  20. package/dist/generators/indices/importexport-exporter-class.generator.js +116 -0
  21. package/dist/generators/indices/importexport-import-service.generator.d.ts +9 -0
  22. package/dist/generators/indices/importexport-import-service.generator.js +563 -0
  23. package/dist/generators/indices/{seeddata-type.generator.d.ts → importexport-types.generator.d.ts} +2 -2
  24. package/dist/generators/indices/importexport-types.generator.js +234 -0
  25. package/dist/generators/indices/repositories.generator.js +8 -8
  26. package/dist/generators/indices/seed-migration.generator.js +1 -1
  27. package/dist/generators/indices/seed-template.generator.js +1 -1
  28. package/dist/generators/indices/selectors.generator.d.ts +7 -0
  29. package/dist/generators/indices/selectors.generator.js +82 -0
  30. package/dist/generators/indices/{seed-template-decoder.generator.d.ts → testdata-service.generator.d.ts} +2 -2
  31. package/dist/generators/indices/testdata-service.generator.js +71 -0
  32. package/dist/generators/models/businesslogic-update.generator.js +6 -6
  33. package/dist/generators/models/businesslogic-view.generator.js +4 -4
  34. package/dist/generators/models/importexport-decoder.generator.d.ts +23 -0
  35. package/dist/generators/models/importexport-decoder.generator.js +234 -0
  36. package/dist/generators/models/react.generator/library.generator.js +4 -0
  37. package/dist/generators/models/react.generator/modals.generator.js +35 -8
  38. package/dist/generators/models/repository.generator.js +156 -18
  39. package/dist/generators/models/route.generator.js +2 -2
  40. package/dist/generators/models/stub.generator.js +1 -1
  41. package/dist/generators/models/types.generator.js +1 -1
  42. package/dist/lib/id-collector.d.ts +43 -0
  43. package/dist/lib/id-collector.js +53 -0
  44. package/dist/lib/imports.d.ts +1 -1
  45. package/dist/lib/meta.d.ts +480 -122
  46. package/dist/lib/meta.js +187 -74
  47. package/dist/lib/schema/schema.d.ts +58 -43
  48. package/dist/lib/schema/types.d.ts +63 -12
  49. package/dist/lib/schema/types.js +27 -7
  50. package/dist/lib/utils/string.d.ts +1 -0
  51. package/dist/lib/utils/string.js +1 -0
  52. package/dist/prisma/parse.js +4 -4
  53. package/package.json +2 -2
  54. package/dist/generators/indices/seed-service.generator.js +0 -356
  55. package/dist/generators/indices/seed-template-decoder.generator.js +0 -151
  56. package/dist/generators/indices/seeddata-type.generator.js +0 -42
package/dist/generator.js CHANGED
@@ -48,22 +48,27 @@ const businesslogic_update_service_generator_1 = require("./generators/indices/b
48
48
  const businesslogic_view_index_generator_1 = require("./generators/indices/businesslogic-view-index.generator");
49
49
  const businesslogic_view_module_generator_1 = require("./generators/indices/businesslogic-view-module.generator");
50
50
  const businesslogic_view_service_generator_1 = require("./generators/indices/businesslogic-view-service.generator");
51
+ const data_types_generator_1 = require("./generators/indices/data-types.generator");
51
52
  const datamock_module_generator_1 = require("./generators/indices/datamock-module.generator");
52
53
  const datamocker_generator_1 = require("./generators/indices/datamocker.generator");
53
54
  const datamodule_generator_1 = require("./generators/indices/datamodule.generator");
54
55
  const dataservice_generator_1 = require("./generators/indices/dataservice.generator");
55
56
  const dispatcher_service_generator_1 = require("./generators/indices/dispatcher-service.generator");
56
57
  const emptydatabasemigration_generator_1 = require("./generators/indices/emptydatabasemigration.generator");
58
+ const importexport_convert_import_functions_generator_1 = require("./generators/indices/importexport-convert-import-functions.generator");
59
+ const importexport_exporter_class_generator_1 = require("./generators/indices/importexport-exporter-class.generator");
60
+ const importexport_import_service_generator_1 = require("./generators/indices/importexport-import-service.generator");
61
+ const importexport_types_generator_1 = require("./generators/indices/importexport-types.generator");
57
62
  const repositories_generator_1 = require("./generators/indices/repositories.generator");
58
63
  const seed_migration_generator_1 = require("./generators/indices/seed-migration.generator");
59
- const seed_service_generator_1 = require("./generators/indices/seed-service.generator");
60
64
  const seed_template_generator_1 = require("./generators/indices/seed-template.generator");
61
- const seed_template_decoder_generator_1 = require("./generators/indices/seed-template-decoder.generator");
62
- const seeddata_type_generator_1 = require("./generators/indices/seeddata-type.generator");
65
+ const selectors_generator_1 = require("./generators/indices/selectors.generator");
63
66
  const stubs_generator_1 = require("./generators/indices/stubs.generator");
67
+ const testdata_service_generator_1 = require("./generators/indices/testdata-service.generator");
64
68
  const types_generator_2 = require("./generators/indices/types.generator");
65
69
  const businesslogic_update_generator_1 = require("./generators/models/businesslogic-update.generator");
66
70
  const businesslogic_view_generator_1 = require("./generators/models/businesslogic-view.generator");
71
+ const importexport_decoder_generator_1 = require("./generators/models/importexport-decoder.generator");
67
72
  const react_generator_2 = require("./generators/models/react.generator");
68
73
  const repository_generator_1 = require("./generators/models/repository.generator");
69
74
  const route_generator_1 = require("./generators/models/route.generator");
@@ -78,13 +83,15 @@ const parse_1 = require("./prisma/parse");
78
83
  const CONFIG_SCHEMA = zod_1.z
79
84
  .object({
80
85
  project: zod_1.z.string(),
81
- pathToTypes: zod_1.z.string().optional(),
82
86
  pathToDataLib: zod_1.z.string().optional(),
83
87
  pathToCypress: zod_1.z.string().optional(),
88
+ pathToE2ELib: zod_1.z.string().optional(),
89
+ pathToImportExport: zod_1.z.string().optional(),
84
90
  pathToActions: zod_1.z.string().optional(),
85
91
  pathToBusinessLogic: zod_1.z.string().optional(),
86
- pathToSeedLib: zod_1.z.string().optional(),
87
92
  pathToSeedData: zod_1.z.string().optional(),
93
+ pathToSeedLib: zod_1.z.string().optional(),
94
+ pathToTypes: zod_1.z.string().optional(),
88
95
  trpcRoutesFolder: zod_1.z.string().optional(),
89
96
  reactFolderOutput: zod_1.z.string().optional(),
90
97
  migrationsFolder: zod_1.z.string().optional(),
@@ -103,25 +110,28 @@ const CONFIG_SCHEMA = zod_1.z
103
110
  paths: {
104
111
  dataLibPath: (0, types_1.toPath)(s.pathToDataLib || 'repos'),
105
112
  cypressPath: (0, types_1.toPath)(s.pathToCypress || './e2e/cypress/'),
113
+ e2eLibPath: (0, types_1.toPath)(s.pathToE2ELib || './e2e/src/'),
114
+ importExportPath: (0, types_1.toPath)(s.pathToImportExport || 'import-export'),
106
115
  actionsPath: (0, types_1.toPath)(s.pathToActions || 'actions'),
107
116
  businessLogicPath: (0, types_1.toPath)(s.pathToBusinessLogic || 'business-logic'),
108
- reactFolderPath: (0, types_1.toPath)(s.reactFolderOutput || 'react'),
117
+ migrationsFolderPath: (0, types_1.toPath)(s.migrationsFolder || 'migrations'),
109
118
  modelTypeDefinitionsPath: (0, types_1.toPath)(s.pathToTypes || 'types'),
110
- seedLibPath: (0, types_1.toPath)(s.pathToSeedLib || 'seed'),
119
+ reactFolderPath: (0, types_1.toPath)(s.reactFolderOutput || 'react'),
111
120
  seedDataPath: (0, types_1.toPath)(s.pathToSeedData || 'seed-data'),
121
+ seedLibPath: (0, types_1.toPath)(s.pathToSeedLib || 'seed'),
112
122
  trpcRoutesFolderPath: (0, types_1.toPath)(s.trpcRoutesFolder || 'trpc'),
113
- migrationsFolderPath: (0, types_1.toPath)(s.migrationsFolder || 'migrations'),
114
123
  },
115
124
  randomSeed: s.randomSeed,
116
125
  force: s.force,
117
126
  disableGenerators: {
118
- types: s.pathToTypes === undefined,
119
- data: s.pathToDataLib === undefined,
120
127
  actions: s.pathToActions === undefined,
121
128
  businessLogic: s.pathToBusinessLogic === undefined,
129
+ data: s.pathToDataLib === undefined,
130
+ importExport: s.pathToImportExport === undefined,
131
+ react: s.reactFolderOutput === undefined,
122
132
  seed: s.pathToSeedLib === undefined,
123
133
  trpc: s.trpcRoutesFolder === undefined,
124
- react: s.reactFolderOutput === undefined,
134
+ types: s.pathToTypes === undefined,
125
135
  },
126
136
  userType: (0, types_1.toTypeName)(`User`),
127
137
  };
@@ -172,13 +182,17 @@ function generate({ models, enums, config, prismaClientPath, logger, }) {
172
182
  if (!config.disableGenerators.seed) {
173
183
  generated.write(`/${meta.seed.filePath}.ts`, (0, seed_generator_1.generateSeedModel)({ model, itemCount: 5, meta }));
174
184
  }
175
- // Generate Repositories
185
+ // Data
176
186
  if (!config.disableGenerators.data) {
177
187
  generated.write(`/${meta.data.stubFilePath}.ts`, (0, stub_generator_1.generateStub)({ model, meta }));
178
- generated.write(`/${meta.data.repoFilePath}.ts`, (0, repository_generator_1.generateRepository)({ model, meta }));
179
- generated.write(`/${meta.data.mockRepoFilePath}.ts`, (0, repository_generator_1.generateMockRepository)({ model, meta }));
188
+ generated.write(`/${meta.data.repository.filePath}.ts`, (0, repository_generator_1.generateRepository)({ model, meta }));
189
+ generated.write(`/${meta.data.mockRepository.filePath}.ts`, (0, repository_generator_1.generateMockRepository)({ model, meta }));
180
190
  generated.write(`/${meta.data.dataMockerStubFilePath}.ts`, (0, stub_generator_1.generateStub)({ model, meta }));
181
191
  }
192
+ // Import-Export
193
+ if (!config.disableGenerators.importExport) {
194
+ generated.write(`/${meta.importExport.decoder.filePath}.ts`, (0, importexport_decoder_generator_1.generateModelImportExportDecoder)({ model, meta }));
195
+ }
182
196
  // Business Logic
183
197
  if (!config.disableGenerators.businessLogic) {
184
198
  generated.write(`/${meta.businessLogic.view.serviceFilePath}.ts`, (0, businesslogic_view_generator_1.generateModelBusinessLogicView)({ model, meta }));
@@ -209,12 +223,15 @@ function generate({ models, enums, config, prismaClientPath, logger, }) {
209
223
  if (!config.disableGenerators.data) {
210
224
  generated.write(`/${meta.data.dataMockModuleFilePath}.ts`, (0, datamock_module_generator_1.generateDataMockModule)({ models, meta }));
211
225
  generated.write(`/${meta.data.dataModuleFilePath}.ts`, (0, datamodule_generator_1.generateDataModule)({ models, meta }));
212
- generated.write(`/${meta.data.dataServiceFilePath}.ts`, (0, dataservice_generator_1.generateDataService)({ models, meta }));
226
+ generated.write(`/${meta.data.dataService.filePath}.ts`, (0, dataservice_generator_1.generateDataService)({ models, meta }));
213
227
  generated.write(`/${meta.data.dataMockerFilePath}.ts`, (0, datamocker_generator_1.generateDataMocker)({ models, meta }));
228
+ generated.write(`/${meta.data.selectorsFilePath}.ts`, (0, selectors_generator_1.generateSelectors)());
229
+ generated.write(`/${meta.data.testDataServiceFilePath}.ts`, (0, testdata_service_generator_1.generateTestDataService)({ models, meta }));
214
230
  generated.write(`/${meta.data.dataMockerStubIndexFilePath}.ts`, (0, stubs_generator_1.generateDataMockerStubsIndex)({ models, meta }));
215
- generated.write(`/${meta.data.repositoriesConstFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesArray)({ models, meta }));
216
- generated.write(`/${meta.data.repositoriesIndexFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesIndex)({ models, meta }));
231
+ generated.write(`/${meta.data.repository.constFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesArray)({ models, meta }));
232
+ generated.write(`/${meta.data.repository.indexFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesIndex)({ models, meta }));
217
233
  generated.write(`/${meta.data.stubIndexFilePath}.ts`, (0, stubs_generator_1.generateStubsIndex)({ models, meta }));
234
+ generated.write(`/${meta.data.types.filePath}.ts`, (0, data_types_generator_1.generateDataTypes)({ models, meta }));
218
235
  // We only generate the empty database migration if the migration folder already has an existing migration
219
236
  // Else we would generate a migration that deletes from tables that have not yet been created in the database
220
237
  // We include this check here as the template does not come with any migration - hence this migration should also not be generated
@@ -222,8 +239,16 @@ function generate({ models, enums, config, prismaClientPath, logger, }) {
222
239
  generated.write((0, emptydatabasemigration_generator_1.deriveEmptyDatabaseMigrationFilePath)(meta), (0, emptydatabasemigration_generator_1.generateEmptyDatabaseStoredProcedure)({ models, meta }));
223
240
  }
224
241
  }
242
+ if (!config.disableGenerators.importExport) {
243
+ generated.write(`/${meta.importExport.types.filePath}.ts`, (0, importexport_types_generator_1.generateImportExportTypes)({ models, meta }));
244
+ generated.write(`/${meta.importExport.exporterClass.filePath}.ts`, (0, importexport_exporter_class_generator_1.generateImportExportExporterClass)({ models, meta }));
245
+ generated.write(`/${meta.importExport.importService.filePath}.ts`, (0, importexport_import_service_generator_1.generateImportExportImportService)({ models, meta }));
246
+ generated.write(`/${meta.importExport.decoder.indexFilePath}.ts`, (0, importexport_decoder_generator_1.generateImportExportDecoderIndex)({ models, meta }));
247
+ generated.write(`/${meta.importExport.decoder.fullDecoderFilePath}.ts`, (0, importexport_decoder_generator_1.generateImportExportDecoder)({ models, meta }));
248
+ generated.write(`/${meta.importExport.converterFunctions.filePath}.ts`, (0, importexport_convert_import_functions_generator_1.generateImportExportConvertImportFunctions)({ models, meta }));
249
+ }
225
250
  if (!config.disableGenerators.actions) {
226
- generated.write(`/${meta.actions.dispatcherServiceFilePath}.ts`, (0, dispatcher_service_generator_1.generateActionsDispatcherService)({ models, meta }));
251
+ generated.write(`/${meta.actions.dispatcherService.filePath}.ts`, (0, dispatcher_service_generator_1.generateActionsDispatcherService)({ models, meta }));
227
252
  }
228
253
  if (!config.disableGenerators.businessLogic) {
229
254
  generated.write(`/${meta.businessLogic.view.indexFilePath}.ts`, (0, businesslogic_view_index_generator_1.generateBusinessLogicViewIndex)({ models, meta }));
@@ -235,11 +260,8 @@ function generate({ models, enums, config, prismaClientPath, logger, }) {
235
260
  generated.write(`/${meta.businessLogic.update.actionTypesFilePath}.ts`, (0, businesslogic_actiontypes_generator_1.generateBusinessLogicActionTypes)({ models, meta }));
236
261
  }
237
262
  if (!config.disableGenerators.seed) {
238
- generated.write(`/${meta.seed.seedDataTypeFilePath}.ts`, (0, seeddata_type_generator_1.generateSeedDataType)({ models, meta }));
239
- generated.write(`/${meta.seed.serviceFilePath}.ts`, (0, seed_service_generator_1.generateSeedService)({ models, meta }));
240
263
  generated.write(`/${meta.seedData.initialMigrationFilePath}.ts`, (0, seed_migration_generator_1.generateSeedMigration)({ models, meta }));
241
264
  generated.write(`/${meta.seedData.templateExcelFilePath}`, yield (0, seed_template_generator_1.generateSeedExcelTemplate)({ models }));
242
- generated.write(`/${meta.seedData.templateDecoderFilePath}.ts`, (0, seed_template_decoder_generator_1.generateSeedTemplateDecoder)({ models, meta }));
243
265
  }
244
266
  if (!config.disableGenerators.trpc) {
245
267
  generated.write(`/${meta.trpc.routesFilePath}.ts`, (0, route_generator_1.generateRoutesIndex)({ models, meta }));
@@ -23,7 +23,7 @@ function generateEnumType({ enumerator, meta, prismaClientPath, }) {
23
23
  }
24
24
  return `'${v}'`;
25
25
  });
26
- return `
26
+ return /* ts */ `
27
27
  /* eslint-disable @typescript-eslint/no-unused-vars */
28
28
  import * as Prisma from '${prismaClientPath}'
29
29
 
@@ -21,7 +21,7 @@ function generateBusinessLogicActionTypes({ models, meta }) {
21
21
  actionsTypeElements.push(modelMeta.businessLogic.update.actionName);
22
22
  actionResultTypeElements.push(`${modelMeta.businessLogic.update.actionModelDiscriminantName}: ${modelMeta.businessLogic.update.actionResultName}`);
23
23
  }
24
- return `
24
+ return /* ts */ `
25
25
  ${imports.generate()}
26
26
 
27
27
  /**
@@ -24,7 +24,7 @@ function generateBusinessLogicUpdateModule({ models, meta }) {
24
24
  providers.push(meta.businessLogic.update.serviceClassName);
25
25
  }
26
26
  const moduleName = meta.businessLogic.update.moduleName;
27
- return `
27
+ return /* ts */ `
28
28
  import { DynamicModule } from '@${meta.config.project}/common'
29
29
 
30
30
  ${imports.generate()}
@@ -41,7 +41,7 @@ export class ${moduleName} {
41
41
  */
42
42
  static getInstance(): DynamicModule {
43
43
  if (!${moduleName}.cachedModule) {
44
- throw new Error('${moduleName} must be called via .provide first!')
44
+ throw new Error('${moduleName} must be called via .forRoot first!')
45
45
  }
46
46
  return ${moduleName}.cachedModule
47
47
  }
@@ -20,7 +20,7 @@ function generateBusinessLogicUpdateService({ models, meta, }) {
20
20
  const constructor = mm
21
21
  .map(({ meta }) => `@Inject(forwardRef(() => ${meta.businessLogic.update.serviceClassName})) public readonly ${meta.businessLogic.update.serviceVariableName} :${meta.businessLogic.update.serviceClassName}`)
22
22
  .join(',\n');
23
- return `
23
+ return /* ts */ `
24
24
  import { Inject, Injectable, forwardRef } from '@nestjs/common'
25
25
 
26
26
  ${imports.generate()}
@@ -23,7 +23,7 @@ function generateBusinessLogicViewModule({ models, meta }) {
23
23
  providers.push(meta.businessLogic.view.serviceClassName);
24
24
  }
25
25
  const moduleName = meta.businessLogic.view.moduleName;
26
- return `
26
+ return /* ts */ `
27
27
  import { DynamicModule } from '@${meta.config.project}/common'
28
28
 
29
29
  ${imports.generate()}
@@ -40,7 +40,7 @@ export class ${moduleName} {
40
40
  */
41
41
  static getInstance(): DynamicModule {
42
42
  if (!${moduleName}.cachedModule) {
43
- throw new Error('${moduleName} must be called via .provide first!')
43
+ throw new Error('${moduleName} must be called via .forRoot first!')
44
44
  }
45
45
  return ${moduleName}.cachedModule
46
46
  }
@@ -20,7 +20,7 @@ function generateBusinessLogicViewService({ models, meta }) {
20
20
  const constructor = mm
21
21
  .map(({ meta }) => `@Inject(forwardRef(() => ${meta.businessLogic.view.serviceClassName})) public readonly ${meta.businessLogic.view.serviceVariableName} :${meta.businessLogic.view.serviceClassName}`)
22
22
  .join(',\n');
23
- return `
23
+ return /* ts */ `
24
24
  import { Inject, Injectable, forwardRef } from '@nestjs/common'
25
25
 
26
26
  ${imports.generate()}
@@ -1,9 +1,9 @@
1
1
  import { SchemaMetaData } from '../../lib/meta';
2
2
  import { Model } from '../../lib/schema/schema';
3
3
  /**
4
- * Generates index file for all seed files.
4
+ * Generates type for BulkMutations.
5
5
  */
6
- export declare function generateSeedService({ models }: {
6
+ export declare function generateDataTypes({ models, meta }: {
7
7
  models: Model[];
8
8
  meta: SchemaMetaData;
9
9
  }): string;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateDataTypes = void 0;
4
+ const imports_1 = require("../../lib/imports");
5
+ const meta_1 = require("../../lib/meta");
6
+ /**
7
+ * Generates type for BulkMutations.
8
+ */
9
+ function generateDataTypes({ models, meta }) {
10
+ const { types } = meta.data;
11
+ const imports = imports_1.ImportsGenerator.from(types.filePath);
12
+ const dto = meta.types.dto;
13
+ imports.addImports({
14
+ [meta.types.importPath]: [dto.create, dto.update, dto.upsert, dto.genericModel, dto.idType],
15
+ });
16
+ const modelTypes = [];
17
+ for (const model of models) {
18
+ const modelMeta = (0, meta_1.getModelMetadata)({ model });
19
+ imports.addImport({
20
+ items: [modelMeta.types.typeName, modelMeta.types.brandedIdType],
21
+ from: modelMeta.types.importPath,
22
+ });
23
+ modelTypes.push(`${modelMeta.seed.constantName}?: ${types.bulkMutationForModel}<${modelMeta.types.typeName}, ${modelMeta.types.brandedIdType}>`);
24
+ }
25
+ return /* ts */ `
26
+ ${imports.generate()}
27
+
28
+ /**
29
+ * Generic type for BulkMutation for a model.
30
+ */
31
+ export type ${types.bulkMutationForModel}<
32
+ Model extends ${dto.genericModel}<ID>,
33
+ ID extends ${dto.idType}
34
+ > = {
35
+ create?: ${dto.create}<Model, ID>[]
36
+ update?: ${dto.update}<Model, ID>[]
37
+ upsert?: ${dto.upsert}<Model, ID>[]
38
+ delete?: ID[]
39
+ }
40
+
41
+ /**
42
+ * Bulk changes for all models.
43
+ */
44
+ export type ${types.bulkMutation} = {
45
+ ${modelTypes.join('\n')}
46
+ }`;
47
+ }
48
+ exports.generateDataTypes = generateDataTypes;
@@ -34,20 +34,20 @@ function generateDataMockModule({ models, meta }) {
34
34
  const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
35
35
  const imports = imports_1.ImportsGenerator.from(meta.data.dataMockModuleFilePath).addImports({
36
36
  [meta.data.dataModuleFilePath]: [Types.toVariableName('DataModule')],
37
- [meta.data.dataServiceFilePath]: [Types.toVariableName('DataService')],
37
+ [meta.data.dataService.filePath]: [meta.data.dataService.class],
38
38
  // we need to import the file directly instead via the normal index file as this would cause a circular dependency else
39
- [meta.actions.actionExecutionInterfaceFilePath]: [meta.actions.actionExecutionMock],
39
+ [meta.actions.importPath]: [meta.actions.actionExecution.mock],
40
40
  });
41
41
  for (const { model, meta } of mm) {
42
42
  imports.addImport({ items: [model.typeName], from: meta.types.importPath });
43
- imports.addImport({ items: [meta.data.repositoryClassName], from: meta.data.repoFilePath });
44
- imports.addImport({ items: [meta.data.mockRepositoryClassName], from: meta.data.mockRepoFilePath });
43
+ imports.addImport({ items: [meta.data.repository.className], from: meta.data.repository.filePath });
44
+ imports.addImport({ items: [meta.data.mockRepository.className], from: meta.data.mockRepository.filePath });
45
45
  }
46
46
  const providers = mm
47
47
  .map(({ meta }) => `{
48
- provide: ${meta.data.repositoryClassName},
48
+ provide: ${meta.data.repository.className},
49
49
  useFactory: async () => {
50
- const repository = new ${meta.data.mockRepositoryClassName}()
50
+ const repository = new ${meta.data.mockRepository.className}()
51
51
  if (!!seed && !!seed.${meta.seed.constantName}) {
52
52
  await repository.reInit({items: seed.${meta.seed.constantName}, execution })
53
53
  }
@@ -55,13 +55,13 @@ function generateDataMockModule({ models, meta }) {
55
55
  }
56
56
  }`)
57
57
  .join(', ');
58
- return `
58
+ return /* ts */ `
59
59
  import { DynamicModule } from '@pxl/common'
60
60
  import { DbModule } from '@${meta.config.project}/db'
61
61
 
62
62
  ${imports.generate()}
63
63
 
64
- export class DataMockModule {
64
+ export class ${meta.data.dataMockModuleName} {
65
65
  static mock(seed?: MockData): DynamicModule {
66
66
  const execution = new MockActionExecution()
67
67
 
@@ -71,9 +71,9 @@ export class DataMockModule {
71
71
  ]
72
72
 
73
73
  const cachedModule = {
74
- module: DataModule,
74
+ module: ${meta.data.moduleName},
75
75
  imports: [DbModule.provideMock()],
76
- providers: providers,
76
+ providers,
77
77
  exports: providers,
78
78
  global: true,
79
79
  }
@@ -84,7 +84,7 @@ export class DataMockModule {
84
84
  }
85
85
  }
86
86
 
87
- export interface MockData {
87
+ export interface ${meta.data.dataMockDataType} {
88
88
  ${mm.map(({ model, meta }) => `${meta.data.mockDataPropertyName}?: ${model.typeName}[]`).join('\n')}
89
89
  }
90
90
  `;
@@ -71,7 +71,7 @@ function generateAddDataFunction(model, meta) {
71
71
  `;
72
72
  });
73
73
  // TODO: Move the publicly accessible function's name to the metadata definition!
74
- return `
74
+ return /* ts */ `
75
75
  public add${model.typeName}(
76
76
  item?: Partial<Omit<${model.typeName}, '${idField.name}'> & { ${idField.name}: ${idField.unbrandedTypeName} }>
77
77
  ): DataMocker {
@@ -1,50 +1,30 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
3
  exports.generateDataModule = void 0;
27
4
  const imports_1 = require("../../lib/imports");
28
5
  const meta_1 = require("../../lib/meta");
29
- const Types = __importStar(require("../../lib/schema/types"));
30
6
  /**
31
7
  * Generates a data module class.
32
8
  */
33
9
  function generateDataModule({ models, meta }) {
34
10
  const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
35
11
  const imports = imports_1.ImportsGenerator.from(meta.data.dataModuleFilePath).addImports({
36
- [meta.data.dataServiceFilePath]: [Types.toVariableName('DataService')],
12
+ [meta.data.dataService.filePath]: [meta.data.dataService.class],
13
+ [meta.data.dataMockModuleFilePath]: [meta.data.dataMockModuleName],
37
14
  });
38
15
  for (const { meta } of mm) {
39
16
  imports.addImport({
40
- items: [meta.data.repositoryClassName],
41
- from: meta.data.repoFilePath,
17
+ items: [meta.data.repository.className],
18
+ from: meta.data.repository.filePath,
42
19
  });
43
20
  }
44
21
  const moduleName = meta.data.moduleName;
45
- return `
22
+ return /* ts */ `
23
+ import { FactoryProvider } from '@nestjs/common'
24
+
46
25
  import { DynamicModule } from '@${meta.config.project}/common'
47
- import { DbModule } from '@${meta.config.project}/db'
26
+ import { DbModule, DbService } from '@${meta.config.project}/db'
27
+ import { E2EConfig } from '@${meta.config.project}/e2e'
48
28
 
49
29
  ${imports.generate()}
50
30
 
@@ -59,7 +39,7 @@ export class ${moduleName} {
59
39
  */
60
40
  static getInstance(): DynamicModule {
61
41
  if (!${moduleName}.cachedModule) {
62
- throw new Error('${moduleName} must be called via .provide first!')
42
+ throw new Error('${moduleName} must be called via .forRoot first!')
63
43
  }
64
44
  return ${moduleName}.cachedModule
65
45
  }
@@ -75,36 +55,39 @@ export class ${moduleName} {
75
55
  /**
76
56
  * The forRoot method should only be called once by the root module.
77
57
  */
78
- static forRoot(): DynamicModule {
58
+ static forRoot(options: E2EConfig): DynamicModule {
79
59
  if (${moduleName}.cachedModule) {
80
60
  throw new Error('${moduleName} is already instantiated, please call .forRoot only once from root...')
81
61
  }
82
62
 
83
- const repositoryProviders = [
84
- ${mm.map(({ meta }) => meta.data.repositoryClassName).join(',')}
85
- ]
86
-
87
- ${moduleName}.cachedModule = {
88
- module: ${moduleName},
89
- global: true,
90
- imports: [DbModule.forRoot()],
91
- providers: [DataService, ...repositoryProviders],
92
- exports: [DataService, ...repositoryProviders],
63
+ if (options.isE2ETest && !options.useDatabaseForE2E) {
64
+ return ${meta.data.dataMockModuleName}.mock()
93
65
  }
94
66
 
95
- return ${moduleName}.cachedModule
96
- }
97
-
98
- static provideE2E(): DynamicModule {
99
- if (${moduleName}.cachedModule) {
100
- console.warn('${moduleName} is already instantiated, skipping...')
101
- return ${moduleName}.cachedModule
67
+ // We need to initialize the user repository right at the beginning,
68
+ // so that we have the rootUser available for the other modules - including
69
+ // the action and seed modules which will ensure that seed data is created.
70
+ const userRepositoryProvider: FactoryProvider<UserRepository> = {
71
+ provide: UserRepository,
72
+ inject: [DbService],
73
+ useFactory: async (dbService: DbService) => {
74
+ const repository = new UserRepository(dbService)
75
+ await repository.init()
76
+ return repository
77
+ },
102
78
  }
103
79
 
104
80
  const providers = [
105
- ${mm.map(({ meta }) => meta.data.repositoryClassName).join(',')}
81
+ DataService,
82
+
83
+ userRepositoryProvider,
84
+
85
+ ${mm
86
+ .filter((mm) => mm.model.name !== 'User')
87
+ .map(({ meta }) => meta.data.repository.className)
88
+ .join(',')}
106
89
  ]
107
-
90
+
108
91
  ${moduleName}.cachedModule = {
109
92
  module: ${moduleName},
110
93
  global: true,
@@ -115,7 +98,6 @@ export class ${moduleName} {
115
98
 
116
99
  return ${moduleName}.cachedModule
117
100
  }
118
- }
119
- `;
101
+ }`;
120
102
  }
121
103
  exports.generateDataModule = generateDataModule;