@comet/api-generator 9.0.0-beta.2 → 9.0.0-beta.4
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/lib/commands/generate/generate-command.js +4 -13
- package/lib/commands/generate/generateCrud/build-options.d.ts +1 -1
- package/lib/commands/generate/generateCrud/build-options.js +3 -3
- package/lib/commands/generate/generateCrud/generate-crud.d.ts +1 -1
- package/lib/commands/generate/generateCrud/generate-crud.js +110 -104
- package/lib/commands/generate/generateCrud/generate-enum-filter-dto.d.ts +1 -1
- package/lib/commands/generate/generateCrud/generate-payload-object-types.d.ts +2 -2
- package/lib/commands/generate/generateCrud/generate-payload-object-types.js +2 -3
- package/lib/commands/generate/generateCrud/generate-service-hook-call.d.ts +2 -2
- package/lib/commands/generate/generateCrud/generate-service-hook-call.js +8 -7
- package/lib/commands/generate/generateCrudInput/generate-crud-input.d.ts +2 -2
- package/lib/commands/generate/generateCrudInput/generate-crud-input.js +381 -388
- package/lib/commands/generate/generateCrudSingle/generate-crud-single.d.ts +2 -2
- package/lib/commands/generate/generateCrudSingle/generate-crud-single.js +29 -41
- package/lib/commands/generate/generateFiles.js +17 -26
- package/lib/commands/generate/utils/build-name-variants.d.ts +1 -1
- package/lib/commands/generate/utils/find-hooks-service.d.ts +3 -3
- package/lib/commands/generate/utils/find-hooks-service.js +3 -6
- package/lib/commands/generate/utils/ts-morph-helper.d.ts +1 -1
- package/lib/commands/generate/utils/ts-morph-helper.js +23 -19
- package/lib/commands/generate/utils/write-generated-file.js +12 -23
- package/lib/commands/generate/utils/write-generated-files.js +4 -16
- package/lib/commands/generate/watchMode/handleChildProcess.d.ts +1 -1
- package/lib/commands/generate/watchMode/watchMode.js +6 -15
- package/package.json +12 -11
|
@@ -1,28 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.generateCommand = void 0;
|
|
13
4
|
const commander_1 = require("commander");
|
|
14
5
|
const generateFiles_1 = require("./generateFiles");
|
|
15
6
|
const watchMode_1 = require("./watchMode/watchMode");
|
|
16
7
|
exports.generateCommand = new commander_1.Command("generate")
|
|
17
|
-
.action((options) =>
|
|
8
|
+
.action(async (options) => {
|
|
18
9
|
if (options.watch) {
|
|
19
|
-
|
|
10
|
+
await (0, generateFiles_1.generateFiles)();
|
|
20
11
|
console.log("Watching for modified entities...");
|
|
21
|
-
|
|
12
|
+
await (0, watchMode_1.watchMode)();
|
|
22
13
|
}
|
|
23
14
|
else {
|
|
24
15
|
(0, generateFiles_1.generateFiles)(options.file);
|
|
25
16
|
}
|
|
26
|
-
})
|
|
17
|
+
})
|
|
27
18
|
.option("-f, --file <file>", "path to entity file")
|
|
28
19
|
.option("-w, --watch", "Watch for changes");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CrudGeneratorOptions } from "@comet/cms-api";
|
|
2
|
-
import {
|
|
2
|
+
import type { EntityMetadata } from "@mikro-orm/core";
|
|
3
3
|
export declare function buildSortProps(metadata: EntityMetadata<any>): string[];
|
|
4
4
|
export declare function buildOptions(metadata: EntityMetadata<any>, generatorOptions: CrudGeneratorOptions): {
|
|
5
5
|
crudSearchPropNames: import("@comet/cms-api/lib/common/helper/crud-generator.helper").CrudSearchField[];
|
|
@@ -89,7 +89,6 @@ function buildDedicatedResolverArgProps(metadata) {
|
|
|
89
89
|
}
|
|
90
90
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
91
91
|
function buildOptions(metadata, generatorOptions) {
|
|
92
|
-
var _a, _b;
|
|
93
92
|
const { classNameSingular, classNamePlural, fileNameSingular, fileNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
94
93
|
const dedicatedResolverArgProps = buildDedicatedResolverArgProps(metadata);
|
|
95
94
|
const crudSearchPropNames = (0, cms_api_1.getCrudSearchFieldsFromMetadata)(metadata);
|
|
@@ -100,12 +99,13 @@ function buildOptions(metadata, generatorOptions) {
|
|
|
100
99
|
const hasSortArg = crudSortProps.length > 0;
|
|
101
100
|
const hasSlugProp = metadata.props.some((prop) => prop.name == "slug");
|
|
102
101
|
const scopeProp = metadata.props.find((prop) => prop.name == "scope");
|
|
103
|
-
if (scopeProp && !scopeProp.targetMeta)
|
|
102
|
+
if (scopeProp && !scopeProp.targetMeta) {
|
|
104
103
|
throw new Error("Scope prop has no targetMeta");
|
|
104
|
+
}
|
|
105
105
|
const hasDeletedAtProp = metadata.props.some((prop) => prop.name == "deletedAt");
|
|
106
106
|
const hasPositionProp = metadata.props.some((prop) => prop.name == "position");
|
|
107
107
|
const positionGroupPropNames = hasPositionProp
|
|
108
|
-
? (
|
|
108
|
+
? (generatorOptions.position?.groupByFields ?? [
|
|
109
109
|
...(scopeProp ? [scopeProp.name] : []), // if there is a scope prop it's effecting position-group, if not groupByFields should be used
|
|
110
110
|
])
|
|
111
111
|
: [];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type CrudGeneratorOptions } from "@comet/cms-api";
|
|
2
2
|
import { type EntityMetadata } from "@mikro-orm/postgresql";
|
|
3
3
|
import { type Imports } from "../utils/generate-imports-code";
|
|
4
|
-
import {
|
|
4
|
+
import type { GeneratedFile } from "../utils/write-generated-files";
|
|
5
5
|
export declare function generateSortDto({ generatorOptions, metadata }: {
|
|
6
6
|
generatorOptions: CrudGeneratorOptions;
|
|
7
7
|
metadata: EntityMetadata<any>;
|
|
@@ -32,15 +32,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
36
|
exports.generateSortDto = generateSortDto;
|
|
46
37
|
exports.generateInputHandling = generateInputHandling;
|
|
@@ -261,22 +252,22 @@ function generatePaginatedDto({ generatorOptions, metadata }) {
|
|
|
261
252
|
return paginatedOut;
|
|
262
253
|
}
|
|
263
254
|
function generateArgsDto({ generatorOptions, metadata }) {
|
|
264
|
-
var _a;
|
|
265
255
|
const { classNameSingular, fileNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
266
256
|
const { scopeProp, argsClassName, hasSearchArg, hasSortArg, hasFilterArg, dedicatedResolverArgProps, hasPositionProp, crudSortProps, hasPaging, targetDirectory, } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
267
257
|
const imports = [];
|
|
268
258
|
if (scopeProp && scopeProp.targetMeta) {
|
|
269
259
|
imports.push(generateEntityImport(scopeProp.targetMeta, `${targetDirectory}/dto`));
|
|
270
260
|
}
|
|
271
|
-
let defaultSortField =
|
|
261
|
+
let defaultSortField = metadata.props.find((prop) => prop.primary)?.name || "id";
|
|
272
262
|
if (hasPositionProp) {
|
|
273
263
|
defaultSortField = "position";
|
|
274
264
|
}
|
|
275
265
|
else if (metadata.props.some((prop) => prop.name === "createdAt" && prop.type === "Date")) {
|
|
276
266
|
defaultSortField = "createdAt";
|
|
277
267
|
}
|
|
278
|
-
if (!crudSortProps.includes(defaultSortField))
|
|
268
|
+
if (!crudSortProps.includes(defaultSortField)) {
|
|
279
269
|
defaultSortField = null;
|
|
270
|
+
}
|
|
280
271
|
const argsOut = `import { ArgsType, Field, IntersectionType, registerEnumType, ID } from "@nestjs/graphql";
|
|
281
272
|
import { Type } from "class-transformer";
|
|
282
273
|
import { IsOptional, IsString, ValidateNested, IsEnum, IsUUID } from "class-validator";
|
|
@@ -459,8 +450,10 @@ function generateInputHandling(options, metadata, generatorOptions, targetDirect
|
|
|
459
450
|
})
|
|
460
451
|
.map((prop) => {
|
|
461
452
|
const targetMeta = prop.targetMeta;
|
|
462
|
-
if (!targetMeta)
|
|
453
|
+
if (!targetMeta) {
|
|
463
454
|
throw new Error("targetMeta is not set for relation");
|
|
455
|
+
}
|
|
456
|
+
imports.push(generateEntityImport(targetMeta, targetDirectory));
|
|
464
457
|
return {
|
|
465
458
|
name: prop.name,
|
|
466
459
|
singularName: (0, pluralize_1.singular)(prop.name),
|
|
@@ -472,8 +465,9 @@ function generateInputHandling(options, metadata, generatorOptions, targetDirect
|
|
|
472
465
|
.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "input"))
|
|
473
466
|
.map((prop) => {
|
|
474
467
|
const targetMeta = prop.targetMeta;
|
|
475
|
-
if (!targetMeta)
|
|
468
|
+
if (!targetMeta) {
|
|
476
469
|
throw new Error("targetMeta is not set for relation");
|
|
470
|
+
}
|
|
477
471
|
return {
|
|
478
472
|
name: prop.name,
|
|
479
473
|
singularName: (0, pluralize_1.singular)(prop.name),
|
|
@@ -486,8 +480,9 @@ function generateInputHandling(options, metadata, generatorOptions, targetDirect
|
|
|
486
480
|
.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "input"))
|
|
487
481
|
.map((prop) => {
|
|
488
482
|
const targetMeta = prop.targetMeta;
|
|
489
|
-
if (!targetMeta)
|
|
483
|
+
if (!targetMeta) {
|
|
490
484
|
throw new Error("targetMeta is not set for relation");
|
|
485
|
+
}
|
|
491
486
|
return {
|
|
492
487
|
name: prop.name,
|
|
493
488
|
singularName: (0, pluralize_1.singular)(prop.name),
|
|
@@ -607,8 +602,9 @@ function generateNestedEntityResolver({ generatorOptions, metadata }) {
|
|
|
607
602
|
const { skipScopeCheck, targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
608
603
|
const imports = [];
|
|
609
604
|
const { imports: fieldImports, code, hasOutputRelations, needsBlocksTransformer, } = generateRelationsFieldResolver({ generatorOptions, metadata });
|
|
610
|
-
if (!hasOutputRelations)
|
|
605
|
+
if (!hasOutputRelations) {
|
|
611
606
|
return null;
|
|
607
|
+
}
|
|
612
608
|
imports.push(...fieldImports);
|
|
613
609
|
imports.push(generateEntityImport(metadata, targetDirectory));
|
|
614
610
|
return `
|
|
@@ -653,8 +649,9 @@ function generateRelationsFieldResolver({ generatorOptions, metadata }) {
|
|
|
653
649
|
outputRelationOneToOneProps.length > 0;
|
|
654
650
|
const imports = [];
|
|
655
651
|
for (const prop of [...relationManyToOneProps, ...relationOneToManyProps, ...relationManyToManyProps, ...relationOneToOneProps]) {
|
|
656
|
-
if (!prop.targetMeta)
|
|
652
|
+
if (!prop.targetMeta) {
|
|
657
653
|
throw new Error(`Relation ${prop.name} has targetMeta not set`);
|
|
654
|
+
}
|
|
658
655
|
imports.push(generateEntityImport(prop.targetMeta, targetDirectory));
|
|
659
656
|
}
|
|
660
657
|
for (const prop of resolveFieldBlockProps) {
|
|
@@ -717,7 +714,6 @@ function generateRelationsFieldResolver({ generatorOptions, metadata }) {
|
|
|
717
714
|
};
|
|
718
715
|
}
|
|
719
716
|
function generateResolver({ generatorOptions, metadata }) {
|
|
720
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
721
717
|
const { classNameSingular, fileNameSingular, instanceNameSingular, classNamePlural, fileNamePlural, instanceNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
722
718
|
const { scopeProp, skipScopeCheck, argsClassName, argsFileName, hasSlugProp, hasSearchArg, hasSortArg, hasFilterArg, hasPositionProp, positionGroupProps, hasDeletedAtProp, dedicatedResolverArgProps, targetDirectory, hasPaging, hasArgsClass, } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
723
719
|
const imports = [];
|
|
@@ -741,8 +737,8 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
741
737
|
const hooksService = (0, find_hooks_service_1.findHooksService)({ generatorOptions, metadata, targetDirectory });
|
|
742
738
|
if (hooksService) {
|
|
743
739
|
imports.push(...hooksService.imports);
|
|
744
|
-
if (
|
|
745
|
-
|
|
740
|
+
if (hooksService.validateCreateInput?.options?.includes("currentUser") ||
|
|
741
|
+
hooksService.validateUpdateInput?.options?.includes("currentUser")) {
|
|
746
742
|
imports.push({ name: "GetCurrentUser", importPath: "@comet/cms-api" });
|
|
747
743
|
imports.push({ name: "CurrentUser", importPath: "@comet/cms-api" });
|
|
748
744
|
}
|
|
@@ -815,16 +811,23 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
815
811
|
@Query(() => ${hasPaging ? `Paginated${classNamePlural}` : `[${metadata.className}]`})
|
|
816
812
|
${dedicatedResolverArgProps
|
|
817
813
|
.map((dedicatedResolverArgProp) => {
|
|
818
|
-
|
|
819
|
-
return `@AffectedEntity(${(_a = dedicatedResolverArgProp.targetMeta) === null || _a === void 0 ? void 0 : _a.className}, { idArg: "${dedicatedResolverArgProp.name}" })`;
|
|
814
|
+
return `@AffectedEntity(${dedicatedResolverArgProp.targetMeta?.className}, { idArg: "${dedicatedResolverArgProp.name}" })`;
|
|
820
815
|
})
|
|
821
816
|
.join("")}
|
|
822
817
|
async ${instanceNameSingular != instanceNamePlural ? instanceNamePlural : `${instanceNamePlural}List`}(
|
|
823
818
|
${hasArgsClass
|
|
824
|
-
? `@Args() {${Object.entries(
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
819
|
+
? `@Args() {${Object.entries({
|
|
820
|
+
scope: !!scopeProp,
|
|
821
|
+
...dedicatedResolverArgProps.reduce((acc, dedicatedResolverArgProp) => {
|
|
822
|
+
acc[dedicatedResolverArgProp.name] = true;
|
|
823
|
+
return acc;
|
|
824
|
+
}, {}),
|
|
825
|
+
search: hasPaging && !!hasSearchArg,
|
|
826
|
+
filter: hasPaging && !!hasFilterArg,
|
|
827
|
+
sort: hasPaging && !!hasSortArg,
|
|
828
|
+
offset: hasPaging,
|
|
829
|
+
limit: hasPaging,
|
|
830
|
+
})
|
|
828
831
|
.filter(([key, use]) => use)
|
|
829
832
|
.map(([key]) => key)
|
|
830
833
|
.join(", ")}}: ${argsClassName}`
|
|
@@ -863,8 +866,7 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
863
866
|
@Mutation(() => ${payloadObjectTypes.createPayloadType || metadata.className})
|
|
864
867
|
${dedicatedResolverArgProps
|
|
865
868
|
.map((dedicatedResolverArgProp) => {
|
|
866
|
-
|
|
867
|
-
return `@AffectedEntity(${(_a = dedicatedResolverArgProp.targetMeta) === null || _a === void 0 ? void 0 : _a.className}, { idArg: "${dedicatedResolverArgProp.name}" })`;
|
|
869
|
+
return `@AffectedEntity(${dedicatedResolverArgProp.targetMeta?.className}, { idArg: "${dedicatedResolverArgProp.name}" })`;
|
|
868
870
|
})
|
|
869
871
|
.join("")}
|
|
870
872
|
async create${classNameSingular}(
|
|
@@ -873,7 +875,7 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
873
875
|
return `${generateIdArg(dedicatedResolverArgProp.name, metadata)}, `;
|
|
874
876
|
})
|
|
875
877
|
.join("")}@Args("input", { type: () => ${classNameSingular}Input }) input: ${classNameSingular}Input
|
|
876
|
-
${
|
|
878
|
+
${hooksService?.validateCreateInput?.options?.includes("currentUser") ? `, @GetCurrentUser() user: CurrentUser` : ""}
|
|
877
879
|
): Promise<${payloadObjectTypes.createPayloadType || metadata.className}> {
|
|
878
880
|
${(0, generate_service_hook_call_1.generateServiceHookCall)("validateCreateInput", { hooksService, instanceNameSingular, scopeProp, dedicatedResolverArgProps })}
|
|
879
881
|
|
|
@@ -924,7 +926,7 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
924
926
|
async update${classNameSingular}(
|
|
925
927
|
${generateIdArg("id", metadata)},
|
|
926
928
|
@Args("input", { type: () => ${classNameSingular}UpdateInput }) input: ${classNameSingular}UpdateInput
|
|
927
|
-
${
|
|
929
|
+
${hooksService?.validateUpdateInput?.options?.includes("currentUser") ? `, @GetCurrentUser() user: CurrentUser` : ""}
|
|
928
930
|
): Promise<${payloadObjectTypes.updatePayloadType || metadata.className}> {
|
|
929
931
|
const ${instanceNameSingular} = await this.entityManager.findOneOrFail(${metadata.className}, id);
|
|
930
932
|
${(0, generate_service_hook_call_1.generateServiceHookCall)("validateUpdateInput", { hooksService, instanceNameSingular, scopeProp, dedicatedResolverArgProps })}
|
|
@@ -998,85 +1000,89 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
998
1000
|
`;
|
|
999
1001
|
return resolverOut;
|
|
1000
1002
|
}
|
|
1001
|
-
function generateCrud(generatorOptionsParam, metadata) {
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1003
|
+
async function generateCrud(generatorOptionsParam, metadata) {
|
|
1004
|
+
const generatorOptions = {
|
|
1005
|
+
...generatorOptionsParam,
|
|
1006
|
+
create: generatorOptionsParam.create ?? true,
|
|
1007
|
+
update: generatorOptionsParam.update ?? true,
|
|
1008
|
+
delete: generatorOptionsParam.delete ?? true,
|
|
1009
|
+
list: generatorOptionsParam.list ?? true,
|
|
1010
|
+
single: generatorOptionsParam.single ?? true,
|
|
1011
|
+
};
|
|
1012
|
+
if (!generatorOptions.create && !generatorOptions.update && !generatorOptions.delete && !generatorOptions.list && !generatorOptions.single) {
|
|
1013
|
+
throw new Error("At least one of create, update, delete, list or single must be true");
|
|
1014
|
+
}
|
|
1015
|
+
const generatedFiles = [];
|
|
1016
|
+
const { fileNameSingular, fileNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
1017
|
+
const { hasFilterArg, hasSortArg, argsFileName, hasPositionProp, hasPaging, hasArgsClass } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
1018
|
+
async function generateCrudResolver() {
|
|
1019
|
+
if (hasPaging && hasFilterArg) {
|
|
1020
|
+
generatedFiles.push(...generateFilterDto({ generatorOptions, metadata }));
|
|
1007
1021
|
}
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1022
|
+
if (hasPaging && hasSortArg) {
|
|
1023
|
+
generatedFiles.push({
|
|
1024
|
+
name: `dto/${fileNameSingular}.sort.ts`,
|
|
1025
|
+
content: generateSortDto({ generatorOptions, metadata }),
|
|
1026
|
+
type: "sort",
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
if (hasPaging) {
|
|
1030
|
+
generatedFiles.push({
|
|
1031
|
+
name: `dto/paginated-${fileNamePlural}.ts`,
|
|
1032
|
+
content: generatePaginatedDto({ generatorOptions, metadata }),
|
|
1033
|
+
type: "sort",
|
|
1034
|
+
});
|
|
1035
|
+
}
|
|
1036
|
+
if (hasArgsClass) {
|
|
1037
|
+
generatedFiles.push({
|
|
1038
|
+
name: `dto/${argsFileName}.ts`,
|
|
1039
|
+
content: generateArgsDto({ generatorOptions, metadata }),
|
|
1040
|
+
type: "args",
|
|
1041
|
+
});
|
|
1042
|
+
}
|
|
1043
|
+
if (hasPositionProp) {
|
|
1044
|
+
generatedFiles.push({
|
|
1045
|
+
name: `${fileNamePlural}.service.ts`,
|
|
1046
|
+
content: generateService({ generatorOptions, metadata }),
|
|
1047
|
+
type: "service",
|
|
1048
|
+
});
|
|
1049
|
+
}
|
|
1050
|
+
generatedFiles.push({
|
|
1051
|
+
name: `${fileNameSingular}.resolver.ts`,
|
|
1052
|
+
content: generateResolver({ generatorOptions, metadata }),
|
|
1053
|
+
type: "resolver",
|
|
1054
|
+
});
|
|
1055
|
+
metadata.props
|
|
1056
|
+
.filter((prop) => {
|
|
1057
|
+
if (prop.kind === "1:m" && prop.orphanRemoval) {
|
|
1058
|
+
if (!prop.targetMeta) {
|
|
1059
|
+
throw new Error(`Target metadata not set`);
|
|
1036
1060
|
}
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
type: "service",
|
|
1042
|
-
});
|
|
1061
|
+
const hasOwnCrudGenerator = Reflect.getMetadata(cms_api_1.CRUD_GENERATOR_METADATA_KEY, prop.targetMeta.class);
|
|
1062
|
+
if (!hasOwnCrudGenerator) {
|
|
1063
|
+
//generate nested resolver only if target entity has no own crud generator
|
|
1064
|
+
return true;
|
|
1043
1065
|
}
|
|
1066
|
+
}
|
|
1067
|
+
})
|
|
1068
|
+
.forEach((prop) => {
|
|
1069
|
+
if (!prop.targetMeta) {
|
|
1070
|
+
throw new Error(`Target metadata not set`);
|
|
1071
|
+
}
|
|
1072
|
+
const { fileNameSingular } = (0, build_name_variants_1.buildNameVariants)(prop.targetMeta);
|
|
1073
|
+
const content = generateNestedEntityResolver({ generatorOptions, metadata: prop.targetMeta });
|
|
1074
|
+
//can be null if no relations exist
|
|
1075
|
+
if (content) {
|
|
1044
1076
|
generatedFiles.push({
|
|
1045
1077
|
name: `${fileNameSingular}.resolver.ts`,
|
|
1046
|
-
content
|
|
1078
|
+
content,
|
|
1047
1079
|
type: "resolver",
|
|
1048
1080
|
});
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
//generate nested resolver only if target entity has no own crud generator
|
|
1057
|
-
return true;
|
|
1058
|
-
}
|
|
1059
|
-
}
|
|
1060
|
-
})
|
|
1061
|
-
.forEach((prop) => {
|
|
1062
|
-
if (!prop.targetMeta)
|
|
1063
|
-
throw new Error(`Target metadata not set`);
|
|
1064
|
-
const { fileNameSingular } = (0, build_name_variants_1.buildNameVariants)(prop.targetMeta);
|
|
1065
|
-
const content = generateNestedEntityResolver({ generatorOptions, metadata: prop.targetMeta });
|
|
1066
|
-
//can be null if no relations exist
|
|
1067
|
-
if (content) {
|
|
1068
|
-
generatedFiles.push({
|
|
1069
|
-
name: `${fileNameSingular}.resolver.ts`,
|
|
1070
|
-
content,
|
|
1071
|
-
type: "resolver",
|
|
1072
|
-
});
|
|
1073
|
-
}
|
|
1074
|
-
});
|
|
1075
|
-
return generatedFiles;
|
|
1076
|
-
});
|
|
1077
|
-
}
|
|
1078
|
-
const crudInput = yield (0, generate_crud_input_1.generateCrudInput)(generatorOptions, metadata);
|
|
1079
|
-
const crudResolver = yield generateCrudResolver();
|
|
1080
|
-
return [...crudInput, ...crudResolver];
|
|
1081
|
-
});
|
|
1081
|
+
}
|
|
1082
|
+
});
|
|
1083
|
+
return generatedFiles;
|
|
1084
|
+
}
|
|
1085
|
+
const crudInput = await (0, generate_crud_input_1.generateCrudInput)(generatorOptions, metadata);
|
|
1086
|
+
const crudResolver = await generateCrudResolver();
|
|
1087
|
+
return [...crudInput, ...crudResolver];
|
|
1082
1088
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { GeneratedFile } from "../utils/write-generated-files";
|
|
2
2
|
export declare function generateEnumFilterDto(type: "enum" | "enums", enumName: string, enumPath: string): GeneratedFile;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { findHooksService } from "../utils/find-hooks-service";
|
|
2
|
+
import type { Imports } from "../utils/generate-imports-code";
|
|
3
3
|
export declare function generatePayloadObjectTypes({ hooksService, instanceNameSingular, entityName, }: {
|
|
4
4
|
hooksService: ReturnType<typeof findHooksService>;
|
|
5
5
|
instanceNameSingular: string;
|
|
@@ -2,19 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generatePayloadObjectTypes = generatePayloadObjectTypes;
|
|
4
4
|
function generatePayloadObjectTypes({ hooksService, instanceNameSingular, entityName, }) {
|
|
5
|
-
var _a, _b;
|
|
6
5
|
const ret = {
|
|
7
6
|
createPayloadType: null,
|
|
8
7
|
updatePayloadType: null,
|
|
9
8
|
code: "",
|
|
10
9
|
imports: [],
|
|
11
10
|
};
|
|
12
|
-
const createReturnType =
|
|
11
|
+
const createReturnType = hooksService?.validateCreateInput?.returnType;
|
|
13
12
|
if (createReturnType) {
|
|
14
13
|
ret.createPayloadType = `Create${entityName}Payload`;
|
|
15
14
|
ret.code += generate({ className: ret.createPayloadType, returnType: createReturnType, instanceNameSingular, entityName });
|
|
16
15
|
}
|
|
17
|
-
const updateReturnType =
|
|
16
|
+
const updateReturnType = hooksService?.validateUpdateInput?.returnType;
|
|
18
17
|
if (updateReturnType) {
|
|
19
18
|
ret.updatePayloadType = `Update${entityName}Payload`;
|
|
20
19
|
ret.code += generate({ className: ret.updatePayloadType, returnType: updateReturnType, instanceNameSingular, entityName });
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { EntityProperty } from "@mikro-orm/core";
|
|
2
|
+
import type { findHooksService } from "../utils/find-hooks-service";
|
|
3
3
|
export declare function generateServiceHookCall(type: "validateCreateInput" | "validateUpdateInput", { hooksService, instanceNameSingular, dedicatedResolverArgProps, scopeProp, }: {
|
|
4
4
|
hooksService: ReturnType<typeof findHooksService>;
|
|
5
5
|
instanceNameSingular: string;
|
|
@@ -2,23 +2,24 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateServiceHookCall = generateServiceHookCall;
|
|
4
4
|
function generateServiceHookCall(type, { hooksService, instanceNameSingular, dedicatedResolverArgProps, scopeProp, }) {
|
|
5
|
-
|
|
6
|
-
if (!hooksService)
|
|
5
|
+
if (!hooksService) {
|
|
7
6
|
return "";
|
|
7
|
+
}
|
|
8
8
|
const hook = type === "validateCreateInput" ? hooksService.validateCreateInput : hooksService.validateUpdateInput;
|
|
9
|
-
if (!hook)
|
|
9
|
+
if (!hook) {
|
|
10
10
|
return "";
|
|
11
|
+
}
|
|
11
12
|
const options = [];
|
|
12
|
-
if (
|
|
13
|
+
if (hook.options?.includes("currentUser")) {
|
|
13
14
|
options.push("currentUser: user");
|
|
14
15
|
}
|
|
15
|
-
if (
|
|
16
|
+
if (hook.options?.includes("scope")) {
|
|
16
17
|
if (!scopeProp) {
|
|
17
18
|
throw new Error(`${type} hook expects scope, but no scopeProp found`);
|
|
18
19
|
}
|
|
19
20
|
options.push("scope");
|
|
20
21
|
}
|
|
21
|
-
if (
|
|
22
|
+
if (hook.options?.includes("args")) {
|
|
22
23
|
if (type === "validateUpdateInput") {
|
|
23
24
|
throw new Error("validateUpdateInput hook cannot have args option, as args are only available during creation");
|
|
24
25
|
}
|
|
@@ -30,7 +31,7 @@ function generateServiceHookCall(type, { hooksService, instanceNameSingular, ded
|
|
|
30
31
|
});
|
|
31
32
|
options.push(`args: { ${argsCode.join(", ")} }`);
|
|
32
33
|
}
|
|
33
|
-
if (
|
|
34
|
+
if (hook.options?.includes("entity")) {
|
|
34
35
|
if (type === "validateCreateInput") {
|
|
35
36
|
throw new Error("validateCreateInput hook cannot have entity option");
|
|
36
37
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Permission } from "@comet/cms-api";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import type { EntityMetadata } from "@mikro-orm/postgresql";
|
|
3
|
+
import type { GeneratedFile } from "../utils/write-generated-files";
|
|
4
4
|
export declare function generateCrudInput(generatorOptions: {
|
|
5
5
|
requiredPermission: Permission | Permission[];
|
|
6
6
|
}, metadata: EntityMetadata<any>, options?: {
|