@postxl/generator 0.33.4 → 0.35.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 (63) hide show
  1. package/dist/generator.js +40 -22
  2. package/dist/generators/indices/businesslogic-actiontypes.generator.d.ts +9 -0
  3. package/dist/generators/indices/businesslogic-actiontypes.generator.js +39 -0
  4. package/dist/generators/indices/businesslogic-update-index.generator.d.ts +9 -0
  5. package/dist/generators/indices/businesslogic-update-index.generator.js +20 -0
  6. package/dist/generators/indices/businesslogic-update-module.generator.d.ts +9 -0
  7. package/dist/generators/indices/businesslogic-update-module.generator.js +69 -0
  8. package/dist/generators/indices/businesslogic-update-service.generator.d.ts +9 -0
  9. package/dist/generators/indices/businesslogic-update-service.generator.js +34 -0
  10. package/dist/generators/indices/businesslogic-view-index.generator.d.ts +9 -0
  11. package/dist/generators/indices/businesslogic-view-index.generator.js +19 -0
  12. package/dist/generators/indices/{businesslogicindex.generator.d.ts → businesslogic-view-module.generator.d.ts} +2 -2
  13. package/dist/generators/indices/{businesslogicmodule.generator.js → businesslogic-view-module.generator.js} +22 -26
  14. package/dist/generators/indices/{businesslogicservice.generator.d.ts → businesslogic-view-service.generator.d.ts} +1 -1
  15. package/dist/generators/indices/{businesslogicservice.generator.js → businesslogic-view-service.generator.js} +9 -10
  16. package/dist/generators/indices/{datamockmodule.generator.js → datamock-module.generator.js} +8 -16
  17. package/dist/generators/indices/datamocker.generator.js +3 -7
  18. package/dist/generators/indices/datamodule.generator.js +7 -13
  19. package/dist/generators/indices/{businesslogicmodule.generator.d.ts → dispatcher-service.generator.d.ts} +2 -2
  20. package/dist/generators/indices/dispatcher-service.generator.js +81 -0
  21. package/dist/generators/indices/seed-migration.generator.d.ts +9 -0
  22. package/dist/generators/indices/seed-migration.generator.js +35 -0
  23. package/dist/generators/indices/seed-service.generator.d.ts +1 -1
  24. package/dist/generators/indices/seed-service.generator.js +327 -123
  25. package/dist/generators/indices/seed-template-decoder.generator.js +22 -6
  26. package/dist/generators/indices/{seed.generator.d.ts → seeddata-type.generator.d.ts} +2 -2
  27. package/dist/generators/indices/seeddata-type.generator.js +42 -0
  28. package/dist/generators/indices/types.generator.d.ts +1 -1
  29. package/dist/generators/indices/types.generator.js +8 -6
  30. package/dist/generators/models/businesslogic-update.generator.d.ts +10 -0
  31. package/dist/generators/models/businesslogic-update.generator.js +243 -0
  32. package/dist/generators/models/businesslogic-view.generator.d.ts +10 -0
  33. package/dist/generators/models/businesslogic-view.generator.js +253 -0
  34. package/dist/generators/models/react.generator/modals.generator.js +20 -4
  35. package/dist/generators/models/repository.generator.d.ts +9 -0
  36. package/dist/generators/models/repository.generator.js +496 -148
  37. package/dist/generators/models/route.generator.js +45 -54
  38. package/dist/generators/models/seed.generator.js +6 -2
  39. package/dist/generators/models/types.generator.js +60 -13
  40. package/dist/lib/attributes.d.ts +32 -2
  41. package/dist/lib/imports.d.ts +23 -2
  42. package/dist/lib/imports.js +19 -1
  43. package/dist/lib/meta.d.ts +287 -34
  44. package/dist/lib/meta.js +87 -16
  45. package/dist/lib/schema/fields.d.ts +7 -4
  46. package/dist/lib/schema/fields.js +11 -4
  47. package/dist/lib/schema/schema.d.ts +32 -6
  48. package/dist/lib/schema/types.d.ts +4 -0
  49. package/dist/lib/utils/ast.d.ts +29 -0
  50. package/dist/lib/utils/ast.js +23 -0
  51. package/dist/lib/utils/jsdoc.d.ts +1 -1
  52. package/dist/lib/utils/jsdoc.js +8 -5
  53. package/dist/lib/utils/string.js +2 -1
  54. package/dist/prisma/attributes.js +45 -26
  55. package/dist/prisma/parse.js +44 -11
  56. package/package.json +1 -1
  57. package/dist/generators/indices/businesslogicindex.generator.js +0 -19
  58. package/dist/generators/indices/seed.generator.js +0 -17
  59. package/dist/generators/indices/testdataservice.generator.d.ts +0 -9
  60. package/dist/generators/indices/testdataservice.generator.js +0 -78
  61. package/dist/generators/models/businesslogic.generator.d.ts +0 -9
  62. package/dist/generators/models/businesslogic.generator.js +0 -259
  63. /package/dist/generators/indices/{datamockmodule.generator.d.ts → datamock-module.generator.d.ts} +0 -0
@@ -1,259 +0,0 @@
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
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.generateModelBusinessLogic = void 0;
27
- const imports_1 = require("../../lib/imports");
28
- const meta_1 = require("../../lib/meta");
29
- const fields_1 = require("../../lib/schema/fields");
30
- const Types = __importStar(require("../../lib/schema/types"));
31
- const repository_generator_1 = require("./repository.generator");
32
- /**
33
- * Generates business logic for a given model.
34
- */
35
- // TODO: https://github.com/PostXL/PostXL/issues/347
36
- function generateModelBusinessLogic({ model, meta }) {
37
- const schemaMeta = (0, meta_1.getSchemaMetadata)({ config: model.schemaConfig });
38
- const imports = imports_1.ImportsGenerator.from(meta.businessLogic.serviceFilePath);
39
- imports.addImport({ from: meta.data.importPath, items: [meta.data.repositoryClassName] });
40
- imports.addImport({ from: meta.types.importPath, items: [model.brandedIdType, meta.types.typeName] });
41
- /**
42
- * The name of the variable that holds the repository instance for the current model
43
- * (e.g. when we generate business logic service for Aggregation, the AggregationRepository
44
- * would be referenced using `this.data` variable).
45
- */
46
- const modelRepositoryVariableName = meta.businessLogic.dataRepositoryVariableName;
47
- /**
48
- * The name of the variable that holds the central business logic service instance.
49
- * Instead of injecting a repository instance for each model, we inject this single instance
50
- * which then provides access to all models' business logic.
51
- */
52
- const businessLogicServiceClassName = Types.toVariableName('businessLogic');
53
- const constructorParameters = [
54
- `public readonly ${modelRepositoryVariableName}: ${meta.data.repositoryClassName}`,
55
- `@Inject(forwardRef(() => ${schemaMeta.businessLogic.serviceClassName})) private readonly ${businessLogicServiceClassName}: ${schemaMeta.businessLogic.serviceClassName}`,
56
- ];
57
- imports.addImport({
58
- from: schemaMeta.businessLogic.serviceFilePath,
59
- items: [schemaMeta.businessLogic.serviceClassName],
60
- });
61
- imports.addImport({ from: meta.data.importPath, items: [meta.data.repositoryClassName] });
62
- /**
63
- * Variable names and their definitions indexed by the name of the relation they represent.
64
- */
65
- const variables = new Map();
66
- for (const relation of (0, fields_1.getRelationFields)(model)) {
67
- const refModel = relation.relationToModel;
68
- const refMeta = (0, meta_1.getModelMetadata)({ model: refModel });
69
- const variableGetter = `this.${businessLogicServiceClassName}.${refMeta.businessLogic.serviceVariableName}.get(itemRaw.${relation.name})`;
70
- const variablePresenceCheck = `
71
- if (!${relation.relatedModelBacklinkFieldName}) {
72
- throw new Error(\`Could not find ${refMeta.types.typeName} with id \${itemRaw.${relation.name}} for ${model.typeName}.${relation.name}!\`)
73
- }
74
- `;
75
- const relationVariableName = relation.relatedModelBacklinkFieldName;
76
- variables.set(relation.name, {
77
- variableName: relationVariableName,
78
- variableDefinition: `
79
- const ${relationVariableName} = ${relation.isRequired
80
- ? `${variableGetter};${variablePresenceCheck}`
81
- : `itemRaw.${relation.name} !== null ? ${variableGetter} : null`}
82
- `,
83
- });
84
- }
85
- const hasLinkedItems = variables.size > 0;
86
- if (hasLinkedItems) {
87
- imports.addImport({ from: meta.types.importPath, items: [meta.types.linkedTypeName] });
88
- }
89
- const linkedItemsGetterFn = `
90
- /**
91
- * Returns the linked ${meta.userFriendlyName} with the given id or null if it does not exist.
92
- * Linked: The ${meta.userFriendlyName} contains the linked (raw) items themselves, not only the ids.
93
- */
94
- public getLinkedItem(id: ${model.brandedIdType}): ${meta.types.linkedTypeName} | null {
95
- const itemRaw = this.${modelRepositoryVariableName}.get(id)
96
- if (!itemRaw) {
97
- return null
98
- }
99
-
100
- ${[...variables.values()].map((r) => r.variableDefinition).join('\n')}
101
-
102
- const item: ${meta.types.linkedTypeName} = {
103
- ${model.fields
104
- .map((f) => {
105
- if (f.kind !== 'relation') {
106
- return `${f.name}: itemRaw.${f.name}`;
107
- }
108
- const linkedRel = variables.get(f.name);
109
- if (!linkedRel) {
110
- throw new Error(`Could not find linked item for ${model.typeName}.${f.name}`);
111
- }
112
- return `${linkedRel.variableName}`;
113
- })
114
- .join(',\n')}
115
- }
116
- return item
117
- }
118
- `;
119
- const methodTypeSignatures = (0, repository_generator_1.getRepositoryMethodsTypeSignatures)({ model, meta });
120
- // prettier-ignore
121
- return `
122
- import { Inject, Injectable, forwardRef } from '@nestjs/common'
123
- import { FilterOperator } from '@pxl/common'
124
-
125
- ${imports.generate()}
126
-
127
- @Injectable()
128
- export class ${meta.businessLogic.serviceClassName} {
129
- constructor(${constructorParameters.join(',\n')}) {}
130
-
131
- /**
132
- * Returns the raw ${meta.userFriendlyName} with the given id or null if it does not exist.
133
- * Raw: The ${meta.userFriendlyName} only contains linked Ids, not the linked items themselves.
134
- */
135
- public get(id: ${model.brandedIdType}): ${meta.types.typeName} | null {
136
- return this.${modelRepositoryVariableName}.get(id)
137
- }
138
-
139
- ${hasLinkedItems ? linkedItemsGetterFn : ''}
140
-
141
- /**
142
- * Returns a map of all ${meta.userFriendlyName}s.
143
- */
144
- public getAll(): Map<${meta.types.brandedIdType}, ${model.typeName}> {
145
- return this.${modelRepositoryVariableName}.getAll()
146
- }
147
-
148
- /**
149
- * Returns a list of filtered, sorted and paginated ${meta.userFriendlyName}s.
150
- */
151
- public getList({
152
- filter,
153
- sort,
154
- cursor,
155
- }: {
156
- filter?: { field: keyof ${model.typeName}; operator: FilterOperator; value: string | number }
157
- sort?: { field: keyof ${model.typeName}; ascending: boolean }
158
- cursor?: { startRow: number; endRow: number }
159
- }) {
160
- const items = this.data.getAllAsArray()
161
- const filtered = !filter
162
- ? items
163
- : items.filter((item) => filterFn(item, filter.field, filter.operator, filter.value))
164
-
165
- const filteredAndSorted = !sort
166
- ? filtered
167
- : filtered.sort((a, b) => (sort.ascending ? compare(a, b, sort.field) : -compare(a, b, sort.field)))
168
-
169
- const paginated = !cursor ? filteredAndSorted : filteredAndSorted.slice(cursor.startRow, cursor.endRow)
170
- return { rows: paginated, count: items.length }
171
- }
172
-
173
- /**
174
- * Creates a new ${meta.userFriendlyName}.
175
- */
176
- public async create(item: ${methodTypeSignatures.create.parameters[0]}): ${methodTypeSignatures.create.returnType} {
177
- return this.${modelRepositoryVariableName}.create(item)
178
- }
179
-
180
- /**
181
- * Updates the given ${meta.userFriendlyName}.
182
- */
183
- public async update(item: ${methodTypeSignatures.update.parameters[0]}): ${methodTypeSignatures.update.returnType} {
184
- return this.${modelRepositoryVariableName}.update(item)
185
- }
186
-
187
- /**
188
- * Deletes the ${meta.userFriendlyName} with the given id.
189
- *
190
- * Note: This does NOT delete any linked items.
191
- * If the items is a dependency of another item, the deletion will fail!
192
- */
193
- public async delete(id: ${methodTypeSignatures.delete.parameters[0]}): ${methodTypeSignatures.delete.returnType} {
194
- return this.${modelRepositoryVariableName}.delete(id)
195
- }
196
- }
197
-
198
- const compare = (a: ${model.typeName}, b: ${model.typeName}, field: keyof ${model.typeName}) => {
199
- switch (field) {
200
- ${model.fields.filter((f) => f.kind === 'scalar' && f.tsTypeName === 'string').length === 0
201
- ? ''
202
- : `${model.fields
203
- .filter((f) => f.kind === 'scalar' && f.tsTypeName === 'string')
204
- .map((f) => `case '${f.name}':`)
205
- .join('\n')}
206
- return (a[field] || '').localeCompare(b[field] || '')`}
207
- default:
208
- return 0
209
- }
210
- }
211
-
212
- const filterFn = (item: ${model.typeName}, field: keyof ${model.typeName}, operator: FilterOperator, value: string | number): boolean => {
213
- switch (field) {
214
- ${model.fields.filter((f) => f.kind === 'scalar' && f.tsTypeName === 'string').length === 0
215
- ? ''
216
- : `${model.fields
217
- .filter((f) => f.kind === 'scalar' && f.tsTypeName === 'string')
218
- .map((f) => `case '${f.name}':`)
219
- .join('\n')}
220
- {
221
- if (typeof value !== 'string') return false
222
- switch (operator) {
223
- case 'contains': {
224
- return (item[field] || '').toLowerCase().includes(value.toLowerCase())
225
- }
226
- default:
227
- return false
228
- }
229
- }`}
230
- ${model.fields.filter((f) => f.kind === 'scalar' && f.tsTypeName === 'number').length === 0
231
- ? ''
232
- : `${model.fields
233
- .filter((f) => f.kind === 'scalar' && f.tsTypeName === 'number')
234
- .map((f) => `case '${f.name}':`)
235
- .join('\n')}
236
- {
237
- const toCompare = item[field]
238
- if (typeof value !== 'number' || toCompare === null) return false
239
- switch (operator) {
240
- case 'eq': {
241
- return item[field] === value
242
- }
243
- case 'gt': {
244
- return toCompare > value
245
- }
246
- case 'lt': {
247
- return toCompare < value
248
- }
249
- default:
250
- return false
251
- }
252
- }`}
253
- default:
254
- return false
255
- }
256
- }
257
- `;
258
- }
259
- exports.generateModelBusinessLogic = generateModelBusinessLogic;