@solidstarters/solid-core 1.2.140 → 1.2.142

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 (103) hide show
  1. package/dist/dtos/create-ai-interaction.dto.d.ts +1 -0
  2. package/dist/dtos/create-ai-interaction.dto.d.ts.map +1 -1
  3. package/dist/dtos/create-ai-interaction.dto.js +10 -1
  4. package/dist/dtos/create-ai-interaction.dto.js.map +1 -1
  5. package/dist/dtos/update-ai-interaction.dto.d.ts +1 -0
  6. package/dist/dtos/update-ai-interaction.dto.d.ts.map +1 -1
  7. package/dist/dtos/update-ai-interaction.dto.js +7 -1
  8. package/dist/dtos/update-ai-interaction.dto.js.map +1 -1
  9. package/dist/entities/ai-interaction.entity.d.ts +1 -0
  10. package/dist/entities/ai-interaction.entity.d.ts.map +1 -1
  11. package/dist/entities/ai-interaction.entity.js +9 -1
  12. package/dist/entities/ai-interaction.entity.js.map +1 -1
  13. package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts +1 -0
  14. package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts.map +1 -1
  15. package/dist/entities/dashboard-question-sql-dataset-config.entity.js +6 -1
  16. package/dist/entities/dashboard-question-sql-dataset-config.entity.js.map +1 -1
  17. package/dist/entities/dashboard-question.entity.d.ts +1 -0
  18. package/dist/entities/dashboard-question.entity.d.ts.map +1 -1
  19. package/dist/entities/dashboard-question.entity.js +6 -1
  20. package/dist/entities/dashboard-question.entity.js.map +1 -1
  21. package/dist/interfaces.d.ts +2 -2
  22. package/dist/interfaces.d.ts.map +1 -1
  23. package/dist/interfaces.js.map +1 -1
  24. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  25. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +4 -2
  26. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  27. package/dist/mappers/dashboard-mapper.d.ts.map +1 -1
  28. package/dist/mappers/dashboard-mapper.js +2 -0
  29. package/dist/mappers/dashboard-mapper.js.map +1 -1
  30. package/dist/repository/view-metadata.repository.d.ts +9 -0
  31. package/dist/repository/view-metadata.repository.d.ts.map +1 -0
  32. package/dist/repository/view-metadata.repository.js +42 -0
  33. package/dist/repository/view-metadata.repository.js.map +1 -0
  34. package/dist/seeders/module-metadata-seeder.service.d.ts +1 -1
  35. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  36. package/dist/seeders/module-metadata-seeder.service.js +22 -8
  37. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  38. package/dist/seeders/seed-data/solid-core-metadata.json +61 -0
  39. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  40. package/dist/services/ai-interaction.service.js +1 -0
  41. package/dist/services/ai-interaction.service.js.map +1 -1
  42. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts +19 -0
  43. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -0
  44. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +69 -0
  45. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -0
  46. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts +2 -2
  47. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts.map +1 -1
  48. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js +3 -3
  49. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js.map +1 -1
  50. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.d.ts +10 -0
  51. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.d.ts.map +1 -0
  52. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.js +18 -0
  53. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.js.map +1 -0
  54. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts +14 -1
  55. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.d.ts.map +1 -1
  56. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js +81 -5
  57. package/dist/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.js.map +1 -1
  58. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts +12 -0
  59. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.d.ts.map +1 -0
  60. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js +36 -0
  61. package/dist/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.js.map +1 -0
  62. package/dist/services/setting.service.d.ts.map +1 -1
  63. package/dist/services/setting.service.js +14 -2
  64. package/dist/services/setting.service.js.map +1 -1
  65. package/dist/services/user.service.d.ts +2 -0
  66. package/dist/services/user.service.d.ts.map +1 -1
  67. package/dist/services/user.service.js +15 -0
  68. package/dist/services/user.service.js.map +1 -1
  69. package/dist/services/view-metadata.service.d.ts +3 -2
  70. package/dist/services/view-metadata.service.d.ts.map +1 -1
  71. package/dist/services/view-metadata.service.js +2 -3
  72. package/dist/services/view-metadata.service.js.map +1 -1
  73. package/dist/solid-core.module.d.ts.map +1 -1
  74. package/dist/solid-core.module.js +8 -0
  75. package/dist/solid-core.module.js.map +1 -1
  76. package/dist/subscribers/computed-entity-field.subscriber.d.ts +1 -1
  77. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  78. package/dist/subscribers/computed-entity-field.subscriber.js +5 -3
  79. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  80. package/dist/tsconfig.tsbuildinfo +1 -1
  81. package/package.json +1 -1
  82. package/src/dtos/create-ai-interaction.dto.ts +51 -55
  83. package/src/dtos/update-ai-interaction.dto.ts +51 -56
  84. package/src/entities/ai-interaction.entity.ts +29 -34
  85. package/src/entities/dashboard-question-sql-dataset-config.entity.ts +3 -0
  86. package/src/entities/dashboard-question.entity.ts +3 -0
  87. package/src/interfaces.ts +2 -2
  88. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +4 -2
  89. package/src/mappers/dashboard-mapper.ts +2 -1
  90. package/src/repository/view-metadata.repository.ts +31 -0
  91. package/src/seeders/module-metadata-seeder.service.ts +23 -17
  92. package/src/seeders/seed-data/solid-core-metadata.json +61 -0
  93. package/src/services/ai-interaction.service.ts +3 -0
  94. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +68 -0
  95. package/src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts +4 -5
  96. package/src/services/computed-fields/entity/noops-entity-computed-field-provider.service.ts +22 -0
  97. package/src/services/mcp-tool-response-handlers/solid-create-dashboard-mcp-tool-response-handler.service.ts +83 -9
  98. package/src/services/mcp-tool-response-handlers/solid-save-model-layout-mcp-tool-response-handler.service.ts +34 -0
  99. package/src/services/setting.service.ts +14 -2
  100. package/src/services/user.service.ts +22 -0
  101. package/src/services/view-metadata.service.ts +3 -2
  102. package/src/solid-core.module.ts +8 -0
  103. package/src/subscribers/computed-entity-field.subscriber.ts +6 -4
@@ -1 +1 @@
1
- {"version":3,"file":"computed-entity-field.subscriber.js","sourceRoot":"","sources":["../../src/subscribers/computed-entity-field.subscriber.ts"],"names":[],"mappings":"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","sourcesContent":["import { camelize } from \"@angular-devkit/core/src/utils/strings\";\nimport { Injectable, InternalServerErrorException, Logger } from \"@nestjs/common\";\nimport { InjectDataSource } from \"@nestjs/typeorm\";\nimport { ComputedFieldTriggerOperation } from \"src/dtos/create-field-metadata.dto\";\nimport { ComputedFieldMetadata, SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IEntityPreComputeFieldProvider } from \"src/interfaces\";\nimport { ComputedFieldEvaluationPublisher } from \"src/jobs/database/computed-field-evaluation-publisher.service\";\nimport { DataSource, EntitySubscriberInterface, EventSubscriber, InsertEvent, UpdateEvent } from \"typeorm\";\n\n// Create an interface i.e ComputedFieldEvaluationPayload which has same fields as the ComputedFieldMetadata and an additional field for the database entity\nexport interface ComputedFieldEvaluationPayload extends ComputedFieldMetadata {\n databaseEntity: any;\n}\n\n@Injectable()\n@EventSubscriber()\nexport class ComputedEntityFieldSubscriber implements EntitySubscriberInterface {\n private readonly logger = new Logger(this.constructor.name);\n constructor(\n @InjectDataSource()\n private readonly dataSource: DataSource,\n private readonly solidRegistry: SolidRegistry,\n private readonly computedFieldPublisher: ComputedFieldEvaluationPublisher,\n ) {\n this.dataSource.subscribers.push(this);\n }\n\n async beforeInsert(event: InsertEvent<any>): Promise<any> {\n await this.handleComputedFieldEvaluation(event.entity, ComputedFieldTriggerOperation.beforeInsert);\n }\n\n async beforeUpdate(event: UpdateEvent<any>): Promise<any> {\n await this.handleComputedFieldEvaluation(event.databaseEntity, ComputedFieldTriggerOperation.beforeUpdate);\n }\n\n afterInsert(event: InsertEvent<any>) {\n this.handleComputedFieldEvaluationJob(event.entity, ComputedFieldTriggerOperation.afterInsert);\n }\n\n afterUpdate(event: UpdateEvent<any>) {\n this.handleComputedFieldEvaluationJob(event.databaseEntity, ComputedFieldTriggerOperation.afterUpdate);\n }\n\n afterRemove(event: any) {\n this.handleComputedFieldEvaluationJob(event.databaseEntity, ComputedFieldTriggerOperation.afterRemove);\n }\n\n //FIXME: Need to add support for beforeRemove, beforeSoftRemove, afterSoftRemove, beforeRecover, afterRecover\n\n private async handleComputedFieldEvaluation(entity: any, currentOperation: ComputedFieldTriggerOperation): Promise<void> {\n if (!entity) {\n return;\n }\n const computedFieldsTobeEvaluated = this.getComputedFieldsForEvaluation(\n this.solidRegistry.getComputedFieldMetadata(),\n currentOperation,\n camelize(entity.constructor.name)\n );\n //TODO: We can add a feature i.e dependsOn, where we can check if the computed field depends on other computed fields and evaluate them first\n await Promise.all(\n computedFieldsTobeEvaluated.map(c => this.evaluateComputedField(c, entity))\n )\n }\n\n private handleComputedFieldEvaluationJob(entity: any, currentOperation: ComputedFieldTriggerOperation) {\n if (!entity) {\n return;\n }\n const computedFieldsTobeEvaluated = this.getComputedFieldsForEvaluation(\n this.solidRegistry.getComputedFieldMetadata(),\n currentOperation,\n camelize(entity.constructor.name)\n );\n //TODO: We can add a feature i.e dependsOn, where we can check if the computed field depends on other computed fields and evaluate them first\n for (const computedField of computedFieldsTobeEvaluated) {\n this.enqueueComputedFieldEvaluationJob(computedField, entity);\n }\n }\n\n // Based on the current model name and current operation, identify all the computed providers that need to be evaluated\n // Pass the database entity and the context to the provider of type IEntityComputedFieldProvider\n private getComputedFieldsForEvaluation(computedFieldMetadata: ComputedFieldMetadata[] = [], currentOperation: ComputedFieldTriggerOperation, currentModelName: string) {\n return computedFieldMetadata.filter(\n (computedField) => computedField.computedFieldTriggerConfig.some(\n (trigger) => trigger.operations.includes(currentOperation) &&\n trigger.modelName === currentModelName\n )\n );\n }\n\n private async evaluateComputedField(computedFieldMetadata: ComputedFieldMetadata<any>, entity: any) {\n const computedValue = await this.getComputedValue(computedFieldMetadata, entity);\n entity[computedFieldMetadata.fieldName] = computedValue; // Set the computed value on the entity\n }\n\n private async getComputedValue(computedFieldMetadata: ComputedFieldMetadata<any>, entity: any) {\n try {\n const provider = this.solidRegistry.getComputedFieldProvider(computedFieldMetadata.computedFieldValueProviderName);\n // Get the instance of the provider and assert it is of type IEntityComputedFieldProvider\n const providerInstance = provider.instance as IEntityPreComputeFieldProvider<any, any, any>; // IEntityComputedFieldProvider\n const computedValue = await providerInstance.preComputeValue(entity, computedFieldMetadata); //FIXME There should some way to check/assert if the provider actually has a postComputeAndSaveValue\n return computedValue;\n } catch (error) {\n throw new InternalServerErrorException(`Error evaluating computed field ${computedFieldMetadata.fieldName} for model ${computedFieldMetadata.modelName} for triggered entity ${entity.constructor.name}: ${error.message}`);\n }\n }\n\n private enqueueComputedFieldEvaluationJob(computedField: ComputedFieldMetadata<any>, databaseEntity: any) {\n const payload = {\n ...computedField,\n databaseEntity,\n };\n this.computedFieldPublisher.publish({\n payload\n });\n }\n\n}"]}
1
+ {"version":3,"file":"computed-entity-field.subscriber.js","sourceRoot":"","sources":["../../src/subscribers/computed-entity-field.subscriber.ts"],"names":[],"mappings":"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","sourcesContent":["import { camelize } from \"@angular-devkit/core/src/utils/strings\";\nimport { Injectable, InternalServerErrorException, Logger } from \"@nestjs/common\";\nimport { InjectDataSource } from \"@nestjs/typeorm\";\nimport { ComputedFieldTriggerOperation } from \"src/dtos/create-field-metadata.dto\";\nimport { ComputedFieldMetadata, SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IEntityPreComputeFieldProvider } from \"src/interfaces\";\nimport { ComputedFieldEvaluationPublisher } from \"src/jobs/database/computed-field-evaluation-publisher.service\";\nimport { DataSource, EntitySubscriberInterface, EventSubscriber, InsertEvent, UpdateEvent } from \"typeorm\";\n\n// Create an interface i.e ComputedFieldEvaluationPayload which has same fields as the ComputedFieldMetadata and an additional field for the database entity\nexport interface ComputedFieldEvaluationPayload extends ComputedFieldMetadata {\n databaseEntity: any;\n}\n\n@Injectable()\n@EventSubscriber()\nexport class ComputedEntityFieldSubscriber implements EntitySubscriberInterface {\n private readonly logger = new Logger(this.constructor.name);\n constructor(\n @InjectDataSource()\n private readonly dataSource: DataSource,\n private readonly solidRegistry: SolidRegistry,\n private readonly computedFieldPublisher: ComputedFieldEvaluationPublisher,\n ) {\n this.dataSource.subscribers.push(this);\n }\n\n async beforeInsert(event: InsertEvent<any>): Promise<any> {\n await this.handleComputedFieldEvaluation(event.entity, ComputedFieldTriggerOperation.beforeInsert);\n }\n\n async beforeUpdate(event: UpdateEvent<any>): Promise<any> {\n await this.handleComputedFieldEvaluation(event.databaseEntity, ComputedFieldTriggerOperation.beforeUpdate);\n }\n\n afterInsert(event: InsertEvent<any>) {\n this.handleComputedFieldEvaluationJob(event.entity, ComputedFieldTriggerOperation.afterInsert);\n }\n\n afterUpdate(event: UpdateEvent<any>) {\n this.handleComputedFieldEvaluationJob(event.databaseEntity, ComputedFieldTriggerOperation.afterUpdate);\n }\n\n afterRemove(event: any) {\n this.handleComputedFieldEvaluationJob(event.databaseEntity, ComputedFieldTriggerOperation.afterRemove);\n }\n\n //FIXME: Need to add support for beforeRemove, beforeSoftRemove, afterSoftRemove, beforeRecover, afterRecover\n\n private async handleComputedFieldEvaluation(entity: any, currentOperation: ComputedFieldTriggerOperation): Promise<void> {\n if (!entity) {\n return;\n }\n const computedFieldsTobeEvaluated = this.getComputedFieldsForEvaluation(\n this.solidRegistry.getComputedFieldMetadata(),\n currentOperation,\n camelize(entity.constructor.name)\n );\n //TODO: We can add a feature i.e dependsOn, where we can check if the computed field depends on other computed fields and evaluate them first\n await Promise.all(\n computedFieldsTobeEvaluated.map(c => this.evaluateComputedField(c, entity))\n )\n }\n\n private handleComputedFieldEvaluationJob(entity: any, currentOperation: ComputedFieldTriggerOperation) {\n if (!entity) {\n return;\n }\n const computedFieldsTobeEvaluated = this.getComputedFieldsForEvaluation(\n this.solidRegistry.getComputedFieldMetadata(),\n currentOperation,\n camelize(entity.constructor.name)\n );\n //TODO: We can add a feature i.e dependsOn, where we can check if the computed field depends on other computed fields and evaluate them first\n for (const computedField of computedFieldsTobeEvaluated) {\n this.enqueueComputedFieldEvaluationJob(computedField, entity);\n }\n }\n\n // Based on the current model name and current operation, identify all the computed providers that need to be evaluated\n // Pass the database entity and the context to the provider of type IEntityComputedFieldProvider\n private getComputedFieldsForEvaluation(computedFieldMetadata: ComputedFieldMetadata[] = [], currentOperation: ComputedFieldTriggerOperation, currentModelName: string) {\n return computedFieldMetadata.filter(\n (computedField) => computedField.computedFieldTriggerConfig.some(\n (trigger) => trigger.operations.includes(currentOperation) &&\n trigger.modelName === currentModelName\n )\n );\n }\n\n private async evaluateComputedField(computedFieldMetadata: ComputedFieldMetadata<any>, entity: any) {\n const computedValue = await this.preComputeValue(computedFieldMetadata, entity);\n if (computedValue) {\n entity[computedFieldMetadata.fieldName] = computedValue; //TODO: This line here is just for backward compatibility, once the pre compute interface is change to return void, we will get rid of it.\n }\n }\n\n private async preComputeValue(computedFieldMetadata: ComputedFieldMetadata<any>, entity: any) {\n try {\n const provider = this.solidRegistry.getComputedFieldProvider(computedFieldMetadata.computedFieldValueProviderName);\n // Get the instance of the provider and assert it is of type IEntityComputedFieldProvider\n const providerInstance = provider.instance as IEntityPreComputeFieldProvider<any, any, any>; // IEntityComputedFieldProvider\n const computedValue = await providerInstance.preComputeValue(entity, computedFieldMetadata); //FIXME There should some way to check/assert if the provider actually has a postComputeAndSaveValue\n return computedValue; //TODO: This line here is just for backward compatibility, once the pre compute interface is change to return void, we will get rid of it.\n } catch (error) {\n throw new InternalServerErrorException(`Error evaluating computed field ${computedFieldMetadata.fieldName} for model ${computedFieldMetadata.modelName} for triggered entity ${entity.constructor.name}: ${error.message}`);\n }\n }\n\n private enqueueComputedFieldEvaluationJob(computedField: ComputedFieldMetadata<any>, databaseEntity: any) {\n const payload = {\n ...computedField,\n databaseEntity,\n };\n this.computedFieldPublisher.publish({\n payload\n });\n }\n\n}"]}