@solidxai/core 0.1.9-beta.1 → 0.1.9-beta.4

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 (520) hide show
  1. package/dist/commands/fixtures/fixtures-setup.command.d.ts +1 -1
  2. package/dist/commands/fixtures/fixtures-tear-down.command.d.ts +1 -1
  3. package/dist/commands/info.command.d.ts +3 -3
  4. package/dist/commands/ingest.command.d.ts +2 -2
  5. package/dist/commands/mcp.command.d.ts +1 -1
  6. package/dist/commands/refresh-model.command.d.ts +1 -1
  7. package/dist/commands/remove-fields.command.d.ts +1 -1
  8. package/dist/commands/run-tests.command.d.ts +1 -1
  9. package/dist/commands/seed.command.d.ts +1 -1
  10. package/dist/commands/test-data.command.d.ts +1 -1
  11. package/dist/controllers/action-metadata.controller.d.ts +1 -1
  12. package/dist/controllers/agent-event.controller.d.ts +3 -3
  13. package/dist/controllers/agent-session.controller.d.ts +3 -3
  14. package/dist/controllers/ai-interaction.controller.d.ts +1 -1
  15. package/dist/controllers/dashboard-layout.controller.d.ts +3 -3
  16. package/dist/controllers/dashboard-question.controller.d.ts +1 -1
  17. package/dist/controllers/dashboard.controller.d.ts +1 -1
  18. package/dist/controllers/export-template.controller.d.ts +2 -2
  19. package/dist/controllers/field-metadata.controller.d.ts +1 -1
  20. package/dist/controllers/google-authentication.controller.d.ts +1 -1
  21. package/dist/controllers/import-transaction.controller.d.ts +1 -1
  22. package/dist/controllers/locale.controller.d.ts +3 -3
  23. package/dist/controllers/media.controller.d.ts +3 -3
  24. package/dist/controllers/menu-item-metadata.controller.d.ts +2 -2
  25. package/dist/controllers/model-metadata.controller.d.ts +1 -1
  26. package/dist/controllers/mq-message-queue.controller.d.ts +1 -1
  27. package/dist/controllers/mq-message.controller.d.ts +1 -1
  28. package/dist/controllers/permission-metadata.controller.d.ts +1 -1
  29. package/dist/controllers/role-metadata.controller.d.ts +1 -1
  30. package/dist/controllers/scheduled-job.controller.d.ts +3 -3
  31. package/dist/controllers/service.controller.d.ts +4 -4
  32. package/dist/controllers/setting.controller.d.ts +1 -1
  33. package/dist/controllers/test-queue.controller.d.ts +1 -1
  34. package/dist/controllers/test.controller.d.ts +2 -2
  35. package/dist/controllers/user-view-metadata.controller.d.ts +2 -2
  36. package/dist/controllers/user.controller.d.ts +2 -2
  37. package/dist/controllers/view-metadata.controller.d.ts +2 -2
  38. package/dist/decorators/extension-user-creation-provider.decorator.d.ts +3 -0
  39. package/dist/decorators/extension-user-creation-provider.decorator.d.ts.map +1 -0
  40. package/dist/decorators/extension-user-creation-provider.decorator.js +7 -0
  41. package/dist/decorators/extension-user-creation-provider.decorator.js.map +1 -0
  42. package/dist/decorators/solid-password.decorator.d.ts +1 -1
  43. package/dist/dtos/create-dashboard-question.dto.d.ts +1 -1
  44. package/dist/dtos/create-dashboard.dto.d.ts +2 -2
  45. package/dist/dtos/create-field-metadata.dto.js +1 -2
  46. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  47. package/dist/dtos/create-import-transaction.dto.d.ts +1 -1
  48. package/dist/dtos/create-menu-item-metadata.dto.d.ts +1 -1
  49. package/dist/dtos/create-mq-message-queue.dto.d.ts +1 -1
  50. package/dist/dtos/create-permission-metadata.dto.d.ts +1 -1
  51. package/dist/dtos/create-role-metadata.dto.d.ts +3 -3
  52. package/dist/dtos/create-user.dto.d.ts +3 -2
  53. package/dist/dtos/create-user.dto.d.ts.map +1 -1
  54. package/dist/dtos/create-user.dto.js +8 -1
  55. package/dist/dtos/create-user.dto.js.map +1 -1
  56. package/dist/dtos/create-view-metadata.dto.d.ts +1 -1
  57. package/dist/dtos/dashboard-variable-selection-dynamic-query.dto.d.ts +1 -1
  58. package/dist/dtos/fetch-roles.dto.d.ts +1 -1
  59. package/dist/dtos/selection-dynamic-query.dto.d.ts +1 -1
  60. package/dist/dtos/solid-request-context.dto.d.ts +1 -1
  61. package/dist/dtos/sort-filter.dto.d.ts +1 -1
  62. package/dist/dtos/update-dashboard-question.dto.d.ts +1 -1
  63. package/dist/dtos/update-dashboard.dto.d.ts +2 -2
  64. package/dist/dtos/update-import-transaction.dto.d.ts +1 -1
  65. package/dist/dtos/update-menu-item-metadata.dto.d.ts +1 -1
  66. package/dist/dtos/update-mq-message-queue.dto.d.ts +1 -1
  67. package/dist/dtos/update-permission-metadata.dto.d.ts +1 -1
  68. package/dist/dtos/update-role-metadata.dto.d.ts +3 -3
  69. package/dist/dtos/update-user.dto.d.ts +3 -2
  70. package/dist/dtos/update-user.dto.d.ts.map +1 -1
  71. package/dist/dtos/update-user.dto.js +7 -1
  72. package/dist/dtos/update-user.dto.js.map +1 -1
  73. package/dist/dtos/update-view-metadata.dto.d.ts +1 -1
  74. package/dist/entities/action-metadata.entity.d.ts +4 -4
  75. package/dist/entities/agent-event.entity.d.ts +1 -1
  76. package/dist/entities/agent-session.entity.d.ts +1 -1
  77. package/dist/entities/ai-interaction.entity.d.ts +2 -2
  78. package/dist/entities/chatter-message-details.entity.d.ts +2 -2
  79. package/dist/entities/chatter-message.entity.d.ts +2 -2
  80. package/dist/entities/dashboard-layout.entity.d.ts +2 -2
  81. package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts +2 -2
  82. package/dist/entities/dashboard-question.entity.d.ts +3 -3
  83. package/dist/entities/dashboard-variable.entity.d.ts +2 -2
  84. package/dist/entities/dashboard.entity.d.ts +4 -4
  85. package/dist/entities/email-template.entity.d.ts +1 -1
  86. package/dist/entities/export-template.entity.d.ts +2 -2
  87. package/dist/entities/export-transaction.entity.d.ts +2 -2
  88. package/dist/entities/field-metadata.entity.d.ts +2 -2
  89. package/dist/entities/import-transaction-error-log.entity.d.ts +2 -2
  90. package/dist/entities/import-transaction.entity.d.ts +3 -3
  91. package/dist/entities/list-of-values.entity.d.ts +2 -2
  92. package/dist/entities/locale.entity.d.ts +1 -1
  93. package/dist/entities/media-storage-provider-metadata.entity.d.ts +1 -1
  94. package/dist/entities/media.entity.d.ts +4 -4
  95. package/dist/entities/menu-item-metadata.entity.d.ts +4 -4
  96. package/dist/entities/model-metadata.entity.d.ts +1 -1
  97. package/dist/entities/model-sequence.entity.d.ts +4 -4
  98. package/dist/entities/module-metadata.entity.d.ts +1 -1
  99. package/dist/entities/mq-message-queue.entity.d.ts +2 -2
  100. package/dist/entities/mq-message.entity.d.ts +2 -2
  101. package/dist/entities/permission-metadata.entity.d.ts +2 -2
  102. package/dist/entities/role-metadata.entity.d.ts +4 -4
  103. package/dist/entities/saved-filters.entity.d.ts +4 -4
  104. package/dist/entities/scheduled-job.entity.d.ts +1 -1
  105. package/dist/entities/security-rule.entity.d.ts +3 -3
  106. package/dist/entities/setting.entity.d.ts +2 -2
  107. package/dist/entities/sms-template.entity.d.ts +1 -1
  108. package/dist/entities/user-activity-history.entity.d.ts +2 -2
  109. package/dist/entities/user-api-key.entity.d.ts +1 -1
  110. package/dist/entities/user-view-metadata.entity.d.ts +3 -3
  111. package/dist/entities/user.entity.d.ts +4 -4
  112. package/dist/entities/view-metadata.entity.d.ts +4 -4
  113. package/dist/factories/mail.factory.d.ts +3 -3
  114. package/dist/factories/sms.factory.d.ts +3 -3
  115. package/dist/factories/whatsapp.factory.d.ts +3 -3
  116. package/dist/filters/http-exception.filter.d.ts +1 -1
  117. package/dist/guards/api-key.guard.d.ts +1 -1
  118. package/dist/helpers/error-mapper.service.d.ts +2 -2
  119. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.d.ts +1 -1
  120. package/dist/helpers/field-crud-managers/BooleanFieldCrudManager.d.ts +1 -1
  121. package/dist/helpers/field-crud-managers/ComputedFieldCrudManager.d.ts +2 -2
  122. package/dist/helpers/field-crud-managers/DateFieldCrudManager.d.ts +1 -1
  123. package/dist/helpers/field-crud-managers/DecimalFieldCrudManager.d.ts +1 -1
  124. package/dist/helpers/field-crud-managers/EmailFieldCrudManager.d.ts +1 -1
  125. package/dist/helpers/field-crud-managers/IntFieldCrudManager.d.ts +1 -1
  126. package/dist/helpers/field-crud-managers/JsonFieldCrudManager.d.ts +1 -1
  127. package/dist/helpers/field-crud-managers/LongTextFieldCrudManager.d.ts +1 -1
  128. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +1 -1
  129. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts +1 -1
  130. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +1 -1
  131. package/dist/helpers/field-crud-managers/NoOpsFieldCrudManager.d.ts +1 -1
  132. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +1 -1
  133. package/dist/helpers/field-crud-managers/PasswordFieldCrudManager.d.ts +2 -2
  134. package/dist/helpers/field-crud-managers/RichTextFieldCrudManager.d.ts +1 -1
  135. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.d.ts +2 -2
  136. package/dist/helpers/field-crud-managers/SelectionStaticFieldCrudManager.d.ts +2 -2
  137. package/dist/helpers/field-crud-managers/ShortTextFieldCrudManager.d.ts +1 -1
  138. package/dist/helpers/field-crud-managers/UUIDFieldCrudManager.d.ts +1 -1
  139. package/dist/helpers/model-metadata-helper.service.d.ts +1 -1
  140. package/dist/helpers/module-metadata-helper.service.d.ts +1 -1
  141. package/dist/helpers/solid-core-error-codes-provider.service.d.ts +1 -1
  142. package/dist/helpers/solid-registry.d.ts +11 -5
  143. package/dist/helpers/solid-registry.d.ts.map +1 -1
  144. package/dist/helpers/solid-registry.js +15 -2
  145. package/dist/helpers/solid-registry.js.map +1 -1
  146. package/dist/index.d.ts +1 -0
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +1 -0
  149. package/dist/index.js.map +1 -1
  150. package/dist/interfaces.d.ts +11 -3
  151. package/dist/interfaces.d.ts.map +1 -1
  152. package/dist/interfaces.js.map +1 -1
  153. package/dist/jobs/database/api-email-publisher-database.service.d.ts +4 -4
  154. package/dist/jobs/database/api-email-queue-options-database.d.ts +1 -1
  155. package/dist/jobs/database/api-email-subscriber-database.service.d.ts +7 -7
  156. package/dist/jobs/database/chatter-queue-publisher-database.service.d.ts +1 -1
  157. package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts +4 -4
  158. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.d.ts +5 -5
  159. package/dist/jobs/database/computed-field-evaluation-subscriber-database.service.d.ts +8 -8
  160. package/dist/jobs/database/generate-code-publisher-database.service.d.ts +1 -1
  161. package/dist/jobs/database/generate-code-subscriber-database.service.d.ts +4 -4
  162. package/dist/jobs/database/msg91-sms-publisher-database.service.d.ts +4 -4
  163. package/dist/jobs/database/msg91-sms-queue-database-options.d.ts +1 -1
  164. package/dist/jobs/database/msg91-sms-subscriber-database.service.d.ts +7 -7
  165. package/dist/jobs/database/msg91-whatsapp-publisher-database.service.d.ts +4 -4
  166. package/dist/jobs/database/msg91-whatsapp-queue-options-database.d.ts +1 -1
  167. package/dist/jobs/database/msg91-whatsapp-subscriber-database.service.d.ts +7 -7
  168. package/dist/jobs/database/otp-publisher-database.service.d.ts +4 -4
  169. package/dist/jobs/database/otp-queue-options-database.d.ts +1 -1
  170. package/dist/jobs/database/otp-subscriber-database.service.d.ts +7 -7
  171. package/dist/jobs/database/smtp-email-publisher-database.service.d.ts +4 -4
  172. package/dist/jobs/database/smtp-email-queue-options-database.d.ts +1 -1
  173. package/dist/jobs/database/smtp-email-subscriber-database.service.d.ts +7 -7
  174. package/dist/jobs/database/test-queue-publisher-database.service.d.ts +1 -1
  175. package/dist/jobs/database/test-queue-subscriber-database.service.d.ts +3 -3
  176. package/dist/jobs/database/three60-whatsapp-publisher-database.service.d.ts +4 -4
  177. package/dist/jobs/database/three60-whatsapp-queue-options-database.d.ts +1 -1
  178. package/dist/jobs/database/three60-whatsapp-subscriber-database.service.d.ts +7 -7
  179. package/dist/jobs/database/trigger-mcp-client-publisher-database.service.d.ts +4 -4
  180. package/dist/jobs/database/trigger-mcp-client-queue-options.d.ts +1 -1
  181. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +8 -8
  182. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  183. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +2 -2
  184. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  185. package/dist/jobs/database/twilio-sms-publisher-database.service.d.ts +4 -4
  186. package/dist/jobs/database/twilio-sms-queue-database-options.d.ts +1 -1
  187. package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts +7 -7
  188. package/dist/jobs/rabbitmq/api-email-publisher.service.d.ts +3 -3
  189. package/dist/jobs/rabbitmq/api-email-subscriber.service.d.ts +4 -4
  190. package/dist/jobs/rabbitmq/chatter-queue-publisher.service.d.ts +1 -1
  191. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts +3 -3
  192. package/dist/jobs/rabbitmq/computed-field-evaluation-publisher.service.d.ts +5 -5
  193. package/dist/jobs/rabbitmq/computed-field-evaluation-subscriber.service.d.ts +8 -8
  194. package/dist/jobs/rabbitmq/generate-code-publisher.service.d.ts +1 -1
  195. package/dist/jobs/rabbitmq/generate-code-subscriber.service.d.ts +7 -7
  196. package/dist/jobs/rabbitmq/msg91-otp-publisher.service.d.ts +3 -3
  197. package/dist/jobs/rabbitmq/msg91-otp-subscriber.service.d.ts +5 -5
  198. package/dist/jobs/rabbitmq/msg91-sms-publisher.service.d.ts +3 -3
  199. package/dist/jobs/rabbitmq/msg91-sms-subscriber.service.d.ts +5 -5
  200. package/dist/jobs/rabbitmq/msg91-whatsapp-publisher.service.d.ts +3 -3
  201. package/dist/jobs/rabbitmq/msg91-whatsapp-subscriber.service.d.ts +4 -4
  202. package/dist/jobs/rabbitmq/smtp-email-publisher.service.d.ts +3 -3
  203. package/dist/jobs/rabbitmq/smtp-email-subscriber.service.d.ts +4 -4
  204. package/dist/jobs/rabbitmq/test-queue-publisher.service.d.ts +1 -1
  205. package/dist/jobs/rabbitmq/test-queue-subscriber.service.d.ts +2 -2
  206. package/dist/jobs/rabbitmq/three60-whatsapp-publisher.service.d.ts +3 -3
  207. package/dist/jobs/rabbitmq/three60-whatsapp-subscriber.service.d.ts +5 -5
  208. package/dist/jobs/rabbitmq/trigger-mcp-client-publisher.service.d.ts +3 -3
  209. package/dist/jobs/rabbitmq/trigger-mcp-client-subscriber.service.d.ts +6 -6
  210. package/dist/jobs/rabbitmq/twilio-sms-publisher.service.d.ts +3 -3
  211. package/dist/jobs/rabbitmq/twilio-sms-subscriber.service.d.ts +6 -6
  212. package/dist/jobs/redis/api-email-publisher-redis.service.d.ts +1 -1
  213. package/dist/jobs/redis/api-email-subscriber-redis.service.d.ts +2 -2
  214. package/dist/jobs/redis/chatter-queue-publisher-redis.service.d.ts +1 -1
  215. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts +2 -2
  216. package/dist/jobs/redis/computed-field-evaluation-publisher-redis.service.d.ts +2 -2
  217. package/dist/jobs/redis/computed-field-evaluation-subscriber-redis.service.d.ts +4 -4
  218. package/dist/jobs/redis/generate-code-publisher-redis.service.d.ts +1 -1
  219. package/dist/jobs/redis/generate-code-subscriber-redis.service.d.ts +3 -3
  220. package/dist/jobs/redis/msg91-otp-publisher-redis.service.d.ts +1 -1
  221. package/dist/jobs/redis/msg91-otp-subscriber-redis.service.d.ts +3 -3
  222. package/dist/jobs/redis/msg91-sms-publisher-redis.service.d.ts +1 -1
  223. package/dist/jobs/redis/msg91-sms-subscriber-redis.service.d.ts +3 -3
  224. package/dist/jobs/redis/msg91-whatsapp-publisher-redis.service.d.ts +1 -1
  225. package/dist/jobs/redis/msg91-whatsapp-subscriber-redis.service.d.ts +2 -2
  226. package/dist/jobs/redis/smtp-email-publisher-redis.service.d.ts +1 -1
  227. package/dist/jobs/redis/smtp-email-subscriber-redis.service.d.ts +2 -2
  228. package/dist/jobs/redis/test-queue-publisher-redis.service.d.ts +1 -1
  229. package/dist/jobs/redis/test-queue-subscriber-redis.service.d.ts +2 -2
  230. package/dist/jobs/redis/three60-whatsapp-publisher-redis.service.d.ts +1 -1
  231. package/dist/jobs/redis/three60-whatsapp-subscriber-redis.service.d.ts +2 -2
  232. package/dist/jobs/redis/trigger-mcp-client-publisher-redis.service.d.ts +1 -1
  233. package/dist/jobs/redis/trigger-mcp-client-subscriber-redis.service.d.ts +2 -2
  234. package/dist/jobs/redis/twilio-sms-publisher-redis.service.d.ts +1 -1
  235. package/dist/jobs/redis/twilio-sms-subscriber-redis.service.d.ts +3 -3
  236. package/dist/mappers/dashboard-mapper.d.ts +1 -1
  237. package/dist/mappers/list-of-values-mapper.d.ts +1 -1
  238. package/dist/repository/action-metadata.repository.d.ts +2 -2
  239. package/dist/repository/agent-event.repository.d.ts +2 -2
  240. package/dist/repository/agent-session.repository.d.ts +2 -2
  241. package/dist/repository/ai-interaction.repository.d.ts +2 -2
  242. package/dist/repository/chatter-message-details.repository.d.ts +2 -2
  243. package/dist/repository/chatter-message.repository.d.ts +2 -2
  244. package/dist/repository/dashboard-layout.repository.d.ts +2 -2
  245. package/dist/repository/dashboard-question-sql-dataset-config.repository.d.ts +2 -2
  246. package/dist/repository/dashboard-question-sql-dataset-config.repository.d.ts.map +1 -1
  247. package/dist/repository/dashboard-question-sql-dataset-config.repository.js +2 -2
  248. package/dist/repository/dashboard-question-sql-dataset-config.repository.js.map +1 -1
  249. package/dist/repository/dashboard-question.repository.d.ts +2 -2
  250. package/dist/repository/dashboard-question.repository.d.ts.map +1 -1
  251. package/dist/repository/dashboard-question.repository.js +2 -2
  252. package/dist/repository/dashboard-question.repository.js.map +1 -1
  253. package/dist/repository/dashboard-variable.repository.d.ts +2 -2
  254. package/dist/repository/dashboard-variable.repository.d.ts.map +1 -1
  255. package/dist/repository/dashboard-variable.repository.js +2 -2
  256. package/dist/repository/dashboard-variable.repository.js.map +1 -1
  257. package/dist/repository/dashboard.repository.d.ts +2 -2
  258. package/dist/repository/email-template.repository.d.ts +2 -2
  259. package/dist/repository/email-template.repository.d.ts.map +1 -1
  260. package/dist/repository/email-template.repository.js +2 -2
  261. package/dist/repository/email-template.repository.js.map +1 -1
  262. package/dist/repository/export-template.repository.d.ts +2 -2
  263. package/dist/repository/export-template.repository.d.ts.map +1 -1
  264. package/dist/repository/export-template.repository.js +2 -2
  265. package/dist/repository/export-template.repository.js.map +1 -1
  266. package/dist/repository/export-transaction.repository.d.ts +2 -2
  267. package/dist/repository/export-transaction.repository.d.ts.map +1 -1
  268. package/dist/repository/export-transaction.repository.js +2 -2
  269. package/dist/repository/export-transaction.repository.js.map +1 -1
  270. package/dist/repository/field-metadata.repository.d.ts +1 -1
  271. package/dist/repository/import-transaction-error-log.repository.d.ts +2 -2
  272. package/dist/repository/import-transaction-error-log.repository.d.ts.map +1 -1
  273. package/dist/repository/import-transaction-error-log.repository.js +2 -2
  274. package/dist/repository/import-transaction-error-log.repository.js.map +1 -1
  275. package/dist/repository/import-transaction.repository.d.ts +2 -2
  276. package/dist/repository/import-transaction.repository.d.ts.map +1 -1
  277. package/dist/repository/import-transaction.repository.js +2 -2
  278. package/dist/repository/import-transaction.repository.js.map +1 -1
  279. package/dist/repository/list-of-values.repository.d.ts +2 -2
  280. package/dist/repository/list-of-values.repository.d.ts.map +1 -1
  281. package/dist/repository/list-of-values.repository.js +2 -2
  282. package/dist/repository/list-of-values.repository.js.map +1 -1
  283. package/dist/repository/locale.repository.d.ts +2 -2
  284. package/dist/repository/locale.repository.d.ts.map +1 -1
  285. package/dist/repository/locale.repository.js +2 -2
  286. package/dist/repository/locale.repository.js.map +1 -1
  287. package/dist/repository/media-storage-provider-metadata.repository.d.ts +1 -1
  288. package/dist/repository/media.repository.d.ts +2 -2
  289. package/dist/repository/menu-item-metadata.repository.d.ts +2 -2
  290. package/dist/repository/menu-item-metadata.repository.d.ts.map +1 -1
  291. package/dist/repository/menu-item-metadata.repository.js +2 -2
  292. package/dist/repository/menu-item-metadata.repository.js.map +1 -1
  293. package/dist/repository/model-metadata.repository.d.ts +1 -1
  294. package/dist/repository/model-metadata.repository.d.ts.map +1 -1
  295. package/dist/repository/model-metadata.repository.js +2 -2
  296. package/dist/repository/model-metadata.repository.js.map +1 -1
  297. package/dist/repository/model-sequence.repository.d.ts +3 -3
  298. package/dist/repository/module-metadata.repository.d.ts +1 -1
  299. package/dist/repository/module-metadata.repository.d.ts.map +1 -1
  300. package/dist/repository/module-metadata.repository.js +2 -2
  301. package/dist/repository/module-metadata.repository.js.map +1 -1
  302. package/dist/repository/mq-message-queue.repository.d.ts +2 -2
  303. package/dist/repository/mq-message-queue.repository.d.ts.map +1 -1
  304. package/dist/repository/mq-message-queue.repository.js +2 -2
  305. package/dist/repository/mq-message-queue.repository.js.map +1 -1
  306. package/dist/repository/mq-message.repository.d.ts +2 -2
  307. package/dist/repository/mq-message.repository.d.ts.map +1 -1
  308. package/dist/repository/mq-message.repository.js +2 -2
  309. package/dist/repository/mq-message.repository.js.map +1 -1
  310. package/dist/repository/permission-metadata.repository.d.ts +2 -2
  311. package/dist/repository/permission-metadata.repository.d.ts.map +1 -1
  312. package/dist/repository/permission-metadata.repository.js +2 -2
  313. package/dist/repository/permission-metadata.repository.js.map +1 -1
  314. package/dist/repository/role-metadata.repository.d.ts +2 -2
  315. package/dist/repository/role-metadata.repository.d.ts.map +1 -1
  316. package/dist/repository/role-metadata.repository.js +2 -2
  317. package/dist/repository/role-metadata.repository.js.map +1 -1
  318. package/dist/repository/saved-filters.repository.d.ts +2 -2
  319. package/dist/repository/scheduled-job.repository.d.ts +3 -3
  320. package/dist/repository/security-rule.repository.d.ts +7 -7
  321. package/dist/repository/setting.repository.d.ts +2 -2
  322. package/dist/repository/setting.repository.d.ts.map +1 -1
  323. package/dist/repository/setting.repository.js +2 -2
  324. package/dist/repository/setting.repository.js.map +1 -1
  325. package/dist/repository/sms-template.repository.d.ts +2 -2
  326. package/dist/repository/sms-template.repository.d.ts.map +1 -1
  327. package/dist/repository/sms-template.repository.js +2 -2
  328. package/dist/repository/sms-template.repository.js.map +1 -1
  329. package/dist/repository/solid-base.repository.d.ts +2 -2
  330. package/dist/repository/user-activity-history.repository.d.ts +2 -2
  331. package/dist/repository/user-activity-history.repository.d.ts.map +1 -1
  332. package/dist/repository/user-activity-history.repository.js +2 -2
  333. package/dist/repository/user-activity-history.repository.js.map +1 -1
  334. package/dist/repository/user-api-key.repository.d.ts +2 -2
  335. package/dist/repository/user-view-metadata.repository.d.ts +2 -2
  336. package/dist/repository/user-view-metadata.repository.d.ts.map +1 -1
  337. package/dist/repository/user-view-metadata.repository.js +2 -2
  338. package/dist/repository/user-view-metadata.repository.js.map +1 -1
  339. package/dist/repository/user.repository.d.ts +2 -2
  340. package/dist/repository/view-metadata.repository.d.ts +2 -2
  341. package/dist/seeders/module-metadata-seeder.service.d.ts +17 -14
  342. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  343. package/dist/seeders/module-metadata-seeder.service.js +65 -38
  344. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  345. package/dist/seeders/module-test-data.service.d.ts +1 -1
  346. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  347. package/dist/seeders/module-test-data.service.js +1 -8
  348. package/dist/seeders/module-test-data.service.js.map +1 -1
  349. package/dist/seeders/permission-metadata-seeder.service.d.ts +2 -2
  350. package/dist/seeders/seed-data/solid-core-metadata.json +7 -1
  351. package/dist/seeders/system-fields-seeder.service.d.ts +3 -3
  352. package/dist/services/action-metadata.service.d.ts +2 -2
  353. package/dist/services/agent-event.service.d.ts +2 -2
  354. package/dist/services/agent-session.service.d.ts +2 -2
  355. package/dist/services/ai-interaction.service.d.ts +4 -4
  356. package/dist/services/api-key.service.d.ts +6 -6
  357. package/dist/services/authentication.service.d.ts +10 -6
  358. package/dist/services/authentication.service.d.ts.map +1 -1
  359. package/dist/services/authentication.service.js +25 -21
  360. package/dist/services/authentication.service.js.map +1 -1
  361. package/dist/services/chatter-message-details.service.d.ts +2 -2
  362. package/dist/services/chatter-message.service.d.ts +7 -7
  363. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts +3 -3
  364. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts +3 -3
  365. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.d.ts +2 -2
  366. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +3 -3
  367. package/dist/services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service.d.ts +2 -2
  368. package/dist/services/crud-helper.service.d.ts +1 -1
  369. package/dist/services/crud.service.d.ts +4 -1
  370. package/dist/services/crud.service.d.ts.map +1 -1
  371. package/dist/services/crud.service.js +52 -3
  372. package/dist/services/crud.service.js.map +1 -1
  373. package/dist/services/dashboard-layout.service.d.ts +4 -4
  374. package/dist/services/dashboard-question-sql-dataset-config.service.d.ts +2 -2
  375. package/dist/services/dashboard-question.service.d.ts +3 -3
  376. package/dist/services/dashboard-question.service.js.map +1 -1
  377. package/dist/services/dashboard-variable.service.d.ts +2 -2
  378. package/dist/services/dashboard.service.d.ts +7 -7
  379. package/dist/services/email-template.service.d.ts +1 -1
  380. package/dist/services/export-template.service.d.ts +5 -5
  381. package/dist/services/export-transaction.service.d.ts +7 -7
  382. package/dist/services/field-metadata.service.d.ts +5 -5
  383. package/dist/services/fixtures.service.d.ts +1 -1
  384. package/dist/services/genai/mcp-handlers/mcp-handler-factory.service.d.ts +1 -1
  385. package/dist/services/genai/mcp-handlers/solid-add-question-to-dashboard-mcp-handler.service.d.ts +1 -1
  386. package/dist/services/genai/mcp-handlers/solid-add-variable-to-dashboard-mcp-handler.service.d.ts +2 -2
  387. package/dist/services/genai/mcp-handlers/solid-create-dashboard-mcp-handler.service.d.ts +1 -1
  388. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-mcp-handler.service.d.ts +1 -1
  389. package/dist/services/genai/mcp-handlers/solid-create-dashboard-question-sql-dataset-config-mcp-handler.service.d.ts +1 -1
  390. package/dist/services/genai/mcp-handlers/solid-create-dashboard-widget-mcp-handler.service.d.ts +1 -1
  391. package/dist/services/import-transaction-error-log.service.d.ts +2 -2
  392. package/dist/services/import-transaction.service.d.ts +6 -6
  393. package/dist/services/list-of-values.service.d.ts +4 -4
  394. package/dist/services/locale.service.d.ts +4 -4
  395. package/dist/services/mail/elastic-email.service.d.ts +1 -1
  396. package/dist/services/mail/smtp-email.service.d.ts +1 -1
  397. package/dist/services/media-storage-provider-metadata.service.d.ts +1 -1
  398. package/dist/services/media.service.d.ts +8 -8
  399. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +5 -5
  400. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +5 -5
  401. package/dist/services/menu-item-metadata.service.d.ts +4 -4
  402. package/dist/services/model-metadata.service.d.ts +4 -4
  403. package/dist/services/model-sequence.service.d.ts +1 -1
  404. package/dist/services/module-metadata.service.d.ts +4 -4
  405. package/dist/services/mq-message-queue.service.d.ts +2 -2
  406. package/dist/services/mq-message.service.d.ts +2 -2
  407. package/dist/services/permission-metadata.service.d.ts +2 -2
  408. package/dist/services/question-data-providers/chartjs-sql-data-provider.service.d.ts +2 -2
  409. package/dist/services/question-data-providers/helpers.d.ts +1 -1
  410. package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.d.ts +2 -2
  411. package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.d.ts +2 -2
  412. package/dist/services/queues/publisher-factory.service.d.ts +1 -1
  413. package/dist/services/request-context.service.d.ts +2 -2
  414. package/dist/services/role-metadata.service.d.ts +3 -3
  415. package/dist/services/saved-filters.service.d.ts +2 -2
  416. package/dist/services/scheduled-job.service.d.ts +3 -3
  417. package/dist/services/scheduled-jobs/scheduled-job.interface.d.ts +1 -1
  418. package/dist/services/scheduled-jobs/scheduler.interface.d.ts +1 -1
  419. package/dist/services/scheduled-jobs/scheduler.service.d.ts +3 -3
  420. package/dist/services/security-rule.service.d.ts +3 -3
  421. package/dist/services/security-rule.service.d.ts.map +1 -1
  422. package/dist/services/security-rule.service.js +3 -3
  423. package/dist/services/security-rule.service.js.map +1 -1
  424. package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.d.ts +1 -1
  425. package/dist/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.d.ts +1 -1
  426. package/dist/services/selection-providers/list-of-models-selection-provider.service.d.ts +1 -1
  427. package/dist/services/selection-providers/list-of-scheduled-jobs-selection-provider.service.d.ts +1 -1
  428. package/dist/services/setting.service.d.ts +5 -5
  429. package/dist/services/settings/default-settings-provider.service.d.ts +1 -1
  430. package/dist/services/short-url/tiny-url.service.d.ts +1 -1
  431. package/dist/services/sms/Msg91BaseSMSService.d.ts +1 -1
  432. package/dist/services/sms/Msg91OTPService.d.ts +1 -1
  433. package/dist/services/sms/Msg91SMSService.d.ts +1 -1
  434. package/dist/services/sms/TwilioSMSService.d.ts +1 -1
  435. package/dist/services/sms-template.service.d.ts +1 -1
  436. package/dist/services/solid-introspect.service.d.ts +9 -8
  437. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  438. package/dist/services/solid-introspect.service.js +11 -0
  439. package/dist/services/solid-introspect.service.js.map +1 -1
  440. package/dist/services/user-activity-history.service.d.ts +3 -3
  441. package/dist/services/user-view-metadata.service.d.ts +4 -4
  442. package/dist/services/user.service.d.ts +3 -3
  443. package/dist/services/view-metadata.service.d.ts +4 -4
  444. package/dist/services/whatsapp/Msg91WhatsappService.d.ts +1 -1
  445. package/dist/services/whatsapp/Three60WhatsappService.d.ts +1 -1
  446. package/dist/subscribers/audit.subscriber.d.ts +4 -4
  447. package/dist/subscribers/computed-entity-field.subscriber.d.ts +2 -2
  448. package/dist/subscribers/created-by-updated-by.subscriber.d.ts +1 -1
  449. package/dist/subscribers/dashboard-question-sql-dataset-config.subscriber.d.ts +3 -3
  450. package/dist/subscribers/dashboard-question.subscriber.d.ts +3 -3
  451. package/dist/subscribers/dashboard-variable.subscriber.d.ts +3 -3
  452. package/dist/subscribers/dashboard.subscriber.d.ts +3 -3
  453. package/dist/subscribers/list-of-values.subscriber.d.ts +3 -3
  454. package/dist/subscribers/model-metadata.subscriber.d.ts +1 -1
  455. package/dist/subscribers/scheduled-job.subscriber.d.ts +3 -3
  456. package/dist/subscribers/security-rule.subscriber.d.ts +3 -3
  457. package/dist/subscribers/view-metadata.subscriber.d.ts +2 -2
  458. package/dist/testing/contracts/testing-metadata.types.d.ts +1 -0
  459. package/dist/testing/contracts/testing-metadata.types.d.ts.map +1 -1
  460. package/dist/testing/contracts/testing-metadata.types.js.map +1 -1
  461. package/dist/testing/steps/ui/assertions.step.d.ts.map +1 -1
  462. package/dist/testing/steps/ui/assertions.step.js +8 -0
  463. package/dist/testing/steps/ui/assertions.step.js.map +1 -1
  464. package/dist/testing/steps/ui/form.step.d.ts.map +1 -1
  465. package/dist/testing/steps/ui/form.step.js +49 -0
  466. package/dist/testing/steps/ui/form.step.js.map +1 -1
  467. package/dist-tests/api/authenticate.spec.js +119 -0
  468. package/dist-tests/api/authenticate.spec.js.map +1 -0
  469. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
  470. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
  471. package/dist-tests/api/ping.spec.js +21 -0
  472. package/dist-tests/api/ping.spec.js.map +1 -0
  473. package/dist-tests/helpers/auth.js +41 -0
  474. package/dist-tests/helpers/auth.js.map +1 -0
  475. package/dist-tests/helpers/env.js +11 -0
  476. package/dist-tests/helpers/env.js.map +1 -0
  477. package/package.json +7 -6
  478. package/src/decorators/extension-user-creation-provider.decorator.ts +5 -0
  479. package/src/dtos/create-field-metadata.dto.ts +1 -1
  480. package/src/dtos/create-user.dto.ts +4 -0
  481. package/src/dtos/update-user.dto.ts +4 -0
  482. package/src/helpers/solid-registry.ts +19 -1
  483. package/src/index.ts +1 -0
  484. package/src/interfaces.ts +9 -0
  485. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
  486. package/src/repository/dashboard-question-sql-dataset-config.repository.ts +1 -1
  487. package/src/repository/dashboard-question.repository.ts +1 -1
  488. package/src/repository/dashboard-variable.repository.ts +1 -1
  489. package/src/repository/email-template.repository.ts +1 -1
  490. package/src/repository/export-template.repository.ts +2 -1
  491. package/src/repository/export-transaction.repository.ts +1 -1
  492. package/src/repository/import-transaction-error-log.repository.ts +1 -1
  493. package/src/repository/import-transaction.repository.ts +1 -1
  494. package/src/repository/list-of-values.repository.ts +1 -1
  495. package/src/repository/locale.repository.ts +1 -1
  496. package/src/repository/menu-item-metadata.repository.ts +1 -1
  497. package/src/repository/model-metadata.repository.ts +1 -1
  498. package/src/repository/module-metadata.repository.ts +1 -1
  499. package/src/repository/mq-message-queue.repository.ts +2 -1
  500. package/src/repository/mq-message.repository.ts +1 -1
  501. package/src/repository/permission-metadata.repository.ts +1 -1
  502. package/src/repository/role-metadata.repository.ts +1 -1
  503. package/src/repository/setting.repository.ts +1 -1
  504. package/src/repository/sms-template.repository.ts +1 -1
  505. package/src/repository/user-activity-history.repository.ts +1 -1
  506. package/src/repository/user-view-metadata.repository.ts +1 -1
  507. package/src/seeders/module-metadata-seeder.service.ts +50 -25
  508. package/src/seeders/module-test-data.service.ts +1 -8
  509. package/src/seeders/seed-data/solid-core-metadata.json +7 -1
  510. package/src/services/authentication.service.ts +28 -31
  511. package/src/services/crud.service.ts +22 -2
  512. package/src/services/dashboard-question.service.ts +1 -1
  513. package/src/services/security-rule.service.ts +1 -1
  514. package/src/services/solid-introspect.service.ts +13 -0
  515. package/src/testing/contracts/testing-metadata.types.ts +1 -0
  516. package/src/testing/steps/ui/assertions.step.ts +9 -0
  517. package/src/testing/steps/ui/form.step.ts +19 -0
  518. package/tsconfig.json +3 -0
  519. package/.claude/settings.local.json +0 -15
  520. package/src/services/1.js +0 -6
@@ -1,6 +1,6 @@
1
- import { ListOfValues } from 'src/entities/list-of-values.entity';
2
- import { ModuleMetadataHelperService } from "src/helpers/module-metadata-helper.service";
3
- import { ListOfValuesService } from 'src/services/list-of-values.service';
1
+ import { ListOfValues } from '../entities/list-of-values.entity';
2
+ import { ModuleMetadataHelperService } from "../helpers/module-metadata-helper.service";
3
+ import { ListOfValuesService } from '../services/list-of-values.service';
4
4
  import { DataSource, EntitySubscriberInterface, InsertEvent, UpdateEvent } from "typeorm";
5
5
  export declare class ListOfValuesSubscriber implements EntitySubscriberInterface<ListOfValues> {
6
6
  private readonly dataSource;
@@ -1,4 +1,4 @@
1
- import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
1
+ import { ModelMetadataHelperService } from '../helpers/model-metadata-helper.service';
2
2
  import { DataSource, EntitySubscriberInterface, InsertEvent } from 'typeorm';
3
3
  import { ModelMetadata } from '../entities/model-metadata.entity';
4
4
  export declare class ModelMetadataSubscriber implements EntitySubscriberInterface<ModelMetadata> {
@@ -1,6 +1,6 @@
1
- import { ScheduledJob } from "src/entities/scheduled-job.entity";
2
- import { ModuleMetadataHelperService } from "src/helpers/module-metadata-helper.service";
3
- import { ScheduledJobRepository } from "src/repository/scheduled-job.repository";
1
+ import { ScheduledJob } from "../entities/scheduled-job.entity";
2
+ import { ModuleMetadataHelperService } from "../helpers/module-metadata-helper.service";
3
+ import { ScheduledJobRepository } from "../repository/scheduled-job.repository";
4
4
  import { DataSource, EntitySubscriberInterface, InsertEvent, RemoveEvent, UpdateEvent } from "typeorm";
5
5
  export declare class ScheduledJobSubscriber implements EntitySubscriberInterface<ScheduledJob> {
6
6
  private readonly dataSource;
@@ -1,6 +1,6 @@
1
- import { SecurityRule } from 'src/entities/security-rule.entity';
2
- import { ModuleMetadataHelperService } from "src/helpers/module-metadata-helper.service";
3
- import { SecurityRuleRepository } from 'src/repository/security-rule.repository';
1
+ import { SecurityRule } from '../entities/security-rule.entity';
2
+ import { ModuleMetadataHelperService } from "../helpers/module-metadata-helper.service";
3
+ import { SecurityRuleRepository } from '../repository/security-rule.repository';
4
4
  import { DataSource, EntitySubscriberInterface, InsertEvent, UpdateEvent } from "typeorm";
5
5
  export declare class SecurityRuleSubscriber implements EntitySubscriberInterface<SecurityRule> {
6
6
  private readonly dataSource;
@@ -1,5 +1,5 @@
1
- import { ViewMetadata } from "src/entities/view-metadata.entity";
2
- import { ModuleMetadataHelperService } from "src/helpers/module-metadata-helper.service";
1
+ import { ViewMetadata } from "../entities/view-metadata.entity";
2
+ import { ModuleMetadataHelperService } from "../helpers/module-metadata-helper.service";
3
3
  import { DataSource, EntitySubscriberInterface, UpdateEvent } from "typeorm";
4
4
  export declare class ViewMetadataSubsciber implements EntitySubscriberInterface<ViewMetadata> {
5
5
  private readonly dataSource;
@@ -15,6 +15,7 @@ export interface TestingUserSpec {
15
15
  fullName?: string;
16
16
  mobile?: string;
17
17
  roles?: string[];
18
+ [key: string]: any;
18
19
  }
19
20
  export interface TestingMetadata {
20
21
  testing: {
@@ -1 +1 @@
1
- {"version":3,"file":"testing-metadata.types.d.ts","sourceRoot":"","sources":["../../../src/testing/contracts/testing-metadata.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;QAC1B,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;QAC1B,IAAI,CAAC,EAAE,iBAAiB,EAAE,CAAC;QAC3B,SAAS,EAAE,YAAY,EAAE,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAKD,MAAM,MAAM,SAAS,GACjB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,GAC3B;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GACf,MAAM,CAAC;AAEX,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"testing-metadata.types.d.ts","sourceRoot":"","sources":["../../../src/testing/contracts/testing-metadata.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;QAC1B,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;QAC1B,IAAI,CAAC,EAAE,iBAAiB,EAAE,CAAC;QAC3B,SAAS,EAAE,YAAY,EAAE,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAKD,MAAM,MAAM,SAAS,GACjB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,GAC3B;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GACf,MAAM,CAAC;AAEX,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"testing-metadata.types.js","sourceRoot":"","sources":["../../../src/testing/contracts/testing-metadata.types.ts"],"names":[],"mappings":"","sourcesContent":["export type ScenarioType = \"api\" | \"ui\" | \"mixed\";\n\nexport interface TestingDataRecord {\n modelUserKey: string;\n recUserKeyValue: string;\n data: Record<string, any>;\n}\n\nexport interface TestingRoleSpec {\n name: string;\n permissions?: string[];\n}\n\nexport interface TestingUserSpec {\n username: string;\n email: string;\n password: string;\n fullName?: string;\n mobile?: string;\n roles?: string[];\n}\n\nexport interface TestingMetadata {\n testing: {\n specs?: string[];\n roles?: TestingRoleSpec[];\n users?: TestingUserSpec[];\n data?: TestingDataRecord[];\n scenarios: ScenarioSpec[];\n };\n}\n\nexport interface ScenarioSpec {\n id: string;\n name?: string;\n type: ScenarioType;\n params?: Record<string, any>;\n tags?: string[];\n timeoutMs?: number;\n retries?: number;\n steps: StepBlock[];\n}\n\n/**\n * A step can be written in a phase block (Given/When/Then/And) or as a flat op step.\n */\nexport type StepBlock =\n | { given: OpStep }\n | { when: OpStep }\n | { then: OpStep | OpStep[] }\n | { and: OpStep }\n | OpStep;\n\nexport interface OpStep {\n op: string;\n with?: Record<string, any>;\n saveAs?: string;\n name?: string;\n // spec is used by op \"test.spec\" to point to a registered custom spec implementation.\n spec?: string;\n timeoutMs?: number;\n}\n"]}
1
+ {"version":3,"file":"testing-metadata.types.js","sourceRoot":"","sources":["../../../src/testing/contracts/testing-metadata.types.ts"],"names":[],"mappings":"","sourcesContent":["export type ScenarioType = \"api\" | \"ui\" | \"mixed\";\n\nexport interface TestingDataRecord {\n modelUserKey: string;\n recUserKeyValue: string;\n data: Record<string, any>;\n}\n\nexport interface TestingRoleSpec {\n name: string;\n permissions?: string[];\n}\n\nexport interface TestingUserSpec {\n username: string;\n email: string;\n password: string;\n fullName?: string;\n mobile?: string;\n roles?: string[];\n [key: string]: any;\n}\n\nexport interface TestingMetadata {\n testing: {\n specs?: string[];\n roles?: TestingRoleSpec[];\n users?: TestingUserSpec[];\n data?: TestingDataRecord[];\n scenarios: ScenarioSpec[];\n };\n}\n\nexport interface ScenarioSpec {\n id: string;\n name?: string;\n type: ScenarioType;\n params?: Record<string, any>;\n tags?: string[];\n timeoutMs?: number;\n retries?: number;\n steps: StepBlock[];\n}\n\n/**\n * A step can be written in a phase block (Given/When/Then/And) or as a flat op step.\n */\nexport type StepBlock =\n | { given: OpStep }\n | { when: OpStep }\n | { then: OpStep | OpStep[] }\n | { and: OpStep }\n | OpStep;\n\nexport interface OpStep {\n op: string;\n with?: Record<string, any>;\n saveAs?: string;\n name?: string;\n // spec is used by op \"test.spec\" to point to a registered custom spec implementation.\n spec?: string;\n timeoutMs?: number;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"assertions.step.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/ui/assertions.step.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAYxD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAuCnE"}
1
+ {"version":3,"file":"assertions.step.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/ui/assertions.step.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAYxD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAgDnE"}
@@ -16,6 +16,14 @@ function registerAssertionSteps(registry) {
16
16
  }
17
17
  await page.waitForSelector(input.selector, { state: "visible" });
18
18
  });
19
+ registry.register("ui.expectHidden", async (ctx, step) => {
20
+ const page = requirePage(ctx, "ui.expectHidden");
21
+ const input = (step.with ?? {});
22
+ if (!input.selector) {
23
+ throw new Error('Missing "selector" in step.with for op "ui.expectHidden"');
24
+ }
25
+ await page.waitForSelector(input.selector, { state: "hidden" });
26
+ });
19
27
  registry.register("ui.expectText", async (ctx, step) => {
20
28
  const page = requirePage(ctx, "ui.expectText");
21
29
  const input = (step.with ?? {});
@@ -1 +1 @@
1
- {"version":3,"file":"assertions.step.js","sourceRoot":"","sources":["../../../../src/testing/steps/ui/assertions.step.ts"],"names":[],"mappings":";;AAcA,wDAuCC;AA9CD,SAAS,WAAW,CAAC,GAAgB,EAAE,EAAU;IAC/C,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAgB,sBAAsB,CAAC,QAAsB;IAC3D,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAgB,EAAE,IAAY,EAAE,EAAE;QAC7E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAiB,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,EAAE,GAAgB,EAAE,IAAY,EAAE,EAAE;QAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAoB,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC;QAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CACb,2BAA2B,KAAK,CAAC,MAAM,cAAc,IAAI,GAAG,CAC7D,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,6BAA6B,KAAK,CAAC,QAAQ,cAAc,IAAI,GAAG,CACjE,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { TestContext } from \"../../contracts/runtime-context.types\";\nimport type { OpStep } from \"../../contracts/testing-metadata.types\";\nimport { StepRegistry } from \"../../core/step-registry\";\n\ntype VisibleInput = { selector: string };\ntype ExpectTextInput = { selector: string; equals?: string; contains?: string };\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 registerAssertionSteps(registry: StepRegistry): void {\n registry.register(\"ui.expectVisible\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.expectVisible\");\n const input = (step.with ?? {}) as VisibleInput;\n if (!input.selector) {\n throw new Error('Missing \"selector\" in step.with for op \"ui.expectVisible\"');\n }\n await page.waitForSelector(input.selector, { state: \"visible\" });\n });\n\n registry.register(\"ui.expectText\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.expectText\");\n const input = (step.with ?? {}) as ExpectTextInput;\n if (!input.selector) {\n throw new Error('Missing \"selector\" in step.with for op \"ui.expectText\"');\n }\n\n const text = await page.locator(input.selector).innerText();\n if (input.equals !== undefined) {\n if (text !== input.equals) {\n throw new Error(\n `Expected text to equal \"${input.equals}\" but got \"${text}\"`,\n );\n }\n return;\n }\n if (input.contains !== undefined) {\n if (!text.includes(input.contains)) {\n throw new Error(\n `Expected text to contain \"${input.contains}\" but got \"${text}\"`,\n );\n }\n return;\n }\n\n throw new Error(\n 'Missing \"equals\" or \"contains\" in step.with for op \"ui.expectText\"',\n );\n });\n}\n"]}
1
+ {"version":3,"file":"assertions.step.js","sourceRoot":"","sources":["../../../../src/testing/steps/ui/assertions.step.ts"],"names":[],"mappings":";;AAcA,wDAgDC;AAvDD,SAAS,WAAW,CAAC,GAAgB,EAAE,EAAU;IAC/C,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAgB,sBAAsB,CAAC,QAAsB;IAC3D,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAgB,EAAE,IAAY,EAAE,EAAE;QAC7E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAiB,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,KAAK,EAAE,GAAgB,EAAE,IAAY,EAAE,EAAE;QAC5E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAiB,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,EAAE,GAAgB,EAAE,IAAY,EAAE,EAAE;QAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAoB,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC;QAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CACb,2BAA2B,KAAK,CAAC,MAAM,cAAc,IAAI,GAAG,CAC7D,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,6BAA6B,KAAK,CAAC,QAAQ,cAAc,IAAI,GAAG,CACjE,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { TestContext } from \"../../contracts/runtime-context.types\";\nimport type { OpStep } from \"../../contracts/testing-metadata.types\";\nimport { StepRegistry } from \"../../core/step-registry\";\n\ntype VisibleInput = { selector: string };\ntype ExpectTextInput = { selector: string; equals?: string; contains?: string };\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 registerAssertionSteps(registry: StepRegistry): void {\n registry.register(\"ui.expectVisible\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.expectVisible\");\n const input = (step.with ?? {}) as VisibleInput;\n if (!input.selector) {\n throw new Error('Missing \"selector\" in step.with for op \"ui.expectVisible\"');\n }\n await page.waitForSelector(input.selector, { state: \"visible\" });\n });\n\n registry.register(\"ui.expectHidden\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.expectHidden\");\n const input = (step.with ?? {}) as VisibleInput;\n if (!input.selector) {\n throw new Error('Missing \"selector\" in step.with for op \"ui.expectHidden\"');\n }\n await page.waitForSelector(input.selector, { state: \"hidden\" });\n });\n\n registry.register(\"ui.expectText\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.expectText\");\n const input = (step.with ?? {}) as ExpectTextInput;\n if (!input.selector) {\n throw new Error('Missing \"selector\" in step.with for op \"ui.expectText\"');\n }\n\n const text = await page.locator(input.selector).innerText();\n if (input.equals !== undefined) {\n if (text !== input.equals) {\n throw new Error(\n `Expected text to equal \"${input.equals}\" but got \"${text}\"`,\n );\n }\n return;\n }\n if (input.contains !== undefined) {\n if (!text.includes(input.contains)) {\n throw new Error(\n `Expected text to contain \"${input.contains}\" but got \"${text}\"`,\n );\n }\n return;\n }\n\n throw new Error(\n 'Missing \"equals\" or \"contains\" in step.with for op \"ui.expectText\"',\n );\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"form.step.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/ui/form.step.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAYxD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAwB9D"}
1
+ {"version":3,"file":"form.step.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/ui/form.step.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAaxD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAwC9D"}
@@ -1,6 +1,40 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.registerFormSteps = registerFormSteps;
37
+ const path = __importStar(require("path"));
4
38
  function requirePage(ctx, op) {
5
39
  if (!ctx.ui || !ctx.ui.page) {
6
40
  throw new Error(`Missing UI page on context for op "${op}"`);
@@ -30,5 +64,20 @@ function registerFormSteps(registry) {
30
64
  }
31
65
  await page.selectOption(input.selector, String(input.value));
32
66
  });
67
+ registry.register("ui.uploadFile", async (ctx, step) => {
68
+ const page = requirePage(ctx, "ui.uploadFile");
69
+ const input = (step.with ?? {});
70
+ if (!input.selector) {
71
+ throw new Error('Missing "selector" in step.with for op "ui.uploadFile"');
72
+ }
73
+ if (input.filePath === undefined || input.filePath === null) {
74
+ throw new Error('Missing "filePath" in step.with for op "ui.uploadFile"');
75
+ }
76
+ const cwd = process.cwd();
77
+ const resolved = Array.isArray(input.filePath)
78
+ ? input.filePath.map((p) => path.resolve(cwd, String(p)))
79
+ : path.resolve(cwd, String(input.filePath));
80
+ await page.setInputFiles(input.selector, resolved);
81
+ });
33
82
  }
34
83
  //# sourceMappingURL=form.step.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form.step.js","sourceRoot":"","sources":["../../../../src/testing/steps/ui/form.step.ts"],"names":[],"mappings":";;AAcA,8CAwBC;AA/BD,SAAS,WAAW,CAAC,GAAgB,EAAE,EAAU;IAC/C,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAgB,iBAAiB,CAAC,QAAsB;IACtD,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,GAAgB,EAAE,IAAY,EAAE,EAAE;QACpE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAc,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,EAAE,GAAgB,EAAE,IAAY,EAAE,EAAE;QACtE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAgB,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { TestContext } from \"../../contracts/runtime-context.types\";\nimport type { OpStep } from \"../../contracts/testing-metadata.types\";\nimport { StepRegistry } from \"../../core/step-registry\";\n\ntype FillInput = { selector: string; value: string };\ntype SelectInput = { selector: string; value: string };\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 registerFormSteps(registry: StepRegistry): void {\n registry.register(\"ui.fill\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.fill\");\n const input = (step.with ?? {}) as FillInput;\n if (!input.selector) {\n throw new Error('Missing \"selector\" in step.with for op \"ui.fill\"');\n }\n if (input.value === undefined) {\n throw new Error('Missing \"value\" in step.with for op \"ui.fill\"');\n }\n await page.fill(input.selector, String(input.value));\n });\n\n registry.register(\"ui.select\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.select\");\n const input = (step.with ?? {}) as SelectInput;\n if (!input.selector) {\n throw new Error('Missing \"selector\" in step.with for op \"ui.select\"');\n }\n if (input.value === undefined) {\n throw new Error('Missing \"value\" in step.with for op \"ui.select\"');\n }\n await page.selectOption(input.selector, String(input.value));\n });\n}\n"]}
1
+ {"version":3,"file":"form.step.js","sourceRoot":"","sources":["../../../../src/testing/steps/ui/form.step.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from \"path\";\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 FillInput = { selector: string; value: string };\ntype SelectInput = { selector: string; value: string };\ntype UploadFileInput = { selector: string; filePath: string | string[] };\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 registerFormSteps(registry: StepRegistry): void {\n registry.register(\"ui.fill\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.fill\");\n const input = (step.with ?? {}) as FillInput;\n if (!input.selector) {\n throw new Error('Missing \"selector\" in step.with for op \"ui.fill\"');\n }\n if (input.value === undefined) {\n throw new Error('Missing \"value\" in step.with for op \"ui.fill\"');\n }\n await page.fill(input.selector, String(input.value));\n });\n\n registry.register(\"ui.select\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.select\");\n const input = (step.with ?? {}) as SelectInput;\n if (!input.selector) {\n throw new Error('Missing \"selector\" in step.with for op \"ui.select\"');\n }\n if (input.value === undefined) {\n throw new Error('Missing \"value\" in step.with for op \"ui.select\"');\n }\n await page.selectOption(input.selector, String(input.value));\n });\n\n registry.register(\"ui.uploadFile\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.uploadFile\");\n const input = (step.with ?? {}) as UploadFileInput;\n if (!input.selector) {\n throw new Error('Missing \"selector\" in step.with for op \"ui.uploadFile\"');\n }\n if (input.filePath === undefined || input.filePath === null) {\n throw new Error('Missing \"filePath\" in step.with for op \"ui.uploadFile\"');\n }\n const cwd = process.cwd();\n const resolved = Array.isArray(input.filePath)\n ? input.filePath.map((p) => path.resolve(cwd, String(p)))\n : path.resolve(cwd, String(input.filePath));\n await page.setInputFiles(input.selector, resolved);\n });\n}\n"]}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_1 = require("@playwright/test");
4
+ const env_1 = require("../helpers/env");
5
+ const baseURL = process.env.API_BASE_URL ?? "http://localhost:3000";
6
+ const TEST_USER_EMAIL = (0, env_1.getRequiredEnv)("TEST_USER_EMAIL");
7
+ const TEST_USER_PASSWORD = (0, env_1.getRequiredEnv)("TEST_USER_PASSWORD");
8
+ function base64UrlDecode(input) {
9
+ const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
10
+ const padded = normalized.length % 4 === 0
11
+ ? normalized
12
+ : normalized.padEnd(normalized.length + (4 - (normalized.length % 4)), "=");
13
+ return Buffer.from(padded, "base64").toString("utf-8");
14
+ }
15
+ function validateJwt(token) {
16
+ const parts = token.split(".");
17
+ if (parts.length !== 3) {
18
+ throw new Error("JWT must have three dot-separated parts.");
19
+ }
20
+ const headerJson = JSON.parse(base64UrlDecode(parts[0]));
21
+ const payloadJson = JSON.parse(base64UrlDecode(parts[1]));
22
+ if (!headerJson || typeof headerJson !== "object") {
23
+ throw new Error("JWT header must be a JSON object.");
24
+ }
25
+ if (!payloadJson || typeof payloadJson !== "object") {
26
+ throw new Error("JWT payload must be a JSON object.");
27
+ }
28
+ if (typeof payloadJson.exp !== "number") {
29
+ throw new Error("JWT payload.exp must be a number.");
30
+ }
31
+ return payloadJson;
32
+ }
33
+ (0, test_1.test)("API: authenticate succeeds with valid credentials", async () => {
34
+ const api = await test_1.request.newContext({
35
+ baseURL,
36
+ extraHTTPHeaders: {
37
+ accept: "*/*",
38
+ "content-type": "application/json",
39
+ },
40
+ });
41
+ try {
42
+ const res = await api.post("/api/iam/authenticate", {
43
+ data: {
44
+ email: TEST_USER_EMAIL,
45
+ username: "",
46
+ password: TEST_USER_PASSWORD,
47
+ },
48
+ });
49
+ (0, test_1.expect)(res.status()).toBe(200);
50
+ const json = await res.json();
51
+ (0, test_1.expect)(json.statusCode).toBe(200);
52
+ (0, test_1.expect)(Array.isArray(json.message)).toBe(true);
53
+ (0, test_1.expect)(json.message.length).toBe(0);
54
+ (0, test_1.expect)(json.error).toBe("");
55
+ const user = json.data?.user;
56
+ (0, test_1.expect)(user, "Expected data.user to be an object.").toBeTruthy();
57
+ (0, test_1.expect)(typeof user).toBe("object");
58
+ const email = user?.email;
59
+ (0, test_1.expect)(typeof email).toBe("string");
60
+ if (email === TEST_USER_EMAIL) {
61
+ (0, test_1.expect)(email).toBe(TEST_USER_EMAIL);
62
+ }
63
+ else {
64
+ (0, test_1.expect)(email.length).toBeGreaterThan(0);
65
+ }
66
+ (0, test_1.expect)(typeof user?.mobile).toBe("string");
67
+ (0, test_1.expect)(typeof user?.username).toBe("string");
68
+ (0, test_1.expect)(typeof user?.forcePasswordChange).toBe("boolean");
69
+ (0, test_1.expect)(typeof user?.id).toBe("number");
70
+ const roles = user?.roles;
71
+ (0, test_1.expect)(Array.isArray(roles)).toBe(true);
72
+ if (Array.isArray(roles)) {
73
+ (0, test_1.expect)(roles.every((role) => typeof role === "string")).toBe(true);
74
+ (0, test_1.expect)(roles).toContain("Admin");
75
+ }
76
+ const accessToken = json.data?.accessToken;
77
+ const refreshToken = json.data?.refreshToken;
78
+ (0, test_1.expect)(typeof accessToken).toBe("string");
79
+ (0, test_1.expect)(typeof refreshToken).toBe("string");
80
+ const accessPayload = validateJwt(accessToken);
81
+ const refreshPayload = validateJwt(refreshToken);
82
+ (0, test_1.expect)(typeof accessPayload.exp).toBe("number");
83
+ (0, test_1.expect)(typeof refreshPayload.exp).toBe("number");
84
+ }
85
+ finally {
86
+ await api.dispose();
87
+ }
88
+ });
89
+ (0, test_1.test)("API: authenticate fails with wrong password", async () => {
90
+ const api = await test_1.request.newContext({
91
+ baseURL,
92
+ extraHTTPHeaders: {
93
+ accept: "*/*",
94
+ "content-type": "application/json",
95
+ },
96
+ });
97
+ try {
98
+ const res = await api.post("/api/iam/authenticate", {
99
+ data: {
100
+ email: TEST_USER_EMAIL,
101
+ username: "",
102
+ password: `${TEST_USER_PASSWORD}__wrong`,
103
+ },
104
+ });
105
+ (0, test_1.expect)(res.status()).toBe(401);
106
+ const json = await res.json();
107
+ (0, test_1.expect)(json.statusCode).toBe(401);
108
+ (0, test_1.expect)(json.statusCodeMessage).toBe("Unauthorized");
109
+ (0, test_1.expect)(json.message).toBe("Invalid credentials");
110
+ (0, test_1.expect)(json.error).toBe("Invalid credentials");
111
+ (0, test_1.expect)(json.data?.statusCode).toBe(401);
112
+ (0, test_1.expect)(json.data?.error).toBe("Unauthorized");
113
+ (0, test_1.expect)(json.data?.message).toBe("Invalid credentials");
114
+ }
115
+ finally {
116
+ await api.dispose();
117
+ }
118
+ });
119
+ //# sourceMappingURL=authenticate.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authenticate.spec.js","sourceRoot":"","sources":["../../tests/api/authenticate.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, request, test } from \"@playwright/test\";\nimport { getRequiredEnv } from \"../helpers/env\";\n\ntype JwtPayload = {\n exp?: number;\n [key: string]: unknown;\n};\n\nconst baseURL = process.env.API_BASE_URL ?? \"http://localhost:3000\";\nconst TEST_USER_EMAIL = getRequiredEnv(\"TEST_USER_EMAIL\");\nconst TEST_USER_PASSWORD = getRequiredEnv(\"TEST_USER_PASSWORD\");\n\nfunction base64UrlDecode(input: string): string {\n const normalized = input.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded =\n normalized.length % 4 === 0\n ? normalized\n : normalized.padEnd(\n normalized.length + (4 - (normalized.length % 4)),\n \"=\"\n );\n return Buffer.from(padded, \"base64\").toString(\"utf-8\");\n}\n\nfunction validateJwt(token: string): JwtPayload {\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n throw new Error(\"JWT must have three dot-separated parts.\");\n }\n\n const headerJson = JSON.parse(base64UrlDecode(parts[0]));\n const payloadJson = JSON.parse(base64UrlDecode(parts[1]));\n\n if (!headerJson || typeof headerJson !== \"object\") {\n throw new Error(\"JWT header must be a JSON object.\");\n }\n\n if (!payloadJson || typeof payloadJson !== \"object\") {\n throw new Error(\"JWT payload must be a JSON object.\");\n }\n\n if (typeof payloadJson.exp !== \"number\") {\n throw new Error(\"JWT payload.exp must be a number.\");\n }\n\n return payloadJson as JwtPayload;\n}\n\ntest(\"API: authenticate succeeds with valid credentials\", async () => {\n const api = await request.newContext({\n baseURL,\n extraHTTPHeaders: {\n accept: \"*/*\",\n \"content-type\": \"application/json\",\n },\n });\n\n try {\n const res = await api.post(\"/api/iam/authenticate\", {\n data: {\n email: TEST_USER_EMAIL,\n username: \"\",\n password: TEST_USER_PASSWORD,\n },\n });\n\n expect(res.status()).toBe(200);\n const json = await res.json();\n\n expect(json.statusCode).toBe(200);\n expect(Array.isArray(json.message)).toBe(true);\n expect(json.message.length).toBe(0);\n expect(json.error).toBe(\"\");\n\n const user = json.data?.user as Record<string, unknown> | undefined;\n expect(user, \"Expected data.user to be an object.\").toBeTruthy();\n expect(typeof user).toBe(\"object\");\n\n const email = user?.email;\n expect(typeof email).toBe(\"string\");\n if (email === TEST_USER_EMAIL) {\n expect(email).toBe(TEST_USER_EMAIL);\n } else {\n // If your API returns a fixed system email, replace this with an exact match.\n expect((email as string).length).toBeGreaterThan(0);\n }\n\n expect(typeof user?.mobile).toBe(\"string\");\n expect(typeof user?.username).toBe(\"string\");\n expect(typeof user?.forcePasswordChange).toBe(\"boolean\");\n expect(typeof user?.id).toBe(\"number\");\n\n const roles = user?.roles;\n expect(Array.isArray(roles)).toBe(true);\n if (Array.isArray(roles)) {\n expect(roles.every((role) => typeof role === \"string\")).toBe(true);\n expect(roles).toContain(\"Admin\");\n }\n\n const accessToken = json.data?.accessToken;\n const refreshToken = json.data?.refreshToken;\n expect(typeof accessToken).toBe(\"string\");\n expect(typeof refreshToken).toBe(\"string\");\n\n const accessPayload = validateJwt(accessToken as string);\n const refreshPayload = validateJwt(refreshToken as string);\n\n expect(typeof accessPayload.exp).toBe(\"number\");\n expect(typeof refreshPayload.exp).toBe(\"number\");\n } finally {\n await api.dispose();\n }\n});\n\ntest(\"API: authenticate fails with wrong password\", async () => {\n const api = await request.newContext({\n baseURL,\n extraHTTPHeaders: {\n accept: \"*/*\",\n \"content-type\": \"application/json\",\n },\n });\n\n try {\n const res = await api.post(\"/api/iam/authenticate\", {\n data: {\n email: TEST_USER_EMAIL,\n username: \"\",\n password: `${TEST_USER_PASSWORD}__wrong`,\n },\n });\n\n expect(res.status()).toBe(401);\n const json = await res.json();\n\n expect(json.statusCode).toBe(401);\n expect(json.statusCodeMessage).toBe(\"Unauthorized\");\n expect(json.message).toBe(\"Invalid credentials\");\n expect(json.error).toBe(\"Invalid credentials\");\n expect(json.data?.statusCode).toBe(401);\n expect(json.data?.error).toBe(\"Unauthorized\");\n expect(json.data?.message).toBe(\"Invalid credentials\");\n } finally {\n await api.dispose();\n }\n});\n"]}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_1 = require("@playwright/test");
4
+ const auth_1 = require("../helpers/auth");
5
+ const baseURL = process.env.API_BASE_URL ?? "http://localhost:3000";
6
+ async function getCityByName(name) {
7
+ const api = await test_1.request.newContext({
8
+ baseURL,
9
+ extraHTTPHeaders: await (0, auth_1.getAuthHeaders)(baseURL),
10
+ });
11
+ try {
12
+ const res = await api.get(`/api/city-master?filters[name][$eq]=${encodeURIComponent(name)}&limit=1&offset=0`);
13
+ (0, test_1.expect)(res.status()).toBe(200);
14
+ const json = await res.json();
15
+ const record = json?.data?.records?.[0];
16
+ (0, test_1.expect)(record, `Expected city '${name}' in testData`).toBeTruthy();
17
+ (0, test_1.expect)(record.id, "Expected record to have id").toBeTruthy();
18
+ return record;
19
+ }
20
+ finally {
21
+ await api.dispose();
22
+ }
23
+ }
24
+ test_1.test.describe("CRUDService.findOne (cityMaster)", () => {
25
+ (0, test_1.test)("returns a city by id", async () => {
26
+ const city = await getCityByName("Mumbai");
27
+ const api = await test_1.request.newContext({
28
+ baseURL,
29
+ extraHTTPHeaders: await (0, auth_1.getAuthHeaders)(baseURL),
30
+ });
31
+ try {
32
+ const res = await api.get(`/api/city-master/${city.id}`);
33
+ (0, test_1.expect)(res.status()).toBe(200);
34
+ const json = await res.json();
35
+ (0, test_1.expect)(json?.data?.id).toBe(city.id);
36
+ (0, test_1.expect)(json?.data?.name).toBe("Mumbai");
37
+ (0, test_1.expect)(json?.data?.description).toBe("Mumbai city");
38
+ }
39
+ finally {
40
+ await api.dispose();
41
+ }
42
+ });
43
+ (0, test_1.test)("supports fields[] selection", async () => {
44
+ const city = await getCityByName("Pune");
45
+ const api = await test_1.request.newContext({
46
+ baseURL,
47
+ extraHTTPHeaders: await (0, auth_1.getAuthHeaders)(baseURL),
48
+ });
49
+ try {
50
+ const res = await api.get(`/api/city-master/${city.id}?fields[]=id&fields[]=name`);
51
+ (0, test_1.expect)(res.status()).toBe(200);
52
+ const json = await res.json();
53
+ (0, test_1.expect)(json?.data?.id).toBe(city.id);
54
+ (0, test_1.expect)(json?.data?.name).toBe("Pune");
55
+ (0, test_1.expect)(json?.data?.description).toBeUndefined();
56
+ (0, test_1.expect)(json?.data?.state).toBeUndefined();
57
+ }
58
+ finally {
59
+ await api.dispose();
60
+ }
61
+ });
62
+ (0, test_1.test)("supports populate=state", async () => {
63
+ const city = await getCityByName("Bengaluru");
64
+ const api = await test_1.request.newContext({
65
+ baseURL,
66
+ extraHTTPHeaders: await (0, auth_1.getAuthHeaders)(baseURL),
67
+ });
68
+ try {
69
+ const res = await api.get(`/api/city-master/${city.id}?populate=state`);
70
+ (0, test_1.expect)(res.status()).toBe(200);
71
+ const json = await res.json();
72
+ (0, test_1.expect)(json?.data?.name).toBe("Bengaluru");
73
+ (0, test_1.expect)(json?.data?.state).toBeTruthy();
74
+ (0, test_1.expect)(json?.data?.state?.name).toBe("Karnataka");
75
+ }
76
+ finally {
77
+ await api.dispose();
78
+ }
79
+ });
80
+ (0, test_1.test)("returns 404 for missing id", async () => {
81
+ const api = await test_1.request.newContext({
82
+ baseURL,
83
+ extraHTTPHeaders: await (0, auth_1.getAuthHeaders)(baseURL),
84
+ });
85
+ try {
86
+ const res = await api.get(`/api/city-master/99999999`);
87
+ (0, test_1.expect)(res.status()).toBe(404);
88
+ const json = await res.json();
89
+ (0, test_1.expect)(String(json?.message)).toContain("cityMaster");
90
+ (0, test_1.expect)(String(json?.message)).toContain("not found");
91
+ }
92
+ finally {
93
+ await api.dispose();
94
+ }
95
+ });
96
+ });
97
+ //# sourceMappingURL=crud-service.findOne.cityMaster.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud-service.findOne.cityMaster.spec.js","sourceRoot":"","sources":["../../tests/api/crud-service.findOne.cityMaster.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, request, test } from \"@playwright/test\";\nimport { getAuthHeaders } from \"../helpers/auth\";\n\nconst baseURL = process.env.API_BASE_URL ?? \"http://localhost:3000\";\n\nasync function getCityByName(name: string) {\n const api = await request.newContext({\n baseURL,\n extraHTTPHeaders: await getAuthHeaders(baseURL),\n });\n try {\n const res = await api.get(\n `/api/city-master?filters[name][$eq]=${encodeURIComponent(name)}&limit=1&offset=0`\n );\n expect(res.status()).toBe(200);\n const json = await res.json();\n\n const record = json?.data?.records?.[0];\n expect(record, `Expected city '${name}' in testData`).toBeTruthy();\n expect(record.id, \"Expected record to have id\").toBeTruthy();\n\n return record;\n } finally {\n await api.dispose();\n }\n}\n\ntest.describe(\"CRUDService.findOne (cityMaster)\", () => {\n test(\"returns a city by id\", async () => {\n const city = await getCityByName(\"Mumbai\");\n\n const api = await request.newContext({\n baseURL,\n extraHTTPHeaders: await getAuthHeaders(baseURL),\n });\n try {\n const res = await api.get(`/api/city-master/${city.id}`);\n expect(res.status()).toBe(200);\n\n const json = await res.json();\n expect(json?.data?.id).toBe(city.id);\n expect(json?.data?.name).toBe(\"Mumbai\");\n expect(json?.data?.description).toBe(\"Mumbai city\");\n } finally {\n await api.dispose();\n }\n });\n\n test(\"supports fields[] selection\", async () => {\n const city = await getCityByName(\"Pune\");\n\n const api = await request.newContext({\n baseURL,\n extraHTTPHeaders: await getAuthHeaders(baseURL),\n });\n try {\n const res = await api.get(\n `/api/city-master/${city.id}?fields[]=id&fields[]=name`\n );\n expect(res.status()).toBe(200);\n\n const json = await res.json();\n expect(json?.data?.id).toBe(city.id);\n expect(json?.data?.name).toBe(\"Pune\");\n expect(json?.data?.description).toBeUndefined();\n expect(json?.data?.state).toBeUndefined();\n } finally {\n await api.dispose();\n }\n });\n\n test(\"supports populate=state\", async () => {\n const city = await getCityByName(\"Bengaluru\");\n\n const api = await request.newContext({\n baseURL,\n extraHTTPHeaders: await getAuthHeaders(baseURL),\n });\n try {\n const res = await api.get(`/api/city-master/${city.id}?populate=state`);\n expect(res.status()).toBe(200);\n\n const json = await res.json();\n expect(json?.data?.name).toBe(\"Bengaluru\");\n expect(json?.data?.state).toBeTruthy();\n expect(json?.data?.state?.name).toBe(\"Karnataka\");\n } finally {\n await api.dispose();\n }\n });\n\n test(\"returns 404 for missing id\", async () => {\n const api = await request.newContext({\n baseURL,\n extraHTTPHeaders: await getAuthHeaders(baseURL),\n });\n try {\n const res = await api.get(`/api/city-master/99999999`);\n expect(res.status()).toBe(404);\n\n const json = await res.json();\n expect(String(json?.message)).toContain(\"cityMaster\");\n expect(String(json?.message)).toContain(\"not found\");\n } finally {\n await api.dispose();\n }\n });\n});\n"]}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_1 = require("@playwright/test");
4
+ (0, test_1.test)("GET /api/ping returns pong", async () => {
5
+ const baseURL = process.env.BASE_URL || "http://localhost:3000";
6
+ if (!baseURL) {
7
+ throw new Error("baseURL is not configured. Set API_BASE_URL or use the default.");
8
+ }
9
+ const api = await test_1.request.newContext({ baseURL });
10
+ const res = await api.get("/api/ping");
11
+ (0, test_1.expect)(res.status()).toBe(200);
12
+ const body = await res.json();
13
+ (0, test_1.expect)(body).toEqual({
14
+ statusCode: 200,
15
+ message: [],
16
+ error: "",
17
+ data: { pong: "v1.0.2" },
18
+ });
19
+ await api.dispose();
20
+ });
21
+ //# sourceMappingURL=ping.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.spec.js","sourceRoot":"","sources":["../../tests/api/ping.spec.ts"],"names":[],"mappings":";;AAAA,2CAAyD;AAEzD,IAAA,WAAI,EAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,uBAAuB,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,cAAO,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAElD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEvC,IAAA,aAAM,EAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,OAAO,CAAC;QACnB,UAAU,EAAE,GAAG;QACf,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACzB,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC","sourcesContent":["import { expect, request, test } from \"@playwright/test\";\n\ntest(\"GET /api/ping returns pong\", async () => {\n const baseURL = process.env.BASE_URL || \"http://localhost:3000\";\n if (!baseURL) {\n throw new Error(\"baseURL is not configured. Set API_BASE_URL or use the default.\");\n }\n const api = await request.newContext({ baseURL });\n\n const res = await api.get(\"/api/ping\");\n\n expect(res.status()).toBe(200);\n\n const body = await res.json();\n expect(body).toEqual({\n statusCode: 200,\n message: [],\n error: \"\",\n data: { pong: \"v1.0.2\" },\n });\n\n await api.dispose();\n});\n"]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAccessToken = getAccessToken;
4
+ exports.getAuthHeaders = getAuthHeaders;
5
+ const test_1 = require("@playwright/test");
6
+ const env_1 = require("./env");
7
+ async function getAccessToken(baseURL) {
8
+ const TEST_USER_EMAIL = (0, env_1.getRequiredEnv)("TEST_USER_EMAIL");
9
+ const TEST_USER_PASSWORD = (0, env_1.getRequiredEnv)("TEST_USER_PASSWORD");
10
+ const api = await test_1.request.newContext({
11
+ baseURL,
12
+ extraHTTPHeaders: {
13
+ accept: "*/*",
14
+ "content-type": "application/json",
15
+ },
16
+ });
17
+ try {
18
+ const res = await api.post("/api/iam/authenticate", {
19
+ data: {
20
+ email: TEST_USER_EMAIL,
21
+ username: "",
22
+ password: TEST_USER_PASSWORD,
23
+ },
24
+ });
25
+ (0, test_1.expect)(res.status()).toBe(200);
26
+ const json = await res.json();
27
+ const token = json?.data?.accessToken;
28
+ (0, test_1.expect)(token, "Expected access token from authenticate endpoint.").toBeTruthy();
29
+ return token;
30
+ }
31
+ finally {
32
+ await api.dispose();
33
+ }
34
+ }
35
+ async function getAuthHeaders(baseURL) {
36
+ const token = await getAccessToken(baseURL);
37
+ return {
38
+ authorization: `Bearer ${token}`,
39
+ };
40
+ }
41
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../tests/helpers/auth.ts"],"names":[],"mappings":";;AAGA,wCA6BC;AAED,wCAKC;AAvCD,2CAAmD;AACnD,+BAAuC;AAEhC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,eAAe,GAAG,IAAA,oBAAc,EAAC,iBAAiB,CAAC,CAAC;IAC1D,MAAM,kBAAkB,GAAG,IAAA,oBAAc,EAAC,oBAAoB,CAAC,CAAC;IAEhE,MAAM,GAAG,GAAG,MAAM,cAAO,CAAC,UAAU,CAAC;QACnC,OAAO;QACP,gBAAgB,EAAE;YAChB,MAAM,EAAE,KAAK;YACb,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE;YAClD,IAAI,EAAE;gBACJ,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,kBAAkB;aAC7B;SACF,CAAC,CAAC;QAEH,IAAA,aAAM,EAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,WAAiC,CAAC;QAC5D,IAAA,aAAM,EAAC,KAAK,EAAE,mDAAmD,CAAC,CAAC,UAAU,EAAE,CAAC;QAChF,OAAO,KAAe,CAAC;IACzB,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO;QACL,aAAa,EAAE,UAAU,KAAK,EAAE;KACjC,CAAC;AACJ,CAAC","sourcesContent":["import { expect, request } from \"@playwright/test\";\nimport { getRequiredEnv } from \"./env\";\n\nexport async function getAccessToken(baseURL: string) {\n const TEST_USER_EMAIL = getRequiredEnv(\"TEST_USER_EMAIL\");\n const TEST_USER_PASSWORD = getRequiredEnv(\"TEST_USER_PASSWORD\");\n\n const api = await request.newContext({\n baseURL,\n extraHTTPHeaders: {\n accept: \"*/*\",\n \"content-type\": \"application/json\",\n },\n });\n\n try {\n const res = await api.post(\"/api/iam/authenticate\", {\n data: {\n email: TEST_USER_EMAIL,\n username: \"\",\n password: TEST_USER_PASSWORD,\n },\n });\n\n expect(res.status()).toBe(200);\n const json = await res.json();\n const token = json?.data?.accessToken as string | undefined;\n expect(token, \"Expected access token from authenticate endpoint.\").toBeTruthy();\n return token as string;\n } finally {\n await api.dispose();\n }\n}\n\nexport async function getAuthHeaders(baseURL: string) {\n const token = await getAccessToken(baseURL);\n return {\n authorization: `Bearer ${token}`,\n };\n}\n"]}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRequiredEnv = getRequiredEnv;
4
+ function getRequiredEnv(name) {
5
+ const value = process.env[name];
6
+ if (!value) {
7
+ throw new Error(`Missing required env var: ${name}`);
8
+ }
9
+ return value;
10
+ }
11
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../tests/helpers/env.ts"],"names":[],"mappings":";;AAAA,wCAMC;AAND,SAAgB,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["export function getRequiredEnv(name: string): string {\n const value = process.env[name];\n if (!value) {\n throw new Error(`Missing required env var: ${name}`);\n }\n return value;\n}\n"]}