@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.
Files changed (31) hide show
  1. package/README.md +2 -2
  2. package/dist/jest.config.js +17 -0
  3. package/dist/src/generator.js +13 -13
  4. package/dist/src/generators/enums/react.generator.js +55 -55
  5. package/dist/src/generators/enums/types.generator.js +8 -8
  6. package/dist/src/generators/indices/datamockmodule.generator.js +46 -46
  7. package/dist/src/generators/indices/datamodule.generator.js +76 -76
  8. package/dist/src/generators/indices/dataservice.generator.js +26 -26
  9. package/dist/src/generators/indices/repositories.generator.js +3 -3
  10. package/dist/src/generators/indices/testdataservice.generator.js +23 -22
  11. package/dist/src/generators/models/react.generator/context.generator.js +47 -47
  12. package/dist/src/generators/models/react.generator/index.js +8 -8
  13. package/dist/src/generators/models/react.generator/library.generator.js +66 -66
  14. package/dist/src/generators/models/react.generator/lookup.generator.js +75 -75
  15. package/dist/src/generators/models/react.generator/modals.generator.js +261 -261
  16. package/dist/src/generators/models/repository.generator.js +239 -239
  17. package/dist/src/generators/models/route.generator.js +45 -45
  18. package/dist/src/generators/models/seed.generator.js +14 -14
  19. package/dist/src/generators/models/stub.generator.js +19 -19
  20. package/dist/src/generators/models/types.generator.js +39 -39
  21. package/dist/src/lib/vfs.js +2 -2
  22. package/dist/tsconfig.tsbuildinfo +1 -1
  23. package/package.json +8 -2
  24. package/changelog.md +0 -115
  25. package/jest.config.ts +0 -18
  26. package/tests/attributes.test.ts +0 -91
  27. package/tests/file.test.ts +0 -32
  28. package/tests/schemas/la/la.prisma +0 -862
  29. package/tests/schemas/mca/mca.prisma +0 -528
  30. package/tests/utils/random.ts +0 -11
  31. 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;
@@ -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 '@d2i/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
- }
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 { ResetService } from '@d2i/common'
39
- import { Injectable, Logger } from '@nestjs/common'
40
- import { DbService } from '@${meta.config.project}/db'
41
-
42
- ${imports.generate()}
43
-
44
- @Injectable()
45
- export class TestDataService {
46
- private logger = new Logger(TestDataService.name)
47
- constructor(
48
- private db: DbService,
49
-
50
- private resetService: ResetService,
51
- ) {}
52
-
53
- public async resetTestData(data: MockData) {
54
- this.logger.log(\`✅ Reset test data\`)
55
- await this.db.emptyDatabase()
56
- return this.resetService.reset()
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;