@solidstarters/solid-core 1.2.184 → 1.2.186

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/config/iam.config.d.ts +2 -0
  2. package/dist/config/iam.config.d.ts.map +1 -1
  3. package/dist/config/iam.config.js +1 -0
  4. package/dist/config/iam.config.js.map +1 -1
  5. package/dist/dtos/selection-dynamic-query.dto.d.ts +1 -0
  6. package/dist/dtos/selection-dynamic-query.dto.d.ts.map +1 -1
  7. package/dist/dtos/selection-dynamic-query.dto.js +6 -1
  8. package/dist/dtos/selection-dynamic-query.dto.js.map +1 -1
  9. package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -1
  10. package/dist/helpers/module-metadata-helper.service.js +8 -3
  11. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  12. package/dist/interfaces.d.ts +25 -1
  13. package/dist/interfaces.d.ts.map +1 -1
  14. package/dist/interfaces.js.map +1 -1
  15. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  16. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +3 -2
  17. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  18. package/dist/seeders/seed-data/solid-core-metadata.json +48 -48
  19. package/dist/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.d.ts +10 -0
  20. package/dist/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.d.ts.map +1 -0
  21. package/dist/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.js +35 -0
  22. package/dist/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.js.map +1 -0
  23. package/dist/services/field-metadata.service.d.ts.map +1 -1
  24. package/dist/services/field-metadata.service.js +10 -0
  25. package/dist/services/field-metadata.service.js.map +1 -1
  26. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts +16 -0
  27. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts.map +1 -0
  28. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js +73 -0
  29. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js.map +1 -0
  30. package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.d.ts +16 -0
  31. package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.d.ts.map +1 -0
  32. package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.js +74 -0
  33. package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.js.map +1 -0
  34. package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.d.ts +16 -0
  35. package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.d.ts.map +1 -0
  36. package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.js +151 -0
  37. package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.js.map +1 -0
  38. package/dist/services/model-metadata.service.d.ts.map +1 -1
  39. package/dist/services/model-metadata.service.js +14 -12
  40. package/dist/services/model-metadata.service.js.map +1 -1
  41. package/dist/services/setting.service.d.ts.map +1 -1
  42. package/dist/services/setting.service.js +4 -2
  43. package/dist/services/setting.service.js.map +1 -1
  44. package/dist/services/solid-ts-morph.service.d.ts +15 -0
  45. package/dist/services/solid-ts-morph.service.d.ts.map +1 -1
  46. package/dist/services/solid-ts-morph.service.js +68 -0
  47. package/dist/services/solid-ts-morph.service.js.map +1 -1
  48. package/dist/solid-core.module.d.ts.map +1 -1
  49. package/dist/solid-core.module.js +8 -0
  50. package/dist/solid-core.module.js.map +1 -1
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/package.json +1 -1
  53. package/src/config/iam.config.ts +2 -1
  54. package/src/dtos/selection-dynamic-query.dto.ts +4 -0
  55. package/src/helpers/module-metadata-helper.service.ts +10 -3
  56. package/src/interfaces.ts +28 -1
  57. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +4 -3
  58. package/src/seeders/seed-data/solid-core-metadata.json +48 -48
  59. package/src/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.ts +34 -0
  60. package/src/services/field-metadata.service.ts +10 -0
  61. package/src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts +67 -0
  62. package/src/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.ts +69 -0
  63. package/src/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.ts +141 -0
  64. package/src/services/model-metadata.service.ts +25 -23
  65. package/src/services/setting.service.ts +4 -2
  66. package/src/services/solid-ts-morph.service.ts +112 -0
  67. package/src/solid-core.module.ts +10 -1
  68. package/src/controllers/user.controller.ts.bkp +0 -78
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var SolidAddHeaderButtonOrRowButtonToListViewMcpHandler_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.SolidAddHeaderButtonOrRowButtonToListViewMcpHandler = void 0;
47
+ const common_1 = require("@nestjs/common");
48
+ const solid_ts_morph_service_1 = require("../../solid-ts-morph.service");
49
+ const module_metadata_helper_service_1 = require("../../../helpers/module-metadata-helper.service");
50
+ const fs = __importStar(require("fs/promises"));
51
+ const RESTART_TOUCH_FILE = process.env.MCP_RESTART_TOUCH_FILE || "tmp/restart.touch";
52
+ let SolidAddHeaderButtonOrRowButtonToListViewMcpHandler = SolidAddHeaderButtonOrRowButtonToListViewMcpHandler_1 = class SolidAddHeaderButtonOrRowButtonToListViewMcpHandler {
53
+ constructor(tsMorph, moduleMetadataHelperService) {
54
+ this.tsMorph = tsMorph;
55
+ this.moduleMetadataHelperService = moduleMetadataHelperService;
56
+ this.logger = new common_1.Logger(SolidAddHeaderButtonOrRowButtonToListViewMcpHandler_1.name);
57
+ }
58
+ async apply(aiInteraction) {
59
+ const raw = this.safeParse(aiInteraction.message);
60
+ const payload = (raw?.data?.plan ? raw.data : raw);
61
+ if (!payload || !Array.isArray(payload.plan)) {
62
+ throw new Error("SolidAddHeaderButtonOrRowButtonToListViewMcpHandler: invalid MCP response; missing plan[]");
63
+ }
64
+ this.tsMorph.begin();
65
+ try {
66
+ for (const step of payload.plan) {
67
+ switch (step.type) {
68
+ case "createNewFile": {
69
+ const overwrite = step.overwrite ?? false;
70
+ this.tsMorph.createNewFile(step.path, step.content, overwrite);
71
+ break;
72
+ }
73
+ case "registerSolidXExtensionComponent": {
74
+ this.tsMorph.registerSolidUiExtension(step.path, step.content);
75
+ this.tsMorph.addImport(step.path, step.importExtensionComponent);
76
+ break;
77
+ }
78
+ case "addListViewButton": {
79
+ const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(step.moduleName);
80
+ try {
81
+ await fs.access(filePath);
82
+ }
83
+ catch {
84
+ this.logger.error(`Metadata file not found: ${filePath}`);
85
+ return;
86
+ }
87
+ const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
88
+ const existingViewIndex = metaData.views.findIndex((view) => view.type === "list" &&
89
+ view.moduleUserKey === step.moduleName &&
90
+ view.modelUserKey === step.modelName);
91
+ if (existingViewIndex !== -1) {
92
+ const view = metaData.views[existingViewIndex];
93
+ view.layout = view.layout || {};
94
+ view.layout.attrs = view.layout.attrs || {};
95
+ if (!Array.isArray(view.layout.attrs[step.buttonType])) {
96
+ view.layout.attrs[step.buttonType] = [];
97
+ }
98
+ let buttonContent = step.content;
99
+ if (typeof buttonContent === "string") {
100
+ try {
101
+ buttonContent = JSON.parse(buttonContent);
102
+ }
103
+ catch (err) {
104
+ this.logger.error("❌ Failed to parse step.content JSON:", err);
105
+ return;
106
+ }
107
+ }
108
+ view.layout.attrs[step.buttonType].push(buttonContent);
109
+ console.log(`✅ Added ${step.buttonType} to view: ${view.name}`);
110
+ }
111
+ else {
112
+ console.warn(`⚠️ No matching list view found for module=${step.moduleName} and model=${step.modelName}`);
113
+ }
114
+ const updatedContent = JSON.stringify(metaData, null, 2);
115
+ await fs.writeFile(filePath, updatedContent);
116
+ this.logger.log(`Updated list view in ${filePath}`);
117
+ break;
118
+ }
119
+ default:
120
+ throw new Error(`Unsupported plan step type: ${step.type}`);
121
+ }
122
+ }
123
+ const result = await this.tsMorph.commit();
124
+ return {
125
+ seedingRequired: true,
126
+ serverRebooting: false,
127
+ };
128
+ }
129
+ catch (err) {
130
+ this.logger.error(`Apply failed; rolling back. ${String(err)}`);
131
+ this.tsMorph.rollback();
132
+ throw err;
133
+ }
134
+ }
135
+ safeParse(str) {
136
+ try {
137
+ return JSON.parse(str);
138
+ }
139
+ catch {
140
+ const unescaped = str.replace(/\\'/g, "'");
141
+ return JSON.parse(unescaped);
142
+ }
143
+ }
144
+ };
145
+ exports.SolidAddHeaderButtonOrRowButtonToListViewMcpHandler = SolidAddHeaderButtonOrRowButtonToListViewMcpHandler;
146
+ exports.SolidAddHeaderButtonOrRowButtonToListViewMcpHandler = SolidAddHeaderButtonOrRowButtonToListViewMcpHandler = SolidAddHeaderButtonOrRowButtonToListViewMcpHandler_1 = __decorate([
147
+ (0, common_1.Injectable)(),
148
+ __metadata("design:paramtypes", [solid_ts_morph_service_1.SolidTsMorphService,
149
+ module_metadata_helper_service_1.ModuleMetadataHelperService])
150
+ ], SolidAddHeaderButtonOrRowButtonToListViewMcpHandler);
151
+ //# sourceMappingURL=solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.js","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from \"@nestjs/common\";\nimport { AiInteraction } from \"src/entities/ai-interaction.entity\";\nimport { IMcpToolResponseHandler, McpComputedProviderResponse, PlanStep } from \"../../../interfaces\";\nimport { SolidTsMorphService } from \"src/services/solid-ts-morph.service\";\nimport { ModuleMetadataHelperService } from \"src/helpers/module-metadata-helper.service\";\nimport * as fs from \"fs/promises\";\n\nconst RESTART_TOUCH_FILE = process.env.MCP_RESTART_TOUCH_FILE || \"tmp/restart.touch\";\n\n@Injectable()\nexport class SolidAddHeaderButtonOrRowButtonToListViewMcpHandler implements IMcpToolResponseHandler {\n private readonly logger = new Logger(SolidAddHeaderButtonOrRowButtonToListViewMcpHandler.name);\n\n constructor(\n private readonly tsMorph: SolidTsMorphService,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n\n ) { }\n\n async apply(aiInteraction: AiInteraction) {\n const raw = this.safeParse(aiInteraction.message);\n const payload: McpComputedProviderResponse | undefined = (raw?.data?.plan ? raw.data : raw) as McpComputedProviderResponse;\n\n if (!payload || !Array.isArray(payload.plan)) {\n throw new Error(\"SolidAddHeaderButtonOrRowButtonToListViewMcpHandler: invalid MCP response; missing plan[]\");\n }\n\n // Batch all plan steps in a single txn so nodemon restarts only once.\n this.tsMorph.begin();\n try {\n for (const step of payload.plan as PlanStep[]) {\n switch (step.type) {\n case \"createNewFile\": {\n const overwrite = step.overwrite ?? false;\n this.tsMorph.createNewFile(step.path, step.content, overwrite);\n break;\n }\n case \"registerSolidXExtensionComponent\": {\n this.tsMorph.registerSolidUiExtension(\n step.path,\n step.content,\n );\n this.tsMorph.addImport(\n step.path,\n step.importExtensionComponent,\n );\n break;\n }\n case \"addListViewButton\": {\n\n const filePath =\n await this.moduleMetadataHelperService.getModuleMetadataFilePath(\n step.moduleName\n );\n try {\n await fs.access(filePath);\n } catch {\n this.logger.error(`Metadata file not found: ${filePath}`);\n return;\n }\n const metaData =\n await this.moduleMetadataHelperService.getModuleMetadataConfiguration(\n filePath\n );\n // Remove, update or insert logic\n\n\n // Find the existing view of type \"list\" for the given module & model\n const existingViewIndex = metaData.views.findIndex(\n (view: any) =>\n view.type === \"list\" &&\n view.moduleUserKey === step.moduleName &&\n view.modelUserKey === step.modelName\n );\n\n if (existingViewIndex !== -1) {\n const view = metaData.views[existingViewIndex];\n\n // Ensure layout & attrs exist\n view.layout = view.layout || {};\n view.layout.attrs = view.layout.attrs || {};\n\n // Initialize rowButtons or headerButtons if not present\n if (!Array.isArray(view.layout.attrs[step.buttonType])) {\n view.layout.attrs[step.buttonType] = [];\n }\n\n let buttonContent = step.content;\n\n // Parse only if it’s a string\n if (typeof buttonContent === \"string\") {\n try {\n buttonContent = JSON.parse(buttonContent);\n } catch (err) {\n this.logger.error(\"❌ Failed to parse step.content JSON:\", err);\n return;\n }\n }\n\n\n // Push the new button content\n view.layout.attrs[step.buttonType].push(buttonContent);\n\n console.log(`✅ Added ${step.buttonType} to view: ${view.name}`);\n } else {\n console.warn(`⚠️ No matching list view found for module=${step.moduleName} and model=${step.modelName}`);\n }\n\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n this.logger.log(`Updated list view in ${filePath}`);\n\n break;\n }\n default:\n throw new Error(`Unsupported plan step type: ${(step as any).type}`);\n }\n }\n\n const result = await this.tsMorph.commit();\n\n return {\n seedingRequired: true,\n serverRebooting: false,\n };\n } catch (err) {\n this.logger.error(`Apply failed; rolling back. ${String(err)}`);\n this.tsMorph.rollback();\n throw err;\n }\n }\n\n private safeParse(str: string): any {\n try {\n return JSON.parse(str);\n } catch {\n const unescaped = str.replace(/\\\\'/g, \"'\");\n return JSON.parse(unescaped);\n }\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAM,UAAU,EAAsB,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAIlE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,EAGL,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,mCAAmC,EAAE,MAAM,2CAA2C,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAM9D,qBACa,oBAAoB;IAI7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAEjC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,mCAAmC;IACpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,2BAA2B;IAb9C,OAAO,CAAC,MAAM,CAAsC;gBAGjC,iBAAiB,EAAE,UAAU,CAAC,aAAa,CAAC,EAE5C,iBAAiB,EAAE,UAAU,CAAC,aAAa,CAAC,EAC5C,gBAAgB,EAAE,gBAAgB,EAElC,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,mCAAmC,EAAE,mCAAmC,EACxE,oBAAoB,EAAE,oBAAoB,EAC1C,WAAW,EAAE,mBAAmB,EAChC,2BAA2B,EAAE,2BAA2B;IAKrE,QAAQ,CAAC,cAAc,EAAE,cAAc;;;;;;;;;;;IAgCvC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG;IAc5B,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,KAAK;IAa1D,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,KAAK;IAarD,MAAM,CAAC,SAAS,EAAE,sBAAsB;YAuBhC,kCAAkC;IAS1C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,sBAAsB;IAyBjE,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB;IAkEpE,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC;IAkD1D,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,sBAAsB;IA6G7F,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC;IAwE1D,MAAM,CAAC,SAAS,EAAE,sBAAsB;IAqBxC,oBAAoB,CAAC,YAAY,EAAE,MAAM;IAUzC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAwBvC,MAAM,CAAC,EAAE,EAAE,MAAM;IAOjB,eAAe,CAAC,aAAa,EAAE,MAAM;IA+LrC,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC;YAqBxD,4BAA4B;IAmBpC,iBAAiB,CAAC,OAAO,EAAE,MAAM;YAmBzB,uBAAuB;IA2BrC,OAAO,CAAC,+BAA+B;YAgIzB,qBAAqB;IA6I7B,YAAY,CAAC,OAAO,EAAE,qBAAqB;;;;;IAkB3C,wBAAwB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAuDzE,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;YAgB1D,0BAA0B;YAsB1B,0BAA0B;IAkBlC,aAAa,CAAC,IAAI,EAAE,GAAG;;;;YAiCf,wBAAwB;CAiBvC"}
1
+ {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
@@ -541,15 +541,17 @@ let ModelMetadataService = class ModelMetadataService {
541
541
  await viewRepo.delete({ model: { id: modelEntity.id } });
542
542
  const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(modelEntity.module.name);
543
543
  const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
544
- const existingModelIndex = metaData.moduleMetadata.models.findIndex((existingModel) => existingModel.singularName === modelEntity.singularName);
545
- if (existingModelIndex !== -1) {
546
- metaData.moduleMetadata.models.splice(existingModelIndex, 1);
544
+ if (metaData) {
545
+ const existingModelIndex = metaData.moduleMetadata.models.findIndex((existingModel) => existingModel.singularName === modelEntity.singularName);
546
+ if (existingModelIndex !== -1) {
547
+ metaData.moduleMetadata.models.splice(existingModelIndex, 1);
548
+ }
549
+ metaData.moduleMetadata.menus = metaData.moduleMetadata.menus.filter((menu) => menu.modelUserKey !== modelEntity.singularName);
550
+ metaData.moduleMetadata.actions = metaData.moduleMetadata.actions.filter((action) => action.modelUserKey !== modelEntity.singularName);
551
+ metaData.moduleMetadata.views = metaData.moduleMetadata.views.filter((view) => view.modelUserKey !== modelEntity.singularName);
552
+ const updatedContent = JSON.stringify(metaData, null, 2);
553
+ await fs.writeFile(filePath, updatedContent);
547
554
  }
548
- metaData.moduleMetadata.menus = metaData.moduleMetadata.menus.filter((menu) => menu.modelUserKey !== modelEntity.singularName);
549
- metaData.moduleMetadata.actions = metaData.moduleMetadata.actions.filter((action) => action.modelUserKey !== modelEntity.singularName);
550
- metaData.moduleMetadata.views = metaData.moduleMetadata.views.filter((view) => view.modelUserKey !== modelEntity.singularName);
551
- const updatedContent = JSON.stringify(metaData, null, 2);
552
- await fs.writeFile(filePath, updatedContent);
553
555
  }
554
556
  async handleGenerateCode(options) {
555
557
  const affectedModelIds = [], refreshModelCodeOutputLines = [], removeFieldCodeOutputLines = [];
@@ -701,12 +703,12 @@ let ModelMetadataService = class ModelMetadataService {
701
703
  children: [
702
704
  {
703
705
  type: "column",
704
- attrs: { name: "group-1", label: "", className: "col-6" },
706
+ attrs: { name: "group-1", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
705
707
  children: column1Fields
706
708
  },
707
709
  {
708
710
  type: "column",
709
- attrs: { name: "group-2", label: "", className: "col-6" },
711
+ attrs: { name: "group-2", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
710
712
  children: column2Fields
711
713
  }
712
714
  ]
@@ -796,12 +798,12 @@ let ModelMetadataService = class ModelMetadataService {
796
798
  children: [
797
799
  {
798
800
  type: "column",
799
- attrs: { name: "group-1", label: "", className: "col-6" },
801
+ attrs: { name: "group-1", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
800
802
  children: firstHalf
801
803
  },
802
804
  {
803
805
  type: "column",
804
- attrs: { name: "group-2", label: "", className: "col-6" },
806
+ attrs: { name: "group-2", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
805
807
  children: secondHalf
806
808
  }
807
809
  ]