@postxl/generator 0.74.2 → 1.0.3

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 (189) hide show
  1. package/LICENSE +50 -0
  2. package/README.md +79 -1
  3. package/dist/generator-manager.class.d.ts +59 -0
  4. package/dist/generator-manager.class.js +221 -0
  5. package/dist/generator.class.d.ts +90 -0
  6. package/dist/generator.class.js +32 -0
  7. package/dist/generator.context.d.ts +174 -0
  8. package/dist/generator.context.js +125 -0
  9. package/dist/helpers/branded.types.d.ts +149 -0
  10. package/dist/helpers/branded.types.js +111 -0
  11. package/dist/helpers/config-builder.class.d.ts +27 -0
  12. package/dist/helpers/config-builder.class.js +54 -0
  13. package/dist/helpers/import-generator.class.d.ts +70 -0
  14. package/dist/helpers/import-generator.class.js +166 -0
  15. package/dist/helpers/importable.types.d.ts +52 -0
  16. package/dist/helpers/importable.types.js +15 -0
  17. package/dist/helpers/index-generator.class.d.ts +10 -0
  18. package/dist/helpers/index-generator.class.js +46 -0
  19. package/dist/helpers/index.d.ts +8 -0
  20. package/dist/helpers/index.js +24 -0
  21. package/dist/helpers/package-json.generator.d.ts +56 -0
  22. package/dist/helpers/package-json.generator.js +36 -0
  23. package/dist/helpers/tsconfig.generator.d.ts +1 -0
  24. package/dist/helpers/tsconfig.generator.js +14 -0
  25. package/dist/helpers/verify-context.d.ts +4 -0
  26. package/dist/helpers/verify-context.js +23 -0
  27. package/dist/index.d.ts +5 -0
  28. package/dist/index.js +21 -0
  29. package/dist/utils/checksum.d.ts +10 -0
  30. package/dist/utils/checksum.js +132 -0
  31. package/dist/utils/fs-utils.d.ts +34 -0
  32. package/dist/utils/fs-utils.js +126 -0
  33. package/dist/utils/index.d.ts +10 -0
  34. package/dist/utils/index.js +26 -0
  35. package/dist/utils/jsdoc.d.ts +12 -0
  36. package/dist/utils/jsdoc.js +37 -0
  37. package/dist/utils/lint.d.ts +46 -0
  38. package/dist/utils/lint.js +154 -0
  39. package/dist/utils/lockfile.d.ts +7 -0
  40. package/dist/utils/lockfile.js +80 -0
  41. package/dist/utils/logger.class.d.ts +25 -0
  42. package/dist/utils/logger.class.js +55 -0
  43. package/dist/utils/merge-conflict.d.ts +55 -0
  44. package/dist/utils/merge-conflict.js +264 -0
  45. package/dist/utils/path.d.ts +52 -0
  46. package/dist/utils/path.js +183 -0
  47. package/dist/utils/prettier-config.d.ts +2 -0
  48. package/dist/utils/prettier-config.js +13 -0
  49. package/dist/utils/prettier.d.ts +5 -0
  50. package/dist/utils/prettier.js +67 -0
  51. package/dist/utils/prettier.skiptest.d.ts +1 -0
  52. package/dist/utils/prettier.skiptest.js +22 -0
  53. package/dist/utils/promise.d.ts +2 -0
  54. package/dist/utils/promise.js +10 -0
  55. package/dist/utils/string-functions.d.ts +9 -0
  56. package/dist/utils/string-functions.js +23 -0
  57. package/dist/utils/sync-log-result.d.ts +9 -0
  58. package/dist/utils/sync-log-result.js +90 -0
  59. package/dist/utils/sync.d.ts +143 -0
  60. package/dist/utils/sync.js +325 -0
  61. package/dist/utils/template.d.ts +66 -0
  62. package/dist/utils/template.js +159 -0
  63. package/dist/utils/vfs.class.d.ts +115 -0
  64. package/dist/utils/vfs.class.js +239 -0
  65. package/dist/utils/zip.d.ts +13 -0
  66. package/dist/utils/zip.js +40 -0
  67. package/package.json +53 -31
  68. package/dist/generator.d.ts +0 -13
  69. package/dist/generator.js +0 -455
  70. package/dist/generators/enums/react.generator.d.ts +0 -10
  71. package/dist/generators/enums/react.generator.js +0 -110
  72. package/dist/generators/enums/types.generator.d.ts +0 -10
  73. package/dist/generators/enums/types.generator.js +0 -39
  74. package/dist/generators/indices/data/module.generator.d.ts +0 -9
  75. package/dist/generators/indices/data/module.generator.js +0 -60
  76. package/dist/generators/indices/data/service.generator.d.ts +0 -9
  77. package/dist/generators/indices/data/service.generator.js +0 -249
  78. package/dist/generators/indices/data/types.generator.d.ts +0 -9
  79. package/dist/generators/indices/data/types.generator.js +0 -49
  80. package/dist/generators/indices/dispatcher-service.generator.d.ts +0 -9
  81. package/dist/generators/indices/dispatcher-service.generator.js +0 -107
  82. package/dist/generators/indices/export/class.generator.d.ts +0 -9
  83. package/dist/generators/indices/export/class.generator.js +0 -140
  84. package/dist/generators/indices/export/encoder.generator.d.ts +0 -9
  85. package/dist/generators/indices/export/encoder.generator.js +0 -50
  86. package/dist/generators/indices/import/convert-functions.generator.d.ts +0 -9
  87. package/dist/generators/indices/import/convert-functions.generator.js +0 -509
  88. package/dist/generators/indices/import/decoder.generator.d.ts +0 -9
  89. package/dist/generators/indices/import/decoder.generator.js +0 -40
  90. package/dist/generators/indices/import/service.generator.d.ts +0 -9
  91. package/dist/generators/indices/import/service.generator.js +0 -573
  92. package/dist/generators/indices/import/types.generator.d.ts +0 -9
  93. package/dist/generators/indices/import/types.generator.js +0 -242
  94. package/dist/generators/indices/repositories.generator.d.ts +0 -9
  95. package/dist/generators/indices/repositories.generator.js +0 -25
  96. package/dist/generators/indices/routes.generator.d.ts +0 -9
  97. package/dist/generators/indices/routes.generator.js +0 -29
  98. package/dist/generators/indices/seed-migration.generator.d.ts +0 -9
  99. package/dist/generators/indices/seed-migration.generator.js +0 -36
  100. package/dist/generators/indices/seed-template.generator.d.ts +0 -9
  101. package/dist/generators/indices/seed-template.generator.js +0 -80
  102. package/dist/generators/indices/testids.generator.d.ts +0 -7
  103. package/dist/generators/indices/testids.generator.js +0 -71
  104. package/dist/generators/indices/types.generator.d.ts +0 -10
  105. package/dist/generators/indices/types.generator.js +0 -35
  106. package/dist/generators/indices/update/actiontypes.generator.d.ts +0 -9
  107. package/dist/generators/indices/update/actiontypes.generator.js +0 -49
  108. package/dist/generators/indices/update/module.generator.d.ts +0 -9
  109. package/dist/generators/indices/update/module.generator.js +0 -41
  110. package/dist/generators/indices/update/service.generator.d.ts +0 -9
  111. package/dist/generators/indices/update/service.generator.js +0 -34
  112. package/dist/generators/indices/view/module.generator.d.ts +0 -9
  113. package/dist/generators/indices/view/module.generator.js +0 -39
  114. package/dist/generators/indices/view/service.generator.d.ts +0 -9
  115. package/dist/generators/indices/view/service.generator.js +0 -34
  116. package/dist/generators/models/admin.page.generator.d.ts +0 -7
  117. package/dist/generators/models/admin.page.generator.js +0 -74
  118. package/dist/generators/models/export/encoder.generator.d.ts +0 -9
  119. package/dist/generators/models/export/encoder.generator.js +0 -51
  120. package/dist/generators/models/import/decoder.generator.d.ts +0 -9
  121. package/dist/generators/models/import/decoder.generator.js +0 -148
  122. package/dist/generators/models/react/context.generator.d.ts +0 -9
  123. package/dist/generators/models/react/context.generator.js +0 -71
  124. package/dist/generators/models/react/index.d.ts +0 -10
  125. package/dist/generators/models/react/index.js +0 -31
  126. package/dist/generators/models/react/library.generator.d.ts +0 -10
  127. package/dist/generators/models/react/library.generator.js +0 -94
  128. package/dist/generators/models/react/lookup.generator.d.ts +0 -9
  129. package/dist/generators/models/react/lookup.generator.js +0 -175
  130. package/dist/generators/models/react/modals.generator.d.ts +0 -23
  131. package/dist/generators/models/react/modals.generator.js +0 -710
  132. package/dist/generators/models/repository.generator.d.ts +0 -9
  133. package/dist/generators/models/repository.generator.js +0 -955
  134. package/dist/generators/models/route.generator.d.ts +0 -9
  135. package/dist/generators/models/route.generator.js +0 -92
  136. package/dist/generators/models/seed.generator.d.ts +0 -21
  137. package/dist/generators/models/seed.generator.js +0 -285
  138. package/dist/generators/models/stub.generator.d.ts +0 -9
  139. package/dist/generators/models/stub.generator.js +0 -92
  140. package/dist/generators/models/types.generator.d.ts +0 -9
  141. package/dist/generators/models/types.generator.js +0 -125
  142. package/dist/generators/models/update/service.generator.d.ts +0 -10
  143. package/dist/generators/models/update/service.generator.js +0 -302
  144. package/dist/generators/models/view/service.generator.d.ts +0 -10
  145. package/dist/generators/models/view/service.generator.js +0 -239
  146. package/dist/lib/attributes.d.ts +0 -114
  147. package/dist/lib/attributes.js +0 -2
  148. package/dist/lib/exports.d.ts +0 -45
  149. package/dist/lib/exports.js +0 -90
  150. package/dist/lib/imports.d.ts +0 -65
  151. package/dist/lib/imports.js +0 -114
  152. package/dist/lib/meta.d.ts +0 -1191
  153. package/dist/lib/meta.js +0 -434
  154. package/dist/lib/schema/fields.d.ts +0 -46
  155. package/dist/lib/schema/fields.js +0 -62
  156. package/dist/lib/schema/schema.d.ts +0 -466
  157. package/dist/lib/schema/schema.js +0 -18
  158. package/dist/lib/schema/types.d.ts +0 -201
  159. package/dist/lib/schema/types.js +0 -112
  160. package/dist/lib/serializer.d.ts +0 -15
  161. package/dist/lib/serializer.js +0 -24
  162. package/dist/lib/test-id-collector.d.ts +0 -42
  163. package/dist/lib/test-id-collector.js +0 -53
  164. package/dist/lib/types.d.ts +0 -7
  165. package/dist/lib/types.js +0 -13
  166. package/dist/lib/typescript.d.ts +0 -5
  167. package/dist/lib/typescript.js +0 -22
  168. package/dist/lib/utils/ast.d.ts +0 -29
  169. package/dist/lib/utils/ast.js +0 -23
  170. package/dist/lib/utils/error.d.ts +0 -17
  171. package/dist/lib/utils/error.js +0 -52
  172. package/dist/lib/utils/file.d.ts +0 -10
  173. package/dist/lib/utils/file.js +0 -56
  174. package/dist/lib/utils/jsdoc.d.ts +0 -9
  175. package/dist/lib/utils/jsdoc.js +0 -37
  176. package/dist/lib/utils/logger.d.ts +0 -17
  177. package/dist/lib/utils/logger.js +0 -12
  178. package/dist/lib/utils/string.d.ts +0 -40
  179. package/dist/lib/utils/string.js +0 -187
  180. package/dist/lib/utils/types.d.ts +0 -12
  181. package/dist/lib/utils/types.js +0 -2
  182. package/dist/lib/zod.d.ts +0 -8
  183. package/dist/lib/zod.js +0 -60
  184. package/dist/prisma/attributes.d.ts +0 -21
  185. package/dist/prisma/attributes.js +0 -175
  186. package/dist/prisma/client-path.d.ts +0 -7
  187. package/dist/prisma/client-path.js +0 -29
  188. package/dist/prisma/parse.d.ts +0 -12
  189. package/dist/prisma/parse.js +0 -452
@@ -1,60 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateDataModule = void 0;
4
- const imports_1 = require("../../../lib/imports");
5
- const meta_1 = require("../../../lib/meta");
6
- /**
7
- * Generates a data module class.
8
- */
9
- function generateDataModule({ models, meta }) {
10
- const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
11
- const imports = imports_1.ImportsGenerator.from(meta.data.moduleLocation.path).addImports({
12
- [meta.data.dataService.location.path]: [meta.data.dataService.class],
13
- [meta.backendModules.db.databaseService.location.import]: [meta.backendModules.db.databaseService.name],
14
- [meta.backendModules.db.moduleLocation.import]: [meta.backendModules.db.moduleName],
15
- });
16
- for (const { meta } of mm) {
17
- imports.addImport({
18
- items: [meta.data.repository.className],
19
- from: meta.data.repository.location.path,
20
- });
21
- }
22
- return /* ts */ `
23
- import { DynamicModule, FactoryProvider } from '@nestjs/common'
24
-
25
- ${imports.generate()}
26
-
27
- export class ${meta.data.moduleName} {
28
- public static forRoot(): DynamicModule {
29
- const userRepositoryProvider: FactoryProvider<UserRepository> = {
30
- provide: UserRepository,
31
- inject: [DatabaseService],
32
- useFactory: async (dbService: DatabaseService) => {
33
- const repository = new UserRepository(dbService)
34
- await repository.init()
35
- return repository
36
- },
37
- }
38
-
39
- const providers = [
40
- DataService,
41
-
42
- userRepositoryProvider,
43
-
44
- ${mm
45
- .filter((mm) => mm.model.name !== 'User')
46
- .map(({ meta }) => meta.data.repository.className)
47
- .join(',')}
48
- ]
49
-
50
- return {
51
- module: ${meta.data.moduleName},
52
- global: true,
53
- imports: [DatabaseModule],
54
- providers,
55
- exports: providers,
56
- }
57
- }
58
- }`;
59
- }
60
- exports.generateDataModule = generateDataModule;
@@ -1,9 +0,0 @@
1
- import { SchemaMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Generates a generic data service object that may be used on the server to access database.
5
- */
6
- export declare function generateDataService({ models, meta }: {
7
- models: Model[];
8
- meta: SchemaMetaData;
9
- }): string;
@@ -1,249 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateDataService = void 0;
4
- const imports_1 = require("../../../lib/imports");
5
- const meta_1 = require("../../../lib/meta");
6
- const types_1 = require("../../../lib/schema/types");
7
- /**
8
- * Generates a generic data service object that may be used on the server to access database.
9
- */
10
- function generateDataService({ models, meta }) {
11
- const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
12
- const imports = imports_1.ImportsGenerator.from(meta.data.dataService.location.path);
13
- for (const { meta } of mm) {
14
- imports.addImport({
15
- items: [meta.data.repository.className],
16
- from: meta.data.repository.location.path,
17
- });
18
- }
19
- const constructor = mm
20
- .map(({ meta }) => `public ${meta.data.dataServiceName} :${meta.data.repository.className}`)
21
- .join(',\n');
22
- const initializer = mm.map(({ meta }) => `await this.${meta.data.dataServiceName}.init()`).join('\n');
23
- const excelExports = mm
24
- .map(({ meta }) => `${meta.import.tableName}: Array.from((await this.${meta.data.dataServiceName}.getAll()).values()),`)
25
- .join('\n');
26
- const isEmptyChecks = mm.map(({ meta }) => `(await this.${meta.data.dataServiceName}.count()) === 0`).join(' &&');
27
- // Building blocks for bulk mutations
28
- imports.addImports({
29
- [meta.types.importPath]: [(0, types_1.toAnnotatedTypeName)(meta.types.dto.create), (0, types_1.toAnnotatedTypeName)(meta.types.dto.update)],
30
- [meta.data.repository.typeFilePath]: [(0, types_1.toAnnotatedTypeName)(meta.data.repository.typeName)],
31
- [meta.data.types.location.import]: [(0, types_1.toAnnotatedTypeName)(meta.data.types.bulkMutation)],
32
- [meta.actions.execution.interfaceLocation.import]: [meta.actions.execution.interface],
33
- });
34
- const creates = [];
35
- const updates = [];
36
- const upserts = [];
37
- const deletes = [];
38
- for (const model of models) {
39
- const modelMeta = (0, meta_1.getModelMetadata)({ model });
40
- creates.push(`await this.create({ name: '${modelMeta.userFriendlyName}', data: data.${modelMeta.seed.constantName}?.create, repo: this.${modelMeta.data.dataServiceName}, execution })`);
41
- updates.push(`await this.update({ name: '${modelMeta.userFriendlyName}', data: data.${modelMeta.seed.constantName}?.update, repo: this.${modelMeta.data.dataServiceName}, execution })`);
42
- upserts.push(`await this.upsert({ name: '${modelMeta.userFriendlyName}', data: data.${modelMeta.seed.constantName}?.upsert, repo: this.${modelMeta.data.dataServiceName}, execution })`);
43
- deletes.push(`await this.delete({ name: '${modelMeta.userFriendlyName}', data: data.${modelMeta.seed.constantName}?.delete, repo: this.${modelMeta.data.dataServiceName}, execution })`);
44
- }
45
- return /* ts */ `
46
- import { Injectable, Logger } from '@nestjs/common'
47
-
48
- import { format, pluralize } from '@postxl/runtime'
49
-
50
- ${imports.generate()}
51
-
52
- // If true, the bulk mutation will be executed one by one, instead of all at once (which is the default).
53
- // Also, each item will be logged to the console.
54
- // This should help to quickly identify the item that causes an error in a bulk mutation.
55
- const DEBUG = false
56
-
57
- @Injectable()
58
- export class ${meta.data.dataService.class} {
59
- private readonly logger = new Logger(${meta.data.dataService.class}.name)
60
-
61
- constructor(${constructor}) {}
62
-
63
- public async prepareExcelExport() {
64
- return {
65
- ${excelExports}
66
- }
67
- }
68
-
69
- public async init(): Promise<void> {
70
- ${initializer}
71
- }
72
-
73
- public async isEmpty(): Promise<boolean> {
74
- return (
75
- ${isEmptyChecks}
76
- )
77
- }
78
- public async ${meta.data.dataService.executeBulkMutations}(
79
- { steps, execution }:
80
- { steps: ${meta.data.types.bulkMutation}[]; execution: ${meta.actions.execution.interface} }
81
- ) {
82
- let index = 0
83
- for (const step of steps) {
84
- this.logger.log(\`Uploading data step \${++index}/\${steps.length}\`)
85
- await this.${meta.data.dataService.executeBulkMutation}({ data: step, execution })
86
- }
87
- }
88
-
89
- public async ${meta.data.dataService.executeBulkMutation}(
90
- { data, execution }:
91
- { data: ${meta.data.types.bulkMutation}, execution: ${meta.actions.execution.interface}}
92
- ) {
93
- // NOTE: the order of these calls is important, because of foreign key constraints
94
- // The current order is based on the order of the models in the schema
95
- // Change the order based on your needs.
96
- // Attention: Depending on the dependencies in seed data, you may also have to take care of relations,
97
- // e.g. by removing any foreign key first - and then update these after all data is created.
98
- // Alternatively, you can also do this in multiple steps
99
- ${creates.join('\n')}
100
-
101
- ${updates.join('\n')}
102
-
103
- ${upserts.join('\n')}
104
-
105
- ${deletes.join('\n')}
106
- }
107
-
108
- private async create<T extends { id: ID }, ID extends number | string | boolean>({
109
- name,
110
- data,
111
- repo,
112
- execution,
113
- }: {
114
- name: string
115
- data: ${meta.types.dto.create}<T, ID>[] | undefined
116
- repo: ${meta.data.repository.typeName}<T, ID>
117
- execution: ${meta.actions.execution.interface}
118
- }): Promise<void> {
119
- if (!data || data.length === 0) {
120
- return
121
- }
122
- if (!DEBUG) {
123
- await repo.createMany?.({ items: data, execution })
124
- } else {
125
- let i = 0
126
- for (const item of data) {
127
- i++
128
- this.logger.log(\`Creating \${name} \${i} - \${_getItemDescription(item)}\`)
129
- try {
130
- await repo.create?.({ item, execution })
131
- } catch (error) {
132
- this.logger.error(\`Error creating \${name} \${i} - \${_getItemDescription(item)}\`, error)
133
- throw error
134
- }
135
- }
136
- }
137
- this.logger.log(\`✅ Created \${format(data.length)} \${pluralize(name)}\`)
138
- }
139
-
140
- private async update<T extends { id: ID }, ID extends number | string | boolean>({
141
- name,
142
- data,
143
- repo,
144
- execution,
145
- }: {
146
- name: string
147
- data: ${meta.types.dto.update}<T, ID>[] | undefined
148
- repo: ${meta.data.repository.typeName}<T, ID>
149
- execution: ${meta.actions.execution.interface}
150
- }): Promise<void> {
151
- if (!data || data.length === 0) {
152
- return
153
- }
154
- if (!DEBUG) {
155
- await repo.updateMany?.({ items: data, execution })
156
- } else {
157
- let i = 0
158
- for (const item of data) {
159
- i++
160
- this.logger.log(\`Updating \${name} \${i} - \${_getItemDescription(item)}\`)
161
- try {
162
- await repo.update?.({ item, execution })
163
- } catch (error) {
164
- this.logger.error(\`Error updating \${name} \${i} - \${_getItemDescription(item)}\`, error)
165
- throw error
166
- }
167
- }
168
- }
169
- this.logger.log(\`✅ Updated \${format(data.length)} \${pluralize(name)}\`)
170
- }
171
-
172
- private async upsert<T extends { id: ID }, ID extends number | string | boolean>({
173
- name,
174
- data,
175
- repo,
176
- execution,
177
- }: {
178
- name: string
179
- data: (${meta.types.dto.create}<T, ID> | ${meta.types.dto.update}<T, ID>)[] | undefined
180
- repo: ${meta.data.repository.typeName}<T, ID>
181
- execution: ${meta.actions.execution.interface}
182
- }): Promise<void> {
183
- if (!data || data.length === 0) {
184
- return
185
- }
186
- if (!DEBUG) {
187
- await repo.upsertMany?.({ items: data, execution })
188
- } else {
189
- let i = 0
190
- for (const item of data) {
191
- i++
192
- this.logger.log(\`Upserting \${name} \${i} - \${_getItemDescription(item)}\`)
193
- try {
194
- await repo.upsert?.({ item, execution })
195
- } catch (error) {
196
- this.logger.error(\`Error upserting \${name} \${i} - \${_getItemDescription(item)}\`, error)
197
- throw error
198
- }
199
- }
200
- }
201
- this.logger.log(\`✅ Upserted \${format(data.length)} \${pluralize(name)}\`)
202
- }
203
-
204
- private async delete<T extends { id: ID }, ID extends number | string | boolean>({
205
- name,
206
- data,
207
- repo,
208
- execution,
209
- }: {
210
- name: string
211
- data: ID[] | undefined
212
- repo: ${meta.data.repository.typeName}<T, ID>
213
- execution: ${meta.actions.execution.interface}
214
- }): Promise<void> {
215
- if (!data || data.length === 0) {
216
- return
217
- }
218
- if (!DEBUG) {
219
- await repo.deleteMany?.({ ids: data, execution })
220
- } else {
221
- let i = 0
222
- for (const id of data) {
223
- i++
224
- this.logger.log(\`Deleting \${name} \${i} - id: \${id.toString()}\`)
225
- try {
226
- await repo.delete?.({ id, execution })
227
- } catch (error) {
228
- this.logger.error(\`Error deleting \${name} \${i} - id: \${id.toString()}\`, error)
229
- throw error
230
- }
231
- }
232
- }
233
- this.logger.log(\`✅ Deleted \${format(data.length)} \${pluralize(name)}\`)
234
- }
235
- }
236
-
237
- function _getItemDescription<T extends Partial<{ id: ID }>, ID extends number | string | boolean>(item: T): string {
238
- const id = \`id: \${item.id !== undefined ? item.id.toString() : 'not provided'}\`
239
-
240
- // If the item has a name, we can assume it is a string and add it to the description
241
- if ('name' in item) {
242
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
243
- return \`\${id}, name: \${item.name}\`
244
- }
245
- return id
246
- }
247
- `;
248
- }
249
- exports.generateDataService = generateDataService;
@@ -1,9 +0,0 @@
1
- import { SchemaMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Generates type for BulkMutations.
5
- */
6
- export declare function generateDataTypes({ models, meta }: {
7
- models: Model[];
8
- meta: SchemaMetaData;
9
- }): string;
@@ -1,49 +0,0 @@
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.location.path);
12
- const dto = meta.types.dto;
13
- imports.addTypeImport({
14
- from: meta.types.importPath,
15
- items: [dto.create, dto.update, dto.upsert, dto.genericModel, dto.idType],
16
- });
17
- const modelTypes = [];
18
- for (const model of models) {
19
- const modelMeta = (0, meta_1.getModelMetadata)({ model });
20
- imports.addTypeImport({
21
- items: [modelMeta.types.typeName, modelMeta.types.brandedIdType],
22
- from: modelMeta.types.importPath,
23
- });
24
- modelTypes.push(`${modelMeta.seed.constantName}?: ${types.bulkMutationForModel}<${modelMeta.types.typeName}, ${modelMeta.types.brandedIdType}>`);
25
- }
26
- return /* ts */ `
27
- ${imports.generate()}
28
-
29
- /**
30
- * Generic type for BulkMutation for a model.
31
- */
32
- export type ${types.bulkMutationForModel}<
33
- Model extends ${dto.genericModel}<ID>,
34
- ID extends ${dto.idType}
35
- > = {
36
- create?: ${dto.create}<Model, ID>[]
37
- update?: ${dto.update}<Model, ID>[]
38
- upsert?: ${dto.upsert}<Model, ID>[]
39
- delete?: ID[]
40
- }
41
-
42
- /**
43
- * Bulk changes for all models.
44
- */
45
- export type ${types.bulkMutation} = {
46
- ${modelTypes.join('\n')}
47
- }`;
48
- }
49
- exports.generateDataTypes = generateDataTypes;
@@ -1,9 +0,0 @@
1
- import { SchemaMetaData } from '../../lib/meta';
2
- import { Model } from '../../lib/schema/schema';
3
- /**
4
- * Generates the action dispatcher service.
5
- */
6
- export declare function generateActionsDispatcherService({ models, meta }: {
7
- models: Model[];
8
- meta: SchemaMetaData;
9
- }): string;
@@ -1,107 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateActionsDispatcherService = void 0;
4
- const imports_1 = require("../../lib/imports");
5
- const meta_1 = require("../../lib/meta");
6
- const types_1 = require("../../lib/schema/types");
7
- /**
8
- * Generates the action dispatcher service.
9
- */
10
- function generateActionsDispatcherService({ models, meta }) {
11
- const imports = imports_1.ImportsGenerator.from(meta.actions.dispatcher.classLocation.path).addImports({
12
- [meta.seed.serviceLocation.import]: [meta.seed.serviceClassName],
13
- [meta.import.importService.location.import]: [meta.import.importService.name],
14
- [meta.update.serviceLocation.import]: [meta.update.serviceClassName],
15
- [meta.types.importPath]: (0, types_1.toAnnotatedTypeName)(meta.config.userType),
16
- [meta.backendModules.db.databaseService.location.import]: [meta.backendModules.db.databaseService.name],
17
- [meta.actions.execution.interfaceLocation.path]: [meta.actions.execution.interface],
18
- });
19
- const dataLoader = [];
20
- for (const model of models) {
21
- const modelMeta = (0, meta_1.getModelMetadata)({ model });
22
- dataLoader.push(`await this.upload({ name: '${modelMeta.userFriendlyName}', data: data.${modelMeta.seed.constantName}, repo: this.dataService.${modelMeta.data.dataServiceName}, log })`);
23
- }
24
- return /* ts */ `
25
- import { Injectable } from '@nestjs/common'
26
-
27
- import { ExhaustiveSwitchCheck } from '@postxl/runtime'
28
-
29
- ${imports.generate()}
30
-
31
- import { ActionExecutionFactory } from './execution/action'
32
- import { Action, ResultOfAction } from './actions.types'
33
-
34
-
35
- @Injectable()
36
- export class ${meta.actions.dispatcher.class} {
37
-
38
- // As SeedModule and ImportModule get instantiated after the ActionsModule, we use this hack to avoid a circular dependency:
39
- // we set the seedService and the importService to value and then overwrite it in the services' constructors.
40
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
41
- public seedService: SeedService = {} as unknown as any
42
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
43
- public ${meta.import.importService.sharedName}: ImportService = {} as unknown as any
44
-
45
- constructor(
46
- private readonly updateService: ${meta.update.serviceClassName},
47
- private readonly databaseService: DatabaseService,
48
- private readonly actionExecutionFactory: ActionExecutionFactory,
49
- ) {}
50
-
51
- public async dispatch<A extends Action>({ action, user }: {
52
- action: A;
53
- user: ${meta.config.userType}
54
- }): Promise<ResultOfAction<A>> {
55
- const execution = await this.actionExecutionFactory.create({ action, databaseService: this.databaseService, user })
56
-
57
- try {
58
- const result = await this.execute({ action, execution })
59
-
60
- await execution.success(result)
61
-
62
- return result
63
- } catch (e) {
64
- await execution.error(e)
65
- throw e
66
- }
67
- }
68
-
69
- private async execute<A extends Action>({
70
- action,
71
- execution,
72
- }: {
73
- action: A
74
- execution: IActionExecution
75
- }): Promise<ResultOfAction<A>> {
76
- switch (action.scope) {
77
- ${models
78
- .map((model) => {
79
- const modelMeta = (0, meta_1.getModelMetadata)({ model });
80
- return `
81
- case '${modelMeta.update.scopeName}': {
82
- const method = this.updateService.${modelMeta.update.serviceVariableName}[action.type] as (params: {
83
- data: A['payload']
84
- execution: IActionExecution
85
- }) => Promise<ResultOfAction<A>>
86
-
87
- // NOTE: We need to bind the method to the service instance, as it is a method of the service and not a standalone function.
88
- return method.bind(this.updateService.${modelMeta.update.serviceVariableName})({ data: action.payload, execution })
89
- }
90
- `;
91
- })
92
- .join('\n')}
93
-
94
- case 'seed':
95
- return this.seedService.dispatch({ action, execution }) as Promise<ResultOfAction<A>>
96
-
97
- case 'import':
98
- return this.importService.dispatch({ action, execution }) as Promise<ResultOfAction<A>>
99
-
100
- default:
101
- throw new ExhaustiveSwitchCheck(action)
102
- }
103
- }
104
- }
105
- `;
106
- }
107
- exports.generateActionsDispatcherService = generateActionsDispatcherService;
@@ -1,9 +0,0 @@
1
- import { SchemaMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Generates the Exporter class for the Export module
5
- */
6
- export declare function generateExporterClass({ models, meta }: {
7
- models: Model[];
8
- meta: SchemaMetaData;
9
- }): string;
@@ -1,140 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateExporterClass = void 0;
4
- const imports_1 = require("../../../lib/imports");
5
- const meta_1 = require("../../../lib/meta");
6
- const types_1 = require("../../../lib/schema/types");
7
- /**
8
- * Generates the Exporter class for the Export module
9
- */
10
- function generateExporterClass({ models, meta }) {
11
- const imports = imports_1.ImportsGenerator.from(meta.export.exporterClass.location.path);
12
- imports.addImports({
13
- [meta.view.serviceLocation.import]: [meta.view.serviceClassName],
14
- [meta.export.encoder.location.path]: [
15
- meta.export.encoder.fullEncoderFunctionName,
16
- (0, types_1.toAnnotatedTypeName)(meta.export.encoder.encodedExcelDataTypeName),
17
- ],
18
- });
19
- const typeExports = [];
20
- const typeExportsDataEntries = [];
21
- const privateMaps = [];
22
- const exportDataProperties = [];
23
- const addFunctions = [];
24
- const addAllCalls = [];
25
- for (const model of models) {
26
- const modelMeta = (0, meta_1.getModelMetadata)({ model });
27
- imports.addTypeImport({
28
- from: modelMeta.types.importPath,
29
- items: [modelMeta.types.brandedIdType, modelMeta.types.typeName],
30
- });
31
- typeExports.push(`export type ${modelMeta.export.exportDataTypeName} = CapitalizedKeys<${model.name}>`);
32
- typeExportsDataEntries.push(`${modelMeta.export.exportDataPropertyName}?: ${modelMeta.export.exportDataTypeName}[]`);
33
- privateMaps.push(`private ${modelMeta.internalPluralName} = new Map<${modelMeta.types.brandedIdType}, ${modelMeta.types.typeName}>()`);
34
- exportDataProperties.push(`${modelMeta.export.exportDataFullPropertyName}: Array.from(this.${modelMeta.internalPluralName}.values())`);
35
- const linkedItems = [];
36
- for (const field of model.fields) {
37
- if (field.kind !== 'relation') {
38
- continue;
39
- }
40
- const linkedModelMeta = (0, meta_1.getModelMetadata)({ model: field.relationToModel });
41
- if (field.isRequired) {
42
- linkedItems.push(`await this.${linkedModelMeta.export.exportAddFunctionName}({id: item.${field.name}, includeChildren: false, user})`);
43
- }
44
- else {
45
- linkedItems.push(`
46
- if (item.${field.name}) {
47
- await this.${linkedModelMeta.export.exportAddFunctionName}({id: item.${field.name}, includeChildren: false, user})
48
- }`);
49
- }
50
- }
51
- const childItemCalls = [];
52
- for (const { referencingField, referencingModel } of model.references) {
53
- const linkedModelMeta = (0, meta_1.getModelMetadata)({ model: referencingModel });
54
- const linkedFieldMeta = (0, meta_1.getFieldMetadata)({ field: referencingField });
55
- childItemCalls.push(`
56
- // Add all ${linkedModelMeta.userFriendlyNamePlural} that are related to the ${modelMeta.userFriendlyName} via ${referencingField.name}
57
- for (const ${referencingField.name} of await this.viewService.${linkedModelMeta.view.serviceVariableName}.data.${linkedFieldMeta.getByForeignKeyIdsMethodFnName}(id)) {
58
- await this.${linkedModelMeta.export.exportAddFunctionName}({id: ${referencingField.name}, includeChildren, user})
59
- }
60
- `);
61
- }
62
- const childItems = childItemCalls.length > 0
63
- ? `
64
- if (includeChildren) {
65
- ${childItemCalls.join('\n')}
66
- }`
67
- : '';
68
- const signature = `{id, includeChildren = true, user}: {id: ${model.brandedIdType}, includeChildren?: boolean, user: User}`;
69
- addFunctions.push(`
70
- /**
71
- * Adds a ${modelMeta.userFriendlyName} and all related (and nested) dependencies to the export.
72
- */
73
- public async ${modelMeta.export.exportAddFunctionName}(${signature}) {
74
- if (this.${modelMeta.internalPluralName}.has(id)) {
75
- return
76
- }
77
- const item = await this.viewService.${modelMeta.view.serviceVariableName}.get({ id, user })
78
- if (!item) {
79
- this.logger.error(\`Cannot find ${modelMeta.userFriendlyName} \${id}\`)
80
- return
81
- }
82
- this.${modelMeta.internalPluralName}.set(id, item)
83
-
84
- ${linkedItems.join('\n')}
85
-
86
- ${childItems}
87
- }
88
- `);
89
- addAllCalls.push(`this.${modelMeta.internalPluralName} = await this.viewService.${modelMeta.view.serviceVariableName}.getAll(user)`);
90
- }
91
- return /* ts */ `
92
- // For consistency, we include \`{ includeChildren = true }\` in the signature of every add function.
93
- // If the model does not have any related models, the \`includeChildren\` parameter is ignored.
94
- /* eslint-disable @typescript-eslint/no-unused-vars */
95
-
96
- import { Logger } from '@nestjs/common'
97
-
98
- ${imports.generate()}
99
-
100
- /**
101
- * Exporter helps to export data items and all their (nested) dependencies to Excel format.
102
- *
103
- * Usage:
104
- * - Create an instance of the Exporter
105
- * - Call the \`add{ModelName}({id})\` methods to add the items you want to export.
106
- * This will automatically add all dependencies of the item.
107
- * - Call the \`exportData()\` method to get the encoded Excel data.
108
- * - Alternatively, you can call 'exportAll()' to dump all data.
109
- */
110
- export class ${meta.export.exporterClass.name} {
111
- private logger = new Logger(Exporter.name)
112
-
113
- ${privateMaps.join('\n ')}
114
-
115
- constructor(private readonly viewService: ViewService) {}
116
-
117
- /**
118
- * Exports all data that was added by prior calls to \`.add{Model}\` functions.
119
- */
120
- public exportData(): ${meta.export.encoder.encodedExcelDataTypeName} {
121
- return ${meta.export.encoder.fullEncoderFunctionName}({
122
- ${exportDataProperties.join(',\n ')}
123
- })
124
- }
125
-
126
- /**
127
- * Exports all data.
128
- */
129
- public async exportAll(user: User): Promise<${meta.export.encoder.encodedExcelDataTypeName}> {
130
- ${addAllCalls.join('\n')}
131
-
132
- return this.exportData()
133
- }
134
-
135
- ${addFunctions.join('\n\n')}
136
- }
137
-
138
- `;
139
- }
140
- exports.generateExporterClass = generateExporterClass;
@@ -1,9 +0,0 @@
1
- import { SchemaMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Generates the data encoder, aggregating all the models.
5
- */
6
- export declare function generateExportEncoder({ models, meta }: {
7
- models: Model[];
8
- meta: SchemaMetaData;
9
- }): string;