@comet/api-generator 8.20.2 → 9.0.0-beta.1

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.
@@ -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 importPath = (0, ts_morph_helper_1.findEnumImportPath)(enumName, `${generatorOptions.targetDirectory}/dto`, metadata);
91
- if (!generatedEnumsNames.has(enumName)) {
92
- generatedEnumsNames.add(enumName);
93
- enumFiltersOut += `@InputType()
94
- class ${enumName}EnumFilter extends createEnumFilter(${enumName}) {}
95
- `;
96
- imports.push({ name: enumName, importPath });
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
- return (0, generate_imports_code_1.generateImportsCode)(imports) + filterOut;
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(`${generatorOptions.targetDirectory}/dto`, metadata.path).replace(/\.ts$/, "")}";
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, `${generatorOptions.targetDirectory}/dto`));
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, generatorOptions.targetDirectory)])}
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, generatorOptions.targetDirectory));
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, generatorOptions.targetDirectory));
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, generatorOptions.targetDirectory));
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, generatorOptions.targetDirectory));
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, generatorOptions.targetDirectory));
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, `${generatorOptions.targetDirectory}`, metadata);
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, hasOutputRelations, needsBlocksTransformer, } = generateRelationsFieldResolver({
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, generatorOptions.targetDirectory));
737
+ imports.push(generateEntityImport(metadata, targetDirectory));
756
738
  if (scopeProp && scopeProp.targetMeta) {
757
- imports.push(generateEntityImport(scopeProp.targetMeta, generatorOptions.targetDirectory));
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, Info, Mutation, Query, Resolver, ResolveField, Parent } from "@nestjs/graphql";
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
- ${hasOutputRelations
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,2 @@
1
+ import { type GeneratedFile } from "../utils/write-generated-files";
2
+ export declare function generateEnumFilterDto(type: "enum" | "enums", enumName: string, enumPath: string): GeneratedFile;
@@ -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, `${generatorOptions.targetDirectory}/dto`, metadata);
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, `${generatorOptions.targetDirectory}/dto`, metadata);
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, `${generatorOptions.targetDirectory}/dto`, metadata);
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, `${generatorOptions.targetDirectory}/dto`, metadata);
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(), `${generatorOptions.targetDirectory}/dto`, metadata);
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, `${generatorOptions.targetDirectory}/dto`, metadata);
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(), `${generatorOptions.targetDirectory}/dto`, metadata);
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, `${generatorOptions.targetDirectory}/dto`, metadata);
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(), generatorOptions, metadata);
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(generatorOptions.targetDirectory, metadata.path).replace(/\.ts$/, "")}";
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(generatorOptions.targetDirectory, metadata.path).replace(/\.ts$/, "")}";
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 cms_api_1 = require("@comet/cms-api");
20
20
  const cli_1 = require("@mikro-orm/cli");
21
21
  const lazy_metadata_storage_1 = require("@nestjs/graphql/dist/schema-builder/storages/lazy-metadata.storage");
22
22
  const prettier_1 = require("prettier");
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");
@@ -59,8 +60,9 @@ file) => __awaiter(void 0, void 0, void 0, function* () {
59
60
  if (generatorOptions) {
60
61
  node_console_1.default.log(`🚀 start generateCrud for Entity ${entity.path}`);
61
62
  const files = yield (0, generate_crud_1.generateCrud)(generatorOptions, entity);
62
- yield (0, write_generated_files_1.writeGeneratedFiles)(files, { targetDirectory: generatorOptions.targetDirectory });
63
- writtenFiles.push(...files.map((f) => (0, node_fs_1.realpathSync)(`${generatorOptions.targetDirectory}/${f.name}`)));
63
+ const { targetDirectory } = (0, build_options_1.buildOptions)(entity, generatorOptions);
64
+ yield (0, write_generated_files_1.writeGeneratedFiles)(files, targetDirectory);
65
+ writtenFiles.push(...files.map((f) => { var _a; return (0, node_fs_1.realpathSync)(`${(_a = f.targetDirectory) !== null && _a !== void 0 ? _a : targetDirectory}/${f.name}`); }));
64
66
  }
65
67
  }
66
68
  {
@@ -68,8 +70,9 @@ file) => __awaiter(void 0, void 0, void 0, function* () {
68
70
  if (generatorOptions) {
69
71
  node_console_1.default.log(`🚀 start generateCrudSingle for Entity ${entity.path}`);
70
72
  const files = yield (0, generate_crud_single_1.generateCrudSingle)(generatorOptions, entity);
71
- yield (0, write_generated_files_1.writeGeneratedFiles)(files, { targetDirectory: generatorOptions.targetDirectory });
72
- writtenFiles.push(...files.map((f) => (0, node_fs_1.realpathSync)(`${generatorOptions.targetDirectory}/${f.name}`)));
73
+ const { targetDirectory } = (0, build_options_1.buildOptions)(entity, generatorOptions);
74
+ yield (0, write_generated_files_1.writeGeneratedFiles)(files, targetDirectory);
75
+ writtenFiles.push(...files.map((f) => { var _a; return (0, node_fs_1.realpathSync)(`${(_a = f.targetDirectory) !== null && _a !== void 0 ? _a : targetDirectory}/${f.name}`); }));
73
76
  }
74
77
  }
75
78
  }
@@ -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<any>;
6
+ metadata: EntityMetadata;
7
+ targetDirectory: string;
7
8
  }): {
8
9
  validateCreateInput: {
9
- options: string[];
10
+ options?: string[];
10
11
  returnType: string;
11
- } | {
12
- returnType: string;
13
- options?: undefined;
14
12
  } | null;
15
13
  validateUpdateInput: {
16
- options: string[];
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
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
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, generatorOptions.targetDirectory, metadata);
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, generatorOptions.targetDirectory);
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, generatorOptions.targetDirectory);
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, generatorOptions: {
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, generatorOptions, metadata) {
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(`${generatorOptions.targetDirectory}/dto`, metadata.path).replace(/\.ts$/, "");
155
+ return path.relative(`${targetDirectory}/dto`, metadata.path).replace(/\.ts$/, "");
156
156
  }
157
157
  else {
158
- const { importPath } = findImportPathOrThrow(validatorName, generatorOptions.targetDirectory, metadata);
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[], options: {
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, options) {
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)(`${options.targetDirectory}/${file.name}`, file.content);
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": "8.20.2",
3
+ "version": "9.0.0-beta.1",
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": "8.20.2"
28
+ "@comet/cms-api": "9.0.0-beta.1"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@mikro-orm/cli": "^6.4.16",
@@ -33,7 +33,7 @@
33
33
  "@mikro-orm/postgresql": "^6.4.16",
34
34
  "@nestjs/graphql": "^13.2.3",
35
35
  "@types/jest": "^29.5.14",
36
- "@types/node": "^24.10.9",
36
+ "@types/node": "^24.12.0",
37
37
  "@types/pluralize": "^0.0.33",
38
38
  "class-validator": "^0.14.3",
39
39
  "eslint": "^9.39.2",
@@ -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": "8.20.2"
47
+ "@comet/eslint-config": "9.0.0-beta.1"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@mikro-orm/cli": "^6.0.0",