@comet/api-generator 9.0.0-canary-20250915134805 → 9.0.0-canary-20251002064922
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 +20 -0
- package/lib/commands/generate/generateCrud/build-options.js +130 -0
- package/lib/commands/generate/generateCrud/generate-crud.d.ts +4 -17
- package/lib/commands/generate/generateCrud/generate-crud.js +14 -107
- package/lib/commands/generate/generateCrudInput/generate-crud-input.js +2 -2
- package/package.json +4 -4
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type CrudGeneratorOptions } from "@comet/cms-api";
|
|
2
|
+
import { type EntityMetadata } from "@mikro-orm/core";
|
|
3
|
+
export declare function buildSortProps(metadata: EntityMetadata<any>): string[];
|
|
4
|
+
export declare function buildOptions(metadata: EntityMetadata<any>, generatorOptions: CrudGeneratorOptions): {
|
|
5
|
+
crudSearchPropNames: import("@comet/cms-api/lib/common/helper/crud-generator.helper").CrudSearchField[];
|
|
6
|
+
hasSearchArg: boolean;
|
|
7
|
+
crudFilterProps: import("@mikro-orm/core").EntityProperty<any, any>[];
|
|
8
|
+
hasFilterArg: boolean;
|
|
9
|
+
crudSortProps: string[];
|
|
10
|
+
hasSortArg: boolean;
|
|
11
|
+
hasSlugProp: boolean;
|
|
12
|
+
hasPositionProp: boolean;
|
|
13
|
+
positionGroupProps: import("@mikro-orm/core").EntityProperty<any, any>[];
|
|
14
|
+
scopeProp: import("@mikro-orm/core").EntityProperty<any, any> | undefined;
|
|
15
|
+
skipScopeCheck: boolean;
|
|
16
|
+
argsClassName: string;
|
|
17
|
+
argsFileName: string;
|
|
18
|
+
blockProps: import("@mikro-orm/core").EntityProperty<any, any>[];
|
|
19
|
+
dedicatedResolverArgProps: import("@mikro-orm/core").EntityProperty<any, any>[];
|
|
20
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildSortProps = buildSortProps;
|
|
4
|
+
exports.buildOptions = buildOptions;
|
|
5
|
+
const cms_api_1 = require("@comet/cms-api");
|
|
6
|
+
const build_name_variants_1 = require("../utils/build-name-variants");
|
|
7
|
+
const constants_1 = require("../utils/constants");
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
+
function buildFilterProps(metadata) {
|
|
10
|
+
const dedicatedResolverArgProps = buildDedicatedResolverArgProps(metadata);
|
|
11
|
+
const crudFilterProps = metadata.props.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "filter") &&
|
|
12
|
+
!prop.name.startsWith("scope_") &&
|
|
13
|
+
prop.name != "position" &&
|
|
14
|
+
(!prop.embedded || (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.embedded[0], "filter")) && // the whole embeddable has filter disabled
|
|
15
|
+
(prop.enum ||
|
|
16
|
+
prop.type === "string" ||
|
|
17
|
+
prop.type === "text" ||
|
|
18
|
+
prop.type === "DecimalType" ||
|
|
19
|
+
prop.type === "number" ||
|
|
20
|
+
constants_1.integerTypes.includes(prop.type) ||
|
|
21
|
+
prop.type === "BooleanType" ||
|
|
22
|
+
prop.type === "boolean" ||
|
|
23
|
+
prop.type === "DateType" ||
|
|
24
|
+
prop.type === "Date" ||
|
|
25
|
+
prop.kind === "m:1" ||
|
|
26
|
+
prop.kind === "1:m" ||
|
|
27
|
+
prop.kind === "m:n" ||
|
|
28
|
+
prop.type === "EnumArrayType" ||
|
|
29
|
+
prop.type === "uuid") &&
|
|
30
|
+
!dedicatedResolverArgProps.some((dedicatedResolverArgProp) => dedicatedResolverArgProp.name == prop.name));
|
|
31
|
+
return crudFilterProps;
|
|
32
|
+
}
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
+
function buildSortProps(metadata) {
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
+
function directSortProps(metadata) {
|
|
37
|
+
return metadata.props
|
|
38
|
+
.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "sort") &&
|
|
39
|
+
!prop.name.startsWith("scope_") &&
|
|
40
|
+
(!prop.embedded || (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.embedded[0], "sort")) && // the whole embeddable has sort disabled
|
|
41
|
+
(prop.type === "string" ||
|
|
42
|
+
prop.type === "text" ||
|
|
43
|
+
prop.type === "DecimalType" ||
|
|
44
|
+
prop.type === "number" ||
|
|
45
|
+
constants_1.integerTypes.includes(prop.type) ||
|
|
46
|
+
prop.type === "BooleanType" ||
|
|
47
|
+
prop.type === "boolean" ||
|
|
48
|
+
prop.type === "DateType" ||
|
|
49
|
+
prop.type === "Date" ||
|
|
50
|
+
prop.kind === "m:1" ||
|
|
51
|
+
prop.type === "EnumArrayType" ||
|
|
52
|
+
prop.enum))
|
|
53
|
+
.map((prop) => {
|
|
54
|
+
return prop.name;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const crudSortProps = directSortProps(metadata);
|
|
58
|
+
// add nested from relations, one level deep
|
|
59
|
+
metadata.props.forEach((prop) => {
|
|
60
|
+
if ((0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "sort")) {
|
|
61
|
+
if ((prop.kind == "1:1" || prop.kind == "m:1") && prop.targetMeta) {
|
|
62
|
+
crudSortProps.push(...directSortProps(prop.targetMeta).map((nestedProp) => `${prop.name}.${nestedProp}`));
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return crudSortProps;
|
|
68
|
+
}
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
function buildDedicatedResolverArgProps(metadata) {
|
|
71
|
+
return metadata.props.filter((prop) => {
|
|
72
|
+
if ((0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "dedicatedResolverArg")) {
|
|
73
|
+
if (prop.kind == "m:1") {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.warn(`${metadata.className} ${prop.name} can't use dedicatedResolverArg as it's not a m:1 relation`);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
85
|
+
function buildOptions(metadata, generatorOptions) {
|
|
86
|
+
var _a, _b;
|
|
87
|
+
const { classNameSingular, classNamePlural, fileNameSingular, fileNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
88
|
+
const dedicatedResolverArgProps = buildDedicatedResolverArgProps(metadata);
|
|
89
|
+
const crudSearchPropNames = (0, cms_api_1.getCrudSearchFieldsFromMetadata)(metadata);
|
|
90
|
+
const hasSearchArg = crudSearchPropNames.length > 0;
|
|
91
|
+
const crudFilterProps = buildFilterProps(metadata);
|
|
92
|
+
const hasFilterArg = crudFilterProps.length > 0;
|
|
93
|
+
const crudSortProps = buildSortProps(metadata);
|
|
94
|
+
const hasSortArg = crudSortProps.length > 0;
|
|
95
|
+
const hasSlugProp = metadata.props.some((prop) => prop.name == "slug");
|
|
96
|
+
const scopeProp = metadata.props.find((prop) => prop.name == "scope");
|
|
97
|
+
if (scopeProp && !scopeProp.targetMeta)
|
|
98
|
+
throw new Error("Scope prop has no targetMeta");
|
|
99
|
+
const hasPositionProp = metadata.props.some((prop) => prop.name == "position");
|
|
100
|
+
const positionGroupPropNames = hasPositionProp
|
|
101
|
+
? ((_b = (_a = generatorOptions.position) === null || _a === void 0 ? void 0 : _a.groupByFields) !== null && _b !== void 0 ? _b : [
|
|
102
|
+
...(scopeProp ? [scopeProp.name] : []), // if there is a scope prop it's effecting position-group, if not groupByFields should be used
|
|
103
|
+
])
|
|
104
|
+
: [];
|
|
105
|
+
const positionGroupProps = hasPositionProp ? metadata.props.filter((prop) => positionGroupPropNames.includes(prop.name)) : [];
|
|
106
|
+
const scopedEntity = Reflect.getMetadata(cms_api_1.SCOPED_ENTITY_METADATA_KEY, metadata.class);
|
|
107
|
+
const skipScopeCheck = !scopeProp && !scopedEntity;
|
|
108
|
+
const argsClassName = `${classNameSingular != classNamePlural ? classNamePlural : `${classNamePlural}List`}Args`;
|
|
109
|
+
const argsFileName = `${fileNameSingular != fileNamePlural ? fileNamePlural : `${fileNameSingular}-list`}.args`;
|
|
110
|
+
const blockProps = metadata.props.filter((prop) => {
|
|
111
|
+
return (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "input") && prop.type === "RootBlockType";
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
crudSearchPropNames,
|
|
115
|
+
hasSearchArg,
|
|
116
|
+
crudFilterProps,
|
|
117
|
+
hasFilterArg,
|
|
118
|
+
crudSortProps,
|
|
119
|
+
hasSortArg,
|
|
120
|
+
hasSlugProp,
|
|
121
|
+
hasPositionProp,
|
|
122
|
+
positionGroupProps,
|
|
123
|
+
scopeProp,
|
|
124
|
+
skipScopeCheck,
|
|
125
|
+
argsClassName,
|
|
126
|
+
argsFileName,
|
|
127
|
+
blockProps,
|
|
128
|
+
dedicatedResolverArgProps,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
@@ -1,21 +1,8 @@
|
|
|
1
1
|
import { type CrudGeneratorOptions } from "@comet/cms-api";
|
|
2
2
|
import { type EntityMetadata } from "@mikro-orm/postgresql";
|
|
3
3
|
import { type GeneratedFile } from "../utils/write-generated-files";
|
|
4
|
-
export declare function
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
hasFilterArg: boolean;
|
|
9
|
-
crudSortProps: import("@mikro-orm/postgresql").EntityProperty<any, any>[];
|
|
10
|
-
hasSortArg: boolean;
|
|
11
|
-
hasSlugProp: boolean;
|
|
12
|
-
hasPositionProp: boolean;
|
|
13
|
-
positionGroupProps: import("@mikro-orm/postgresql").EntityProperty<any, any>[];
|
|
14
|
-
scopeProp: import("@mikro-orm/postgresql").EntityProperty<any, any> | undefined;
|
|
15
|
-
skipScopeCheck: boolean;
|
|
16
|
-
argsClassName: string;
|
|
17
|
-
argsFileName: string;
|
|
18
|
-
blockProps: import("@mikro-orm/postgresql").EntityProperty<any, any>[];
|
|
19
|
-
dedicatedResolverArgProps: import("@mikro-orm/postgresql").EntityProperty<any, any>[];
|
|
20
|
-
};
|
|
4
|
+
export declare function generateSortDto({ generatorOptions, metadata }: {
|
|
5
|
+
generatorOptions: CrudGeneratorOptions;
|
|
6
|
+
metadata: EntityMetadata<any>;
|
|
7
|
+
}): string;
|
|
21
8
|
export declare function generateCrud(generatorOptionsParam: CrudGeneratorOptions, metadata: EntityMetadata<any>): Promise<GeneratedFile[]>;
|
|
@@ -42,7 +42,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
42
42
|
});
|
|
43
43
|
};
|
|
44
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.
|
|
45
|
+
exports.generateSortDto = generateSortDto;
|
|
46
46
|
exports.generateCrud = generateCrud;
|
|
47
47
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
48
48
|
const cms_api_1 = require("@comet/cms-api");
|
|
@@ -54,100 +54,10 @@ const build_name_variants_1 = require("../utils/build-name-variants");
|
|
|
54
54
|
const constants_1 = require("../utils/constants");
|
|
55
55
|
const generate_imports_code_1 = require("../utils/generate-imports-code");
|
|
56
56
|
const ts_morph_helper_1 = require("../utils/ts-morph-helper");
|
|
57
|
-
|
|
58
|
-
function buildOptions(metadata, generatorOptions) {
|
|
59
|
-
var _a, _b;
|
|
60
|
-
const { classNameSingular, classNamePlural, fileNameSingular, fileNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
61
|
-
const dedicatedResolverArgProps = metadata.props.filter((prop) => {
|
|
62
|
-
if ((0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "dedicatedResolverArg")) {
|
|
63
|
-
if (prop.kind == "m:1") {
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
console.warn(`${metadata.className} ${prop.name} can't use dedicatedResolverArg as it's not a m:1 relation`);
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return false;
|
|
72
|
-
});
|
|
73
|
-
const crudSearchPropNames = (0, cms_api_1.getCrudSearchFieldsFromMetadata)(metadata);
|
|
74
|
-
const hasSearchArg = crudSearchPropNames.length > 0;
|
|
75
|
-
const crudFilterProps = metadata.props.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "filter") &&
|
|
76
|
-
!prop.name.startsWith("scope_") &&
|
|
77
|
-
prop.name != "position" &&
|
|
78
|
-
(!prop.embedded || (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.embedded[0], "filter")) && // the whole embeddable has filter disabled
|
|
79
|
-
(prop.enum ||
|
|
80
|
-
prop.type === "string" ||
|
|
81
|
-
prop.type === "text" ||
|
|
82
|
-
prop.type === "DecimalType" ||
|
|
83
|
-
prop.type === "number" ||
|
|
84
|
-
constants_1.integerTypes.includes(prop.type) ||
|
|
85
|
-
prop.type === "BooleanType" ||
|
|
86
|
-
prop.type === "boolean" ||
|
|
87
|
-
prop.type === "DateType" ||
|
|
88
|
-
prop.type === "Date" ||
|
|
89
|
-
prop.kind === "m:1" ||
|
|
90
|
-
prop.kind === "1:m" ||
|
|
91
|
-
prop.kind === "m:n" ||
|
|
92
|
-
prop.type === "EnumArrayType" ||
|
|
93
|
-
prop.type === "uuid") &&
|
|
94
|
-
!dedicatedResolverArgProps.some((dedicatedResolverArgProp) => dedicatedResolverArgProp.name == prop.name));
|
|
95
|
-
const hasFilterArg = crudFilterProps.length > 0;
|
|
96
|
-
const crudSortProps = metadata.props.filter((prop) => (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "sort") &&
|
|
97
|
-
!prop.name.startsWith("scope_") &&
|
|
98
|
-
(!prop.embedded || (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.embedded[0], "sort")) && // the whole embeddable has sort disabled
|
|
99
|
-
(prop.type === "string" ||
|
|
100
|
-
prop.type === "text" ||
|
|
101
|
-
prop.type === "DecimalType" ||
|
|
102
|
-
prop.type === "number" ||
|
|
103
|
-
constants_1.integerTypes.includes(prop.type) ||
|
|
104
|
-
prop.type === "BooleanType" ||
|
|
105
|
-
prop.type === "boolean" ||
|
|
106
|
-
prop.type === "DateType" ||
|
|
107
|
-
prop.type === "Date" ||
|
|
108
|
-
prop.kind === "m:1" ||
|
|
109
|
-
prop.type === "EnumArrayType" ||
|
|
110
|
-
prop.enum));
|
|
111
|
-
const hasSortArg = crudSortProps.length > 0;
|
|
112
|
-
const hasSlugProp = metadata.props.some((prop) => prop.name == "slug");
|
|
113
|
-
const scopeProp = metadata.props.find((prop) => prop.name == "scope");
|
|
114
|
-
if (scopeProp && !scopeProp.targetMeta)
|
|
115
|
-
throw new Error("Scope prop has no targetMeta");
|
|
116
|
-
const hasPositionProp = metadata.props.some((prop) => prop.name == "position");
|
|
117
|
-
const positionGroupPropNames = hasPositionProp
|
|
118
|
-
? ((_b = (_a = generatorOptions.position) === null || _a === void 0 ? void 0 : _a.groupByFields) !== null && _b !== void 0 ? _b : [
|
|
119
|
-
...(scopeProp ? [scopeProp.name] : []), // if there is a scope prop it's effecting position-group, if not groupByFields should be used
|
|
120
|
-
])
|
|
121
|
-
: [];
|
|
122
|
-
const positionGroupProps = hasPositionProp ? metadata.props.filter((prop) => positionGroupPropNames.includes(prop.name)) : [];
|
|
123
|
-
const scopedEntity = Reflect.getMetadata(cms_api_1.SCOPED_ENTITY_METADATA_KEY, metadata.class);
|
|
124
|
-
const skipScopeCheck = !scopeProp && !scopedEntity;
|
|
125
|
-
const argsClassName = `${classNameSingular != classNamePlural ? classNamePlural : `${classNamePlural}List`}Args`;
|
|
126
|
-
const argsFileName = `${fileNameSingular != fileNamePlural ? fileNamePlural : `${fileNameSingular}-list`}.args`;
|
|
127
|
-
const blockProps = metadata.props.filter((prop) => {
|
|
128
|
-
return (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "input") && prop.type === "RootBlockType";
|
|
129
|
-
});
|
|
130
|
-
return {
|
|
131
|
-
crudSearchPropNames,
|
|
132
|
-
hasSearchArg,
|
|
133
|
-
crudFilterProps,
|
|
134
|
-
hasFilterArg,
|
|
135
|
-
crudSortProps,
|
|
136
|
-
hasSortArg,
|
|
137
|
-
hasSlugProp,
|
|
138
|
-
hasPositionProp,
|
|
139
|
-
positionGroupProps,
|
|
140
|
-
scopeProp,
|
|
141
|
-
skipScopeCheck,
|
|
142
|
-
argsClassName,
|
|
143
|
-
argsFileName,
|
|
144
|
-
blockProps,
|
|
145
|
-
dedicatedResolverArgProps,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
57
|
+
const build_options_1 = require("./build-options");
|
|
148
58
|
function generateFilterDto({ generatorOptions, metadata }) {
|
|
149
59
|
const { classNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
150
|
-
const { crudFilterProps } = buildOptions(metadata, generatorOptions);
|
|
60
|
+
const { crudFilterProps } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
151
61
|
const imports = [];
|
|
152
62
|
let enumFiltersOut = "";
|
|
153
63
|
const generatedEnumNames = new Set();
|
|
@@ -304,7 +214,7 @@ function generateFilterDto({ generatorOptions, metadata }) {
|
|
|
304
214
|
}
|
|
305
215
|
function generateSortDto({ generatorOptions, metadata }) {
|
|
306
216
|
const { classNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
307
|
-
const { crudSortProps } = buildOptions(metadata, generatorOptions);
|
|
217
|
+
const { crudSortProps } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
308
218
|
const sortOut = `import { SortDirection } from "@comet/cms-api";
|
|
309
219
|
import { Field, InputType, registerEnumType } from "@nestjs/graphql";
|
|
310
220
|
import { Type } from "class-transformer";
|
|
@@ -313,7 +223,7 @@ function generateSortDto({ generatorOptions, metadata }) {
|
|
|
313
223
|
export enum ${classNameSingular}SortField {
|
|
314
224
|
${crudSortProps
|
|
315
225
|
.map((prop) => {
|
|
316
|
-
return `${prop.
|
|
226
|
+
return `${prop.replace(".", "_")} = "${prop.replace(".", "_")}",`;
|
|
317
227
|
})
|
|
318
228
|
.join("\n")}
|
|
319
229
|
}
|
|
@@ -348,7 +258,7 @@ function generatePaginatedDto({ generatorOptions, metadata }) {
|
|
|
348
258
|
}
|
|
349
259
|
function generateArgsDto({ generatorOptions, metadata }) {
|
|
350
260
|
const { classNameSingular, fileNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
351
|
-
const { scopeProp, argsClassName, hasSearchArg, hasSortArg, hasFilterArg, dedicatedResolverArgProps } = buildOptions(metadata, generatorOptions);
|
|
261
|
+
const { scopeProp, argsClassName, hasSearchArg, hasSortArg, hasFilterArg, dedicatedResolverArgProps } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
352
262
|
const imports = [];
|
|
353
263
|
if (scopeProp && scopeProp.targetMeta) {
|
|
354
264
|
imports.push(generateEntityImport(scopeProp.targetMeta, `${generatorOptions.targetDirectory}/dto`));
|
|
@@ -423,7 +333,7 @@ function generateArgsDto({ generatorOptions, metadata }) {
|
|
|
423
333
|
}
|
|
424
334
|
function generateService({ generatorOptions, metadata }) {
|
|
425
335
|
const { classNameSingular, fileNameSingular, classNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
426
|
-
const { hasPositionProp, positionGroupProps } = buildOptions(metadata, generatorOptions);
|
|
336
|
+
const { hasPositionProp, positionGroupProps } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
427
337
|
const positionGroupType = positionGroupProps.length
|
|
428
338
|
? `{ ${positionGroupProps
|
|
429
339
|
.map((prop) => {
|
|
@@ -494,7 +404,7 @@ function generateService({ generatorOptions, metadata }) {
|
|
|
494
404
|
${positionGroupProps.length
|
|
495
405
|
? `getPositionGroupCondition(group: ${positionGroupType}): FilterQuery<${metadata.className}> {
|
|
496
406
|
return {
|
|
497
|
-
${positionGroupProps.map((field) => `${field.name}:
|
|
407
|
+
${positionGroupProps.map((field) => `${field.name}: group.${field.name}`).join(",")}
|
|
498
408
|
};
|
|
499
409
|
}`
|
|
500
410
|
: ``}
|
|
@@ -512,7 +422,7 @@ function generateEntityImport(targetMetadata, relativeTo) {
|
|
|
512
422
|
}
|
|
513
423
|
function generateInputHandling(options, metadata, generatorOptions) {
|
|
514
424
|
const { instanceNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
515
|
-
const { blockProps, scopeProp, hasPositionProp, dedicatedResolverArgProps } = buildOptions(metadata, generatorOptions);
|
|
425
|
+
const { blockProps, scopeProp, hasPositionProp, dedicatedResolverArgProps } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
516
426
|
const props = metadata.props.filter((prop) => !options.excludeFields || !options.excludeFields.includes(prop.name));
|
|
517
427
|
const relationManyToOneProps = props.filter((prop) => prop.kind === "m:1");
|
|
518
428
|
const relationOneToManyProps = props.filter((prop) => prop.kind === "1:m");
|
|
@@ -667,7 +577,7 @@ ${options.mode == "update"
|
|
|
667
577
|
}
|
|
668
578
|
function generateNestedEntityResolver({ generatorOptions, metadata }) {
|
|
669
579
|
const { classNameSingular } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
670
|
-
const { skipScopeCheck } = buildOptions(metadata, generatorOptions);
|
|
580
|
+
const { skipScopeCheck } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
671
581
|
const imports = [];
|
|
672
582
|
const { imports: fieldImports, code, hasOutputRelations, needsBlocksTransformer, } = generateRelationsFieldResolver({ generatorOptions, metadata });
|
|
673
583
|
if (!hasOutputRelations)
|
|
@@ -780,7 +690,7 @@ function generateRelationsFieldResolver({ generatorOptions, metadata }) {
|
|
|
780
690
|
}
|
|
781
691
|
function generateResolver({ generatorOptions, metadata }) {
|
|
782
692
|
const { classNameSingular, fileNameSingular, instanceNameSingular, classNamePlural, fileNamePlural, instanceNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
783
|
-
const { scopeProp, skipScopeCheck, argsClassName, argsFileName, hasSlugProp, hasSearchArg, hasSortArg, hasFilterArg, hasPositionProp, positionGroupProps, dedicatedResolverArgProps, } = buildOptions(metadata, generatorOptions);
|
|
693
|
+
const { scopeProp, skipScopeCheck, argsClassName, argsFileName, hasSlugProp, hasSearchArg, hasSortArg, hasFilterArg, hasPositionProp, positionGroupProps, dedicatedResolverArgProps, } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
784
694
|
const relationManyToOneProps = metadata.props.filter((prop) => prop.kind === "m:1");
|
|
785
695
|
const relationOneToManyProps = metadata.props.filter((prop) => prop.kind === "1:m");
|
|
786
696
|
const relationManyToManyProps = metadata.props.filter((prop) => prop.kind === "m:n");
|
|
@@ -821,6 +731,7 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
821
731
|
imports.push({ name: "RootBlockDataScalar", importPath: "@comet/cms-api" });
|
|
822
732
|
imports.push({ name: "BlocksTransformerService", importPath: "@comet/cms-api" });
|
|
823
733
|
imports.push({ name: "gqlArgsToMikroOrmQuery", importPath: "@comet/cms-api" });
|
|
734
|
+
imports.push({ name: "gqlSortToMikroOrmOrderBy", importPath: "@comet/cms-api" });
|
|
824
735
|
const resolverOut = `import { EntityManager, FindOptions, ObjectQuery, Reference } from "@mikro-orm/postgresql";
|
|
825
736
|
import { Args, ID, Info, Mutation, Query, Resolver, ResolveField, Parent } from "@nestjs/graphql";
|
|
826
737
|
import { GraphQLResolveInfo } from "graphql";
|
|
@@ -908,11 +819,7 @@ function generateResolver({ generatorOptions, metadata }) {
|
|
|
908
819
|
|
|
909
820
|
${hasSortArg
|
|
910
821
|
? `if (sort) {
|
|
911
|
-
options.orderBy = sort
|
|
912
|
-
return {
|
|
913
|
-
[sortItem.field]: sortItem.direction,
|
|
914
|
-
};
|
|
915
|
-
});
|
|
822
|
+
options.orderBy = gqlSortToMikroOrmOrderBy(sort);
|
|
916
823
|
}`
|
|
917
824
|
: ""}
|
|
918
825
|
|
|
@@ -1066,7 +973,7 @@ function generateCrud(generatorOptionsParam, metadata) {
|
|
|
1066
973
|
}
|
|
1067
974
|
const generatedFiles = [];
|
|
1068
975
|
const { fileNameSingular, fileNamePlural } = (0, build_name_variants_1.buildNameVariants)(metadata);
|
|
1069
|
-
const { hasFilterArg, hasSortArg, argsFileName, hasPositionProp } = buildOptions(metadata, generatorOptions);
|
|
976
|
+
const { hasFilterArg, hasSortArg, argsFileName, hasPositionProp } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
1070
977
|
function generateCrudResolver() {
|
|
1071
978
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1072
979
|
if (hasFilterArg) {
|
|
@@ -13,7 +13,7 @@ exports.generateCrudInput = generateCrudInput;
|
|
|
13
13
|
const cms_api_1 = require("@comet/cms-api");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
15
|
const ts_morph_1 = require("ts-morph");
|
|
16
|
-
const
|
|
16
|
+
const build_options_1 = require("../generateCrud/build-options");
|
|
17
17
|
const build_name_variants_1 = require("../utils/build-name-variants");
|
|
18
18
|
const constants_1 = require("../utils/constants");
|
|
19
19
|
const generate_imports_code_1 = require("../utils/generate-imports-code");
|
|
@@ -51,7 +51,7 @@ function generateCrudInput(generatorOptions_1, metadata_1) {
|
|
|
51
51
|
}) {
|
|
52
52
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
53
53
|
const generatedFiles = [];
|
|
54
|
-
const { dedicatedResolverArgProps } = (0,
|
|
54
|
+
const { dedicatedResolverArgProps } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
|
|
55
55
|
const props = metadata.props
|
|
56
56
|
.filter((prop) => {
|
|
57
57
|
return !prop.embedded;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comet/api-generator",
|
|
3
|
-
"version": "9.0.0-canary-
|
|
3
|
+
"version": "9.0.0-canary-20251002064922",
|
|
4
4
|
"description": "Comet API Generator CLI tool",
|
|
5
5
|
"repository": {
|
|
6
6
|
"directory": "packages/api/api-generator",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"pluralize": "^8.0.0",
|
|
25
25
|
"ts-morph": "^25.0.1",
|
|
26
26
|
"ts-node": "^10.9.2",
|
|
27
|
-
"@comet/cms-api": "9.0.0-canary-
|
|
27
|
+
"@comet/cms-api": "9.0.0-canary-20251002064922"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@mikro-orm/cli": "^6.4.16",
|
|
@@ -37,14 +37,14 @@
|
|
|
37
37
|
"class-validator": "^0.14.2",
|
|
38
38
|
"eslint": "^9.30.1",
|
|
39
39
|
"jest": "^29.7.0",
|
|
40
|
-
"npm-run-all2": "^
|
|
40
|
+
"npm-run-all2": "^8.0.0",
|
|
41
41
|
"prettier": "^3.6.2",
|
|
42
42
|
"reflect-metadata": "^0.2.2",
|
|
43
43
|
"rimraf": "^6.0.1",
|
|
44
44
|
"ts-jest": "^29.4.0",
|
|
45
45
|
"typescript": "5.8.3",
|
|
46
46
|
"uuid": "^11.1.0",
|
|
47
|
-
"@comet/eslint-config": "9.0.0-canary-
|
|
47
|
+
"@comet/eslint-config": "9.0.0-canary-20251002064922"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"@mikro-orm/cli": "^6.0.0",
|