@comet/api-generator 8.17.1 → 9.0.0-beta.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/lib/commands/generate/generateCrud/build-options.d.ts +1 -0
- package/lib/commands/generate/generateCrud/build-options.js +3 -0
- package/lib/commands/generate/generateCrud/generate-crud.d.ts +1 -1
- package/lib/commands/generate/generateCrud/generate-crud.js +46 -82
- package/lib/commands/generate/generateCrud/generate-enum-filter-dto.d.ts +2 -0
- package/lib/commands/generate/generateCrud/generate-enum-filter-dto.js +76 -0
- package/lib/commands/generate/generateCrudInput/generate-crud-input.d.ts +0 -1
- package/lib/commands/generate/generateCrudInput/generate-crud-input.js +10 -10
- package/lib/commands/generate/generateCrudSingle/generate-crud-single.js +5 -5
- package/lib/commands/generate/generateFiles.js +7 -4
- package/lib/commands/generate/utils/find-hooks-service.d.ts +5 -10
- package/lib/commands/generate/utils/find-hooks-service.js +4 -5
- package/lib/commands/generate/utils/ts-morph-helper.d.ts +1 -3
- package/lib/commands/generate/utils/ts-morph-helper.js +3 -3
- package/lib/commands/generate/utils/write-generated-files.d.ts +3 -4
- package/lib/commands/generate/utils/write-generated-files.js +3 -2
- package/package.json +3 -3
|
@@ -20,4 +20,5 @@ export declare function buildOptions(metadata: EntityMetadata<any>, generatorOpt
|
|
|
20
20
|
hasArgsClass: boolean;
|
|
21
21
|
blockProps: import("@mikro-orm/core").EntityProperty<any, any>[];
|
|
22
22
|
dedicatedResolverArgProps: import("@mikro-orm/core").EntityProperty<any, any>[];
|
|
23
|
+
targetDirectory: string;
|
|
23
24
|
};
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildSortProps = buildSortProps;
|
|
4
4
|
exports.buildOptions = buildOptions;
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
5
6
|
const cms_api_1 = require("@comet/cms-api");
|
|
6
7
|
const build_name_variants_1 = require("../utils/build-name-variants");
|
|
7
8
|
const constants_1 = require("../utils/constants");
|
|
@@ -118,6 +119,7 @@ function buildOptions(metadata, generatorOptions) {
|
|
|
118
119
|
const blockProps = metadata.props.filter((prop) => {
|
|
119
120
|
return (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "input") && prop.type === "RootBlockType";
|
|
120
121
|
});
|
|
122
|
+
const targetDirectory = `${(0, node_path_1.dirname)(metadata.path).replace(/\/entities$/, "")}/generated`;
|
|
121
123
|
return {
|
|
122
124
|
crudSearchPropNames,
|
|
123
125
|
hasSearchArg,
|
|
@@ -137,5 +139,6 @@ function buildOptions(metadata, generatorOptions) {
|
|
|
137
139
|
hasArgsClass,
|
|
138
140
|
blockProps,
|
|
139
141
|
dedicatedResolverArgProps,
|
|
142
|
+
targetDirectory,
|
|
140
143
|
};
|
|
141
144
|
}
|
|
@@ -11,7 +11,7 @@ export declare function generateInputHandling(options: {
|
|
|
11
11
|
inputName: string;
|
|
12
12
|
assignEntityCode: string;
|
|
13
13
|
excludeFields?: string[];
|
|
14
|
-
}, metadata: EntityMetadata<any>, generatorOptions: CrudGeneratorOptions): {
|
|
14
|
+
}, metadata: EntityMetadata<any>, generatorOptions: CrudGeneratorOptions, targetDirectory: string): {
|
|
15
15
|
code: string;
|
|
16
16
|
imports: Imports;
|
|
17
17
|
};
|
|
@@ -57,49 +57,32 @@ const find_hooks_service_1 = require("../utils/find-hooks-service");
|
|
|
57
57
|
const generate_imports_code_1 = require("../utils/generate-imports-code");
|
|
58
58
|
const ts_morph_helper_1 = require("../utils/ts-morph-helper");
|
|
59
59
|
const build_options_1 = require("./build-options");
|
|
60
|
+
const generate_enum_filter_dto_1 = require("./generate-enum-filter-dto");
|
|
60
61
|
const generate_payload_object_types_1 = require("./generate-payload-object-types");
|
|
61
62
|
const generate_service_hook_call_1 = require("./generate-service-hook-call");
|
|
62
|
-
function generateFilterDto({ generatorOptions, metadata }) {
|
|
63
|
-
const { classNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
64
|
-
const { crudFilterProps } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
63
|
+
function generateFilterDto({ generatorOptions, metadata, }) {
|
|
64
|
+
const { classNameSingular, fileNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
65
|
+
const { crudFilterProps, targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
66
|
+
const generatedFiles = [];
|
|
65
67
|
const imports = [];
|
|
66
68
|
imports.push({ name: "IsOptional", importPath: "class-validator" });
|
|
67
69
|
imports.push({ name: "ValidateNested", importPath: "class-validator" });
|
|
68
70
|
imports.push({ name: "Type", importPath: "class-transformer" });
|
|
69
71
|
imports.push({ name: "Field", importPath: "@nestjs/graphql" });
|
|
70
72
|
imports.push({ name: "InputType", importPath: "@nestjs/graphql" });
|
|
71
|
-
let enumFiltersOut = "";
|
|
72
|
-
const generatedEnumNames = new Set();
|
|
73
|
-
const generatedEnumsNames = new Set();
|
|
74
73
|
crudFilterProps.map((prop) => {
|
|
75
|
-
if (prop.type == "EnumArrayType") {
|
|
76
|
-
imports.push({ name: "createEnumsFilter", importPath: "@comet/cms-api" });
|
|
77
|
-
const enumName = (0, ts_morph_helper_1.findEnumName)(prop.name, metadata);
|
|
78
|
-
const importPath = (0, ts_morph_helper_1.findEnumImportPath)(enumName, `${generatorOptions.targetDirectory}/dto`, metadata);
|
|
79
|
-
if (!generatedEnumNames.has(enumName)) {
|
|
80
|
-
generatedEnumNames.add(enumName);
|
|
81
|
-
enumFiltersOut += `@InputType()
|
|
82
|
-
class ${enumName}EnumsFilter extends createEnumsFilter(${enumName}) {}
|
|
83
|
-
`;
|
|
84
|
-
imports.push({ name: enumName, importPath });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
else if (prop.enum) {
|
|
88
|
-
imports.push({ name: "createEnumFilter", importPath: "@comet/cms-api" });
|
|
74
|
+
if (prop.type == "EnumArrayType" || prop.enum) {
|
|
89
75
|
const enumName = (0, ts_morph_helper_1.findEnumName)(prop.name, metadata);
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
76
|
+
const enumImportPath = (0, ts_morph_helper_1.findEnumImportPath)(enumName, targetDirectory, metadata);
|
|
77
|
+
const enumFilter = (0, generate_enum_filter_dto_1.generateEnumFilterDto)(prop.type == "EnumArrayType" ? "enums" : "enum", enumName, `${targetDirectory}/${enumImportPath}`);
|
|
78
|
+
generatedFiles.push(enumFilter);
|
|
79
|
+
imports.push({
|
|
80
|
+
name: `${enumName}${prop.type == "EnumArrayType" ? "EnumsFilter" : "EnumFilter"}`,
|
|
81
|
+
importPath: `./${path.relative(`${targetDirectory}/dto`, `${enumFilter.targetDirectory}/${enumFilter.name.replace(/\.ts$/, "")}`)}`,
|
|
82
|
+
});
|
|
98
83
|
}
|
|
99
84
|
});
|
|
100
85
|
const filterOut = `
|
|
101
|
-
${enumFiltersOut}
|
|
102
|
-
|
|
103
86
|
@InputType()
|
|
104
87
|
export class ${classNameSingular}Filter {
|
|
105
88
|
${crudFilterProps
|
|
@@ -225,7 +208,12 @@ function generateFilterDto({ generatorOptions, metadata }) {
|
|
|
225
208
|
or?: ${classNameSingular}Filter[];
|
|
226
209
|
}
|
|
227
210
|
`;
|
|
228
|
-
|
|
211
|
+
generatedFiles.push({
|
|
212
|
+
name: `dto/${fileNameSingular}.filter.ts`,
|
|
213
|
+
content: (0, generate_imports_code_1.generateImportsCode)(imports) + filterOut,
|
|
214
|
+
type: "filter",
|
|
215
|
+
});
|
|
216
|
+
return generatedFiles;
|
|
229
217
|
}
|
|
230
218
|
function generateSortDto({ generatorOptions, metadata }) {
|
|
231
219
|
const { classNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
@@ -261,10 +249,11 @@ function generateSortDto({ generatorOptions, metadata }) {
|
|
|
261
249
|
}
|
|
262
250
|
function generatePaginatedDto({ generatorOptions, metadata }) {
|
|
263
251
|
const { classNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
252
|
+
const { targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
264
253
|
const paginatedOut = `import { ObjectType } from "@nestjs/graphql";
|
|
265
254
|
import { PaginatedResponseFactory } from "@comet/cms-api";
|
|
266
255
|
|
|
267
|
-
import { ${metadata.className} } from "${path.relative(`${
|
|
256
|
+
import { ${metadata.className} } from "${path.relative(`${targetDirectory}/dto`, metadata.path).replace(/\.ts$/, "")}";
|
|
268
257
|
|
|
269
258
|
@ObjectType()
|
|
270
259
|
export class Paginated${classNamePlural} extends PaginatedResponseFactory.create(${metadata.className}) {}
|
|
@@ -274,10 +263,10 @@ function generatePaginatedDto({ generatorOptions, metadata }) {
|
|
|
274
263
|
function generateArgsDto({ generatorOptions, metadata }) {
|
|
275
264
|
var _a;
|
|
276
265
|
const { classNameSingular, fileNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
277
|
-
const { scopeProp, argsClassName, hasSearchArg, hasSortArg, hasFilterArg, dedicatedResolverArgProps, hasPositionProp, crudSortProps, hasPaging } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
266
|
+
const { scopeProp, argsClassName, hasSearchArg, hasSortArg, hasFilterArg, dedicatedResolverArgProps, hasPositionProp, crudSortProps, hasPaging, targetDirectory, } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
278
267
|
const imports = [];
|
|
279
268
|
if (scopeProp && scopeProp.targetMeta) {
|
|
280
|
-
imports.push(generateEntityImport(scopeProp.targetMeta, `${
|
|
269
|
+
imports.push(generateEntityImport(scopeProp.targetMeta, `${targetDirectory}/dto`));
|
|
281
270
|
}
|
|
282
271
|
let defaultSortField = ((_a = metadata.props.find((prop) => prop.primary)) === null || _a === void 0 ? void 0 : _a.name) || "id";
|
|
283
272
|
if (hasPositionProp) {
|
|
@@ -358,7 +347,7 @@ function generateArgsDto({ generatorOptions, metadata }) {
|
|
|
358
347
|
}
|
|
359
348
|
function generateService({ generatorOptions, metadata }) {
|
|
360
349
|
const { classNameSingular, fileNameSingular, classNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
361
|
-
const { hasPositionProp, positionGroupProps } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
350
|
+
const { hasPositionProp, positionGroupProps, targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
362
351
|
const positionGroupType = positionGroupProps.length
|
|
363
352
|
? `{ ${positionGroupProps
|
|
364
353
|
.map((prop) => {
|
|
@@ -373,10 +362,10 @@ function generateService({ generatorOptions, metadata }) {
|
|
|
373
362
|
const serviceOut = `import { EntityManager, FilterQuery, raw } from "@mikro-orm/postgresql";
|
|
374
363
|
import { Injectable } from "@nestjs/common";
|
|
375
364
|
|
|
376
|
-
${(0, generate_imports_code_1.generateImportsCode)([generateEntityImport(metadata,
|
|
365
|
+
${(0, generate_imports_code_1.generateImportsCode)([generateEntityImport(metadata, targetDirectory)])}
|
|
377
366
|
${(0, generate_imports_code_1.generateImportsCode)(positionGroupProps.reduce((acc, prop) => {
|
|
378
367
|
if (prop.targetMeta) {
|
|
379
|
-
acc.push(generateEntityImport(prop.targetMeta,
|
|
368
|
+
acc.push(generateEntityImport(prop.targetMeta, targetDirectory));
|
|
380
369
|
}
|
|
381
370
|
return acc;
|
|
382
371
|
}, []))}
|
|
@@ -453,7 +442,7 @@ function generateEntityImport(targetMetadata, relativeTo) {
|
|
|
453
442
|
importPath: path.relative(relativeTo, targetMetadata.path).replace(/\.ts$/, ""),
|
|
454
443
|
};
|
|
455
444
|
}
|
|
456
|
-
function generateInputHandling(options, metadata, generatorOptions) {
|
|
445
|
+
function generateInputHandling(options, metadata, generatorOptions, targetDirectory) {
|
|
457
446
|
const { instanceNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
458
447
|
const { blockProps, scopeProp, hasPositionProp, dedicatedResolverArgProps } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
459
448
|
const imports = [];
|
|
@@ -535,7 +524,7 @@ function generateInputHandling(options, metadata, generatorOptions) {
|
|
|
535
524
|
${inputRelationToManyProps
|
|
536
525
|
.map((prop) => {
|
|
537
526
|
if (prop.orphanRemoval) {
|
|
538
|
-
imports.push(generateEntityImport(prop.targetMeta,
|
|
527
|
+
imports.push(generateEntityImport(prop.targetMeta, targetDirectory));
|
|
539
528
|
const { code, imports: nestedImports } = generateInputHandling({
|
|
540
529
|
mode: "updateNested",
|
|
541
530
|
inputName: `${prop.singularName}Input`,
|
|
@@ -544,7 +533,7 @@ ${inputRelationToManyProps
|
|
|
544
533
|
excludeFields: prop.targetMeta.props
|
|
545
534
|
.filter((prop) => prop.kind == "m:1" && prop.targetMeta == metadata) //filter out referencing back to this entity
|
|
546
535
|
.map((prop) => prop.name),
|
|
547
|
-
}, prop.targetMeta, generatorOptions);
|
|
536
|
+
}, prop.targetMeta, generatorOptions, targetDirectory);
|
|
548
537
|
imports.push(...nestedImports);
|
|
549
538
|
const isAsync = code.includes("await ");
|
|
550
539
|
return `if (${prop.name}Input) {
|
|
@@ -573,7 +562,7 @@ ${inputRelationToManyProps
|
|
|
573
562
|
|
|
574
563
|
${inputRelationOneToOneProps
|
|
575
564
|
.map((prop) => {
|
|
576
|
-
imports.push(generateEntityImport(prop.targetMeta,
|
|
565
|
+
imports.push(generateEntityImport(prop.targetMeta, targetDirectory));
|
|
577
566
|
const { code, imports: nestedImports } = generateInputHandling({
|
|
578
567
|
mode: "updateNested",
|
|
579
568
|
inputName: `${prop.name}Input`,
|
|
@@ -581,7 +570,7 @@ ${inputRelationOneToOneProps
|
|
|
581
570
|
excludeFields: prop.targetMeta.props
|
|
582
571
|
.filter((prop) => prop.kind == "1:1" && prop.targetMeta == metadata) //filter out referencing back to this entity
|
|
583
572
|
.map((prop) => prop.name),
|
|
584
|
-
}, prop.targetMeta, generatorOptions);
|
|
573
|
+
}, prop.targetMeta, generatorOptions, targetDirectory);
|
|
585
574
|
imports.push(...nestedImports);
|
|
586
575
|
return `
|
|
587
576
|
${options.mode != "create" || prop.nullable ? `if (${prop.name}Input) {` : "{"}
|
|
@@ -615,13 +604,13 @@ ${options.mode == "update"
|
|
|
615
604
|
}
|
|
616
605
|
function generateNestedEntityResolver({ generatorOptions, metadata }) {
|
|
617
606
|
const { classNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
618
|
-
const { skipScopeCheck } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
607
|
+
const { skipScopeCheck, targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
619
608
|
const imports = [];
|
|
620
609
|
const { imports: fieldImports, code, hasOutputRelations, needsBlocksTransformer, } = generateRelationsFieldResolver({ generatorOptions, metadata });
|
|
621
610
|
if (!hasOutputRelations)
|
|
622
611
|
return null;
|
|
623
612
|
imports.push(...fieldImports);
|
|
624
|
-
imports.push(generateEntityImport(metadata,
|
|
613
|
+
imports.push(generateEntityImport(metadata, targetDirectory));
|
|
625
614
|
return `
|
|
626
615
|
import { RequiredPermission, RootBlockDataScalar, BlocksTransformerService } from "@comet/cms-api";
|
|
627
616
|
import { Args, ID, Info, Mutation, Query, Resolver, ResolveField, Parent } from "@nestjs/graphql";
|
|
@@ -637,6 +626,7 @@ function generateNestedEntityResolver({ generatorOptions, metadata }) {
|
|
|
637
626
|
}
|
|
638
627
|
function generateRelationsFieldResolver({ generatorOptions, metadata }) {
|
|
639
628
|
const { instanceNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
629
|
+
const { targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
640
630
|
const relationManyToOneProps = metadata.props.filter((prop) => prop.kind === "m:1");
|
|
641
631
|
const relationOneToManyProps = metadata.props.filter((prop) => prop.kind === "1:m");
|
|
642
632
|
const relationManyToManyProps = metadata.props.filter((prop) => prop.kind === "m:n");
|
|
@@ -665,11 +655,11 @@ function generateRelationsFieldResolver({ generatorOptions, metadata }) {
|
|
|
665
655
|
for (const prop of [...relationManyToOneProps, ...relationOneToManyProps, ...relationManyToManyProps, ...relationOneToOneProps]) {
|
|
666
656
|
if (!prop.targetMeta)
|
|
667
657
|
throw new Error(`Relation ${prop.name} has targetMeta not set`);
|
|
668
|
-
imports.push(generateEntityImport(prop.targetMeta,
|
|
658
|
+
imports.push(generateEntityImport(prop.targetMeta, targetDirectory));
|
|
669
659
|
}
|
|
670
660
|
for (const prop of resolveFieldBlockProps) {
|
|
671
661
|
const blockName = (0, ts_morph_helper_1.findBlockName)(prop.name, metadata);
|
|
672
|
-
const importPath = (0, ts_morph_helper_1.findBlockImportPath)(blockName, `${
|
|
662
|
+
const importPath = (0, ts_morph_helper_1.findBlockImportPath)(blockName, `${targetDirectory}`, metadata);
|
|
673
663
|
imports.push({ name: blockName, importPath });
|
|
674
664
|
}
|
|
675
665
|
const code = `
|
|
@@ -729,34 +719,26 @@ function generateRelationsFieldResolver({ generatorOptions, metadata }) {
|
|
|
729
719
|
function generateResolver({ generatorOptions, metadata }) {
|
|
730
720
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
731
721
|
const { classNameSingular, fileNameSingular, instanceNameSingular, classNamePlural, fileNamePlural, instanceNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
732
|
-
const { scopeProp, skipScopeCheck, argsClassName, argsFileName, hasSlugProp, hasSearchArg, hasSortArg, hasFilterArg, hasPositionProp, positionGroupProps, hasDeletedAtProp, dedicatedResolverArgProps, hasPaging, hasArgsClass, } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
733
|
-
const relationManyToOneProps = metadata.props.filter((prop) => prop.kind === "m:1");
|
|
734
|
-
const relationOneToManyProps = metadata.props.filter((prop) => prop.kind === "1:m");
|
|
735
|
-
const relationManyToManyProps = metadata.props.filter((prop) => prop.kind === "m:n");
|
|
736
|
-
const relationOneToOneProps = metadata.props.filter((prop) => prop.kind === "1:1");
|
|
737
|
-
const outputRelationManyToOneProps = relationManyToOneProps.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "resolveField"));
|
|
738
|
-
const outputRelationOneToManyProps = relationOneToManyProps.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "resolveField"));
|
|
739
|
-
const outputRelationManyToManyProps = relationManyToManyProps.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "resolveField"));
|
|
740
|
-
const outputRelationOneToOneProps = relationOneToOneProps.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "resolveField"));
|
|
722
|
+
const { scopeProp, skipScopeCheck, argsClassName, argsFileName, hasSlugProp, hasSearchArg, hasSortArg, hasFilterArg, hasPositionProp, positionGroupProps, hasDeletedAtProp, dedicatedResolverArgProps, targetDirectory, hasPaging, hasArgsClass, } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
741
723
|
const imports = [];
|
|
742
724
|
const { code: createInputHandlingCode, imports: createInputHandlingImports } = generateInputHandling({
|
|
743
725
|
mode: "create",
|
|
744
726
|
inputName: "input",
|
|
745
727
|
assignEntityCode: `const ${instanceNameSingular} = this.entityManager.create(${metadata.className}, {`,
|
|
746
|
-
}, metadata, generatorOptions);
|
|
728
|
+
}, metadata, generatorOptions, targetDirectory);
|
|
747
729
|
imports.push(...createInputHandlingImports);
|
|
748
|
-
const { code: updateInputHandlingCode, imports: updateInputHandlingImports } = generateInputHandling({ mode: "update", inputName: "input", assignEntityCode: `${instanceNameSingular}.assign({` }, metadata, generatorOptions);
|
|
730
|
+
const { code: updateInputHandlingCode, imports: updateInputHandlingImports } = generateInputHandling({ mode: "update", inputName: "input", assignEntityCode: `${instanceNameSingular}.assign({` }, metadata, generatorOptions, targetDirectory);
|
|
749
731
|
imports.push(...updateInputHandlingImports);
|
|
750
|
-
const { imports: relationsFieldResolverImports, code: relationsFieldResolverCode,
|
|
732
|
+
const { imports: relationsFieldResolverImports, code: relationsFieldResolverCode, needsBlocksTransformer, } = generateRelationsFieldResolver({
|
|
751
733
|
generatorOptions,
|
|
752
734
|
metadata,
|
|
753
735
|
});
|
|
754
736
|
imports.push(...relationsFieldResolverImports);
|
|
755
|
-
imports.push(generateEntityImport(metadata,
|
|
737
|
+
imports.push(generateEntityImport(metadata, targetDirectory));
|
|
756
738
|
if (scopeProp && scopeProp.targetMeta) {
|
|
757
|
-
imports.push(generateEntityImport(scopeProp.targetMeta,
|
|
739
|
+
imports.push(generateEntityImport(scopeProp.targetMeta, targetDirectory));
|
|
758
740
|
}
|
|
759
|
-
const hooksService = (0, find_hooks_service_1.findHooksService)({ generatorOptions, metadata });
|
|
741
|
+
const hooksService = (0, find_hooks_service_1.findHooksService)({ generatorOptions, metadata, targetDirectory });
|
|
760
742
|
if (hooksService) {
|
|
761
743
|
imports.push(...hooksService.imports);
|
|
762
744
|
if (((_b = (_a = hooksService.validateCreateInput) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.includes("currentUser")) ||
|
|
@@ -775,7 +757,6 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
775
757
|
}
|
|
776
758
|
const payloadObjectTypes = (0, generate_payload_object_types_1.generatePayloadObjectTypes)({ hooksService, instanceNameSingular, entityName: metadata.className });
|
|
777
759
|
imports.push(...payloadObjectTypes.imports);
|
|
778
|
-
imports.push({ name: "extractGraphqlFields", importPath: "@comet/cms-api" });
|
|
779
760
|
imports.push({ name: "SortDirection", importPath: "@comet/cms-api" });
|
|
780
761
|
imports.push({ name: "RequiredPermission", importPath: "@comet/cms-api" });
|
|
781
762
|
imports.push({ name: "AffectedEntity", importPath: "@comet/cms-api" });
|
|
@@ -785,8 +766,7 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
785
766
|
imports.push({ name: "gqlArgsToMikroOrmQuery", importPath: "@comet/cms-api" });
|
|
786
767
|
imports.push({ name: "gqlSortToMikroOrmOrderBy", importPath: "@comet/cms-api" });
|
|
787
768
|
const resolverOut = `import { EntityManager, FindOptions, ObjectQuery, Reference } from "@mikro-orm/postgresql";
|
|
788
|
-
import { Args, ID,
|
|
789
|
-
import { GraphQLResolveInfo } from "graphql";
|
|
769
|
+
import { Args, ID, Mutation, Query, Resolver, ResolveField, Parent } from "@nestjs/graphql";
|
|
790
770
|
|
|
791
771
|
${hasPositionProp ? `import { ${classNamePlural}Service } from "./${fileNamePlural}.service";` : ``}
|
|
792
772
|
import { ${classNameSingular}Input, ${classNameSingular}UpdateInput } from "./dto/${fileNameSingular}.input";
|
|
@@ -849,7 +829,6 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
849
829
|
.map(([key]) => key)
|
|
850
830
|
.join(", ")}}: ${argsClassName}`
|
|
851
831
|
: ""}
|
|
852
|
-
${hasOutputRelations ? `${hasArgsClass ? `,` : ""} @Info() info: GraphQLResolveInfo` : ""}
|
|
853
832
|
): Promise<${hasPaging ? `Paginated${classNamePlural}` : `${metadata.className}[]`}> {
|
|
854
833
|
const where${hasPaging && (hasSearchArg || hasFilterArg)
|
|
855
834
|
? ` = gqlArgsToMikroOrmQuery({ ${hasSearchArg ? `search, ` : ""}${hasFilterArg ? `filter, ` : ""} }, this.entityManager.getMetadata(${metadata.className}));`
|
|
@@ -861,18 +840,7 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
861
840
|
})
|
|
862
841
|
.join("\n")}
|
|
863
842
|
|
|
864
|
-
${
|
|
865
|
-
? `const fields = extractGraphqlFields(info${hasPaging ? `, { root: "nodes" }` : ""});
|
|
866
|
-
const populate: string[] = [];`
|
|
867
|
-
: ""}
|
|
868
|
-
${[...outputRelationManyToOneProps, ...outputRelationOneToManyProps, ...outputRelationManyToManyProps, ...outputRelationOneToOneProps]
|
|
869
|
-
.map((r) => `if (fields.includes("${r.name}")) {
|
|
870
|
-
populate.push("${r.name}");
|
|
871
|
-
}`)
|
|
872
|
-
.join("\n")}
|
|
873
|
-
|
|
874
|
-
${hasOutputRelations ? `// eslint-disable-next-line @typescript-eslint/no-explicit-any` : ""}
|
|
875
|
-
const options: FindOptions<${metadata.className}${hasOutputRelations ? `, any` : ""}> = { ${hasPaging ? `offset, limit${hasOutputRelations ? `, populate` : ""}` : `${hasOutputRelations ? `populate` : ""}`}};
|
|
843
|
+
const options: FindOptions<${metadata.className}> = { ${hasPaging ? "offset, limit" : ""}};
|
|
876
844
|
|
|
877
845
|
${hasPaging && hasSortArg
|
|
878
846
|
? `if (sort) {
|
|
@@ -1043,11 +1011,7 @@ function generateCrud(generatorOptionsParam, metadata) {
|
|
|
1043
1011
|
function generateCrudResolver() {
|
|
1044
1012
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1045
1013
|
if (hasPaging && hasFilterArg) {
|
|
1046
|
-
generatedFiles.push({
|
|
1047
|
-
name: `dto/${fileNameSingular}.filter.ts`,
|
|
1048
|
-
content: generateFilterDto({ generatorOptions, metadata }),
|
|
1049
|
-
type: "filter",
|
|
1050
|
-
});
|
|
1014
|
+
generatedFiles.push(...generateFilterDto({ generatorOptions, metadata }));
|
|
1051
1015
|
}
|
|
1052
1016
|
if (hasPaging && hasSortArg) {
|
|
1053
1017
|
generatedFiles.push({
|
|
@@ -0,0 +1,76 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateEnumFilterDto = generateEnumFilterDto;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const generate_imports_code_1 = require("../utils/generate-imports-code");
|
|
39
|
+
function generateEnumFilterDto(type, enumName, enumPath) {
|
|
40
|
+
const imports = [];
|
|
41
|
+
const enumFile = path.basename(enumPath);
|
|
42
|
+
const enumFileDirectory = path.dirname(enumPath);
|
|
43
|
+
let enumImportPath;
|
|
44
|
+
let targetDirectory;
|
|
45
|
+
if (enumFileDirectory.endsWith("/entities")) {
|
|
46
|
+
targetDirectory = `${enumFileDirectory.replace(/\/entities$/, "")}/generated`;
|
|
47
|
+
enumImportPath = `../../entities/${enumFile}`;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
targetDirectory = `${enumFileDirectory}/generated`;
|
|
51
|
+
enumImportPath = `../../${enumFile}`;
|
|
52
|
+
}
|
|
53
|
+
targetDirectory = path.normalize(targetDirectory);
|
|
54
|
+
imports.push({ name: enumName, importPath: enumImportPath });
|
|
55
|
+
imports.push({ name: "InputType", importPath: "@nestjs/graphql" });
|
|
56
|
+
let enumFilterOut;
|
|
57
|
+
if (type == "enums") {
|
|
58
|
+
imports.push({ name: "createEnumsFilter", importPath: "@comet/cms-api" });
|
|
59
|
+
enumFilterOut = `@InputType()
|
|
60
|
+
export class ${enumName}EnumsFilter extends createEnumsFilter(${enumName}) {}
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
imports.push({ name: "createEnumFilter", importPath: "@comet/cms-api" });
|
|
65
|
+
enumFilterOut = `@InputType()
|
|
66
|
+
export class ${enumName}EnumFilter extends createEnumFilter(${enumName}) {}
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
const enumNameKebabCase = enumName[0].toLocaleLowerCase() + enumName.slice(1).replace(/[A-Z]/g, (i) => `-${i.toLocaleLowerCase()}`);
|
|
70
|
+
return {
|
|
71
|
+
targetDirectory,
|
|
72
|
+
name: `dto/${enumNameKebabCase}.${type}-filter.ts`,
|
|
73
|
+
content: (0, generate_imports_code_1.generateImportsCode)(imports) + enumFilterOut,
|
|
74
|
+
type: `${type}-filter`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -2,7 +2,6 @@ import { type Permission } from "@comet/cms-api";
|
|
|
2
2
|
import { type EntityMetadata } from "@mikro-orm/postgresql";
|
|
3
3
|
import { type GeneratedFile } from "../utils/write-generated-files";
|
|
4
4
|
export declare function generateCrudInput(generatorOptions: {
|
|
5
|
-
targetDirectory: string;
|
|
6
5
|
requiredPermission: Permission | Permission[];
|
|
7
6
|
}, metadata: EntityMetadata<any>, options?: {
|
|
8
7
|
nested: boolean;
|
|
@@ -54,7 +54,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
54
54
|
}) {
|
|
55
55
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
56
56
|
const generatedFiles = [];
|
|
57
|
-
const { dedicatedResolverArgProps } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
57
|
+
const { dedicatedResolverArgProps, targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
58
58
|
const props = metadata.props
|
|
59
59
|
.filter((prop) => {
|
|
60
60
|
return !prop.embedded;
|
|
@@ -123,7 +123,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
123
123
|
const defaultValue = prop.nullable && (initializer == "undefined" || initializer == "null" || initializer === undefined) ? "null" : initializer;
|
|
124
124
|
const fieldOptions = tsCodeRecordToString({ nullable: prop.nullable ? "true" : undefined, defaultValue });
|
|
125
125
|
const enumName = (0, ts_morph_helper_1.findEnumName)(prop.name, metadata);
|
|
126
|
-
const importPath = (0, ts_morph_helper_1.findEnumImportPath)(enumName, `${
|
|
126
|
+
const importPath = (0, ts_morph_helper_1.findEnumImportPath)(enumName, `${targetDirectory}/dto`, metadata);
|
|
127
127
|
imports.push({ name: enumName, importPath });
|
|
128
128
|
decorators.push(`@IsEnum(${enumName})`);
|
|
129
129
|
decorators.push(`@Field(() => ${enumName}, ${fieldOptions})`);
|
|
@@ -137,7 +137,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
137
137
|
const initializer = (_c = (0, ts_morph_helper_1.morphTsProperty)(prop.name, metadata).getInitializer()) === null || _c === void 0 ? void 0 : _c.getText();
|
|
138
138
|
const fieldOptions = tsCodeRecordToString({ defaultValue: initializer });
|
|
139
139
|
const enumName = (0, ts_morph_helper_1.findEnumName)(prop.name, metadata);
|
|
140
|
-
const importPath = (0, ts_morph_helper_1.findEnumImportPath)(enumName, `${
|
|
140
|
+
const importPath = (0, ts_morph_helper_1.findEnumImportPath)(enumName, `${targetDirectory}/dto`, metadata);
|
|
141
141
|
imports.push({ name: enumName, importPath });
|
|
142
142
|
decorators.push(`@IsEnum(${enumName}, { each: true })`);
|
|
143
143
|
decorators.push(`@Field(() => [${enumName}], ${fieldOptions})`);
|
|
@@ -200,7 +200,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
200
200
|
}
|
|
201
201
|
else if (prop.type === "RootBlockType") {
|
|
202
202
|
const blockName = (0, ts_morph_helper_1.findBlockName)(prop.name, metadata);
|
|
203
|
-
const importPath = (0, ts_morph_helper_1.findBlockImportPath)(blockName, `${
|
|
203
|
+
const importPath = (0, ts_morph_helper_1.findBlockImportPath)(blockName, `${targetDirectory}/dto`, metadata);
|
|
204
204
|
imports.push({ name: blockName, importPath });
|
|
205
205
|
decorators.push(`@Field(() => RootBlockInputScalar(${blockName})${prop.nullable ? ", { nullable: true }" : ""})`);
|
|
206
206
|
decorators.push(`@Transform(({ value }) => (isBlockInputInterface(value) ? value : ${blockName}.blockInputFactory(value)), { toClassOnly: true })`);
|
|
@@ -380,7 +380,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
380
380
|
}
|
|
381
381
|
else if (tsType.getArrayElementTypeOrThrow().isClass()) {
|
|
382
382
|
const nestedClassName = tsType.getArrayElementTypeOrThrow().getText(tsProp);
|
|
383
|
-
const importPath = (0, ts_morph_helper_1.findInputClassImportPath)(nestedClassName, `${
|
|
383
|
+
const importPath = (0, ts_morph_helper_1.findInputClassImportPath)(nestedClassName, `${targetDirectory}/dto`, metadata);
|
|
384
384
|
imports.push({ name: nestedClassName, importPath });
|
|
385
385
|
decorators.push(`@ValidateNested()`);
|
|
386
386
|
decorators.push(`@Type(() => ${nestedClassName})`);
|
|
@@ -391,7 +391,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
391
391
|
const elementTypeNode = typeNode.getElementTypeNode();
|
|
392
392
|
if (elementTypeNode.isKind(ts_morph_1.SyntaxKind.TypeReference)) {
|
|
393
393
|
// if the element type is a type reference, we need to find the import path
|
|
394
|
-
const { importPath } = (0, ts_morph_helper_1.findImportPath)(elementTypeNode.getText(), `${
|
|
394
|
+
const { importPath } = (0, ts_morph_helper_1.findImportPath)(elementTypeNode.getText(), `${targetDirectory}/dto`, metadata);
|
|
395
395
|
if (importPath) {
|
|
396
396
|
imports.push({ name: elementTypeNode.getText(), importPath });
|
|
397
397
|
}
|
|
@@ -401,7 +401,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
401
401
|
}
|
|
402
402
|
else if (tsType.isClass()) {
|
|
403
403
|
const nestedClassName = tsType.getText(tsProp);
|
|
404
|
-
const importPath = (0, ts_morph_helper_1.findInputClassImportPath)(nestedClassName, `${
|
|
404
|
+
const importPath = (0, ts_morph_helper_1.findInputClassImportPath)(nestedClassName, `${targetDirectory}/dto`, metadata);
|
|
405
405
|
imports.push({ name: nestedClassName, importPath });
|
|
406
406
|
decorators.push(`@ValidateNested()`);
|
|
407
407
|
decorators.push(`@Type(() => ${nestedClassName})`);
|
|
@@ -411,7 +411,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
411
411
|
const typeNode = tsProp.getTypeNodeOrThrow();
|
|
412
412
|
if (typeNode.isKind(ts_morph_1.SyntaxKind.TypeReference)) {
|
|
413
413
|
// if the element type is a type reference, we need to find the import path
|
|
414
|
-
const { importPath } = (0, ts_morph_helper_1.findImportPath)(typeNode.getText(), `${
|
|
414
|
+
const { importPath } = (0, ts_morph_helper_1.findImportPath)(typeNode.getText(), `${targetDirectory}/dto`, metadata);
|
|
415
415
|
if (importPath) {
|
|
416
416
|
imports.push({ name: typeNode.getText(), importPath });
|
|
417
417
|
}
|
|
@@ -433,7 +433,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
433
433
|
else if ((0, ts_morph_helper_1.getFieldDecoratorClassName)(prop.name, metadata)) {
|
|
434
434
|
//for custom mikro-orm type
|
|
435
435
|
const className = (0, ts_morph_helper_1.getFieldDecoratorClassName)(prop.name, metadata);
|
|
436
|
-
const importPath = (0, ts_morph_helper_1.findInputClassImportPath)(className, `${
|
|
436
|
+
const importPath = (0, ts_morph_helper_1.findInputClassImportPath)(className, `${targetDirectory}/dto`, metadata);
|
|
437
437
|
imports.push({ name: className, importPath });
|
|
438
438
|
decorators.push(`@ValidateNested()`);
|
|
439
439
|
decorators.push(`@Type(() => ${className})`);
|
|
@@ -458,7 +458,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
458
458
|
`Is${decorator.getName()}`.toUpperCase() === constraint.name.toUpperCase());
|
|
459
459
|
});
|
|
460
460
|
if (decorator) {
|
|
461
|
-
const importPath = (0, ts_morph_helper_1.findValidatorImportPath)(decorator.getName(),
|
|
461
|
+
const importPath = (0, ts_morph_helper_1.findValidatorImportPath)(decorator.getName(), targetDirectory, metadata);
|
|
462
462
|
if (importPath) {
|
|
463
463
|
imports.push({ name: decorator.getName(), importPath });
|
|
464
464
|
if (!decorators.includes(decorator.getText())) {
|
|
@@ -45,6 +45,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
45
45
|
exports.generateCrudSingle = generateCrudSingle;
|
|
46
46
|
const cms_api_1 = require("@comet/cms-api");
|
|
47
47
|
const path = __importStar(require("path"));
|
|
48
|
+
const build_options_1 = require("../generateCrud/build-options");
|
|
48
49
|
const generate_crud_input_1 = require("../generateCrudInput/generate-crud-input");
|
|
49
50
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
51
|
function generateCrudSingle(generatorOptions, metadata) {
|
|
@@ -55,6 +56,7 @@ function generateCrudSingle(generatorOptions, metadata) {
|
|
|
55
56
|
const instanceNamePlural = classNamePlural[0].toLocaleLowerCase() + classNamePlural.slice(1);
|
|
56
57
|
const fileNameSingular = instanceNameSingular.replace(/[A-Z]/g, (i) => `-${i.toLocaleLowerCase()}`);
|
|
57
58
|
const fileNamePlural = instanceNamePlural.replace(/[A-Z]/g, (i) => `-${i.toLocaleLowerCase()}`);
|
|
59
|
+
const { targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
58
60
|
function generateCrudResolver() {
|
|
59
61
|
return __awaiter(this, void 0, void 0, function* () {
|
|
60
62
|
const generatedFiles = [];
|
|
@@ -66,7 +68,7 @@ function generateCrudSingle(generatorOptions, metadata) {
|
|
|
66
68
|
});
|
|
67
69
|
const serviceOut = `import { ObjectQuery } from "@mikro-orm/postgresql";
|
|
68
70
|
import { Injectable } from "@nestjs/common";
|
|
69
|
-
import { ${metadata.className} } from "${path.relative(
|
|
71
|
+
import { ${metadata.className} } from "${path.relative(targetDirectory, metadata.path).replace(/\.ts$/, "")}";
|
|
70
72
|
|
|
71
73
|
@Injectable()
|
|
72
74
|
export class ${classNamePlural}Service {
|
|
@@ -78,11 +80,9 @@ function generateCrudSingle(generatorOptions, metadata) {
|
|
|
78
80
|
import { Args, ID, Mutation, Query, Resolver } from "@nestjs/graphql";
|
|
79
81
|
import { RequiredPermission, SortDirection, validateNotModified } from "@comet/cms-api";
|
|
80
82
|
|
|
81
|
-
import { ${metadata.className} } from "${path.relative(
|
|
83
|
+
import { ${metadata.className} } from "${path.relative(targetDirectory, metadata.path).replace(/\.ts$/, "")}";
|
|
82
84
|
${scopeProp && scopeProp.targetMeta
|
|
83
|
-
? `import { ${scopeProp.targetMeta.className} } from "${path
|
|
84
|
-
.relative(generatorOptions.targetDirectory, scopeProp.targetMeta.path)
|
|
85
|
-
.replace(/\.ts$/, "")}";`
|
|
85
|
+
? `import { ${scopeProp.targetMeta.className} } from "${path.relative(targetDirectory, scopeProp.targetMeta.path).replace(/\.ts$/, "")}";`
|
|
86
86
|
: ""}
|
|
87
87
|
import { ${classNamePlural}Service } from "./${fileNamePlural}.service";
|
|
88
88
|
import { ${classNameSingular}Input } from "./dto/${fileNameSingular}.input";
|
|
@@ -20,6 +20,7 @@ const cli_1 = require("@mikro-orm/cli");
|
|
|
20
20
|
const lazy_metadata_storage_1 = require("@nestjs/graphql/dist/schema-builder/storages/lazy-metadata.storage");
|
|
21
21
|
const child_process_1 = require("child_process");
|
|
22
22
|
const util_1 = require("util");
|
|
23
|
+
const build_options_1 = require("./generateCrud/build-options");
|
|
23
24
|
const generate_crud_1 = require("./generateCrud/generate-crud");
|
|
24
25
|
const generate_crud_single_1 = require("./generateCrudSingle/generate-crud-single");
|
|
25
26
|
const write_generated_files_1 = require("./utils/write-generated-files");
|
|
@@ -60,8 +61,9 @@ file) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
60
61
|
if (generatorOptions) {
|
|
61
62
|
node_console_1.default.log(`🚀 start generateCrud for Entity ${entity.path}`);
|
|
62
63
|
const files = yield (0, generate_crud_1.generateCrud)(generatorOptions, entity);
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
const { targetDirectory } = (0, build_options_1.buildOptions)(entity, generatorOptions);
|
|
65
|
+
yield (0, write_generated_files_1.writeGeneratedFiles)(files, targetDirectory);
|
|
66
|
+
writtenFiles.push(...files.map((f) => { var _a; return (0, node_fs_1.realpathSync)(`${(_a = f.targetDirectory) !== null && _a !== void 0 ? _a : targetDirectory}/${f.name}`); }));
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
{
|
|
@@ -69,8 +71,9 @@ file) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
69
71
|
if (generatorOptions) {
|
|
70
72
|
node_console_1.default.log(`🚀 start generateCrudSingle for Entity ${entity.path}`);
|
|
71
73
|
const files = yield (0, generate_crud_single_1.generateCrudSingle)(generatorOptions, entity);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
const { targetDirectory } = (0, build_options_1.buildOptions)(entity, generatorOptions);
|
|
75
|
+
yield (0, write_generated_files_1.writeGeneratedFiles)(files, targetDirectory);
|
|
76
|
+
writtenFiles.push(...files.map((f) => { var _a; return (0, node_fs_1.realpathSync)(`${(_a = f.targetDirectory) !== null && _a !== void 0 ? _a : targetDirectory}/${f.name}`); }));
|
|
74
77
|
}
|
|
75
78
|
}
|
|
76
79
|
}
|
|
@@ -1,23 +1,18 @@
|
|
|
1
1
|
import { type CrudGeneratorOptions } from "@comet/cms-api";
|
|
2
2
|
import { type EntityMetadata } from "@mikro-orm/core";
|
|
3
3
|
import { type Imports } from "./generate-imports-code";
|
|
4
|
-
export declare function findHooksService({ generatorOptions, metadata }: {
|
|
4
|
+
export declare function findHooksService({ generatorOptions, metadata, targetDirectory, }: {
|
|
5
5
|
generatorOptions: CrudGeneratorOptions;
|
|
6
|
-
metadata: EntityMetadata
|
|
6
|
+
metadata: EntityMetadata;
|
|
7
|
+
targetDirectory: string;
|
|
7
8
|
}): {
|
|
8
9
|
validateCreateInput: {
|
|
9
|
-
options
|
|
10
|
+
options?: string[];
|
|
10
11
|
returnType: string;
|
|
11
|
-
} | {
|
|
12
|
-
returnType: string;
|
|
13
|
-
options?: undefined;
|
|
14
12
|
} | null;
|
|
15
13
|
validateUpdateInput: {
|
|
16
|
-
options
|
|
17
|
-
returnType: string;
|
|
18
|
-
} | {
|
|
14
|
+
options?: string[];
|
|
19
15
|
returnType: string;
|
|
20
|
-
options?: undefined;
|
|
21
16
|
} | null;
|
|
22
17
|
imports: Imports;
|
|
23
18
|
className: string;
|
|
@@ -83,8 +83,7 @@ function unwrapArrayType(type) {
|
|
|
83
83
|
}
|
|
84
84
|
throw new Error(`Return type must be an array`);
|
|
85
85
|
}
|
|
86
|
-
|
|
87
|
-
function findHooksService({ generatorOptions, metadata }) {
|
|
86
|
+
function findHooksService({ generatorOptions, metadata, targetDirectory, }) {
|
|
88
87
|
var _a;
|
|
89
88
|
if (!generatorOptions.hooksService) {
|
|
90
89
|
return null;
|
|
@@ -118,7 +117,7 @@ function findHooksService({ generatorOptions, metadata }) {
|
|
|
118
117
|
throw new Error("hooksService initializer is not an identifier");
|
|
119
118
|
}
|
|
120
119
|
const hooksServiceClassName = initializer.getText();
|
|
121
|
-
const { importPath } = (0, ts_morph_helper_1.findImportPath)(hooksServiceClassName,
|
|
120
|
+
const { importPath } = (0, ts_morph_helper_1.findImportPath)(hooksServiceClassName, targetDirectory, metadata);
|
|
122
121
|
if (importPath) {
|
|
123
122
|
imports.push({ name: hooksServiceClassName, importPath });
|
|
124
123
|
}
|
|
@@ -132,7 +131,7 @@ function findHooksService({ generatorOptions, metadata }) {
|
|
|
132
131
|
validateCreateInput = {};
|
|
133
132
|
const unwrappedType = unwrapArrayType(unwrapPromiseType(method.getReturnType()));
|
|
134
133
|
const returnType = unwrappedType.getText(method, ts_morph_1.ts.TypeFormatFlags.None);
|
|
135
|
-
const returnTypeImport = findReturnTypeImport(unwrappedType, serviceClassDeclaration,
|
|
134
|
+
const returnTypeImport = findReturnTypeImport(unwrappedType, serviceClassDeclaration, targetDirectory);
|
|
136
135
|
if (returnTypeImport) {
|
|
137
136
|
imports.push(returnTypeImport);
|
|
138
137
|
}
|
|
@@ -156,7 +155,7 @@ function findHooksService({ generatorOptions, metadata }) {
|
|
|
156
155
|
validateUpdateInput = {};
|
|
157
156
|
const unwrappedType = unwrapArrayType(unwrapPromiseType(method.getReturnType()));
|
|
158
157
|
const returnType = unwrappedType.getText(method, ts_morph_1.ts.TypeFormatFlags.None);
|
|
159
|
-
const returnTypeImport = findReturnTypeImport(unwrappedType, serviceClassDeclaration,
|
|
158
|
+
const returnTypeImport = findReturnTypeImport(unwrappedType, serviceClassDeclaration, targetDirectory);
|
|
160
159
|
if (returnTypeImport) {
|
|
161
160
|
imports.push(returnTypeImport);
|
|
162
161
|
}
|
|
@@ -11,9 +11,7 @@ export declare function findImportPath(importName: string, targetDirectory: stri
|
|
|
11
11
|
};
|
|
12
12
|
export declare function findEnumName(propertyName: string, metadata: EntityMetadata<any>): string;
|
|
13
13
|
export declare function findEnumImportPath(enumName: string, targetDirectory: string, metadata: EntityMetadata<any>): string;
|
|
14
|
-
export declare function findValidatorImportPath(validatorName: string,
|
|
15
|
-
targetDirectory: string;
|
|
16
|
-
}, metadata: EntityMetadata<any>): string;
|
|
14
|
+
export declare function findValidatorImportPath(validatorName: string, targetDirectory: string, metadata: EntityMetadata<any>): string;
|
|
17
15
|
export declare function findBlockName(propertyName: string, metadata: EntityMetadata<any>): string;
|
|
18
16
|
export declare function findBlockImportPath(blockName: string, targetDirectory: string, metadata: EntityMetadata<any>): string;
|
|
19
17
|
export declare function findInputClassImportPath(className: string, targetDirectory: string, metadata: EntityMetadata<any>): string;
|
|
@@ -144,7 +144,7 @@ function findEnumImportPath(enumName, targetDirectory, metadata) {
|
|
|
144
144
|
return importPath;
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
|
-
function findValidatorImportPath(validatorName,
|
|
147
|
+
function findValidatorImportPath(validatorName, targetDirectory, metadata) {
|
|
148
148
|
var _a, _b;
|
|
149
149
|
const tsSource = morphTsSource(metadata);
|
|
150
150
|
//validator defined in same file as entity
|
|
@@ -152,10 +152,10 @@ function findValidatorImportPath(validatorName, generatorOptions, metadata) {
|
|
|
152
152
|
if (!(((_a = tsSource.getVariableDeclaration(validatorName)) === null || _a === void 0 ? void 0 : _a.isExported()) || ((_b = tsSource.getFunction(validatorName)) === null || _b === void 0 ? void 0 : _b.isExported()))) {
|
|
153
153
|
throw new Error(`Validator ${validatorName} is not exported in ${metadata.path}`);
|
|
154
154
|
}
|
|
155
|
-
return path.relative(`${
|
|
155
|
+
return path.relative(`${targetDirectory}/dto`, metadata.path).replace(/\.ts$/, "");
|
|
156
156
|
}
|
|
157
157
|
else {
|
|
158
|
-
const { importPath } = findImportPathOrThrow(validatorName,
|
|
158
|
+
const { importPath } = findImportPathOrThrow(validatorName, targetDirectory, metadata);
|
|
159
159
|
return importPath;
|
|
160
160
|
}
|
|
161
161
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
export interface GeneratedFile {
|
|
2
|
+
targetDirectory?: string;
|
|
2
3
|
name: string;
|
|
3
4
|
content: string;
|
|
4
|
-
type: "resolver" | "input" | "filter" | "sort" | "service" | "args";
|
|
5
|
+
type: "resolver" | "input" | "filter" | "enum-filter" | "enums-filter" | "sort" | "service" | "args";
|
|
5
6
|
}
|
|
6
|
-
export declare function writeGeneratedFiles(files: GeneratedFile[],
|
|
7
|
-
targetDirectory: string;
|
|
8
|
-
}): Promise<void>;
|
|
7
|
+
export declare function writeGeneratedFiles(files: GeneratedFile[], targetDirectory: string): Promise<void>;
|
|
@@ -11,10 +11,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.writeGeneratedFiles = writeGeneratedFiles;
|
|
13
13
|
const write_generated_file_1 = require("./write-generated-file");
|
|
14
|
-
function writeGeneratedFiles(files,
|
|
14
|
+
function writeGeneratedFiles(files, targetDirectory) {
|
|
15
15
|
return __awaiter(this, void 0, void 0, function* () {
|
|
16
|
+
var _a;
|
|
16
17
|
for (const file of files) {
|
|
17
|
-
yield (0, write_generated_file_1.writeGeneratedFile)(`${
|
|
18
|
+
yield (0, write_generated_file_1.writeGeneratedFile)(`${(_a = file.targetDirectory) !== null && _a !== void 0 ? _a : targetDirectory}/${file.name}`, file.content);
|
|
18
19
|
}
|
|
19
20
|
});
|
|
20
21
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comet/api-generator",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "9.0.0-beta.0",
|
|
4
4
|
"description": "Comet API Generator CLI tool",
|
|
5
5
|
"repository": {
|
|
6
6
|
"directory": "packages/api/api-generator",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"ts-morph": "^25.0.1",
|
|
26
26
|
"ts-node": "^10.9.2",
|
|
27
27
|
"typescript": "^5.9.3",
|
|
28
|
-
"@comet/cms-api": "
|
|
28
|
+
"@comet/cms-api": "9.0.0-beta.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@mikro-orm/cli": "^6.4.16",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"rimraf": "^6.1.2",
|
|
45
45
|
"ts-jest": "^29.4.6",
|
|
46
46
|
"uuid": "^11.1.0",
|
|
47
|
-
"@comet/eslint-config": "
|
|
47
|
+
"@comet/eslint-config": "9.0.0-beta.0"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"@mikro-orm/cli": "^6.0.0",
|