@comet/api-generator 9.0.0-beta.2 → 9.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/lib/commands/generate/generate-command.js +4 -13
  2. package/lib/commands/generate/generateCrud/build-options.d.ts +1 -1
  3. package/lib/commands/generate/generateCrud/build-options.js +3 -3
  4. package/lib/commands/generate/generateCrud/generate-crud.d.ts +1 -1
  5. package/lib/commands/generate/generateCrud/generate-crud.js +109 -104
  6. package/lib/commands/generate/generateCrud/generate-enum-filter-dto.d.ts +1 -1
  7. package/lib/commands/generate/generateCrud/generate-payload-object-types.d.ts +2 -2
  8. package/lib/commands/generate/generateCrud/generate-payload-object-types.js +2 -3
  9. package/lib/commands/generate/generateCrud/generate-service-hook-call.d.ts +2 -2
  10. package/lib/commands/generate/generateCrud/generate-service-hook-call.js +8 -7
  11. package/lib/commands/generate/generateCrudInput/generate-crud-input.d.ts +2 -2
  12. package/lib/commands/generate/generateCrudInput/generate-crud-input.js +381 -388
  13. package/lib/commands/generate/generateCrudSingle/generate-crud-single.d.ts +2 -2
  14. package/lib/commands/generate/generateCrudSingle/generate-crud-single.js +29 -41
  15. package/lib/commands/generate/generateFiles.js +17 -26
  16. package/lib/commands/generate/utils/build-name-variants.d.ts +1 -1
  17. package/lib/commands/generate/utils/find-hooks-service.d.ts +3 -3
  18. package/lib/commands/generate/utils/find-hooks-service.js +3 -6
  19. package/lib/commands/generate/utils/ts-morph-helper.d.ts +1 -1
  20. package/lib/commands/generate/utils/ts-morph-helper.js +23 -19
  21. package/lib/commands/generate/utils/write-generated-file.js +12 -23
  22. package/lib/commands/generate/utils/write-generated-files.js +4 -16
  23. package/lib/commands/generate/watchMode/handleChildProcess.d.ts +1 -1
  24. package/lib/commands/generate/watchMode/watchMode.js +6 -15
  25. package/package.json +8 -8
@@ -1,4 +1,4 @@
1
1
  import { type CrudSingleGeneratorOptions } from "@comet/cms-api";
2
- import { type EntityMetadata } from "@mikro-orm/postgresql";
3
- import { type GeneratedFile } from "../utils/write-generated-files";
2
+ import type { EntityMetadata } from "@mikro-orm/postgresql";
3
+ import type { GeneratedFile } from "../utils/write-generated-files";
4
4
  export declare function generateCrudSingle(generatorOptions: CrudSingleGeneratorOptions, metadata: EntityMetadata<any>): Promise<GeneratedFile[]>;
@@ -32,15 +32,6 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
- return new (P || (P = Promise))(function (resolve, reject) {
38
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
- step((generator = generator.apply(thisArg, _arguments || [])).next());
42
- });
43
- };
44
35
  Object.defineProperty(exports, "__esModule", { value: true });
45
36
  exports.generateCrudSingle = generateCrudSingle;
46
37
  const cms_api_1 = require("@comet/cms-api");
@@ -48,25 +39,24 @@ const path = __importStar(require("path"));
48
39
  const build_options_1 = require("../generateCrud/build-options");
49
40
  const generate_crud_input_1 = require("../generateCrudInput/generate-crud-input");
50
41
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
- function generateCrudSingle(generatorOptions, metadata) {
52
- return __awaiter(this, void 0, void 0, function* () {
53
- const classNameSingular = metadata.className;
54
- const classNamePlural = !metadata.className.endsWith("s") ? `${metadata.className}s` : metadata.className;
55
- const instanceNameSingular = classNameSingular[0].toLocaleLowerCase() + classNameSingular.slice(1);
56
- const instanceNamePlural = classNamePlural[0].toLocaleLowerCase() + classNamePlural.slice(1);
57
- const fileNameSingular = instanceNameSingular.replace(/[A-Z]/g, (i) => `-${i.toLocaleLowerCase()}`);
58
- const fileNamePlural = instanceNamePlural.replace(/[A-Z]/g, (i) => `-${i.toLocaleLowerCase()}`);
59
- const { targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
60
- function generateCrudResolver() {
61
- return __awaiter(this, void 0, void 0, function* () {
62
- const generatedFiles = [];
63
- const scopeProp = metadata.props.find((prop) => prop.name == "scope");
64
- if (scopeProp && !scopeProp.targetMeta)
65
- throw new Error("Scope prop has no targetMeta");
66
- const blockProps = metadata.props.filter((prop) => {
67
- return (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "input") && prop.type === "RootBlockType";
68
- });
69
- const serviceOut = `import { ObjectQuery } from "@mikro-orm/postgresql";
42
+ async function generateCrudSingle(generatorOptions, metadata) {
43
+ const classNameSingular = metadata.className;
44
+ const classNamePlural = !metadata.className.endsWith("s") ? `${metadata.className}s` : metadata.className;
45
+ const instanceNameSingular = classNameSingular[0].toLocaleLowerCase() + classNameSingular.slice(1);
46
+ const instanceNamePlural = classNamePlural[0].toLocaleLowerCase() + classNamePlural.slice(1);
47
+ const fileNameSingular = instanceNameSingular.replace(/[A-Z]/g, (i) => `-${i.toLocaleLowerCase()}`);
48
+ const fileNamePlural = instanceNamePlural.replace(/[A-Z]/g, (i) => `-${i.toLocaleLowerCase()}`);
49
+ const { targetDirectory } = (0, build_options_1.buildOptions)(metadata, generatorOptions);
50
+ async function generateCrudResolver() {
51
+ const generatedFiles = [];
52
+ const scopeProp = metadata.props.find((prop) => prop.name == "scope");
53
+ if (scopeProp && !scopeProp.targetMeta) {
54
+ throw new Error("Scope prop has no targetMeta");
55
+ }
56
+ const blockProps = metadata.props.filter((prop) => {
57
+ return (0, cms_api_1.hasCrudFieldFeature)(metadata.class, prop.name, "input") && prop.type === "RootBlockType";
58
+ });
59
+ const serviceOut = `import { ObjectQuery } from "@mikro-orm/postgresql";
70
60
  import { Injectable } from "@nestjs/common";
71
61
  import { ${metadata.className} } from "${path.relative(targetDirectory, metadata.path).replace(/\.ts$/, "")}";
72
62
 
@@ -75,15 +65,15 @@ function generateCrudSingle(generatorOptions, metadata) {
75
65
 
76
66
  }
77
67
  `;
78
- generatedFiles.push({ name: `${fileNamePlural}.service.ts`, content: serviceOut, type: "service" });
79
- const resolverOut = `import { FindOptions, EntityManager } from "@mikro-orm/postgresql";
68
+ generatedFiles.push({ name: `${fileNamePlural}.service.ts`, content: serviceOut, type: "service" });
69
+ const resolverOut = `import { FindOptions, EntityManager } from "@mikro-orm/postgresql";
80
70
  import { Args, ID, Mutation, Query, Resolver } from "@nestjs/graphql";
81
71
  import { RequiredPermission, SortDirection, validateNotModified } from "@comet/cms-api";
82
72
 
83
73
  import { ${metadata.className} } from "${path.relative(targetDirectory, metadata.path).replace(/\.ts$/, "")}";
84
74
  ${scopeProp && scopeProp.targetMeta
85
- ? `import { ${scopeProp.targetMeta.className} } from "${path.relative(targetDirectory, scopeProp.targetMeta.path).replace(/\.ts$/, "")}";`
86
- : ""}
75
+ ? `import { ${scopeProp.targetMeta.className} } from "${path.relative(targetDirectory, scopeProp.targetMeta.path).replace(/\.ts$/, "")}";`
76
+ : ""}
87
77
  import { ${classNamePlural}Service } from "./${fileNamePlural}.service";
88
78
  import { ${classNameSingular}Input } from "./dto/${fileNameSingular}.input";
89
79
 
@@ -133,13 +123,11 @@ function generateCrudSingle(generatorOptions, metadata) {
133
123
  }
134
124
  }
135
125
  `;
136
- generatedFiles.push({ name: `${fileNameSingular}.resolver.ts`, content: resolverOut, type: "resolver" });
137
- return generatedFiles;
138
- });
139
- }
140
- return [
141
- ...(yield (0, generate_crud_input_1.generateCrudInput)(generatorOptions, metadata, { nested: false, excludeFields: [], generateUpdateInput: false })),
142
- ...(yield generateCrudResolver()),
143
- ];
144
- });
126
+ generatedFiles.push({ name: `${fileNameSingular}.resolver.ts`, content: resolverOut, type: "resolver" });
127
+ return generatedFiles;
128
+ }
129
+ return [
130
+ ...(await (0, generate_crud_input_1.generateCrudInput)(generatorOptions, metadata, { nested: false, excludeFields: [], generateUpdateInput: false })),
131
+ ...(await generateCrudResolver()),
132
+ ];
145
133
  }
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
@@ -18,7 +9,7 @@ const node_fs_1 = require("node:fs");
18
9
  const promises_1 = require("node:fs/promises");
19
10
  const cms_api_1 = require("@comet/cms-api");
20
11
  const cli_1 = require("@mikro-orm/cli");
21
- const lazy_metadata_storage_1 = require("@nestjs/graphql/dist/schema-builder/storages/lazy-metadata.storage");
12
+ const lazy_metadata_storage_js_1 = require("@nestjs/graphql/dist/schema-builder/storages/lazy-metadata.storage.js");
22
13
  const prettier_1 = require("prettier");
23
14
  const build_options_1 = require("./generateCrud/build-options");
24
15
  const generate_crud_1 = require("./generateCrud/generate-crud");
@@ -30,16 +21,16 @@ const write_generated_files_1 = require("./utils/write-generated-files");
30
21
  * Generates CRUD files for all entities or a specific entity available at file path.
31
22
  * @param file
32
23
  */
33
- const generateFiles = (
24
+ const generateFiles = async (
34
25
  /**
35
26
  * File path to the entity for which to generate CRUD files.
36
27
  *
37
28
  * @default undefined -> generate all entities
38
29
  */
39
- file) => __awaiter(void 0, void 0, void 0, function* () {
30
+ file) => {
40
31
  let orm = null;
41
32
  try {
42
- orm = yield cli_1.CLIHelper.getORM(undefined, undefined, { dbName: "generator" });
33
+ orm = await cli_1.CLIHelper.getORM(undefined, undefined, { dbName: "generator" });
43
34
  }
44
35
  catch (e) {
45
36
  node_console_1.default.warn(e);
@@ -47,7 +38,7 @@ file) => __awaiter(void 0, void 0, void 0, function* () {
47
38
  if (orm != null) {
48
39
  const writtenFiles = [];
49
40
  const entities = orm.em.getMetadata().getAll();
50
- lazy_metadata_storage_1.LazyMetadataStorage.load();
41
+ lazy_metadata_storage_js_1.LazyMetadataStorage.load();
51
42
  for (const name in entities) {
52
43
  const entity = entities[name];
53
44
  if (!entity.class) {
@@ -59,32 +50,32 @@ file) => __awaiter(void 0, void 0, void 0, function* () {
59
50
  const generatorOptions = Reflect.getMetadata(cms_api_1.CRUD_GENERATOR_METADATA_KEY, entity.class);
60
51
  if (generatorOptions) {
61
52
  node_console_1.default.log(`🚀 start generateCrud for Entity ${entity.path}`);
62
- const files = yield (0, generate_crud_1.generateCrud)(generatorOptions, entity);
53
+ const files = await (0, generate_crud_1.generateCrud)(generatorOptions, entity);
63
54
  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}`); }));
55
+ await (0, write_generated_files_1.writeGeneratedFiles)(files, targetDirectory);
56
+ writtenFiles.push(...files.map((f) => (0, node_fs_1.realpathSync)(`${f.targetDirectory ?? targetDirectory}/${f.name}`)));
66
57
  }
67
58
  }
68
59
  {
69
60
  const generatorOptions = Reflect.getMetadata(cms_api_1.CRUD_SINGLE_GENERATOR_METADATA_KEY, entity.class);
70
61
  if (generatorOptions) {
71
62
  node_console_1.default.log(`🚀 start generateCrudSingle for Entity ${entity.path}`);
72
- const files = yield (0, generate_crud_single_1.generateCrudSingle)(generatorOptions, entity);
63
+ const files = await (0, generate_crud_single_1.generateCrudSingle)(generatorOptions, entity);
73
64
  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}`); }));
65
+ await (0, write_generated_files_1.writeGeneratedFiles)(files, targetDirectory);
66
+ writtenFiles.push(...files.map((f) => (0, node_fs_1.realpathSync)(`${f.targetDirectory ?? targetDirectory}/${f.name}`)));
76
67
  }
77
68
  }
78
69
  }
79
70
  }
80
71
  if (writtenFiles.length > 0) {
81
72
  node_console_1.default.log(`Formatting ${writtenFiles.length} generated files...`);
82
- yield Promise.all(writtenFiles.map((filepath) => __awaiter(void 0, void 0, void 0, function* () {
83
- const [content, options] = yield Promise.all([(0, promises_1.readFile)(filepath, "utf-8"), (0, prettier_1.resolveConfig)(filepath)]);
84
- const formatted = yield (0, prettier_1.format)(content, Object.assign(Object.assign({}, options), { filepath }));
85
- yield (0, promises_1.writeFile)(filepath, formatted);
86
- })));
73
+ await Promise.all(writtenFiles.map(async (filepath) => {
74
+ const [content, options] = await Promise.all([(0, promises_1.readFile)(filepath, "utf-8"), (0, prettier_1.resolveConfig)(filepath)]);
75
+ const formatted = await (0, prettier_1.format)(content, { ...options, filepath });
76
+ await (0, promises_1.writeFile)(filepath, formatted);
77
+ }));
87
78
  }
88
79
  }
89
- });
80
+ };
90
81
  exports.generateFiles = generateFiles;
@@ -1,4 +1,4 @@
1
- import { type EntityMetadata } from "@mikro-orm/postgresql";
1
+ import type { EntityMetadata } from "@mikro-orm/postgresql";
2
2
  export declare function buildNameVariants(metadata: EntityMetadata<any>): {
3
3
  classNameSingular: string;
4
4
  classNamePlural: string;
@@ -1,6 +1,6 @@
1
- import { type CrudGeneratorOptions } from "@comet/cms-api";
2
- import { type EntityMetadata } from "@mikro-orm/core";
3
- import { type Imports } from "./generate-imports-code";
1
+ import type { CrudGeneratorOptions } from "@comet/cms-api";
2
+ import type { EntityMetadata } from "@mikro-orm/core";
3
+ import type { Imports } from "./generate-imports-code";
4
4
  export declare function findHooksService({ generatorOptions, metadata, targetDirectory, }: {
5
5
  generatorOptions: CrudGeneratorOptions;
6
6
  metadata: EntityMetadata;
@@ -38,8 +38,7 @@ const path = __importStar(require("path"));
38
38
  const ts_morph_1 = require("ts-morph");
39
39
  const ts_morph_helper_1 = require("./ts-morph-helper");
40
40
  function findReturnTypeImport(type, serviceSourceFile, targetDirectory) {
41
- var _a;
42
- const symbol = (_a = type.getSymbol()) !== null && _a !== void 0 ? _a : type.getAliasSymbol();
41
+ const symbol = type.getSymbol() ?? type.getAliasSymbol();
43
42
  if (!symbol) {
44
43
  // Primitive type, no import needed
45
44
  return null;
@@ -68,8 +67,7 @@ function findReturnTypeImport(type, serviceSourceFile, targetDirectory) {
68
67
  }
69
68
  }
70
69
  function unwrapPromiseType(type) {
71
- var _a;
72
- if (((_a = type.getSymbol()) === null || _a === void 0 ? void 0 : _a.getName()) === "Promise") {
70
+ if (type.getSymbol()?.getName() === "Promise") {
73
71
  const typeArgs = type.getTypeArguments();
74
72
  if (typeArgs.length > 0) {
75
73
  return typeArgs[0];
@@ -84,7 +82,6 @@ function unwrapArrayType(type) {
84
82
  throw new Error(`Return type must be an array`);
85
83
  }
86
84
  function findHooksService({ generatorOptions, metadata, targetDirectory, }) {
87
- var _a;
88
85
  if (!generatorOptions.hooksService) {
89
86
  return null;
90
87
  }
@@ -122,7 +119,7 @@ function findHooksService({ generatorOptions, metadata, targetDirectory, }) {
122
119
  imports.push({ name: hooksServiceClassName, importPath });
123
120
  }
124
121
  const serviceClassRef = initializer.getSymbolOrThrow();
125
- const serviceClassDeclaration = ((_a = serviceClassRef.getAliasedSymbol()) !== null && _a !== void 0 ? _a : serviceClassRef).getDeclarations().find(ts_morph_1.Node.isClassDeclaration);
122
+ const serviceClassDeclaration = (serviceClassRef.getAliasedSymbol() ?? serviceClassRef).getDeclarations().find(ts_morph_1.Node.isClassDeclaration);
126
123
  if (!serviceClassDeclaration) {
127
124
  throw new Error("hooksService class declaration not found");
128
125
  }
@@ -1,4 +1,4 @@
1
- import { type EntityMetadata } from "@mikro-orm/postgresql";
1
+ import type { EntityMetadata } from "@mikro-orm/postgresql";
2
2
  import { ClassDeclaration } from "ts-morph";
3
3
  export declare function morphTsClass(metadata: EntityMetadata<any>): ClassDeclaration;
4
4
  export declare function morphTsProperty(name: string, metadata: EntityMetadata<any>): import("ts-morph").PropertyDeclaration;
@@ -52,33 +52,35 @@ const project = new ts_morph_1.Project({
52
52
  });
53
53
  function morphTsSource(metadata) {
54
54
  let tsSource = project.getSourceFile(metadata.path);
55
- if (!tsSource)
55
+ if (!tsSource) {
56
56
  tsSource = project.addSourceFileAtPath(metadata.path);
57
+ }
57
58
  return tsSource;
58
59
  }
59
60
  function morphTsClass(metadata) {
60
61
  const tsSource = morphTsSource(metadata);
61
62
  const tsClass = tsSource.getClass(metadata.className);
62
- if (!tsClass)
63
+ if (!tsClass) {
63
64
  throw new Error(`Class ${metadata.className} not found in ${metadata.path}`);
65
+ }
64
66
  return tsClass;
65
67
  }
66
68
  function morphTsProperty(name, metadata) {
67
69
  let currentClass = morphTsClass(metadata);
68
70
  while (currentClass) {
69
71
  const prop = currentClass.getProperty(name);
70
- if (prop)
72
+ if (prop) {
71
73
  return prop;
74
+ }
72
75
  currentClass = currentClass.getBaseClass();
73
76
  }
74
77
  throw new Error(`Property ${name} not found in ${metadata.className}`);
75
78
  }
76
79
  function findImportPath(importName, targetDirectory, metadata) {
77
- var _a;
78
80
  const tsSource = morphTsSource(metadata);
79
81
  for (const tsImport of tsSource.getImportDeclarations()) {
80
82
  for (const namedImport of tsImport.getNamedImports()) {
81
- if (((_a = namedImport.getAliasNode()) === null || _a === void 0 ? void 0 : _a.getText()) == importName) {
83
+ if (namedImport.getAliasNode()?.getText() == importName) {
82
84
  throw new Error("Aliased enum import is not supported");
83
85
  }
84
86
  if (namedImport.getNameNode().getText() == importName) {
@@ -88,8 +90,9 @@ function findImportPath(importName, targetDirectory, metadata) {
88
90
  throw new Error(`Can't resolve import ${importPath}`);
89
91
  }
90
92
  const exportedDeclarations = importSource.getExportedDeclarations().get(importName);
91
- if (!exportedDeclarations)
93
+ if (!exportedDeclarations) {
92
94
  throw new Error(`Can't get exported declaration for ${importName}`);
95
+ }
93
96
  const exportedDeclaration = exportedDeclarations[0];
94
97
  if (importPath.startsWith("./") || importPath.startsWith("../")) {
95
98
  const absolutePath = path.resolve(path.dirname(metadata.path), importPath);
@@ -129,11 +132,10 @@ function findEnumName(propertyName, metadata) {
129
132
  .replace(/\[\]$/, "");
130
133
  }
131
134
  function findEnumImportPath(enumName, targetDirectory, metadata) {
132
- var _a;
133
135
  const tsSource = morphTsSource(metadata);
134
136
  if (tsSource.getEnum(enumName)) {
135
137
  //enum defined in same file as entity
136
- if (!((_a = tsSource.getEnum(enumName)) === null || _a === void 0 ? void 0 : _a.isExported())) {
138
+ if (!tsSource.getEnum(enumName)?.isExported()) {
137
139
  throw new Error(`Enum ${enumName} is not exported in ${metadata.path}`);
138
140
  }
139
141
  return path.relative(targetDirectory, metadata.path).replace(/\.ts$/, "");
@@ -145,11 +147,10 @@ function findEnumImportPath(enumName, targetDirectory, metadata) {
145
147
  }
146
148
  }
147
149
  function findValidatorImportPath(validatorName, targetDirectory, metadata) {
148
- var _a, _b;
149
150
  const tsSource = morphTsSource(metadata);
150
151
  //validator defined in same file as entity
151
152
  if (tsSource.getVariableDeclaration(validatorName) || tsSource.getFunction(validatorName)) {
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
+ if (!(tsSource.getVariableDeclaration(validatorName)?.isExported() || tsSource.getFunction(validatorName)?.isExported())) {
153
154
  throw new Error(`Validator ${validatorName} is not exported in ${metadata.path}`);
154
155
  }
155
156
  return path.relative(`${targetDirectory}/dto`, metadata.path).replace(/\.ts$/, "");
@@ -161,19 +162,20 @@ function findValidatorImportPath(validatorName, targetDirectory, metadata) {
161
162
  }
162
163
  function findBlockName(propertyName, metadata) {
163
164
  const tsProp = morphTsProperty(propertyName, metadata);
164
- if (!tsProp)
165
+ if (!tsProp) {
165
166
  throw new Error("property not found");
167
+ }
166
168
  const rootBlockDecorator = tsProp.getDecorators().find((i) => i.getName() == "RootBlock");
167
- if (!rootBlockDecorator)
169
+ if (!rootBlockDecorator) {
168
170
  throw new Error(`RootBlock decorator not found for property ${propertyName}`);
171
+ }
169
172
  return rootBlockDecorator.getArguments()[0].getText();
170
173
  }
171
174
  function findBlockImportPath(blockName, targetDirectory, metadata) {
172
- var _a;
173
175
  const tsSource = morphTsSource(metadata);
174
176
  if (tsSource.getVariableDeclaration(blockName)) {
175
177
  //block defined in same file as entity
176
- if (!((_a = tsSource.getVariableDeclaration(blockName)) === null || _a === void 0 ? void 0 : _a.isExported())) {
178
+ if (!tsSource.getVariableDeclaration(blockName)?.isExported()) {
177
179
  throw new Error(`Block ${blockName} is not exported in ${metadata.path}`);
178
180
  }
179
181
  return path.relative(targetDirectory, metadata.path).replace(/\.ts$/, "");
@@ -185,13 +187,12 @@ function findBlockImportPath(blockName, targetDirectory, metadata) {
185
187
  }
186
188
  }
187
189
  function findInputClassImportPath(className, targetDirectory, metadata) {
188
- var _a;
189
190
  const tsSource = morphTsSource(metadata);
190
191
  let returnImportPath;
191
192
  let classDeclaration;
192
193
  if (tsSource.getClass(className)) {
193
194
  //block defined in same file as entity
194
- if (!((_a = tsSource.getClass(className)) === null || _a === void 0 ? void 0 : _a.isExported())) {
195
+ if (!tsSource.getClass(className)?.isExported()) {
195
196
  throw new Error(`Class ${className} is not exported in ${metadata.path}`);
196
197
  }
197
198
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
@@ -219,14 +220,17 @@ function getFieldDecoratorClassName(propertyName, metadata) {
219
220
  return false;
220
221
  }
221
222
  const typeFnArg = fieldDecorator.getArguments()[0];
222
- if (!typeFnArg)
223
+ if (!typeFnArg) {
223
224
  throw new Error(`${propertyName}: @Field is missing argument`);
224
- if (typeFnArg.getKind() != ts_morph_1.SyntaxKind.ArrowFunction)
225
+ }
226
+ if (typeFnArg.getKind() != ts_morph_1.SyntaxKind.ArrowFunction) {
225
227
  throw new Error(`${propertyName}: @Field first argument must be an ArrowFunction`);
228
+ }
226
229
  const typeReturningArrowFunction = typeFnArg;
227
230
  const body = typeReturningArrowFunction.getBody();
228
- if (body.getKind() != ts_morph_1.SyntaxKind.Identifier)
231
+ if (body.getKind() != ts_morph_1.SyntaxKind.Identifier) {
229
232
  throw new Error(`${propertyName}: @Field first argument must be an ArrowFunction returning an Identifier`);
233
+ }
230
234
  const identifier = body;
231
235
  const className = identifier.getText();
232
236
  return className;
@@ -32,15 +32,6 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
- return new (P || (P = Promise))(function (resolve, reject) {
38
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
- step((generator = generator.apply(thisArg, _arguments || [])).next());
42
- });
43
- };
44
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
45
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
46
37
  };
@@ -50,23 +41,21 @@ exports.removeUnusedImports = removeUnusedImports;
50
41
  const fs_1 = require("fs");
51
42
  const path = __importStar(require("path"));
52
43
  const typescript_1 = __importDefault(require("typescript"));
53
- function writeGeneratedFile(filePath, contents) {
54
- return __awaiter(this, void 0, void 0, function* () {
55
- const header = `// This file has been generated by comet api-generator.
44
+ async function writeGeneratedFile(filePath, contents) {
45
+ const header = `// This file has been generated by comet api-generator.
56
46
  // You may choose to use this file as scaffold by moving this file out of generated folder and removing this comment.
57
47
  `;
58
- yield fs_1.promises.mkdir(path.dirname(filePath), { recursive: true });
59
- const sourceFile = typescript_1.default.createSourceFile(filePath, header + contents, typescript_1.default.ScriptTarget.ES2024, true, typescript_1.default.ScriptKind.TS);
60
- const result = typescript_1.default.transform(sourceFile, [removeUnusedImports()]);
61
- const printer = typescript_1.default.createPrinter({
62
- newLine: typescript_1.default.NewLineKind.LineFeed,
63
- removeComments: false,
64
- });
65
- const prettyCode = printer.printFile(result.transformed[0]);
66
- result.dispose();
67
- yield fs_1.promises.writeFile(filePath, prettyCode);
68
- console.log(`generated ${filePath}`);
48
+ await fs_1.promises.mkdir(path.dirname(filePath), { recursive: true });
49
+ const sourceFile = typescript_1.default.createSourceFile(filePath, header + contents, typescript_1.default.ScriptTarget.ES2024, true, typescript_1.default.ScriptKind.TS);
50
+ const result = typescript_1.default.transform(sourceFile, [removeUnusedImports()]);
51
+ const printer = typescript_1.default.createPrinter({
52
+ newLine: typescript_1.default.NewLineKind.LineFeed,
53
+ removeComments: false,
69
54
  });
55
+ const prettyCode = printer.printFile(result.transformed[0]);
56
+ result.dispose();
57
+ await fs_1.promises.writeFile(filePath, prettyCode);
58
+ console.log(`generated ${filePath}`);
70
59
  }
71
60
  function removeUnusedImports() {
72
61
  return (context) => {
@@ -1,21 +1,9 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.writeGeneratedFiles = writeGeneratedFiles;
13
4
  const write_generated_file_1 = require("./write-generated-file");
14
- function writeGeneratedFiles(files, targetDirectory) {
15
- return __awaiter(this, void 0, void 0, function* () {
16
- var _a;
17
- for (const file of files) {
18
- yield (0, write_generated_file_1.writeGeneratedFile)(`${(_a = file.targetDirectory) !== null && _a !== void 0 ? _a : targetDirectory}/${file.name}`, file.content);
19
- }
20
- });
5
+ async function writeGeneratedFiles(files, targetDirectory) {
6
+ for (const file of files) {
7
+ await (0, write_generated_file_1.writeGeneratedFile)(`${file.targetDirectory ?? targetDirectory}/${file.name}`, file.content);
8
+ }
21
9
  }
@@ -1,2 +1,2 @@
1
- import { type ChildProcessWithoutNullStreams } from "child_process";
1
+ import type { ChildProcessWithoutNullStreams } from "child_process";
2
2
  export declare function handleChildProcess(child: ChildProcessWithoutNullStreams): Promise<string>;
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
@@ -29,7 +20,7 @@ const waitForExit = (proc) => {
29
20
  *
30
21
  * Watches the `src` directory for changes and triggers child processes of generator for the changed file, to process it.
31
22
  */
32
- const watchMode = () => __awaiter(void 0, void 0, void 0, function* () {
23
+ const watchMode = async () => {
33
24
  /**
34
25
  * Collection of last ChildProcesses for each file
35
26
  */
@@ -40,19 +31,19 @@ const watchMode = () => __awaiter(void 0, void 0, void 0, function* () {
40
31
  pollInterval: 200,
41
32
  },
42
33
  ignored: (path, stats) => {
43
- if (stats === null || stats === void 0 ? void 0 : stats.isFile()) {
34
+ if (stats?.isFile()) {
44
35
  return !path.endsWith(".entity.ts");
45
36
  }
46
37
  return false;
47
38
  },
48
39
  })
49
- .on("change", (path) => __awaiter(void 0, void 0, void 0, function* () {
40
+ .on("change", async (path) => {
50
41
  node_console_1.default.log(`🚀 File changed: ${path}`);
51
42
  // Kill running processes for the changed file
52
43
  if (childProcesses[path]) {
53
44
  if (childProcesses[path].exitCode == null) {
54
45
  childProcesses[path].kill();
55
- yield waitForExit(childProcesses[path]);
46
+ await waitForExit(childProcesses[path]);
56
47
  node_console_1.default.log("💀 Killed running process for file: ", path);
57
48
  }
58
49
  delete childProcesses[path];
@@ -71,9 +62,9 @@ const watchMode = () => __awaiter(void 0, void 0, void 0, function* () {
71
62
  catch (e) {
72
63
  node_console_1.default.error(`❌ Error processing ${path} with error: ${e}`);
73
64
  }
74
- }))
65
+ })
75
66
  .on("error", (error) => {
76
67
  node_console_1.default.error(`Watcher error: ${error}`);
77
68
  });
78
- });
69
+ };
79
70
  exports.watchMode = watchMode;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comet/api-generator",
3
- "version": "9.0.0-beta.2",
3
+ "version": "9.0.0-beta.3",
4
4
  "description": "Comet API Generator CLI tool",
5
5
  "repository": {
6
6
  "directory": "packages/api/api-generator",
@@ -25,15 +25,15 @@
25
25
  "ts-morph": "^25.0.1",
26
26
  "ts-node": "^10.9.2",
27
27
  "typescript": "^5.9.3",
28
- "@comet/cms-api": "9.0.0-beta.2"
28
+ "@comet/cms-api": "9.0.0-beta.3"
29
29
  },
30
30
  "devDependencies": {
31
- "@mikro-orm/cli": "^6.4.16",
32
- "@mikro-orm/core": "^6.4.16",
33
- "@mikro-orm/postgresql": "^6.4.16",
31
+ "@mikro-orm/cli": "^6.6.12",
32
+ "@mikro-orm/core": "^6.6.12",
33
+ "@mikro-orm/postgresql": "^6.6.12",
34
34
  "@nestjs/graphql": "^13.2.3",
35
35
  "@types/jest": "^29.5.14",
36
- "@types/node": "^24.12.0",
36
+ "@types/node": "^24.12.2",
37
37
  "@types/pluralize": "^0.0.33",
38
38
  "class-validator": "^0.14.3",
39
39
  "eslint": "^9.39.2",
@@ -42,9 +42,9 @@
42
42
  "prettier": "^3.6.2",
43
43
  "reflect-metadata": "^0.2.2",
44
44
  "rimraf": "^6.1.2",
45
- "ts-jest": "^29.4.6",
45
+ "ts-jest": "^29.4.9",
46
46
  "uuid": "^11.1.0",
47
- "@comet/eslint-config": "9.0.0-beta.2"
47
+ "@comet/eslint-config": "9.0.0-beta.3"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@mikro-orm/cli": "^6.0.0",