@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.
- package/dist/config/iam.config.d.ts +2 -0
- package/dist/config/iam.config.d.ts.map +1 -1
- package/dist/config/iam.config.js +1 -0
- package/dist/config/iam.config.js.map +1 -1
- package/dist/dtos/selection-dynamic-query.dto.d.ts +1 -0
- package/dist/dtos/selection-dynamic-query.dto.d.ts.map +1 -1
- package/dist/dtos/selection-dynamic-query.dto.js +6 -1
- package/dist/dtos/selection-dynamic-query.dto.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js +8 -3
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/interfaces.d.ts +25 -1
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +3 -2
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +48 -48
- package/dist/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.d.ts +10 -0
- package/dist/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.d.ts.map +1 -0
- package/dist/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.js +35 -0
- package/dist/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.js.map +1 -0
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js +10 -0
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts +16 -0
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js +73 -0
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.d.ts +16 -0
- package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.js +74 -0
- package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.js.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.d.ts +16 -0
- package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.d.ts.map +1 -0
- package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.js +151 -0
- package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.js.map +1 -0
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +14 -12
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +4 -2
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/solid-ts-morph.service.d.ts +15 -0
- package/dist/services/solid-ts-morph.service.d.ts.map +1 -1
- package/dist/services/solid-ts-morph.service.js +68 -0
- package/dist/services/solid-ts-morph.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +8 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/config/iam.config.ts +2 -1
- package/src/dtos/selection-dynamic-query.dto.ts +4 -0
- package/src/helpers/module-metadata-helper.service.ts +10 -3
- package/src/interfaces.ts +28 -1
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +4 -3
- package/src/seeders/seed-data/solid-core-metadata.json +48 -48
- package/src/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.ts +34 -0
- package/src/services/field-metadata.service.ts +10 -0
- package/src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts +67 -0
- package/src/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.ts +69 -0
- package/src/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.ts +141 -0
- package/src/services/model-metadata.service.ts +25 -23
- package/src/services/setting.service.ts +4 -2
- package/src/services/solid-ts-morph.service.ts +112 -0
- package/src/solid-core.module.ts +10 -1
- 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;
|
|
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
|
-
|
|
545
|
-
|
|
546
|
-
|
|
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
|
]
|