@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
@@ -139,6 +139,11 @@ function formatStepLabel(step) {
139
139
  return `${base} (${details})`;
140
140
  }
141
141
  class ConsoleReporter {
142
+ constructor() {
143
+ this.totalScenarios = 0;
144
+ this.passedScenarios = 0;
145
+ this.failedScenarios = 0;
146
+ }
142
147
  onScenarioStart(scenario) {
143
148
  const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;
144
149
  console.log(`\n▶ Scenario: ${label}`);
@@ -146,6 +151,13 @@ class ConsoleReporter {
146
151
  onScenarioEnd(scenario, result) {
147
152
  const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;
148
153
  const status = result.ok ? "✔" : "✖";
154
+ this.totalScenarios += 1;
155
+ if (result.ok) {
156
+ this.passedScenarios += 1;
157
+ }
158
+ else {
159
+ this.failedScenarios += 1;
160
+ }
149
161
  console.log(`${status} Scenario: ${label} (${result.durationMs}ms)`);
150
162
  }
151
163
  onStepStart(args) {
@@ -184,6 +196,15 @@ class ConsoleReporter {
184
196
  return;
185
197
  console.log(indentLines(dataText, `${STEP_INDENT}${INDENT}${INDENT}`));
186
198
  }
199
+ onRunEnd(args) {
200
+ const durationSeconds = (args.durationMs / 1000).toFixed(2);
201
+ const finalStatus = args.ok ? "PASSED" : "FAILED";
202
+ console.log("\n════════ Test Run Summary ════════");
203
+ console.log(`Result: Test run ${finalStatus}`);
204
+ console.log(`Cases: total=${args.total}, passed=${args.passed}, failed=${args.failed}`);
205
+ console.log(`Duration: ${durationSeconds}s`);
206
+ console.log("══════════════════════════════════");
207
+ }
187
208
  }
188
209
  exports.ConsoleReporter = ConsoleReporter;
189
210
  //# sourceMappingURL=console-reporter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"console-reporter.js","sourceRoot":"","sources":["../../../src/testing/reporter/console-reporter.ts"],"names":[],"mappings":"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","sourcesContent":["// Purpose: Basic console reporter implementation.\n\nimport type { Reporter } from \"./reporter.types\";\nimport type { OpStep } from \"../contracts/testing-metadata.types\";\n\nconst INDENT = \" \";\nconst STEP_INDENT = INDENT;\nconst MAX_DETAIL_LEN = 140;\n\nfunction formatError(err: unknown): string {\n if (!err) return \"\";\n if (err instanceof Error) {\n return err.stack || err.message;\n }\n return String(err);\n}\n\nfunction indentLines(text: string, indent: string): string {\n return text\n .split(\"\\n\")\n .map((line) => (line.length ? `${indent}${line}` : indent))\n .join(\"\\n\");\n}\n\nfunction truncate(value: string, maxLen: number = MAX_DETAIL_LEN): string {\n if (value.length <= maxLen) return value;\n return `${value.slice(0, maxLen - 1)}…`;\n}\n\nfunction formatHttpBody(body: unknown): string {\n if (body === null || body === undefined) return \"\";\n if (typeof body === \"string\") {\n const trimmed = body.trim();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch {\n return body;\n }\n }\n return body;\n }\n try {\n return JSON.stringify(body, null, 2);\n } catch {\n return String(body);\n }\n}\n\nfunction withoutQuery(url: string): string {\n const idx = url.indexOf(\"?\");\n return idx === -1 ? url : url.slice(0, idx);\n}\n\nfunction maskIfSensitive(value: string, hints: string[]): string {\n const lower = hints.join(\" \").toLowerCase();\n if (lower.includes(\"password\") || lower.includes(\"pwd\")) {\n return \"••••••\";\n }\n return value;\n}\n\nfunction stepDetails(step: OpStep): string | undefined {\n const withObj = (step.with ?? {}) as Record<string, any>;\n\n switch (step.op) {\n case \"api.request\": {\n const method = String(withObj.method ?? \"\").toUpperCase();\n const url = typeof withObj.url === \"string\" ? withoutQuery(withObj.url) : \"\";\n if (!method && !url) return undefined;\n return `${method} ${url}`.trim();\n }\n case \"api.auth.bearerFromLogin\": {\n const url = typeof withObj.url === \"string\" ? withoutQuery(withObj.url) : \"\";\n return url ? `url: ${url}` : undefined;\n }\n case \"ui.goto\": {\n return withObj.url ? `url: ${withObj.url}` : undefined;\n }\n case \"ui.click\":\n case \"ui.expectVisible\": {\n return withObj.selector ? `selector: ${withObj.selector}` : undefined;\n }\n case \"ui.fill\":\n case \"ui.select\": {\n const selector = withObj.selector ? `selector: ${withObj.selector}` : \"\";\n const value =\n withObj.value !== undefined\n ? `value: ${maskIfSensitive(String(withObj.value), [String(withObj.selector ?? \"\"), String(step.op)])}`\n : \"\";\n return [selector, value].filter(Boolean).join(\", \") || undefined;\n }\n case \"ui.press\": {\n const selector = withObj.selector ? `selector: ${withObj.selector}` : \"\";\n const key = withObj.key ? `key: ${withObj.key}` : \"\";\n return [selector, key].filter(Boolean).join(\", \") || undefined;\n }\n case \"ui.expectUrl\": {\n const equals = withObj.equals ? `equals: ${withObj.equals}` : \"\";\n const contains = withObj.contains ? `contains: ${withObj.contains}` : \"\";\n return [equals, contains].filter(Boolean).join(\", \") || undefined;\n }\n case \"ui.expectText\": {\n const selector = withObj.selector ? `selector: ${withObj.selector}` : \"\";\n const equals = withObj.equals ? `equals: ${truncate(String(withObj.equals))}` : \"\";\n const contains = withObj.contains ? `contains: ${truncate(String(withObj.contains))}` : \"\";\n return [selector, equals, contains].filter(Boolean).join(\", \") || undefined;\n }\n case \"assert.httpStatus\": {\n return withObj.is !== undefined ? `status: ${withObj.is}` : undefined;\n }\n case \"assert.jsonPath\": {\n const path = withObj.path ? `path: ${withObj.path}` : \"\";\n const equals = withObj.equals !== undefined ? `equals: ${truncate(String(withObj.equals))}` : \"\";\n return [path, equals].filter(Boolean).join(\", \") || undefined;\n }\n case \"assert.contains\":\n case \"assert.equals\":\n case \"assert.matches\": {\n const expected =\n withObj.expected !== undefined\n ? `expected: ${truncate(String(withObj.expected))}`\n : withObj.pattern\n ? `pattern: ${truncate(String(withObj.pattern))}`\n : withObj.equals !== undefined\n ? `equals: ${truncate(String(withObj.equals))}`\n : \"\";\n return expected || undefined;\n }\n case \"util.sleep\": {\n return withObj.ms !== undefined ? `ms: ${withObj.ms}` : undefined;\n }\n case \"util.log\": {\n return withObj.message ? `message: ${truncate(String(withObj.message))}` : undefined;\n }\n default:\n return undefined;\n }\n}\n\nfunction formatStepLabel(step: OpStep): string {\n const base = step.name ? `${step.op} (${step.name})` : step.op;\n const details = stepDetails(step);\n if (!details) return base;\n return `${base} (${details})`;\n}\n\nexport class ConsoleReporter implements Reporter {\n onScenarioStart(scenario: { id: string; name?: string }): void {\n const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;\n console.log(`\\n▶ Scenario: ${label}`);\n }\n\n onScenarioEnd(\n scenario: { id: string; name?: string },\n result: { ok: boolean; error?: unknown; durationMs: number },\n ): void {\n const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;\n const status = result.ok ? \"✔\" : \"✖\";\n console.log(`${status} Scenario: ${label} (${result.durationMs}ms)`);\n }\n\n onStepStart(args: {\n scenarioId: string;\n phase: string;\n step: OpStep;\n }): void {\n const label = formatStepLabel(args.step);\n const phase = args.phase.toUpperCase();\n console.log(`${STEP_INDENT}↳ ${phase} ${label}`);\n }\n\n onStepEnd(args: {\n scenarioId: string;\n phase: string;\n step: OpStep;\n ok: boolean;\n error?: unknown;\n durationMs: number;\n }): void {\n const label = formatStepLabel(args.step);\n const phase = args.phase.toUpperCase();\n const status = args.ok ? \"✔\" : \"✖\";\n console.log(\n `${STEP_INDENT}${status} ${phase} ${label} (${args.durationMs}ms)`\n );\n if (!args.ok && args.error) {\n const details = formatError(args.error);\n console.error(indentLines(details, `${STEP_INDENT}${INDENT}`));\n const httpBody = (args.error as any)?.httpResponseBody;\n if (httpBody !== undefined) {\n const formatted = formatHttpBody(httpBody);\n const bodyText = formatted.length ? formatted : \"<empty>\";\n console.error(\n indentLines(\n `HTTP Response Body:\\n${bodyText}`,\n `${STEP_INDENT}${INDENT}`,\n ),\n );\n }\n }\n }\n\n onSpecResult(args: {\n scenarioId: string;\n specId: string;\n stepName?: string;\n result: { ok: boolean; details?: Record<string, any> };\n }): void {\n console.log(`${INDENT}↳ SPEC ${args.specId} ok=${args.result.ok}`);\n if (args.result.details) {\n const details = JSON.stringify(args.result.details, null, 2);\n console.log(indentLines(details, `${INDENT}${INDENT}`));\n }\n }\n\n attach(args: {\n scenarioId: string;\n name: string;\n contentType: string;\n data: Buffer | string;\n }): void {\n const header = `ATTACH ${args.name} (${args.contentType})`;\n console.log(indentLines(header, `${STEP_INDENT}${INDENT}`));\n const dataText = Buffer.isBuffer(args.data) ? args.data.toString(\"utf8\") : String(args.data ?? \"\");\n if (!dataText.length) return;\n console.log(indentLines(dataText, `${STEP_INDENT}${INDENT}${INDENT}`));\n }\n}\n"]}
1
+ {"version":3,"file":"console-reporter.js","sourceRoot":"","sources":["../../../src/testing/reporter/console-reporter.ts"],"names":[],"mappings":";;;AAKA,MAAM,MAAM,GAAG,IAAI,CAAC;AACpB,MAAM,WAAW,GAAG,MAAM,CAAC;AAC3B,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,MAAc;IAC/C,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;SAC1D,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,SAAiB,cAAc;IAC9D,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACnC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,KAAe;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAwB,CAAC;IAEzD,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC;QAChB,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1D,MAAM,GAAG,GAAG,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAC;YACtC,OAAO,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;QACD,KAAK,0BAA0B,CAAC,CAAC,CAAC;YAChC,MAAM,GAAG,GAAG,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzC,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzD,CAAC;QACD,KAAK,UAAU,CAAC;QAChB,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,CAAC;QACD,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,KAAK,SAAS;gBACzB,CAAC,CAAC,UAAU,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;gBACvG,CAAC,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QACnE,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QACjE,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QACpE,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QAC9E,CAAC;QACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,OAAO,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,CAAC;QACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QAChE,CAAC;QACD,KAAK,iBAAiB,CAAC;QACvB,KAAK,eAAe,CAAC;QACrB,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ,KAAK,SAAS;gBAC5B,CAAC,CAAC,aAAa,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE;gBACnD,CAAC,CAAC,OAAO,CAAC,OAAO;oBACf,CAAC,CAAC,YAAY,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE;oBACjD,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS;wBAC5B,CAAC,CAAC,WAAW,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE;wBAC/C,CAAC,CAAC,EAAE,CAAC;YACb,OAAO,QAAQ,IAAI,SAAS,CAAC;QAC/B,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,CAAC;QACD;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,GAAG,IAAI,KAAK,OAAO,GAAG,CAAC;AAChC,CAAC;AAED,MAAa,eAAe;IAA5B;QACU,mBAAc,GAAG,CAAC,CAAC;QACnB,oBAAe,GAAG,CAAC,CAAC;QACpB,oBAAe,GAAG,CAAC,CAAC;IAyG9B,CAAC;IAvGC,eAAe,CAAC,QAAuC;QACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,aAAa,CACX,QAAuC,EACvC,MAA4D;QAE5D,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChF,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACrC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;QACzB,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,cAAc,KAAK,KAAK,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC;IACvE,CAAC;IAED,WAAW,CAAC,IAIX;QACC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,KAAK,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,SAAS,CAAC,IAOT;QACC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACnC,OAAO,CAAC,GAAG,CACT,GAAG,WAAW,GAAG,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,UAAU,KAAK,CACnE,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAI,IAAI,CAAC,KAAa,EAAE,gBAAgB,CAAC;YACvD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1D,OAAO,CAAC,KAAK,CACX,WAAW,CACT,wBAAwB,QAAQ,EAAE,EAClC,GAAG,WAAW,GAAG,MAAM,EAAE,CAC1B,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,YAAY,CAAC,IAKZ;QACC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,UAAU,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAKN;QACC,MAAM,MAAM,GAAG,UAAU,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACnG,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO;QAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,QAAQ,CAAC,IAMR;QACC,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAElD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,aAAa,eAAe,GAAG,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;CACF;AA5GD,0CA4GC","sourcesContent":["// Purpose: Basic console reporter implementation.\n\nimport type { Reporter } from \"./reporter.types\";\nimport type { OpStep } from \"../contracts/testing-metadata.types\";\n\nconst INDENT = \" \";\nconst STEP_INDENT = INDENT;\nconst MAX_DETAIL_LEN = 140;\n\nfunction formatError(err: unknown): string {\n if (!err) return \"\";\n if (err instanceof Error) {\n return err.stack || err.message;\n }\n return String(err);\n}\n\nfunction indentLines(text: string, indent: string): string {\n return text\n .split(\"\\n\")\n .map((line) => (line.length ? `${indent}${line}` : indent))\n .join(\"\\n\");\n}\n\nfunction truncate(value: string, maxLen: number = MAX_DETAIL_LEN): string {\n if (value.length <= maxLen) return value;\n return `${value.slice(0, maxLen - 1)}…`;\n}\n\nfunction formatHttpBody(body: unknown): string {\n if (body === null || body === undefined) return \"\";\n if (typeof body === \"string\") {\n const trimmed = body.trim();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch {\n return body;\n }\n }\n return body;\n }\n try {\n return JSON.stringify(body, null, 2);\n } catch {\n return String(body);\n }\n}\n\nfunction withoutQuery(url: string): string {\n const idx = url.indexOf(\"?\");\n return idx === -1 ? url : url.slice(0, idx);\n}\n\nfunction maskIfSensitive(value: string, hints: string[]): string {\n const lower = hints.join(\" \").toLowerCase();\n if (lower.includes(\"password\") || lower.includes(\"pwd\")) {\n return \"••••••\";\n }\n return value;\n}\n\nfunction stepDetails(step: OpStep): string | undefined {\n const withObj = (step.with ?? {}) as Record<string, any>;\n\n switch (step.op) {\n case \"api.request\": {\n const method = String(withObj.method ?? \"\").toUpperCase();\n const url = typeof withObj.url === \"string\" ? withoutQuery(withObj.url) : \"\";\n if (!method && !url) return undefined;\n return `${method} ${url}`.trim();\n }\n case \"api.auth.bearerFromLogin\": {\n const url = typeof withObj.url === \"string\" ? withoutQuery(withObj.url) : \"\";\n return url ? `url: ${url}` : undefined;\n }\n case \"ui.goto\": {\n return withObj.url ? `url: ${withObj.url}` : undefined;\n }\n case \"ui.click\":\n case \"ui.expectVisible\": {\n return withObj.selector ? `selector: ${withObj.selector}` : undefined;\n }\n case \"ui.fill\":\n case \"ui.select\": {\n const selector = withObj.selector ? `selector: ${withObj.selector}` : \"\";\n const value =\n withObj.value !== undefined\n ? `value: ${maskIfSensitive(String(withObj.value), [String(withObj.selector ?? \"\"), String(step.op)])}`\n : \"\";\n return [selector, value].filter(Boolean).join(\", \") || undefined;\n }\n case \"ui.press\": {\n const selector = withObj.selector ? `selector: ${withObj.selector}` : \"\";\n const key = withObj.key ? `key: ${withObj.key}` : \"\";\n return [selector, key].filter(Boolean).join(\", \") || undefined;\n }\n case \"ui.expectUrl\": {\n const equals = withObj.equals ? `equals: ${withObj.equals}` : \"\";\n const contains = withObj.contains ? `contains: ${withObj.contains}` : \"\";\n return [equals, contains].filter(Boolean).join(\", \") || undefined;\n }\n case \"ui.expectText\": {\n const selector = withObj.selector ? `selector: ${withObj.selector}` : \"\";\n const equals = withObj.equals ? `equals: ${truncate(String(withObj.equals))}` : \"\";\n const contains = withObj.contains ? `contains: ${truncate(String(withObj.contains))}` : \"\";\n return [selector, equals, contains].filter(Boolean).join(\", \") || undefined;\n }\n case \"assert.httpStatus\": {\n return withObj.is !== undefined ? `status: ${withObj.is}` : undefined;\n }\n case \"assert.jsonPath\": {\n const path = withObj.path ? `path: ${withObj.path}` : \"\";\n const equals = withObj.equals !== undefined ? `equals: ${truncate(String(withObj.equals))}` : \"\";\n return [path, equals].filter(Boolean).join(\", \") || undefined;\n }\n case \"assert.contains\":\n case \"assert.equals\":\n case \"assert.matches\": {\n const expected =\n withObj.expected !== undefined\n ? `expected: ${truncate(String(withObj.expected))}`\n : withObj.pattern\n ? `pattern: ${truncate(String(withObj.pattern))}`\n : withObj.equals !== undefined\n ? `equals: ${truncate(String(withObj.equals))}`\n : \"\";\n return expected || undefined;\n }\n case \"util.sleep\": {\n return withObj.ms !== undefined ? `ms: ${withObj.ms}` : undefined;\n }\n case \"util.log\": {\n return withObj.message ? `message: ${truncate(String(withObj.message))}` : undefined;\n }\n default:\n return undefined;\n }\n}\n\nfunction formatStepLabel(step: OpStep): string {\n const base = step.name ? `${step.op} (${step.name})` : step.op;\n const details = stepDetails(step);\n if (!details) return base;\n return `${base} (${details})`;\n}\n\nexport class ConsoleReporter implements Reporter {\n private totalScenarios = 0;\n private passedScenarios = 0;\n private failedScenarios = 0;\n\n onScenarioStart(scenario: { id: string; name?: string }): void {\n const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;\n console.log(`\\n▶ Scenario: ${label}`);\n }\n\n onScenarioEnd(\n scenario: { id: string; name?: string },\n result: { ok: boolean; error?: unknown; durationMs: number },\n ): void {\n const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;\n const status = result.ok ? \"✔\" : \"✖\";\n this.totalScenarios += 1;\n if (result.ok) {\n this.passedScenarios += 1;\n } else {\n this.failedScenarios += 1;\n }\n console.log(`${status} Scenario: ${label} (${result.durationMs}ms)`);\n }\n\n onStepStart(args: {\n scenarioId: string;\n phase: string;\n step: OpStep;\n }): void {\n const label = formatStepLabel(args.step);\n const phase = args.phase.toUpperCase();\n console.log(`${STEP_INDENT}↳ ${phase} ${label}`);\n }\n\n onStepEnd(args: {\n scenarioId: string;\n phase: string;\n step: OpStep;\n ok: boolean;\n error?: unknown;\n durationMs: number;\n }): void {\n const label = formatStepLabel(args.step);\n const phase = args.phase.toUpperCase();\n const status = args.ok ? \"✔\" : \"✖\";\n console.log(\n `${STEP_INDENT}${status} ${phase} ${label} (${args.durationMs}ms)`\n );\n if (!args.ok && args.error) {\n const details = formatError(args.error);\n console.error(indentLines(details, `${STEP_INDENT}${INDENT}`));\n const httpBody = (args.error as any)?.httpResponseBody;\n if (httpBody !== undefined) {\n const formatted = formatHttpBody(httpBody);\n const bodyText = formatted.length ? formatted : \"<empty>\";\n console.error(\n indentLines(\n `HTTP Response Body:\\n${bodyText}`,\n `${STEP_INDENT}${INDENT}`,\n ),\n );\n }\n }\n }\n\n onSpecResult(args: {\n scenarioId: string;\n specId: string;\n stepName?: string;\n result: { ok: boolean; details?: Record<string, any> };\n }): void {\n console.log(`${INDENT}↳ SPEC ${args.specId} ok=${args.result.ok}`);\n if (args.result.details) {\n const details = JSON.stringify(args.result.details, null, 2);\n console.log(indentLines(details, `${INDENT}${INDENT}`));\n }\n }\n\n attach(args: {\n scenarioId: string;\n name: string;\n contentType: string;\n data: Buffer | string;\n }): void {\n const header = `ATTACH ${args.name} (${args.contentType})`;\n console.log(indentLines(header, `${STEP_INDENT}${INDENT}`));\n const dataText = Buffer.isBuffer(args.data) ? args.data.toString(\"utf8\") : String(args.data ?? \"\");\n if (!dataText.length) return;\n console.log(indentLines(dataText, `${STEP_INDENT}${INDENT}${INDENT}`));\n }\n\n onRunEnd(args: {\n ok: boolean;\n total: number;\n passed: number;\n failed: number;\n durationMs: number;\n }): void {\n const durationSeconds = (args.durationMs / 1000).toFixed(2);\n const finalStatus = args.ok ? \"PASSED\" : \"FAILED\";\n\n console.log(\"\\n════════ Test Run Summary ════════\");\n console.log(`Result: Test run ${finalStatus}`);\n console.log(`Cases: total=${args.total}, passed=${args.passed}, failed=${args.failed}`);\n console.log(`Duration: ${durationSeconds}s`);\n console.log(\"══════════════════════════════════\");\n }\n}\n"]}
@@ -33,5 +33,12 @@ 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
  }
37
44
  //# sourceMappingURL=reporter.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.types.d.ts","sourceRoot":"","sources":["../../../src/testing/reporter/reporter.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,MAAM,WAAW,QAAQ;IACvB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9C,aAAa,CACX,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAC3D,IAAI,CAAC;IACR,WAAW,CAAC,IAAI,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,SAAS,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI,CAAC;IACT,SAAS,CAAC,IAAI,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,SAAS,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,OAAO,CAAC;QACZ,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,YAAY,CAAC,CAAC,IAAI,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,mBAAmB,CAAC;KAC7B,GAAG,IAAI,CAAC;IACT,MAAM,CAAC,CAAC,IAAI,EAAE;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,GAAG,IAAI,CAAC;CACV"}
1
+ {"version":3,"file":"reporter.types.d.ts","sourceRoot":"","sources":["../../../src/testing/reporter/reporter.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,MAAM,WAAW,QAAQ;IACvB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9C,aAAa,CACX,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAC3D,IAAI,CAAC;IACR,WAAW,CAAC,IAAI,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,SAAS,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI,CAAC;IACT,SAAS,CAAC,IAAI,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,SAAS,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,OAAO,CAAC;QACZ,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,YAAY,CAAC,CAAC,IAAI,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,mBAAmB,CAAC;KAC7B,GAAG,IAAI,CAAC;IACT,MAAM,CAAC,CAAC,IAAI,EAAE;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,GAAG,IAAI,CAAC;IACT,QAAQ,CAAC,CAAC,IAAI,EAAE;QACd,EAAE,EAAE,OAAO,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;CACV"}
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.types.js","sourceRoot":"","sources":["../../../src/testing/reporter/reporter.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { StepPhase } from \"../contracts/runtime-context.types\";\nimport type { OpStep, ScenarioSpec } from \"../contracts/testing-metadata.types\";\nimport type { SolidTestSpecResult } from \"../contracts/test-spec.types\";\n\nexport interface Reporter {\n onScenarioStart(scenario: ScenarioSpec): void;\n onScenarioEnd(\n scenario: ScenarioSpec,\n result: { ok: boolean; error?: unknown; durationMs: number },\n ): void;\n onStepStart(args: {\n scenarioId: string;\n phase: StepPhase;\n step: OpStep;\n }): void;\n onStepEnd(args: {\n scenarioId: string;\n phase: StepPhase;\n step: OpStep;\n ok: boolean;\n error?: unknown;\n durationMs: number;\n }): void;\n onSpecResult?(args: {\n scenarioId: string;\n specId: string;\n stepName?: string;\n result: SolidTestSpecResult;\n }): void;\n attach?(args: {\n scenarioId: string;\n name: string;\n contentType: string;\n data: Buffer | string;\n }): void;\n}\n"]}
1
+ {"version":3,"file":"reporter.types.js","sourceRoot":"","sources":["../../../src/testing/reporter/reporter.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { StepPhase } from \"../contracts/runtime-context.types\";\nimport type { OpStep, ScenarioSpec } from \"../contracts/testing-metadata.types\";\nimport type { SolidTestSpecResult } from \"../contracts/test-spec.types\";\n\nexport interface Reporter {\n onScenarioStart(scenario: ScenarioSpec): void;\n onScenarioEnd(\n scenario: ScenarioSpec,\n result: { ok: boolean; error?: unknown; durationMs: number },\n ): void;\n onStepStart(args: {\n scenarioId: string;\n phase: StepPhase;\n step: OpStep;\n }): void;\n onStepEnd(args: {\n scenarioId: string;\n phase: StepPhase;\n step: OpStep;\n ok: boolean;\n error?: unknown;\n durationMs: number;\n }): void;\n onSpecResult?(args: {\n scenarioId: string;\n specId: string;\n stepName?: string;\n result: SolidTestSpecResult;\n }): void;\n attach?(args: {\n scenarioId: string;\n name: string;\n contentType: string;\n data: Buffer | string;\n }): void;\n onRunEnd?(args: {\n ok: boolean;\n total: number;\n passed: number;\n failed: number;\n durationMs: number;\n }): void;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-reporter.js","sourceRoot":"","sources":["../../../src/testing/reporter/webhook-reporter.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConsoleReporter } from \"./console-reporter\";\nimport type { OpStep, ScenarioSpec } from \"../contracts/testing-metadata.types\";\nimport type { StepPhase } from \"../contracts/runtime-context.types\";\n\ninterface TestStepResult {\n phase: string;\n operation: string;\n name?: string;\n ok: boolean;\n durationMs: number;\n error?: string;\n}\n\ninterface TestScenarioResult {\n id: string;\n name?: string;\n ok: boolean;\n durationMs: number;\n error?: string;\n steps: TestStepResult[];\n}\n\nexport interface TestRunPayload {\n runName: string;\n startedAt: string;\n completedAt: string;\n durationMs: number;\n exitCode: number;\n total: number;\n passed: number;\n failed: number;\n scenarios: TestScenarioResult[];\n}\n\nfunction formatError(err: unknown): string {\n if (!err) return \"\";\n if (err instanceof Error) return err.stack || err.message;\n return String(err);\n}\n\nexport class WebhookReporter extends ConsoleReporter {\n private readonly startedAt = new Date();\n private readonly accumulated: TestScenarioResult[] = [];\n private currentSteps: TestStepResult[] = [];\n\n constructor(\n private readonly webhookUrl: string,\n private readonly runName: string,\n ) {\n super();\n }\n\n override onStepEnd(args: {\n scenarioId: string;\n phase: StepPhase;\n step: OpStep;\n ok: boolean;\n error?: unknown;\n durationMs: number;\n }): void {\n super.onStepEnd(args);\n this.currentSteps.push({\n phase: String(args.phase),\n operation: args.step.op,\n name: args.step.name,\n ok: args.ok,\n durationMs: args.durationMs,\n error: args.error ? formatError(args.error) : undefined,\n });\n }\n\n override onScenarioEnd(\n scenario: ScenarioSpec,\n result: { ok: boolean; error?: unknown; durationMs: number },\n ): void {\n super.onScenarioEnd(scenario, result);\n this.accumulated.push({\n id: scenario.id,\n name: scenario.name,\n ok: result.ok,\n durationMs: result.durationMs,\n error: result.error ? formatError(result.error) : undefined,\n steps: [...this.currentSteps],\n });\n this.currentSteps = [];\n }\n\n async flush(exitCode: number): Promise<void> {\n const completedAt = new Date();\n const payload: TestRunPayload = {\n runName: this.runName,\n startedAt: this.startedAt.toISOString(),\n completedAt: completedAt.toISOString(),\n durationMs: completedAt.getTime() - this.startedAt.getTime(),\n exitCode,\n total: this.accumulated.length,\n passed: this.accumulated.filter((s) => s.ok).length,\n failed: this.accumulated.filter((s) => !s.ok).length,\n scenarios: this.accumulated,\n };\n\n try {\n const response = await fetch(this.webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n console.warn(`[WebhookReporter] Webhook returned ${response.status}`);\n }\n } catch (err) {\n console.warn(`[WebhookReporter] Failed to deliver test results: ${err}`);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"webhook-reporter.js","sourceRoot":"","sources":["../../../src/testing/reporter/webhook-reporter.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConsoleReporter } from \"./console-reporter\";\nimport type { OpStep, ScenarioSpec } from \"../contracts/testing-metadata.types\";\nimport type { StepPhase } from \"../contracts/runtime-context.types\";\n\ninterface TestStepResult {\n phase: string;\n operation: string;\n name?: string;\n ok: boolean;\n durationMs: number;\n error?: string;\n}\n\ninterface TestScenarioResult {\n id: string;\n name?: string;\n ok: boolean;\n durationMs: number;\n error?: string;\n steps: TestStepResult[];\n}\n\nexport interface TestRunPayload {\n runName: string;\n startedAt: string;\n completedAt: string;\n durationMs: number;\n exitCode: number;\n total: number;\n passed: number;\n failed: number;\n scenarios: TestScenarioResult[];\n}\n\nfunction formatError(err: unknown): string {\n if (!err) return \"\";\n if (err instanceof Error) return err.stack || err.message;\n return String(err);\n}\n\nexport class WebhookReporter extends ConsoleReporter {\n private readonly startedAt = new Date();\n private readonly accumulated: TestScenarioResult[] = [];\n private currentSteps: TestStepResult[] = [];\n\n constructor(\n private readonly webhookUrl: string,\n private readonly runName: string,\n ) {\n super();\n }\n\n override onStepEnd(args: {\n scenarioId: string;\n phase: StepPhase;\n step: OpStep;\n ok: boolean;\n error?: unknown;\n durationMs: number;\n }): void {\n super.onStepEnd(args);\n this.currentSteps.push({\n phase: String(args.phase),\n operation: args.step.op,\n name: args.step.name,\n ok: args.ok,\n durationMs: args.durationMs,\n error: args.error ? formatError(args.error) : undefined,\n });\n }\n\n override onScenarioEnd(\n scenario: ScenarioSpec,\n result: { ok: boolean; error?: unknown; durationMs: number },\n ): void {\n super.onScenarioEnd(scenario, result);\n this.accumulated.push({\n id: scenario.id,\n name: scenario.name,\n ok: result.ok,\n durationMs: result.durationMs,\n error: result.error ? formatError(result.error) : undefined,\n steps: [...this.currentSteps],\n });\n this.currentSteps = [];\n }\n\n async flush(exitCode: number): Promise<void> {\n const completedAt = new Date();\n const payload: TestRunPayload = {\n runName: this.runName,\n startedAt: this.startedAt.toISOString(),\n completedAt: completedAt.toISOString(),\n durationMs: completedAt.getTime() - this.startedAt.getTime(),\n exitCode,\n total: this.accumulated.length,\n passed: this.accumulated.filter((s) => s.ok).length,\n failed: this.accumulated.filter((s) => !s.ok).length,\n scenarios: this.accumulated,\n };\n\n try {\n const response = await fetch(this.webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n console.warn(`[WebhookReporter] Webhook returned ${response.status}`);\n }\n } catch (err: any) {\n console.warn(`[WebhookReporter] Failed to deliver test results: ${err}`);\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"run-from-metadata.d.ts","sourceRoot":"","sources":["../../../src/testing/runner/run-from-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,qCAAqC,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AASxE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAoBrD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB,EAAE,CAAC,EAAE,wBAAwB,CAAC;IAC9B,QAAQ,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACrC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,wBAAsB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCxE"}
1
+ {"version":3,"file":"run-from-metadata.d.ts","sourceRoot":"","sources":["../../../src/testing/runner/run-from-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,qCAAqC,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AASxE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAoBrD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB,EAAE,CAAC,EAAE,wBAAwB,CAAC;IAC9B,QAAQ,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACrC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,wBAAsB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DxE"}
@@ -62,6 +62,7 @@ function buildTestDataIndex(data) {
62
62
  return index;
63
63
  }
64
64
  async function runFromMetadata(opts) {
65
+ const startedAt = Date.now();
65
66
  const registry = new step_registry_1.StepRegistry();
66
67
  (0, api_1.registerApiSteps)(registry);
67
68
  (0, ui_1.registerUiSteps)(registry);
@@ -86,15 +87,33 @@ async function runFromMetadata(opts) {
86
87
  const ui = new PlaywrightAdapter(opts.ui);
87
88
  const ctxBase = { resources, reporter, api, ui, specRegistry, testData, options: opts.options };
88
89
  const uiStarted = { value: false };
90
+ let passed = 0;
91
+ let failed = 0;
92
+ let runError;
89
93
  try {
90
94
  for (const scenario of scenarios) {
91
95
  if ((0, lifecycle_1.scenarioNeedsUi)(scenario)) {
92
96
  await (0, lifecycle_1.ensureUiStarted)(ctxBase, uiStarted);
93
97
  }
94
- await engine.runScenario(scenario, ctxBase);
98
+ try {
99
+ await engine.runScenario(scenario, ctxBase);
100
+ passed += 1;
101
+ }
102
+ catch (error) {
103
+ failed += 1;
104
+ runError = error;
105
+ throw error;
106
+ }
95
107
  }
96
108
  }
97
109
  finally {
110
+ reporter.onRunEnd?.({
111
+ ok: !runError,
112
+ total: scenarios.length,
113
+ passed,
114
+ failed,
115
+ durationMs: Date.now() - startedAt,
116
+ });
98
117
  if (uiStarted.value) {
99
118
  await ui.stop();
100
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run-from-metadata.js","sourceRoot":"","sources":["../../../src/testing/runner/run-from-metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Reporter } from \"../reporter/reporter.types\";\nimport type { TestingMetadata, TestingDataRecord } from \"../contracts/testing-metadata.types\";\nimport type { ApiAdapterOptions } from \"../adapters/api/api.types\";\nimport type { PlaywrightAdapterOptions } from \"../adapters/ui/ui.types\";\nimport { ApiAdapter } from \"../adapters/api/api-adapter\";\nimport { registerApiSteps } from \"../steps/api\";\nimport { registerUiSteps } from \"../steps/ui\";\nimport { registerAssertSteps } from \"../steps/assert\";\nimport { registerUtilSteps } from \"../steps/util\";\nimport { registerTestSteps } from \"../steps/test\";\nimport { SimpleResourceStore } from \"../core/resource-store\";\nimport { StepRegistry } from \"../core/step-registry\";\nimport { SpecRegistry } from \"../core/spec-registry\";\nimport { TestingEngine } from \"../core/testing-engine\";\nimport { filterScenarios } from \"./scenario-filter\";\nimport { ensureUiStarted, scenarioNeedsUi } from \"./lifecycle\";\nimport { ConsoleReporter } from \"../reporter/console-reporter\";\n\n\nfunction buildTestDataIndex(data?: TestingDataRecord[]): Record<string, Record<string, any>> {\n const index: Record<string, Record<string, any>> = {};\n if (!Array.isArray(data)) return index;\n for (const record of data) {\n if (!record?.modelUserKey || !record?.recUserKeyValue) continue;\n if (!index[record.modelUserKey]) {\n index[record.modelUserKey] = {};\n }\n index[record.modelUserKey][record.recUserKeyValue] = record.data ?? {};\n }\n return index;\n}\n\nexport type RunnerOptions = {\n metadata: TestingMetadata;\n scenarioIds?: string[];\n includeTags?: string[];\n skipScenarioIds?: string[];\n reporter?: Reporter;\n api?: ApiAdapterOptions;\n ui?: PlaywrightAdapterOptions;\n defaults?: { timeoutMs?: number; retries?: number };\n options?: { printApiLogs?: boolean };\n specs?: (registry: SpecRegistry) => void;\n};\n\nexport async function runFromMetadata(opts: RunnerOptions): Promise<void> {\n const registry = new StepRegistry();\n registerApiSteps(registry);\n registerUiSteps(registry);\n registerAssertSteps(registry);\n registerUtilSteps(registry);\n registerTestSteps(registry);\n\n const engine = new TestingEngine(registry, opts.defaults);\n const scenarios = filterScenarios(opts.metadata.testing.scenarios, {\n scenarioIds: opts.scenarioIds,\n includeTags: opts.includeTags,\n skipScenarioIds: opts.skipScenarioIds,\n });\n\n const specRegistry = new SpecRegistry();\n const testData = buildTestDataIndex(opts.metadata.testing?.data);\n if (opts.specs) {\n opts.specs(specRegistry);\n }\n\n const resources = new SimpleResourceStore();\n const reporter = opts.reporter ?? new ConsoleReporter();\n const api = new ApiAdapter(opts.api);\n const { PlaywrightAdapter } = await import(\"../adapters/ui/playwright-adapter\");\n const ui = new PlaywrightAdapter(opts.ui);\n const ctxBase = { resources, reporter, api, ui, specRegistry, testData, options: opts.options };\n const uiStarted = { value: false };\n\n try {\n for (const scenario of scenarios) {\n if (scenarioNeedsUi(scenario)) {\n await ensureUiStarted(ctxBase, uiStarted);\n }\n await engine.runScenario(scenario, ctxBase);\n }\n } finally {\n if (uiStarted.value) {\n await ui.stop();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"run-from-metadata.js","sourceRoot":"","sources":["../../../src/testing/runner/run-from-metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Reporter } from \"../reporter/reporter.types\";\nimport type { TestingMetadata, TestingDataRecord } from \"../contracts/testing-metadata.types\";\nimport type { ApiAdapterOptions } from \"../adapters/api/api.types\";\nimport type { PlaywrightAdapterOptions } from \"../adapters/ui/ui.types\";\nimport { ApiAdapter } from \"../adapters/api/api-adapter\";\nimport { registerApiSteps } from \"../steps/api\";\nimport { registerUiSteps } from \"../steps/ui\";\nimport { registerAssertSteps } from \"../steps/assert\";\nimport { registerUtilSteps } from \"../steps/util\";\nimport { registerTestSteps } from \"../steps/test\";\nimport { SimpleResourceStore } from \"../core/resource-store\";\nimport { StepRegistry } from \"../core/step-registry\";\nimport { SpecRegistry } from \"../core/spec-registry\";\nimport { TestingEngine } from \"../core/testing-engine\";\nimport { filterScenarios } from \"./scenario-filter\";\nimport { ensureUiStarted, scenarioNeedsUi } from \"./lifecycle\";\nimport { ConsoleReporter } from \"../reporter/console-reporter\";\n\n\nfunction buildTestDataIndex(data?: TestingDataRecord[]): Record<string, Record<string, any>> {\n const index: Record<string, Record<string, any>> = {};\n if (!Array.isArray(data)) return index;\n for (const record of data) {\n if (!record?.modelUserKey || !record?.recUserKeyValue) continue;\n if (!index[record.modelUserKey]) {\n index[record.modelUserKey] = {};\n }\n index[record.modelUserKey][record.recUserKeyValue] = record.data ?? {};\n }\n return index;\n}\n\nexport type RunnerOptions = {\n metadata: TestingMetadata;\n scenarioIds?: string[];\n includeTags?: string[];\n skipScenarioIds?: string[];\n reporter?: Reporter;\n api?: ApiAdapterOptions;\n ui?: PlaywrightAdapterOptions;\n defaults?: { timeoutMs?: number; retries?: number };\n options?: { printApiLogs?: boolean };\n specs?: (registry: SpecRegistry) => void;\n};\n\nexport async function runFromMetadata(opts: RunnerOptions): Promise<void> {\n const startedAt = Date.now();\n const registry = new StepRegistry();\n registerApiSteps(registry);\n registerUiSteps(registry);\n registerAssertSteps(registry);\n registerUtilSteps(registry);\n registerTestSteps(registry);\n\n const engine = new TestingEngine(registry, opts.defaults);\n const scenarios = filterScenarios(opts.metadata.testing.scenarios, {\n scenarioIds: opts.scenarioIds,\n includeTags: opts.includeTags,\n skipScenarioIds: opts.skipScenarioIds,\n });\n\n const specRegistry = new SpecRegistry();\n const testData = buildTestDataIndex(opts.metadata.testing?.data);\n if (opts.specs) {\n opts.specs(specRegistry);\n }\n\n const resources = new SimpleResourceStore();\n const reporter = opts.reporter ?? new ConsoleReporter();\n const api = new ApiAdapter(opts.api);\n const { PlaywrightAdapter } = await import(\"../adapters/ui/playwright-adapter\");\n const ui = new PlaywrightAdapter(opts.ui);\n const ctxBase = { resources, reporter, api, ui, specRegistry, testData, options: opts.options };\n const uiStarted = { value: false };\n let passed = 0;\n let failed = 0;\n let runError: unknown;\n\n try {\n for (const scenario of scenarios) {\n if (scenarioNeedsUi(scenario)) {\n await ensureUiStarted(ctxBase, uiStarted);\n }\n try {\n await engine.runScenario(scenario, ctxBase);\n passed += 1;\n } catch (error) {\n failed += 1;\n runError = error;\n throw error;\n }\n }\n } finally {\n reporter.onRunEnd?.({\n ok: !runError,\n total: scenarios.length,\n passed,\n failed,\n durationMs: Date.now() - startedAt,\n });\n if (uiStarted.value) {\n await ui.stop();\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMxD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAK5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAOxD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAM5D"}
@@ -5,10 +5,12 @@ const navigation_step_1 = require("./navigation.step");
5
5
  const form_step_1 = require("./form.step");
6
6
  const actions_step_1 = require("./actions.step");
7
7
  const assertions_step_1 = require("./assertions.step");
8
+ const manual_step_1 = require("./manual.step");
8
9
  function registerUiSteps(registry) {
9
10
  (0, navigation_step_1.registerNavigationSteps)(registry);
10
11
  (0, form_step_1.registerFormSteps)(registry);
11
12
  (0, actions_step_1.registerActionSteps)(registry);
12
13
  (0, assertions_step_1.registerAssertionSteps)(registry);
14
+ (0, manual_step_1.registerManualSteps)(registry);
13
15
  }
14
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/testing/steps/ui/index.ts"],"names":[],"mappings":";;AAMA,0CAKC;AAVD,uDAA4D;AAC5D,2CAAgD;AAChD,iDAAqD;AACrD,uDAA2D;AAE3D,SAAgB,eAAe,CAAC,QAAsB;IACpD,IAAA,yCAAuB,EAAC,QAAQ,CAAC,CAAC;IAClC,IAAA,6BAAiB,EAAC,QAAQ,CAAC,CAAC;IAC5B,IAAA,kCAAmB,EAAC,QAAQ,CAAC,CAAC;IAC9B,IAAA,wCAAsB,EAAC,QAAQ,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import { StepRegistry } from \"../../core/step-registry\";\nimport { registerNavigationSteps } from \"./navigation.step\";\nimport { registerFormSteps } from \"./form.step\";\nimport { registerActionSteps } from \"./actions.step\";\nimport { registerAssertionSteps } from \"./assertions.step\";\n\nexport function registerUiSteps(registry: StepRegistry): void {\n registerNavigationSteps(registry);\n registerFormSteps(registry);\n registerActionSteps(registry);\n registerAssertionSteps(registry);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/testing/steps/ui/index.ts"],"names":[],"mappings":";;AAOA,0CAMC;AAZD,uDAA4D;AAC5D,2CAAgD;AAChD,iDAAqD;AACrD,uDAA2D;AAC3D,+CAAoD;AAEpD,SAAgB,eAAe,CAAC,QAAsB;IACpD,IAAA,yCAAuB,EAAC,QAAQ,CAAC,CAAC;IAClC,IAAA,6BAAiB,EAAC,QAAQ,CAAC,CAAC;IAC5B,IAAA,kCAAmB,EAAC,QAAQ,CAAC,CAAC;IAC9B,IAAA,wCAAsB,EAAC,QAAQ,CAAC,CAAC;IACjC,IAAA,iCAAmB,EAAC,QAAQ,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import { StepRegistry } from \"../../core/step-registry\";\nimport { registerNavigationSteps } from \"./navigation.step\";\nimport { registerFormSteps } from \"./form.step\";\nimport { registerActionSteps } from \"./actions.step\";\nimport { registerAssertionSteps } from \"./assertions.step\";\nimport { registerManualSteps } from \"./manual.step\";\n\nexport function registerUiSteps(registry: StepRegistry): void {\n registerNavigationSteps(registry);\n registerFormSteps(registry);\n registerActionSteps(registry);\n registerAssertionSteps(registry);\n registerManualSteps(registry);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { StepRegistry } from "../../core/step-registry";
2
+ export declare function registerManualSteps(registry: StepRegistry): void;
3
+ //# sourceMappingURL=manual.step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual.step.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/ui/manual.step.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAmBxD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAuDhE"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerManualSteps = registerManualSteps;
4
+ const promises_1 = require("node:readline/promises");
5
+ const node_process_1 = require("node:process");
6
+ function requirePage(ctx, op) {
7
+ if (!ctx.ui || !ctx.ui.page) {
8
+ throw new Error(`Missing UI page on context for op "${op}"`);
9
+ }
10
+ return ctx.ui.page;
11
+ }
12
+ function registerManualSteps(registry) {
13
+ registry.register("ui.waitForManual", async (ctx, step) => {
14
+ const page = requirePage(ctx, "ui.waitForManual");
15
+ const inputConfig = (step.with ?? {});
16
+ const message = inputConfig.message?.trim() || "Manual interaction required.";
17
+ const prompt = inputConfig.prompt?.trim() || "Press Enter to continue...";
18
+ const timeoutMs = inputConfig.timeoutMs;
19
+ const bringToFront = inputConfig.bringToFront ?? true;
20
+ if (ctx.ui?.isHeadless()) {
21
+ throw new Error('Op "ui.waitForManual" requires headed mode. Re-run with --headless false.');
22
+ }
23
+ if (!node_process_1.stdin.isTTY || !node_process_1.stdout.isTTY) {
24
+ throw new Error('Op "ui.waitForManual" requires an interactive terminal (TTY).');
25
+ }
26
+ if (bringToFront) {
27
+ await page.bringToFront();
28
+ }
29
+ console.log("");
30
+ console.log("════════ Manual Interaction Required ════════");
31
+ console.log(message);
32
+ console.log(`Scenario: ${ctx.scenarioId}`);
33
+ console.log(`Current URL: ${page.url()}`);
34
+ console.log(prompt);
35
+ const rl = (0, promises_1.createInterface)({ input: node_process_1.stdin, output: node_process_1.stdout });
36
+ try {
37
+ await rl.question("");
38
+ }
39
+ finally {
40
+ rl.close();
41
+ }
42
+ if (inputConfig.waitForSelector) {
43
+ await page.waitForSelector(inputConfig.waitForSelector, {
44
+ state: "visible",
45
+ timeout: timeoutMs,
46
+ });
47
+ }
48
+ if (inputConfig.waitForUrlEquals) {
49
+ await page.waitForURL((url) => url.toString() === inputConfig.waitForUrlEquals, { timeout: timeoutMs });
50
+ }
51
+ if (inputConfig.waitForUrlContains) {
52
+ await page.waitForURL((url) => url.toString().includes(String(inputConfig.waitForUrlContains)), { timeout: timeoutMs });
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=manual.step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual.step.js","sourceRoot":"","sources":["../../../../src/testing/steps/ui/manual.step.ts"],"names":[],"mappings":"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","sourcesContent":["import { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\n\nimport type { TestContext } from \"../../contracts/runtime-context.types\";\nimport type { OpStep } from \"../../contracts/testing-metadata.types\";\nimport { StepRegistry } from \"../../core/step-registry\";\n\ntype WaitForManualInput = {\n message?: string;\n prompt?: string;\n waitForSelector?: string;\n waitForUrlContains?: string;\n waitForUrlEquals?: string;\n timeoutMs?: number;\n bringToFront?: boolean;\n};\n\nfunction requirePage(ctx: TestContext, op: string) {\n if (!ctx.ui || !ctx.ui.page) {\n throw new Error(`Missing UI page on context for op \"${op}\"`);\n }\n return ctx.ui.page;\n}\n\nexport function registerManualSteps(registry: StepRegistry): void {\n registry.register(\"ui.waitForManual\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.waitForManual\");\n const inputConfig = (step.with ?? {}) as WaitForManualInput;\n const message = inputConfig.message?.trim() || \"Manual interaction required.\";\n const prompt = inputConfig.prompt?.trim() || \"Press Enter to continue...\";\n const timeoutMs = inputConfig.timeoutMs;\n const bringToFront = inputConfig.bringToFront ?? true;\n\n if (ctx.ui?.isHeadless()) {\n throw new Error('Op \"ui.waitForManual\" requires headed mode. Re-run with --headless false.');\n }\n if (!input.isTTY || !output.isTTY) {\n throw new Error('Op \"ui.waitForManual\" requires an interactive terminal (TTY).');\n }\n\n if (bringToFront) {\n await page.bringToFront();\n }\n\n console.log(\"\");\n console.log(\"════════ Manual Interaction Required ════════\");\n console.log(message);\n console.log(`Scenario: ${ctx.scenarioId}`);\n console.log(`Current URL: ${page.url()}`);\n console.log(prompt);\n\n const rl = createInterface({ input, output });\n try {\n await rl.question(\"\");\n } finally {\n rl.close();\n }\n\n if (inputConfig.waitForSelector) {\n await page.waitForSelector(inputConfig.waitForSelector, {\n state: \"visible\",\n timeout: timeoutMs,\n });\n }\n\n if (inputConfig.waitForUrlEquals) {\n await page.waitForURL(\n (url) => url.toString() === inputConfig.waitForUrlEquals,\n { timeout: timeoutMs },\n );\n }\n\n if (inputConfig.waitForUrlContains) {\n await page.waitForURL(\n (url) => url.toString().includes(String(inputConfig.waitForUrlContains)),\n { timeout: timeoutMs },\n );\n }\n });\n}\n"]}
@@ -1,6 +1,11 @@
1
1
  import { Logger as TypeORMLogger, QueryRunner } from 'typeorm';
2
2
  import { Logger } from 'winston';
3
3
  import * as winston from 'winston';
4
+ export declare const createWinstonLoggerConfig: () => {
5
+ level: string;
6
+ format: winston.Logform.Format;
7
+ transports: (winston.transports.ConsoleTransportInstance | winston.transports.FileTransportInstance)[];
8
+ };
4
9
  export declare const WinstonLoggerConfig: {
5
10
  level: string;
6
11
  format: winston.Logform.Format;
@@ -1 +1 @@
1
- {"version":3,"file":"winston.logger.d.ts","sourceRoot":"","sources":["../src/winston.logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,eAAO,MAAM,mBAAmB;;;;CAgC/B,CAAC;AAEF,qBAAa,oBAAqB,YAAW,aAAa;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE5E,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAM5E,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAIhG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAI9F,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAIhE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAI9D,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI;CAGpE"}
1
+ {"version":3,"file":"winston.logger.d.ts","sourceRoot":"","sources":["../src/winston.logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,eAAO,MAAM,yBAAyB;;;;CA4BpC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;CAA8B,CAAC;AAE/D,qBAAa,oBAAqB,YAAW,aAAa;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE5E,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAM5E,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAIhG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAI9F,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAIhE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAI9D,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI;CAGpE"}
@@ -45,14 +45,14 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
45
  return function (target, key) { decorator(target, key, paramIndex); }
46
46
  };
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.WinstonTypeORMLogger = exports.WinstonLoggerConfig = void 0;
48
+ exports.WinstonTypeORMLogger = exports.WinstonLoggerConfig = exports.createWinstonLoggerConfig = void 0;
49
49
  const winston_1 = require("winston");
50
50
  const common_1 = require("@nestjs/common");
51
51
  const nest_winston_1 = require("nest-winston");
52
52
  const winston = __importStar(require("winston"));
53
53
  const disallow_in_production_decorator_1 = require("./decorators/disallow-in-production.decorator");
54
- exports.WinstonLoggerConfig = {
55
- level: process.env.LOG_LEVEL || (process.env.ENV === disallow_in_production_decorator_1.Environment.Production ? 'info' : 'debug'),
54
+ const createWinstonLoggerConfig = () => ({
55
+ level: process.env.LOG_LEVEL || (process.env.ENV === disallow_in_production_decorator_1.Environment.Production ? 'warn' : 'info'),
56
56
  format: winston.format.combine(winston.format.timestamp(), winston.format.errors({ stack: true }), winston.format.printf(({ level, message, timestamp }) => {
57
57
  if (!message) {
58
58
  return `[${timestamp}] ${level.toUpperCase()}: (No message provided)`;
@@ -73,7 +73,9 @@ exports.WinstonLoggerConfig = {
73
73
  level: 'error',
74
74
  }),
75
75
  ],
76
- };
76
+ });
77
+ exports.createWinstonLoggerConfig = createWinstonLoggerConfig;
78
+ exports.WinstonLoggerConfig = (0, exports.createWinstonLoggerConfig)();
77
79
  let WinstonTypeORMLogger = class WinstonTypeORMLogger {
78
80
  constructor(logger) {
79
81
  this.logger = logger;
@@ -1 +1 @@
1
- {"version":3,"file":"winston.logger.js","sourceRoot":"","sources":["../src/winston.logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,qCAAiC;AACjC,2CAAwC;AACxC,+CAAuD;AACvD,iDAAmC;AACnC,oGAA4E;AAE/D,QAAA,mBAAmB,GAAG;IAC/B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,8CAAW,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/F,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAC1B,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,IAAI,SAAS,KAAK,KAAK,CAAC,WAAW,EAAE,yBAAyB,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,SAAS,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;IAC/D,CAAC,CAAC,CACL;IACD,UAAU,EAAE;QACR,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAG1B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;gBACpD,OAAO,IAAI,SAAS,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;YAC/D,CAAC,CAAC,CACL;SACJ,CAAC;QACF,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YACxB,QAAQ,EAAE,sBAAsB;SAEnC,CAAC;QACF,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YACxB,QAAQ,EAAE,gBAAgB;YAC1B,KAAK,EAAE,OAAO;SAEjB,CAAC;KACL;CACJ,CAAC;AAEF,IAAa,oBAAoB,GAAjC,MAAa,oBAAoB;IAC7B,YAA8D,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAI,CAAC;IAEjF,QAAQ,CAAC,KAAa,EAAE,UAAkB,EAAE,WAAyB;QACjE,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,gBAAgB,UAAU,EAAE,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;IAED,aAAa,CAAC,KAAa,EAAE,KAAa,EAAE,UAAkB,EAAE,WAAyB;QACrF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,aAAa,KAAK,kBAAkB,UAAU,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,UAAkB,EAAE,WAAyB;QACnF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,eAAe,KAAK,kBAAkB,UAAU,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,cAAc,CAAC,OAAe,EAAE,WAAyB;QACrD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,YAAY,CAAC,OAAe,EAAE,WAAyB;QACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,GAAG,CAAC,KAAwC,EAAE,OAAY;QACtD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;CACJ,CAAA;AA5BY,oDAAoB;+BAApB,oBAAoB;IAChB,WAAA,IAAA,eAAM,EAAC,sCAAuB,CAAC,CAAA;qCAA0B,gBAAM;GADnE,oBAAoB,CA4BhC","sourcesContent":["\nimport { Logger as TypeORMLogger, QueryRunner } from 'typeorm';\nimport { Logger } from 'winston';\nimport { Inject } from '@nestjs/common';\nimport { WINSTON_MODULE_PROVIDER } from 'nest-winston';\nimport * as winston from 'winston';\nimport { Environment } from './decorators/disallow-in-production.decorator';\n\nexport const WinstonLoggerConfig = {\n level: process.env.LOG_LEVEL || (process.env.ENV === Environment.Production ? 'info' : 'debug'),\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.errors({ stack: true }),\n winston.format.printf(({ level, message, timestamp }) => {\n if (!message) {\n return `[${timestamp}] ${level.toUpperCase()}: (No message provided)`;\n }\n return `[${timestamp}] ${level.toUpperCase()}: ${message}`;\n }),\n ),\n transports: [\n new winston.transports.Console({\n format: winston.format.combine(\n // winston.format.colorize(),\n // winston.format.timestamp(),\n winston.format.printf(({ level, message, timestamp }) => {\n return `[${timestamp}] ${level.toUpperCase()}: ${message}`;\n }),\n ),\n }),\n new winston.transports.File({\n filename: 'logs/application.log',\n // format: winston.format.json(),\n }),\n new winston.transports.File({\n filename: 'logs/error.log',\n level: 'error',\n // format: winston.format.json(),\n }),\n ],\n};\n\nexport class WinstonTypeORMLogger implements TypeORMLogger {\n constructor(@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger) { }\n\n logQuery(query: string, parameters?: any[], queryRunner?: QueryRunner): void {\n if (Boolean(process.env.DEFAULT_DATABASE_LOGGING)) {\n this.logger.info(`Query: ${query} Parameters: ${parameters}`);\n }\n }\n\n logQueryError(error: string, query: string, parameters?: any[], queryRunner?: QueryRunner): void {\n this.logger.error(`Query failed: ${error} | Query: ${query} | Parameters: ${parameters}`);\n }\n\n logQuerySlow(time: number, query: string, parameters?: any[], queryRunner?: QueryRunner): void {\n this.logger.warn(`Slow query: ${time}ms | Query: ${query} | Parameters: ${parameters}`);\n }\n\n logSchemaBuild(message: string, queryRunner?: QueryRunner): void {\n this.logger.info(`Schema Build: ${message}`);\n }\n\n logMigration(message: string, queryRunner?: QueryRunner): void {\n this.logger.info(`Migration: ${message}`);\n }\n\n log(level: 'log' | 'info' | 'warn' | 'error', message: any): void {\n this.logger[level](message);\n }\n}"]}
1
+ {"version":3,"file":"winston.logger.js","sourceRoot":"","sources":["../src/winston.logger.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport { Logger as TypeORMLogger, QueryRunner } from 'typeorm';\nimport { Logger } from 'winston';\nimport { Inject } from '@nestjs/common';\nimport { WINSTON_MODULE_PROVIDER } from 'nest-winston';\nimport * as winston from 'winston';\nimport { Environment } from './decorators/disallow-in-production.decorator';\n\nexport const createWinstonLoggerConfig = () => ({\n level: process.env.LOG_LEVEL || (process.env.ENV === Environment.Production ? 'warn' : 'info'),\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.errors({ stack: true }),\n winston.format.printf(({ level, message, timestamp }) => {\n if (!message) {\n return `[${timestamp}] ${level.toUpperCase()}: (No message provided)`;\n }\n return `[${timestamp}] ${level.toUpperCase()}: ${message}`;\n }),\n ),\n transports: [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.printf(({ level, message, timestamp }) => {\n return `[${timestamp}] ${level.toUpperCase()}: ${message}`;\n }),\n ),\n }),\n new winston.transports.File({\n filename: 'logs/application.log',\n }),\n new winston.transports.File({\n filename: 'logs/error.log',\n level: 'error',\n }),\n ],\n});\n\nexport const WinstonLoggerConfig = createWinstonLoggerConfig();\n\nexport class WinstonTypeORMLogger implements TypeORMLogger {\n constructor(@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger) { }\n\n logQuery(query: string, parameters?: any[], queryRunner?: QueryRunner): void {\n if (Boolean(process.env.DEFAULT_DATABASE_LOGGING)) {\n this.logger.info(`Query: ${query} Parameters: ${parameters}`);\n }\n }\n\n logQueryError(error: string, query: string, parameters?: any[], queryRunner?: QueryRunner): void {\n this.logger.error(`Query failed: ${error} | Query: ${query} | Parameters: ${parameters}`);\n }\n\n logQuerySlow(time: number, query: string, parameters?: any[], queryRunner?: QueryRunner): void {\n this.logger.warn(`Slow query: ${time}ms | Query: ${query} | Parameters: ${parameters}`);\n }\n\n logSchemaBuild(message: string, queryRunner?: QueryRunner): void {\n this.logger.info(`Schema Build: ${message}`);\n }\n\n logMigration(message: string, queryRunner?: QueryRunner): void {\n this.logger.info(`Migration: ${message}`);\n }\n\n log(level: 'log' | 'info' | 'warn' | 'error', message: any): void {\n this.logger[level](message);\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidxai/core",
3
- "version": "0.1.10-beta.2",
3
+ "version": "0.1.10-beta.22",
4
4
  "description": "This module is a NestJS module containing all the required core providers required by a Solid application",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -79,13 +79,10 @@
79
79
  "ts-morph": "^27.0.2",
80
80
  "twilio": "^5.8.0",
81
81
  "uuid": "^9.0.1",
82
- "xlsx": "^0.18.5"
83
- },
84
- "peerDependenciesMeta": {
85
- "playwright": {
86
- "optional": true
87
- }
82
+ "xlsx": "^0.18.5",
83
+ "playwright": ">=1.0.0"
88
84
  },
85
+ "peerDependenciesMeta": {},
89
86
  "peerDependencies": {
90
87
  "@nestjs/axios": "^3.0.2",
91
88
  "@nestjs/cache-manager": "^2.2.2",
@@ -98,13 +95,14 @@
98
95
  "@nestjs/mongoose": "^10.0.10",
99
96
  "@nestjs/passport": "^10.0.3",
100
97
  "@nestjs/platform-express": "^10.0.0",
98
+ "@nestjs/platform-ws": "^10.0.0",
101
99
  "@nestjs/serve-static": "^4.0.2",
102
100
  "@nestjs/swagger": "^7.2.0",
103
101
  "@nestjs/typeorm": "^10.0.1",
102
+ "@nestjs/websockets": "^10.0.0",
104
103
  "nest-commander": "^3.12.5",
105
104
  "nest-winston": "^1.9.7",
106
105
  "nestjs-cls": "^5.4.3",
107
- "playwright": ">=1.0.0",
108
106
  "reflect-metadata": "^0.2.2",
109
107
  "typeorm": "^0.3.20",
110
108
  "typeorm-naming-strategies": "^4.1.0",
@@ -125,10 +123,12 @@
125
123
  "@nestjs/mongoose": "^10.0.10",
126
124
  "@nestjs/passport": "^10.0.3",
127
125
  "@nestjs/platform-express": "^10.0.0",
126
+ "@nestjs/platform-ws": "^10.0.0",
128
127
  "@nestjs/serve-static": "^4.0.2",
129
128
  "@nestjs/swagger": "^7.2.0",
130
129
  "@nestjs/testing": "^10.0.0",
131
130
  "@nestjs/typeorm": "^10.0.1",
131
+ "@nestjs/websockets": "^10.0.0",
132
132
  "@solidxai/code-builder": "^0.0.2",
133
133
  "@types/express": "^4.17.17",
134
134
  "@types/hapi__joi": "^17.1.12",
@@ -1,14 +1,10 @@
1
- import { BadRequestException, forwardRef, Inject, Logger } from '@nestjs/common';
1
+ import { forwardRef, Inject, Logger } from '@nestjs/common';
2
2
  import { Command, CommandRunner, Option } from 'nest-commander';
3
3
  import { ModelMetadataService } from 'src/services/model-metadata.service';
4
4
  import { CommandError } from './helper';
5
- import { In } from 'typeorm';
6
5
 
7
6
  interface CommandOptions {
8
- name?: string;
9
- id?: number;
10
- fieldIds?: number[];
11
- fieldNames?: string[];
7
+ name: string;
12
8
  dryRun?: boolean;
13
9
  }
14
10
 
@@ -33,34 +29,20 @@ export class RefreshModelCommand extends CommandRunner {
33
29
  }
34
30
 
35
31
  const codeGenerationOptions = {
36
- modelId: options.id,
37
32
  modelUserKey: options.name,
38
33
  dryRun: options.dryRun,
39
- fieldIdsForRefresh: options.fieldIds,
40
- fieldNamesForRefresh: options.fieldNames,
41
34
  };
42
35
  await this.modelMetadataService.handleGenerateCode(codeGenerationOptions);
43
36
  }
44
37
 
45
- // Accept the model ID as an argument
46
38
  @Option({
47
- flags: '-i, --id [model ID]',
48
- description: 'Model ID from the ss_model_metadata table',
49
- })
50
- parseId(val: string): number {
51
- return +val;
52
- }
53
-
54
- // Accept the module name as an argument
55
- @Option({
56
- flags: '-n, --name [model name]',
57
- description: 'Model Name from the ss_model_metadata table',
39
+ flags: '-n, --name <model name>',
40
+ description: 'Model name (singularName) from the ss_model_metadata table',
58
41
  })
59
42
  parseName(val: string): string {
60
43
  return val;
61
44
  }
62
45
 
63
- // Accept dry run as an argument
64
46
  @Option({
65
47
  flags: '-d, --dryRun [dry run]',
66
48
  description: 'Dry run the command',
@@ -70,36 +52,9 @@ export class RefreshModelCommand extends CommandRunner {
70
52
  return (val === 'false') ? false : true;
71
53
  }
72
54
 
73
- // Accept field IDs as an argument
74
- @Option({
75
- flags: '-fids, --fieldIds [Array of field IDs]',
76
- description: 'Json array of Field IDs from the ss_field_metadata table',
77
- })
78
- parseFieldIds(val: string): number[] {
79
- //Check if the value is a json array
80
- if (!val.startsWith('[') || !val.endsWith(']')) {
81
- throw new BadRequestException('Field IDs should be a json array');
82
- }
83
- return JSON.parse(val).map((id: string) => parseInt(id));
84
- }
85
-
86
- // Accept field Names as an argument
87
- @Option({
88
- flags: '-fnames, --fieldNames [Array of field Names]',
89
- description: 'Json array of Field Names from the ss_field_metadata table',
90
- })
91
- parseFieldNames(val: string): string[] {
92
- //Check if the value is a json array
93
- if (!val.startsWith('[') || !val.endsWith(']')) {
94
- throw new BadRequestException('Field Names should be a json array');
95
- }
96
- return JSON.parse(val).map((name: string) => name.toString());
97
- }
98
-
99
- // Validate the options passed
100
55
  private validate(options: CommandOptions): CommandError[] {
101
- if (!options.id && !options.name) {
102
- return [new CommandError('Model ID or Model Name is required')];
56
+ if (!options.name) {
57
+ return [new CommandError('Model Name is required')];
103
58
  }
104
59
  return [];
105
60
  }