@solidstarters/solid-core 1.2.187 → 1.2.189

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 (89) hide show
  1. package/dist/config/iam.config.d.ts +0 -13
  2. package/dist/config/iam.config.d.ts.map +1 -1
  3. package/dist/config/iam.config.js +2 -12
  4. package/dist/config/iam.config.js.map +1 -1
  5. package/dist/config/jwt.config.d.ts +14 -0
  6. package/dist/config/jwt.config.d.ts.map +1 -0
  7. package/dist/config/jwt.config.js +15 -0
  8. package/dist/config/jwt.config.js.map +1 -0
  9. package/dist/decorators/active-user.decorator.d.ts +1 -1
  10. package/dist/dtos/create-list-of-values.dto.d.ts.map +1 -1
  11. package/dist/dtos/create-list-of-values.dto.js +1 -0
  12. package/dist/dtos/create-list-of-values.dto.js.map +1 -1
  13. package/dist/dtos/update-list-of-values.dto.d.ts.map +1 -1
  14. package/dist/dtos/update-list-of-values.dto.js +1 -0
  15. package/dist/dtos/update-list-of-values.dto.js.map +1 -1
  16. package/dist/entities/list-of-values.entity.js +1 -1
  17. package/dist/entities/list-of-values.entity.js.map +1 -1
  18. package/dist/guards/access-token.guard.d.ts +1 -1
  19. package/dist/guards/access-token.guard.d.ts.map +1 -1
  20. package/dist/guards/access-token.guard.js +2 -2
  21. package/dist/guards/access-token.guard.js.map +1 -1
  22. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.d.ts.map +1 -1
  23. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js +12 -2
  24. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  25. package/dist/interfaces.d.ts +16 -1
  26. package/dist/interfaces.d.ts.map +1 -1
  27. package/dist/interfaces.js.map +1 -1
  28. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  29. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +7 -0
  30. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  31. package/dist/seeders/seed-data/solid-core-metadata.json +236 -119
  32. package/dist/services/authentication.service.d.ts +8 -7
  33. package/dist/services/authentication.service.d.ts.map +1 -1
  34. package/dist/services/authentication.service.js +12 -11
  35. package/dist/services/authentication.service.js.map +1 -1
  36. package/dist/services/crud.service.d.ts +1 -0
  37. package/dist/services/crud.service.d.ts.map +1 -1
  38. package/dist/services/crud.service.js +14 -12
  39. package/dist/services/crud.service.js.map +1 -1
  40. package/dist/services/dashboard-question.service.d.ts.map +1 -1
  41. package/dist/services/dashboard-question.service.js +23 -2
  42. package/dist/services/dashboard-question.service.js.map +1 -1
  43. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts +16 -0
  44. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts.map +1 -0
  45. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js +151 -0
  46. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js.map +1 -0
  47. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts +1 -0
  48. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts.map +1 -1
  49. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js +8 -1
  50. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js.map +1 -1
  51. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts +14 -0
  52. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts.map +1 -0
  53. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js +73 -0
  54. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js.map +1 -0
  55. package/dist/services/list-of-values-metadata.service.d.ts.map +1 -1
  56. package/dist/services/list-of-values-metadata.service.js.map +1 -1
  57. package/dist/services/model-metadata.service.js +2 -2
  58. package/dist/services/model-metadata.service.js.map +1 -1
  59. package/dist/services/selection-providers/list-of-models-selection-provider.service.js +2 -2
  60. package/dist/services/selection-providers/list-of-models-selection-provider.service.js.map +1 -1
  61. package/dist/services/setting.service.d.ts.map +1 -1
  62. package/dist/services/setting.service.js +3 -2
  63. package/dist/services/setting.service.js.map +1 -1
  64. package/dist/solid-core.module.d.ts.map +1 -1
  65. package/dist/solid-core.module.js +7 -2
  66. package/dist/solid-core.module.js.map +1 -1
  67. package/dist/tsconfig.tsbuildinfo +1 -1
  68. package/package.json +1 -1
  69. package/src/config/iam.config.ts +1 -11
  70. package/src/config/jwt.config.ts +13 -0
  71. package/src/dtos/create-list-of-values.dto.ts +1 -0
  72. package/src/dtos/update-list-of-values.dto.ts +1 -0
  73. package/src/entities/list-of-values.entity.ts +1 -1
  74. package/src/guards/access-token.guard.ts +1 -1
  75. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +17 -6
  76. package/src/interfaces.ts +17 -1
  77. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +18 -0
  78. package/src/seeders/seed-data/solid-core-metadata.json +238 -119
  79. package/src/services/authentication.service.ts +17 -17
  80. package/src/services/crud.service.ts +17 -31
  81. package/src/services/dashboard-question.service.ts +29 -2
  82. package/src/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.ts +137 -0
  83. package/src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts +21 -7
  84. package/src/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.ts +72 -0
  85. package/src/services/list-of-values-metadata.service.ts +0 -3
  86. package/src/services/model-metadata.service.ts +2 -2
  87. package/src/services/selection-providers/list-of-models-selection-provider.service.ts +2 -2
  88. package/src/services/setting.service.ts +3 -2
  89. package/src/solid-core.module.ts +7 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-add-button-to-form-view-mcp-handler.service.js","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-button-to-form-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 SolidAddButtonToFormViewMcpHandler implements IMcpToolResponseHandler {\n private readonly logger = new Logger(SolidAddButtonToFormViewMcpHandler.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(\"SolidAddButtonToFormViewMcpHandler: 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 \"addFormViewButton\": {\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 === \"form\" &&\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 let buttonContent = step.content;\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 // 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}"]}
@@ -12,5 +12,6 @@ export declare class SolidAddControllerHandlerMcpHandler implements IMcpToolResp
12
12
  wroteFiles: number;
13
13
  }>;
14
14
  private safeParse;
15
+ private handleAddMethodToExistingClass;
15
16
  }
16
17
  //# sourceMappingURL=solid-add-controller-handler-method-mcp-handler.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"solid-add-controller-handler-method-mcp-handler.service.d.ts","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAyC,MAAM,qBAAqB,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,qBACa,mCAAoC,YAAW,uBAAuB;IAGrE,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;gBAElD,OAAO,EAAE,mBAAmB;IAEnD,KAAK,CAAC,aAAa,EAAE,aAAa;;;;;;IA+CxC,OAAO,CAAC,SAAS;CAQlB"}
1
+ {"version":3,"file":"solid-add-controller-handler-method-mcp-handler.service.d.ts","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAgC,uBAAuB,EAAyC,MAAM,qBAAqB,CAAC;AACnI,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,qBACa,mCAAoC,YAAW,uBAAuB;IAGrE,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;gBAElD,OAAO,EAAE,mBAAmB;IAEnD,KAAK,CAAC,aAAa,EAAE,aAAa;;;;;;IA0CxC,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,8BAA8B;CAkBvC"}
@@ -34,7 +34,7 @@ let SolidAddControllerHandlerMcpHandler = SolidAddControllerHandlerMcpHandler_1
34
34
  break;
35
35
  }
36
36
  case "addMethodToExistingClass": {
37
- this.tsMorph.addMethodToExistingClass(step.path, step.className, step.methodName, step.content);
37
+ this.handleAddMethodToExistingClass(step);
38
38
  break;
39
39
  }
40
40
  default:
@@ -64,6 +64,13 @@ let SolidAddControllerHandlerMcpHandler = SolidAddControllerHandlerMcpHandler_1
64
64
  return JSON.parse(unescaped);
65
65
  }
66
66
  }
67
+ handleAddMethodToExistingClass(step) {
68
+ const addMethodStep = step;
69
+ if (addMethodStep.importStatements && addMethodStep.importStatements.length > 0) {
70
+ this.tsMorph.addImport(addMethodStep.path, (addMethodStep.importStatements || []).join('\n'));
71
+ }
72
+ this.tsMorph.addMethodToExistingClass(addMethodStep.path, addMethodStep.className, addMethodStep.methodName, addMethodStep.content);
73
+ }
67
74
  };
68
75
  exports.SolidAddControllerHandlerMcpHandler = SolidAddControllerHandlerMcpHandler;
69
76
  exports.SolidAddControllerHandlerMcpHandler = SolidAddControllerHandlerMcpHandler = SolidAddControllerHandlerMcpHandler_1 = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"solid-add-controller-handler-method-mcp-handler.service.js","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AAGpD,yEAA0E;AAGnE,IAAM,mCAAmC,2CAAzC,MAAM,mCAAmC;IAG9C,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;QAFxC,WAAM,GAAG,IAAI,eAAM,CAAC,qCAAmC,CAAC,IAAI,CAAC,CAAC;IAElB,CAAC;IAE9D,KAAK,CAAC,KAAK,CAAC,aAA4B;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAA4C,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAgC,CAAC;QAE3H,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACrG,CAAC;QAGD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAkB,EAAE,CAAC;gBAC9C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClB,KAAK,eAAe,CAAC,CAAC,CAAC;wBACrB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;wBAC1C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;wBAC/D,MAAM;oBACR,CAAC;oBACD,KAAK,0BAA0B,CAAC,CAAC,CAAC;wBAChC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CACnC,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,OAAO,CACb,CAAC;wBACF,MAAM;oBACR,CAAC;oBACD;wBACE,MAAM,IAAI,KAAK,CAAC,+BAAgC,IAAY,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAE3C,OAAO;gBACL,eAAe,EAAE,IAAI;gBACrB,eAAe,EAAE,IAAI;gBACrB,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;gBACjC,UAAU,EAAE,MAAM,CAAC,KAAK;aACzB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,GAAW;QAC3B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF,CAAA;AA5DY,kFAAmC;8CAAnC,mCAAmC;IAD/C,IAAA,mBAAU,GAAE;qCAI2B,4CAAmB;GAH9C,mCAAmC,CA4D/C","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\";\n\n@Injectable()\nexport class SolidAddControllerHandlerMcpHandler implements IMcpToolResponseHandler {\n private readonly logger = new Logger(SolidAddControllerHandlerMcpHandler.name);\n\n constructor(private readonly tsMorph: SolidTsMorphService) { }\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(\"SolidAddControllerHandlerMethodMcpHandler: 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 \"addMethodToExistingClass\": {\n this.tsMorph.addMethodToExistingClass(\n step.path,\n step.className,\n step.methodName,\n step.content,\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: true,\n appliedSteps: payload.plan.length,\n wroteFiles: result.wrote,\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
+ {"version":3,"file":"solid-add-controller-handler-method-mcp-handler.service.js","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-controller-handler-method-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 { AddMethodToExistingClassStep, IMcpToolResponseHandler, McpComputedProviderResponse, PlanStep } from \"../../../interfaces\";\nimport { SolidTsMorphService } from \"src/services/solid-ts-morph.service\";\n\n@Injectable()\nexport class SolidAddControllerHandlerMcpHandler implements IMcpToolResponseHandler {\n private readonly logger = new Logger(SolidAddControllerHandlerMcpHandler.name);\n\n constructor(private readonly tsMorph: SolidTsMorphService) { }\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(\"SolidAddControllerHandlerMethodMcpHandler: 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 \"addMethodToExistingClass\": {\n this.handleAddMethodToExistingClass(step);\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: true,\n appliedSteps: payload.plan.length,\n wroteFiles: result.wrote,\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\n private handleAddMethodToExistingClass(step: PlanStep) {\n // Cast step to the appropriate type if necessary\n const addMethodStep = step as AddMethodToExistingClassStep\n // Add the import statement to the specified file\n if (addMethodStep.importStatements && addMethodStep.importStatements.length > 0) {\n this.tsMorph.addImport(\n addMethodStep.path,\n (addMethodStep.importStatements || []).join('\\n'),\n );\n }\n // Add the method content to the specified class in the file\n this.tsMorph.addMethodToExistingClass(\n addMethodStep.path,\n addMethodStep.className,\n addMethodStep.methodName,\n addMethodStep.content,\n );\n }\n}"]}
@@ -0,0 +1,14 @@
1
+ import { AiInteraction } from "src/entities/ai-interaction.entity";
2
+ import { IMcpToolResponseHandler } from "../../../interfaces";
3
+ import { SolidTsMorphService } from "src/services/solid-ts-morph.service";
4
+ export declare class SolidCreateCustomFormViewWidgetMcpHandler implements IMcpToolResponseHandler {
5
+ private readonly tsMorph;
6
+ private readonly logger;
7
+ constructor(tsMorph: SolidTsMorphService);
8
+ apply(aiInteraction: AiInteraction): Promise<{
9
+ seedingRequired: boolean;
10
+ serverRebooting: boolean;
11
+ }>;
12
+ private safeParse;
13
+ }
14
+ //# sourceMappingURL=solid-create-custom-form-view-widget-mcp-handler.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-create-custom-form-view-widget-mcp-handler.service.d.ts","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAyC,MAAM,qBAAqB,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAI1E,qBACa,yCAA0C,YAAW,uBAAuB;IAIjF,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8D;gBAGhE,OAAO,EAAE,mBAAmB;IAI3C,KAAK,CAAC,aAAa,EAAE,aAAa;;;;IA+CxC,OAAO,CAAC,SAAS;CAQpB"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var SolidCreateCustomFormViewWidgetMcpHandler_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.SolidCreateCustomFormViewWidgetMcpHandler = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const solid_ts_morph_service_1 = require("../../solid-ts-morph.service");
16
+ const RESTART_TOUCH_FILE = process.env.MCP_RESTART_TOUCH_FILE || "tmp/restart.touch";
17
+ let SolidCreateCustomFormViewWidgetMcpHandler = SolidCreateCustomFormViewWidgetMcpHandler_1 = class SolidCreateCustomFormViewWidgetMcpHandler {
18
+ constructor(tsMorph) {
19
+ this.tsMorph = tsMorph;
20
+ this.logger = new common_1.Logger(SolidCreateCustomFormViewWidgetMcpHandler_1.name);
21
+ }
22
+ async apply(aiInteraction) {
23
+ const raw = this.safeParse(aiInteraction.message);
24
+ const payload = (raw?.data?.plan ? raw.data : raw);
25
+ if (!payload || !Array.isArray(payload.plan)) {
26
+ throw new Error("SolidCreateCustomFormViewWidgetMcpHandler: invalid MCP response; missing plan[]");
27
+ }
28
+ this.tsMorph.begin();
29
+ try {
30
+ for (const step of payload.plan) {
31
+ switch (step.type) {
32
+ case "createNewFile": {
33
+ const overwrite = step.overwrite ?? false;
34
+ this.tsMorph.createNewFile(step.path, step.content, overwrite);
35
+ break;
36
+ }
37
+ case "registerSolidXExtensionComponent": {
38
+ this.tsMorph.registerSolidUiExtension(step.path, step.content);
39
+ this.tsMorph.addImport(step.path, step.importExtensionComponent);
40
+ break;
41
+ }
42
+ default:
43
+ throw new Error(`Unsupported plan step type: ${step.type}`);
44
+ }
45
+ }
46
+ const result = await this.tsMorph.commit();
47
+ return {
48
+ seedingRequired: true,
49
+ serverRebooting: false,
50
+ };
51
+ }
52
+ catch (err) {
53
+ this.logger.error(`Apply failed; rolling back. ${String(err)}`);
54
+ this.tsMorph.rollback();
55
+ throw err;
56
+ }
57
+ }
58
+ safeParse(str) {
59
+ try {
60
+ return JSON.parse(str);
61
+ }
62
+ catch {
63
+ const unescaped = str.replace(/\\'/g, "'");
64
+ return JSON.parse(unescaped);
65
+ }
66
+ }
67
+ };
68
+ exports.SolidCreateCustomFormViewWidgetMcpHandler = SolidCreateCustomFormViewWidgetMcpHandler;
69
+ exports.SolidCreateCustomFormViewWidgetMcpHandler = SolidCreateCustomFormViewWidgetMcpHandler = SolidCreateCustomFormViewWidgetMcpHandler_1 = __decorate([
70
+ (0, common_1.Injectable)(),
71
+ __metadata("design:paramtypes", [solid_ts_morph_service_1.SolidTsMorphService])
72
+ ], SolidCreateCustomFormViewWidgetMcpHandler);
73
+ //# sourceMappingURL=solid-create-custom-form-view-widget-mcp-handler.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-create-custom-form-view-widget-mcp-handler.service.js","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AAGpD,yEAA0E;AAE1E,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,mBAAmB,CAAC;AAG9E,IAAM,yCAAyC,iDAA/C,MAAM,yCAAyC;IAGlD,YACqB,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;QAHhC,WAAM,GAAG,IAAI,eAAM,CAAC,2CAAyC,CAAC,IAAI,CAAC,CAAC;IAKjF,CAAC;IAEL,KAAK,CAAC,KAAK,CAAC,aAA4B;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAA4C,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAgC,CAAC;QAE3H,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACvG,CAAC;QAGD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAkB,EAAE,CAAC;gBAC5C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;oBAChB,KAAK,eAAe,CAAC,CAAC,CAAC;wBACnB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;wBAC1C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;wBAC/D,MAAM;oBACV,CAAC;oBACD,KAAK,kCAAkC,CAAC,CAAC,CAAC;wBACtC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CACjC,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,OAAO,CACf,CAAC;wBACF,IAAI,CAAC,OAAO,CAAC,SAAS,CAClB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,wBAAwB,CAChC,CAAC;wBACF,MAAM;oBACV,CAAC;oBACD;wBACI,MAAM,IAAI,KAAK,CAAC,+BAAgC,IAAY,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7E,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAE3C,OAAO;gBACH,eAAe,EAAE,IAAI;gBACrB,eAAe,EAAE,KAAK;aACzB,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,GAAW;QACzB,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;CACJ,CAAA;AA/DY,8FAAyC;oDAAzC,yCAAyC;IADrD,IAAA,mBAAU,GAAE;qCAKqB,4CAAmB;GAJxC,yCAAyC,CA+DrD","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\";\n\nconst RESTART_TOUCH_FILE = process.env.MCP_RESTART_TOUCH_FILE || \"tmp/restart.touch\";\n\n@Injectable()\nexport class SolidCreateCustomFormViewWidgetMcpHandler implements IMcpToolResponseHandler {\n private readonly logger = new Logger(SolidCreateCustomFormViewWidgetMcpHandler.name);\n\n constructor(\n private readonly tsMorph: SolidTsMorphService,\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(\"SolidCreateCustomFormViewWidgetMcpHandler: 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 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":"list-of-values-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/list-of-values-metadata.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAI7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAIvE,qBACa,2BAA4B,SAAQ,WAAW,CAAC,YAAY,CAAC;IAGtE,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAC7C,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IAE/C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,2BAA2B,EAAE,2BAA2B;IAdnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAEjD,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EACpC,kBAAkB,EAAE,kBAAkB,EAEtC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,EAC9B,SAAS,EAAE,SAAS,EACpB,2BAA2B,EAAE,2BAA2B;IAM7D,wBAAwB,CAAC,MAAM,EAAE,YAAY;IAuB7C,0BAA0B,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY;IAwBxE,4BAA4B,CAAC,MAAM,EAAE,YAAY;YAyBzC,oBAAoB;YAWpB,aAAa;YAoCb,cAAc;YA0Bd,gBAAgB;CA8B/B"}
1
+ {"version":3,"file":"list-of-values-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/list-of-values-metadata.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAI7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAIvE,qBACa,2BAA4B,SAAQ,WAAW,CAAC,YAAY,CAAC;IAGtE,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAC7C,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IAE/C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,2BAA2B,EAAE,2BAA2B;IAdnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAEjD,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EACpC,kBAAkB,EAAE,kBAAkB,EAEtC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,EAC9B,SAAS,EAAE,SAAS,EACpB,2BAA2B,EAAE,2BAA2B;IAM7D,wBAAwB,CAAC,MAAM,EAAE,YAAY;IAuB7C,0BAA0B,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY;IAwBxE,4BAA4B,CAAC,MAAM,EAAE,YAAY;YAuBzC,oBAAoB;YAWpB,aAAa;YAoCb,cAAc;YAyBd,gBAAgB;CA8B/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-of-values-metadata.service.js","sourceRoot":"","sources":["../../src/services/list-of-values-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { ConfigService } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\n\n\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\n\nimport { ListOfValues } from 'src/entities/list-of-values.entity';\nimport { ListOfValuesMapper } from 'src/mappers/list-of-values-mapper';\n\n\n\n@Injectable()\nexport class ListOfValuesMetadataService extends CRUDService<ListOfValues> {\n private readonly logger = new Logger(this.constructor.name);\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n readonly listOfValuesMapper: ListOfValuesMapper,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(ListOfValues, 'default')\n readonly repo: Repository<ListOfValues>,\n readonly moduleRef: ModuleRef,\n readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'listOfValues', 'solid-core', moduleRef);\n }\n\n async saveListofValuesToConfig(entity: ListOfValues) {\n if (!entity) {\n this.logger.debug('No entity found in the ListofValuesSubscriber saveListofvalueToConfig method');\n return;\n }\n\n // Validate list of value details\n const listofvalue = entity as ListOfValues;\n const moduleMetadata = entity.module;\n if (!moduleMetadata) {\n throw new Error(`Module metadata not found for listofvalue id ${entity.id}`);\n }\n\n // Get config file details\n const { filePath, metaData } = await this.getConfigFileDetails(moduleMetadata.name); // sting expected module name\n if (!filePath || !metaData) {\n throw new Error(`Configuration details not found for module: ${moduleMetadata.name}`);\n }\n\n // Write the listofvalue to the config file\n await this.writeToConfig(metaData, listofvalue, filePath);\n }\n\n async updateListofValuesToConfig(oldentity: ListOfValues, entity: ListOfValues) {\n if (!entity) {\n this.logger.debug('No entity found in the ListofValuesSubscriber saveListofvalueToConfig method');\n return;\n }\n\n // Validate list of value details\n const oldlistofvalue = oldentity as ListOfValues;\n const listofvalue = entity as ListOfValues;\n const moduleMetadata = entity.module;\n if (!moduleMetadata) {\n throw new Error(`Module metadata not found for listofvalue id ${entity.id}`);\n }\n\n // Get config file details\n const { filePath, metaData } = await this.getConfigFileDetails(moduleMetadata.name); // sting expected module name\n if (!filePath || !metaData) {\n throw new Error(`Configuration details not found for module: ${moduleMetadata.name}`);\n }\n\n // Write the listofvalue to the config file\n await this.updateToConfig(metaData, oldlistofvalue, listofvalue, filePath);\n }\n\n async deleteListOfValuesFromConfig(entity: ListOfValues) {\n if (!entity) {\n this.logger.debug('No entity found in the ListofValuesSubscriber saveListofvalueToConfig method');\n return;\n }\n\n // Validate list of value details\n const listofvalue = entity as ListOfValues;\n const moduleMetadata = entity.module;\n if (!moduleMetadata) {\n throw new Error(`Module metadata not found for listofvalue id ${entity.id}`);\n }\n\n // Get config file details\n const { filePath, metaData } = await this.getConfigFileDetails(moduleMetadata.name); // sting expected module name\n if (!filePath || !metaData) {\n throw new Error(`Configuration details not found for module: ${moduleMetadata.name}`);\n }\n\n // delete the listofvalue to the config file\n await this.deleteFromConfig(metaData, listofvalue, filePath);\n }\n\n\n\n private async getConfigFileDetails(moduleName: string): Promise<{ filePath: string; metaData: any }> {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);\n try {\n await fs.access(filePath);\n } catch (error) {\n throw new Error(`Configuration file not found for module: ${moduleName}`);\n }\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n return { filePath, metaData };\n }\n\n private async writeToConfig(metaData: any, listofvalues: ListOfValues, filePath: string) {\n const dto = await this.listOfValuesMapper.toDto(listofvalues);\n\n if (!Array.isArray(metaData.listOfValues)) {\n metaData.listOfValues = [];\n }\n\n // Match by type + value + module\n const existingIndex = metaData.listOfValues.findIndex(\n (item: { type: string; value: string; module: number }) =>\n item.type === dto.type &&\n item.value === dto.value &&\n item.module === dto.module\n );\n\n if (existingIndex !== -1) {\n // Replace existing entry\n metaData.listOfValues[existingIndex] = dto;\n } else {\n // Insert new entry\n // metaData.listOfValues.unshift(dto);\n\n if (metaData.listOfValues.length === 0) {\n // Case 1: Empty array → add first item\n metaData.listOfValues.push(dto);\n } else {\n // Case 2: Insert new item right after index 0\n metaData.listOfValues.unshift(dto);\n }\n\n }\n\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n }\n\n private async updateToConfig(metaData: any, oldlistofvalues: ListOfValues, listofvalues: ListOfValues, filePath: string) {\n const newvalue = await this.listOfValuesMapper.toDto(listofvalues);\n const oldvalue = await this.listOfValuesMapper.toDto(oldlistofvalues);\n\n if (!Array.isArray(metaData.listOfValues)) {\n metaData.listOfValues = [];\n }\n\n const searchType = oldvalue.type || newvalue.type;\n const searchValue = oldvalue.value || newvalue.value;\n const searchModule = oldvalue.module || newvalue.module;\n\n const existingIndex = metaData.listOfValues.findIndex(\n (item: { type: string; value: string; module: number }) =>\n item.type === searchType && item.value === searchValue && item.module === searchModule\n );\n if (existingIndex !== -1) {\n // Replace existing match\n metaData.listOfValues[existingIndex] = newvalue;\n }\n\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n }\n\n\n private async deleteFromConfig(metaData: any, listofvalues: ListOfValues, filePath: string) {\n const dto = await this.listOfValuesMapper.toDto(listofvalues);\n\n if (!Array.isArray(metaData.listOfValues)) {\n metaData.listOfValues = [];\n }\n\n // Match by type + value + module\n const existingIndex = metaData.listOfValues.findIndex(\n (item: { type: string; value: string; module: number }) =>\n item.type === dto.type &&\n item.value === dto.value &&\n item.module === dto.module\n );\n\n if (existingIndex !== -1) {\n // Remove the item\n metaData.listOfValues.splice(existingIndex, 1);\n this.logger.debug(`Deleted LOV ${dto.type}:${dto.value} (module ${dto.module}) from config`);\n } else {\n this.logger.warn(\n `LOV ${dto.type}:${dto.value} (module ${dto.module}) not found in config during delete`\n );\n }\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n }\n\n\n}"]}
1
+ {"version":3,"file":"list-of-values-metadata.service.js","sourceRoot":"","sources":["../../src/services/list-of-values-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { ConfigService } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\n\n\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\n\nimport { ListOfValues } from 'src/entities/list-of-values.entity';\nimport { ListOfValuesMapper } from 'src/mappers/list-of-values-mapper';\n\n\n\n@Injectable()\nexport class ListOfValuesMetadataService extends CRUDService<ListOfValues> {\n private readonly logger = new Logger(this.constructor.name);\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n readonly listOfValuesMapper: ListOfValuesMapper,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(ListOfValues, 'default')\n readonly repo: Repository<ListOfValues>,\n readonly moduleRef: ModuleRef,\n readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'listOfValues', 'solid-core', moduleRef);\n }\n\n async saveListofValuesToConfig(entity: ListOfValues) {\n if (!entity) {\n this.logger.debug('No entity found in the ListofValuesSubscriber saveListofvalueToConfig method');\n return;\n }\n\n // Validate list of value details\n const listofvalue = entity as ListOfValues;\n const moduleMetadata = entity.module;\n if (!moduleMetadata) {\n throw new Error(`Module metadata not found for listofvalue id ${entity.id}`);\n }\n\n // Get config file details\n const { filePath, metaData } = await this.getConfigFileDetails(moduleMetadata.name); // sting expected module name\n if (!filePath || !metaData) {\n throw new Error(`Configuration details not found for module: ${moduleMetadata.name}`);\n }\n\n // Write the listofvalue to the config file\n await this.writeToConfig(metaData, listofvalue, filePath);\n }\n\n async updateListofValuesToConfig(oldentity: ListOfValues, entity: ListOfValues) {\n if (!entity) {\n this.logger.debug('No entity found in the ListofValuesSubscriber saveListofvalueToConfig method');\n return;\n }\n\n // Validate list of value details\n const oldlistofvalue = oldentity as ListOfValues;\n const listofvalue = entity as ListOfValues;\n const moduleMetadata = entity.module;\n if (!moduleMetadata) {\n throw new Error(`Module metadata not found for listofvalue id ${entity.id}`);\n }\n\n // Get config file details\n const { filePath, metaData } = await this.getConfigFileDetails(moduleMetadata.name); // sting expected module name\n if (!filePath || !metaData) {\n throw new Error(`Configuration details not found for module: ${moduleMetadata.name}`);\n }\n\n // Write the listofvalue to the config file\n await this.updateToConfig(metaData, oldlistofvalue, listofvalue, filePath);\n }\n\n async deleteListOfValuesFromConfig(entity: ListOfValues) {\n if (!entity) {\n this.logger.debug('No entity found in the ListofValuesSubscriber saveListofvalueToConfig method');\n return;\n }\n\n // Validate list of value details\n const listofvalue = entity as ListOfValues;\n const moduleMetadata = entity.module;\n if (!moduleMetadata) {\n throw new Error(`Module metadata not found for listofvalue id ${entity.id}`);\n }\n\n // Get config file details\n const { filePath, metaData } = await this.getConfigFileDetails(moduleMetadata.name); // sting expected module name\n if (!filePath || !metaData) {\n throw new Error(`Configuration details not found for module: ${moduleMetadata.name}`);\n }\n\n // delete the listofvalue to the config file\n await this.deleteFromConfig(metaData, listofvalue, filePath);\n }\n\n private async getConfigFileDetails(moduleName: string): Promise<{ filePath: string; metaData: any }> {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);\n try {\n await fs.access(filePath);\n } catch (error) {\n throw new Error(`Configuration file not found for module: ${moduleName}`);\n }\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n return { filePath, metaData };\n }\n\n private async writeToConfig(metaData: any, listofvalues: ListOfValues, filePath: string) {\n const dto = await this.listOfValuesMapper.toDto(listofvalues);\n\n if (!Array.isArray(metaData.listOfValues)) {\n metaData.listOfValues = [];\n }\n\n // Match by type + value + module\n const existingIndex = metaData.listOfValues.findIndex(\n (item: { type: string; value: string; module: number }) =>\n item.type === dto.type &&\n item.value === dto.value &&\n item.module === dto.module\n );\n\n if (existingIndex !== -1) {\n // Replace existing entry\n metaData.listOfValues[existingIndex] = dto;\n } else {\n // Insert new entry\n // metaData.listOfValues.unshift(dto);\n\n if (metaData.listOfValues.length === 0) {\n // Case 1: Empty array → add first item\n metaData.listOfValues.push(dto);\n } else {\n // Case 2: Insert new item right after index 0\n metaData.listOfValues.unshift(dto);\n }\n\n }\n\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n }\n\n private async updateToConfig(metaData: any, oldlistofvalues: ListOfValues, listofvalues: ListOfValues, filePath: string) {\n const newvalue = await this.listOfValuesMapper.toDto(listofvalues);\n const oldvalue = await this.listOfValuesMapper.toDto(oldlistofvalues);\n\n if (!Array.isArray(metaData.listOfValues)) {\n metaData.listOfValues = [];\n }\n\n const searchType = oldvalue.type || newvalue.type;\n const searchValue = oldvalue.value || newvalue.value;\n const searchModule = oldvalue.module || newvalue.module;\n\n const existingIndex = metaData.listOfValues.findIndex(\n (item: { type: string; value: string; module: number }) =>\n item.type === searchType && item.value === searchValue && item.module === searchModule\n );\n if (existingIndex !== -1) {\n // Replace existing match\n metaData.listOfValues[existingIndex] = newvalue;\n }\n\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n }\n\n private async deleteFromConfig(metaData: any, listofvalues: ListOfValues, filePath: string) {\n const dto = await this.listOfValuesMapper.toDto(listofvalues);\n\n if (!Array.isArray(metaData.listOfValues)) {\n metaData.listOfValues = [];\n }\n\n // Match by type + value + module\n const existingIndex = metaData.listOfValues.findIndex(\n (item: { type: string; value: string; module: number }) =>\n item.type === dto.type &&\n item.value === dto.value &&\n item.module === dto.module\n );\n\n if (existingIndex !== -1) {\n // Remove the item\n metaData.listOfValues.splice(existingIndex, 1);\n this.logger.debug(`Deleted LOV ${dto.type}:${dto.value} (module ${dto.module}) from config`);\n } else {\n this.logger.warn(\n `LOV ${dto.type}:${dto.value} (module ${dto.module}) not found in config during delete`\n );\n }\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n }\n\n\n}"]}
@@ -823,8 +823,8 @@ let ModelMetadataService = class ModelMetadataService {
823
823
  }
824
824
  let view = await viewRepo.findOne({ where: { name: `${model.singularName}-list-view` } });
825
825
  const actionData = {
826
- displayName: `${model.displayName} List View`,
827
- name: `${model.singularName}-list-view`,
826
+ displayName: `${model.displayName} List Action`,
827
+ name: `${model.singularName}-list-action`,
828
828
  type: "solid",
829
829
  domain: "",
830
830
  context: "",