@solidxai/core 0.1.2 → 0.1.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 (281) hide show
  1. package/dist/commands/run-tests.command.d.ts +37 -0
  2. package/dist/commands/run-tests.command.d.ts.map +1 -0
  3. package/dist/commands/run-tests.command.js +345 -0
  4. package/dist/commands/run-tests.command.js.map +1 -0
  5. package/dist/commands/test-data.command.d.ts +6 -6
  6. package/dist/commands/test-data.command.d.ts.map +1 -1
  7. package/dist/commands/test-data.command.js +25 -25
  8. package/dist/commands/test-data.command.js.map +1 -1
  9. package/dist/commands/test.command.d.ts +5 -0
  10. package/dist/commands/test.command.d.ts.map +1 -0
  11. package/dist/commands/test.command.js +26 -0
  12. package/dist/commands/test.command.js.map +1 -0
  13. package/dist/controllers/service.controller.d.ts +0 -9
  14. package/dist/controllers/service.controller.d.ts.map +1 -1
  15. package/dist/controllers/service.controller.js +0 -45
  16. package/dist/controllers/service.controller.js.map +1 -1
  17. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  18. package/dist/dtos/basic-filters.dto.js.map +1 -1
  19. package/dist/dtos/create-user.dto.d.ts +1 -0
  20. package/dist/dtos/create-user.dto.d.ts.map +1 -1
  21. package/dist/dtos/create-user.dto.js +2 -1
  22. package/dist/dtos/create-user.dto.js.map +1 -1
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  28. package/dist/seeders/module-metadata-seeder.service.js +1 -20
  29. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  30. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  31. package/dist/seeders/module-test-data.service.js +3 -3
  32. package/dist/seeders/module-test-data.service.js.map +1 -1
  33. package/dist/services/chatter-message.service.d.ts +2 -0
  34. package/dist/services/chatter-message.service.d.ts.map +1 -1
  35. package/dist/services/chatter-message.service.js +18 -2
  36. package/dist/services/chatter-message.service.js.map +1 -1
  37. package/dist/services/crud.service.d.ts.map +1 -1
  38. package/dist/services/crud.service.js.map +1 -1
  39. package/dist/services/queues/common.d.ts +3 -0
  40. package/dist/services/queues/common.d.ts.map +1 -0
  41. package/dist/services/queues/common.js +39 -0
  42. package/dist/services/queues/common.js.map +1 -0
  43. package/dist/services/queues/database-publisher.service.d.ts.map +1 -1
  44. package/dist/services/queues/database-publisher.service.js +3 -1
  45. package/dist/services/queues/database-publisher.service.js.map +1 -1
  46. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  47. package/dist/services/queues/database-subscriber.service.js +5 -2
  48. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  49. package/dist/services/queues/rabbitmq-publisher.service.d.ts.map +1 -1
  50. package/dist/services/queues/rabbitmq-publisher.service.js +13 -6
  51. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  52. package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
  53. package/dist/services/queues/rabbitmq-subscriber.service.js +9 -5
  54. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  55. package/dist/solid-core.module.d.ts.map +1 -1
  56. package/dist/solid-core.module.js +4 -0
  57. package/dist/solid-core.module.js.map +1 -1
  58. package/dist/testing/__examples__/register-example-specs.d.ts +3 -0
  59. package/dist/testing/__examples__/register-example-specs.d.ts.map +1 -0
  60. package/dist/testing/__examples__/register-example-specs.js +8 -0
  61. package/dist/testing/__examples__/register-example-specs.js.map +1 -0
  62. package/dist/testing/__examples__/specs/custom-health.spec.d.ts +17 -0
  63. package/dist/testing/__examples__/specs/custom-health.spec.d.ts.map +1 -0
  64. package/dist/testing/__examples__/specs/custom-health.spec.js +30 -0
  65. package/dist/testing/__examples__/specs/custom-health.spec.js.map +1 -0
  66. package/dist/testing/adapters/api/api-adapter.d.ts +9 -0
  67. package/dist/testing/adapters/api/api-adapter.d.ts.map +1 -0
  68. package/dist/testing/adapters/api/api-adapter.js +76 -0
  69. package/dist/testing/adapters/api/api-adapter.js.map +1 -0
  70. package/dist/testing/adapters/api/api.types.d.ts +14 -0
  71. package/dist/testing/adapters/api/api.types.d.ts.map +1 -0
  72. package/dist/testing/adapters/api/api.types.js +3 -0
  73. package/dist/testing/adapters/api/api.types.js.map +1 -0
  74. package/dist/testing/adapters/ui/playwright-adapter.d.ts +14 -0
  75. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -0
  76. package/dist/testing/adapters/ui/playwright-adapter.js +47 -0
  77. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -0
  78. package/dist/testing/adapters/ui/ui.types.d.ts +5 -0
  79. package/dist/testing/adapters/ui/ui.types.d.ts.map +1 -0
  80. package/dist/testing/adapters/ui/ui.types.js +3 -0
  81. package/dist/testing/adapters/ui/ui.types.js.map +1 -0
  82. package/dist/testing/contracts/runtime-context.types.d.ts +35 -0
  83. package/dist/testing/contracts/runtime-context.types.d.ts.map +1 -0
  84. package/dist/testing/contracts/runtime-context.types.js +3 -0
  85. package/dist/testing/contracts/runtime-context.types.js.map +1 -0
  86. package/dist/testing/contracts/test-spec.types.d.ts +21 -0
  87. package/dist/testing/contracts/test-spec.types.d.ts.map +1 -0
  88. package/dist/testing/contracts/test-spec.types.js +3 -0
  89. package/dist/testing/contracts/test-spec.types.js.map +1 -0
  90. package/dist/testing/contracts/testing-metadata.types.d.ts +41 -0
  91. package/dist/testing/contracts/testing-metadata.types.d.ts.map +1 -0
  92. package/dist/testing/contracts/testing-metadata.types.js +3 -0
  93. package/dist/testing/contracts/testing-metadata.types.js.map +1 -0
  94. package/dist/testing/core/interpolation.d.ts +4 -0
  95. package/dist/testing/core/interpolation.d.ts.map +1 -0
  96. package/dist/testing/core/interpolation.js +180 -0
  97. package/dist/testing/core/interpolation.js.map +1 -0
  98. package/dist/testing/core/normalize-steps.d.ts +7 -0
  99. package/dist/testing/core/normalize-steps.d.ts.map +1 -0
  100. package/dist/testing/core/normalize-steps.js +20 -0
  101. package/dist/testing/core/normalize-steps.js.map +1 -0
  102. package/dist/testing/core/resource-store.d.ts +8 -0
  103. package/dist/testing/core/resource-store.d.ts.map +1 -0
  104. package/dist/testing/core/resource-store.js +41 -0
  105. package/dist/testing/core/resource-store.js.map +1 -0
  106. package/dist/testing/core/spec-registry.d.ts +10 -0
  107. package/dist/testing/core/spec-registry.d.ts.map +1 -0
  108. package/dist/testing/core/spec-registry.js +32 -0
  109. package/dist/testing/core/spec-registry.js.map +1 -0
  110. package/dist/testing/core/step-registry.d.ts +10 -0
  111. package/dist/testing/core/step-registry.d.ts.map +1 -0
  112. package/dist/testing/core/step-registry.js +26 -0
  113. package/dist/testing/core/step-registry.js.map +1 -0
  114. package/dist/testing/core/testing-engine.d.ts +14 -0
  115. package/dist/testing/core/testing-engine.d.ts.map +1 -0
  116. package/dist/testing/core/testing-engine.js +97 -0
  117. package/dist/testing/core/testing-engine.js.map +1 -0
  118. package/dist/testing/core/timeout.d.ts +2 -0
  119. package/dist/testing/core/timeout.d.ts.map +1 -0
  120. package/dist/testing/core/timeout.js +18 -0
  121. package/dist/testing/core/timeout.js.map +1 -0
  122. package/dist/testing/reporter/attachments.d.ts +4 -0
  123. package/dist/testing/reporter/attachments.d.ts.map +1 -0
  124. package/dist/testing/reporter/attachments.js +25 -0
  125. package/dist/testing/reporter/attachments.js.map +1 -0
  126. package/dist/testing/reporter/console-reporter.d.ts +45 -0
  127. package/dist/testing/reporter/console-reporter.d.ts.map +1 -0
  128. package/dist/testing/reporter/console-reporter.js +189 -0
  129. package/dist/testing/reporter/console-reporter.js.map +1 -0
  130. package/dist/testing/reporter/reporter.types.d.ts +37 -0
  131. package/dist/testing/reporter/reporter.types.d.ts.map +1 -0
  132. package/dist/testing/reporter/reporter.types.js +3 -0
  133. package/dist/testing/reporter/reporter.types.js.map +1 -0
  134. package/dist/testing/runner/lifecycle.d.ts +9 -0
  135. package/dist/testing/runner/lifecycle.d.ts.map +1 -0
  136. package/dist/testing/runner/lifecycle.js +33 -0
  137. package/dist/testing/runner/lifecycle.js.map +1 -0
  138. package/dist/testing/runner/run-from-metadata.d.ts +24 -0
  139. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -0
  140. package/dist/testing/runner/run-from-metadata.js +70 -0
  141. package/dist/testing/runner/run-from-metadata.js.map +1 -0
  142. package/dist/testing/runner/scenario-filter.d.ts +9 -0
  143. package/dist/testing/runner/scenario-filter.d.ts.map +1 -0
  144. package/dist/testing/runner/scenario-filter.js +22 -0
  145. package/dist/testing/runner/scenario-filter.js.map +1 -0
  146. package/dist/testing/steps/api/auth.step.d.ts +3 -0
  147. package/dist/testing/steps/api/auth.step.d.ts.map +1 -0
  148. package/dist/testing/steps/api/auth.step.js +38 -0
  149. package/dist/testing/steps/api/auth.step.js.map +1 -0
  150. package/dist/testing/steps/api/index.d.ts +3 -0
  151. package/dist/testing/steps/api/index.d.ts.map +1 -0
  152. package/dist/testing/steps/api/index.js +10 -0
  153. package/dist/testing/steps/api/index.js.map +1 -0
  154. package/dist/testing/steps/api/request.step.d.ts +3 -0
  155. package/dist/testing/steps/api/request.step.d.ts.map +1 -0
  156. package/dist/testing/steps/api/request.step.js +281 -0
  157. package/dist/testing/steps/api/request.step.js.map +1 -0
  158. package/dist/testing/steps/assert/http.step.d.ts +3 -0
  159. package/dist/testing/steps/assert/http.step.d.ts.map +1 -0
  160. package/dist/testing/steps/assert/http.step.js +27 -0
  161. package/dist/testing/steps/assert/http.step.js.map +1 -0
  162. package/dist/testing/steps/assert/index.d.ts +3 -0
  163. package/dist/testing/steps/assert/index.d.ts.map +1 -0
  164. package/dist/testing/steps/assert/index.js +12 -0
  165. package/dist/testing/steps/assert/index.js.map +1 -0
  166. package/dist/testing/steps/assert/jsonpath.step.d.ts +3 -0
  167. package/dist/testing/steps/assert/jsonpath.step.d.ts.map +1 -0
  168. package/dist/testing/steps/assert/jsonpath.step.js +40 -0
  169. package/dist/testing/steps/assert/jsonpath.step.js.map +1 -0
  170. package/dist/testing/steps/assert/primitives.step.d.ts +3 -0
  171. package/dist/testing/steps/assert/primitives.step.d.ts.map +1 -0
  172. package/dist/testing/steps/assert/primitives.step.js +43 -0
  173. package/dist/testing/steps/assert/primitives.step.js.map +1 -0
  174. package/dist/testing/steps/test/index.d.ts +3 -0
  175. package/dist/testing/steps/test/index.d.ts.map +1 -0
  176. package/dist/testing/steps/test/index.js +8 -0
  177. package/dist/testing/steps/test/index.js.map +1 -0
  178. package/dist/testing/steps/test/test-spec.step.d.ts +3 -0
  179. package/dist/testing/steps/test/test-spec.step.d.ts.map +1 -0
  180. package/dist/testing/steps/test/test-spec.step.js +41 -0
  181. package/dist/testing/steps/test/test-spec.step.js.map +1 -0
  182. package/dist/testing/steps/ui/actions.step.d.ts +3 -0
  183. package/dist/testing/steps/ui/actions.step.d.ts.map +1 -0
  184. package/dist/testing/steps/ui/actions.step.js +31 -0
  185. package/dist/testing/steps/ui/actions.step.js.map +1 -0
  186. package/dist/testing/steps/ui/assertions.step.d.ts +3 -0
  187. package/dist/testing/steps/ui/assertions.step.d.ts.map +1 -0
  188. package/dist/testing/steps/ui/assertions.step.js +41 -0
  189. package/dist/testing/steps/ui/assertions.step.js.map +1 -0
  190. package/dist/testing/steps/ui/form.step.d.ts +3 -0
  191. package/dist/testing/steps/ui/form.step.d.ts.map +1 -0
  192. package/dist/testing/steps/ui/form.step.js +34 -0
  193. package/dist/testing/steps/ui/form.step.js.map +1 -0
  194. package/dist/testing/steps/ui/index.d.ts +3 -0
  195. package/dist/testing/steps/ui/index.d.ts.map +1 -0
  196. package/dist/testing/steps/ui/index.js +14 -0
  197. package/dist/testing/steps/ui/index.js.map +1 -0
  198. package/dist/testing/steps/ui/navigation.step.d.ts +3 -0
  199. package/dist/testing/steps/ui/navigation.step.d.ts.map +1 -0
  200. package/dist/testing/steps/ui/navigation.step.js +39 -0
  201. package/dist/testing/steps/ui/navigation.step.js.map +1 -0
  202. package/dist/testing/steps/util/index.d.ts +3 -0
  203. package/dist/testing/steps/util/index.d.ts.map +1 -0
  204. package/dist/testing/steps/util/index.js +12 -0
  205. package/dist/testing/steps/util/index.js.map +1 -0
  206. package/dist/testing/steps/util/log.step.d.ts +3 -0
  207. package/dist/testing/steps/util/log.step.d.ts.map +1 -0
  208. package/dist/testing/steps/util/log.step.js +18 -0
  209. package/dist/testing/steps/util/log.step.js.map +1 -0
  210. package/dist/testing/steps/util/require.step.d.ts +3 -0
  211. package/dist/testing/steps/util/require.step.d.ts.map +1 -0
  212. package/dist/testing/steps/util/require.step.js +16 -0
  213. package/dist/testing/steps/util/require.step.js.map +1 -0
  214. package/dist/testing/steps/util/sleep.step.d.ts +3 -0
  215. package/dist/testing/steps/util/sleep.step.d.ts.map +1 -0
  216. package/dist/testing/steps/util/sleep.step.js +13 -0
  217. package/dist/testing/steps/util/sleep.step.js.map +1 -0
  218. package/docs/test-data-workflow.md +51 -11
  219. package/package.json +4 -2
  220. package/src/commands/run-tests.command.ts +278 -0
  221. package/src/commands/test-data.command.ts +26 -26
  222. package/src/commands/test.command.ts +14 -0
  223. package/src/controllers/service.controller.ts +58 -59
  224. package/src/dtos/basic-filters.dto.ts +0 -2
  225. package/src/dtos/create-user.dto.ts +1 -0
  226. package/src/index.ts +3 -0
  227. package/src/seeders/module-metadata-seeder.service.ts +3 -24
  228. package/src/seeders/module-test-data.service.ts +5 -3
  229. package/src/services/chatter-message.service.ts +18 -1
  230. package/src/services/crud.service.ts +1 -0
  231. package/src/services/queues/common.ts +75 -0
  232. package/src/services/queues/database-publisher.service.ts +4 -1
  233. package/src/services/queues/database-subscriber.service.ts +5 -3
  234. package/src/services/queues/rabbitmq-publisher.service.ts +17 -7
  235. package/src/services/queues/rabbitmq-subscriber.service.ts +9 -5
  236. package/src/solid-core.module.ts +4 -0
  237. package/src/testing/README.md +364 -0
  238. package/src/testing/__examples__/register-example-specs.ts +6 -0
  239. package/src/testing/__examples__/specs/custom-health.spec.ts +29 -0
  240. package/src/testing/__examples__/testing.sample.json +82 -0
  241. package/src/testing/adapters/api/api-adapter.ts +85 -0
  242. package/src/testing/adapters/api/api.types.ts +15 -0
  243. package/src/testing/adapters/ui/playwright-adapter.ts +54 -0
  244. package/src/testing/adapters/ui/ui.types.ts +4 -0
  245. package/src/testing/contracts/runtime-context.types.ts +36 -0
  246. package/src/testing/contracts/test-spec.types.ts +24 -0
  247. package/src/testing/contracts/testing-metadata.types.ts +46 -0
  248. package/src/testing/core/interpolation.ts +189 -0
  249. package/src/testing/core/normalize-steps.ts +21 -0
  250. package/src/testing/core/resource-store.ts +38 -0
  251. package/src/testing/core/spec-registry.ts +33 -0
  252. package/src/testing/core/step-registry.ts +27 -0
  253. package/src/testing/core/testing-engine.ts +127 -0
  254. package/src/testing/core/timeout.ts +19 -0
  255. package/src/testing/reporter/attachments.ts +25 -0
  256. package/src/testing/reporter/console-reporter.ts +229 -0
  257. package/src/testing/reporter/reporter.types.ts +36 -0
  258. package/src/testing/runner/lifecycle.ts +31 -0
  259. package/src/testing/runner/run-from-metadata.ts +87 -0
  260. package/src/testing/runner/scenario-filter.ts +33 -0
  261. package/src/testing/steps/api/auth.step.ts +66 -0
  262. package/src/testing/steps/api/index.ts +10 -0
  263. package/src/testing/steps/api/request.step.ts +358 -0
  264. package/src/testing/steps/assert/http.step.ts +33 -0
  265. package/src/testing/steps/assert/index.ts +12 -0
  266. package/src/testing/steps/assert/jsonpath.step.ts +50 -0
  267. package/src/testing/steps/assert/primitives.step.ts +69 -0
  268. package/src/testing/steps/test/index.ts +8 -0
  269. package/src/testing/steps/test/test-spec.step.ts +52 -0
  270. package/src/testing/steps/ui/actions.step.ts +36 -0
  271. package/src/testing/steps/ui/assertions.step.ts +54 -0
  272. package/src/testing/steps/ui/form.step.ts +39 -0
  273. package/src/testing/steps/ui/index.ts +12 -0
  274. package/src/testing/steps/ui/navigation.step.ts +53 -0
  275. package/src/testing/steps/util/index.ts +10 -0
  276. package/src/testing/steps/util/log.step.ts +19 -0
  277. package/src/testing/steps/util/require.step.ts +16 -0
  278. package/src/testing/steps/util/sleep.step.ts +15 -0
  279. package/tsconfig.json +35 -25
  280. package/tsconfig.tests.json +14 -0
  281. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-context.types.d.ts","sourceRoot":"","sources":["../../../src/testing/contracts/runtime-context.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,SAAS,EAAE,aAAa,CAAC;IACzB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,EAAE,CAAC,EAAE,iBAAiB,CAAC;IACvB,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC;CACH"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=runtime-context.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-context.types.js","sourceRoot":"","sources":["../../../src/testing/contracts/runtime-context.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ApiAdapter } from \"../adapters/api/api-adapter\";\nimport type { PlaywrightAdapter } from \"../adapters/ui/playwright-adapter\";\nimport type { Reporter } from \"../reporter/reporter.types\";\nimport type { SpecRegistry } from \"../core/spec-registry\";\nimport type { ScenarioType } from \"./testing-metadata.types\";\n\nexport type StepPhase = \"given\" | \"when\" | \"then\" | \"and\" | \"step\";\n\nexport interface ResourceStore {\n get(path: string): unknown;\n set(path: string, value: unknown): void;\n has(path: string): boolean;\n}\n\nexport interface ApiResponse {\n status: number;\n headers: Record<string, string>;\n bodyText: string;\n bodyJson?: unknown;\n}\n\nexport interface TestContext {\n scenarioId: string;\n scenarioType: ScenarioType;\n params: Record<string, any>;\n resources: ResourceStore;\n api?: ApiAdapter;\n ui?: PlaywrightAdapter;\n last?: { apiResponse?: ApiResponse };\n reporter: Reporter;\n specRegistry?: SpecRegistry;\n testData?: Record<string, Record<string, any>>;\n options?: {\n printApiLogs?: boolean;\n };\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { TestContext } from "../contracts/runtime-context.types";
2
+ export type SolidTestSpecArgs = {
3
+ ctx: TestContext;
4
+ input: Record<string, any>;
5
+ };
6
+ export type SolidTestSpecAttachment = {
7
+ name: string;
8
+ contentType: string;
9
+ data: string;
10
+ encoding?: "utf8" | "base64";
11
+ };
12
+ export type SolidTestSpecResult = {
13
+ ok: boolean;
14
+ name?: string;
15
+ details?: Record<string, any>;
16
+ attachments?: SolidTestSpecAttachment[];
17
+ };
18
+ export interface ISolidTestSpec {
19
+ run(args: SolidTestSpecArgs): Promise<SolidTestSpecResult>;
20
+ }
21
+ //# sourceMappingURL=test-spec.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-spec.types.d.ts","sourceRoot":"","sources":["../../../src/testing/contracts/test-spec.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC5D"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=test-spec.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-spec.types.js","sourceRoot":"","sources":["../../../src/testing/contracts/test-spec.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { TestContext } from \"../contracts/runtime-context.types\";\n\nexport type SolidTestSpecArgs = {\n ctx: TestContext;\n input: Record<string, any>;\n};\n\nexport type SolidTestSpecAttachment = {\n name: string;\n contentType: string;\n data: string;\n encoding?: \"utf8\" | \"base64\";\n};\n\nexport type SolidTestSpecResult = {\n ok: boolean;\n name?: string;\n details?: Record<string, any>;\n attachments?: SolidTestSpecAttachment[];\n};\n\nexport interface ISolidTestSpec {\n run(args: SolidTestSpecArgs): Promise<SolidTestSpecResult>;\n}\n"]}
@@ -0,0 +1,41 @@
1
+ export type ScenarioType = "api" | "ui" | "mixed";
2
+ export interface TestingDataRecord {
3
+ modelUserKey: string;
4
+ recUserKeyValue: string;
5
+ data: Record<string, any>;
6
+ }
7
+ export interface TestingMetadata {
8
+ testing: {
9
+ specs?: string[];
10
+ data?: TestingDataRecord[];
11
+ scenarios: ScenarioSpec[];
12
+ };
13
+ }
14
+ export interface ScenarioSpec {
15
+ id: string;
16
+ name?: string;
17
+ type: ScenarioType;
18
+ params?: Record<string, any>;
19
+ tags?: string[];
20
+ timeoutMs?: number;
21
+ retries?: number;
22
+ steps: StepBlock[];
23
+ }
24
+ export type StepBlock = {
25
+ given: OpStep;
26
+ } | {
27
+ when: OpStep;
28
+ } | {
29
+ then: OpStep | OpStep[];
30
+ } | {
31
+ and: OpStep;
32
+ } | OpStep;
33
+ export interface OpStep {
34
+ op: string;
35
+ with?: Record<string, any>;
36
+ saveAs?: string;
37
+ name?: string;
38
+ spec?: string;
39
+ timeoutMs?: number;
40
+ }
41
+ //# sourceMappingURL=testing-metadata.types.d.ts.map
@@ -0,0 +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,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=testing-metadata.types.js.map
@@ -0,0 +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 TestingMetadata {\n testing: {\n specs?: string[];\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"]}
@@ -0,0 +1,4 @@
1
+ import type { TestContext } from "../contracts/runtime-context.types";
2
+ export declare function interpolateString(input: string, ctx: TestContext): string;
3
+ export declare function interpolateDeep<T>(input: T, ctx: TestContext): T;
4
+ //# sourceMappingURL=interpolation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.d.ts","sourceRoot":"","sources":["../../../src/testing/core/interpolation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AA0JtE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CAOzE;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,CAAC,CAyBhE"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.interpolateString = interpolateString;
4
+ exports.interpolateDeep = interpolateDeep;
5
+ const TOKEN_REGEX = /\$\{([^}]+)\}/g;
6
+ function getByPath(obj, path) {
7
+ if (!path)
8
+ return undefined;
9
+ const parts = path.split(".");
10
+ let current = obj;
11
+ for (const part of parts) {
12
+ if (current == null || typeof current !== "object")
13
+ return undefined;
14
+ current = current[part];
15
+ }
16
+ return current;
17
+ }
18
+ function parsePathSegments(path) {
19
+ const segments = [];
20
+ let buffer = "";
21
+ let i = 0;
22
+ const pushBuffer = () => {
23
+ if (buffer) {
24
+ segments.push(buffer);
25
+ buffer = "";
26
+ }
27
+ };
28
+ while (i < path.length) {
29
+ const ch = path[i];
30
+ if (ch === ".") {
31
+ pushBuffer();
32
+ i += 1;
33
+ continue;
34
+ }
35
+ if (ch === "[") {
36
+ pushBuffer();
37
+ i += 1;
38
+ if (i >= path.length)
39
+ break;
40
+ let quote = "";
41
+ if (path[i] === '"' || path[i] === "'") {
42
+ quote = path[i];
43
+ i += 1;
44
+ }
45
+ let value = "";
46
+ while (i < path.length) {
47
+ const c = path[i];
48
+ if (quote) {
49
+ if (c === "\\" && i + 1 < path.length) {
50
+ value += path[i + 1];
51
+ i += 2;
52
+ continue;
53
+ }
54
+ if (c === quote) {
55
+ i += 1;
56
+ break;
57
+ }
58
+ value += c;
59
+ i += 1;
60
+ continue;
61
+ }
62
+ if (c === "]")
63
+ break;
64
+ value += c;
65
+ i += 1;
66
+ }
67
+ while (i < path.length && path[i] !== "]") {
68
+ i += 1;
69
+ }
70
+ if (i < path.length && path[i] === "]") {
71
+ i += 1;
72
+ }
73
+ if (value) {
74
+ segments.push(value);
75
+ }
76
+ continue;
77
+ }
78
+ buffer += ch;
79
+ i += 1;
80
+ }
81
+ pushBuffer();
82
+ return segments;
83
+ }
84
+ function getByPathWithBrackets(obj, path) {
85
+ if (!path)
86
+ return undefined;
87
+ const parts = parsePathSegments(path);
88
+ let current = obj;
89
+ for (const part of parts) {
90
+ if (current == null || typeof current !== "object")
91
+ return undefined;
92
+ current = current[part];
93
+ }
94
+ return current;
95
+ }
96
+ function resolveToken(token, ctx) {
97
+ if (token.startsWith("env:")) {
98
+ const name = token.slice("env:".length);
99
+ if (!name) {
100
+ throw new Error('Invalid interpolation token: "env:"');
101
+ }
102
+ const value = process.env[name];
103
+ if (value === undefined) {
104
+ throw new Error(`Missing env var for token: "${token}"`);
105
+ }
106
+ return { value, raw: false };
107
+ }
108
+ if (token.startsWith("params.")) {
109
+ const path = token.slice("params.".length);
110
+ if (!path) {
111
+ throw new Error('Invalid interpolation token: "params."');
112
+ }
113
+ const value = getByPath(ctx.params, path);
114
+ if (value === undefined) {
115
+ throw new Error(`Missing param for token: "${token}"`);
116
+ }
117
+ return { value, raw: false };
118
+ }
119
+ if (token.startsWith("data:") || token.startsWith("data.")) {
120
+ const prefix = token.startsWith("data:") ? "data:" : "data.";
121
+ let path = token.slice(prefix.length);
122
+ if (!path) {
123
+ throw new Error(`Invalid interpolation token: "${prefix}"`);
124
+ }
125
+ let raw = false;
126
+ if (path.endsWith("._rec")) {
127
+ raw = true;
128
+ path = path.slice(0, -("._rec".length));
129
+ }
130
+ const value = getByPathWithBrackets(ctx.testData ?? {}, path);
131
+ if (value === undefined) {
132
+ throw new Error(`Missing test data for token: "${token}"`);
133
+ }
134
+ return { value, raw };
135
+ }
136
+ if (token.startsWith("res:")) {
137
+ const path = token.slice("res:".length);
138
+ if (!path) {
139
+ throw new Error('Invalid interpolation token: "res:"');
140
+ }
141
+ const value = ctx.resources.get(path);
142
+ if (value === undefined) {
143
+ throw new Error(`Missing resource for token: "${token}"`);
144
+ }
145
+ return { value, raw: false };
146
+ }
147
+ throw new Error(`Unknown interpolation token: "${token}"`);
148
+ }
149
+ function interpolateString(input, ctx) {
150
+ return input.replace(TOKEN_REGEX, (_match, token) => {
151
+ const resolved = resolveToken(token, ctx);
152
+ return typeof resolved.value === "string"
153
+ ? resolved.value
154
+ : JSON.stringify(resolved.value);
155
+ });
156
+ }
157
+ function interpolateDeep(input, ctx) {
158
+ if (typeof input === "string") {
159
+ const tokenMatch = input.match(/^\$\{([^}]+)\}$/);
160
+ if (tokenMatch) {
161
+ const resolved = resolveToken(tokenMatch[1], ctx);
162
+ if (resolved.raw) {
163
+ return resolved.value;
164
+ }
165
+ }
166
+ return interpolateString(input, ctx);
167
+ }
168
+ if (Array.isArray(input)) {
169
+ return input.map((item) => interpolateDeep(item, ctx));
170
+ }
171
+ if (input && typeof input === "object") {
172
+ const out = {};
173
+ for (const [key, value] of Object.entries(input)) {
174
+ out[key] = interpolateDeep(value, ctx);
175
+ }
176
+ return out;
177
+ }
178
+ return input;
179
+ }
180
+ //# sourceMappingURL=interpolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.js","sourceRoot":"","sources":["../../../src/testing/core/interpolation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TestContext } from \"../contracts/runtime-context.types\";\n\nconst TOKEN_REGEX = /\\$\\{([^}]+)\\}/g;\n\nfunction getByPath(obj: Record<string, any>, path: string): unknown {\n if (!path) return undefined;\n const parts = path.split(\".\");\n let current: any = obj;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = current[part];\n }\n return current;\n}\n\nfunction parsePathSegments(path: string): string[] {\n const segments: string[] = [];\n let buffer = \"\";\n let i = 0;\n\n const pushBuffer = () => {\n if (buffer) {\n segments.push(buffer);\n buffer = \"\";\n }\n };\n\n while (i < path.length) {\n const ch = path[i];\n if (ch === \".\") {\n pushBuffer();\n i += 1;\n continue;\n }\n if (ch === \"[\") {\n pushBuffer();\n i += 1;\n if (i >= path.length) break;\n let quote = \"\";\n if (path[i] === '\"' || path[i] === \"'\") {\n quote = path[i];\n i += 1;\n }\n let value = \"\";\n while (i < path.length) {\n const c = path[i];\n if (quote) {\n if (c === \"\\\\\" && i + 1 < path.length) {\n value += path[i + 1];\n i += 2;\n continue;\n }\n if (c === quote) {\n i += 1;\n break;\n }\n value += c;\n i += 1;\n continue;\n }\n if (c === \"]\") break;\n value += c;\n i += 1;\n }\n while (i < path.length && path[i] !== \"]\") {\n i += 1;\n }\n if (i < path.length && path[i] === \"]\") {\n i += 1;\n }\n if (value) {\n segments.push(value);\n }\n continue;\n }\n buffer += ch;\n i += 1;\n }\n\n pushBuffer();\n return segments;\n}\n\nfunction getByPathWithBrackets(obj: Record<string, any>, path: string): unknown {\n if (!path) return undefined;\n const parts = parsePathSegments(path);\n let current: any = obj;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = current[part];\n }\n return current;\n}\n\ntype TokenResolution = { value: unknown; raw: boolean };\n\nfunction resolveToken(token: string, ctx: TestContext): TokenResolution {\n if (token.startsWith(\"env:\")) {\n const name = token.slice(\"env:\".length);\n if (!name) {\n throw new Error('Invalid interpolation token: \"env:\"');\n }\n const value = process.env[name];\n if (value === undefined) {\n throw new Error(`Missing env var for token: \"${token}\"`);\n }\n return { value, raw: false };\n }\n\n if (token.startsWith(\"params.\")) {\n const path = token.slice(\"params.\".length);\n if (!path) {\n throw new Error('Invalid interpolation token: \"params.\"');\n }\n const value = getByPath(ctx.params, path);\n if (value === undefined) {\n throw new Error(`Missing param for token: \"${token}\"`);\n }\n return { value, raw: false };\n }\n\n if (token.startsWith(\"data:\") || token.startsWith(\"data.\")) {\n const prefix = token.startsWith(\"data:\") ? \"data:\" : \"data.\";\n let path = token.slice(prefix.length);\n if (!path) {\n throw new Error(`Invalid interpolation token: \"${prefix}\"`);\n }\n let raw = false;\n if (path.endsWith(\"._rec\")) {\n raw = true;\n path = path.slice(0, -(\"._rec\".length));\n }\n const value = getByPathWithBrackets((ctx as any).testData ?? {}, path);\n if (value === undefined) {\n throw new Error(`Missing test data for token: \"${token}\"`);\n }\n return { value, raw };\n }\n\n if (token.startsWith(\"res:\")) {\n const path = token.slice(\"res:\".length);\n if (!path) {\n throw new Error('Invalid interpolation token: \"res:\"');\n }\n const value = ctx.resources.get(path);\n if (value === undefined) {\n throw new Error(`Missing resource for token: \"${token}\"`);\n }\n return { value, raw: false };\n }\n\n throw new Error(`Unknown interpolation token: \"${token}\"`);\n}\n\nexport function interpolateString(input: string, ctx: TestContext): string {\n return input.replace(TOKEN_REGEX, (_match, token: string) => {\n const resolved = resolveToken(token, ctx);\n return typeof resolved.value === \"string\"\n ? resolved.value\n : JSON.stringify(resolved.value);\n });\n}\n\nexport function interpolateDeep<T>(input: T, ctx: TestContext): T {\n if (typeof input === \"string\") {\n const tokenMatch = input.match(/^\\$\\{([^}]+)\\}$/);\n if (tokenMatch) {\n const resolved = resolveToken(tokenMatch[1], ctx);\n if (resolved.raw) {\n return resolved.value as T;\n }\n }\n return interpolateString(input, ctx) as T;\n }\n\n if (Array.isArray(input)) {\n return input.map((item) => interpolateDeep(item, ctx)) as T;\n }\n\n if (input && typeof input === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input as Record<string, any>)) {\n out[key] = interpolateDeep(value, ctx);\n }\n return out as T;\n }\n\n return input;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { StepPhase } from "../contracts/runtime-context.types";
2
+ import type { OpStep, StepBlock } from "../contracts/testing-metadata.types";
3
+ export declare function normalizeBlock(block: StepBlock): {
4
+ phase: StepPhase;
5
+ steps: OpStep[];
6
+ };
7
+ //# sourceMappingURL=normalize-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-steps.d.ts","sourceRoot":"","sources":["../../../src/testing/core/normalize-steps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAE7E,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,GACf;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAevC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeBlock = normalizeBlock;
4
+ function normalizeBlock(block) {
5
+ if ("given" in block) {
6
+ return { phase: "given", steps: [block.given] };
7
+ }
8
+ if ("when" in block) {
9
+ return { phase: "when", steps: [block.when] };
10
+ }
11
+ if ("then" in block) {
12
+ const steps = Array.isArray(block.then) ? block.then : [block.then];
13
+ return { phase: "then", steps };
14
+ }
15
+ if ("and" in block) {
16
+ return { phase: "and", steps: [block.and] };
17
+ }
18
+ return { phase: "step", steps: [block] };
19
+ }
20
+ //# sourceMappingURL=normalize-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-steps.js","sourceRoot":"","sources":["../../../src/testing/core/normalize-steps.ts"],"names":[],"mappings":";;AAGA,wCAiBC;AAjBD,SAAgB,cAAc,CAC5B,KAAgB;IAEhB,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;IACD,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QACnB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;AAC3C,CAAC","sourcesContent":["import type { StepPhase } from \"../contracts/runtime-context.types\";\nimport type { OpStep, StepBlock } from \"../contracts/testing-metadata.types\";\n\nexport function normalizeBlock(\n block: StepBlock,\n): { phase: StepPhase; steps: OpStep[] } {\n if (\"given\" in block) {\n return { phase: \"given\", steps: [block.given] };\n }\n if (\"when\" in block) {\n return { phase: \"when\", steps: [block.when] };\n }\n if (\"then\" in block) {\n const steps = Array.isArray(block.then) ? block.then : [block.then];\n return { phase: \"then\", steps };\n }\n if (\"and\" in block) {\n return { phase: \"and\", steps: [block.and] };\n }\n return { phase: \"step\", steps: [block] };\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { ResourceStore } from "../contracts/runtime-context.types";
2
+ export declare class SimpleResourceStore implements ResourceStore {
3
+ private readonly data;
4
+ get(path: string): unknown;
5
+ set(path: string, value: unknown): void;
6
+ has(path: string): boolean;
7
+ }
8
+ //# sourceMappingURL=resource-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-store.d.ts","sourceRoot":"","sources":["../../../src/testing/core/resource-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAExE,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAEhD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAW1B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAkBvC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG3B"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SimpleResourceStore = void 0;
4
+ class SimpleResourceStore {
5
+ constructor() {
6
+ this.data = {};
7
+ }
8
+ get(path) {
9
+ if (!path)
10
+ return undefined;
11
+ const parts = path.split(".");
12
+ let current = this.data;
13
+ for (const part of parts) {
14
+ if (current == null || typeof current !== "object")
15
+ return undefined;
16
+ current = current[part];
17
+ }
18
+ return current;
19
+ }
20
+ set(path, value) {
21
+ if (!path)
22
+ return;
23
+ const parts = path.split(".");
24
+ let current = this.data;
25
+ for (let i = 0; i < parts.length - 1; i += 1) {
26
+ const part = parts[i];
27
+ if (current[part] == null ||
28
+ typeof current[part] !== "object" ||
29
+ Array.isArray(current[part])) {
30
+ current[part] = {};
31
+ }
32
+ current = current[part];
33
+ }
34
+ current[parts[parts.length - 1]] = value;
35
+ }
36
+ has(path) {
37
+ return this.get(path) !== undefined;
38
+ }
39
+ }
40
+ exports.SimpleResourceStore = SimpleResourceStore;
41
+ //# sourceMappingURL=resource-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-store.js","sourceRoot":"","sources":["../../../src/testing/core/resource-store.ts"],"names":[],"mappings":";;;AAEA,MAAa,mBAAmB;IAAhC;QACmB,SAAI,GAAwB,EAAE,CAAC;IAkClD,CAAC;IAhCC,GAAG,CAAC,IAAY;QACd,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,GAAQ,IAAI,CAAC,IAAI,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YACrE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,KAAc;QAC9B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,GAAQ,IAAI,CAAC,IAAI,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IACE,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI;gBACrB,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ;gBACjC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAC5B,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACrB,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;IACtC,CAAC;CACF;AAnCD,kDAmCC","sourcesContent":["import type { ResourceStore } from \"../contracts/runtime-context.types\";\n\nexport class SimpleResourceStore implements ResourceStore {\n private readonly data: Record<string, any> = {};\n\n get(path: string): unknown {\n if (!path) return undefined;\n const parts = path.split(\".\");\n let current: any = this.data;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = current[part];\n }\n return current;\n }\n\n set(path: string, value: unknown): void {\n if (!path) return;\n const parts = path.split(\".\");\n let current: any = this.data;\n for (let i = 0; i < parts.length - 1; i += 1) {\n const part = parts[i];\n if (\n current[part] == null ||\n typeof current[part] !== \"object\" ||\n Array.isArray(current[part])\n ) {\n current[part] = {};\n }\n current = current[part];\n }\n current[parts[parts.length - 1]] = value;\n }\n\n has(path: string): boolean {\n return this.get(path) !== undefined;\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { ISolidTestSpec } from "../contracts/test-spec.types";
2
+ export type SpecFactory = () => ISolidTestSpec;
3
+ export declare class SpecRegistry {
4
+ private readonly factories;
5
+ register(specId: string, factory: SpecFactory): void;
6
+ create(specId: string): ISolidTestSpec;
7
+ has(specId: string): boolean;
8
+ list(): string[];
9
+ }
10
+ //# sourceMappingURL=spec-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-registry.d.ts","sourceRoot":"","sources":["../../../src/testing/core/spec-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC;AAE/C,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAE5D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAUpD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAQtC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI5B,IAAI,IAAI,MAAM,EAAE;CAGjB"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpecRegistry = void 0;
4
+ class SpecRegistry {
5
+ constructor() {
6
+ this.factories = new Map();
7
+ }
8
+ register(specId, factory) {
9
+ if (!specId) {
10
+ throw new Error("specId is required");
11
+ }
12
+ if (this.factories.has(specId)) {
13
+ throw new Error(`Spec already registered: "${specId}"`);
14
+ }
15
+ this.factories.set(specId, factory);
16
+ }
17
+ create(specId) {
18
+ const factory = this.factories.get(specId);
19
+ if (!factory) {
20
+ throw new Error(`Spec not registered: "${specId}"`);
21
+ }
22
+ return factory();
23
+ }
24
+ has(specId) {
25
+ return this.factories.has(specId);
26
+ }
27
+ list() {
28
+ return Array.from(this.factories.keys()).sort();
29
+ }
30
+ }
31
+ exports.SpecRegistry = SpecRegistry;
32
+ //# sourceMappingURL=spec-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-registry.js","sourceRoot":"","sources":["../../../src/testing/core/spec-registry.ts"],"names":[],"mappings":";;;AAIA,MAAa,YAAY;IAAzB;QACmB,cAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IA2B9D,CAAC;IAzBC,QAAQ,CAAC,MAAc,EAAE,OAAoB;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,GAAG,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,GAAG,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;CACF;AA5BD,oCA4BC","sourcesContent":["import type { ISolidTestSpec } from \"../contracts/test-spec.types\";\n\nexport type SpecFactory = () => ISolidTestSpec;\n\nexport class SpecRegistry {\n private readonly factories = new Map<string, SpecFactory>();\n\n register(specId: string, factory: SpecFactory): void {\n if (!specId) {\n throw new Error(\"specId is required\");\n }\n if (this.factories.has(specId)) {\n throw new Error(`Spec already registered: \"${specId}\"`);\n }\n this.factories.set(specId, factory);\n }\n\n create(specId: string): ISolidTestSpec {\n const factory = this.factories.get(specId);\n if (!factory) {\n throw new Error(`Spec not registered: \"${specId}\"`);\n }\n return factory();\n }\n\n has(specId: string): boolean {\n return this.factories.has(specId);\n }\n\n list(): string[] {\n return Array.from(this.factories.keys()).sort();\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { TestContext } from "../contracts/runtime-context.types";
2
+ import type { OpStep } from "../contracts/testing-metadata.types";
3
+ export type StepHandler = (ctx: TestContext, step: OpStep) => Promise<any>;
4
+ export declare class StepRegistry {
5
+ private readonly handlers;
6
+ register(op: string, handler: StepHandler): void;
7
+ get(op: string): StepHandler;
8
+ has(op: string): boolean;
9
+ }
10
+ //# sourceMappingURL=step-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-registry.d.ts","sourceRoot":"","sources":["../../../src/testing/core/step-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAE3E,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAOhD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW;IAQ5B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAGzB"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StepRegistry = void 0;
4
+ class StepRegistry {
5
+ constructor() {
6
+ this.handlers = new Map();
7
+ }
8
+ register(op, handler) {
9
+ if (this.handlers.has(op)) {
10
+ throw new Error(`Step handler already registered for op: "${op}"`);
11
+ }
12
+ this.handlers.set(op, handler);
13
+ }
14
+ get(op) {
15
+ const handler = this.handlers.get(op);
16
+ if (!handler) {
17
+ throw new Error(`No step handler registered for op: "${op}"`);
18
+ }
19
+ return handler;
20
+ }
21
+ has(op) {
22
+ return this.handlers.has(op);
23
+ }
24
+ }
25
+ exports.StepRegistry = StepRegistry;
26
+ //# sourceMappingURL=step-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-registry.js","sourceRoot":"","sources":["../../../src/testing/core/step-registry.ts"],"names":[],"mappings":";;;AAKA,MAAa,YAAY;IAAzB;QACmB,aAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAoB7D,CAAC;IAlBC,QAAQ,CAAC,EAAU,EAAE,OAAoB;QACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;CACF;AArBD,oCAqBC","sourcesContent":["import type { TestContext } from \"../contracts/runtime-context.types\";\nimport type { OpStep } from \"../contracts/testing-metadata.types\";\n\nexport type StepHandler = (ctx: TestContext, step: OpStep) => Promise<any>;\n\nexport class StepRegistry {\n private readonly handlers = new Map<string, StepHandler>();\n\n register(op: string, handler: StepHandler): void {\n if (this.handlers.has(op)) {\n throw new Error(`Step handler already registered for op: \"${op}\"`);\n }\n this.handlers.set(op, handler);\n }\n\n get(op: string): StepHandler {\n const handler = this.handlers.get(op);\n if (!handler) {\n throw new Error(`No step handler registered for op: \"${op}\"`);\n }\n return handler;\n }\n\n has(op: string): boolean {\n return this.handlers.has(op);\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import type { TestContext } from "../contracts/runtime-context.types";
2
+ import type { ScenarioSpec } from "../contracts/testing-metadata.types";
3
+ import { StepRegistry } from "./step-registry";
4
+ export declare class TestingEngine {
5
+ private readonly registry;
6
+ private readonly defaults?;
7
+ constructor(registry: StepRegistry, defaults?: {
8
+ timeoutMs?: number;
9
+ retries?: number;
10
+ });
11
+ runScenario(scenario: ScenarioSpec, ctxBase: Omit<TestContext, "scenarioId" | "scenarioType" | "params">): Promise<void>;
12
+ private runBlock;
13
+ }
14
+ //# sourceMappingURL=testing-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing-engine.d.ts","sourceRoot":"","sources":["../../../src/testing/core/testing-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,oCAAoC,CAAC;AACjF,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAGhF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA2C;gBAGnE,QAAQ,EAAE,YAAY,EACtB,QAAQ,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAM/C,WAAW,CACf,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,cAAc,GAAG,QAAQ,CAAC,GACnE,OAAO,CAAC,IAAI,CAAC;YA0DF,QAAQ;CA8CvB"}