@solidxai/core 0.1.10-beta.11 → 0.1.10-beta.12

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.
@@ -1,8 +1,7 @@
1
1
  import { CommandRunner } from 'nest-commander';
2
2
  import { ModelMetadataService } from '../services/model-metadata.service';
3
3
  interface CommandOptions {
4
- name?: string;
5
- id?: number;
4
+ name: string;
6
5
  dryRun?: boolean;
7
6
  }
8
7
  export declare class RefreshModelCommand extends CommandRunner {
@@ -10,7 +9,6 @@ export declare class RefreshModelCommand extends CommandRunner {
10
9
  constructor(modelMetadataService: ModelMetadataService);
11
10
  private readonly logger;
12
11
  run(_passedParam: string[], options?: CommandOptions): Promise<void>;
13
- parseId(val: string): number;
14
12
  parseName(val: string): string;
15
13
  parseDryRun(val: string): boolean;
16
14
  private validate;
@@ -1 +1 @@
1
- {"version":3,"file":"refresh-model.command.d.ts","sourceRoot":"","sources":["../../src/commands/refresh-model.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAIa,mBAAoB,SAAQ,aAAa;IAGlD,OAAO,CAAC,QAAQ,CAAC,oBAAoB;gBAApB,oBAAoB,EAAE,oBAAoB;IAI7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAEzD,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB1E,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAS5B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAS9B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAMjC,OAAO,CAAC,QAAQ;CAOjB"}
1
+ {"version":3,"file":"refresh-model.command.d.ts","sourceRoot":"","sources":["../../src/commands/refresh-model.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAIa,mBAAoB,SAAQ,aAAa;IAGlD,OAAO,CAAC,QAAQ,CAAC,oBAAoB;gBAApB,oBAAoB,EAAE,oBAAoB;IAI7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAEzD,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB1E,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQ9B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAKjC,OAAO,CAAC,QAAQ;CAOjB"}
@@ -31,15 +31,11 @@ let RefreshModelCommand = RefreshModelCommand_1 = class RefreshModelCommand exte
31
31
  return;
32
32
  }
33
33
  const codeGenerationOptions = {
34
- modelId: options.id,
35
34
  modelUserKey: options.name,
36
35
  dryRun: options.dryRun,
37
36
  };
38
37
  await this.modelMetadataService.handleGenerateCode(codeGenerationOptions);
39
38
  }
40
- parseId(val) {
41
- return +val;
42
- }
43
39
  parseName(val) {
44
40
  return val;
45
41
  }
@@ -48,8 +44,8 @@ let RefreshModelCommand = RefreshModelCommand_1 = class RefreshModelCommand exte
48
44
  return (val === 'false') ? false : true;
49
45
  }
50
46
  validate(options) {
51
- if (!options.id && !options.name) {
52
- return [new helper_1.CommandError('Model ID or Model Name is required')];
47
+ if (!options.name) {
48
+ return [new helper_1.CommandError('Model Name is required')];
53
49
  }
54
50
  return [];
55
51
  }
@@ -57,17 +53,8 @@ let RefreshModelCommand = RefreshModelCommand_1 = class RefreshModelCommand exte
57
53
  exports.RefreshModelCommand = RefreshModelCommand;
58
54
  __decorate([
59
55
  (0, nest_commander_1.Option)({
60
- flags: '-i, --id [model ID]',
61
- description: 'Model ID from the ss_model_metadata table',
62
- }),
63
- __metadata("design:type", Function),
64
- __metadata("design:paramtypes", [String]),
65
- __metadata("design:returntype", Number)
66
- ], RefreshModelCommand.prototype, "parseId", null);
67
- __decorate([
68
- (0, nest_commander_1.Option)({
69
- flags: '-n, --name [model name]',
70
- description: 'Model Name from the ss_model_metadata table',
56
+ flags: '-n, --name <model name>',
57
+ description: 'Model name (singularName) from the ss_model_metadata table',
71
58
  }),
72
59
  __metadata("design:type", Function),
73
60
  __metadata("design:paramtypes", [String]),
@@ -1 +1 @@
1
- {"version":3,"file":"refresh-model.command.js","sourceRoot":"","sources":["../../src/commands/refresh-model.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,mDAAgE;AAChE,+EAA2E;AAC3E,qCAAwC;AAYjC,IAAM,mBAAmB,2BAAzB,MAAM,mBAAoB,SAAQ,8BAAa;IACpD,YAEE,oBAA2D;QAE3D,KAAK,EAAE,CAAC;QAFS,yBAAoB,GAApB,oBAAoB,CAAsB;QAI5C,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAmB,CAAC,IAAI,CAAC,CAAC;IAD/D,CAAC;IAGD,KAAK,CAAC,GAAG,CAAC,YAAsB,EAAE,OAAwB;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,MAAM,qBAAqB,GAAG;YAC5B,OAAO,EAAE,OAAO,CAAC,EAAE;YACnB,YAAY,EAAE,OAAO,CAAC,IAAI;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QACF,MAAM,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;IAC5E,CAAC;IAOD,OAAO,CAAC,GAAW;QACjB,OAAO,CAAC,GAAG,CAAC;IACd,CAAC;IAOD,SAAS,CAAC,GAAW;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IAOD,WAAW,CAAC,GAAW;QACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAGO,QAAQ,CAAC,OAAuB;QACtC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,qBAAY,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CAEF,CAAA;AA5DY,kDAAmB;AA6B9B;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,2CAA2C;KACzD,CAAC;;;;kDAGD;AAOD;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,6CAA6C;KAC3D,CAAC;;;;oDAGD;AAOD;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,qBAAqB;KACnC,CAAC;;;;sDAID;8BAlDU,mBAAmB;IAJ/B,IAAA,wBAAO,EAAC;QACP,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,0EAA0E;KACxF,CAAC;IAGG,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,6CAAoB,CAAC,CAAC,CAAA;qCACR,6CAAoB;GAHlD,mBAAmB,CA4D/B","sourcesContent":["import { forwardRef, Inject, Logger } from '@nestjs/common';\nimport { Command, CommandRunner, Option } from 'nest-commander';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { CommandError } from './helper';\n\ninterface CommandOptions {\n name?: string;\n id?: number;\n dryRun?: boolean;\n}\n\n@Command({\n name: 'refresh-model',\n description: 'Updates a model and its fields i.e (entity,dto,service,controller files)',\n})\nexport class RefreshModelCommand extends CommandRunner {\n constructor(\n @Inject(forwardRef(() => ModelMetadataService))\n private readonly modelMetadataService: ModelMetadataService,\n ) {\n super();\n }\n private readonly logger = new Logger(RefreshModelCommand.name);\n\n async run(_passedParam: string[], options?: CommandOptions): Promise<void> {\n const errors = this.validate(options);\n if (errors.length) {\n errors.forEach((error) => this.logger.error(error));\n return;\n }\n\n const codeGenerationOptions = {\n modelId: options.id,\n modelUserKey: options.name,\n dryRun: options.dryRun,\n };\n await this.modelMetadataService.handleGenerateCode(codeGenerationOptions);\n }\n\n // Accept the model ID as an argument\n @Option({\n flags: '-i, --id [model ID]',\n description: 'Model ID from the ss_model_metadata table',\n })\n parseId(val: string): number {\n return +val;\n }\n\n // Accept the module name as an argument\n @Option({\n flags: '-n, --name [model name]',\n description: 'Model Name from the ss_model_metadata table',\n })\n parseName(val: string): string {\n return val;\n }\n\n // Accept dry run as an argument\n @Option({\n flags: '-d, --dryRun [dry run]',\n description: 'Dry run the command',\n })\n parseDryRun(val: string): boolean {\n this.logger.debug(`Dry run : ${val}`);\n return (val === 'false') ? false : true;\n }\n\n // Validate the options passed\n private validate(options: CommandOptions): CommandError[] {\n if (!options.id && !options.name) {\n return [new CommandError('Model ID or Model Name is required')];\n }\n return [];\n }\n\n}\n"]}
1
+ {"version":3,"file":"refresh-model.command.js","sourceRoot":"","sources":["../../src/commands/refresh-model.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,mDAAgE;AAChE,+EAA2E;AAC3E,qCAAwC;AAWjC,IAAM,mBAAmB,2BAAzB,MAAM,mBAAoB,SAAQ,8BAAa;IACpD,YAEE,oBAA2D;QAE3D,KAAK,EAAE,CAAC;QAFS,yBAAoB,GAApB,oBAAoB,CAAsB;QAI5C,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAmB,CAAC,IAAI,CAAC,CAAC;IAD/D,CAAC;IAGD,KAAK,CAAC,GAAG,CAAC,YAAsB,EAAE,OAAwB;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,MAAM,qBAAqB,GAAG;YAC5B,YAAY,EAAE,OAAO,CAAC,IAAI;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QACF,MAAM,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;IAC5E,CAAC;IAMD,SAAS,CAAC,GAAW;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IAMD,WAAW,CAAC,GAAW;QACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAEO,QAAQ,CAAC,OAAuB;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,qBAAY,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CAEF,CAAA;AA/CY,kDAAmB;AA2B9B;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,4DAA4D;KAC1E,CAAC;;;;oDAGD;AAMD;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,qBAAqB;KACnC,CAAC;;;;sDAID;8BAtCU,mBAAmB;IAJ/B,IAAA,wBAAO,EAAC;QACP,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,0EAA0E;KACxF,CAAC;IAGG,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,6CAAoB,CAAC,CAAC,CAAA;qCACR,6CAAoB;GAHlD,mBAAmB,CA+C/B","sourcesContent":["import { forwardRef, Inject, Logger } from '@nestjs/common';\nimport { Command, CommandRunner, Option } from 'nest-commander';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { CommandError } from './helper';\n\ninterface CommandOptions {\n name: string;\n dryRun?: boolean;\n}\n\n@Command({\n name: 'refresh-model',\n description: 'Updates a model and its fields i.e (entity,dto,service,controller files)',\n})\nexport class RefreshModelCommand extends CommandRunner {\n constructor(\n @Inject(forwardRef(() => ModelMetadataService))\n private readonly modelMetadataService: ModelMetadataService,\n ) {\n super();\n }\n private readonly logger = new Logger(RefreshModelCommand.name);\n\n async run(_passedParam: string[], options?: CommandOptions): Promise<void> {\n const errors = this.validate(options);\n if (errors.length) {\n errors.forEach((error) => this.logger.error(error));\n return;\n }\n\n const codeGenerationOptions = {\n modelUserKey: options.name,\n dryRun: options.dryRun,\n };\n await this.modelMetadataService.handleGenerateCode(codeGenerationOptions);\n }\n\n @Option({\n flags: '-n, --name <model name>',\n description: 'Model name (singularName) from the ss_model_metadata table',\n })\n parseName(val: string): string {\n return val;\n }\n\n @Option({\n flags: '-d, --dryRun [dry run]',\n description: 'Dry run the command',\n })\n parseDryRun(val: string): boolean {\n this.logger.debug(`Dry run : ${val}`);\n return (val === 'false') ? false : true;\n }\n\n private validate(options: CommandOptions): CommandError[] {\n if (!options.name) {\n return [new CommandError('Model Name is required')];\n }\n return [];\n }\n\n}\n"]}
@@ -2,7 +2,6 @@ import { CommandRunner } from 'nest-commander';
2
2
  import { ModuleMetadataService } from '../services/module-metadata.service';
3
3
  import { CommandError } from './helper';
4
4
  interface CommandOptions {
5
- id: number;
6
5
  name: string;
7
6
  dryRun: boolean;
8
7
  }
@@ -11,7 +10,6 @@ export declare class RefreshModuleCommand extends CommandRunner {
11
10
  constructor(moduleMetadataService: ModuleMetadataService);
12
11
  private readonly logger;
13
12
  run(_passedParam: string[], options?: CommandOptions): Promise<void>;
14
- parseId(val: string): number;
15
13
  parseName(val: string): string;
16
14
  parseDryRun(val: string): boolean;
17
15
  validate(options: CommandOptions): CommandError[];
@@ -1 +1 @@
1
- {"version":3,"file":"refresh-module.command.d.ts","sourceRoot":"","sources":["../../src/commands/refresh-module.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,qBAIa,oBAAqB,SAAQ,aAAa;IAEnD,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAArB,qBAAqB,EAAE,qBAAqB;IAI/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAE1D,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB1E,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAS5B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQ9B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAOjC,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,EAAE;CAOlD"}
1
+ {"version":3,"file":"refresh-module.command.d.ts","sourceRoot":"","sources":["../../src/commands/refresh-module.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,qBAIa,oBAAqB,SAAQ,aAAa;IAEnD,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAArB,qBAAqB,EAAE,qBAAqB;IAI/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAE1D,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1E,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQ9B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAKjC,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,EAAE;CAOlD"}
@@ -28,15 +28,11 @@ let RefreshModuleCommand = RefreshModuleCommand_1 = class RefreshModuleCommand e
28
28
  return;
29
29
  }
30
30
  const codeGenerationOptions = {
31
- moduleId: options.id,
32
31
  moduleUserKey: options.name,
33
32
  dryRun: options.dryRun,
34
33
  };
35
34
  await this.moduleMetadataService.generateCode(codeGenerationOptions);
36
35
  }
37
- parseId(val) {
38
- return +val;
39
- }
40
36
  parseName(val) {
41
37
  return val;
42
38
  }
@@ -45,8 +41,8 @@ let RefreshModuleCommand = RefreshModuleCommand_1 = class RefreshModuleCommand e
45
41
  return (val === 'false') ? false : true;
46
42
  }
47
43
  validate(options) {
48
- if (!options.id && !options.name) {
49
- return [new helper_1.CommandError('Module ID or Module Name is required')];
44
+ if (!options.name) {
45
+ return [new helper_1.CommandError('Module Name is required')];
50
46
  }
51
47
  return [];
52
48
  }
@@ -54,16 +50,7 @@ let RefreshModuleCommand = RefreshModuleCommand_1 = class RefreshModuleCommand e
54
50
  exports.RefreshModuleCommand = RefreshModuleCommand;
55
51
  __decorate([
56
52
  (0, nest_commander_1.Option)({
57
- flags: '-i, --id [module ID]',
58
- description: 'Module ID from the ss_module_metadata table',
59
- }),
60
- __metadata("design:type", Function),
61
- __metadata("design:paramtypes", [String]),
62
- __metadata("design:returntype", Number)
63
- ], RefreshModuleCommand.prototype, "parseId", null);
64
- __decorate([
65
- (0, nest_commander_1.Option)({
66
- flags: '-n, --name [module name]',
53
+ flags: '-n, --name <module name>',
67
54
  description: 'Module Name from the ss_module_metadata table',
68
55
  }),
69
56
  __metadata("design:type", Function),
@@ -1 +1 @@
1
- {"version":3,"file":"refresh-module.command.js","sourceRoot":"","sources":["../../src/commands/refresh-module.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAwC;AACxC,mDAAgE;AAChE,iFAA4E;AAC5E,qCAAwC;AAYjC,IAAM,oBAAoB,4BAA1B,MAAM,oBAAqB,SAAQ,8BAAa;IACrD,YACmB,qBAA4C;QAE7D,KAAK,EAAE,CAAC;QAFS,0BAAqB,GAArB,qBAAqB,CAAuB;QAI9C,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;IADhE,CAAC;IAGD,KAAK,CAAC,GAAG,CAAC,YAAsB,EAAE,OAAwB;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,MAAM,qBAAqB,GAAG;YAC5B,QAAQ,EAAE,OAAO,CAAC,EAAE;YACpB,aAAa,EAAE,OAAO,CAAC,IAAI;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QACF,MAAM,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;IACvE,CAAC;IAMD,OAAO,CAAC,GAAW;QACjB,OAAO,CAAC,GAAG,CAAC;IACd,CAAC;IAOD,SAAS,CAAC,GAAW;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IAMD,WAAW,CAAC,GAAW;QACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAID,QAAQ,CAAC,OAAuB;QAC9B,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,qBAAY,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CAEF,CAAA;AAzDY,oDAAoB;AA0B/B;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,6CAA6C;KAC3D,CAAC;;;;mDAGD;AAOD;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,+CAA+C;KAC7D,CAAC;;;;qDAGD;AAMD;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,qBAAqB;KACnC,CAAC;;;;uDAID;+BA9CU,oBAAoB;IAJhC,IAAA,wBAAO,EAAC;QACP,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,uFAAuF;KACrG,CAAC;qCAG0C,+CAAqB;GAFpD,oBAAoB,CAyDhC","sourcesContent":["import { Logger } from '@nestjs/common';\nimport { Command, CommandRunner, Option } from 'nest-commander';\nimport { ModuleMetadataService } from '../services/module-metadata.service';\nimport { CommandError } from './helper';\n\ninterface CommandOptions {\n id: number;\n name: string;\n dryRun: boolean;\n}\n\n@Command({\n name: 'refresh-module',\n description: 'Refreshes a module and its model and fields i.e (entity,dto,service,controller files)',\n})\nexport class RefreshModuleCommand extends CommandRunner {\n constructor(\n private readonly moduleMetadataService: ModuleMetadataService,\n ) {\n super();\n }\n private readonly logger = new Logger(RefreshModuleCommand.name);\n\n async run(_passedParam: string[], options?: CommandOptions): Promise<void> {\n const errors = this.validate(options);\n if (errors.length) {\n errors.forEach((error) => this.logger.error(error));\n return;\n }\n const codeGenerationOptions = {\n moduleId: options.id,\n moduleUserKey: options.name,\n dryRun: options.dryRun,\n };\n await this.moduleMetadataService.generateCode(codeGenerationOptions);\n }\n\n @Option({\n flags: '-i, --id [module ID]',\n description: 'Module ID from the ss_module_metadata table',\n })\n parseId(val: string): number {\n return +val;\n }\n\n // Accept the module name as an argument\n @Option({\n flags: '-n, --name [module name]',\n description: 'Module Name from the ss_module_metadata table',\n })\n parseName(val: string): string {\n return val;\n }\n\n @Option({\n flags: '-d, --dryRun [dry run]',\n description: 'Dry run the command',\n })\n parseDryRun(val: string): boolean {\n this.logger.debug(`Dry run : ${val}`);\n return (val === 'false') ? false : true;\n }\n\n\n // Validate the options passed\n validate(options: CommandOptions): CommandError[] {\n if (!options.id && !options.name) {\n return [new CommandError('Module ID or Module Name is required')];\n }\n return [];\n }\n\n}\n"]}
1
+ {"version":3,"file":"refresh-module.command.js","sourceRoot":"","sources":["../../src/commands/refresh-module.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAwC;AACxC,mDAAgE;AAChE,iFAA4E;AAC5E,qCAAwC;AAWjC,IAAM,oBAAoB,4BAA1B,MAAM,oBAAqB,SAAQ,8BAAa;IACrD,YACmB,qBAA4C;QAE7D,KAAK,EAAE,CAAC;QAFS,0BAAqB,GAArB,qBAAqB,CAAuB;QAI9C,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;IADhE,CAAC;IAGD,KAAK,CAAC,GAAG,CAAC,YAAsB,EAAE,OAAwB;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,MAAM,qBAAqB,GAAG;YAC5B,aAAa,EAAE,OAAO,CAAC,IAAI;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QACF,MAAM,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;IACvE,CAAC;IAMD,SAAS,CAAC,GAAW;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IAMD,WAAW,CAAC,GAAW;QACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAED,QAAQ,CAAC,OAAuB;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,qBAAY,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CAEF,CAAA;AA7CY,oDAAoB;AAyB/B;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,+CAA+C;KAC7D,CAAC;;;;qDAGD;AAMD;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,qBAAqB;KACnC,CAAC;;;;uDAID;+BApCU,oBAAoB;IAJhC,IAAA,wBAAO,EAAC;QACP,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,uFAAuF;KACrG,CAAC;qCAG0C,+CAAqB;GAFpD,oBAAoB,CA6ChC","sourcesContent":["import { Logger } from '@nestjs/common';\nimport { Command, CommandRunner, Option } from 'nest-commander';\nimport { ModuleMetadataService } from '../services/module-metadata.service';\nimport { CommandError } from './helper';\n\ninterface CommandOptions {\n name: string;\n dryRun: boolean;\n}\n\n@Command({\n name: 'refresh-module',\n description: 'Refreshes a module and its model and fields i.e (entity,dto,service,controller files)',\n})\nexport class RefreshModuleCommand extends CommandRunner {\n constructor(\n private readonly moduleMetadataService: ModuleMetadataService,\n ) {\n super();\n }\n private readonly logger = new Logger(RefreshModuleCommand.name);\n\n async run(_passedParam: string[], options?: CommandOptions): Promise<void> {\n const errors = this.validate(options);\n if (errors.length) {\n errors.forEach((error) => this.logger.error(error));\n return;\n }\n const codeGenerationOptions = {\n moduleUserKey: options.name,\n dryRun: options.dryRun,\n };\n await this.moduleMetadataService.generateCode(codeGenerationOptions);\n }\n\n @Option({\n flags: '-n, --name <module name>',\n description: 'Module Name from the ss_module_metadata table',\n })\n parseName(val: string): string {\n return val;\n }\n\n @Option({\n flags: '-d, --dryRun [dry run]',\n description: 'Dry run the command',\n })\n parseDryRun(val: string): boolean {\n this.logger.debug(`Dry run : ${val}`);\n return (val === 'false') ? false : true;\n }\n\n validate(options: CommandOptions): CommandError[] {\n if (!options.name) {\n return [new CommandError('Module Name is required')];\n }\n return [];\n }\n\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
@@ -547,9 +547,10 @@ let ModelMetadataService = class ModelMetadataService {
547
547
  }
548
548
  }
549
549
  async generateCodeViaCtl(modelId) {
550
+ const model = await this.findOne(modelId);
550
551
  return this.commandService.executeCommandWithArgs({
551
552
  command: 'npx',
552
- args: ['@solixai/solidctl@latest', 'generate', 'model', `--id=${modelId}`],
553
+ args: ['@solixai/solidctl@latest', 'generate', 'model', `--name=${model.singularName}`],
553
554
  cwd: path.join(process.cwd(), '..'),
554
555
  });
555
556
  }
@@ -1 +1 @@
1
- {"version":3,"file":"model-metadata.service.js","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAgH;AAChH,6CAAmD;AACnD,gDAAkC;AAClC,2CAA6B;AAC7B,qCAAwF;AAExF,6EAAkE;AAClE,+EAAoE;AAEpE,mCAAmC;AACnC,4DAAoD;AACpD,gEAA8D;AAC9D,qGAAuF;AACvF,iFAAoE;AAEpE,8FAAyF;AACzF,uFAAmF;AACnF,uFAAmF;AAGnF,+EAAoE;AACpE,6EAAkE;AAClE,qFAAyE;AACzE,2EAAgE;AAChE,oEAIsC;AACtC,gEAA4D;AAE5D,+DAA0D;AAC1D,qEAAgE;AAChE,uGAAgG;AAChG,mEAA8D;AAE9D,yEAAoE;AAEpE,qEAA+D;AAGxD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAE/B,YAME,iBAA2D,EAC1C,iBAA0C,EAC1C,gBAAkC,EAClC,cAA8B,EAE/C,UAAuC,EACtB,iBAAoC,EACpC,mCAAwE,EACxE,oBAA0C,EAC1C,WAAgC,EAChC,2BAAwD,EAChE,iBAAyC,EACjC,mBAAwC;QAZxC,sBAAiB,GAAjB,iBAAiB,CAAyB;QAC1C,sBAAiB,GAAjB,iBAAiB,CAAyB;QAC1C,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,mBAAc,GAAd,cAAc,CAAgB;QAE9B,eAAU,GAAV,UAAU,CAAY;QACtB,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,wCAAmC,GAAnC,mCAAmC,CAAqC;QACxE,yBAAoB,GAApB,oBAAoB,CAAsB;QAC1C,gBAAW,GAAX,WAAW,CAAqB;QAChC,gCAA2B,GAA3B,2BAA2B,CAA6B;QAChE,sBAAiB,GAAjB,iBAAiB,CAAwB;QACjC,wBAAmB,GAAnB,mBAAmB,CAAqB;QAnBnD,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAsB,CAAC,CAAC;IAuBhD,CAAC;IAEL,KAAK,CAAC,IAAI,CAAC,cAA8B;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,cAA8B;QAC3C,MAAM,KAAK,GAAG,eAAe,CAAC;QAE9B,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;QAGvC,IAAI,EAAE,GAAsC,MAAM,IAAI,CAAC,iBAAiB,CAAC,mCAAmC,CAAC,KAAK,CAAC,CAAA;QACnH,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QAG9E,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,eAAe,EAAE,CAAC;QAErD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;QAE5C,MAAM,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,MAAM,QAAQ,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE1D,MAAM,CAAC,GAAG;YACR,IAAI,EAAE;gBACJ,YAAY,EAAE,KAAK;gBACnB,WAAW,EAAE,WAAW;gBACxB,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,CAAC,KAAK;aAChB;YACD,OAAO,EAAE,QAAQ;SAClB,CAAC;QACF,OAAO,CAAC,CAAA;IACV,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAO,EAAE,KAAW;QAEhC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YAClD,KAAK,EAAE;gBACL,EAAE,EAAE,EAAE;aACP;YACD,SAAS,EAAE,KAAK,EAAE,QAAQ;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,0BAAiB,CAAC,+BAAc,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,YAAoB,EAAE,SAAS,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YAClD,KAAK,EAAE;gBACL,YAAY,EAAE,YAAY;aAC3B;YACD,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,0BAAiB,CAAC,+BAAc,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,YAAoB,EAAE,SAAS,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YAClD,KAAK,EAAE;gBACL,YAAY,EAAE,YAAY;aAC3B;YACD,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,0BAAiB,CAAC,+BAAc,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiC;QAE5C,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,OAAsB,EAAE,EAAE;gBACxE,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,qCAAa,CAAC,CAAC;gBAC7D,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,qCAAa,CAAC,CAAC;gBAG7D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACxD,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;gBAEnD,MAAM,IAAI,CAAC,kCAAkC,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;gBAEvF,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAEpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAChD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAGO,KAAK,CAAC,kCAAkC,CAAC,KAAoB,EAAE,eAA0C,EAAE,eAA0C;QAC3J,MAAM,MAAM,GAAoB,MAAM,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QAG/F,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,sBAA8C;QAKrE,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,OAAsB,EAAE,EAAE;gBACxE,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,qCAAa,CAAC,CAAC;gBAC7D,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,qCAAa,CAAC,CAAC;gBAG7D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,sBAAsB,CAAC,CAAA;gBACxE,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;gBAEnD,MAAM,IAAI,CAAC,kCAAkC,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;YAGzF,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAEpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAChD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAsB,EAAE,SAAiC;QAGxE,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU;aACzC,aAAa,CAAC,uCAAc,CAAC;aAC7B,OAAO,CAAC;YACP,KAAK,EAAE;gBACL,EAAE,EAAE,SAAS,CAAC,UAAU,CAAC;aAC1B;YACD,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;QACL,SAAS,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC;QAErC,IAAI,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC;YAC/B,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,UAAU;iBAC9C,aAAa,CAAC,qCAAa,CAAC;iBAC5B,OAAO,CAAC;gBACP,KAAK,EAAE;oBACL,EAAE,EAAE,SAAS,CAAC,eAAe,CAAC;iBAC/B;gBACD,SAAS,EAAE,EAAE;aACd,CAAC,CAAC;YACL,SAAS,CAAC,aAAa,CAAC,GAAG,mBAAmB,CAAC;QACjD,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,0BAA0B,EAAE,GAAG,SAAS,CAAC;QAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAChF,IAAI,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAG9C,IAAI,YAAY,GAAG,IAAI,CAAC;QACxB,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,MAAM,cAAc,GAAG,EAAE,CAAC;QAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAGxC,aAAa,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;YAC/B,IAAI,aAAa,CAAC,sBAAsB,EAAE,CAAC;gBACzC,aAAa,CAAC,sBAAsB,CAAC,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;YACvI,CAAC;YAID,MAAM,mBAAmB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACzE,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAE9D,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;gBAC5B,YAAY,GAAG,aAAa,CAAC;YAC/B,CAAC;YACD,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;YAChF,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;YAChF,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QAElF,CAAC;QAGD,IAAI,YAAY,EAAE,CAAC;YACjB,0BAA0B,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC;YAC1D,MAAM,uBAAuB,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC;YAChG,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAY,EAAE,IAA+B;QAC9D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;gBAC/B,KAAK,EAAE;oBACL,EAAE,EAAE,OAAO;iBACZ;gBACD,SAAS,EAAE,CAAC,QAAQ,EAAE,6BAA6B,EAAE,QAAQ,EAAE,aAAa,CAAC;aAC9E,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;YAEjG,MAAM,aAAa,GAAG;gBACpB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,mBAAmB,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI;gBACtE,OAAO,EAAE,KAAK,EAAE,OAAO;gBACvB,aAAa,EAAE,KAAK,EAAE,aAAa;gBACnC,mBAAmB,EAAE,KAAK,EAAE,mBAAmB;gBAC/C,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY;gBACpD,mBAAmB,EAAE,KAAK,EAAE,mBAAmB;gBAC/C,gBAAgB,EAAE,KAAK,EAAE,gBAAgB;gBACzC,oBAAoB,EAAE,KAAK,EAAE,oBAAoB;gBACjD,oBAAoB,EAAE,KAAK,EAAE,oBAAoB;gBACjD,MAAM,EAAE,EAAE;aACX,CAAA;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,KAAK,CAAC,QAAQ;oBAAE,SAAS;gBAC7B,MAAM,WAAW,GAAwB,MAAM,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAClG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzC,CAAC;YAED,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAGnD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACzD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAE/C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAEpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,iBAAiB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAsB,EAAE,EAAU,EAAE,sBAA8C;QAEjG,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,0BAA0B,EAAE,GAAG,sBAAsB,CAAC;QACzF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,qCAAa,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,qCAAa,CAAC,CAAC;QAEvD,IAAI,aAAa,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;YAC1C,KAAK,EAAE;gBACL,YAAY,EAAE,sBAAsB,CAAC,YAAY;aAClD;YACD,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,eAAe,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,aAAa,EAAE,0BAA0B,CAAC,CAAC;QAChF,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEnC,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC;QAClD,MAAM,gBAAgB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAIjE,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,MAAM,YAAY,GAAoB,EAAE,CAAC;QACzC,MAAM,cAAc,GAAoB,EAAE,CAAC;QAE3C,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;YAC3C,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC;gBAErB,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAAC,CAAC;gBACpF,IAAI,aAAa,EAAE,CAAC;oBAClB,IAAI,aAAa,CAAC,sBAAsB,EAAE,CAAC;wBACzC,aAAa,CAAC,sBAAsB,CAAC,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;oBACvI,CAAC;oBACD,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;oBAC5C,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;iBAAM,CAAC;gBAEN,aAAa,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC;gBAEtC,IAAI,aAAa,CAAC,sBAAsB,EAAE,CAAC;oBACzC,aAAa,CAAC,sBAAsB,CAAC,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;gBACvI,CAAC;gBACD,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACrD,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAClC,CAAC;QAMH,CAAC;QAGD,cAAc,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAGzG,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAA,CAAC,CAAC,CAAC,CAAA;YACpE,MAAM,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAGvC,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;YACzC,KAAK,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE;YAC9B,SAAS,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC;SACtC,CAAC,CAAC;QAGH,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAEtE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChE,MAAM,iBAAiB,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAEzF,IAAI,iBAAiB,EAAE,CAAC;gBACtB,UAAU,CAAC,YAAY,GAAG,iBAAiB,CAAC;gBAC5C,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,kBAAkB,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,eAAe,CAAC,EAAE,CAAC,CAAC;YAE1F,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;gBACvC,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3E,IAAI,aAAa,EAAE,CAAC;oBAClB,aAAa,CAAC,SAAS,GAAG,KAAK,CAAC;oBAChC,MAAM,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC5B,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC/B,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IAEtB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAY,EAAE,IAA+B;QAC9D,IAAI,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;gBAC/B,KAAK,EAAE;oBACL,EAAE,EAAE,OAAO;iBACZ;gBACD,SAAS,EAAE,CAAC,QAAQ,EAAE,6BAA6B,EAAE,QAAQ,EAAE,aAAa,CAAC;gBAC7E,KAAK,EAAE;oBACL,MAAM,EAAE;wBACN,EAAE,EAAE,KAAK;qBACV;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;YAEjG,MAAM,aAAa,GAAG;gBACpB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,mBAAmB,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI;gBACtE,OAAO,EAAE,KAAK,EAAE,OAAO;gBACvB,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY;gBACpD,mBAAmB,EAAE,KAAK,EAAE,mBAAmB;gBAC/C,gBAAgB,EAAE,KAAK,EAAE,gBAAgB;gBACzC,oBAAoB,EAAE,KAAK,EAAE,oBAAoB;gBACjD,oBAAoB,EAAE,KAAK,EAAE,oBAAoB;gBACjD,MAAM,EAAE,EAAE;aACX,CAAA;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAEpB,MAAM,WAAW,GAAwB,MAAM,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBAClG,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;wBAC7B,WAAW,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBACxC,CAAC;oBACD,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAGD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CACjE,CAAC,aAAkB,EAAE,EAAE,CAAC,aAAa,CAAC,YAAY,KAAK,aAAa,CAAC,YAAY,CAClF,CAAC;YAEF,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;gBAE9B,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,aAAa,CAAC;YACrE,CAAC;iBAAM,CAAC;gBAEN,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrD,CAAC;YAGD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACzD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAE/C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAEpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,iBAAiB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiC;QAE5C,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YACjE,KAAK,EAAE;gBACL,YAAY,EAAE,SAAS,CAAC,YAAY;aACrC;SACF,CAAC,CAAA;QAGF,IAAI,qBAAqB,EAAE,CAAC;YAC1B,MAAM,oBAAoB,GAAG,EAAE,GAAG,qBAAqB,EAAE,GAAG,SAAS,EAAE,CAAC;YACxE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC7E,OAAO,YAAY,CAAA;QACrB,CAAC;aAEI,CAAC;YACJ,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,YAAoB;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAC9D,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtD,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAa;QAC5B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,mBAAmB,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,eAAe,GAAG,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;gBAClD,KAAK,EAAE;oBAEL,EAAE,EAAE,EAAE;iBACP;aACF,CAAC,CAAC;YAIH,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtD,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,eAAe,CAAA;IACxB,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtD,OAAO,CAAC,CAAA;IACV,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAqB;QACzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YACvD,KAAK,EAAE;gBAEL,EAAE,EAAE,aAAa;aAClB;YACD,SAAS,EAAE,CAAC,QAAQ,CAAC;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,aAAa,mCAAmC,CAAC,CAAC;YAC5F,OAAO;QACT,CAAC;QACD,IAAI,WAAW,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,aAAa,wCAAwC,WAAW,CAAC,EAAE,iDAAiD,aAAa,EAAE,CAAC,CAAC;YAC/K,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,WAAW,CAAC,YAAY,yBAAyB,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClG,IAAI,UAAU,EAAE,CAAC;YAEf,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC;YAE9C,MAAM,aAAa,GAAG,EAAE,CAAC;YAEzB,MAAM,cAAc,GAAG,GAAG,UAAU,aAAa,IAAA,kBAAS,EAAC,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC;YACjG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,cAAc,EAAE,CAAC,CAAC;YAGvE,MAAM,iBAAiB,GAAG,GAAG,UAAU,gBAAgB,IAAA,kBAAS,EAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC;YACpG,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yCAAyC,iBAAiB,EAAE,CAAC,CAAC;YAG9E,MAAM,iBAAiB,GAAG,GAAG,UAAU,gBAAgB,IAAA,kBAAS,EAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC;YACpG,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yCAAyC,iBAAiB,EAAE,CAAC,CAAC;YAG9E,MAAM,kBAAkB,GAAG,GAAG,UAAU,iBAAiB,IAAA,kBAAS,EAAC,WAAW,CAAC,YAAY,CAAC,gBAAgB,CAAC;YAC7G,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yCAAyC,kBAAkB,EAAE,CAAC,CAAC;YAG/E,MAAM,eAAe,GAAG,GAAG,UAAU,aAAa,IAAA,kBAAS,EAAC,WAAW,CAAC,YAAY,CAAC,aAAa,CAAC;YACnG,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sCAAsC,eAAe,EAAE,CAAC,CAAC;YAGzE,MAAM,kBAAkB,GAAG,GAAG,UAAU,gBAAgB,IAAA,kBAAS,EAAC,WAAW,CAAC,YAAY,CAAC,gBAAgB,CAAC;YAC5G,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yCAAyC,kBAAkB,EAAE,CAAC,CAAC;YAE/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,YAAY,EAAE,CAAC,CAAC;gBACnD,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CACzB,qCAAqC,EACrC,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,CACjC,CAAC;QAuDF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,yBAAyB,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5G,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QACjG,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CACjE,CAAC,aAAkB,EAAE,EAAE,CAAC,aAAa,CAAC,YAAY,KAAK,WAAW,CAAC,YAAY,CAChF,CAAC;YAGF,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC9B,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;YAGD,QAAQ,CAAC,cAAc,CAAC,KAAK,GAAG,QAAQ,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,CACpE,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,WAAW,CAAC,YAAY,CAC9D,CAAC;YACF,QAAQ,CAAC,cAAc,CAAC,OAAO,GAAG,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CACxE,CAAC,MAAW,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,KAAK,WAAW,CAAC,YAAY,CAClE,CAAC;YACF,QAAQ,CAAC,cAAc,CAAC,KAAK,GAAG,QAAQ,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,CACpE,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,WAAW,CAAC,YAAY,CAC9D,CAAC;YAEF,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACzD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC/C,CAAC;QAGD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,IAAA,kBAAS,EAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACpG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,YAAY,kCAAkC,cAAc,EAAE,CAAC,CAAC;YAC/G,IAAI,CAAC;gBACH,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;gBACjC,MAAM,gBAAgB,GAAG,IAAI,IAAA,kBAAS,EAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC;gBACpE,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CACnE,cAAc,EACd,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CACxC,CAAC;gBACF,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBACjF,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,WAAW,CAAC,YAAY,IAAI,EAAE,KAAK,CAAC,CAAC;YACtG,CAAC;QACH,CAAC;IAIH,CAAC;IAGK,AAAN,KAAK,CAAC,kBAAkB,CAAC,OAAe;QACtC,OAAO,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC;YAChD,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,0BAA0B,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,OAAO,EAAE,CAAC;YAC1E,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAGK,AAAN,KAAK,CAAC,kBAAkB,CAAC,OAA8B;QACrD,MAAM,gBAAgB,GAAG,EAAE,EAAE,2BAA2B,GAAG,EAAE,EAAE,0BAA0B,GAAG,EAAE,CAAC;QAG/F,MAAM,EAAE,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACjG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChC,2BAA2B,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACzD,0BAA0B,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAGtD,MAAM,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,0BAA0B,CAAC,CAAC;QAGnI,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QAGD,OAAO,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjG,CAAC;IAEO,KAAK,CAAC,4BAA4B,CAAC,KAAoB,EAAE,OAA8B,EAAE,gBAAuB,EAAE,2BAAkC,EAAE,0BAAiC;QAC7L,MAAM,oBAAoB,GAAG,KAAK,CAAC,MAAM;YACvC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,QAAQ,IAAI,KAAK,CAAC,qBAAqB,KAAK,IAAI,CAAC;aAC9F,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAEnD,KAAK,MAAM,YAAY,IAAI,oBAAoB,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAC/D,MAAM,cAAc,GAA0B;gBAC5C,OAAO,EAAE,OAAO,CAAC,EAAE;gBACnB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;YACF,MAAM,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YACjG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAClC,2BAA2B,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACzD,0BAA0B,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,iBAAiB,CAAC,OAAe;QACrC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,OAAsB,EAAE,EAAE;gBACxE,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,qCAAa,CAAC,CAAC;gBAC7D,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC;oBAC1C,KAAK,EAAE;wBACL,EAAE,EAAE,OAAO;qBACZ;oBACD,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;iBAChC,CAAC,CAAC;gBACH,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAClE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,KAAoB;QACxD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;YAEjG,MAAM,oBAAoB,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACxE,MAAM,oBAAoB,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACxE,MAAM,oBAAoB,GAAG,EAAE,CAAC;YAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,KAAK,CAAC,QAAQ;oBAAE,SAAS;gBAC7B,oBAAoB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;gBAC9E,oBAAoB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;gBAC9E,oBAAoB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;YAChF,CAAC;YACD,IAAI,CAAC,+BAA+B,CAAC,oBAAoB,EAAE,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC;YAExH,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACzD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAE/C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAEpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sDAAsD,EAAE,KAAK,CAAC,CAAC;YACjF,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAGO,+BAA+B,CAAC,oBAA2B,EAAE,KAAoB,EAAE,oBAAmE,EAAE,oBAAmE,EAAE,QAAa;QAChP,MAAM,aAAa,GAAG,EAAE,CAAC;QAIzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAErD,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAI9C,CAAC;QACD,MAAM,UAAU,GAAG,GAAG,KAAK,CAAC,YAAY,cAAc,CAAC;QACvD,MAAM,kBAAkB,GAAG,GAAG,KAAK,CAAC,YAAY,cAAc,CAAC;QAC/D,MAAM,YAAY,GAAG,GAAG,KAAK,CAAC,YAAY,YAAY,CAAC;QACvD,MAAM,YAAY,GAAG,GAAG,KAAK,CAAC,YAAY,YAAY,CAAC;QACvD,MAAM,YAAY,GAAG,GAAG,KAAK,CAAC,YAAY,YAAY,CAAC;QACvD,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,YAAY,YAAY,CAAC;QACnD,MAAM,sBAAsB,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAG;YACb,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,cAAc;YAC/C,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE;YACX,eAAe,EAAE,EAAE;YACnB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,EAAE;YAClB,WAAW,EAAE,YAAY;YACzB,aAAa,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;YACrC,YAAY,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE;SACtC,CAAC;QAEF,MAAM,cAAc,GAAG;YACrB,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,mBAAmB;YACpD,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE;YACX,eAAe,EAAE,EAAE;YACnB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,EAAE;YAClB,WAAW,EAAE,YAAY;YACzB,aAAa,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;YACrC,YAAY,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE;SACtC,CAAC;QAEF,MAAM,IAAI,GAAG;YACX,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,QAAQ;YACd,cAAc,EAAE,sBAAsB;YACtC,aAAa,EAAE,UAAU;YACzB,aAAa,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;YACrC,qBAAqB,EAAE,EAAE;YACzB,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;YACrC,YAAY,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE;YACrC,MAAM,EAAE;gBACN,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE;wBACf,EAAE;wBACF,EAAE;wBACF,EAAE;qBACH;oBACD,kBAAkB,EAAE,IAAI;oBACxB,MAAM,EAAE,IAAI;oBACZ,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,IAAI;iBACb;gBACD,QAAQ,EAAE,oBAAoB;aAC/B;SACF,CAAC;QAEF,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;YACrC,YAAY,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE;YACrC,MAAM,EAAE;gBACN,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE;wBACf,EAAE;wBACF,EAAE;wBACF,EAAE;qBACH;oBACD,kBAAkB,EAAE,IAAI;oBACxB,MAAM,EAAE,IAAI;oBACZ,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,IAAI;iBACb;gBACD,QAAQ,EAAE,oBAAoB;aAC/B;SACF,CAAC;QAEF,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;YACrC,YAAY,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE;YACrC,MAAM,EAAE;gBACN,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;gBAC3E,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wBAC1B,QAAQ,EAAE;4BACR;gCACE,IAAI,EAAE,KAAK;gCACX,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gCAC1B,QAAQ,EAAE;oCACR;wCACE,IAAI,EAAE,QAAQ;wCACd,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,oCAAoC,EAAE;wCACtF,QAAQ,EAAE,aAAa;qCACxB;iCAMF;6BACF;yBACF;qBACF;iBACF;aACF;SACF,CAAC;QAGF,MAAM,SAAS,GAAG,CAAC,GAAU,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAEtF,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YACxC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;YACpD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;IAKH,CAAC;IAGO,KAAK,CAAC,qBAAqB,CAAC,KAAoB;QACtD,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;QAE9F,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClD,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE;gBACrB,YAAY,EAAE,IAAI;aACnB;SACF,CAAC,CAAC,CAAC;QAEJ,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClD,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE;gBACrB,YAAY,EAAE,IAAI;aACnB;SACF,CAAC,CAAC,CAAC;QAEJ,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClD,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE;aACtB;SACF,CAAC,CAAC,CAAC;QAEJ,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAElD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,uCAAc,CAAC,CAAC,OAAO,CAAC;YACjF,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE;SAC/B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,mCAAY,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,uCAAc,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,4CAAgB,CAAC,CAAC;QAEjE,MAAM,UAAU,GAAG;YACjB;gBACE,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,YAAY;gBACvC,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;gBACnC,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;oBACrB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE;wBACL,UAAU,EAAE,IAAI;wBAChB,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;wBAC7B,kBAAkB,EAAE,IAAI;wBACxB,MAAM,EAAE,IAAI;wBACZ,IAAI,EAAE,IAAI;wBACV,MAAM,EAAE,IAAI;qBACb;oBACD,QAAQ,EAAE,cAAc;iBACzB,EAAE,IAAI,EAAE,CAAC,CAAC;aACZ;YACD;gBACE,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,YAAY;gBACvC,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;gBACnC,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;oBACrB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE;wBACL,UAAU,EAAE,IAAI;wBAChB,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;wBAC7B,kBAAkB,EAAE,IAAI;wBACxB,MAAM,EAAE,IAAI;wBACZ,IAAI,EAAE,IAAI;wBACV,MAAM,EAAE,IAAI;qBACb;oBACD,QAAQ,EAAE,cAAc;iBACzB,EAAE,IAAI,EAAE,CAAC,CAAC;aACZ;YACD;gBACE,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,YAAY;gBACvC,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;gBACnC,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;oBACrB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;oBAC3E,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;4BAC1B,QAAQ,EAAE;gCACR;oCACE,IAAI,EAAE,KAAK;oCACX,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;oCACpD,QAAQ,EAAE;wCACR;4CACE,IAAI,EAAE,QAAQ;4CACd,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,oCAAoC,EAAE;4CACtF,QAAQ,EAAE,SAAS;yCACpB;wCACD;4CACE,IAAI,EAAE,QAAQ;4CACd,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,oCAAoC,EAAE;4CACtF,QAAQ,EAAE,UAAU;yCACrB;qCACF;iCACF;6BACF;yBACF;qBACF;iBACF,EAAE,IAAI,EAAE,CAAC,CAAC;aACZ;SACF,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAE5E,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,IAAI,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,YAAY,EAAE,EAAE,CAAC,CAAC;QAC1F,IAAI,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,YAAY,EAAE,EAAE,CAAC,CAAC;QAE9F,MAAM,UAAU,GAAG;YACjB,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,cAAc;YAC/C,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,cAAc;YACzC,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,EAAS;YACjB,OAAO,EAAE,EAAS;YAClB,eAAe,EAAE,EAAE;YACnB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,MAAM,kBAAkB,GAAG;YACzB,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,mBAAmB;YACpD,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,mBAAmB;YAC9C,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE;YACX,eAAe,EAAE,EAAE;YACnB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,IAAI,cAAc,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpF,IAAI,sBAAsB,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEpG,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpD,cAAc,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,MAAM,qBAAqB,GAAG,UAAU,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACpE,sBAAsB,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAEjE,MAAM,QAAQ,GAAG;YACf,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,YAAY;YACvC,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,CAAC,SAAS,CAAC;YAClB,qBAAqB,EAAE,EAAE;SAC1B,CAAC;QAEF,IAAI,YAAY,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAE9E,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAA8B;QAC/C,MAAM,KAAK,GAAG;YACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;SAC/B,CAAC;QAEF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO;YAC3B,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;YAC5C,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEtE,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC,MAAM;aACtC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;aACzC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAE1B,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC1E,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,OAA8B;QAC3D,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC9C,MAAM,IAAI,4BAAmB,CAAC,+BAAc,CAAC,kCAAkC,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3E,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;SAC/B,CAAC;QACF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAG/I,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACxG,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAGpG,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAoB,EAAE,EAAE;YAChD,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;QAIH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QAGjG,MAAM,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CACjE,CAAC,aAAkB,EAAE,EAAE,CAAC,aAAa,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAC1E,CAAC;QAEF,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAGzE,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC;QAEtG,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;YAE9B,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,aAAa,CAAC;QACrE,CAAC;aAAM,CAAC;YAEN,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;QAGD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAE7C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAA8B;QACpD,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC9C,MAAM,IAAI,4BAAmB,CAAC,+BAAc,CAAC,kCAAkC,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,oBAAoB,CAAC;SACpE,CAAC;QACF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAG/I,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAElF,OAAO,GAAG,YAAY,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,0BAA0B,CAAC,KAAoB,EAAE,SAAkB,KAAK;QACpF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,CAChE,yCAAqB,EACrB;YACE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;YACzB,KAAK,EAAE,KAAK,CAAC,YAAY;SAC1B,EACD,MAAM,CACP,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,0BAA0B,CAAC,KAAoB,EAAE,gBAAiC,EAAE,SAAkB,KAAK;QACvH,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,CAChE,yCAAqB,EACrB;YACE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;YACzB,KAAK,EAAE,KAAK,CAAC,YAAY;YACzB,oBAAoB,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAChE,EACD,MAAM,CACP,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAS;QAC3B,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAEtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YACjD,KAAK,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;YAClC,SAAS,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,YAAY,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,YAAY,CAAC,IAAI,yBAAyB,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC3E,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,uBAAuB,SAAS,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC;QAE/B,KAAK,CAAC,YAAY,GAAG,aAAa,CAAC;QAEnC,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzC,OAAO;YACL,OAAO,EAAE,6CAA6C,SAAS,GAAG;YAClE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,OAAe,EAAE,IAA+B;QACrF,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC;YACrB,KAAK,EAAE;gBACL,KAAK,EAAE;oBACL,EAAE,EAAE,OAAO;iBACZ;gBACD,IAAI,EAAE,0CAAc,CAAC,QAAQ;gBAC7B,qBAAqB,EAAE,IAAI;aAC5B;YACD,SAAS,EAAE;gBACT,KAAK,EAAE;oBACL,MAAM,EAAE,IAAI;iBACb;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,aAA4B;QAC3C,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,GAAG,aAAa,CAAC;QAEjE,MAAM,2BAA2B,GAC/B,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,IAAA,wBAAQ,EAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEtE,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACjC,MAAM,IAAI,4BAAmB,CAC3B,uBAAuB,SAAS,4BAA4B,CAC7D,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAqB,2BAA2B,CAAC,QAAQ,CAAC;QAE5E,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAGrD,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,IAAI;aACX,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAK/B,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAExE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,4BAAmB,CAAC,kCAAkC,CAAC,CAAC;QACpE,CAAC;QAKD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3B,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5D,MAAM,kBAAkB,GAAG,aAAa,GAAG,KAAK,GAAG,CAAC,CAAC;QAErD,IAAI,IAAI,GAA0D,IAAI,CAAC;QACvE,IAAI,IAAI,GAA0D,IAAI,CAAC;QAKvE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,IAAI,GAAG;gBACL,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC1B,MAAM,EAAE,aAAa;gBACrB,KAAK;aACN,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAEtD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;gBACvC,GAAG,cAAc;gBACjB,MAAM,EAAE,UAAU;gBAClB,KAAK;aACN,CAAC,CAAC;YAEH,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBAC/C,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,GAAG;wBACL,MAAM;wBACN,MAAM,EAAE,UAAU;wBAClB,KAAK;qBACN,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAKD,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,GAAG;gBACL,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC1B,MAAM,EAAE,aAAa;gBACrB,KAAK;aACN,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAEtD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;gBACvC,GAAG,cAAc;gBACjB,MAAM,EAAE,UAAU;gBAClB,KAAK;aACN,CAAC,CAAC;YAEH,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBAC3C,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,GAAG;wBACL,MAAM;wBACN,MAAM,EAAE,UAAU;wBAClB,KAAK;qBACN,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAKD,OAAO;YACL,IAAI,EAAE,IAAI;gBACR,CAAC,CAAC;oBACA,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;oBACxB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB;gBACD,CAAC,CAAC,IAAI;YAER,IAAI,EAAE,IAAI;gBACR,CAAC,CAAC;oBACA,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;oBACxB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB;gBACD,CAAC,CAAC,IAAI;YACR,IAAI,EAAE;gBACJ,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAE3B,kBAAkB,EAAE,KAAK;gBACzB,kBAAkB;gBAElB,OAAO,EAAE,CAAC,CAAC,IAAI;gBACf,OAAO,EAAE,CAAC,CAAC,IAAI;gBAEf,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB;SAEF,CAAC;IACJ,CAAC;CAEF,CAAA;AAt8CY,oDAAoB;AAogBzB;IADL,IAAA,uDAAoB,GAAE;;;;kDAMtB;AAkLK;IADL,IAAA,uDAAoB,GAAE;;;;8DAOtB;AAGK;IADL,IAAA,uDAAoB,GAAE;;;;8DAoBtB;+BAvtBU,oBAAoB;IADhC,IAAA,mBAAU,GAAE;IAQR,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,mDAAuB,CAAC,CAAC,CAAA;IAKjD,WAAA,IAAA,0BAAgB,GAAE,CAAA;qCAJiB,mDAAuB;QACvB,mDAAuB;QACxB,oCAAgB;QAClB,gCAAc;QAElB,oBAAU;QACH,uCAAiB;QACC,6EAAmC;QAClD,6CAAoB;QAC7B,2CAAmB;QACH,4DAA2B;QAC7C,iDAAsB;QACZ,4CAAmB;GApBhD,oBAAoB,CAs8ChC","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { InjectDataSource } from '@nestjs/typeorm';\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport * as path from 'path';\nimport { DataSource, EntityManager, In, Repository, SelectQueryBuilder } from 'typeorm';\nimport { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';\nimport { ModelMetadata } from '../entities/model-metadata.entity';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\n\nimport { kebabCase } from 'lodash';\nimport { classify } from '../helpers/string.helper';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';\nimport { SolidFieldType } from 'src/dtos/create-field-metadata.dto';\nimport { PermissionMetadata } from 'src/entities/permission-metadata.entity';\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\nimport { FieldMetadataRepository } from 'src/repository/field-metadata.repository';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { BasicFilterDto } from '../dtos/basic-filters.dto';\nimport { UpdateModelMetaDataDto } from '../dtos/update-model-metadata.dto';\nimport { ActionMetadata } from '../entities/action-metadata.entity';\nimport { FieldMetadata } from '../entities/field-metadata.entity';\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { ViewMetadata } from '../entities/view-metadata.entity';\nimport {\n REFRESH_MODEL_COMMAND,\n REMOVE_FIELDS_COMMAND,\n SchematicService\n} from '../helpers/schematic.service';\nimport { CommandService } from '../helpers/command.service';\nimport { CodeGenerationOptions } from '../interfaces';\nimport { CrudHelperService } from './crud-helper.service';\nimport { FieldMetadataService } from './field-metadata.service';\nimport { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';\nimport { RoleMetadataService } from './role-metadata.service';\nimport { NavigationDto } from 'src/dtos/navigation.dto';\nimport { SolidIntrospectService } from './solid-introspect.service';\nimport { CRUDService } from './crud.service';\nimport { SolidTsMorphService } from './solid-ts-morph.service';\n\n@Injectable()\nexport class ModelMetadataService {\n private logger = new Logger('ModelMetadataService');\n constructor(\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly fieldMetadataRepo: FieldMetadataRepository,\n private readonly schematicService: SchematicService,\n private readonly commandService: CommandService,\n @InjectDataSource()\n private readonly dataSource: DataSource,\n private readonly crudHelperService: CrudHelperService,\n private readonly mediaStorageProviderMetadataService: MediaStorageProviderMetadataService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly roleService: RoleMetadataService,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n readonly introspectService: SolidIntrospectService,\n private readonly solidTsMorphService: SolidTsMorphService,\n\n // No longer used.\n // private readonly generateCodePublihser: GenerateCodePublisherDatabase,\n ) { }\n\n async find(basicFilterDto: BasicFilterDto) {\n return this.findMany(basicFilterDto);\n }\n\n async findMany(basicFilterDto: BasicFilterDto) {\n const alias = 'modelMetadata';\n // Extract the required keys from the input query\n let { limit, offset } = basicFilterDto;\n\n // Create above query on pincode table using query builder\n var qb: SelectQueryBuilder<ModelMetadata> = await this.modelMetadataRepo.createSecurityRuleAwareQueryBuilder(alias)\n qb = await this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);\n\n // Get the records and the count\n const [entities, count] = await qb.getManyAndCount();\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n const r = {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n return r\n }\n\n async findOne(id: any, query?: any) {\n // const { fields, filters, populate } = basicFilterDto;\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n id: id,\n },\n relations: query?.populate, //FIXME: Check with jenender and change to relations to avoid confusion\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(`#${id}`));\n }\n return entity;\n }\n\n async findOneBySingularName(singularName: string, relations = {}) {\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n singularName: singularName,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));\n }\n return entity;\n }\n\n async findOneByUserKey(singularName: string, relations = {}) {\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n singularName: singularName,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));\n }\n return entity;\n }\n\n async create(createDto: CreateModelMetadataDto) {\n\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const fieldRepository = manager.getRepository(FieldMetadata);\n\n // Step 1: Write initial data to the database\n const model = await this.createInDB(manager, createDto);\n await this.createInFile(model.id, modelRepository);\n\n await this.handleInverseRelationFieldsUpdates(model, fieldRepository, modelRepository);\n\n return model\n });\n } catch (error: any) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n // Iterate through the fields in the createDto & get all the relation fields which have create inverse as true\n private async handleInverseRelationFieldsUpdates(model: ModelMetadata, fieldRepository: Repository<FieldMetadata>, modelRepository: Repository<ModelMetadata>) {\n const fields: FieldMetadata[] = await this.getRelationInverseFields(model.id, fieldRepository);\n\n // Call a function which will iterate through each field and create an inverse field entry for the respective model i.e call updateInverseField on the related model\n for (const field of fields) {\n await this.fieldMetadataService.updateInverseField(field, fieldRepository, modelRepository);\n }\n }\n\n async update(id: number, updateModelMetaDataDto: UpdateModelMetaDataDto) {\n //To DO start the transaction \n // call create In db\n // call createInfile\n\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const fieldRepository = manager.getRepository(FieldMetadata);\n\n // Step 1: Write initial data to the database\n const model = await this.updateInDb(manager, id, updateModelMetaDataDto)\n await this.updateInFile(model.id, modelRepository);\n\n await this.handleInverseRelationFieldsUpdates(model, fieldRepository, modelRepository);\n\n // return model\n });\n } catch (error: any) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n async createInDB(manager: EntityManager, createDto: CreateModelMetadataDto) {\n\n //Save the model\n const resolvedModule = await this.dataSource\n .getRepository(ModuleMetadata)\n .findOne({\n where: {\n id: createDto['moduleId'],\n },\n relations: {},\n });\n createDto['module'] = resolvedModule;\n\n if (createDto['parentModelId']) {\n const resolvedParentModel = await this.dataSource\n .getRepository(ModelMetadata)\n .findOne({\n where: {\n id: createDto['parentModelId'],\n },\n relations: {},\n });\n createDto['parentModel'] = resolvedParentModel;\n }\n\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = createDto;\n const modelMetadata = this.modelMetadataRepo.create(modelMetaDataWithoutFields);\n let model = await manager.save(modelMetadata);\n\n // iterate over all fields and upsert. \n let userKeyField = null;\n const listViewLayout = [];\n const formViewLayout = [];\n const treeViewLayout = [];\n\n for (let k = 0; k < fieldsMetadata.length; k++) {\n const fieldMetadata = fieldsMetadata[k];\n\n // TODO: resolve model & mediaStorageProvider. \n fieldMetadata['model'] = model;\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n // console.log(fieldMetadata.displayName);\n // this.logger.debug(fieldMetadata.displayName);\n\n const fieldMetadataObject = this.fieldMetadataRepo.create(fieldMetadata);\n const affectedField = await manager.save(fieldMetadataObject);\n\n if (fieldMetadata.isUserKey) {\n userKeyField = affectedField;\n }\n listViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n formViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n treeViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n\n }\n\n // Now that we have created fields & model update the model to stamp the userKeyField. \n if (userKeyField) {\n modelMetaDataWithoutFields['userKeyField'] = userKeyField;\n const updatedModelMetadataDto = this.modelMetadataRepo.merge(model, modelMetaDataWithoutFields);\n model = await manager.save(updatedModelMetadataDto);\n }\n\n return model;\n }\n\n async createInFile(modelId: any, repo: Repository<ModelMetadata>) {\n try {\n const model = await repo.findOne({\n where: {\n id: modelId,\n },\n relations: [\"fields\", \"fields.mediaStorageProvider\", \"module\", \"parentModel\"], //FIXME: Check with jenender and change to relations to avoid confusion\n });\n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const modelMetaData = {\n singularName: model.singularName,\n pluralName: model.pluralName,\n displayName: model.displayName,\n description: model.description,\n dataSource: model.dataSource,\n dataSourceType: model.dataSourceType,\n tableName: model.tableName,\n userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,\n isChild: model?.isChild,\n isLegacyTable: model?.isLegacyTable,\n isLegacyTableWithId: model?.isLegacyTableWithId,\n parentModelUserKey: model?.parentModel?.singularName,\n enableAuditTracking: model?.enableAuditTracking,\n enableSoftDelete: model?.enableSoftDelete,\n draftPublishWorkflow: model?.draftPublishWorkflow,\n internationalisation: model?.internationalisation,\n fields: []\n }\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (field.isSystem) continue;\n const fieldObject: Record<string, any> = await this.fieldMetadataService.createFieldConfig(field);\n modelMetaData.fields.push(fieldObject);\n }\n // Update the `models` array\n metaData.moduleMetadata.models.push(modelMetaData);\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error: any) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async updateInDb(manager: EntityManager, id: number, updateModelMetaDataDto: UpdateModelMetaDataDto) {\n\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = updateModelMetaDataDto;\n const modelRepo = manager.getRepository(ModelMetadata);\n const fieldRepo = manager.getRepository(FieldMetadata);\n // 1. Update the model metadata without fields\n let existingModel = await modelRepo.findOne({\n where: {\n singularName: updateModelMetaDataDto.singularName\n },\n relations: [\"fields\", \"module\"], //FIXME: Check with jenender and change to relations to avoid confusion\n });\n\n if (!existingModel) {\n throw new Error(ERROR_MESSAGES.MODEL_NOT_FOUND(updateModelMetaDataDto.singularName));\n }\n\n const updatedModel = modelRepo.merge(existingModel, modelMetaDataWithoutFields);\n await modelRepo.save(updatedModel);\n\n const existingFields = existingModel.fields || [];\n const existingFieldIds = existingFields.map((field) => field.id);\n\n // 2. Synchronize fields\n // const userKeyFieldName = updateModelMetaDataDto.userKeyFieldUserKey;\n let userKeyField = null;\n\n const fieldsToSave: FieldMetadata[] = [];\n const fieldsToDelete: FieldMetadata[] = [];\n\n for (const fieldMetadata of fieldsMetadata) {\n if (fieldMetadata.id) {\n // Existing field\n const existingField = existingFields.find((field) => field.id === fieldMetadata.id);\n if (existingField) {\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n Object.assign(existingField, fieldMetadata);\n fieldsToSave.push(existingField);\n }\n } else {\n // New field\n fieldMetadata['model'] = updatedModel;\n\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n const createdField = fieldRepo.create(fieldMetadata);\n fieldsToSave.push(createdField);\n }\n\n // Check for userKeyField\n // if (fieldMetadata.isUserKey) {\n // userKeyField = fieldMetadata;\n // }\n }\n\n // Fields to delete (not in the payload)\n fieldsToDelete.push(...existingFields.filter((field) => !fieldsMetadata.some((f) => f.id === field.id)));\n\n // Save and remove fields\n if (fieldsToSave.length > 0) {\n await fieldRepo.save(fieldsToSave);\n }\n if (fieldsToDelete.length > 0) {\n fieldsToDelete.forEach(field => { field.isMarkedForRemoval = true })\n await fieldRepo.save(fieldsToDelete);\n\n // await this.fieldMetadataRepo.remove(fieldsToDelete);\n }\n\n const finalModel = await modelRepo.findOne({\n where: { id: updatedModel.id },\n relations: [\"fields\", \"userKeyField\"]\n });\n\n // 3. Update model with userKeyField if specified\n const userKeyFields = fieldsMetadata.filter(field => field.isUserKey);\n\n if (userKeyFields.length > 0) {\n const newUserKeyField = userKeyFields[userKeyFields.length - 1];\n const savedUserKeyField = await fieldRepo.findOne({ where: { id: newUserKeyField.id } });\n\n if (savedUserKeyField) {\n finalModel.userKeyField = savedUserKeyField;\n await modelRepo.save(finalModel);\n }\n\n const otherUserKeyFields = userKeyFields.filter(field => field.id !== newUserKeyField.id);\n\n for (const field of otherUserKeyFields) {\n const existingField = await fieldRepo.findOne({ where: { id: field.id } });\n if (existingField) {\n existingField.isUserKey = false;\n await fieldRepo.save(existingField);\n }\n }\n } else {\n if (finalModel.userKeyField) {\n finalModel.userKeyField = null;\n await modelRepo.save(finalModel);\n }\n }\n\n return updatedModel;\n\n }\n\n async updateInFile(modelId: any, repo: Repository<ModelMetadata>) {\n try {\n\n const model = await repo.findOne({\n where: {\n id: modelId,\n },\n relations: [\"fields\", \"fields.mediaStorageProvider\", \"module\", \"parentModel\"], //FIXME: Check with jenender and change to relations to avoid confusion\n order: {\n fields: {\n id: \"ASC\",\n },\n },\n });\n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const modelMetaData = {\n singularName: model.singularName,\n pluralName: model.pluralName,\n displayName: model.displayName,\n description: model.description,\n dataSource: model.dataSource,\n dataSourceType: model.dataSourceType,\n tableName: model.tableName,\n userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,\n isChild: model?.isChild,\n parentModelUserKey: model?.parentModel?.singularName,\n enableAuditTracking: model?.enableAuditTracking,\n enableSoftDelete: model?.enableSoftDelete,\n draftPublishWorkflow: model?.draftPublishWorkflow,\n internationalisation: model?.internationalisation,\n fields: []\n }\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (!field.isSystem) {\n\n const fieldObject: Record<string, any> = await this.fieldMetadataService.createFieldConfig(field);\n if (field.isMarkedForRemoval) {\n fieldObject.isMarkedForRemoval = true;\n }\n modelMetaData.fields.push(fieldObject);\n }\n }\n\n // Check if the model already exists in `models`\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === modelMetaData.singularName\n );\n\n if (existingModelIndex !== -1) {\n // Update the existing model\n metaData.moduleMetadata.models[existingModelIndex] = modelMetaData;\n } else {\n // Add the new model\n metaData.moduleMetadata.models.push(modelMetaData);\n }\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error: any) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async upsert(updateDto: UpdateModelMetaDataDto) {\n // First check if module already exists using name\n const existingModelMetadata = await this.modelMetadataRepo.findOne({\n where: {\n singularName: updateDto.singularName\n }\n })\n\n // if found\n if (existingModelMetadata) {\n const updatedModelMetadata = { ...existingModelMetadata, ...updateDto };\n const updatedModel = await this.modelMetadataRepo.save(updatedModelMetadata);\n return updatedModel\n }\n // if not found - create new \n else {\n const modelMetadata = this.modelMetadataRepo.create(updateDto);\n return this.modelMetadataRepo.save(modelMetadata);\n }\n }\n\n async removeBySingularName(singularName: string) {\n try {\n const entity = await this.findOneBySingularName(singularName);\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n return r;\n } catch (error: any) {\n }\n }\n\n async deleteMany(ids: number[]): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n const removedEntities = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n //@ts-ignore\n id: id,\n }\n });\n // if (!entity) {\n // throw new Error(`Entity with id ${ id } not found`);\n // }\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n removedEntities.push(r);\n }\n\n return removedEntities\n }\n\n @DisallowInProduction()\n async remove(id: number) {\n const entity = await this.findOne(id);\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n return r\n }\n\n async cleanupOnDelete(modelEntityId: number) {\n const modelEntity = await this.modelMetadataRepo.findOne({\n where: {\n // @ts-ignore\n id: modelEntityId,\n },\n relations: ['module']\n });\n\n if (!modelEntity) {\n this.logger.log(`Invalid modelEntityId: ${modelEntityId} unable to resolve model metadata`);\n return;\n }\n if (modelEntity.id !== modelEntityId) {\n this.logger.log(`Invalid modelEntityId: ${modelEntityId} unable to resolve model metadata id ${modelEntity.id} not matching with the one passed as argument ${modelEntityId}`);\n return;\n }\n\n this.logger.log(`Cleaning up for model: ${modelEntity.singularName} belonging to module: ${modelEntity.module?.name}`);\n\n const modulePath = await this.moduleMetadataHelperService.getModulePath(modelEntity.module?.name);\n if (modulePath) {\n // /Users/harishpatel/Code/javascript/school-fees-portal/solid-api/src/solid-core\n this.logger.log(`Module path: ${modulePath}`);\n\n const filesToDelete = [];\n // <singularName>.entity.ts | The TypeORM model that needs to be deleted. | Automatic\n const entityFilePath = `${modulePath}/entities/${kebabCase(modelEntity.singularName)}.entity.ts`;\n filesToDelete.push(entityFilePath);\n this.logger.log(`About to delete entity file path: ${entityFilePath}`);\n\n // <singularName>.create.dto.ts | The TypeORM model that needs to be deleted. | Automatic\n const createDtoFilePath = `${modulePath}/dtos/create-${kebabCase(modelEntity.singularName)}.dto.ts`;\n filesToDelete.push(createDtoFilePath);\n this.logger.log(`About to delete create DTO file path: ${createDtoFilePath}`);\n\n // <singularName>.update.dto.ts | The TypeORM model that needs to be deleted. | Automatic\n const updateDtoFilePath = `${modulePath}/dtos/update-${kebabCase(modelEntity.singularName)}.dto.ts`;\n filesToDelete.push(updateDtoFilePath);\n this.logger.log(`About to delete update DTO file path: ${updateDtoFilePath}`);\n\n // <singularName>.repository.ts | The TypeORM model that needs to be deleted. | Automatic\n const repositoryFilePath = `${modulePath}/repositories/${kebabCase(modelEntity.singularName)}.repository.ts`;\n filesToDelete.push(repositoryFilePath);\n this.logger.log(`About to delete repository file path: ${repositoryFilePath}`);\n\n // <singularName>.service.ts | The TypeORM model that needs to be deleted. | Automatic\n const serviceFilePath = `${modulePath}/services/${kebabCase(modelEntity.singularName)}.service.ts`;\n filesToDelete.push(serviceFilePath);\n this.logger.log(`About to delete service file path: ${serviceFilePath}`);\n\n // <singularName>.controller.ts | The TypeORM model that needs to be deleted. | Automatic\n const controllerFilePath = `${modulePath}/controllers/${kebabCase(modelEntity.singularName)}.controller.ts`;\n filesToDelete.push(controllerFilePath);\n this.logger.log(`About to delete controller file path: ${controllerFilePath}`);\n\n for (let i = 0; i < filesToDelete.length; i++) {\n const fileToDelete = filesToDelete[i];\n try {\n await fs.unlink(fileToDelete);\n this.logger.log(`Deleted file: ${fileToDelete}`);\n } catch (error: any) {\n this.logger.error(`Error deleting file: ${fileToDelete}`, error);\n }\n }\n }\n\n await this.dataSource.query(\n `CALL cleanup_model_metadata($1, $2)`,\n [modelEntity.singularName, true],\n );\n\n // Delete the permissions, menu, actions & views related to this model.\n // const controllerName = `${classify(modelEntity.singularName)}Controller`;\n // const permissionNames = [\n // `${controllerName}.delete`,\n // `${controllerName}.deleteMany`,\n // `${controllerName}.findOne`,\n // `${controllerName}.findMany`,\n // `${controllerName}.recover`,\n // `${controllerName}.recoverMany`,\n // `${controllerName}.partialUpdate`,\n // `${controllerName}.update`,\n // `${controllerName}.insertMany`,\n // `${controllerName}.create`,\n // ];\n // const permissionsRepo = this.dataSource.getRepository(PermissionMetadata);\n // const permissionsToDelete = await permissionsRepo.find({\n // where: { name: In(permissionNames) },\n // relations: ['roles'],\n // });\n\n // Remove role associations first\n // for (const permission of permissionsToDelete) {\n // if (permission.roles?.length) {\n // await this.dataSource\n // .createQueryBuilder()\n // .relation(PermissionMetadata, 'roles')\n // .of(permission) // permission instance or its ID\n // .remove(permission.roles); // remove all linked roles\n // }\n // }\n\n // await permissionsRepo.remove(permissionsToDelete);\n\n // Delete actions\n // const actionRepo = this.dataSource.getRepository(ActionMetadata);\n // const action = await actionRepo.findOne({ where: { model: { id: modelEntity.id } } });\n // await actionRepo.delete({ model: { id: modelEntity.id } });\n\n // // Delete menu items\n // const menuItemRepo = this.dataSource.getRepository(MenuItemMetadata);\n // if (action) {\n // const menuItems = await menuItemRepo.find({ where: { action: { id: action.id } } });\n // for (let i = 0; i < menuItems.length; i++) {\n // const menuItem = menuItems[i];\n // await menuItemRepo.remove(menuItem);\n // }\n // }\n\n // Delete view \n // const viewRepo = this.dataSource.getRepository(ViewMetadata);\n // await viewRepo.delete({ model: { id: modelEntity.id } })\n\n // <moduleName>-metadata.json | Remove references to this model in the model metadata, menu, action & view sections. | Automatic\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(modelEntity.module?.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n if (metaData) {\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === modelEntity.singularName\n );\n\n // Remove the model to be deleted from the metadata\n if (existingModelIndex !== -1) {\n metaData.moduleMetadata.models.splice(existingModelIndex, 1);\n }\n\n // Remove references to this model in the menu, action & view sections.\n metaData.moduleMetadata.menus = metaData.moduleMetadata?.menus?.filter(\n (menu: any) => menu.modelUserKey !== modelEntity.singularName\n );\n metaData.moduleMetadata.actions = metaData.moduleMetadata?.actions?.filter(\n (action: any) => action.modelUserKey !== modelEntity.singularName\n );\n metaData.moduleMetadata.views = metaData.moduleMetadata?.views?.filter(\n (view: any) => view.modelUserKey !== modelEntity.singularName\n );\n\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n }\n\n // <moduleName>.module.ts | Remove all references and imports of the deleted model files. | Automatic\n if (modulePath) {\n const moduleFilePath = path.resolve(modulePath, `${kebabCase(modelEntity.module?.name)}.module.ts`);\n this.logger.log(`Removing model '${modelEntity.singularName}' references from module file: ${moduleFilePath}`);\n try {\n this.solidTsMorphService.begin();\n const modelPathSegment = `/${kebabCase(modelEntity.singularName)}.`;\n const { removedIdentifiers } = this.solidTsMorphService.removeImports(\n moduleFilePath,\n spec => spec.includes(modelPathSegment)\n );\n this.solidTsMorphService.removeModuleMembers(moduleFilePath, removedIdentifiers);\n await this.solidTsMorphService.commit();\n } catch (error: any) {\n this.solidTsMorphService.rollback();\n this.logger.error(`Failed to clean up module file for model '${modelEntity.singularName}':`, error);\n }\n }\n\n // - | Drop database table | Removes the database table from the DB, this is a very risky step. Best to review all relations to other models etc and then do this manually | Manual (X)\n\n }\n\n @DisallowInProduction()\n async generateCodeViaCtl(modelId: number): Promise<string> {\n return this.commandService.executeCommandWithArgs({\n command: 'npx',\n args: ['@solixai/solidctl@latest', 'generate', 'model', `--id=${modelId}`],\n cwd: path.join(process.cwd(), '..'),\n });\n }\n\n @DisallowInProduction()\n async handleGenerateCode(options: CodeGenerationOptions): Promise<any> {\n const affectedModelIds = [], refreshModelCodeOutputLines = [], removeFieldCodeOutputLines = [];\n\n // Generate the code for the passed model\n const { model, removeFieldCodeOuput, refreshModelCodeOutput } = await this.generateCode(options);\n affectedModelIds.push(model.id);\n refreshModelCodeOutputLines.push(refreshModelCodeOutput);\n removeFieldCodeOutputLines.push(removeFieldCodeOuput);\n\n // Generate the code for models which are linked to fields having an inverse relation\n await this.generateCodeForInverseModels(model, options, affectedModelIds, refreshModelCodeOutputLines, removeFieldCodeOutputLines);\n\n // Generate the VAM config for all the affected models\n for (const modelId of affectedModelIds) {\n await this.generateVAMConfig(modelId);\n }\n\n // Return the aggregated code output\n return `${removeFieldCodeOutputLines.join('\\n')} \\n ${refreshModelCodeOutputLines.join('\\n')}`;\n }\n\n private async generateCodeForInverseModels(model: ModelMetadata, options: CodeGenerationOptions, affectedModelIds: any[], refreshModelCodeOutputLines: any[], removeFieldCodeOutputLines: any[]) {\n const coModelSingularNames = model.fields.\n filter(field => field.type === SolidFieldType.relation && field.relationCreateInverse === true)\n .map(field => field.relationCoModelSingularName);\n\n for (const singularName of coModelSingularNames) {\n const coModel = await this.findOneBySingularName(singularName);\n const inverseOptions: CodeGenerationOptions = {\n modelId: coModel.id,\n dryRun: options.dryRun\n };\n const { removeFieldCodeOuput, refreshModelCodeOutput } = await this.generateCode(inverseOptions);\n affectedModelIds.push(coModel.id);\n refreshModelCodeOutputLines.push(refreshModelCodeOutput);\n removeFieldCodeOutputLines.push(removeFieldCodeOuput);\n }\n }\n\n // Generate the View, Action and Menu configuration for the model\n async generateVAMConfig(modelId: number) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const model = await modelRepository.findOne({\n where: {\n id: modelId\n },\n relations: [\"fields\", \"module\"]\n });\n await this.populateVAMConfigInDb(model);\n await this.populateVAMConfigInFile(model);\n });\n } catch (error: any) {\n this.logger.error('generateVAMConfig Transaction failed:', error);\n throw error;\n }\n }\n\n private async populateVAMConfigInFile(model: ModelMetadata) {\n try {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const listViewLayoutFields = [{ type: \"field\", attrs: { name: `id` } }];\n const treeViewLayoutFields = [{ type: \"field\", attrs: { name: `id` } }];\n const formViewLayoutFields = [];\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (field.isSystem) continue;\n listViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n formViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n treeViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n }\n this.populateVAMConfigInFileInternal(formViewLayoutFields, model, listViewLayoutFields, treeViewLayoutFields, metaData);\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error: any) {\n // console.error('File creation failed:', error);\n this.logger.error('File updation failed for View, action, menus config:', error);\n throw new Error('File updation failed for View, action, menus config'); // Trigger rollback\n }\n }\n\n // Populate the View, Actions and Menus in the config file\n private populateVAMConfigInFileInternal(formViewLayoutFields: any[], model: ModelMetadata, listViewLayoutFields: { type: string; attrs: { name: string; }; }[], treeViewLayoutFields: { type: string; attrs: { name: string; }; }[], metaData: any) {\n const column1Fields = [];\n // const column2Fields = [];\n\n // Distribute fields between two columns\n for (let i = 0; i < formViewLayoutFields.length; i++) {\n // if (i % 2 === 0) {\n column1Fields.push(formViewLayoutFields[i]);\n // } else {\n // column2Fields.push(formViewLayoutFields[i]);\n // }\n }\n const actionName = `${model.singularName}-list-action`;\n const treeViewActionName = `${model.singularName}-tree-action`;\n const listViewName = `${model.singularName}-list-view`;\n const treeViewName = `${model.singularName}-tree-view`;\n const formViewName = `${model.singularName}-form-view`;\n const menuName = `${model.singularName}-menu-item`;\n const nextMenuSequenceNumber = (metaData.menus?.length ?? 0) + 1;\n\n const action = {\n displayName: `${model.displayName} List Action`,\n name: actionName,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: listViewName,\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`\n };\n\n const treeViewAction = {\n displayName: `${model.displayName} Tree View Action`,\n name: treeViewActionName,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: treeViewName,\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`\n };\n\n const menu = {\n displayName: `${model.displayName}`,\n name: menuName,\n sequenceNumber: nextMenuSequenceNumber,\n actionUserKey: actionName,\n moduleUserKey: `${model.module.name}`,\n parentMenuItemUserKey: \"\",\n iconName: \"\"\n };\n\n const modelListview = {\n name: listViewName,\n displayName: `${model.displayName}`,\n type: \"list\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"list\",\n attrs: {\n pagination: true,\n pageSizeOptions: [\n 10,\n 25,\n 50\n ],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: listViewLayoutFields\n }\n };\n\n const modelTreeview = {\n name: treeViewName,\n displayName: `${model.displayName}`,\n type: \"tree\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"tree\",\n attrs: {\n pagination: true,\n pageSizeOptions: [\n 10,\n 25,\n 50\n ],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: treeViewLayoutFields\n }\n };\n\n const modelFormView = {\n name: formViewName,\n displayName: `${model.displayName}`,\n type: \"form\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"form\",\n attrs: { name: \"form-1\", label: `${model.displayName}`, className: \"grid\" },\n children: [\n {\n type: \"sheet\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"row\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"column\",\n attrs: { name: \"group-1\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: column1Fields\n },\n // {\n // type: \"column\",\n // attrs: { name: \"group-2\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n // children: column2Fields\n // }\n ]\n },\n ]\n }\n ]\n }\n };\n\n // Utility function to check if an item with the same name already exists\n const notExists = (arr: any[], name: string) => !arr.some(item => item.name === name);\n\n if (notExists(metaData.menus, menuName)) {\n metaData.menus.push(menu);\n }\n\n if (notExists(metaData.actions, actionName)) {\n metaData.actions.push(action);\n }\n\n if (notExists(metaData.actions, treeViewActionName)) {\n metaData.actions.push(treeViewAction);\n }\n\n if (notExists(metaData.views, listViewName)) {\n metaData.views.push(modelListview);\n }\n\n if (notExists(metaData.views, treeViewName)) {\n metaData.views.push(modelTreeview);\n }\n\n if (notExists(metaData.views, formViewName)) {\n metaData.views.push(modelFormView);\n }\n // metaData.menus.push(menu);\n // metaData.actions.push(action);\n // metaData.views.push(modelListview);\n // metaData.views.push(modelFormView);\n }\n\n //Populate the View, Actions and Menus in the database\n private async populateVAMConfigInDb(model: ModelMetadata) {\n const jsonFieldsList = model.fields.filter((field: FieldMetadata) => field.isSystem !== true);\n\n const listViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`,\n isSearchable: true,\n }\n }));\n\n const treeViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`,\n isSearchable: true,\n }\n }));\n\n const formViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`\n }\n }));\n\n const midIndex = Math.ceil(formViewLayout.length / 2);\n const firstHalf = formViewLayout.slice(0, midIndex);\n const secondHalf = formViewLayout.slice(midIndex);\n\n const resolvedModule = await this.dataSource.getRepository(ModuleMetadata).findOne({\n where: { id: model.module.id }\n });\n\n const viewRepo = this.dataSource.getRepository(ViewMetadata);\n const actionRepo = this.dataSource.getRepository(ActionMetadata);\n const menuRepo = this.dataSource.getRepository(MenuItemMetadata);\n\n const modelViews = [\n {\n name: `${model.singularName}-list-view`,\n displayName: `${model.displayName}`,\n type: 'list',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"list\",\n attrs: {\n pagination: true,\n pageSizeOptions: [10, 25, 50],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: listViewLayout\n }, null, 3)\n },\n {\n name: `${model.singularName}-tree-view`,\n displayName: `${model.displayName}`,\n type: 'tree',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"tree\",\n attrs: {\n pagination: true,\n pageSizeOptions: [10, 25, 50],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: treeViewLayout\n }, null, 3)\n },\n {\n name: `${model.singularName}-form-view`,\n displayName: `${model.displayName}`,\n type: 'form',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"form\",\n attrs: { name: \"form-1\", label: `${model.displayName}`, className: \"grid\" },\n children: [\n {\n type: \"sheet\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"row\",\n attrs: { name: \"group-1\", label: \"\", className: \"\" },\n children: [\n {\n type: \"column\",\n attrs: { name: \"group-1\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: firstHalf\n },\n {\n type: \"column\",\n attrs: { name: \"group-2\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: secondHalf\n }\n ]\n }\n ]\n }\n ]\n }, null, 3)\n }\n ];\n\n for (const view of modelViews) {\n const existingView = await viewRepo.findOne({ where: { name: view.name } });\n\n if (!existingView) {\n const createdView = viewRepo.create(view);\n await viewRepo.save(createdView);\n }\n }\n\n let view = await viewRepo.findOne({ where: { name: `${model.singularName}-list-view` } });\n let treeView = await viewRepo.findOne({ where: { name: `${model.singularName}-tree-view` } });\n\n const actionData = {\n displayName: `${model.displayName} List Action`,\n name: `${model.singularName}-list-action`,\n type: \"solid\",\n domain: \"\" as any,\n context: \"\" as any,\n customComponent: \"\",\n customIsModal: true,\n serverEndpoint: \"\",\n view: view,\n module: resolvedModule,\n model: model\n };\n\n const treeViewActionData = {\n displayName: `${model.displayName} Tree View Action`,\n name: `${model.singularName}-tree-view-action`,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n view: treeView,\n module: resolvedModule,\n model: model\n };\n\n let existingAction = await actionRepo.findOne({ where: { name: actionData.name } });\n let existingTreeViewAction = await actionRepo.findOne({ where: { name: treeViewActionData.name } });\n\n if (!existingAction) {\n const createdAction = actionRepo.create(actionData);\n existingAction = await actionRepo.save(createdAction);\n }\n\n if (!existingTreeViewAction) {\n const createdTreeViewAction = actionRepo.create(treeViewActionData);\n existingTreeViewAction = await actionRepo.save(createdTreeViewAction);\n }\n\n const adminRole = await this.roleService.findRoleByName('Admin');\n\n const menuData = {\n displayName: `${model.displayName}`,\n name: `${model.singularName}-menu-item`,\n sequenceNumber: 1,\n action: existingAction,\n module: resolvedModule,\n roles: [adminRole],\n parentMenuItemUserKey: \"\"\n };\n\n let existingMenu = await menuRepo.findOne({ where: { name: menuData.name } });\n\n if (!existingMenu) {\n const createdMenu = menuRepo.create(menuData);\n await menuRepo.save(createdMenu);\n }\n }\n\n async generateCode(options: CodeGenerationOptions) {\n const query = {\n populate: [\"module\", \"fields\"]\n };\n\n const model = options.modelId\n ? await this.findOne(options.modelId, query)\n : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n options.fieldIdsForRemoval = model.fields\n .filter(field => field.isMarkedForRemoval)\n .map(field => field.id);\n\n const refreshModelCodeOutput = await this.generateModelCode(options);\n const removeFieldCodeOuput = await this.generateRemoveFieldsCode(options);\n return { model, removeFieldCodeOuput, refreshModelCodeOutput };\n }\n\n async generateRemoveFieldsCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.modelId && !options.modelUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n\n if (!options.fieldIdsForRemoval || options.fieldIdsForRemoval.length === 0) {\n return \"\";\n }\n\n const query = {\n populate: [\"module\", \"fields\"]\n };\n const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n //Filter out the fields by id\n const fieldsForRemoval = model.fields.filter((field) => options.fieldIdsForRemoval.includes(+field.id));\n const removeOutput = await this.executeRemoveFieldsCommand(model, fieldsForRemoval, options.dryRun);\n\n // Remove the fields from the database as well. This also checks, if the field is marked for removal\n fieldsForRemoval.forEach((field: FieldMetadata) => {\n if (field.isMarkedForRemoval) {\n this.fieldMetadataService.delete(field.id);\n }\n });\n\n // Remove the fields from metadata json file \n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n // Check if the model already exists in `models`\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === model.singularName\n );\n\n const modelMetaData = metaData.moduleMetadata.models[existingModelIndex];\n\n // Remove fields marked for removal from modelMetaData.fields\n modelMetaData.fields = modelMetaData.fields.filter((field: any) => field.isMarkedForRemoval !== true);\n\n if (existingModelIndex !== -1) {\n // Update the existing model\n metaData.moduleMetadata.models[existingModelIndex] = modelMetaData;\n } else {\n // Add the new model\n metaData.moduleMetadata.models.push(modelMetaData);\n }\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n return removeOutput;\n }\n\n async generateModelCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.modelId && !options.modelUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n\n const query = {\n populate: [\"module\", \"fields\", \"parentModel\", \"parentModel.module\"]\n };\n const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n //Execute the schematic command to refresh the model\n const refreshOuput = await this.executeRefreshModelCommand(model, options.dryRun);\n\n return `${refreshOuput}`;\n }\n\n private async executeRefreshModelCommand(model: ModelMetadata, dryRun: boolean = false): Promise<string> {\n const output = await this.schematicService.executeSchematicCommand(\n REFRESH_MODEL_COMMAND,\n {\n module: model.module.name,\n model: model.singularName,\n },\n dryRun\n );\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n private async executeRemoveFieldsCommand(model: ModelMetadata, fieldsForRemoval: FieldMetadata[], dryRun: boolean = false): Promise<string> {\n if (!fieldsForRemoval || fieldsForRemoval.length === 0) {\n return \"\";\n }\n const output = await this.schematicService.executeSchematicCommand(\n REMOVE_FIELDS_COMMAND,\n {\n module: model.module.name,\n model: model.singularName,\n fieldNamesForRemoval: fieldsForRemoval.map(field => field.name),\n },\n dryRun\n );\n\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n async updateUserKey(data: any) {\n const { modelName, fieldName } = data;\n\n const model = await this.modelMetadataRepo.findOne({\n where: { singularName: modelName },\n relations: ['fields', 'userKeyField'],\n });\n\n if (!model) {\n throw new Error(`Model with name ${modelName} not found`);\n }\n\n if (model.userKeyField) {\n throw new Error(`User key is already set to ${model.userKeyField.name}. No changes were made.`);\n }\n\n const fieldToUpdate = model.fields.find(field => field.name === fieldName);\n if (!fieldToUpdate) {\n throw new Error(`Field with name ${fieldName} not found in model ${modelName}`);\n }\n\n fieldToUpdate.isUserKey = true;\n\n model.userKeyField = fieldToUpdate;\n\n await this.modelMetadataRepo.save(model);\n\n return {\n message: `User key has been successfully updated to ${fieldName}.`,\n success: true\n };\n }\n\n private async getRelationInverseFields(modelId: number, repo: Repository<FieldMetadata>): Promise<FieldMetadata[]> {\n return await repo.find({\n where: {\n model: {\n id: modelId\n },\n type: SolidFieldType.relation,\n relationCreateInverse: true\n },\n relations: {\n model: {\n module: true\n }\n }\n });\n }\n\n async navigation(navigationDto: NavigationDto) {\n const { recordId, modelName, ...basicFilterDto } = navigationDto;\n\n const modelServiceInstanceWrapper =\n this.introspectService.getProvider(`${classify(modelName)}Service`);\n\n if (!modelServiceInstanceWrapper) {\n throw new BadRequestException(\n `Invalid model name (${modelName}) specified in Navigation.`,\n );\n }\n\n const modelService: CRUDService<any> = modelServiceInstanceWrapper.instance;\n\n const recs = await modelService.find(basicFilterDto);\n\n // navigation only works for paginated results\n if (!('records' in recs) || !('currentPage' in recs.meta)) {\n return {\n prev: null,\n next: null,\n meta: null,\n };\n }\n\n const { records, meta } = recs;\n\n // --------------------\n // Find record index in page\n // --------------------\n const index = records.findIndex(r => String(r.id) === String(recordId));\n\n if (index === -1) {\n throw new BadRequestException(`Record not found in current page`);\n }\n\n // --------------------\n // Pagination calculations\n // --------------------\n const limit = meta.perPage;\n const currentOffset = (meta.currentPage - 1) * meta.perPage;\n const currentIndexGlobal = currentOffset + index + 1;\n\n let prev: { record: any; offset: number; limit: number } | null = null;\n let next: { record: any; offset: number; limit: number } | null = null;\n\n // --------------------\n // PREV\n // --------------------\n if (index > 0) {\n prev = {\n record: records[index - 1],\n offset: currentOffset,\n limit,\n };\n } else if (meta.prevPage !== null) {\n const prevOffset = (meta.prevPage - 1) * meta.perPage;\n\n const prevPage = await modelService.find({\n ...basicFilterDto,\n offset: prevOffset,\n limit,\n });\n\n if ('records' in prevPage) {\n const record = prevPage.records.at(-1) ?? null;\n if (record) {\n prev = {\n record,\n offset: prevOffset,\n limit,\n };\n }\n }\n }\n\n // --------------------\n // NEXT\n // --------------------\n if (index < records.length - 1) {\n next = {\n record: records[index + 1],\n offset: currentOffset,\n limit,\n };\n } else if (meta.nextPage !== null) {\n const nextOffset = (meta.nextPage - 1) * meta.perPage;\n\n const nextPage = await modelService.find({\n ...basicFilterDto,\n offset: nextOffset,\n limit,\n });\n\n if ('records' in nextPage) {\n const record = nextPage.records[0] ?? null;\n if (record) {\n next = {\n record,\n offset: nextOffset,\n limit,\n };\n }\n }\n }\n\n // --------------------\n // RESPONSE\n // --------------------\n return {\n prev: prev\n ? {\n recordId: prev.record.id,\n offset: prev.offset,\n limit: prev.limit,\n }\n : null,\n\n next: next\n ? {\n recordId: next.record.id,\n offset: next.offset,\n limit: next.limit,\n }\n : null,\n meta: {\n totalRecords: meta.totalRecords,\n perPage: meta.perPage,\n currentPage: meta.currentPage,\n totalPages: meta.totalPages,\n\n currentIndexInPage: index,\n currentIndexGlobal,\n\n hasPrev: !!prev,\n hasNext: !!next,\n\n prevPage: meta.prevPage,\n nextPage: meta.nextPage,\n },\n\n };\n }\n\n}\n"]}
1
+ {"version":3,"file":"model-metadata.service.js","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { InjectDataSource } from '@nestjs/typeorm';\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport * as path from 'path';\nimport { DataSource, EntityManager, In, Repository, SelectQueryBuilder } from 'typeorm';\nimport { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';\nimport { ModelMetadata } from '../entities/model-metadata.entity';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\n\nimport { kebabCase } from 'lodash';\nimport { classify } from '../helpers/string.helper';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';\nimport { SolidFieldType } from 'src/dtos/create-field-metadata.dto';\nimport { PermissionMetadata } from 'src/entities/permission-metadata.entity';\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\nimport { FieldMetadataRepository } from 'src/repository/field-metadata.repository';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { BasicFilterDto } from '../dtos/basic-filters.dto';\nimport { UpdateModelMetaDataDto } from '../dtos/update-model-metadata.dto';\nimport { ActionMetadata } from '../entities/action-metadata.entity';\nimport { FieldMetadata } from '../entities/field-metadata.entity';\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { ViewMetadata } from '../entities/view-metadata.entity';\nimport {\n REFRESH_MODEL_COMMAND,\n REMOVE_FIELDS_COMMAND,\n SchematicService\n} from '../helpers/schematic.service';\nimport { CommandService } from '../helpers/command.service';\nimport { CodeGenerationOptions } from '../interfaces';\nimport { CrudHelperService } from './crud-helper.service';\nimport { FieldMetadataService } from './field-metadata.service';\nimport { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';\nimport { RoleMetadataService } from './role-metadata.service';\nimport { NavigationDto } from 'src/dtos/navigation.dto';\nimport { SolidIntrospectService } from './solid-introspect.service';\nimport { CRUDService } from './crud.service';\nimport { SolidTsMorphService } from './solid-ts-morph.service';\n\n@Injectable()\nexport class ModelMetadataService {\n private logger = new Logger('ModelMetadataService');\n constructor(\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly fieldMetadataRepo: FieldMetadataRepository,\n private readonly schematicService: SchematicService,\n private readonly commandService: CommandService,\n @InjectDataSource()\n private readonly dataSource: DataSource,\n private readonly crudHelperService: CrudHelperService,\n private readonly mediaStorageProviderMetadataService: MediaStorageProviderMetadataService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly roleService: RoleMetadataService,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n readonly introspectService: SolidIntrospectService,\n private readonly solidTsMorphService: SolidTsMorphService,\n\n // No longer used.\n // private readonly generateCodePublihser: GenerateCodePublisherDatabase,\n ) { }\n\n async find(basicFilterDto: BasicFilterDto) {\n return this.findMany(basicFilterDto);\n }\n\n async findMany(basicFilterDto: BasicFilterDto) {\n const alias = 'modelMetadata';\n // Extract the required keys from the input query\n let { limit, offset } = basicFilterDto;\n\n // Create above query on pincode table using query builder\n var qb: SelectQueryBuilder<ModelMetadata> = await this.modelMetadataRepo.createSecurityRuleAwareQueryBuilder(alias)\n qb = await this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);\n\n // Get the records and the count\n const [entities, count] = await qb.getManyAndCount();\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n const r = {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n return r\n }\n\n async findOne(id: any, query?: any) {\n // const { fields, filters, populate } = basicFilterDto;\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n id: id,\n },\n relations: query?.populate, //FIXME: Check with jenender and change to relations to avoid confusion\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(`#${id}`));\n }\n return entity;\n }\n\n async findOneBySingularName(singularName: string, relations = {}) {\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n singularName: singularName,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));\n }\n return entity;\n }\n\n async findOneByUserKey(singularName: string, relations = {}) {\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n singularName: singularName,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));\n }\n return entity;\n }\n\n async create(createDto: CreateModelMetadataDto) {\n\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const fieldRepository = manager.getRepository(FieldMetadata);\n\n // Step 1: Write initial data to the database\n const model = await this.createInDB(manager, createDto);\n await this.createInFile(model.id, modelRepository);\n\n await this.handleInverseRelationFieldsUpdates(model, fieldRepository, modelRepository);\n\n return model\n });\n } catch (error: any) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n // Iterate through the fields in the createDto & get all the relation fields which have create inverse as true\n private async handleInverseRelationFieldsUpdates(model: ModelMetadata, fieldRepository: Repository<FieldMetadata>, modelRepository: Repository<ModelMetadata>) {\n const fields: FieldMetadata[] = await this.getRelationInverseFields(model.id, fieldRepository);\n\n // Call a function which will iterate through each field and create an inverse field entry for the respective model i.e call updateInverseField on the related model\n for (const field of fields) {\n await this.fieldMetadataService.updateInverseField(field, fieldRepository, modelRepository);\n }\n }\n\n async update(id: number, updateModelMetaDataDto: UpdateModelMetaDataDto) {\n //To DO start the transaction \n // call create In db\n // call createInfile\n\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const fieldRepository = manager.getRepository(FieldMetadata);\n\n // Step 1: Write initial data to the database\n const model = await this.updateInDb(manager, id, updateModelMetaDataDto)\n await this.updateInFile(model.id, modelRepository);\n\n await this.handleInverseRelationFieldsUpdates(model, fieldRepository, modelRepository);\n\n // return model\n });\n } catch (error: any) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n async createInDB(manager: EntityManager, createDto: CreateModelMetadataDto) {\n\n //Save the model\n const resolvedModule = await this.dataSource\n .getRepository(ModuleMetadata)\n .findOne({\n where: {\n id: createDto['moduleId'],\n },\n relations: {},\n });\n createDto['module'] = resolvedModule;\n\n if (createDto['parentModelId']) {\n const resolvedParentModel = await this.dataSource\n .getRepository(ModelMetadata)\n .findOne({\n where: {\n id: createDto['parentModelId'],\n },\n relations: {},\n });\n createDto['parentModel'] = resolvedParentModel;\n }\n\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = createDto;\n const modelMetadata = this.modelMetadataRepo.create(modelMetaDataWithoutFields);\n let model = await manager.save(modelMetadata);\n\n // iterate over all fields and upsert. \n let userKeyField = null;\n const listViewLayout = [];\n const formViewLayout = [];\n const treeViewLayout = [];\n\n for (let k = 0; k < fieldsMetadata.length; k++) {\n const fieldMetadata = fieldsMetadata[k];\n\n // TODO: resolve model & mediaStorageProvider. \n fieldMetadata['model'] = model;\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n // console.log(fieldMetadata.displayName);\n // this.logger.debug(fieldMetadata.displayName);\n\n const fieldMetadataObject = this.fieldMetadataRepo.create(fieldMetadata);\n const affectedField = await manager.save(fieldMetadataObject);\n\n if (fieldMetadata.isUserKey) {\n userKeyField = affectedField;\n }\n listViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n formViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n treeViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n\n }\n\n // Now that we have created fields & model update the model to stamp the userKeyField. \n if (userKeyField) {\n modelMetaDataWithoutFields['userKeyField'] = userKeyField;\n const updatedModelMetadataDto = this.modelMetadataRepo.merge(model, modelMetaDataWithoutFields);\n model = await manager.save(updatedModelMetadataDto);\n }\n\n return model;\n }\n\n async createInFile(modelId: any, repo: Repository<ModelMetadata>) {\n try {\n const model = await repo.findOne({\n where: {\n id: modelId,\n },\n relations: [\"fields\", \"fields.mediaStorageProvider\", \"module\", \"parentModel\"], //FIXME: Check with jenender and change to relations to avoid confusion\n });\n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const modelMetaData = {\n singularName: model.singularName,\n pluralName: model.pluralName,\n displayName: model.displayName,\n description: model.description,\n dataSource: model.dataSource,\n dataSourceType: model.dataSourceType,\n tableName: model.tableName,\n userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,\n isChild: model?.isChild,\n isLegacyTable: model?.isLegacyTable,\n isLegacyTableWithId: model?.isLegacyTableWithId,\n parentModelUserKey: model?.parentModel?.singularName,\n enableAuditTracking: model?.enableAuditTracking,\n enableSoftDelete: model?.enableSoftDelete,\n draftPublishWorkflow: model?.draftPublishWorkflow,\n internationalisation: model?.internationalisation,\n fields: []\n }\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (field.isSystem) continue;\n const fieldObject: Record<string, any> = await this.fieldMetadataService.createFieldConfig(field);\n modelMetaData.fields.push(fieldObject);\n }\n // Update the `models` array\n metaData.moduleMetadata.models.push(modelMetaData);\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error: any) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async updateInDb(manager: EntityManager, id: number, updateModelMetaDataDto: UpdateModelMetaDataDto) {\n\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = updateModelMetaDataDto;\n const modelRepo = manager.getRepository(ModelMetadata);\n const fieldRepo = manager.getRepository(FieldMetadata);\n // 1. Update the model metadata without fields\n let existingModel = await modelRepo.findOne({\n where: {\n singularName: updateModelMetaDataDto.singularName\n },\n relations: [\"fields\", \"module\"], //FIXME: Check with jenender and change to relations to avoid confusion\n });\n\n if (!existingModel) {\n throw new Error(ERROR_MESSAGES.MODEL_NOT_FOUND(updateModelMetaDataDto.singularName));\n }\n\n const updatedModel = modelRepo.merge(existingModel, modelMetaDataWithoutFields);\n await modelRepo.save(updatedModel);\n\n const existingFields = existingModel.fields || [];\n const existingFieldIds = existingFields.map((field) => field.id);\n\n // 2. Synchronize fields\n // const userKeyFieldName = updateModelMetaDataDto.userKeyFieldUserKey;\n let userKeyField = null;\n\n const fieldsToSave: FieldMetadata[] = [];\n const fieldsToDelete: FieldMetadata[] = [];\n\n for (const fieldMetadata of fieldsMetadata) {\n if (fieldMetadata.id) {\n // Existing field\n const existingField = existingFields.find((field) => field.id === fieldMetadata.id);\n if (existingField) {\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n Object.assign(existingField, fieldMetadata);\n fieldsToSave.push(existingField);\n }\n } else {\n // New field\n fieldMetadata['model'] = updatedModel;\n\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n const createdField = fieldRepo.create(fieldMetadata);\n fieldsToSave.push(createdField);\n }\n\n // Check for userKeyField\n // if (fieldMetadata.isUserKey) {\n // userKeyField = fieldMetadata;\n // }\n }\n\n // Fields to delete (not in the payload)\n fieldsToDelete.push(...existingFields.filter((field) => !fieldsMetadata.some((f) => f.id === field.id)));\n\n // Save and remove fields\n if (fieldsToSave.length > 0) {\n await fieldRepo.save(fieldsToSave);\n }\n if (fieldsToDelete.length > 0) {\n fieldsToDelete.forEach(field => { field.isMarkedForRemoval = true })\n await fieldRepo.save(fieldsToDelete);\n\n // await this.fieldMetadataRepo.remove(fieldsToDelete);\n }\n\n const finalModel = await modelRepo.findOne({\n where: { id: updatedModel.id },\n relations: [\"fields\", \"userKeyField\"]\n });\n\n // 3. Update model with userKeyField if specified\n const userKeyFields = fieldsMetadata.filter(field => field.isUserKey);\n\n if (userKeyFields.length > 0) {\n const newUserKeyField = userKeyFields[userKeyFields.length - 1];\n const savedUserKeyField = await fieldRepo.findOne({ where: { id: newUserKeyField.id } });\n\n if (savedUserKeyField) {\n finalModel.userKeyField = savedUserKeyField;\n await modelRepo.save(finalModel);\n }\n\n const otherUserKeyFields = userKeyFields.filter(field => field.id !== newUserKeyField.id);\n\n for (const field of otherUserKeyFields) {\n const existingField = await fieldRepo.findOne({ where: { id: field.id } });\n if (existingField) {\n existingField.isUserKey = false;\n await fieldRepo.save(existingField);\n }\n }\n } else {\n if (finalModel.userKeyField) {\n finalModel.userKeyField = null;\n await modelRepo.save(finalModel);\n }\n }\n\n return updatedModel;\n\n }\n\n async updateInFile(modelId: any, repo: Repository<ModelMetadata>) {\n try {\n\n const model = await repo.findOne({\n where: {\n id: modelId,\n },\n relations: [\"fields\", \"fields.mediaStorageProvider\", \"module\", \"parentModel\"], //FIXME: Check with jenender and change to relations to avoid confusion\n order: {\n fields: {\n id: \"ASC\",\n },\n },\n });\n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const modelMetaData = {\n singularName: model.singularName,\n pluralName: model.pluralName,\n displayName: model.displayName,\n description: model.description,\n dataSource: model.dataSource,\n dataSourceType: model.dataSourceType,\n tableName: model.tableName,\n userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,\n isChild: model?.isChild,\n parentModelUserKey: model?.parentModel?.singularName,\n enableAuditTracking: model?.enableAuditTracking,\n enableSoftDelete: model?.enableSoftDelete,\n draftPublishWorkflow: model?.draftPublishWorkflow,\n internationalisation: model?.internationalisation,\n fields: []\n }\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (!field.isSystem) {\n\n const fieldObject: Record<string, any> = await this.fieldMetadataService.createFieldConfig(field);\n if (field.isMarkedForRemoval) {\n fieldObject.isMarkedForRemoval = true;\n }\n modelMetaData.fields.push(fieldObject);\n }\n }\n\n // Check if the model already exists in `models`\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === modelMetaData.singularName\n );\n\n if (existingModelIndex !== -1) {\n // Update the existing model\n metaData.moduleMetadata.models[existingModelIndex] = modelMetaData;\n } else {\n // Add the new model\n metaData.moduleMetadata.models.push(modelMetaData);\n }\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error: any) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async upsert(updateDto: UpdateModelMetaDataDto) {\n // First check if module already exists using name\n const existingModelMetadata = await this.modelMetadataRepo.findOne({\n where: {\n singularName: updateDto.singularName\n }\n })\n\n // if found\n if (existingModelMetadata) {\n const updatedModelMetadata = { ...existingModelMetadata, ...updateDto };\n const updatedModel = await this.modelMetadataRepo.save(updatedModelMetadata);\n return updatedModel\n }\n // if not found - create new \n else {\n const modelMetadata = this.modelMetadataRepo.create(updateDto);\n return this.modelMetadataRepo.save(modelMetadata);\n }\n }\n\n async removeBySingularName(singularName: string) {\n try {\n const entity = await this.findOneBySingularName(singularName);\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n return r;\n } catch (error: any) {\n }\n }\n\n async deleteMany(ids: number[]): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n const removedEntities = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n //@ts-ignore\n id: id,\n }\n });\n // if (!entity) {\n // throw new Error(`Entity with id ${ id } not found`);\n // }\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n removedEntities.push(r);\n }\n\n return removedEntities\n }\n\n @DisallowInProduction()\n async remove(id: number) {\n const entity = await this.findOne(id);\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n return r\n }\n\n async cleanupOnDelete(modelEntityId: number) {\n const modelEntity = await this.modelMetadataRepo.findOne({\n where: {\n // @ts-ignore\n id: modelEntityId,\n },\n relations: ['module']\n });\n\n if (!modelEntity) {\n this.logger.log(`Invalid modelEntityId: ${modelEntityId} unable to resolve model metadata`);\n return;\n }\n if (modelEntity.id !== modelEntityId) {\n this.logger.log(`Invalid modelEntityId: ${modelEntityId} unable to resolve model metadata id ${modelEntity.id} not matching with the one passed as argument ${modelEntityId}`);\n return;\n }\n\n this.logger.log(`Cleaning up for model: ${modelEntity.singularName} belonging to module: ${modelEntity.module?.name}`);\n\n const modulePath = await this.moduleMetadataHelperService.getModulePath(modelEntity.module?.name);\n if (modulePath) {\n // /Users/harishpatel/Code/javascript/school-fees-portal/solid-api/src/solid-core\n this.logger.log(`Module path: ${modulePath}`);\n\n const filesToDelete = [];\n // <singularName>.entity.ts | The TypeORM model that needs to be deleted. | Automatic\n const entityFilePath = `${modulePath}/entities/${kebabCase(modelEntity.singularName)}.entity.ts`;\n filesToDelete.push(entityFilePath);\n this.logger.log(`About to delete entity file path: ${entityFilePath}`);\n\n // <singularName>.create.dto.ts | The TypeORM model that needs to be deleted. | Automatic\n const createDtoFilePath = `${modulePath}/dtos/create-${kebabCase(modelEntity.singularName)}.dto.ts`;\n filesToDelete.push(createDtoFilePath);\n this.logger.log(`About to delete create DTO file path: ${createDtoFilePath}`);\n\n // <singularName>.update.dto.ts | The TypeORM model that needs to be deleted. | Automatic\n const updateDtoFilePath = `${modulePath}/dtos/update-${kebabCase(modelEntity.singularName)}.dto.ts`;\n filesToDelete.push(updateDtoFilePath);\n this.logger.log(`About to delete update DTO file path: ${updateDtoFilePath}`);\n\n // <singularName>.repository.ts | The TypeORM model that needs to be deleted. | Automatic\n const repositoryFilePath = `${modulePath}/repositories/${kebabCase(modelEntity.singularName)}.repository.ts`;\n filesToDelete.push(repositoryFilePath);\n this.logger.log(`About to delete repository file path: ${repositoryFilePath}`);\n\n // <singularName>.service.ts | The TypeORM model that needs to be deleted. | Automatic\n const serviceFilePath = `${modulePath}/services/${kebabCase(modelEntity.singularName)}.service.ts`;\n filesToDelete.push(serviceFilePath);\n this.logger.log(`About to delete service file path: ${serviceFilePath}`);\n\n // <singularName>.controller.ts | The TypeORM model that needs to be deleted. | Automatic\n const controllerFilePath = `${modulePath}/controllers/${kebabCase(modelEntity.singularName)}.controller.ts`;\n filesToDelete.push(controllerFilePath);\n this.logger.log(`About to delete controller file path: ${controllerFilePath}`);\n\n for (let i = 0; i < filesToDelete.length; i++) {\n const fileToDelete = filesToDelete[i];\n try {\n await fs.unlink(fileToDelete);\n this.logger.log(`Deleted file: ${fileToDelete}`);\n } catch (error: any) {\n this.logger.error(`Error deleting file: ${fileToDelete}`, error);\n }\n }\n }\n\n await this.dataSource.query(\n `CALL cleanup_model_metadata($1, $2)`,\n [modelEntity.singularName, true],\n );\n\n // Delete the permissions, menu, actions & views related to this model.\n // const controllerName = `${classify(modelEntity.singularName)}Controller`;\n // const permissionNames = [\n // `${controllerName}.delete`,\n // `${controllerName}.deleteMany`,\n // `${controllerName}.findOne`,\n // `${controllerName}.findMany`,\n // `${controllerName}.recover`,\n // `${controllerName}.recoverMany`,\n // `${controllerName}.partialUpdate`,\n // `${controllerName}.update`,\n // `${controllerName}.insertMany`,\n // `${controllerName}.create`,\n // ];\n // const permissionsRepo = this.dataSource.getRepository(PermissionMetadata);\n // const permissionsToDelete = await permissionsRepo.find({\n // where: { name: In(permissionNames) },\n // relations: ['roles'],\n // });\n\n // Remove role associations first\n // for (const permission of permissionsToDelete) {\n // if (permission.roles?.length) {\n // await this.dataSource\n // .createQueryBuilder()\n // .relation(PermissionMetadata, 'roles')\n // .of(permission) // permission instance or its ID\n // .remove(permission.roles); // remove all linked roles\n // }\n // }\n\n // await permissionsRepo.remove(permissionsToDelete);\n\n // Delete actions\n // const actionRepo = this.dataSource.getRepository(ActionMetadata);\n // const action = await actionRepo.findOne({ where: { model: { id: modelEntity.id } } });\n // await actionRepo.delete({ model: { id: modelEntity.id } });\n\n // // Delete menu items\n // const menuItemRepo = this.dataSource.getRepository(MenuItemMetadata);\n // if (action) {\n // const menuItems = await menuItemRepo.find({ where: { action: { id: action.id } } });\n // for (let i = 0; i < menuItems.length; i++) {\n // const menuItem = menuItems[i];\n // await menuItemRepo.remove(menuItem);\n // }\n // }\n\n // Delete view \n // const viewRepo = this.dataSource.getRepository(ViewMetadata);\n // await viewRepo.delete({ model: { id: modelEntity.id } })\n\n // <moduleName>-metadata.json | Remove references to this model in the model metadata, menu, action & view sections. | Automatic\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(modelEntity.module?.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n if (metaData) {\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === modelEntity.singularName\n );\n\n // Remove the model to be deleted from the metadata\n if (existingModelIndex !== -1) {\n metaData.moduleMetadata.models.splice(existingModelIndex, 1);\n }\n\n // Remove references to this model in the menu, action & view sections.\n metaData.moduleMetadata.menus = metaData.moduleMetadata?.menus?.filter(\n (menu: any) => menu.modelUserKey !== modelEntity.singularName\n );\n metaData.moduleMetadata.actions = metaData.moduleMetadata?.actions?.filter(\n (action: any) => action.modelUserKey !== modelEntity.singularName\n );\n metaData.moduleMetadata.views = metaData.moduleMetadata?.views?.filter(\n (view: any) => view.modelUserKey !== modelEntity.singularName\n );\n\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n }\n\n // <moduleName>.module.ts | Remove all references and imports of the deleted model files. | Automatic\n if (modulePath) {\n const moduleFilePath = path.resolve(modulePath, `${kebabCase(modelEntity.module?.name)}.module.ts`);\n this.logger.log(`Removing model '${modelEntity.singularName}' references from module file: ${moduleFilePath}`);\n try {\n this.solidTsMorphService.begin();\n const modelPathSegment = `/${kebabCase(modelEntity.singularName)}.`;\n const { removedIdentifiers } = this.solidTsMorphService.removeImports(\n moduleFilePath,\n spec => spec.includes(modelPathSegment)\n );\n this.solidTsMorphService.removeModuleMembers(moduleFilePath, removedIdentifiers);\n await this.solidTsMorphService.commit();\n } catch (error: any) {\n this.solidTsMorphService.rollback();\n this.logger.error(`Failed to clean up module file for model '${modelEntity.singularName}':`, error);\n }\n }\n\n // - | Drop database table | Removes the database table from the DB, this is a very risky step. Best to review all relations to other models etc and then do this manually | Manual (X)\n\n }\n\n @DisallowInProduction()\n async generateCodeViaCtl(modelId: number): Promise<string> {\n const model = await this.findOne(modelId);\n return this.commandService.executeCommandWithArgs({\n command: 'npx',\n args: ['@solixai/solidctl@latest', 'generate', 'model', `--name=${model.singularName}`],\n cwd: path.join(process.cwd(), '..'),\n });\n }\n\n @DisallowInProduction()\n async handleGenerateCode(options: CodeGenerationOptions): Promise<any> {\n const affectedModelIds = [], refreshModelCodeOutputLines = [], removeFieldCodeOutputLines = [];\n\n // Generate the code for the passed model\n const { model, removeFieldCodeOuput, refreshModelCodeOutput } = await this.generateCode(options);\n affectedModelIds.push(model.id);\n refreshModelCodeOutputLines.push(refreshModelCodeOutput);\n removeFieldCodeOutputLines.push(removeFieldCodeOuput);\n\n // Generate the code for models which are linked to fields having an inverse relation\n await this.generateCodeForInverseModels(model, options, affectedModelIds, refreshModelCodeOutputLines, removeFieldCodeOutputLines);\n\n // Generate the VAM config for all the affected models\n for (const modelId of affectedModelIds) {\n await this.generateVAMConfig(modelId);\n }\n\n // Return the aggregated code output\n return `${removeFieldCodeOutputLines.join('\\n')} \\n ${refreshModelCodeOutputLines.join('\\n')}`;\n }\n\n private async generateCodeForInverseModels(model: ModelMetadata, options: CodeGenerationOptions, affectedModelIds: any[], refreshModelCodeOutputLines: any[], removeFieldCodeOutputLines: any[]) {\n const coModelSingularNames = model.fields.\n filter(field => field.type === SolidFieldType.relation && field.relationCreateInverse === true)\n .map(field => field.relationCoModelSingularName);\n\n for (const singularName of coModelSingularNames) {\n const coModel = await this.findOneBySingularName(singularName);\n const inverseOptions: CodeGenerationOptions = {\n modelId: coModel.id,\n dryRun: options.dryRun\n };\n const { removeFieldCodeOuput, refreshModelCodeOutput } = await this.generateCode(inverseOptions);\n affectedModelIds.push(coModel.id);\n refreshModelCodeOutputLines.push(refreshModelCodeOutput);\n removeFieldCodeOutputLines.push(removeFieldCodeOuput);\n }\n }\n\n // Generate the View, Action and Menu configuration for the model\n async generateVAMConfig(modelId: number) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const model = await modelRepository.findOne({\n where: {\n id: modelId\n },\n relations: [\"fields\", \"module\"]\n });\n await this.populateVAMConfigInDb(model);\n await this.populateVAMConfigInFile(model);\n });\n } catch (error: any) {\n this.logger.error('generateVAMConfig Transaction failed:', error);\n throw error;\n }\n }\n\n private async populateVAMConfigInFile(model: ModelMetadata) {\n try {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const listViewLayoutFields = [{ type: \"field\", attrs: { name: `id` } }];\n const treeViewLayoutFields = [{ type: \"field\", attrs: { name: `id` } }];\n const formViewLayoutFields = [];\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (field.isSystem) continue;\n listViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n formViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n treeViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n }\n this.populateVAMConfigInFileInternal(formViewLayoutFields, model, listViewLayoutFields, treeViewLayoutFields, metaData);\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error: any) {\n // console.error('File creation failed:', error);\n this.logger.error('File updation failed for View, action, menus config:', error);\n throw new Error('File updation failed for View, action, menus config'); // Trigger rollback\n }\n }\n\n // Populate the View, Actions and Menus in the config file\n private populateVAMConfigInFileInternal(formViewLayoutFields: any[], model: ModelMetadata, listViewLayoutFields: { type: string; attrs: { name: string; }; }[], treeViewLayoutFields: { type: string; attrs: { name: string; }; }[], metaData: any) {\n const column1Fields = [];\n // const column2Fields = [];\n\n // Distribute fields between two columns\n for (let i = 0; i < formViewLayoutFields.length; i++) {\n // if (i % 2 === 0) {\n column1Fields.push(formViewLayoutFields[i]);\n // } else {\n // column2Fields.push(formViewLayoutFields[i]);\n // }\n }\n const actionName = `${model.singularName}-list-action`;\n const treeViewActionName = `${model.singularName}-tree-action`;\n const listViewName = `${model.singularName}-list-view`;\n const treeViewName = `${model.singularName}-tree-view`;\n const formViewName = `${model.singularName}-form-view`;\n const menuName = `${model.singularName}-menu-item`;\n const nextMenuSequenceNumber = (metaData.menus?.length ?? 0) + 1;\n\n const action = {\n displayName: `${model.displayName} List Action`,\n name: actionName,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: listViewName,\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`\n };\n\n const treeViewAction = {\n displayName: `${model.displayName} Tree View Action`,\n name: treeViewActionName,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: treeViewName,\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`\n };\n\n const menu = {\n displayName: `${model.displayName}`,\n name: menuName,\n sequenceNumber: nextMenuSequenceNumber,\n actionUserKey: actionName,\n moduleUserKey: `${model.module.name}`,\n parentMenuItemUserKey: \"\",\n iconName: \"\"\n };\n\n const modelListview = {\n name: listViewName,\n displayName: `${model.displayName}`,\n type: \"list\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"list\",\n attrs: {\n pagination: true,\n pageSizeOptions: [\n 10,\n 25,\n 50\n ],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: listViewLayoutFields\n }\n };\n\n const modelTreeview = {\n name: treeViewName,\n displayName: `${model.displayName}`,\n type: \"tree\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"tree\",\n attrs: {\n pagination: true,\n pageSizeOptions: [\n 10,\n 25,\n 50\n ],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: treeViewLayoutFields\n }\n };\n\n const modelFormView = {\n name: formViewName,\n displayName: `${model.displayName}`,\n type: \"form\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"form\",\n attrs: { name: \"form-1\", label: `${model.displayName}`, className: \"grid\" },\n children: [\n {\n type: \"sheet\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"row\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"column\",\n attrs: { name: \"group-1\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: column1Fields\n },\n // {\n // type: \"column\",\n // attrs: { name: \"group-2\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n // children: column2Fields\n // }\n ]\n },\n ]\n }\n ]\n }\n };\n\n // Utility function to check if an item with the same name already exists\n const notExists = (arr: any[], name: string) => !arr.some(item => item.name === name);\n\n if (notExists(metaData.menus, menuName)) {\n metaData.menus.push(menu);\n }\n\n if (notExists(metaData.actions, actionName)) {\n metaData.actions.push(action);\n }\n\n if (notExists(metaData.actions, treeViewActionName)) {\n metaData.actions.push(treeViewAction);\n }\n\n if (notExists(metaData.views, listViewName)) {\n metaData.views.push(modelListview);\n }\n\n if (notExists(metaData.views, treeViewName)) {\n metaData.views.push(modelTreeview);\n }\n\n if (notExists(metaData.views, formViewName)) {\n metaData.views.push(modelFormView);\n }\n // metaData.menus.push(menu);\n // metaData.actions.push(action);\n // metaData.views.push(modelListview);\n // metaData.views.push(modelFormView);\n }\n\n //Populate the View, Actions and Menus in the database\n private async populateVAMConfigInDb(model: ModelMetadata) {\n const jsonFieldsList = model.fields.filter((field: FieldMetadata) => field.isSystem !== true);\n\n const listViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`,\n isSearchable: true,\n }\n }));\n\n const treeViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`,\n isSearchable: true,\n }\n }));\n\n const formViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`\n }\n }));\n\n const midIndex = Math.ceil(formViewLayout.length / 2);\n const firstHalf = formViewLayout.slice(0, midIndex);\n const secondHalf = formViewLayout.slice(midIndex);\n\n const resolvedModule = await this.dataSource.getRepository(ModuleMetadata).findOne({\n where: { id: model.module.id }\n });\n\n const viewRepo = this.dataSource.getRepository(ViewMetadata);\n const actionRepo = this.dataSource.getRepository(ActionMetadata);\n const menuRepo = this.dataSource.getRepository(MenuItemMetadata);\n\n const modelViews = [\n {\n name: `${model.singularName}-list-view`,\n displayName: `${model.displayName}`,\n type: 'list',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"list\",\n attrs: {\n pagination: true,\n pageSizeOptions: [10, 25, 50],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: listViewLayout\n }, null, 3)\n },\n {\n name: `${model.singularName}-tree-view`,\n displayName: `${model.displayName}`,\n type: 'tree',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"tree\",\n attrs: {\n pagination: true,\n pageSizeOptions: [10, 25, 50],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: treeViewLayout\n }, null, 3)\n },\n {\n name: `${model.singularName}-form-view`,\n displayName: `${model.displayName}`,\n type: 'form',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"form\",\n attrs: { name: \"form-1\", label: `${model.displayName}`, className: \"grid\" },\n children: [\n {\n type: \"sheet\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"row\",\n attrs: { name: \"group-1\", label: \"\", className: \"\" },\n children: [\n {\n type: \"column\",\n attrs: { name: \"group-1\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: firstHalf\n },\n {\n type: \"column\",\n attrs: { name: \"group-2\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: secondHalf\n }\n ]\n }\n ]\n }\n ]\n }, null, 3)\n }\n ];\n\n for (const view of modelViews) {\n const existingView = await viewRepo.findOne({ where: { name: view.name } });\n\n if (!existingView) {\n const createdView = viewRepo.create(view);\n await viewRepo.save(createdView);\n }\n }\n\n let view = await viewRepo.findOne({ where: { name: `${model.singularName}-list-view` } });\n let treeView = await viewRepo.findOne({ where: { name: `${model.singularName}-tree-view` } });\n\n const actionData = {\n displayName: `${model.displayName} List Action`,\n name: `${model.singularName}-list-action`,\n type: \"solid\",\n domain: \"\" as any,\n context: \"\" as any,\n customComponent: \"\",\n customIsModal: true,\n serverEndpoint: \"\",\n view: view,\n module: resolvedModule,\n model: model\n };\n\n const treeViewActionData = {\n displayName: `${model.displayName} Tree View Action`,\n name: `${model.singularName}-tree-view-action`,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n view: treeView,\n module: resolvedModule,\n model: model\n };\n\n let existingAction = await actionRepo.findOne({ where: { name: actionData.name } });\n let existingTreeViewAction = await actionRepo.findOne({ where: { name: treeViewActionData.name } });\n\n if (!existingAction) {\n const createdAction = actionRepo.create(actionData);\n existingAction = await actionRepo.save(createdAction);\n }\n\n if (!existingTreeViewAction) {\n const createdTreeViewAction = actionRepo.create(treeViewActionData);\n existingTreeViewAction = await actionRepo.save(createdTreeViewAction);\n }\n\n const adminRole = await this.roleService.findRoleByName('Admin');\n\n const menuData = {\n displayName: `${model.displayName}`,\n name: `${model.singularName}-menu-item`,\n sequenceNumber: 1,\n action: existingAction,\n module: resolvedModule,\n roles: [adminRole],\n parentMenuItemUserKey: \"\"\n };\n\n let existingMenu = await menuRepo.findOne({ where: { name: menuData.name } });\n\n if (!existingMenu) {\n const createdMenu = menuRepo.create(menuData);\n await menuRepo.save(createdMenu);\n }\n }\n\n async generateCode(options: CodeGenerationOptions) {\n const query = {\n populate: [\"module\", \"fields\"]\n };\n\n const model = options.modelId\n ? await this.findOne(options.modelId, query)\n : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n options.fieldIdsForRemoval = model.fields\n .filter(field => field.isMarkedForRemoval)\n .map(field => field.id);\n\n const refreshModelCodeOutput = await this.generateModelCode(options);\n const removeFieldCodeOuput = await this.generateRemoveFieldsCode(options);\n return { model, removeFieldCodeOuput, refreshModelCodeOutput };\n }\n\n async generateRemoveFieldsCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.modelId && !options.modelUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n\n if (!options.fieldIdsForRemoval || options.fieldIdsForRemoval.length === 0) {\n return \"\";\n }\n\n const query = {\n populate: [\"module\", \"fields\"]\n };\n const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n //Filter out the fields by id\n const fieldsForRemoval = model.fields.filter((field) => options.fieldIdsForRemoval.includes(+field.id));\n const removeOutput = await this.executeRemoveFieldsCommand(model, fieldsForRemoval, options.dryRun);\n\n // Remove the fields from the database as well. This also checks, if the field is marked for removal\n fieldsForRemoval.forEach((field: FieldMetadata) => {\n if (field.isMarkedForRemoval) {\n this.fieldMetadataService.delete(field.id);\n }\n });\n\n // Remove the fields from metadata json file \n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n // Check if the model already exists in `models`\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === model.singularName\n );\n\n const modelMetaData = metaData.moduleMetadata.models[existingModelIndex];\n\n // Remove fields marked for removal from modelMetaData.fields\n modelMetaData.fields = modelMetaData.fields.filter((field: any) => field.isMarkedForRemoval !== true);\n\n if (existingModelIndex !== -1) {\n // Update the existing model\n metaData.moduleMetadata.models[existingModelIndex] = modelMetaData;\n } else {\n // Add the new model\n metaData.moduleMetadata.models.push(modelMetaData);\n }\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n return removeOutput;\n }\n\n async generateModelCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.modelId && !options.modelUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n\n const query = {\n populate: [\"module\", \"fields\", \"parentModel\", \"parentModel.module\"]\n };\n const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n //Execute the schematic command to refresh the model\n const refreshOuput = await this.executeRefreshModelCommand(model, options.dryRun);\n\n return `${refreshOuput}`;\n }\n\n private async executeRefreshModelCommand(model: ModelMetadata, dryRun: boolean = false): Promise<string> {\n const output = await this.schematicService.executeSchematicCommand(\n REFRESH_MODEL_COMMAND,\n {\n module: model.module.name,\n model: model.singularName,\n },\n dryRun\n );\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n private async executeRemoveFieldsCommand(model: ModelMetadata, fieldsForRemoval: FieldMetadata[], dryRun: boolean = false): Promise<string> {\n if (!fieldsForRemoval || fieldsForRemoval.length === 0) {\n return \"\";\n }\n const output = await this.schematicService.executeSchematicCommand(\n REMOVE_FIELDS_COMMAND,\n {\n module: model.module.name,\n model: model.singularName,\n fieldNamesForRemoval: fieldsForRemoval.map(field => field.name),\n },\n dryRun\n );\n\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n async updateUserKey(data: any) {\n const { modelName, fieldName } = data;\n\n const model = await this.modelMetadataRepo.findOne({\n where: { singularName: modelName },\n relations: ['fields', 'userKeyField'],\n });\n\n if (!model) {\n throw new Error(`Model with name ${modelName} not found`);\n }\n\n if (model.userKeyField) {\n throw new Error(`User key is already set to ${model.userKeyField.name}. No changes were made.`);\n }\n\n const fieldToUpdate = model.fields.find(field => field.name === fieldName);\n if (!fieldToUpdate) {\n throw new Error(`Field with name ${fieldName} not found in model ${modelName}`);\n }\n\n fieldToUpdate.isUserKey = true;\n\n model.userKeyField = fieldToUpdate;\n\n await this.modelMetadataRepo.save(model);\n\n return {\n message: `User key has been successfully updated to ${fieldName}.`,\n success: true\n };\n }\n\n private async getRelationInverseFields(modelId: number, repo: Repository<FieldMetadata>): Promise<FieldMetadata[]> {\n return await repo.find({\n where: {\n model: {\n id: modelId\n },\n type: SolidFieldType.relation,\n relationCreateInverse: true\n },\n relations: {\n model: {\n module: true\n }\n }\n });\n }\n\n async navigation(navigationDto: NavigationDto) {\n const { recordId, modelName, ...basicFilterDto } = navigationDto;\n\n const modelServiceInstanceWrapper =\n this.introspectService.getProvider(`${classify(modelName)}Service`);\n\n if (!modelServiceInstanceWrapper) {\n throw new BadRequestException(\n `Invalid model name (${modelName}) specified in Navigation.`,\n );\n }\n\n const modelService: CRUDService<any> = modelServiceInstanceWrapper.instance;\n\n const recs = await modelService.find(basicFilterDto);\n\n // navigation only works for paginated results\n if (!('records' in recs) || !('currentPage' in recs.meta)) {\n return {\n prev: null,\n next: null,\n meta: null,\n };\n }\n\n const { records, meta } = recs;\n\n // --------------------\n // Find record index in page\n // --------------------\n const index = records.findIndex(r => String(r.id) === String(recordId));\n\n if (index === -1) {\n throw new BadRequestException(`Record not found in current page`);\n }\n\n // --------------------\n // Pagination calculations\n // --------------------\n const limit = meta.perPage;\n const currentOffset = (meta.currentPage - 1) * meta.perPage;\n const currentIndexGlobal = currentOffset + index + 1;\n\n let prev: { record: any; offset: number; limit: number } | null = null;\n let next: { record: any; offset: number; limit: number } | null = null;\n\n // --------------------\n // PREV\n // --------------------\n if (index > 0) {\n prev = {\n record: records[index - 1],\n offset: currentOffset,\n limit,\n };\n } else if (meta.prevPage !== null) {\n const prevOffset = (meta.prevPage - 1) * meta.perPage;\n\n const prevPage = await modelService.find({\n ...basicFilterDto,\n offset: prevOffset,\n limit,\n });\n\n if ('records' in prevPage) {\n const record = prevPage.records.at(-1) ?? null;\n if (record) {\n prev = {\n record,\n offset: prevOffset,\n limit,\n };\n }\n }\n }\n\n // --------------------\n // NEXT\n // --------------------\n if (index < records.length - 1) {\n next = {\n record: records[index + 1],\n offset: currentOffset,\n limit,\n };\n } else if (meta.nextPage !== null) {\n const nextOffset = (meta.nextPage - 1) * meta.perPage;\n\n const nextPage = await modelService.find({\n ...basicFilterDto,\n offset: nextOffset,\n limit,\n });\n\n if ('records' in nextPage) {\n const record = nextPage.records[0] ?? null;\n if (record) {\n next = {\n record,\n offset: nextOffset,\n limit,\n };\n }\n }\n }\n\n // --------------------\n // RESPONSE\n // --------------------\n return {\n prev: prev\n ? {\n recordId: prev.record.id,\n offset: prev.offset,\n limit: prev.limit,\n }\n : null,\n\n next: next\n ? {\n recordId: next.record.id,\n offset: next.offset,\n limit: next.limit,\n }\n : null,\n meta: {\n totalRecords: meta.totalRecords,\n perPage: meta.perPage,\n currentPage: meta.currentPage,\n totalPages: meta.totalPages,\n\n currentIndexInPage: index,\n currentIndexGlobal,\n\n hasPrev: !!prev,\n hasNext: !!next,\n\n prevPage: meta.prevPage,\n nextPage: meta.nextPage,\n },\n\n };\n }\n\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"module-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/module-metadata.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/module-metadata.service.ts"],"names":[],"mappings":"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"}
@@ -371,9 +371,10 @@ let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataServic
371
371
  return true;
372
372
  }
373
373
  async generateCodeViaCtl(moduleId) {
374
+ const module = await this.findOne(moduleId);
374
375
  return this.commandService.executeCommandWithArgs({
375
376
  command: 'npx',
376
- args: ['@solixai/solidctl@latest', 'generate', 'module', `--id=${moduleId}`],
377
+ args: ['@solixai/solidctl@latest', 'generate', 'module', `--name=${module.name}`],
377
378
  cwd: path.join(process.cwd(), '..'),
378
379
  });
379
380
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module-metadata.service.js","sourceRoot":"","sources":["../../src/services/module-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { InjectDataSource } from '@nestjs/typeorm';\nimport { DEFAULT_MEDIA_FILE_STORAGE_DIR } from \"src/services/settings/default-settings-provider.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\nimport { DataSource, EntityManager, SelectQueryBuilder } from 'typeorm';\nimport { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\n\nimport { classify } from '../helpers/string.helper';\nimport { ConfigService } from '@nestjs/config';\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport * as path from 'path'; // To handle file paths\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\nimport { ModuleMetadataRepository } from 'src/repository/module-metadata.repository';\nimport { PermissionMetadataSeederService } from 'src/seeders/permission-metadata-seeder.service';\nimport { DiskFileService } from 'src/services/file';\nimport { BasicFilterDto } from '../dtos/basic-filters.dto';\nimport { UpdateModuleMetadataDto } from '../dtos/update-module-metadata.dto';\nimport {\n ADD_MODULE_COMMAND,\n SchematicService,\n} from '../helpers/schematic.service';\nimport { CommandService } from '../helpers/command.service';\nimport { SolidRegistry } from '../helpers/solid-registry';\nimport { CodeGenerationOptions, ModuleMetadataConfiguration } from '../interfaces';\nimport { CrudHelperService } from './crud-helper.service';\nimport { ModelMetadataService } from './model-metadata.service';\nimport { SettingService } from './setting.service';\n\n@Injectable()\nexport class ModuleMetadataService {\n private readonly logger = new Logger(ModuleMetadataService.name);\n\n constructor(\n @InjectDataSource()\n private readonly dataSource: DataSource,\n // @InjectRepository(ModuleMetadata)\n // private readonly moduleMetadataRepo: Repository<ModuleMetadata>,\n private readonly moduleMetadataRepo: ModuleMetadataRepository,\n private readonly crudHelperService: CrudHelperService,\n private readonly schematicService: SchematicService,\n private readonly commandService: CommandService,\n private readonly fileService: DiskFileService,\n private readonly settingService: SettingService,\n\n private readonly permissionsSeederService: PermissionMetadataSeederService,\n @Inject(forwardRef(() => ModelMetadataService))\n private readonly modelMetadataService: ModelMetadataService,\n private readonly solidRegistry: SolidRegistry,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n ) { }\n\n async findMany(basicFilterDto: BasicFilterDto) {\n const alias = 'moduleMetadata';\n // Extract the required keys from the input query\n let { limit, offset } = basicFilterDto;\n\n // Create above query on pincode table using query builder\n var qb: SelectQueryBuilder<ModuleMetadata> = await this.moduleMetadataRepo.createSecurityRuleAwareQueryBuilder(alias)\n qb = await this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);\n\n // Get the records and the count\n const [entities, count] = await qb.getManyAndCount();\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n const r = {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n return r\n }\n\n async find(basicFilterDto: BasicFilterDto) {\n return this.findMany(basicFilterDto);\n }\n\n async findOneByUserKey(name: string, relations = {}) {\n if (!name) {\n throw new BadRequestException(ERROR_MESSAGES.ENTITY_NAME_REQUIRED);\n }\n const entity = await this.moduleMetadataRepo.findOne({\n where: {\n name: name,\n },\n relations: relations,\n });\n return entity;\n }\n\n async findOne(id: number, relations = {}) {\n if (!id) {\n throw new BadRequestException(ERROR_MESSAGES.ENTITY_ID_REQUIRED);\n }\n const entity = await this.moduleMetadataRepo.findOne({\n where: {\n id: id,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND());\n }\n return entity;\n }\n\n async create(createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n // Step 1: Write initial data to the database\n const module = await this.createInDB(manager, createDto, files);\n await this.createInFile(module);\n return module\n });\n } catch (error: any) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n async createInDB(manager: EntityManager, createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {\n if (files.length > 0) {\n const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(files[0]));\n this.fileService.copy(files[0].path, fileStoragePath);\n this.fileService.delete(files[0].path);\n createDto.menuIconUrl = fileStoragePath;\n }\n const moduleMetadata = this.moduleMetadataRepo.create(createDto);\n return manager.save(moduleMetadata); // Use the provided manager to perform DB operations\n }\n\n async createInFile(module: ModuleMetadata) {\n try {\n // Prepare the metadata JSON structure\n\n const moduleMetaDataJson: ModuleMetadataConfiguration = {\n moduleMetadata: {\n name: module?.name,\n displayName: module?.displayName,\n description: module?.description,\n defaultDataSource: module?.defaultDataSource,\n menuIconUrl: module?.menuIconUrl,\n menuSequenceNumber: module?.menuSequenceNumber,\n isSystem: module?.isSystem,\n models: [],\n },\n roles: [],\n users: [],\n actions: [\n {\n displayName: `${module?.name} Home`,\n name: `${module?.name}-home-action`,\n type: \"custom\",\n domain: \"\",\n context: \"\",\n customComponent: `/admin/core/${module?.name}/home`,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: \"\",\n moduleUserKey: module?.name,\n modelUserKey: \"\"\n }\n ],\n menus: [\n {\n displayName: \"Home\",\n name: `${module?.name}-home-menu`,\n sequenceNumber: 1,\n actionUserKey: `${module?.name}-home-action`,\n moduleUserKey: module?.name,\n parentMenuItemUserKey: \"\",\n iconName: \"home\"\n }\n ],\n views: [],\n emailTemplates: [],\n smsTemplates: [],\n mediaStorageProviders: [],\n securityRules: [],\n };\n\n // Convert the object to JSON string\n const metadataJson = JSON.stringify(moduleMetaDataJson, null, 2);\n\n // Create the folder path inside 'module-metadata'\n const folderPath = path.resolve(process.cwd(), 'module-metadata', module.name);\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(module.name);\n\n // Ensure the folder exists\n await fs.mkdir(folderPath, { recursive: true });\n\n // Write the JSON to the file\n await fs.writeFile(filePath, metadataJson);\n\n } catch (error: any) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async update(id: number, updateModuleMetadataDto: UpdateModuleMetadataDto, files: Express.Multer.File[] = []) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n // Step 1: Write initial data to the database\n const module = await this.updateInDB(manager, id, updateModuleMetadataDto, files);\n await this.updateInFile(module);\n return module\n });\n } catch (error: any) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n async updateInDB(manager: EntityManager, id: number, updateModuleMetadataDto: UpdateModuleMetadataDto, files: Express.Multer.File[] = []) {\n\n const module = await this.moduleMetadataRepo.preload({\n id,\n ...updateModuleMetadataDto,\n });\n\n if (!module) {\n throw new NotFoundException(ERROR_MESSAGES.MODULE_ID_NOT_FOUND(id));\n }\n if (files.length > 0) {\n\n const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(files[0]));\n this.fileService.copy(files[0].path, fileStoragePath);\n this.fileService.delete(files[0].path);\n module.menuIconUrl = fileStoragePath;\n }\n return manager.save(ModuleMetadata, module);\n }\n\n async updateInFile(module: ModuleMetadata) {\n try {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(module.name);\n\n // Read the existing JSON file\n let metaData;\n try {\n metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n } catch (error: any) {\n metaData = {\n moduleMetadata: {\n name: null,\n displayName: null,\n description: null,\n defaultDataSource: null,\n menuIconUrl: null,\n menuSequenceNumber: null,\n isSystem: null,\n models: [],\n },\n roles: [],\n users: [],\n actions: [],\n menus: [],\n views: [],\n emailTemplates: [],\n smsTemplates: [],\n mediaStorageProviders: [],\n };\n }\n\n metaData.moduleMetadata.name = module?.name;\n metaData.moduleMetadata.displayName = module?.displayName;\n metaData.moduleMetadata.description = module?.description;\n metaData.moduleMetadata.defaultDataSource = module?.defaultDataSource;\n metaData.moduleMetadata.menuIconUrl = module?.menuIconUrl;\n metaData.moduleMetadata.menuSequenceNumber = module?.menuSequenceNumber;\n metaData.moduleMetadata.isSystem = module?.isSystem;\n\n // Write the JSON to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error: any) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async upsert(updateModuleMetadataDto: UpdateModuleMetadataDto) {\n this.logger.debug(`Module Upsert called for : ${updateModuleMetadataDto.name}`);\n // First check if module already exists using name\n const existingModuleMetadata = await this.moduleMetadataRepo.findOne({\n where: {\n name: updateModuleMetadataDto.name\n }\n })\n const { models, ...restUpdateModuleMetadataDto } = updateModuleMetadataDto;\n // if found\n if (existingModuleMetadata) {\n const updatedModuleMetadata = { ...existingModuleMetadata, ...restUpdateModuleMetadataDto };\n return this.moduleMetadataRepo.save(updatedModuleMetadata);\n }\n // if not found - create new \n else {\n const moduleMetadata = this.moduleMetadataRepo.create(restUpdateModuleMetadataDto);\n return this.moduleMetadataRepo.save(moduleMetadata);\n }\n }\n\n async removeByName(name: string) {\n const entity = await this.findOneByUserKey(name);\n if (entity) {\n await this.moduleMetadataRepo.remove(entity);\n }\n }\n\n @DisallowInProduction()\n async remove(id: number) {\n const entity = await this.findOne(id);\n await this.cleanupOnDelete(entity.id);\n const r = await this.moduleMetadataRepo.remove(entity);\n return r\n }\n\n async cleanupOnDelete(moduleEntityId: number) {\n const moduleEntity = await this.moduleMetadataRepo.findOne({\n where: {\n // @ts-ignore\n id: moduleEntityId,\n }\n });\n\n if (!moduleEntity) {\n this.logger.log(`Invalid moduleEntityId: ${moduleEntityId} unable to resolve model metadata`);\n return;\n }\n if (moduleEntity.id !== moduleEntityId) {\n this.logger.log(`Invalid moduleEntityId: ${moduleEntityId} unable to resolve model metadata id ${moduleEntity.id} not matching with the one passed as argument ${moduleEntityId}`);\n return;\n }\n\n this.logger.log(`Cleaning up for module: ${moduleEntity.name}.`);\n\n const modulePath = await this.moduleMetadataHelperService.getModulePath(moduleEntity.name);\n if (modulePath) {\n\n this.logger.log(`Module path: ${modulePath}`);\n\n // Metadata file to be deleted\n const moduleMetadataPAth = await this.moduleMetadataHelperService.getModuleMetadataFolderPath(moduleEntity.name)\n this.logger.log(`About to delete module metadata path: ${moduleMetadataPAth}`);\n\n try {\n await fs.rm(modulePath, { recursive: true, force: true });\n await fs.rm(moduleMetadataPAth, { recursive: true, force: true });\n this.logger.log(`Deleted file: ${moduleMetadataPAth}`);\n } catch (error: any) {\n this.logger.error(`Error deleting file: ${moduleMetadataPAth}`, error);\n throw new Error(ERROR_MESSAGES.FILE_DELETE_FAILED); // Trigger rollback\n }\n }\n await this.dataSource.query(\n `CALL cleanup_module_metadata($1, $2)`,\n [moduleEntity.name, true],\n );\n }\n\n async deleteMany(ids: number[]): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n const removedEntities = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]\n const entity = await this.moduleMetadataRepo.findOne({\n where: {\n //@ts-ignore\n id: id,\n }\n });\n // if (!entity) {\n // throw new Error(`Entity with id ${id} not found`);\n // }\n removedEntities.push(await this.moduleMetadataRepo.remove(entity));\n }\n\n return removedEntities\n }\n\n async refreshPermission() {\n await this.permissionsSeederService.seed();\n return true\n }\n\n @DisallowInProduction()\n async generateCodeViaCtl(moduleId: number): Promise<string> {\n return this.commandService.executeCommandWithArgs({\n command: 'npx',\n args: ['@solixai/solidctl@latest', 'generate', 'module', `--id=${moduleId}`],\n cwd: path.join(process.cwd(), '..'),\n });\n }\n\n @DisallowInProduction()\n async generateCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.moduleId && !options.moduleUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n const module = options.moduleId ? await this.findOne(options.moduleId) : await this.findOneByUserKey(options.moduleUserKey);\n\n // Check if the module exists\n if (!module) {\n throw new NotFoundException(ERROR_MESSAGES.MODULE_ID_NOT_FOUND(options.moduleId));\n }\n\n // Check if the module name already exists and is loaded\n const moduleInstance = this.solidRegistry.getModule(`${classify(module.name)}Module`);\n\n if (!moduleInstance) {\n const addModuleOutput = await this.generateAddModuleCode(options);\n const refreshModuleOutput = await this.generateRefreshModuleCode(options);\n return `${addModuleOutput}\\n${refreshModuleOutput}`;\n } else {\n return await this.generateRefreshModuleCode(options);\n }\n }\n\n private async generateAddModuleCode(options: CodeGenerationOptions = { dryRun: false }): Promise<string> {\n if (!options.moduleId && !options.moduleUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n const module = options.moduleId ? await this.findOne(options.moduleId) : await this.findOneByUserKey(options.moduleUserKey);\n\n //Generate the module\n const output = await this.schematicService.executeSchematicCommand(\n ADD_MODULE_COMMAND,\n { module: module.name },\n options.dryRun ?? false\n );\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n private async generateRefreshModuleCode(options: CodeGenerationOptions): Promise<string> {\n const query = {\n relations: { models: { fields: true } },\n };\n const module = options.moduleId ? await this.findOne(options.moduleId, query.relations) : await this.findOneByUserKey(options.moduleUserKey, query.relations);\n const outputLines = []\n for (const model of module.models) {\n const codeGenerationOptions = {\n modelId: model.id,\n dryRun: options.dryRun,\n };\n const output = await this.modelMetadataService.handleGenerateCode(codeGenerationOptions);\n this.logger.debug(`Schematic output : ${output}`);\n outputLines.push(output)\n }\n return outputLines.join('\\n');\n }\n\n private getFullFilePathForDisk(fileName: string): string {\n const base = this.settingService.getConfigValue<SolidCoreSetting>(\"fileStorageDir\")\n || DEFAULT_MEDIA_FILE_STORAGE_DIR;\n if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {\n return fileName;\n }\n return `${base}/${fileName}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n\n}\n"]}
1
+ {"version":3,"file":"module-metadata.service.js","sourceRoot":"","sources":["../../src/services/module-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { InjectDataSource } from '@nestjs/typeorm';\nimport { DEFAULT_MEDIA_FILE_STORAGE_DIR } from \"src/services/settings/default-settings-provider.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\nimport { DataSource, EntityManager, SelectQueryBuilder } from 'typeorm';\nimport { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\n\nimport { classify } from '../helpers/string.helper';\nimport { ConfigService } from '@nestjs/config';\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport * as path from 'path'; // To handle file paths\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\nimport { ModuleMetadataRepository } from 'src/repository/module-metadata.repository';\nimport { PermissionMetadataSeederService } from 'src/seeders/permission-metadata-seeder.service';\nimport { DiskFileService } from 'src/services/file';\nimport { BasicFilterDto } from '../dtos/basic-filters.dto';\nimport { UpdateModuleMetadataDto } from '../dtos/update-module-metadata.dto';\nimport {\n ADD_MODULE_COMMAND,\n SchematicService,\n} from '../helpers/schematic.service';\nimport { CommandService } from '../helpers/command.service';\nimport { SolidRegistry } from '../helpers/solid-registry';\nimport { CodeGenerationOptions, ModuleMetadataConfiguration } from '../interfaces';\nimport { CrudHelperService } from './crud-helper.service';\nimport { ModelMetadataService } from './model-metadata.service';\nimport { SettingService } from './setting.service';\n\n@Injectable()\nexport class ModuleMetadataService {\n private readonly logger = new Logger(ModuleMetadataService.name);\n\n constructor(\n @InjectDataSource()\n private readonly dataSource: DataSource,\n // @InjectRepository(ModuleMetadata)\n // private readonly moduleMetadataRepo: Repository<ModuleMetadata>,\n private readonly moduleMetadataRepo: ModuleMetadataRepository,\n private readonly crudHelperService: CrudHelperService,\n private readonly schematicService: SchematicService,\n private readonly commandService: CommandService,\n private readonly fileService: DiskFileService,\n private readonly settingService: SettingService,\n\n private readonly permissionsSeederService: PermissionMetadataSeederService,\n @Inject(forwardRef(() => ModelMetadataService))\n private readonly modelMetadataService: ModelMetadataService,\n private readonly solidRegistry: SolidRegistry,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n ) { }\n\n async findMany(basicFilterDto: BasicFilterDto) {\n const alias = 'moduleMetadata';\n // Extract the required keys from the input query\n let { limit, offset } = basicFilterDto;\n\n // Create above query on pincode table using query builder\n var qb: SelectQueryBuilder<ModuleMetadata> = await this.moduleMetadataRepo.createSecurityRuleAwareQueryBuilder(alias)\n qb = await this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);\n\n // Get the records and the count\n const [entities, count] = await qb.getManyAndCount();\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n const r = {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n return r\n }\n\n async find(basicFilterDto: BasicFilterDto) {\n return this.findMany(basicFilterDto);\n }\n\n async findOneByUserKey(name: string, relations = {}) {\n if (!name) {\n throw new BadRequestException(ERROR_MESSAGES.ENTITY_NAME_REQUIRED);\n }\n const entity = await this.moduleMetadataRepo.findOne({\n where: {\n name: name,\n },\n relations: relations,\n });\n return entity;\n }\n\n async findOne(id: number, relations = {}) {\n if (!id) {\n throw new BadRequestException(ERROR_MESSAGES.ENTITY_ID_REQUIRED);\n }\n const entity = await this.moduleMetadataRepo.findOne({\n where: {\n id: id,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND());\n }\n return entity;\n }\n\n async create(createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n // Step 1: Write initial data to the database\n const module = await this.createInDB(manager, createDto, files);\n await this.createInFile(module);\n return module\n });\n } catch (error: any) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n async createInDB(manager: EntityManager, createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {\n if (files.length > 0) {\n const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(files[0]));\n this.fileService.copy(files[0].path, fileStoragePath);\n this.fileService.delete(files[0].path);\n createDto.menuIconUrl = fileStoragePath;\n }\n const moduleMetadata = this.moduleMetadataRepo.create(createDto);\n return manager.save(moduleMetadata); // Use the provided manager to perform DB operations\n }\n\n async createInFile(module: ModuleMetadata) {\n try {\n // Prepare the metadata JSON structure\n\n const moduleMetaDataJson: ModuleMetadataConfiguration = {\n moduleMetadata: {\n name: module?.name,\n displayName: module?.displayName,\n description: module?.description,\n defaultDataSource: module?.defaultDataSource,\n menuIconUrl: module?.menuIconUrl,\n menuSequenceNumber: module?.menuSequenceNumber,\n isSystem: module?.isSystem,\n models: [],\n },\n roles: [],\n users: [],\n actions: [\n {\n displayName: `${module?.name} Home`,\n name: `${module?.name}-home-action`,\n type: \"custom\",\n domain: \"\",\n context: \"\",\n customComponent: `/admin/core/${module?.name}/home`,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: \"\",\n moduleUserKey: module?.name,\n modelUserKey: \"\"\n }\n ],\n menus: [\n {\n displayName: \"Home\",\n name: `${module?.name}-home-menu`,\n sequenceNumber: 1,\n actionUserKey: `${module?.name}-home-action`,\n moduleUserKey: module?.name,\n parentMenuItemUserKey: \"\",\n iconName: \"home\"\n }\n ],\n views: [],\n emailTemplates: [],\n smsTemplates: [],\n mediaStorageProviders: [],\n securityRules: [],\n };\n\n // Convert the object to JSON string\n const metadataJson = JSON.stringify(moduleMetaDataJson, null, 2);\n\n // Create the folder path inside 'module-metadata'\n const folderPath = path.resolve(process.cwd(), 'module-metadata', module.name);\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(module.name);\n\n // Ensure the folder exists\n await fs.mkdir(folderPath, { recursive: true });\n\n // Write the JSON to the file\n await fs.writeFile(filePath, metadataJson);\n\n } catch (error: any) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async update(id: number, updateModuleMetadataDto: UpdateModuleMetadataDto, files: Express.Multer.File[] = []) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n // Step 1: Write initial data to the database\n const module = await this.updateInDB(manager, id, updateModuleMetadataDto, files);\n await this.updateInFile(module);\n return module\n });\n } catch (error: any) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n async updateInDB(manager: EntityManager, id: number, updateModuleMetadataDto: UpdateModuleMetadataDto, files: Express.Multer.File[] = []) {\n\n const module = await this.moduleMetadataRepo.preload({\n id,\n ...updateModuleMetadataDto,\n });\n\n if (!module) {\n throw new NotFoundException(ERROR_MESSAGES.MODULE_ID_NOT_FOUND(id));\n }\n if (files.length > 0) {\n\n const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(files[0]));\n this.fileService.copy(files[0].path, fileStoragePath);\n this.fileService.delete(files[0].path);\n module.menuIconUrl = fileStoragePath;\n }\n return manager.save(ModuleMetadata, module);\n }\n\n async updateInFile(module: ModuleMetadata) {\n try {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(module.name);\n\n // Read the existing JSON file\n let metaData;\n try {\n metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n } catch (error: any) {\n metaData = {\n moduleMetadata: {\n name: null,\n displayName: null,\n description: null,\n defaultDataSource: null,\n menuIconUrl: null,\n menuSequenceNumber: null,\n isSystem: null,\n models: [],\n },\n roles: [],\n users: [],\n actions: [],\n menus: [],\n views: [],\n emailTemplates: [],\n smsTemplates: [],\n mediaStorageProviders: [],\n };\n }\n\n metaData.moduleMetadata.name = module?.name;\n metaData.moduleMetadata.displayName = module?.displayName;\n metaData.moduleMetadata.description = module?.description;\n metaData.moduleMetadata.defaultDataSource = module?.defaultDataSource;\n metaData.moduleMetadata.menuIconUrl = module?.menuIconUrl;\n metaData.moduleMetadata.menuSequenceNumber = module?.menuSequenceNumber;\n metaData.moduleMetadata.isSystem = module?.isSystem;\n\n // Write the JSON to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error: any) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async upsert(updateModuleMetadataDto: UpdateModuleMetadataDto) {\n this.logger.debug(`Module Upsert called for : ${updateModuleMetadataDto.name}`);\n // First check if module already exists using name\n const existingModuleMetadata = await this.moduleMetadataRepo.findOne({\n where: {\n name: updateModuleMetadataDto.name\n }\n })\n const { models, ...restUpdateModuleMetadataDto } = updateModuleMetadataDto;\n // if found\n if (existingModuleMetadata) {\n const updatedModuleMetadata = { ...existingModuleMetadata, ...restUpdateModuleMetadataDto };\n return this.moduleMetadataRepo.save(updatedModuleMetadata);\n }\n // if not found - create new \n else {\n const moduleMetadata = this.moduleMetadataRepo.create(restUpdateModuleMetadataDto);\n return this.moduleMetadataRepo.save(moduleMetadata);\n }\n }\n\n async removeByName(name: string) {\n const entity = await this.findOneByUserKey(name);\n if (entity) {\n await this.moduleMetadataRepo.remove(entity);\n }\n }\n\n @DisallowInProduction()\n async remove(id: number) {\n const entity = await this.findOne(id);\n await this.cleanupOnDelete(entity.id);\n const r = await this.moduleMetadataRepo.remove(entity);\n return r\n }\n\n async cleanupOnDelete(moduleEntityId: number) {\n const moduleEntity = await this.moduleMetadataRepo.findOne({\n where: {\n // @ts-ignore\n id: moduleEntityId,\n }\n });\n\n if (!moduleEntity) {\n this.logger.log(`Invalid moduleEntityId: ${moduleEntityId} unable to resolve model metadata`);\n return;\n }\n if (moduleEntity.id !== moduleEntityId) {\n this.logger.log(`Invalid moduleEntityId: ${moduleEntityId} unable to resolve model metadata id ${moduleEntity.id} not matching with the one passed as argument ${moduleEntityId}`);\n return;\n }\n\n this.logger.log(`Cleaning up for module: ${moduleEntity.name}.`);\n\n const modulePath = await this.moduleMetadataHelperService.getModulePath(moduleEntity.name);\n if (modulePath) {\n\n this.logger.log(`Module path: ${modulePath}`);\n\n // Metadata file to be deleted\n const moduleMetadataPAth = await this.moduleMetadataHelperService.getModuleMetadataFolderPath(moduleEntity.name)\n this.logger.log(`About to delete module metadata path: ${moduleMetadataPAth}`);\n\n try {\n await fs.rm(modulePath, { recursive: true, force: true });\n await fs.rm(moduleMetadataPAth, { recursive: true, force: true });\n this.logger.log(`Deleted file: ${moduleMetadataPAth}`);\n } catch (error: any) {\n this.logger.error(`Error deleting file: ${moduleMetadataPAth}`, error);\n throw new Error(ERROR_MESSAGES.FILE_DELETE_FAILED); // Trigger rollback\n }\n }\n await this.dataSource.query(\n `CALL cleanup_module_metadata($1, $2)`,\n [moduleEntity.name, true],\n );\n }\n\n async deleteMany(ids: number[]): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n const removedEntities = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]\n const entity = await this.moduleMetadataRepo.findOne({\n where: {\n //@ts-ignore\n id: id,\n }\n });\n // if (!entity) {\n // throw new Error(`Entity with id ${id} not found`);\n // }\n removedEntities.push(await this.moduleMetadataRepo.remove(entity));\n }\n\n return removedEntities\n }\n\n async refreshPermission() {\n await this.permissionsSeederService.seed();\n return true\n }\n\n @DisallowInProduction()\n async generateCodeViaCtl(moduleId: number): Promise<string> {\n const module = await this.findOne(moduleId);\n return this.commandService.executeCommandWithArgs({\n command: 'npx',\n args: ['@solixai/solidctl@latest', 'generate', 'module', `--name=${module.name}`],\n cwd: path.join(process.cwd(), '..'),\n });\n }\n\n @DisallowInProduction()\n async generateCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.moduleId && !options.moduleUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n const module = options.moduleId ? await this.findOne(options.moduleId) : await this.findOneByUserKey(options.moduleUserKey);\n\n // Check if the module exists\n if (!module) {\n throw new NotFoundException(ERROR_MESSAGES.MODULE_ID_NOT_FOUND(options.moduleId));\n }\n\n // Check if the module name already exists and is loaded\n const moduleInstance = this.solidRegistry.getModule(`${classify(module.name)}Module`);\n\n if (!moduleInstance) {\n const addModuleOutput = await this.generateAddModuleCode(options);\n const refreshModuleOutput = await this.generateRefreshModuleCode(options);\n return `${addModuleOutput}\\n${refreshModuleOutput}`;\n } else {\n return await this.generateRefreshModuleCode(options);\n }\n }\n\n private async generateAddModuleCode(options: CodeGenerationOptions = { dryRun: false }): Promise<string> {\n if (!options.moduleId && !options.moduleUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n const module = options.moduleId ? await this.findOne(options.moduleId) : await this.findOneByUserKey(options.moduleUserKey);\n\n //Generate the module\n const output = await this.schematicService.executeSchematicCommand(\n ADD_MODULE_COMMAND,\n { module: module.name },\n options.dryRun ?? false\n );\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n private async generateRefreshModuleCode(options: CodeGenerationOptions): Promise<string> {\n const query = {\n relations: { models: { fields: true } },\n };\n const module = options.moduleId ? await this.findOne(options.moduleId, query.relations) : await this.findOneByUserKey(options.moduleUserKey, query.relations);\n const outputLines = []\n for (const model of module.models) {\n const codeGenerationOptions = {\n modelId: model.id,\n dryRun: options.dryRun,\n };\n const output = await this.modelMetadataService.handleGenerateCode(codeGenerationOptions);\n this.logger.debug(`Schematic output : ${output}`);\n outputLines.push(output)\n }\n return outputLines.join('\\n');\n }\n\n private getFullFilePathForDisk(fileName: string): string {\n const base = this.settingService.getConfigValue<SolidCoreSetting>(\"fileStorageDir\")\n || DEFAULT_MEDIA_FILE_STORAGE_DIR;\n if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {\n return fileName;\n }\n return `${base}/${fileName}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidxai/core",
3
- "version": "0.1.10-beta.11",
3
+ "version": "0.1.10-beta.12",
4
4
  "description": "This module is a NestJS module containing all the required core providers required by a Solid application",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -4,8 +4,7 @@ import { ModelMetadataService } from 'src/services/model-metadata.service';
4
4
  import { CommandError } from './helper';
5
5
 
6
6
  interface CommandOptions {
7
- name?: string;
8
- id?: number;
7
+ name: string;
9
8
  dryRun?: boolean;
10
9
  }
11
10
 
@@ -30,32 +29,20 @@ export class RefreshModelCommand extends CommandRunner {
30
29
  }
31
30
 
32
31
  const codeGenerationOptions = {
33
- modelId: options.id,
34
32
  modelUserKey: options.name,
35
33
  dryRun: options.dryRun,
36
34
  };
37
35
  await this.modelMetadataService.handleGenerateCode(codeGenerationOptions);
38
36
  }
39
37
 
40
- // Accept the model ID as an argument
41
38
  @Option({
42
- flags: '-i, --id [model ID]',
43
- description: 'Model ID from the ss_model_metadata table',
44
- })
45
- parseId(val: string): number {
46
- return +val;
47
- }
48
-
49
- // Accept the module name as an argument
50
- @Option({
51
- flags: '-n, --name [model name]',
52
- description: 'Model Name from the ss_model_metadata table',
39
+ flags: '-n, --name <model name>',
40
+ description: 'Model name (singularName) from the ss_model_metadata table',
53
41
  })
54
42
  parseName(val: string): string {
55
43
  return val;
56
44
  }
57
45
 
58
- // Accept dry run as an argument
59
46
  @Option({
60
47
  flags: '-d, --dryRun [dry run]',
61
48
  description: 'Dry run the command',
@@ -65,10 +52,9 @@ export class RefreshModelCommand extends CommandRunner {
65
52
  return (val === 'false') ? false : true;
66
53
  }
67
54
 
68
- // Validate the options passed
69
55
  private validate(options: CommandOptions): CommandError[] {
70
- if (!options.id && !options.name) {
71
- return [new CommandError('Model ID or Model Name is required')];
56
+ if (!options.name) {
57
+ return [new CommandError('Model Name is required')];
72
58
  }
73
59
  return [];
74
60
  }
@@ -4,7 +4,6 @@ import { ModuleMetadataService } from '../services/module-metadata.service';
4
4
  import { CommandError } from './helper';
5
5
 
6
6
  interface CommandOptions {
7
- id: number;
8
7
  name: string;
9
8
  dryRun: boolean;
10
9
  }
@@ -28,7 +27,6 @@ export class RefreshModuleCommand extends CommandRunner {
28
27
  return;
29
28
  }
30
29
  const codeGenerationOptions = {
31
- moduleId: options.id,
32
30
  moduleUserKey: options.name,
33
31
  dryRun: options.dryRun,
34
32
  };
@@ -36,16 +34,7 @@ export class RefreshModuleCommand extends CommandRunner {
36
34
  }
37
35
 
38
36
  @Option({
39
- flags: '-i, --id [module ID]',
40
- description: 'Module ID from the ss_module_metadata table',
41
- })
42
- parseId(val: string): number {
43
- return +val;
44
- }
45
-
46
- // Accept the module name as an argument
47
- @Option({
48
- flags: '-n, --name [module name]',
37
+ flags: '-n, --name <module name>',
49
38
  description: 'Module Name from the ss_module_metadata table',
50
39
  })
51
40
  parseName(val: string): string {
@@ -61,11 +50,9 @@ export class RefreshModuleCommand extends CommandRunner {
61
50
  return (val === 'false') ? false : true;
62
51
  }
63
52
 
64
-
65
- // Validate the options passed
66
53
  validate(options: CommandOptions): CommandError[] {
67
- if (!options.id && !options.name) {
68
- return [new CommandError('Module ID or Module Name is required')];
54
+ if (!options.name) {
55
+ return [new CommandError('Module Name is required')];
69
56
  }
70
57
  return [];
71
58
  }
@@ -739,9 +739,10 @@ export class ModelMetadataService {
739
739
 
740
740
  @DisallowInProduction()
741
741
  async generateCodeViaCtl(modelId: number): Promise<string> {
742
+ const model = await this.findOne(modelId);
742
743
  return this.commandService.executeCommandWithArgs({
743
744
  command: 'npx',
744
- args: ['@solixai/solidctl@latest', 'generate', 'model', `--id=${modelId}`],
745
+ args: ['@solixai/solidctl@latest', 'generate', 'model', `--name=${model.singularName}`],
745
746
  cwd: path.join(process.cwd(), '..'),
746
747
  });
747
748
  }
@@ -407,9 +407,10 @@ export class ModuleMetadataService {
407
407
 
408
408
  @DisallowInProduction()
409
409
  async generateCodeViaCtl(moduleId: number): Promise<string> {
410
+ const module = await this.findOne(moduleId);
410
411
  return this.commandService.executeCommandWithArgs({
411
412
  command: 'npx',
412
- args: ['@solixai/solidctl@latest', 'generate', 'module', `--id=${moduleId}`],
413
+ args: ['@solixai/solidctl@latest', 'generate', 'module', `--name=${module.name}`],
413
414
  cwd: path.join(process.cwd(), '..'),
414
415
  });
415
416
  }