@postxl/generator 0.0.20 → 0.0.22
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/README.md +2 -2
- package/dist/jest.config.js +17 -0
- package/dist/src/generator.js +13 -13
- package/dist/src/generators/enums/react.generator.js +55 -55
- package/dist/src/generators/enums/types.generator.js +8 -8
- package/dist/src/generators/indices/datamockmodule.generator.js +46 -46
- package/dist/src/generators/indices/datamodule.generator.js +76 -76
- package/dist/src/generators/indices/dataservice.generator.js +26 -26
- package/dist/src/generators/indices/repositories.generator.js +3 -3
- package/dist/src/generators/indices/testdataservice.generator.js +23 -22
- package/dist/src/generators/models/react.generator/context.generator.js +47 -47
- package/dist/src/generators/models/react.generator/index.js +8 -8
- package/dist/src/generators/models/react.generator/library.generator.js +66 -66
- package/dist/src/generators/models/react.generator/lookup.generator.js +75 -75
- package/dist/src/generators/models/react.generator/modals.generator.js +261 -261
- package/dist/src/generators/models/repository.generator.js +239 -239
- package/dist/src/generators/models/route.generator.js +45 -45
- package/dist/src/generators/models/seed.generator.js +14 -14
- package/dist/src/generators/models/stub.generator.js +19 -19
- package/dist/src/generators/models/types.generator.js +39 -39
- package/dist/src/lib/vfs.js +2 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -2
- package/changelog.md +0 -115
- package/jest.config.ts +0 -18
- package/tests/attributes.test.ts +0 -91
- package/tests/file.test.ts +0 -32
- package/tests/schemas/la/la.prisma +0 -862
- package/tests/schemas/mca/mca.prisma +0 -528
- package/tests/utils/random.ts +0 -11
- package/tests/vfs.test.ts +0 -92
package/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# PXL Generator
|
|
2
|
-
|
|
1
|
+
# PXL Generator
|
|
2
|
+
|
|
3
3
|
A utility package that lets you move quickly and generate basic components of your app easily.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// import { pathsToModuleNameMapper } from 'ts-jest'
|
|
4
|
+
// import { compilerOptions } from './tsconfig.json'
|
|
5
|
+
const config = {
|
|
6
|
+
verbose: true,
|
|
7
|
+
// roots: ['<rootDir>/tests', '<rootDir>/src'],
|
|
8
|
+
testEnvironment: 'node',
|
|
9
|
+
transform: {
|
|
10
|
+
'^.+\\.tsx?$': 'ts-jest',
|
|
11
|
+
},
|
|
12
|
+
testRegex: '(\\.|/)test\\.tsx?$',
|
|
13
|
+
testPathIgnorePatterns: ['/node_modules/', '/__fixtures__/'],
|
|
14
|
+
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
|
|
15
|
+
// moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: '<rootDir>/src/' }),
|
|
16
|
+
};
|
|
17
|
+
exports.default = config;
|
package/dist/src/generator.js
CHANGED
|
@@ -203,17 +203,17 @@ const generate = ({ models, enums, config, prismaClientPath, logger, }) => __awa
|
|
|
203
203
|
logger.info(`PXL finished! 🚀`);
|
|
204
204
|
});
|
|
205
205
|
exports.generate = generate;
|
|
206
|
-
const DISCLAIMER = `/**
|
|
207
|
-
* DO NOT EDIT THIS FILE!
|
|
208
|
-
*
|
|
209
|
-
* This file was generated by generator.
|
|
210
|
-
* Any manual changes will be overwritten.
|
|
211
|
-
* To modify this file, edit the Prisma schema file and run
|
|
212
|
-
* \`prisma generate\` or \`pnpm prisma generate\`
|
|
213
|
-
* again!
|
|
214
|
-
*
|
|
215
|
-
* If you need to modify the structure of this file, please edit the generator
|
|
216
|
-
* at \`packages/generator/\`
|
|
217
|
-
*
|
|
218
|
-
**/
|
|
206
|
+
const DISCLAIMER = `/**
|
|
207
|
+
* DO NOT EDIT THIS FILE!
|
|
208
|
+
*
|
|
209
|
+
* This file was generated by generator.
|
|
210
|
+
* Any manual changes will be overwritten.
|
|
211
|
+
* To modify this file, edit the Prisma schema file and run
|
|
212
|
+
* \`prisma generate\` or \`pnpm prisma generate\`
|
|
213
|
+
* again!
|
|
214
|
+
*
|
|
215
|
+
* If you need to modify the structure of this file, please edit the generator
|
|
216
|
+
* at \`packages/generator/\`
|
|
217
|
+
*
|
|
218
|
+
**/
|
|
219
219
|
`;
|
|
@@ -8,8 +8,8 @@ const vfs_1 = require("../../lib/vfs");
|
|
|
8
8
|
*/
|
|
9
9
|
function generateEnumReactComponents({ enumerator, meta }) {
|
|
10
10
|
const vfs = new vfs_1.VirtualFS({
|
|
11
|
-
'index.ts': `
|
|
12
|
-
export * from './Select'
|
|
11
|
+
'index.ts': `
|
|
12
|
+
export * from './Select'
|
|
13
13
|
`,
|
|
14
14
|
});
|
|
15
15
|
vfs.write('/Select.tsx', generateEnumSelect({ enumerator, meta }));
|
|
@@ -24,58 +24,58 @@ function generateEnumSelect({ enumerator, meta }) {
|
|
|
24
24
|
items: [enumerator.typeName],
|
|
25
25
|
from: meta.types.importPath,
|
|
26
26
|
});
|
|
27
|
-
return `
|
|
28
|
-
import { useField } from 'formik'
|
|
29
|
-
import React from 'react'
|
|
30
|
-
|
|
31
|
-
import { ButtonSwitcher } from '@components/atoms/ButtonSwitcher'
|
|
32
|
-
import { SelectInput, SelectField } from '@components/atoms/SelectInput'
|
|
33
|
-
import { UnionOmit } from '@lib/types'
|
|
34
|
-
|
|
35
|
-
${imports.generate()}
|
|
36
|
-
|
|
37
|
-
type Option = {
|
|
38
|
-
id: ${enumerator.typeName}
|
|
39
|
-
label: string
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const OPTIONS: Option[] = [
|
|
43
|
-
${enumerator.values.map((v) => `{ id: '${v}', label: '${v}' },`).join('\n')}
|
|
44
|
-
]
|
|
45
|
-
|
|
46
|
-
// Switcher
|
|
47
|
-
|
|
48
|
-
export const ${meta.react.switcherInputName} = ({ ...delegated }: UnionOmit<
|
|
49
|
-
React.ComponentPropsWithoutRef<typeof ButtonSwitcher<${enumerator.typeName}>>,
|
|
50
|
-
'options'
|
|
51
|
-
>) => (
|
|
52
|
-
<ButtonSwitcher options={OPTIONS} {...delegated} />
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
export const ${meta.react.switcherFieldName} = ({
|
|
56
|
-
name,
|
|
57
|
-
...delegated
|
|
58
|
-
}: { name: string } & UnionOmit<
|
|
59
|
-
React.ComponentPropsWithoutRef<typeof ${meta.react.switcherInputName}>,
|
|
60
|
-
'value' | 'onChange'
|
|
61
|
-
>) => {
|
|
62
|
-
const [field, meta, helpers] = useField<${enumerator.name}>({ name })
|
|
63
|
-
|
|
64
|
-
return <${meta.react.switcherInputName} value={field.value} onChange={helpers.setValue} {...delegated} />
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Select
|
|
68
|
-
|
|
69
|
-
export const ${meta.react.selectInputName} = ({
|
|
70
|
-
...delegated
|
|
71
|
-
}: UnionOmit<React.ComponentPropsWithoutRef<typeof SelectInput<Option>>, 'label' | 'options'>) => {
|
|
72
|
-
return <SelectInput<Option> options={OPTIONS} label={(l) => l.label} {...delegated} />
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export const ${meta.react.selectFieldName} = ({
|
|
76
|
-
...delegated
|
|
77
|
-
}: UnionOmit<React.ComponentPropsWithoutRef<typeof SelectField<Option>>, 'label' | 'options'>) => {
|
|
78
|
-
return <SelectField<Option> options={OPTIONS} label={(l) => l.label} {...delegated} />
|
|
79
|
-
}
|
|
27
|
+
return `
|
|
28
|
+
import { useField } from 'formik'
|
|
29
|
+
import React from 'react'
|
|
30
|
+
|
|
31
|
+
import { ButtonSwitcher } from '@components/atoms/ButtonSwitcher'
|
|
32
|
+
import { SelectInput, SelectField } from '@components/atoms/SelectInput'
|
|
33
|
+
import { UnionOmit } from '@lib/types'
|
|
34
|
+
|
|
35
|
+
${imports.generate()}
|
|
36
|
+
|
|
37
|
+
type Option = {
|
|
38
|
+
id: ${enumerator.typeName}
|
|
39
|
+
label: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const OPTIONS: Option[] = [
|
|
43
|
+
${enumerator.values.map((v) => `{ id: '${v}', label: '${v}' },`).join('\n')}
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
// Switcher
|
|
47
|
+
|
|
48
|
+
export const ${meta.react.switcherInputName} = ({ ...delegated }: UnionOmit<
|
|
49
|
+
React.ComponentPropsWithoutRef<typeof ButtonSwitcher<${enumerator.typeName}>>,
|
|
50
|
+
'options'
|
|
51
|
+
>) => (
|
|
52
|
+
<ButtonSwitcher options={OPTIONS} {...delegated} />
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
export const ${meta.react.switcherFieldName} = ({
|
|
56
|
+
name,
|
|
57
|
+
...delegated
|
|
58
|
+
}: { name: string } & UnionOmit<
|
|
59
|
+
React.ComponentPropsWithoutRef<typeof ${meta.react.switcherInputName}>,
|
|
60
|
+
'value' | 'onChange'
|
|
61
|
+
>) => {
|
|
62
|
+
const [field, meta, helpers] = useField<${enumerator.name}>({ name })
|
|
63
|
+
|
|
64
|
+
return <${meta.react.switcherInputName} value={field.value} onChange={helpers.setValue} {...delegated} />
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Select
|
|
68
|
+
|
|
69
|
+
export const ${meta.react.selectInputName} = ({
|
|
70
|
+
...delegated
|
|
71
|
+
}: UnionOmit<React.ComponentPropsWithoutRef<typeof SelectInput<Option>>, 'label' | 'options'>) => {
|
|
72
|
+
return <SelectInput<Option> options={OPTIONS} label={(l) => l.label} {...delegated} />
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export const ${meta.react.selectFieldName} = ({
|
|
76
|
+
...delegated
|
|
77
|
+
}: UnionOmit<React.ComponentPropsWithoutRef<typeof SelectField<Option>>, 'label' | 'options'>) => {
|
|
78
|
+
return <SelectField<Option> options={OPTIONS} label={(l) => l.label} {...delegated} />
|
|
79
|
+
}
|
|
80
80
|
`;
|
|
81
81
|
}
|
|
@@ -5,14 +5,14 @@ exports.generateEnumType = void 0;
|
|
|
5
5
|
* Generator that generates type definitions for all enumerators.
|
|
6
6
|
*/
|
|
7
7
|
function generateEnumType({ enumerator, meta, prismaClientPath, }) {
|
|
8
|
-
return `
|
|
9
|
-
import * as Prisma from '${prismaClientPath}'
|
|
10
|
-
|
|
11
|
-
export type ${enumerator.typeName} = Prisma.${enumerator.sourceName}
|
|
12
|
-
export const ${enumerator.typeName} = Prisma.${enumerator.sourceName}
|
|
13
|
-
export const ${meta.types.membersList}: ${enumerator.typeName}[] = [
|
|
14
|
-
${enumerator.values.map((v) => `'${v}'`).join(', ')}
|
|
15
|
-
]
|
|
8
|
+
return `
|
|
9
|
+
import * as Prisma from '${prismaClientPath}'
|
|
10
|
+
|
|
11
|
+
export type ${enumerator.typeName} = Prisma.${enumerator.sourceName}
|
|
12
|
+
export const ${enumerator.typeName} = Prisma.${enumerator.sourceName}
|
|
13
|
+
export const ${meta.types.membersList}: ${enumerator.typeName}[] = [
|
|
14
|
+
${enumerator.values.map((v) => `'${v}'`).join(', ')}
|
|
15
|
+
]
|
|
16
16
|
`;
|
|
17
17
|
}
|
|
18
18
|
exports.generateEnumType = generateEnumType;
|
|
@@ -51,54 +51,54 @@ function generateDataMockModule({ models, meta }) {
|
|
|
51
51
|
imports.addImport({ items: [meta.seed.constantName], from: meta.seed.importPath });
|
|
52
52
|
}
|
|
53
53
|
const providers = mm
|
|
54
|
-
.map(({ meta, model }) => `provideMockRepository<
|
|
55
|
-
${model.typeName},
|
|
56
|
-
${model.idField.unbrandedTypeName},
|
|
57
|
-
${model.typeName}
|
|
54
|
+
.map(({ meta, model }) => `provideMockRepository<
|
|
55
|
+
${model.typeName},
|
|
56
|
+
${model.idField.unbrandedTypeName},
|
|
57
|
+
${model.typeName}
|
|
58
58
|
>(${meta.data.repositoryClassName}, ${meta.seed.constantName})`)
|
|
59
59
|
.join(', ');
|
|
60
|
-
return `
|
|
61
|
-
import { DynamicModule } from '@nestjs/common'
|
|
62
|
-
import { DbModule } from '@${meta.config.project}/db'
|
|
63
|
-
|
|
64
|
-
import { provideMockRepository } from './mock.repository'
|
|
65
|
-
|
|
66
|
-
${imports.generate()}
|
|
67
|
-
|
|
68
|
-
export class DataMockModule {
|
|
69
|
-
private static cachedModule: DynamicModule | undefined = undefined
|
|
70
|
-
|
|
71
|
-
static isInstantiated(): boolean {
|
|
72
|
-
return !!DataMockModule.cachedModule
|
|
73
|
-
}
|
|
74
|
-
static getInstance(): DataModule {
|
|
75
|
-
if (!DataMockModule.cachedModule) throw new Error('DataMockModule must be called via .mock first!')
|
|
76
|
-
return DataMockModule.cachedModule
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// eslint-disable-next-line @typescript-eslint/require-await, @typescript-eslint/no-unused-vars
|
|
80
|
-
static async mock(): Promise<DynamicModule> {
|
|
81
|
-
const providers = [
|
|
82
|
-
DataService,
|
|
83
|
-
TestDataService,
|
|
84
|
-
${providers}
|
|
85
|
-
]
|
|
86
|
-
|
|
87
|
-
DataMockModule.cachedModule = {
|
|
88
|
-
module: DataModule,
|
|
89
|
-
imports: [DbModule.provideMock()],
|
|
90
|
-
providers: providers,
|
|
91
|
-
exports: providers,
|
|
92
|
-
global: true,
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return DataMockModule.cachedModule
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export interface MockData {
|
|
100
|
-
${mm.map(({ model, meta }) => `${meta.data.mockDataPropertyName}?: ${model.typeName}[]`).join('\n')}
|
|
101
|
-
}
|
|
60
|
+
return `
|
|
61
|
+
import { DynamicModule } from '@nestjs/common'
|
|
62
|
+
import { DbModule } from '@${meta.config.project}/db'
|
|
63
|
+
|
|
64
|
+
import { provideMockRepository } from './mock.repository'
|
|
65
|
+
|
|
66
|
+
${imports.generate()}
|
|
67
|
+
|
|
68
|
+
export class DataMockModule {
|
|
69
|
+
private static cachedModule: DynamicModule | undefined = undefined
|
|
70
|
+
|
|
71
|
+
static isInstantiated(): boolean {
|
|
72
|
+
return !!DataMockModule.cachedModule
|
|
73
|
+
}
|
|
74
|
+
static getInstance(): DataModule {
|
|
75
|
+
if (!DataMockModule.cachedModule) throw new Error('DataMockModule must be called via .mock first!')
|
|
76
|
+
return DataMockModule.cachedModule
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/require-await, @typescript-eslint/no-unused-vars
|
|
80
|
+
static async mock(): Promise<DynamicModule> {
|
|
81
|
+
const providers = [
|
|
82
|
+
DataService,
|
|
83
|
+
TestDataService,
|
|
84
|
+
${providers}
|
|
85
|
+
]
|
|
86
|
+
|
|
87
|
+
DataMockModule.cachedModule = {
|
|
88
|
+
module: DataModule,
|
|
89
|
+
imports: [DbModule.provideMock()],
|
|
90
|
+
providers: providers,
|
|
91
|
+
exports: providers,
|
|
92
|
+
global: true,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return DataMockModule.cachedModule
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface MockData {
|
|
100
|
+
${mm.map(({ model, meta }) => `${meta.data.mockDataPropertyName}?: ${model.typeName}[]`).join('\n')}
|
|
101
|
+
}
|
|
102
102
|
`;
|
|
103
103
|
}
|
|
104
104
|
exports.generateDataMockModule = generateDataMockModule;
|
|
@@ -47,82 +47,82 @@ function generateDataModule({ models, meta }) {
|
|
|
47
47
|
from: meta.data.repoFilePath,
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
|
-
return `
|
|
51
|
-
import { DynamicModule, Provider, Type } from '@nestjs/common'
|
|
52
|
-
import { DbModule, DbService } from '@${meta.config.project}/db'
|
|
53
|
-
|
|
54
|
-
import { AsyncInit, Repository } from './repository.type'
|
|
55
|
-
|
|
56
|
-
${imports.generate()}
|
|
57
|
-
|
|
58
|
-
const createRepositoryProvider = <T extends AsyncInit>(t: Type<T>, loadData: boolean): Provider => ({
|
|
59
|
-
inject: [DbService],
|
|
60
|
-
provide: t,
|
|
61
|
-
useFactory: async (dbService: DbService): Promise<T> => {
|
|
62
|
-
const repository = new t(dbService)
|
|
63
|
-
await dbService.isInitialized(t.name)
|
|
64
|
-
if (loadData) {
|
|
65
|
-
await repository.init()
|
|
66
|
-
}
|
|
67
|
-
return repository
|
|
68
|
-
},
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
export class DataModule {
|
|
72
|
-
private static cachedModule: DynamicModule | undefined = undefined
|
|
73
|
-
|
|
74
|
-
static isInstantiated(): boolean {
|
|
75
|
-
return !!DataModule.cachedModule
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
static getInstance(): DataModule {
|
|
79
|
-
if (!DataModule.cachedModule) throw new Error('DataModule must be called via .provide first!')
|
|
80
|
-
return DataModule.cachedModule
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
static provide({ loadData }: { loadData: boolean }): DynamicModule {
|
|
84
|
-
if (DataModule.cachedModule) {
|
|
85
|
-
console.warn('DataModule is already instantiated, skipping...')
|
|
86
|
-
return DataModule.cachedModule
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const repositoryProviders: Provider<Repository<any, any>>[] = [
|
|
90
|
-
${mm.map(({ meta }) => meta.data.repositoryClassName).join(',\n')}
|
|
91
|
-
].map((r) => createRepositoryProvider(r as any, loadData))
|
|
92
|
-
|
|
93
|
-
DataModule.cachedModule = {
|
|
94
|
-
module: DataModule,
|
|
95
|
-
global: true,
|
|
96
|
-
imports: [DbModule.provide()],
|
|
97
|
-
providers: [DataService, ...repositoryProviders],
|
|
98
|
-
exports: [DataService, ...repositoryProviders],
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return DataModule.cachedModule
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
static provideE2E(): DynamicModule {
|
|
105
|
-
if (DataModule.cachedModule) {
|
|
106
|
-
console.warn('DataModule is already instantiated, skipping...')
|
|
107
|
-
return DataModule.cachedModule
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const providers: Provider<Repository<any, any>>[] = [
|
|
111
|
-
// createRepositoryProvider(TherapeuticAreaRepository, true),
|
|
112
|
-
TestDataService,
|
|
113
|
-
]
|
|
114
|
-
|
|
115
|
-
DataModule.cachedModule = {
|
|
116
|
-
module: DataModule,
|
|
117
|
-
global: true,
|
|
118
|
-
imports: [DbModule.provide()],
|
|
119
|
-
providers: [...providers],
|
|
120
|
-
exports: providers,
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return DataModule.cachedModule
|
|
124
|
-
}
|
|
125
|
-
}
|
|
50
|
+
return `
|
|
51
|
+
import { DynamicModule, Provider, Type } from '@nestjs/common'
|
|
52
|
+
import { DbModule, DbService } from '@${meta.config.project}/db'
|
|
53
|
+
|
|
54
|
+
import { AsyncInit, Repository } from './repository.type'
|
|
55
|
+
|
|
56
|
+
${imports.generate()}
|
|
57
|
+
|
|
58
|
+
const createRepositoryProvider = <T extends AsyncInit>(t: Type<T>, loadData: boolean): Provider => ({
|
|
59
|
+
inject: [DbService],
|
|
60
|
+
provide: t,
|
|
61
|
+
useFactory: async (dbService: DbService): Promise<T> => {
|
|
62
|
+
const repository = new t(dbService)
|
|
63
|
+
await dbService.isInitialized(t.name)
|
|
64
|
+
if (loadData) {
|
|
65
|
+
await repository.init()
|
|
66
|
+
}
|
|
67
|
+
return repository
|
|
68
|
+
},
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
export class DataModule {
|
|
72
|
+
private static cachedModule: DynamicModule | undefined = undefined
|
|
73
|
+
|
|
74
|
+
static isInstantiated(): boolean {
|
|
75
|
+
return !!DataModule.cachedModule
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
static getInstance(): DataModule {
|
|
79
|
+
if (!DataModule.cachedModule) throw new Error('DataModule must be called via .provide first!')
|
|
80
|
+
return DataModule.cachedModule
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static provide({ loadData }: { loadData: boolean }): DynamicModule {
|
|
84
|
+
if (DataModule.cachedModule) {
|
|
85
|
+
console.warn('DataModule is already instantiated, skipping...')
|
|
86
|
+
return DataModule.cachedModule
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const repositoryProviders: Provider<Repository<any, any>>[] = [
|
|
90
|
+
${mm.map(({ meta }) => meta.data.repositoryClassName).join(',\n')}
|
|
91
|
+
].map((r) => createRepositoryProvider(r as any, loadData))
|
|
92
|
+
|
|
93
|
+
DataModule.cachedModule = {
|
|
94
|
+
module: DataModule,
|
|
95
|
+
global: true,
|
|
96
|
+
imports: [DbModule.provide()],
|
|
97
|
+
providers: [DataService, ...repositoryProviders],
|
|
98
|
+
exports: [DataService, ...repositoryProviders],
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return DataModule.cachedModule
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static provideE2E(): DynamicModule {
|
|
105
|
+
if (DataModule.cachedModule) {
|
|
106
|
+
console.warn('DataModule is already instantiated, skipping...')
|
|
107
|
+
return DataModule.cachedModule
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const providers: Provider<Repository<any, any>>[] = [
|
|
111
|
+
// createRepositoryProvider(TherapeuticAreaRepository, true),
|
|
112
|
+
TestDataService,
|
|
113
|
+
]
|
|
114
|
+
|
|
115
|
+
DataModule.cachedModule = {
|
|
116
|
+
module: DataModule,
|
|
117
|
+
global: true,
|
|
118
|
+
imports: [DbModule.provide()],
|
|
119
|
+
providers: [...providers],
|
|
120
|
+
exports: providers,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return DataModule.cachedModule
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
126
|
`;
|
|
127
127
|
}
|
|
128
128
|
exports.generateDataModule = generateDataModule;
|
|
@@ -23,32 +23,32 @@ function generateDataService({ models, meta }) {
|
|
|
23
23
|
.map(({ meta }) => `${meta.data.excelExportTableName}: mapValues(this.${meta.data.dataServiceName}.getAll()),`)
|
|
24
24
|
.join('\n');
|
|
25
25
|
const isEmptyChecks = mm.map(({ meta }) => `this.${meta.data.dataServiceName}.count() === 0`).join(' &&');
|
|
26
|
-
return `
|
|
27
|
-
import { Injectable } from '@nestjs/common'
|
|
28
|
-
import { mapValues } from '@
|
|
29
|
-
|
|
30
|
-
${imports.generate()}
|
|
31
|
-
|
|
32
|
-
@Injectable()
|
|
33
|
-
export class DataService {
|
|
34
|
-
constructor(${constructor}) {}
|
|
35
|
-
|
|
36
|
-
public prepareExcelExport() {
|
|
37
|
-
return {
|
|
38
|
-
${excelExports}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
public async init(): Promise<void> {
|
|
43
|
-
${initializer}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
public isEmpty(): boolean {
|
|
47
|
-
return (
|
|
48
|
-
${isEmptyChecks}
|
|
49
|
-
)
|
|
50
|
-
}
|
|
51
|
-
}
|
|
26
|
+
return `
|
|
27
|
+
import { Injectable } from '@nestjs/common'
|
|
28
|
+
import { mapValues } from '@pxl/common'
|
|
29
|
+
|
|
30
|
+
${imports.generate()}
|
|
31
|
+
|
|
32
|
+
@Injectable()
|
|
33
|
+
export class DataService {
|
|
34
|
+
constructor(${constructor}) {}
|
|
35
|
+
|
|
36
|
+
public prepareExcelExport() {
|
|
37
|
+
return {
|
|
38
|
+
${excelExports}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public async init(): Promise<void> {
|
|
43
|
+
${initializer}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public isEmpty(): boolean {
|
|
47
|
+
return (
|
|
48
|
+
${isEmptyChecks}
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
52
|
`;
|
|
53
53
|
}
|
|
54
54
|
exports.generateDataService = generateDataService;
|
|
@@ -29,9 +29,9 @@ function generateRepositoriesArray({ models, meta }) {
|
|
|
29
29
|
from: meta.data.repoFilePath,
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
-
return `
|
|
33
|
-
${imports.generate()}
|
|
34
|
-
|
|
32
|
+
return `
|
|
33
|
+
${imports.generate()}
|
|
34
|
+
|
|
35
35
|
export const repositories = [${models
|
|
36
36
|
.map((model) => (0, meta_1.getModelMetadata)({ model }).data.repositoryClassName)
|
|
37
37
|
.join(', ')}]`;
|
|
@@ -34,28 +34,29 @@ function generateTestDataService({ meta }) {
|
|
|
34
34
|
items: [Types.toVariableName('MockData')],
|
|
35
35
|
from: meta.data.dataMockModuleFilePath,
|
|
36
36
|
});
|
|
37
|
-
return `
|
|
38
|
-
import {
|
|
39
|
-
|
|
40
|
-
import {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
37
|
+
return `
|
|
38
|
+
import { Injectable, Logger } from '@nestjs/common'
|
|
39
|
+
|
|
40
|
+
import { ResetService } from '@pxl/common'
|
|
41
|
+
import { DbService } from '@${meta.config.project}/db'
|
|
42
|
+
|
|
43
|
+
${imports.generate()}
|
|
44
|
+
|
|
45
|
+
@Injectable()
|
|
46
|
+
export class TestDataService {
|
|
47
|
+
private logger = new Logger(TestDataService.name)
|
|
48
|
+
constructor(
|
|
49
|
+
private db: DbService,
|
|
50
|
+
|
|
51
|
+
private resetService: ResetService,
|
|
52
|
+
) {}
|
|
53
|
+
|
|
54
|
+
public async resetTestData(data: MockData) {
|
|
55
|
+
this.logger.log(\`✅ Reset test data\`)
|
|
56
|
+
await this.db.emptyDatabase()
|
|
57
|
+
return this.resetService.reset()
|
|
58
|
+
}
|
|
59
|
+
}
|
|
59
60
|
`;
|
|
60
61
|
}
|
|
61
62
|
exports.generateTestDataService = generateTestDataService;
|