@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.
- package/dist/generator.js +40 -22
- package/dist/generators/indices/businesslogic-actiontypes.generator.d.ts +9 -0
- package/dist/generators/indices/businesslogic-actiontypes.generator.js +39 -0
- package/dist/generators/indices/businesslogic-update-index.generator.d.ts +9 -0
- package/dist/generators/indices/businesslogic-update-index.generator.js +20 -0
- package/dist/generators/indices/businesslogic-update-module.generator.d.ts +9 -0
- package/dist/generators/indices/businesslogic-update-module.generator.js +69 -0
- package/dist/generators/indices/businesslogic-update-service.generator.d.ts +9 -0
- package/dist/generators/indices/businesslogic-update-service.generator.js +34 -0
- package/dist/generators/indices/businesslogic-view-index.generator.d.ts +9 -0
- package/dist/generators/indices/businesslogic-view-index.generator.js +19 -0
- package/dist/generators/indices/{businesslogicindex.generator.d.ts → businesslogic-view-module.generator.d.ts} +2 -2
- package/dist/generators/indices/{businesslogicmodule.generator.js → businesslogic-view-module.generator.js} +22 -26
- package/dist/generators/indices/{businesslogicservice.generator.d.ts → businesslogic-view-service.generator.d.ts} +1 -1
- package/dist/generators/indices/{businesslogicservice.generator.js → businesslogic-view-service.generator.js} +9 -10
- package/dist/generators/indices/{datamockmodule.generator.js → datamock-module.generator.js} +8 -16
- package/dist/generators/indices/datamocker.generator.js +3 -7
- package/dist/generators/indices/datamodule.generator.js +7 -13
- package/dist/generators/indices/{businesslogicmodule.generator.d.ts → dispatcher-service.generator.d.ts} +2 -2
- package/dist/generators/indices/dispatcher-service.generator.js +81 -0
- package/dist/generators/indices/seed-migration.generator.d.ts +9 -0
- package/dist/generators/indices/seed-migration.generator.js +35 -0
- package/dist/generators/indices/seed-service.generator.d.ts +1 -1
- package/dist/generators/indices/seed-service.generator.js +327 -123
- package/dist/generators/indices/seed-template-decoder.generator.js +22 -6
- package/dist/generators/indices/{seed.generator.d.ts → seeddata-type.generator.d.ts} +2 -2
- package/dist/generators/indices/seeddata-type.generator.js +42 -0
- package/dist/generators/indices/types.generator.d.ts +1 -1
- package/dist/generators/indices/types.generator.js +8 -6
- package/dist/generators/models/businesslogic-update.generator.d.ts +10 -0
- package/dist/generators/models/businesslogic-update.generator.js +243 -0
- package/dist/generators/models/businesslogic-view.generator.d.ts +10 -0
- package/dist/generators/models/businesslogic-view.generator.js +253 -0
- package/dist/generators/models/react.generator/modals.generator.js +20 -4
- package/dist/generators/models/repository.generator.d.ts +9 -0
- package/dist/generators/models/repository.generator.js +496 -148
- package/dist/generators/models/route.generator.js +45 -54
- package/dist/generators/models/seed.generator.js +6 -2
- package/dist/generators/models/types.generator.js +60 -13
- package/dist/lib/attributes.d.ts +32 -2
- package/dist/lib/imports.d.ts +23 -2
- package/dist/lib/imports.js +19 -1
- package/dist/lib/meta.d.ts +287 -34
- package/dist/lib/meta.js +87 -16
- package/dist/lib/schema/fields.d.ts +7 -4
- package/dist/lib/schema/fields.js +11 -4
- package/dist/lib/schema/schema.d.ts +32 -6
- package/dist/lib/schema/types.d.ts +4 -0
- package/dist/lib/utils/ast.d.ts +29 -0
- package/dist/lib/utils/ast.js +23 -0
- package/dist/lib/utils/jsdoc.d.ts +1 -1
- package/dist/lib/utils/jsdoc.js +8 -5
- package/dist/lib/utils/string.js +2 -1
- package/dist/prisma/attributes.js +45 -26
- package/dist/prisma/parse.js +44 -11
- package/package.json +1 -1
- package/dist/generators/indices/businesslogicindex.generator.js +0 -19
- package/dist/generators/indices/seed.generator.js +0 -17
- package/dist/generators/indices/testdataservice.generator.d.ts +0 -9
- package/dist/generators/indices/testdataservice.generator.js +0 -78
- package/dist/generators/models/businesslogic.generator.d.ts +0 -9
- package/dist/generators/models/businesslogic.generator.js +0 -259
- /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;
|
/package/dist/generators/indices/{datamockmodule.generator.d.ts → datamock-module.generator.d.ts}
RENAMED
|
File without changes
|