@solidxai/core 0.1.10-beta.2 → 0.1.10-beta.22
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/CLAUDE.md +18 -0
- package/CURRENT_PROMPT +6 -0
- package/dist/commands/refresh-model.command.d.ts +1 -7
- package/dist/commands/refresh-model.command.d.ts.map +1 -1
- package/dist/commands/refresh-model.command.js +4 -49
- package/dist/commands/refresh-model.command.js.map +1 -1
- package/dist/commands/refresh-module.command.d.ts +0 -2
- package/dist/commands/refresh-module.command.d.ts.map +1 -1
- package/dist/commands/refresh-module.command.js +3 -16
- package/dist/commands/refresh-module.command.js.map +1 -1
- package/dist/commands/test-data.command.d.ts +2 -0
- package/dist/commands/test-data.command.d.ts.map +1 -1
- package/dist/commands/test-data.command.js +32 -6
- package/dist/commands/test-data.command.js.map +1 -1
- package/dist/controllers/action-metadata.controller.js +1 -1
- package/dist/controllers/action-metadata.controller.js.map +1 -1
- package/dist/controllers/chatter-message.controller.d.ts +2 -0
- package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message.controller.js +17 -0
- package/dist/controllers/chatter-message.controller.js.map +1 -1
- package/dist/controllers/facebook-authentication.controller.js +1 -1
- package/dist/controllers/facebook-authentication.controller.js.map +1 -1
- package/dist/controllers/google-authentication.controller.js +1 -1
- package/dist/controllers/google-authentication.controller.js.map +1 -1
- package/dist/controllers/gupshup-webhook.controller.d.ts +11 -0
- package/dist/controllers/gupshup-webhook.controller.d.ts.map +1 -0
- package/dist/controllers/gupshup-webhook.controller.js +87 -0
- package/dist/controllers/gupshup-webhook.controller.js.map +1 -0
- package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
- package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
- package/dist/controllers/mcp-audit-log.controller.js +147 -0
- package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
- package/dist/controllers/menu-item-metadata.controller.js +1 -1
- package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts +16 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts.map +1 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js +133 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js.map +1 -0
- package/dist/controllers/microsoft-authentication.controller.js +1 -1
- package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
- package/dist/controllers/model-metadata.controller.d.ts +1 -1
- package/dist/controllers/model-metadata.controller.js +2 -2
- package/dist/controllers/model-metadata.controller.js.map +1 -1
- package/dist/controllers/module-metadata.controller.js +1 -1
- package/dist/controllers/module-metadata.controller.js.map +1 -1
- package/dist/controllers/mq-message-queue.controller.js +1 -1
- package/dist/controllers/mq-message-queue.controller.js.map +1 -1
- package/dist/controllers/mq-message.controller.js +1 -1
- package/dist/controllers/mq-message.controller.js.map +1 -1
- package/dist/controllers/view-metadata.controller.js +1 -1
- package/dist/controllers/view-metadata.controller.js.map +1 -1
- package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
- package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
- package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
- package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
- package/dist/dtos/update-chatter-note-message.dto.d.ts +5 -0
- package/dist/dtos/update-chatter-note-message.dto.d.ts.map +1 -0
- package/dist/dtos/update-chatter-note-message.dto.js +34 -0
- package/dist/dtos/update-chatter-note-message.dto.js.map +1 -0
- package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
- package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
- package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
- package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
- package/dist/dtos/update-user.dto.d.ts +1 -0
- package/dist/dtos/update-user.dto.d.ts.map +1 -1
- package/dist/dtos/update-user.dto.js +7 -1
- package/dist/dtos/update-user.dto.js.map +1 -1
- package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
- package/dist/entities/chatter-message-details.entity.js +0 -1
- package/dist/entities/chatter-message-details.entity.js.map +1 -1
- package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
- package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
- package/dist/entities/mcp-audit-log.entity.js +90 -0
- package/dist/entities/mcp-audit-log.entity.js.map +1 -0
- package/dist/entities/user.entity.js +1 -0
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/factories/whatsapp.factory.d.ts.map +1 -1
- package/dist/factories/whatsapp.factory.js +13 -11
- package/dist/factories/whatsapp.factory.js.map +1 -1
- package/dist/helpers/bootstrap.helper.d.ts +1 -0
- package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
- package/dist/helpers/bootstrap.helper.js +8 -3
- package/dist/helpers/bootstrap.helper.js.map +1 -1
- package/dist/helpers/command.service.d.ts +1 -0
- package/dist/helpers/command.service.d.ts.map +1 -1
- package/dist/helpers/command.service.js +1 -0
- package/dist/helpers/command.service.js.map +1 -1
- package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +1 -2
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
- package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
- package/dist/listeners/user-registration.listener.d.ts +5 -2
- package/dist/listeners/user-registration.listener.d.ts.map +1 -1
- package/dist/listeners/user-registration.listener.js +37 -4
- package/dist/listeners/user-registration.listener.js.map +1 -1
- package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
- package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
- package/dist/repository/mcp-audit-log.repository.js +34 -0
- package/dist/repository/mcp-audit-log.repository.js.map +1 -0
- package/dist/repository/security-rule.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/module-test-data.service.d.ts +9 -0
- package/dist/seeders/module-test-data.service.d.ts.map +1 -1
- package/dist/seeders/module-test-data.service.js +155 -18
- package/dist/seeders/module-test-data.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +506 -49
- package/dist/services/authentication.service.d.ts +6 -1
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +145 -15
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +13 -4
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +117 -37
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/csv.service.js.map +1 -1
- package/dist/services/dashboard.service.js.map +1 -1
- package/dist/services/database/database-bootstrap.service.js.map +1 -1
- package/dist/services/excel.service.js.map +1 -1
- package/dist/services/export-transaction.service.js.map +1 -1
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/fixtures.service.js.map +1 -1
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/list-of-values.service.js.map +1 -1
- package/dist/services/mcp-audit-log.service.d.ts +12 -0
- package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
- package/dist/services/mcp-audit-log.service.js +38 -0
- package/dist/services/mcp-audit-log.service.js.map +1 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +1 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +11 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +1 -0
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +6 -0
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +4 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +24 -24
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts +4 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +19 -2
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/queues/database-publisher.service.js +3 -3
- package/dist/services/queues/database-publisher.service.js.map +1 -1
- package/dist/services/queues/database-subscriber.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
- package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
- package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
- package/dist/services/queues/redis-publisher.service.js +4 -1
- package/dist/services/queues/redis-publisher.service.js.map +1 -1
- package/dist/services/queues/redis-subscriber.service.js.map +1 -1
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +232 -8
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +119 -4
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/services/sms/TwilioSMSService.js.map +1 -1
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/user-activity-history.service.js.map +1 -1
- package/dist/services/user.service.js +1 -1
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +17 -2
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts +11 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts.map +1 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.js +127 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.js.map +1 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts +17 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts.map +1 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.js +209 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.js.map +1 -0
- package/dist/solid-core.module.d.ts +2 -2
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +22 -6
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
- package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
- package/dist/subscribers/security-rule.subscriber.js.map +1 -1
- package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
- package/dist/testing/adapters/ui/playwright-adapter.d.ts +1 -0
- package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
- package/dist/testing/adapters/ui/playwright-adapter.js +3 -0
- package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
- package/dist/testing/core/testing-engine.js.map +1 -1
- package/dist/testing/reporter/console-reporter.d.ts +10 -0
- package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
- package/dist/testing/reporter/console-reporter.js +21 -0
- package/dist/testing/reporter/console-reporter.js.map +1 -1
- package/dist/testing/reporter/reporter.types.d.ts +7 -0
- package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
- package/dist/testing/reporter/reporter.types.js.map +1 -1
- package/dist/testing/reporter/webhook-reporter.js.map +1 -1
- package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
- package/dist/testing/runner/run-from-metadata.js +20 -1
- package/dist/testing/runner/run-from-metadata.js.map +1 -1
- package/dist/testing/steps/ui/index.d.ts.map +1 -1
- package/dist/testing/steps/ui/index.js +2 -0
- package/dist/testing/steps/ui/index.js.map +1 -1
- package/dist/testing/steps/ui/manual.step.d.ts +3 -0
- package/dist/testing/steps/ui/manual.step.d.ts.map +1 -0
- package/dist/testing/steps/ui/manual.step.js +56 -0
- package/dist/testing/steps/ui/manual.step.js.map +1 -0
- package/dist/winston.logger.d.ts +5 -0
- package/dist/winston.logger.d.ts.map +1 -1
- package/dist/winston.logger.js +6 -4
- package/dist/winston.logger.js.map +1 -1
- package/package.json +8 -8
- package/src/commands/refresh-model.command.ts +6 -51
- package/src/commands/refresh-module.command.ts +3 -16
- package/src/commands/test-data.command.ts +29 -6
- package/src/controllers/action-metadata.controller.ts +1 -1
- package/src/controllers/chatter-message.controller.ts +12 -0
- package/src/controllers/facebook-authentication.controller.ts +1 -1
- package/src/controllers/google-authentication.controller.ts +1 -1
- package/src/controllers/gupshup-webhook.controller.ts +91 -0
- package/src/controllers/mcp-audit-log.controller.ts +70 -0
- package/src/controllers/menu-item-metadata.controller.ts +1 -1
- package/src/controllers/meta-cloud-whatsapp-webhook.controller.ts +155 -0
- package/src/controllers/microsoft-authentication.controller.ts +1 -1
- package/src/controllers/model-metadata.controller.ts +1 -1
- package/src/controllers/module-metadata.controller.ts +1 -1
- package/src/controllers/mq-message-queue.controller.ts +1 -1
- package/src/controllers/mq-message.controller.ts +1 -1
- package/src/controllers/view-metadata.controller.ts +1 -1
- package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
- package/src/dtos/update-chatter-note-message.dto.ts +14 -0
- package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
- package/src/dtos/update-user.dto.ts +4 -0
- package/src/entities/chatter-message-details.entity.ts +1 -2
- package/src/entities/mcp-audit-log.entity.ts +55 -0
- package/src/entities/user.entity.ts +1 -1
- package/src/factories/whatsapp.factory.ts +33 -32
- package/src/helpers/bootstrap.helper.ts +16 -6
- package/src/helpers/command.service.ts +2 -0
- package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/field-quality-check-fixes.md +208 -0
- package/src/helpers/module-metadata-helper.service.ts +1 -1
- package/src/index.ts +6 -0
- package/src/interfaces.ts +1 -3
- package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
- package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
- package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
- package/src/listeners/user-registration.listener.ts +49 -6
- package/src/repository/mcp-audit-log.repository.ts +17 -0
- package/src/repository/security-rule.repository.ts +1 -1
- package/src/seeders/module-metadata-seeder.service.ts +4 -4
- package/src/seeders/module-test-data.service.ts +186 -17
- package/src/seeders/permission-metadata-seeder.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +506 -49
- package/src/services/authentication.service.ts +267 -44
- package/src/services/chatter-message.service.ts +140 -40
- package/src/services/crud.service.ts +1 -1
- package/src/services/csv.service.ts +1 -1
- package/src/services/dashboard.service.ts +1 -1
- package/src/services/database/database-bootstrap.service.ts +1 -1
- package/src/services/excel.service.ts +1 -1
- package/src/services/export-transaction.service.ts +2 -2
- package/src/services/field-metadata.service.ts +1 -1
- package/src/services/fixtures.service.ts +2 -2
- package/src/services/import-transaction.service.ts +2 -2
- package/src/services/list-of-values.service.ts +1 -1
- package/src/services/mcp-audit-log.service.ts +19 -0
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +12 -0
- package/src/services/mediaStorageProviders/file-storage-provider.ts +8 -1
- package/src/services/model-metadata.service.ts +36 -34
- package/src/services/module-metadata.service.ts +19 -7
- package/src/services/queues/database-publisher.service.ts +4 -4
- package/src/services/queues/database-subscriber.service.ts +1 -1
- package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
- package/src/services/queues/rabbitmq-subscriber.service.ts +8 -8
- package/src/services/queues/redis-publisher.service.ts +7 -4
- package/src/services/queues/redis-subscriber.service.ts +4 -4
- package/src/services/role-metadata.service.ts +1 -1
- package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
- package/src/services/settings/default-settings-provider.service.ts +119 -4
- package/src/services/sms/TwilioSMSService.ts +2 -2
- package/src/services/solid-introspect.service.ts +2 -2
- package/src/services/user-activity-history.service.ts +1 -1
- package/src/services/user.service.ts +1 -1
- package/src/services/view-metadata.service.ts +25 -8
- package/src/services/whatsapp/GupshupOtpWhatsappService.ts +174 -0
- package/src/services/whatsapp/MetaCloudWhatsappService.ts +253 -0
- package/src/solid-core.module.ts +213 -196
- package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
- package/src/subscribers/security-rule.subscriber.ts +8 -8
- package/src/subscribers/view-metadata.subscriber.ts +1 -1
- package/src/testing/README.md +55 -2
- package/src/testing/adapters/ui/playwright-adapter.ts +4 -0
- package/src/testing/core/testing-engine.ts +2 -2
- package/src/testing/reporter/console-reporter.ts +27 -0
- package/src/testing/reporter/reporter.types.ts +7 -0
- package/src/testing/reporter/webhook-reporter.ts +1 -1
- package/src/testing/runner/run-from-metadata.ts +19 -1
- package/src/testing/steps/ui/index.ts +2 -0
- package/src/testing/steps/ui/manual.step.ts +80 -0
- package/src/winston.logger.ts +5 -7
|
@@ -27,19 +27,19 @@ export class SecurityRuleSubscriber implements EntitySubscriberInterface<Securit
|
|
|
27
27
|
async afterInsert(event: InsertEvent<SecurityRule>) {
|
|
28
28
|
await this.saveSecurityRules(event);
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
async afterUpdate(event: UpdateEvent<SecurityRule>) {
|
|
32
32
|
await this.saveSecurityRules(event);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
async saveSecurityRules(event: UpdateEvent<SecurityRule
|
|
35
|
+
async saveSecurityRules(event: UpdateEvent<SecurityRule> | InsertEvent<SecurityRule>) {
|
|
36
36
|
const securityRule = event.entity as SecurityRule;
|
|
37
37
|
const modelMetadata = event.entity.modelMetadata;
|
|
38
38
|
if (!modelMetadata) {
|
|
39
39
|
this.logger.error(`Model metadata not found for security rule with id ${event.entity.id}`);
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
const modelMetadataRepo = this.dataSource.getRepository(ModelMetadata);
|
|
44
44
|
const populatedModelMetadata = await modelMetadataRepo.findOne({
|
|
45
45
|
where: {
|
|
@@ -58,7 +58,7 @@ export class SecurityRuleSubscriber implements EntitySubscriberInterface<Securit
|
|
|
58
58
|
const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(populatedModelMetadata.module.name);
|
|
59
59
|
try {
|
|
60
60
|
await fs.access(filePath);
|
|
61
|
-
} catch (error) {
|
|
61
|
+
} catch (error: any) {
|
|
62
62
|
// FIXME - Should we actually delete the security rule here, if the file is not found?
|
|
63
63
|
this.logger.error(`File not found at path: ${filePath}`);
|
|
64
64
|
return;
|
|
@@ -67,13 +67,13 @@ export class SecurityRuleSubscriber implements EntitySubscriberInterface<Securit
|
|
|
67
67
|
|
|
68
68
|
if (metaData.securityRules) {
|
|
69
69
|
const securityRuleIndex = metaData.securityRules?.findIndex((ruleFromFile: { name: string }) => ruleFromFile.name === securityRule.name);
|
|
70
|
-
const {id, roleId, modelMetadataId, ...requiredDto} = await this.securityRuleRepo.toDto(securityRule)
|
|
71
|
-
metaData.securityRules[securityRuleIndex] = {...requiredDto, securityRuleConfig: JSON.parse(securityRule.securityRuleConfig)}
|
|
70
|
+
const { id, roleId, modelMetadataId, ...requiredDto } = await this.securityRuleRepo.toDto(securityRule)
|
|
71
|
+
metaData.securityRules[securityRuleIndex] = { ...requiredDto, securityRuleConfig: JSON.parse(securityRule.securityRuleConfig) }
|
|
72
72
|
}
|
|
73
73
|
else {
|
|
74
74
|
const securityRules = []
|
|
75
|
-
const {id, roleId, modelMetadataId, ...requiredDto} = await this.securityRuleRepo.toDto(securityRule)
|
|
76
|
-
securityRules.push({...requiredDto, securityRuleConfig: JSON.parse(securityRule.securityRuleConfig)})
|
|
75
|
+
const { id, roleId, modelMetadataId, ...requiredDto } = await this.securityRuleRepo.toDto(securityRule)
|
|
76
|
+
securityRules.push({ ...requiredDto, securityRuleConfig: JSON.parse(securityRule.securityRuleConfig) })
|
|
77
77
|
metaData.securityRules = securityRules
|
|
78
78
|
}
|
|
79
79
|
// Write the updated object back to the file
|
|
@@ -43,7 +43,7 @@ export class ViewMetadataSubsciber implements EntitySubscriberInterface<ViewMeta
|
|
|
43
43
|
const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(viewMetadata.model.module.name);
|
|
44
44
|
try {
|
|
45
45
|
await fs.access(filePath);
|
|
46
|
-
} catch (error) {
|
|
46
|
+
} catch (error: any) {
|
|
47
47
|
this.logger.error(`File not found at path: ${filePath}`);
|
|
48
48
|
return;
|
|
49
49
|
}
|
package/src/testing/README.md
CHANGED
|
@@ -15,6 +15,12 @@
|
|
|
15
15
|
{
|
|
16
16
|
"testing": {
|
|
17
17
|
"specs": ["path/to/register-test-specs.js"],
|
|
18
|
+
"roles": [
|
|
19
|
+
{ "name": "Editor", "permissions": ["BookController.*"] }
|
|
20
|
+
],
|
|
21
|
+
"users": [
|
|
22
|
+
{ "username": "testEditor", "email": "testEditor@test.local", "password": "Test@1234", "roles": ["Editor"] }
|
|
23
|
+
],
|
|
18
24
|
"data": [
|
|
19
25
|
{
|
|
20
26
|
"modelUserKey": "stateMaster",
|
|
@@ -227,6 +233,37 @@ Options in `with`:
|
|
|
227
233
|
- `selector` (required)
|
|
228
234
|
- `key` (required)
|
|
229
235
|
|
|
236
|
+
### **Op: `ui.waitForManual`**
|
|
237
|
+
Description: Pauses a headed Playwright run so a human can interact with the live browser, then resumes when Enter is pressed in the terminal.
|
|
238
|
+
|
|
239
|
+
Options in `with`:
|
|
240
|
+
- `message` (optional, defaults to a generic instruction)
|
|
241
|
+
- `prompt` (optional, defaults to `Press Enter to continue...`)
|
|
242
|
+
- `waitForSelector` (optional, waits for a visible selector after resume)
|
|
243
|
+
- `waitForUrlEquals` (optional, waits until the current URL exactly matches)
|
|
244
|
+
- `waitForUrlContains` (optional, waits until the current URL contains a substring)
|
|
245
|
+
- `timeoutMs` (optional, timeout for post-resume waits)
|
|
246
|
+
- `bringToFront` (optional, defaults to `true`)
|
|
247
|
+
|
|
248
|
+
Notes:
|
|
249
|
+
- Requires `--headless false`.
|
|
250
|
+
- Requires an interactive terminal (TTY).
|
|
251
|
+
- Useful for OTP screens or third-party verification challenges that must be completed by a human.
|
|
252
|
+
|
|
253
|
+
Example:
|
|
254
|
+
```json
|
|
255
|
+
{
|
|
256
|
+
"then": {
|
|
257
|
+
"op": "ui.waitForManual",
|
|
258
|
+
"with": {
|
|
259
|
+
"message": "Enter the OTP in the browser, then return here to continue.",
|
|
260
|
+
"waitForSelector": "text=Dashboard",
|
|
261
|
+
"timeoutMs": 30000
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
230
267
|
### **Op: `ui.expectVisible`**
|
|
231
268
|
Description: Waits for an element to be visible.
|
|
232
269
|
|
|
@@ -340,7 +377,6 @@ await runFromMetadata({
|
|
|
340
377
|
When using `solidctl test run`, specs are loaded from `testing.specs` in module metadata.
|
|
341
378
|
Use `--skip-scenario-ids` to exclude scenarios by id (comma-separated).
|
|
342
379
|
Use `--print-api-logs` to print full API request/response details for `api.request` steps.
|
|
343
|
-
Use `--print-api-logs` to print full API request/response details for `api.request` steps.
|
|
344
380
|
|
|
345
381
|
## Run From Metadata
|
|
346
382
|
```ts
|
|
@@ -356,9 +392,26 @@ await runFromMetadata({
|
|
|
356
392
|
});
|
|
357
393
|
```
|
|
358
394
|
|
|
395
|
+
## CLI Workflows
|
|
396
|
+
Full isolated-database workflow:
|
|
397
|
+
1. `npx @solidxai/solidctl@latest test data --setup`
|
|
398
|
+
2. `npx @solidxai/solidctl@latest seed`
|
|
399
|
+
3. `npx @solidxai/solidctl@latest test data --load`
|
|
400
|
+
4. `npx @solidxai/solidctl@latest test run --module <module-name>`
|
|
401
|
+
5. `npx @solidxai/solidctl@latest test data --teardown`
|
|
402
|
+
|
|
403
|
+
Lightweight existing-database workflow:
|
|
404
|
+
1. `npx @solidxai/solidctl@latest test data --load`
|
|
405
|
+
2. `npx @solidxai/solidctl@latest test run --module <module-name> --headless false`
|
|
406
|
+
3. `npx @solidxai/solidctl@latest test data --unlink`
|
|
407
|
+
|
|
408
|
+
`test data --unlink` deletes records declared in `testing.data` in reverse order using each model's actual `userKeyFieldUserKey` value from `testing.data[*].data`. This assumes `testing.data` is authored in dependency order, with parent records appearing before dependent records.
|
|
409
|
+
|
|
410
|
+
For human-assisted OTP or third-party verification flows, use `ui.waitForManual` in a headed run so the browser remains interactive while the scenario is paused.
|
|
411
|
+
|
|
359
412
|
## Add A New Step (SOP)
|
|
360
413
|
1. Create a new `*.step.ts` in the right domain folder.
|
|
361
414
|
2. Implement a `registerXSteps(registry)` function and `registry.register("op.name", handler)`.
|
|
362
415
|
3. Validate required `step.with` fields and throw clear errors.
|
|
363
416
|
4. Use adapters via `ctx.api` / `ctx.ui` and update `ctx.last` when helpful.
|
|
364
|
-
5. Export and register it from the domain `index.ts`.
|
|
417
|
+
5. Export and register it from the domain `index.ts`.
|
|
@@ -18,6 +18,10 @@ export class PlaywrightAdapter {
|
|
|
18
18
|
this.headless = opts?.headless ?? true;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
isHeadless(): boolean {
|
|
22
|
+
return this.headless;
|
|
23
|
+
}
|
|
24
|
+
|
|
21
25
|
async start(): Promise<void> {
|
|
22
26
|
const { chromium } = await import('playwright');
|
|
23
27
|
this.browser = await chromium.launch({ headless: this.headless });
|
|
@@ -57,7 +57,7 @@ export class TestingEngine {
|
|
|
57
57
|
} else {
|
|
58
58
|
await execute();
|
|
59
59
|
}
|
|
60
|
-
} catch (err) {
|
|
60
|
+
} catch (err: any) {
|
|
61
61
|
scenarioError = err;
|
|
62
62
|
} finally {
|
|
63
63
|
const durationMs = Date.now() - scenarioStart;
|
|
@@ -108,7 +108,7 @@ export class TestingEngine {
|
|
|
108
108
|
// console.log(`Step ${resolvedStep.name} attempting to saveAs ${resolvedStep.saveAs}`, JSON.stringify(result));
|
|
109
109
|
ctx.resources.set(resolvedStep.saveAs, result);
|
|
110
110
|
}
|
|
111
|
-
} catch (err) {
|
|
111
|
+
} catch (err: any) {
|
|
112
112
|
stepError = err;
|
|
113
113
|
throw err;
|
|
114
114
|
} finally {
|
|
@@ -146,6 +146,10 @@ function formatStepLabel(step: OpStep): string {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
export class ConsoleReporter implements Reporter {
|
|
149
|
+
private totalScenarios = 0;
|
|
150
|
+
private passedScenarios = 0;
|
|
151
|
+
private failedScenarios = 0;
|
|
152
|
+
|
|
149
153
|
onScenarioStart(scenario: { id: string; name?: string }): void {
|
|
150
154
|
const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;
|
|
151
155
|
console.log(`\n▶ Scenario: ${label}`);
|
|
@@ -157,6 +161,12 @@ export class ConsoleReporter implements Reporter {
|
|
|
157
161
|
): void {
|
|
158
162
|
const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;
|
|
159
163
|
const status = result.ok ? "✔" : "✖";
|
|
164
|
+
this.totalScenarios += 1;
|
|
165
|
+
if (result.ok) {
|
|
166
|
+
this.passedScenarios += 1;
|
|
167
|
+
} else {
|
|
168
|
+
this.failedScenarios += 1;
|
|
169
|
+
}
|
|
160
170
|
console.log(`${status} Scenario: ${label} (${result.durationMs}ms)`);
|
|
161
171
|
}
|
|
162
172
|
|
|
@@ -226,4 +236,21 @@ export class ConsoleReporter implements Reporter {
|
|
|
226
236
|
if (!dataText.length) return;
|
|
227
237
|
console.log(indentLines(dataText, `${STEP_INDENT}${INDENT}${INDENT}`));
|
|
228
238
|
}
|
|
239
|
+
|
|
240
|
+
onRunEnd(args: {
|
|
241
|
+
ok: boolean;
|
|
242
|
+
total: number;
|
|
243
|
+
passed: number;
|
|
244
|
+
failed: number;
|
|
245
|
+
durationMs: number;
|
|
246
|
+
}): void {
|
|
247
|
+
const durationSeconds = (args.durationMs / 1000).toFixed(2);
|
|
248
|
+
const finalStatus = args.ok ? "PASSED" : "FAILED";
|
|
249
|
+
|
|
250
|
+
console.log("\n════════ Test Run Summary ════════");
|
|
251
|
+
console.log(`Result: Test run ${finalStatus}`);
|
|
252
|
+
console.log(`Cases: total=${args.total}, passed=${args.passed}, failed=${args.failed}`);
|
|
253
|
+
console.log(`Duration: ${durationSeconds}s`);
|
|
254
|
+
console.log("══════════════════════════════════");
|
|
255
|
+
}
|
|
229
256
|
}
|
|
@@ -109,7 +109,7 @@ export class WebhookReporter extends ConsoleReporter {
|
|
|
109
109
|
if (!response.ok) {
|
|
110
110
|
console.warn(`[WebhookReporter] Webhook returned ${response.status}`);
|
|
111
111
|
}
|
|
112
|
-
} catch (err) {
|
|
112
|
+
} catch (err: any) {
|
|
113
113
|
console.warn(`[WebhookReporter] Failed to deliver test results: ${err}`);
|
|
114
114
|
}
|
|
115
115
|
}
|
|
@@ -44,6 +44,7 @@ export type RunnerOptions = {
|
|
|
44
44
|
};
|
|
45
45
|
|
|
46
46
|
export async function runFromMetadata(opts: RunnerOptions): Promise<void> {
|
|
47
|
+
const startedAt = Date.now();
|
|
47
48
|
const registry = new StepRegistry();
|
|
48
49
|
registerApiSteps(registry);
|
|
49
50
|
registerUiSteps(registry);
|
|
@@ -71,15 +72,32 @@ export async function runFromMetadata(opts: RunnerOptions): Promise<void> {
|
|
|
71
72
|
const ui = new PlaywrightAdapter(opts.ui);
|
|
72
73
|
const ctxBase = { resources, reporter, api, ui, specRegistry, testData, options: opts.options };
|
|
73
74
|
const uiStarted = { value: false };
|
|
75
|
+
let passed = 0;
|
|
76
|
+
let failed = 0;
|
|
77
|
+
let runError: unknown;
|
|
74
78
|
|
|
75
79
|
try {
|
|
76
80
|
for (const scenario of scenarios) {
|
|
77
81
|
if (scenarioNeedsUi(scenario)) {
|
|
78
82
|
await ensureUiStarted(ctxBase, uiStarted);
|
|
79
83
|
}
|
|
80
|
-
|
|
84
|
+
try {
|
|
85
|
+
await engine.runScenario(scenario, ctxBase);
|
|
86
|
+
passed += 1;
|
|
87
|
+
} catch (error) {
|
|
88
|
+
failed += 1;
|
|
89
|
+
runError = error;
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
81
92
|
}
|
|
82
93
|
} finally {
|
|
94
|
+
reporter.onRunEnd?.({
|
|
95
|
+
ok: !runError,
|
|
96
|
+
total: scenarios.length,
|
|
97
|
+
passed,
|
|
98
|
+
failed,
|
|
99
|
+
durationMs: Date.now() - startedAt,
|
|
100
|
+
});
|
|
83
101
|
if (uiStarted.value) {
|
|
84
102
|
await ui.stop();
|
|
85
103
|
}
|
|
@@ -3,10 +3,12 @@ import { registerNavigationSteps } from "./navigation.step";
|
|
|
3
3
|
import { registerFormSteps } from "./form.step";
|
|
4
4
|
import { registerActionSteps } from "./actions.step";
|
|
5
5
|
import { registerAssertionSteps } from "./assertions.step";
|
|
6
|
+
import { registerManualSteps } from "./manual.step";
|
|
6
7
|
|
|
7
8
|
export function registerUiSteps(registry: StepRegistry): void {
|
|
8
9
|
registerNavigationSteps(registry);
|
|
9
10
|
registerFormSteps(registry);
|
|
10
11
|
registerActionSteps(registry);
|
|
11
12
|
registerAssertionSteps(registry);
|
|
13
|
+
registerManualSteps(registry);
|
|
12
14
|
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
3
|
+
|
|
4
|
+
import type { TestContext } from "../../contracts/runtime-context.types";
|
|
5
|
+
import type { OpStep } from "../../contracts/testing-metadata.types";
|
|
6
|
+
import { StepRegistry } from "../../core/step-registry";
|
|
7
|
+
|
|
8
|
+
type WaitForManualInput = {
|
|
9
|
+
message?: string;
|
|
10
|
+
prompt?: string;
|
|
11
|
+
waitForSelector?: string;
|
|
12
|
+
waitForUrlContains?: string;
|
|
13
|
+
waitForUrlEquals?: string;
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
bringToFront?: boolean;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
function requirePage(ctx: TestContext, op: string) {
|
|
19
|
+
if (!ctx.ui || !ctx.ui.page) {
|
|
20
|
+
throw new Error(`Missing UI page on context for op "${op}"`);
|
|
21
|
+
}
|
|
22
|
+
return ctx.ui.page;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function registerManualSteps(registry: StepRegistry): void {
|
|
26
|
+
registry.register("ui.waitForManual", async (ctx: TestContext, step: OpStep) => {
|
|
27
|
+
const page = requirePage(ctx, "ui.waitForManual");
|
|
28
|
+
const inputConfig = (step.with ?? {}) as WaitForManualInput;
|
|
29
|
+
const message = inputConfig.message?.trim() || "Manual interaction required.";
|
|
30
|
+
const prompt = inputConfig.prompt?.trim() || "Press Enter to continue...";
|
|
31
|
+
const timeoutMs = inputConfig.timeoutMs;
|
|
32
|
+
const bringToFront = inputConfig.bringToFront ?? true;
|
|
33
|
+
|
|
34
|
+
if (ctx.ui?.isHeadless()) {
|
|
35
|
+
throw new Error('Op "ui.waitForManual" requires headed mode. Re-run with --headless false.');
|
|
36
|
+
}
|
|
37
|
+
if (!input.isTTY || !output.isTTY) {
|
|
38
|
+
throw new Error('Op "ui.waitForManual" requires an interactive terminal (TTY).');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (bringToFront) {
|
|
42
|
+
await page.bringToFront();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
console.log("");
|
|
46
|
+
console.log("════════ Manual Interaction Required ════════");
|
|
47
|
+
console.log(message);
|
|
48
|
+
console.log(`Scenario: ${ctx.scenarioId}`);
|
|
49
|
+
console.log(`Current URL: ${page.url()}`);
|
|
50
|
+
console.log(prompt);
|
|
51
|
+
|
|
52
|
+
const rl = createInterface({ input, output });
|
|
53
|
+
try {
|
|
54
|
+
await rl.question("");
|
|
55
|
+
} finally {
|
|
56
|
+
rl.close();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (inputConfig.waitForSelector) {
|
|
60
|
+
await page.waitForSelector(inputConfig.waitForSelector, {
|
|
61
|
+
state: "visible",
|
|
62
|
+
timeout: timeoutMs,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (inputConfig.waitForUrlEquals) {
|
|
67
|
+
await page.waitForURL(
|
|
68
|
+
(url) => url.toString() === inputConfig.waitForUrlEquals,
|
|
69
|
+
{ timeout: timeoutMs },
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (inputConfig.waitForUrlContains) {
|
|
74
|
+
await page.waitForURL(
|
|
75
|
+
(url) => url.toString().includes(String(inputConfig.waitForUrlContains)),
|
|
76
|
+
{ timeout: timeoutMs },
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
package/src/winston.logger.ts
CHANGED
|
@@ -6,8 +6,8 @@ import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
|
|
|
6
6
|
import * as winston from 'winston';
|
|
7
7
|
import { Environment } from './decorators/disallow-in-production.decorator';
|
|
8
8
|
|
|
9
|
-
export const
|
|
10
|
-
level: process.env.LOG_LEVEL || (process.env.ENV === Environment.Production ? '
|
|
9
|
+
export const createWinstonLoggerConfig = () => ({
|
|
10
|
+
level: process.env.LOG_LEVEL || (process.env.ENV === Environment.Production ? 'warn' : 'info'),
|
|
11
11
|
format: winston.format.combine(
|
|
12
12
|
winston.format.timestamp(),
|
|
13
13
|
winston.format.errors({ stack: true }),
|
|
@@ -21,8 +21,6 @@ export const WinstonLoggerConfig = {
|
|
|
21
21
|
transports: [
|
|
22
22
|
new winston.transports.Console({
|
|
23
23
|
format: winston.format.combine(
|
|
24
|
-
// winston.format.colorize(),
|
|
25
|
-
// winston.format.timestamp(),
|
|
26
24
|
winston.format.printf(({ level, message, timestamp }) => {
|
|
27
25
|
return `[${timestamp}] ${level.toUpperCase()}: ${message}`;
|
|
28
26
|
}),
|
|
@@ -30,15 +28,15 @@ export const WinstonLoggerConfig = {
|
|
|
30
28
|
}),
|
|
31
29
|
new winston.transports.File({
|
|
32
30
|
filename: 'logs/application.log',
|
|
33
|
-
// format: winston.format.json(),
|
|
34
31
|
}),
|
|
35
32
|
new winston.transports.File({
|
|
36
33
|
filename: 'logs/error.log',
|
|
37
34
|
level: 'error',
|
|
38
|
-
// format: winston.format.json(),
|
|
39
35
|
}),
|
|
40
36
|
],
|
|
41
|
-
};
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export const WinstonLoggerConfig = createWinstonLoggerConfig();
|
|
42
40
|
|
|
43
41
|
export class WinstonTypeORMLogger implements TypeORMLogger {
|
|
44
42
|
constructor(@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger) { }
|