@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.
Files changed (320) hide show
  1. package/CLAUDE.md +18 -0
  2. package/CURRENT_PROMPT +6 -0
  3. package/dist/commands/refresh-model.command.d.ts +1 -7
  4. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  5. package/dist/commands/refresh-model.command.js +4 -49
  6. package/dist/commands/refresh-model.command.js.map +1 -1
  7. package/dist/commands/refresh-module.command.d.ts +0 -2
  8. package/dist/commands/refresh-module.command.d.ts.map +1 -1
  9. package/dist/commands/refresh-module.command.js +3 -16
  10. package/dist/commands/refresh-module.command.js.map +1 -1
  11. package/dist/commands/test-data.command.d.ts +2 -0
  12. package/dist/commands/test-data.command.d.ts.map +1 -1
  13. package/dist/commands/test-data.command.js +32 -6
  14. package/dist/commands/test-data.command.js.map +1 -1
  15. package/dist/controllers/action-metadata.controller.js +1 -1
  16. package/dist/controllers/action-metadata.controller.js.map +1 -1
  17. package/dist/controllers/chatter-message.controller.d.ts +2 -0
  18. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  19. package/dist/controllers/chatter-message.controller.js +17 -0
  20. package/dist/controllers/chatter-message.controller.js.map +1 -1
  21. package/dist/controllers/facebook-authentication.controller.js +1 -1
  22. package/dist/controllers/facebook-authentication.controller.js.map +1 -1
  23. package/dist/controllers/google-authentication.controller.js +1 -1
  24. package/dist/controllers/google-authentication.controller.js.map +1 -1
  25. package/dist/controllers/gupshup-webhook.controller.d.ts +11 -0
  26. package/dist/controllers/gupshup-webhook.controller.d.ts.map +1 -0
  27. package/dist/controllers/gupshup-webhook.controller.js +87 -0
  28. package/dist/controllers/gupshup-webhook.controller.js.map +1 -0
  29. package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
  30. package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
  31. package/dist/controllers/mcp-audit-log.controller.js +147 -0
  32. package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
  33. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  34. package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
  35. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts +16 -0
  36. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts.map +1 -0
  37. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js +133 -0
  38. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js.map +1 -0
  39. package/dist/controllers/microsoft-authentication.controller.js +1 -1
  40. package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
  41. package/dist/controllers/model-metadata.controller.d.ts +1 -1
  42. package/dist/controllers/model-metadata.controller.js +2 -2
  43. package/dist/controllers/model-metadata.controller.js.map +1 -1
  44. package/dist/controllers/module-metadata.controller.js +1 -1
  45. package/dist/controllers/module-metadata.controller.js.map +1 -1
  46. package/dist/controllers/mq-message-queue.controller.js +1 -1
  47. package/dist/controllers/mq-message-queue.controller.js.map +1 -1
  48. package/dist/controllers/mq-message.controller.js +1 -1
  49. package/dist/controllers/mq-message.controller.js.map +1 -1
  50. package/dist/controllers/view-metadata.controller.js +1 -1
  51. package/dist/controllers/view-metadata.controller.js.map +1 -1
  52. package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
  53. package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
  54. package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
  55. package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
  56. package/dist/dtos/update-chatter-note-message.dto.d.ts +5 -0
  57. package/dist/dtos/update-chatter-note-message.dto.d.ts.map +1 -0
  58. package/dist/dtos/update-chatter-note-message.dto.js +34 -0
  59. package/dist/dtos/update-chatter-note-message.dto.js.map +1 -0
  60. package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
  61. package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
  62. package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
  63. package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
  64. package/dist/dtos/update-user.dto.d.ts +1 -0
  65. package/dist/dtos/update-user.dto.d.ts.map +1 -1
  66. package/dist/dtos/update-user.dto.js +7 -1
  67. package/dist/dtos/update-user.dto.js.map +1 -1
  68. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  69. package/dist/entities/chatter-message-details.entity.js +0 -1
  70. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  71. package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
  72. package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
  73. package/dist/entities/mcp-audit-log.entity.js +90 -0
  74. package/dist/entities/mcp-audit-log.entity.js.map +1 -0
  75. package/dist/entities/user.entity.js +1 -0
  76. package/dist/entities/user.entity.js.map +1 -1
  77. package/dist/factories/whatsapp.factory.d.ts.map +1 -1
  78. package/dist/factories/whatsapp.factory.js +13 -11
  79. package/dist/factories/whatsapp.factory.js.map +1 -1
  80. package/dist/helpers/bootstrap.helper.d.ts +1 -0
  81. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  82. package/dist/helpers/bootstrap.helper.js +8 -3
  83. package/dist/helpers/bootstrap.helper.js.map +1 -1
  84. package/dist/helpers/command.service.d.ts +1 -0
  85. package/dist/helpers/command.service.d.ts.map +1 -1
  86. package/dist/helpers/command.service.js +1 -0
  87. package/dist/helpers/command.service.js.map +1 -1
  88. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  89. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  90. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  91. package/dist/index.d.ts +6 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +6 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/interfaces.d.ts +1 -2
  96. package/dist/interfaces.d.ts.map +1 -1
  97. package/dist/interfaces.js.map +1 -1
  98. package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
  99. package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
  100. package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
  101. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  102. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
  103. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
  104. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
  105. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
  106. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
  107. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
  108. package/dist/listeners/user-registration.listener.d.ts +5 -2
  109. package/dist/listeners/user-registration.listener.d.ts.map +1 -1
  110. package/dist/listeners/user-registration.listener.js +37 -4
  111. package/dist/listeners/user-registration.listener.js.map +1 -1
  112. package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
  113. package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
  114. package/dist/repository/mcp-audit-log.repository.js +34 -0
  115. package/dist/repository/mcp-audit-log.repository.js.map +1 -0
  116. package/dist/repository/security-rule.repository.js.map +1 -1
  117. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  118. package/dist/seeders/module-test-data.service.d.ts +9 -0
  119. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  120. package/dist/seeders/module-test-data.service.js +155 -18
  121. package/dist/seeders/module-test-data.service.js.map +1 -1
  122. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  123. package/dist/seeders/seed-data/solid-core-metadata.json +506 -49
  124. package/dist/services/authentication.service.d.ts +6 -1
  125. package/dist/services/authentication.service.d.ts.map +1 -1
  126. package/dist/services/authentication.service.js +145 -15
  127. package/dist/services/authentication.service.js.map +1 -1
  128. package/dist/services/chatter-message.service.d.ts +13 -4
  129. package/dist/services/chatter-message.service.d.ts.map +1 -1
  130. package/dist/services/chatter-message.service.js +117 -37
  131. package/dist/services/chatter-message.service.js.map +1 -1
  132. package/dist/services/crud.service.js.map +1 -1
  133. package/dist/services/csv.service.js.map +1 -1
  134. package/dist/services/dashboard.service.js.map +1 -1
  135. package/dist/services/database/database-bootstrap.service.js.map +1 -1
  136. package/dist/services/excel.service.js.map +1 -1
  137. package/dist/services/export-transaction.service.js.map +1 -1
  138. package/dist/services/field-metadata.service.js.map +1 -1
  139. package/dist/services/fixtures.service.js.map +1 -1
  140. package/dist/services/import-transaction.service.js.map +1 -1
  141. package/dist/services/list-of-values.service.js.map +1 -1
  142. package/dist/services/mcp-audit-log.service.d.ts +12 -0
  143. package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
  144. package/dist/services/mcp-audit-log.service.js +38 -0
  145. package/dist/services/mcp-audit-log.service.js.map +1 -0
  146. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +1 -0
  147. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  148. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +11 -0
  149. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  150. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +1 -0
  151. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  152. package/dist/services/mediaStorageProviders/file-storage-provider.js +6 -0
  153. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  154. package/dist/services/model-metadata.service.d.ts +4 -1
  155. package/dist/services/model-metadata.service.d.ts.map +1 -1
  156. package/dist/services/model-metadata.service.js +24 -24
  157. package/dist/services/model-metadata.service.js.map +1 -1
  158. package/dist/services/module-metadata.service.d.ts +4 -1
  159. package/dist/services/module-metadata.service.d.ts.map +1 -1
  160. package/dist/services/module-metadata.service.js +19 -2
  161. package/dist/services/module-metadata.service.js.map +1 -1
  162. package/dist/services/queues/database-publisher.service.js +3 -3
  163. package/dist/services/queues/database-publisher.service.js.map +1 -1
  164. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  165. package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
  166. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  167. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  168. package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
  169. package/dist/services/queues/redis-publisher.service.js +4 -1
  170. package/dist/services/queues/redis-publisher.service.js.map +1 -1
  171. package/dist/services/queues/redis-subscriber.service.js.map +1 -1
  172. package/dist/services/role-metadata.service.js.map +1 -1
  173. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  174. package/dist/services/settings/default-settings-provider.service.d.ts +232 -8
  175. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  176. package/dist/services/settings/default-settings-provider.service.js +119 -4
  177. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  178. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  179. package/dist/services/solid-introspect.service.js.map +1 -1
  180. package/dist/services/user-activity-history.service.js.map +1 -1
  181. package/dist/services/user.service.js +1 -1
  182. package/dist/services/user.service.js.map +1 -1
  183. package/dist/services/view-metadata.service.d.ts.map +1 -1
  184. package/dist/services/view-metadata.service.js +17 -2
  185. package/dist/services/view-metadata.service.js.map +1 -1
  186. package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts +11 -0
  187. package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts.map +1 -0
  188. package/dist/services/whatsapp/GupshupOtpWhatsappService.js +127 -0
  189. package/dist/services/whatsapp/GupshupOtpWhatsappService.js.map +1 -0
  190. package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts +17 -0
  191. package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts.map +1 -0
  192. package/dist/services/whatsapp/MetaCloudWhatsappService.js +209 -0
  193. package/dist/services/whatsapp/MetaCloudWhatsappService.js.map +1 -0
  194. package/dist/solid-core.module.d.ts +2 -2
  195. package/dist/solid-core.module.d.ts.map +1 -1
  196. package/dist/solid-core.module.js +22 -6
  197. package/dist/solid-core.module.js.map +1 -1
  198. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  199. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  200. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  201. package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
  202. package/dist/testing/adapters/ui/playwright-adapter.d.ts +1 -0
  203. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  204. package/dist/testing/adapters/ui/playwright-adapter.js +3 -0
  205. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  206. package/dist/testing/core/testing-engine.js.map +1 -1
  207. package/dist/testing/reporter/console-reporter.d.ts +10 -0
  208. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  209. package/dist/testing/reporter/console-reporter.js +21 -0
  210. package/dist/testing/reporter/console-reporter.js.map +1 -1
  211. package/dist/testing/reporter/reporter.types.d.ts +7 -0
  212. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  213. package/dist/testing/reporter/reporter.types.js.map +1 -1
  214. package/dist/testing/reporter/webhook-reporter.js.map +1 -1
  215. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  216. package/dist/testing/runner/run-from-metadata.js +20 -1
  217. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  218. package/dist/testing/steps/ui/index.d.ts.map +1 -1
  219. package/dist/testing/steps/ui/index.js +2 -0
  220. package/dist/testing/steps/ui/index.js.map +1 -1
  221. package/dist/testing/steps/ui/manual.step.d.ts +3 -0
  222. package/dist/testing/steps/ui/manual.step.d.ts.map +1 -0
  223. package/dist/testing/steps/ui/manual.step.js +56 -0
  224. package/dist/testing/steps/ui/manual.step.js.map +1 -0
  225. package/dist/winston.logger.d.ts +5 -0
  226. package/dist/winston.logger.d.ts.map +1 -1
  227. package/dist/winston.logger.js +6 -4
  228. package/dist/winston.logger.js.map +1 -1
  229. package/package.json +8 -8
  230. package/src/commands/refresh-model.command.ts +6 -51
  231. package/src/commands/refresh-module.command.ts +3 -16
  232. package/src/commands/test-data.command.ts +29 -6
  233. package/src/controllers/action-metadata.controller.ts +1 -1
  234. package/src/controllers/chatter-message.controller.ts +12 -0
  235. package/src/controllers/facebook-authentication.controller.ts +1 -1
  236. package/src/controllers/google-authentication.controller.ts +1 -1
  237. package/src/controllers/gupshup-webhook.controller.ts +91 -0
  238. package/src/controllers/mcp-audit-log.controller.ts +70 -0
  239. package/src/controllers/menu-item-metadata.controller.ts +1 -1
  240. package/src/controllers/meta-cloud-whatsapp-webhook.controller.ts +155 -0
  241. package/src/controllers/microsoft-authentication.controller.ts +1 -1
  242. package/src/controllers/model-metadata.controller.ts +1 -1
  243. package/src/controllers/module-metadata.controller.ts +1 -1
  244. package/src/controllers/mq-message-queue.controller.ts +1 -1
  245. package/src/controllers/mq-message.controller.ts +1 -1
  246. package/src/controllers/view-metadata.controller.ts +1 -1
  247. package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
  248. package/src/dtos/update-chatter-note-message.dto.ts +14 -0
  249. package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
  250. package/src/dtos/update-user.dto.ts +4 -0
  251. package/src/entities/chatter-message-details.entity.ts +1 -2
  252. package/src/entities/mcp-audit-log.entity.ts +55 -0
  253. package/src/entities/user.entity.ts +1 -1
  254. package/src/factories/whatsapp.factory.ts +33 -32
  255. package/src/helpers/bootstrap.helper.ts +16 -6
  256. package/src/helpers/command.service.ts +2 -0
  257. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
  258. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
  259. package/src/helpers/field-crud-managers/field-quality-check-fixes.md +208 -0
  260. package/src/helpers/module-metadata-helper.service.ts +1 -1
  261. package/src/index.ts +6 -0
  262. package/src/interfaces.ts +1 -3
  263. package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
  264. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
  265. package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
  266. package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
  267. package/src/listeners/user-registration.listener.ts +49 -6
  268. package/src/repository/mcp-audit-log.repository.ts +17 -0
  269. package/src/repository/security-rule.repository.ts +1 -1
  270. package/src/seeders/module-metadata-seeder.service.ts +4 -4
  271. package/src/seeders/module-test-data.service.ts +186 -17
  272. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  273. package/src/seeders/seed-data/solid-core-metadata.json +506 -49
  274. package/src/services/authentication.service.ts +267 -44
  275. package/src/services/chatter-message.service.ts +140 -40
  276. package/src/services/crud.service.ts +1 -1
  277. package/src/services/csv.service.ts +1 -1
  278. package/src/services/dashboard.service.ts +1 -1
  279. package/src/services/database/database-bootstrap.service.ts +1 -1
  280. package/src/services/excel.service.ts +1 -1
  281. package/src/services/export-transaction.service.ts +2 -2
  282. package/src/services/field-metadata.service.ts +1 -1
  283. package/src/services/fixtures.service.ts +2 -2
  284. package/src/services/import-transaction.service.ts +2 -2
  285. package/src/services/list-of-values.service.ts +1 -1
  286. package/src/services/mcp-audit-log.service.ts +19 -0
  287. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +12 -0
  288. package/src/services/mediaStorageProviders/file-storage-provider.ts +8 -1
  289. package/src/services/model-metadata.service.ts +36 -34
  290. package/src/services/module-metadata.service.ts +19 -7
  291. package/src/services/queues/database-publisher.service.ts +4 -4
  292. package/src/services/queues/database-subscriber.service.ts +1 -1
  293. package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
  294. package/src/services/queues/rabbitmq-subscriber.service.ts +8 -8
  295. package/src/services/queues/redis-publisher.service.ts +7 -4
  296. package/src/services/queues/redis-subscriber.service.ts +4 -4
  297. package/src/services/role-metadata.service.ts +1 -1
  298. package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
  299. package/src/services/settings/default-settings-provider.service.ts +119 -4
  300. package/src/services/sms/TwilioSMSService.ts +2 -2
  301. package/src/services/solid-introspect.service.ts +2 -2
  302. package/src/services/user-activity-history.service.ts +1 -1
  303. package/src/services/user.service.ts +1 -1
  304. package/src/services/view-metadata.service.ts +25 -8
  305. package/src/services/whatsapp/GupshupOtpWhatsappService.ts +174 -0
  306. package/src/services/whatsapp/MetaCloudWhatsappService.ts +253 -0
  307. package/src/solid-core.module.ts +213 -196
  308. package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
  309. package/src/subscribers/security-rule.subscriber.ts +8 -8
  310. package/src/subscribers/view-metadata.subscriber.ts +1 -1
  311. package/src/testing/README.md +55 -2
  312. package/src/testing/adapters/ui/playwright-adapter.ts +4 -0
  313. package/src/testing/core/testing-engine.ts +2 -2
  314. package/src/testing/reporter/console-reporter.ts +27 -0
  315. package/src/testing/reporter/reporter.types.ts +7 -0
  316. package/src/testing/reporter/webhook-reporter.ts +1 -1
  317. package/src/testing/runner/run-from-metadata.ts +19 -1
  318. package/src/testing/steps/ui/index.ts +2 -0
  319. package/src/testing/steps/ui/manual.step.ts +80 -0
  320. 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>| InsertEvent<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
  }
@@ -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
  }
@@ -33,4 +33,11 @@ export interface Reporter {
33
33
  contentType: string;
34
34
  data: Buffer | string;
35
35
  }): void;
36
+ onRunEnd?(args: {
37
+ ok: boolean;
38
+ total: number;
39
+ passed: number;
40
+ failed: number;
41
+ durationMs: number;
42
+ }): void;
36
43
  }
@@ -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
- await engine.runScenario(scenario, ctxBase);
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
+ }
@@ -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 WinstonLoggerConfig = {
10
- level: process.env.LOG_LEVEL || (process.env.ENV === Environment.Production ? 'info' : 'debug'),
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) { }