@comet/api-generator 9.0.0-beta.2 → 9.0.0-beta.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.
- 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 +109 -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 +8 -8
|
@@ -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,9 @@ 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
|
+
}
|
|
464
456
|
return {
|
|
465
457
|
name: prop.name,
|
|
466
458
|
singularName: (0, pluralize_1.singular)(prop.name),
|
|
@@ -472,8 +464,9 @@ function generateInputHandling(options, metadata, generatorOptions, targetDirect
|
|
|
472
464
|
.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "input"))
|
|
473
465
|
.map((prop) => {
|
|
474
466
|
const targetMeta = prop.targetMeta;
|
|
475
|
-
if (!targetMeta)
|
|
467
|
+
if (!targetMeta) {
|
|
476
468
|
throw new Error("targetMeta is not set for relation");
|
|
469
|
+
}
|
|
477
470
|
return {
|
|
478
471
|
name: prop.name,
|
|
479
472
|
singularName: (0, pluralize_1.singular)(prop.name),
|
|
@@ -486,8 +479,9 @@ function generateInputHandling(options, metadata, generatorOptions, targetDirect
|
|
|
486
479
|
.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "input"))
|
|
487
480
|
.map((prop) => {
|
|
488
481
|
const targetMeta = prop.targetMeta;
|
|
489
|
-
if (!targetMeta)
|
|
482
|
+
if (!targetMeta) {
|
|
490
483
|
throw new Error("targetMeta is not set for relation");
|
|
484
|
+
}
|
|
491
485
|
return {
|
|
492
486
|
name: prop.name,
|
|
493
487
|
singularName: (0, pluralize_1.singular)(prop.name),
|
|
@@ -607,8 +601,9 @@ function generateNestedEntityResolver({ generatorOptions, metadata }) {
|
|
|
607
601
|
const { skipScopeCheck, targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
608
602
|
const imports = [];
|
|
609
603
|
const { imports: fieldImports, code, hasOutputRelations, needsBlocksTransformer, } = generateRelationsFieldResolver({ generatorOptions, metadata });
|
|
610
|
-
if (!hasOutputRelations)
|
|
604
|
+
if (!hasOutputRelations) {
|
|
611
605
|
return null;
|
|
606
|
+
}
|
|
612
607
|
imports.push(...fieldImports);
|
|
613
608
|
imports.push(generateEntityImport(metadata, targetDirectory));
|
|
614
609
|
return `
|
|
@@ -653,8 +648,9 @@ function generateRelationsFieldResolver({ generatorOptions, metadata }) {
|
|
|
653
648
|
outputRelationOneToOneProps.length > 0;
|
|
654
649
|
const imports = [];
|
|
655
650
|
for (const prop of [...relationManyToOneProps, ...relationOneToManyProps, ...relationManyToManyProps, ...relationOneToOneProps]) {
|
|
656
|
-
if (!prop.targetMeta)
|
|
651
|
+
if (!prop.targetMeta) {
|
|
657
652
|
throw new Error(`Relation ${prop.name} has targetMeta not set`);
|
|
653
|
+
}
|
|
658
654
|
imports.push(generateEntityImport(prop.targetMeta, targetDirectory));
|
|
659
655
|
}
|
|
660
656
|
for (const prop of resolveFieldBlockProps) {
|
|
@@ -717,7 +713,6 @@ function generateRelationsFieldResolver({ generatorOptions, metadata }) {
|
|
|
717
713
|
};
|
|
718
714
|
}
|
|
719
715
|
function generateResolver({ generatorOptions, metadata }) {
|
|
720
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
721
716
|
const { classNameSingular, fileNameSingular, instanceNameSingular, classNamePlural, fileNamePlural, instanceNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
722
717
|
const { scopeProp, skipScopeCheck, argsClassName, argsFileName, hasSlugProp, hasSearchArg, hasSortArg, hasFilterArg, hasPositionProp, positionGroupProps, hasDeletedAtProp, dedicatedResolverArgProps, targetDirectory, hasPaging, hasArgsClass, } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
723
718
|
const imports = [];
|
|
@@ -741,8 +736,8 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
741
736
|
const hooksService = (0, find_hooks_service_1.findHooksService)({ generatorOptions, metadata, targetDirectory });
|
|
742
737
|
if (hooksService) {
|
|
743
738
|
imports.push(...hooksService.imports);
|
|
744
|
-
if (
|
|
745
|
-
|
|
739
|
+
if (hooksService.validateCreateInput?.options?.includes("currentUser") ||
|
|
740
|
+
hooksService.validateUpdateInput?.options?.includes("currentUser")) {
|
|
746
741
|
imports.push({ name: "GetCurrentUser", importPath: "@comet/cms-api" });
|
|
747
742
|
imports.push({ name: "CurrentUser", importPath: "@comet/cms-api" });
|
|
748
743
|
}
|
|
@@ -815,16 +810,23 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
815
810
|
@Query(() => ${hasPaging ? `Paginated${classNamePlural}` : `[${metadata.className}]`})
|
|
816
811
|
${dedicatedResolverArgProps
|
|
817
812
|
.map((dedicatedResolverArgProp) => {
|
|
818
|
-
|
|
819
|
-
return `@AffectedEntity(${(_a = dedicatedResolverArgProp.targetMeta) === null || _a === void 0 ? void 0 : _a.className}, { idArg: "${dedicatedResolverArgProp.name}" })`;
|
|
813
|
+
return `@AffectedEntity(${dedicatedResolverArgProp.targetMeta?.className}, { idArg: "${dedicatedResolverArgProp.name}" })`;
|
|
820
814
|
})
|
|
821
815
|
.join("")}
|
|
822
816
|
async ${instanceNameSingular != instanceNamePlural ? instanceNamePlural : `${instanceNamePlural}List`}(
|
|
823
817
|
${hasArgsClass
|
|
824
|
-
? `@Args() {${Object.entries(
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
818
|
+
? `@Args() {${Object.entries({
|
|
819
|
+
scope: !!scopeProp,
|
|
820
|
+
...dedicatedResolverArgProps.reduce((acc, dedicatedResolverArgProp) => {
|
|
821
|
+
acc[dedicatedResolverArgProp.name] = true;
|
|
822
|
+
return acc;
|
|
823
|
+
}, {}),
|
|
824
|
+
search: hasPaging && !!hasSearchArg,
|
|
825
|
+
filter: hasPaging && !!hasFilterArg,
|
|
826
|
+
sort: hasPaging && !!hasSortArg,
|
|
827
|
+
offset: hasPaging,
|
|
828
|
+
limit: hasPaging,
|
|
829
|
+
})
|
|
828
830
|
.filter(([key, use]) => use)
|
|
829
831
|
.map(([key]) => key)
|
|
830
832
|
.join(", ")}}: ${argsClassName}`
|
|
@@ -863,8 +865,7 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
863
865
|
@Mutation(() => ${payloadObjectTypes.createPayloadType || metadata.className})
|
|
864
866
|
${dedicatedResolverArgProps
|
|
865
867
|
.map((dedicatedResolverArgProp) => {
|
|
866
|
-
|
|
867
|
-
return `@AffectedEntity(${(_a = dedicatedResolverArgProp.targetMeta) === null || _a === void 0 ? void 0 : _a.className}, { idArg: "${dedicatedResolverArgProp.name}" })`;
|
|
868
|
+
return `@AffectedEntity(${dedicatedResolverArgProp.targetMeta?.className}, { idArg: "${dedicatedResolverArgProp.name}" })`;
|
|
868
869
|
})
|
|
869
870
|
.join("")}
|
|
870
871
|
async create${classNameSingular}(
|
|
@@ -873,7 +874,7 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
873
874
|
return `${generateIdArg(dedicatedResolverArgProp.name, metadata)}, `;
|
|
874
875
|
})
|
|
875
876
|
.join("")}@Args("input", { type: () => ${classNameSingular}Input }) input: ${classNameSingular}Input
|
|
876
|
-
${
|
|
877
|
+
${hooksService?.validateCreateInput?.options?.includes("currentUser") ? `, @GetCurrentUser() user: CurrentUser` : ""}
|
|
877
878
|
): Promise<${payloadObjectTypes.createPayloadType || metadata.className}> {
|
|
878
879
|
${(0, generate_service_hook_call_1.generateServiceHookCall)("validateCreateInput", { hooksService, instanceNameSingular, scopeProp, dedicatedResolverArgProps })}
|
|
879
880
|
|
|
@@ -924,7 +925,7 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
924
925
|
async update${classNameSingular}(
|
|
925
926
|
${generateIdArg("id", metadata)},
|
|
926
927
|
@Args("input", { type: () => ${classNameSingular}UpdateInput }) input: ${classNameSingular}UpdateInput
|
|
927
|
-
${
|
|
928
|
+
${hooksService?.validateUpdateInput?.options?.includes("currentUser") ? `, @GetCurrentUser() user: CurrentUser` : ""}
|
|
928
929
|
): Promise<${payloadObjectTypes.updatePayloadType || metadata.className}> {
|
|
929
930
|
const ${instanceNameSingular} = await this.entityManager.findOneOrFail(${metadata.className}, id);
|
|
930
931
|
${(0, generate_service_hook_call_1.generateServiceHookCall)("validateUpdateInput", { hooksService, instanceNameSingular, scopeProp, dedicatedResolverArgProps })}
|
|
@@ -998,85 +999,89 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
998
999
|
`;
|
|
999
1000
|
return resolverOut;
|
|
1000
1001
|
}
|
|
1001
|
-
function generateCrud(generatorOptionsParam, metadata) {
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1002
|
+
async function generateCrud(generatorOptionsParam, metadata) {
|
|
1003
|
+
const generatorOptions = {
|
|
1004
|
+
...generatorOptionsParam,
|
|
1005
|
+
create: generatorOptionsParam.create ?? true,
|
|
1006
|
+
update: generatorOptionsParam.update ?? true,
|
|
1007
|
+
delete: generatorOptionsParam.delete ?? true,
|
|
1008
|
+
list: generatorOptionsParam.list ?? true,
|
|
1009
|
+
single: generatorOptionsParam.single ?? true,
|
|
1010
|
+
};
|
|
1011
|
+
if (!generatorOptions.create && !generatorOptions.update && !generatorOptions.delete && !generatorOptions.list && !generatorOptions.single) {
|
|
1012
|
+
throw new Error("At least one of create, update, delete, list or single must be true");
|
|
1013
|
+
}
|
|
1014
|
+
const generatedFiles = [];
|
|
1015
|
+
const { fileNameSingular, fileNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
1016
|
+
const { hasFilterArg, hasSortArg, argsFileName, hasPositionProp, hasPaging, hasArgsClass } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
1017
|
+
async function generateCrudResolver() {
|
|
1018
|
+
if (hasPaging && hasFilterArg) {
|
|
1019
|
+
generatedFiles.push(...generateFilterDto({ generatorOptions, metadata }));
|
|
1007
1020
|
}
|
|
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
|
-
|
|
1021
|
+
if (hasPaging && hasSortArg) {
|
|
1022
|
+
generatedFiles.push({
|
|
1023
|
+
name: `dto/${fileNameSingular}.sort.ts`,
|
|
1024
|
+
content: generateSortDto({ generatorOptions, metadata }),
|
|
1025
|
+
type: "sort",
|
|
1026
|
+
});
|
|
1027
|
+
}
|
|
1028
|
+
if (hasPaging) {
|
|
1029
|
+
generatedFiles.push({
|
|
1030
|
+
name: `dto/paginated-${fileNamePlural}.ts`,
|
|
1031
|
+
content: generatePaginatedDto({ generatorOptions, metadata }),
|
|
1032
|
+
type: "sort",
|
|
1033
|
+
});
|
|
1034
|
+
}
|
|
1035
|
+
if (hasArgsClass) {
|
|
1036
|
+
generatedFiles.push({
|
|
1037
|
+
name: `dto/${argsFileName}.ts`,
|
|
1038
|
+
content: generateArgsDto({ generatorOptions, metadata }),
|
|
1039
|
+
type: "args",
|
|
1040
|
+
});
|
|
1041
|
+
}
|
|
1042
|
+
if (hasPositionProp) {
|
|
1043
|
+
generatedFiles.push({
|
|
1044
|
+
name: `${fileNamePlural}.service.ts`,
|
|
1045
|
+
content: generateService({ generatorOptions, metadata }),
|
|
1046
|
+
type: "service",
|
|
1047
|
+
});
|
|
1048
|
+
}
|
|
1049
|
+
generatedFiles.push({
|
|
1050
|
+
name: `${fileNameSingular}.resolver.ts`,
|
|
1051
|
+
content: generateResolver({ generatorOptions, metadata }),
|
|
1052
|
+
type: "resolver",
|
|
1053
|
+
});
|
|
1054
|
+
metadata.props
|
|
1055
|
+
.filter((prop) => {
|
|
1056
|
+
if (prop.kind === "1:m" && prop.orphanRemoval) {
|
|
1057
|
+
if (!prop.targetMeta) {
|
|
1058
|
+
throw new Error(`Target metadata not set`);
|
|
1036
1059
|
}
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
type: "service",
|
|
1042
|
-
});
|
|
1060
|
+
const hasOwnCrudGenerator = Reflect.getMetadata(cms_api_1.CRUD_GENERATOR_METADATA_KEY, prop.targetMeta.class);
|
|
1061
|
+
if (!hasOwnCrudGenerator) {
|
|
1062
|
+
//generate nested resolver only if target entity has no own crud generator
|
|
1063
|
+
return true;
|
|
1043
1064
|
}
|
|
1065
|
+
}
|
|
1066
|
+
})
|
|
1067
|
+
.forEach((prop) => {
|
|
1068
|
+
if (!prop.targetMeta) {
|
|
1069
|
+
throw new Error(`Target metadata not set`);
|
|
1070
|
+
}
|
|
1071
|
+
const { fileNameSingular } = (0, build_name_variants_1.buildNameVariants)(prop.targetMeta);
|
|
1072
|
+
const content = generateNestedEntityResolver({ generatorOptions, metadata: prop.targetMeta });
|
|
1073
|
+
//can be null if no relations exist
|
|
1074
|
+
if (content) {
|
|
1044
1075
|
generatedFiles.push({
|
|
1045
1076
|
name: `${fileNameSingular}.resolver.ts`,
|
|
1046
|
-
content
|
|
1077
|
+
content,
|
|
1047
1078
|
type: "resolver",
|
|
1048
1079
|
});
|
|
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
|
-
});
|
|
1080
|
+
}
|
|
1081
|
+
});
|
|
1082
|
+
return generatedFiles;
|
|
1083
|
+
}
|
|
1084
|
+
const crudInput = await (0, generate_crud_input_1.generateCrudInput)(generatorOptions, metadata);
|
|
1085
|
+
const crudResolver = await generateCrudResolver();
|
|
1086
|
+
return [...crudInput, ...crudResolver];
|
|
1082
1087
|
}
|
|
@@ -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?: {
|