@cucumber/cucumber 12.9.0 → 13.0.0

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 (396) hide show
  1. package/README.md +8 -3
  2. package/bin/cucumber.js +2 -1
  3. package/lib/api/convert_configuration.d.ts +3 -4
  4. package/lib/api/convert_configuration.js +9 -11
  5. package/lib/api/emit_support_code_messages.d.ts +3 -3
  6. package/lib/api/emit_support_code_messages.js +13 -28
  7. package/lib/api/formatters.d.ts +7 -7
  8. package/lib/api/formatters.js +5 -2
  9. package/lib/api/gherkin.d.ts +3 -3
  10. package/lib/api/gherkin.js +2 -4
  11. package/lib/api/index.d.ts +2 -2
  12. package/lib/api/index.js +1 -1
  13. package/lib/api/load_configuration.d.ts +2 -2
  14. package/lib/api/load_configuration.js +4 -5
  15. package/lib/api/load_sources.d.ts +2 -2
  16. package/lib/api/load_sources.js +2 -2
  17. package/lib/api/load_support.d.ts +2 -2
  18. package/lib/api/load_support.js +3 -3
  19. package/lib/api/plugins.d.ts +2 -2
  20. package/lib/api/plugins.js +2 -2
  21. package/lib/api/run_cucumber.d.ts +3 -3
  22. package/lib/api/run_cucumber.js +17 -1
  23. package/lib/api/support.d.ts +3 -3
  24. package/lib/api/support.js +5 -5
  25. package/lib/api/test_helpers.d.ts +1 -1
  26. package/lib/api/test_helpers.js +8 -10
  27. package/lib/api/types.d.ts +9 -5
  28. package/lib/api/types.js +1 -1
  29. package/lib/assemble/assemble_test_cases.d.ts +4 -4
  30. package/lib/assemble/assemble_test_cases.js +2 -6
  31. package/lib/assemble/index.js +1 -1
  32. package/lib/assemble/types.d.ts +1 -1
  33. package/lib/assemble/types.js +1 -1
  34. package/lib/cli/i18n.js +5 -3
  35. package/lib/cli/index.d.ts +1 -1
  36. package/lib/cli/index.js +2 -2
  37. package/lib/cli/install_validator.js +4 -3
  38. package/lib/cli/run.js +7 -6
  39. package/lib/cli/validate_node_engine_version.js +2 -4
  40. package/lib/configuration/argv_parser.d.ts +1 -1
  41. package/lib/configuration/argv_parser.js +7 -7
  42. package/lib/configuration/check_schema.d.ts +1 -1
  43. package/lib/configuration/check_schema.js +17 -6
  44. package/lib/configuration/default_configuration.d.ts +1 -1
  45. package/lib/configuration/default_configuration.js +2 -1
  46. package/lib/configuration/from_file.d.ts +2 -2
  47. package/lib/configuration/from_file.js +6 -6
  48. package/lib/configuration/helpers.js +1 -1
  49. package/lib/configuration/index.js +1 -1
  50. package/lib/configuration/locate_file.js +3 -3
  51. package/lib/configuration/merge_configurations.d.ts +1 -1
  52. package/lib/configuration/merge_configurations.js +2 -10
  53. package/lib/configuration/parse_configuration.d.ts +2 -2
  54. package/lib/configuration/parse_configuration.js +3 -11
  55. package/lib/configuration/split_format_descriptor.d.ts +1 -2
  56. package/lib/configuration/split_format_descriptor.js +11 -71
  57. package/lib/configuration/types.d.ts +26 -3
  58. package/lib/configuration/types.js +1 -1
  59. package/lib/configuration/validate_configuration.d.ts +2 -2
  60. package/lib/configuration/validate_configuration.js +5 -3
  61. package/lib/environment/console_logger.d.ts +2 -2
  62. package/lib/environment/console_logger.js +1 -1
  63. package/lib/environment/index.js +1 -1
  64. package/lib/environment/make_environment.d.ts +1 -1
  65. package/lib/environment/make_environment.js +1 -1
  66. package/lib/environment/types.d.ts +1 -1
  67. package/lib/environment/types.js +1 -1
  68. package/lib/filter/filter_plugin.d.ts +1 -1
  69. package/lib/filter/filter_plugin.js +1 -1
  70. package/lib/filter/index.d.ts +1 -1
  71. package/lib/filter/index.js +2 -2
  72. package/lib/filter/order_pickles.d.ts +2 -2
  73. package/lib/filter/order_pickles.js +1 -1
  74. package/lib/filter/types.d.ts +1 -1
  75. package/lib/filter/types.js +1 -1
  76. package/lib/filter_stack_trace.d.ts +1 -1
  77. package/lib/filter_stack_trace.js +1 -1
  78. package/lib/formatter/builder.d.ts +7 -6
  79. package/lib/formatter/builder.js +6 -7
  80. package/lib/formatter/builtin/html.js +2 -2
  81. package/lib/formatter/builtin/index.d.ts +4 -4
  82. package/lib/formatter/builtin/index.js +14 -13
  83. package/lib/formatter/builtin/message.js +2 -2
  84. package/lib/formatter/builtin/pretty.d.ts +6 -0
  85. package/lib/formatter/builtin/pretty.js +19 -0
  86. package/lib/formatter/builtin/progress-bar.d.ts +6 -0
  87. package/lib/formatter/builtin/progress-bar.js +22 -0
  88. package/lib/formatter/builtin/progress.d.ts +6 -0
  89. package/lib/formatter/builtin/progress.js +18 -0
  90. package/lib/formatter/builtin/resolve_terminal_options.d.ts +3 -0
  91. package/lib/formatter/builtin/resolve_terminal_options.js +15 -0
  92. package/lib/formatter/builtin/summary.d.ts +6 -0
  93. package/lib/formatter/builtin/summary.js +15 -0
  94. package/lib/formatter/create_stream.d.ts +2 -2
  95. package/lib/formatter/create_stream.js +3 -5
  96. package/lib/formatter/find_class_or_plugin.js +1 -1
  97. package/lib/formatter/get_color_fns.d.ts +3 -3
  98. package/lib/formatter/get_color_fns.js +23 -52
  99. package/lib/formatter/helpers/duration_helpers.d.ts +1 -1
  100. package/lib/formatter/helpers/duration_helpers.js +1 -1
  101. package/lib/formatter/helpers/event_data_collector.d.ts +2 -2
  102. package/lib/formatter/helpers/event_data_collector.js +4 -6
  103. package/lib/formatter/helpers/formatters.d.ts +1 -1
  104. package/lib/formatter/helpers/formatters.js +1 -3
  105. package/lib/formatter/helpers/gherkin_document_parser.d.ts +1 -1
  106. package/lib/formatter/helpers/gherkin_document_parser.js +20 -18
  107. package/lib/formatter/helpers/index.d.ts +3 -3
  108. package/lib/formatter/helpers/index.js +8 -8
  109. package/lib/formatter/helpers/issue_helpers.d.ts +5 -5
  110. package/lib/formatter/helpers/issue_helpers.js +2 -2
  111. package/lib/formatter/helpers/keyword_type.js +2 -2
  112. package/lib/formatter/helpers/location_helpers.d.ts +1 -1
  113. package/lib/formatter/helpers/location_helpers.js +1 -1
  114. package/lib/formatter/helpers/pickle_parser.d.ts +2 -2
  115. package/lib/formatter/helpers/pickle_parser.js +8 -9
  116. package/lib/formatter/helpers/step_argument_formatter.d.ts +1 -1
  117. package/lib/formatter/helpers/step_argument_formatter.js +1 -1
  118. package/lib/formatter/helpers/summary_helpers.d.ts +2 -2
  119. package/lib/formatter/helpers/summary_helpers.js +8 -4
  120. package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +4 -4
  121. package/lib/formatter/helpers/test_case_attempt_formatter.js +5 -5
  122. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +4 -4
  123. package/lib/formatter/helpers/test_case_attempt_parser.js +4 -9
  124. package/lib/formatter/helpers/usage_helpers/index.d.ts +3 -3
  125. package/lib/formatter/helpers/usage_helpers/index.js +5 -6
  126. package/lib/formatter/import_code.js +2 -2
  127. package/lib/formatter/index.d.ts +25 -13
  128. package/lib/formatter/index.js +2 -2
  129. package/lib/formatter/json_formatter.d.ts +2 -2
  130. package/lib/formatter/json_formatter.js +9 -14
  131. package/lib/formatter/progress_formatter.d.ts +4 -1
  132. package/lib/formatter/progress_formatter.js +4 -1
  133. package/lib/formatter/rerun_formatter.d.ts +1 -1
  134. package/lib/formatter/rerun_formatter.js +2 -2
  135. package/lib/formatter/resolve_implementation.d.ts +1 -1
  136. package/lib/formatter/resolve_implementation.js +2 -2
  137. package/lib/formatter/snippets_formatter.d.ts +1 -1
  138. package/lib/formatter/snippets_formatter.js +2 -2
  139. package/lib/formatter/step_definition_snippet_builder/index.d.ts +4 -4
  140. package/lib/formatter/step_definition_snippet_builder/index.js +3 -3
  141. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts +1 -1
  142. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +3 -5
  143. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +1 -1
  144. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js +1 -1
  145. package/lib/formatter/summary_formatter.d.ts +6 -3
  146. package/lib/formatter/summary_formatter.js +6 -3
  147. package/lib/formatter/usage_formatter.d.ts +1 -1
  148. package/lib/formatter/usage_formatter.js +4 -4
  149. package/lib/formatter/usage_json_formatter.d.ts +1 -1
  150. package/lib/formatter/usage_json_formatter.js +3 -3
  151. package/lib/index.d.ts +6 -11
  152. package/lib/index.js +13 -20
  153. package/lib/models/data_table.d.ts +1 -1
  154. package/lib/models/data_table.js +9 -5
  155. package/lib/models/definition.d.ts +4 -4
  156. package/lib/models/definition.js +1 -1
  157. package/lib/models/gherkin_step_keyword.js +1 -1
  158. package/lib/models/step_definition.d.ts +3 -3
  159. package/lib/models/step_definition.js +1 -1
  160. package/lib/models/test_case_hook_definition.d.ts +2 -2
  161. package/lib/models/test_case_hook_definition.js +1 -1
  162. package/lib/models/test_run_hook_definition.d.ts +1 -1
  163. package/lib/models/test_run_hook_definition.js +1 -1
  164. package/lib/models/test_step_hook_definition.d.ts +2 -2
  165. package/lib/models/test_step_hook_definition.js +1 -1
  166. package/lib/paths/index.js +1 -1
  167. package/lib/paths/paths.d.ts +3 -3
  168. package/lib/paths/paths.js +42 -18
  169. package/lib/paths/types.js +1 -1
  170. package/lib/pickle_filter.d.ts +1 -1
  171. package/lib/pickle_filter.js +3 -3
  172. package/lib/plugin/index.d.ts +1 -1
  173. package/lib/plugin/index.js +2 -2
  174. package/lib/plugin/plugin_manager.d.ts +2 -2
  175. package/lib/plugin/plugin_manager.js +1 -1
  176. package/lib/plugin/types.d.ts +59 -9
  177. package/lib/plugin/types.js +1 -1
  178. package/lib/publish/index.js +1 -1
  179. package/lib/publish/publish_plugin.d.ts +1 -1
  180. package/lib/publish/publish_plugin.js +14 -15
  181. package/lib/publish/types.js +1 -1
  182. package/lib/runtime/attachment_manager/index.d.ts +1 -1
  183. package/lib/runtime/attachment_manager/index.js +3 -6
  184. package/lib/runtime/coordinator.d.ts +13 -6
  185. package/lib/runtime/coordinator.js +26 -18
  186. package/lib/runtime/format_error.d.ts +1 -1
  187. package/lib/runtime/format_error.js +43 -15
  188. package/lib/runtime/helpers.d.ts +2 -2
  189. package/lib/runtime/helpers.js +2 -2
  190. package/lib/runtime/index.js +1 -1
  191. package/lib/runtime/make_runtime.d.ts +10 -9
  192. package/lib/runtime/make_runtime.js +4 -5
  193. package/lib/runtime/make_suggestion.d.ts +2 -2
  194. package/lib/runtime/make_suggestion.js +1 -1
  195. package/lib/runtime/parallel/adapter.d.ts +27 -39
  196. package/lib/runtime/parallel/adapter.js +124 -122
  197. package/lib/runtime/parallel/test_cases_phase.d.ts +19 -0
  198. package/lib/runtime/parallel/test_cases_phase.js +63 -0
  199. package/lib/runtime/parallel/test_run_hooks_phase.d.ts +11 -0
  200. package/lib/runtime/parallel/test_run_hooks_phase.js +33 -0
  201. package/lib/runtime/parallel/types.d.ts +38 -22
  202. package/lib/runtime/parallel/types.js +1 -1
  203. package/lib/runtime/parallel/worker.mjs +65 -0
  204. package/lib/runtime/scope/index.js +1 -1
  205. package/lib/runtime/scope/make_proxy.js +1 -1
  206. package/lib/runtime/scope/test_case_scope.d.ts +1 -1
  207. package/lib/runtime/scope/test_case_scope.js +1 -1
  208. package/lib/runtime/scope/test_run_scope.d.ts +1 -1
  209. package/lib/runtime/scope/test_run_scope.js +1 -1
  210. package/lib/runtime/serial/adapter.d.ts +15 -9
  211. package/lib/runtime/serial/adapter.js +21 -9
  212. package/lib/runtime/step_runner.d.ts +2 -2
  213. package/lib/runtime/step_runner.js +2 -2
  214. package/lib/runtime/stopwatch.d.ts +1 -1
  215. package/lib/runtime/stopwatch.js +1 -1
  216. package/lib/runtime/test_case_runner.d.ts +10 -9
  217. package/lib/runtime/test_case_runner.js +20 -12
  218. package/lib/runtime/types.d.ts +7 -3
  219. package/lib/runtime/types.js +1 -1
  220. package/lib/runtime/worker.d.ts +14 -13
  221. package/lib/runtime/worker.js +26 -44
  222. package/lib/sharding/index.js +1 -1
  223. package/lib/sharding/sharding_plugin.d.ts +1 -1
  224. package/lib/sharding/sharding_plugin.js +1 -1
  225. package/lib/step_arguments.d.ts +1 -1
  226. package/lib/step_arguments.js +1 -1
  227. package/lib/support_code_library_builder/build_parameter_type.d.ts +1 -1
  228. package/lib/support_code_library_builder/build_parameter_type.js +5 -3
  229. package/lib/support_code_library_builder/context.js +1 -1
  230. package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +1 -1
  231. package/lib/support_code_library_builder/get_definition_line_and_uri.js +1 -1
  232. package/lib/support_code_library_builder/index.d.ts +7 -7
  233. package/lib/support_code_library_builder/index.js +9 -9
  234. package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +1 -1
  235. package/lib/support_code_library_builder/parallel_can_assign_helpers.js +3 -4
  236. package/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts +2 -2
  237. package/lib/support_code_library_builder/sourced_parameter_type_registry.js +1 -1
  238. package/lib/support_code_library_builder/types.d.ts +8 -8
  239. package/lib/support_code_library_builder/types.js +1 -1
  240. package/lib/support_code_library_builder/validate_arguments.d.ts +1 -1
  241. package/lib/support_code_library_builder/validate_arguments.js +1 -1
  242. package/lib/support_code_library_builder/world.d.ts +2 -2
  243. package/lib/support_code_library_builder/world.js +2 -2
  244. package/lib/time.js +2 -2
  245. package/lib/try_require.js +3 -2
  246. package/lib/types/index.js +1 -1
  247. package/lib/uncaught_exception_manager.js +1 -1
  248. package/lib/user_code_runner.d.ts +1 -1
  249. package/lib/user_code_runner.js +3 -3
  250. package/lib/value_checker.js +1 -1
  251. package/lib/version.d.ts +1 -1
  252. package/lib/version.js +2 -2
  253. package/lib/wrapper.mjs +1 -5
  254. package/package.json +40 -63
  255. package/lib/api/convert_configuration.js.map +0 -1
  256. package/lib/api/emit_support_code_messages.js.map +0 -1
  257. package/lib/api/formatters.js.map +0 -1
  258. package/lib/api/gherkin.js.map +0 -1
  259. package/lib/api/index.js.map +0 -1
  260. package/lib/api/load_configuration.js.map +0 -1
  261. package/lib/api/load_sources.js.map +0 -1
  262. package/lib/api/load_support.js.map +0 -1
  263. package/lib/api/plugins.js.map +0 -1
  264. package/lib/api/run_cucumber.js.map +0 -1
  265. package/lib/api/support.js.map +0 -1
  266. package/lib/api/test_helpers.js.map +0 -1
  267. package/lib/api/types.js.map +0 -1
  268. package/lib/assemble/assemble_test_cases.js.map +0 -1
  269. package/lib/assemble/index.js.map +0 -1
  270. package/lib/assemble/types.js.map +0 -1
  271. package/lib/cli/i18n.js.map +0 -1
  272. package/lib/cli/index.js.map +0 -1
  273. package/lib/cli/install_validator.js.map +0 -1
  274. package/lib/cli/run.js.map +0 -1
  275. package/lib/cli/validate_node_engine_version.js.map +0 -1
  276. package/lib/configuration/argv_parser.js.map +0 -1
  277. package/lib/configuration/check_schema.js.map +0 -1
  278. package/lib/configuration/default_configuration.js.map +0 -1
  279. package/lib/configuration/from_file.js.map +0 -1
  280. package/lib/configuration/helpers.js.map +0 -1
  281. package/lib/configuration/index.js.map +0 -1
  282. package/lib/configuration/locate_file.js.map +0 -1
  283. package/lib/configuration/merge_configurations.js.map +0 -1
  284. package/lib/configuration/parse_configuration.js.map +0 -1
  285. package/lib/configuration/split_format_descriptor.js.map +0 -1
  286. package/lib/configuration/types.js.map +0 -1
  287. package/lib/configuration/validate_configuration.js.map +0 -1
  288. package/lib/environment/console_logger.js.map +0 -1
  289. package/lib/environment/index.js.map +0 -1
  290. package/lib/environment/make_environment.js.map +0 -1
  291. package/lib/environment/types.js.map +0 -1
  292. package/lib/filter/filter_plugin.js.map +0 -1
  293. package/lib/filter/index.js.map +0 -1
  294. package/lib/filter/order_pickles.js.map +0 -1
  295. package/lib/filter/types.js.map +0 -1
  296. package/lib/filter_stack_trace.js.map +0 -1
  297. package/lib/formatter/builder.js.map +0 -1
  298. package/lib/formatter/builtin/html.js.map +0 -1
  299. package/lib/formatter/builtin/index.js.map +0 -1
  300. package/lib/formatter/builtin/message.js.map +0 -1
  301. package/lib/formatter/create_stream.js.map +0 -1
  302. package/lib/formatter/find_class_or_plugin.js.map +0 -1
  303. package/lib/formatter/get_color_fns.js.map +0 -1
  304. package/lib/formatter/helpers/duration_helpers.js.map +0 -1
  305. package/lib/formatter/helpers/event_data_collector.js.map +0 -1
  306. package/lib/formatter/helpers/formatters.js.map +0 -1
  307. package/lib/formatter/helpers/gherkin_document_parser.js.map +0 -1
  308. package/lib/formatter/helpers/index.js.map +0 -1
  309. package/lib/formatter/helpers/issue_helpers.js.map +0 -1
  310. package/lib/formatter/helpers/keyword_type.js.map +0 -1
  311. package/lib/formatter/helpers/location_helpers.js.map +0 -1
  312. package/lib/formatter/helpers/pickle_parser.js.map +0 -1
  313. package/lib/formatter/helpers/step_argument_formatter.js.map +0 -1
  314. package/lib/formatter/helpers/summary_helpers.js.map +0 -1
  315. package/lib/formatter/helpers/test_case_attempt_formatter.js.map +0 -1
  316. package/lib/formatter/helpers/test_case_attempt_parser.js.map +0 -1
  317. package/lib/formatter/helpers/usage_helpers/index.js.map +0 -1
  318. package/lib/formatter/import_code.js.map +0 -1
  319. package/lib/formatter/index.js.map +0 -1
  320. package/lib/formatter/json_formatter.js.map +0 -1
  321. package/lib/formatter/progress_bar_formatter.d.ts +0 -18
  322. package/lib/formatter/progress_bar_formatter.js +0 -103
  323. package/lib/formatter/progress_bar_formatter.js.map +0 -1
  324. package/lib/formatter/progress_formatter.js.map +0 -1
  325. package/lib/formatter/rerun_formatter.js.map +0 -1
  326. package/lib/formatter/resolve_implementation.js.map +0 -1
  327. package/lib/formatter/snippets_formatter.js.map +0 -1
  328. package/lib/formatter/step_definition_snippet_builder/index.js.map +0 -1
  329. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map +0 -1
  330. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map +0 -1
  331. package/lib/formatter/summary_formatter.js.map +0 -1
  332. package/lib/formatter/usage_formatter.js.map +0 -1
  333. package/lib/formatter/usage_json_formatter.js.map +0 -1
  334. package/lib/index.js.map +0 -1
  335. package/lib/models/data_table.js.map +0 -1
  336. package/lib/models/definition.js.map +0 -1
  337. package/lib/models/gherkin_step_keyword.js.map +0 -1
  338. package/lib/models/step_definition.js.map +0 -1
  339. package/lib/models/test_case_hook_definition.js.map +0 -1
  340. package/lib/models/test_run_hook_definition.js.map +0 -1
  341. package/lib/models/test_step_hook_definition.js.map +0 -1
  342. package/lib/paths/index.js.map +0 -1
  343. package/lib/paths/paths.js.map +0 -1
  344. package/lib/paths/types.js.map +0 -1
  345. package/lib/pickle_filter.js.map +0 -1
  346. package/lib/plugin/index.js.map +0 -1
  347. package/lib/plugin/plugin_manager.js.map +0 -1
  348. package/lib/plugin/types.js.map +0 -1
  349. package/lib/publish/index.js.map +0 -1
  350. package/lib/publish/publish_plugin.js.map +0 -1
  351. package/lib/publish/types.js.map +0 -1
  352. package/lib/runtime/attachment_manager/index.js.map +0 -1
  353. package/lib/runtime/coordinator.js.map +0 -1
  354. package/lib/runtime/format_error.js.map +0 -1
  355. package/lib/runtime/helpers.js.map +0 -1
  356. package/lib/runtime/index.js.map +0 -1
  357. package/lib/runtime/make_runtime.js.map +0 -1
  358. package/lib/runtime/make_suggestion.js.map +0 -1
  359. package/lib/runtime/parallel/adapter.js.map +0 -1
  360. package/lib/runtime/parallel/run_worker.js +0 -25
  361. package/lib/runtime/parallel/run_worker.js.map +0 -1
  362. package/lib/runtime/parallel/types.js.map +0 -1
  363. package/lib/runtime/parallel/worker.d.ts +0 -25
  364. package/lib/runtime/parallel/worker.js +0 -83
  365. package/lib/runtime/parallel/worker.js.map +0 -1
  366. package/lib/runtime/scope/index.js.map +0 -1
  367. package/lib/runtime/scope/make_proxy.js.map +0 -1
  368. package/lib/runtime/scope/test_case_scope.js.map +0 -1
  369. package/lib/runtime/scope/test_run_scope.js.map +0 -1
  370. package/lib/runtime/serial/adapter.js.map +0 -1
  371. package/lib/runtime/step_runner.js.map +0 -1
  372. package/lib/runtime/stopwatch.js.map +0 -1
  373. package/lib/runtime/test_case_runner.js.map +0 -1
  374. package/lib/runtime/types.js.map +0 -1
  375. package/lib/runtime/worker.js.map +0 -1
  376. package/lib/sharding/index.js.map +0 -1
  377. package/lib/sharding/sharding_plugin.js.map +0 -1
  378. package/lib/step_arguments.js.map +0 -1
  379. package/lib/support_code_library_builder/build_parameter_type.js.map +0 -1
  380. package/lib/support_code_library_builder/context.js.map +0 -1
  381. package/lib/support_code_library_builder/get_definition_line_and_uri.js.map +0 -1
  382. package/lib/support_code_library_builder/index.js.map +0 -1
  383. package/lib/support_code_library_builder/parallel_can_assign_helpers.js.map +0 -1
  384. package/lib/support_code_library_builder/sourced_parameter_type_registry.js.map +0 -1
  385. package/lib/support_code_library_builder/types.js.map +0 -1
  386. package/lib/support_code_library_builder/validate_arguments.js.map +0 -1
  387. package/lib/support_code_library_builder/world.js.map +0 -1
  388. package/lib/time.js.map +0 -1
  389. package/lib/try_require.js.map +0 -1
  390. package/lib/tsconfig.node.tsbuildinfo +0 -1
  391. package/lib/types/index.js.map +0 -1
  392. package/lib/uncaught_exception_manager.js.map +0 -1
  393. package/lib/user_code_runner.js.map +0 -1
  394. package/lib/value_checker.js.map +0 -1
  395. package/lib/version.js.map +0 -1
  396. /package/lib/runtime/parallel/{run_worker.d.ts → worker.d.mts} +0 -0
@@ -28,4 +28,4 @@ function makeSuggestion({ newId, snippetBuilder, pickleStep, }) {
28
28
  snippets,
29
29
  };
30
30
  }
31
- //# sourceMappingURL=make_suggestion.js.map
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZV9zdWdnZXN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvbWFrZV9zdWdnZXN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBc0JBLHdDQXFCQztBQTNDRCxpREFLMkI7QUFDM0Isa0RBQWtEO0FBR2xELFNBQVMsOEJBQThCLENBQUMsSUFBcUI7SUFDM0QsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUsseUJBQWMsQ0FBQyxPQUFPO1lBQ3pCLE9BQU8scUJBQVcsQ0FBQyxZQUFZLENBQUE7UUFDakMsS0FBSyx5QkFBYyxDQUFDLE1BQU07WUFDeEIsT0FBTyxxQkFBVyxDQUFDLEtBQUssQ0FBQTtRQUMxQixLQUFLLHlCQUFjLENBQUMsT0FBTztZQUN6QixPQUFPLHFCQUFXLENBQUMsT0FBTyxDQUFBO1FBQzVCO1lBQ0UsT0FBTyxxQkFBVyxDQUFDLFlBQVksQ0FBQTtJQUNuQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxFQUM3QixLQUFLLEVBQ0wsY0FBYyxFQUNkLFVBQVUsR0FLWDtJQUNDLE1BQU0sV0FBVyxHQUFHLDhCQUE4QixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNuRSxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7SUFDdkUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxJQUFJO1FBQ0osUUFBUSxFQUFFLFlBQVk7S0FDdkIsQ0FBQyxDQUFDLENBQUE7SUFFSCxPQUFPO1FBQ0wsRUFBRSxFQUFFLEtBQUssRUFBRTtRQUNYLFlBQVksRUFBRSxVQUFVLENBQUMsRUFBRTtRQUMzQixRQUFRO0tBQ1QsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIElkR2VuZXJhdG9yLFxuICB0eXBlIFBpY2tsZVN0ZXAsXG4gIFBpY2tsZVN0ZXBUeXBlLFxuICB0eXBlIFN1Z2dlc3Rpb24sXG59IGZyb20gJ0BjdWN1bWJlci9tZXNzYWdlcydcbmltcG9ydCB7IEtleXdvcmRUeXBlIH0gZnJvbSAnLi4vZm9ybWF0dGVyL2hlbHBlcnMnXG5pbXBvcnQgdHlwZSBTdGVwRGVmaW5pdGlvblNuaXBwZXRCdWlsZGVyIGZyb20gJy4uL2Zvcm1hdHRlci9zdGVwX2RlZmluaXRpb25fc25pcHBldF9idWlsZGVyJ1xuXG5mdW5jdGlvbiBtYXBQaWNrbGVTdGVwVHlwZVRvS2V5d29yZFR5cGUodHlwZT86IFBpY2tsZVN0ZXBUeXBlKTogS2V5d29yZFR5cGUge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFBpY2tsZVN0ZXBUeXBlLkNPTlRFWFQ6XG4gICAgICByZXR1cm4gS2V5d29yZFR5cGUuUHJlY29uZGl0aW9uXG4gICAgY2FzZSBQaWNrbGVTdGVwVHlwZS5BQ1RJT046XG4gICAgICByZXR1cm4gS2V5d29yZFR5cGUuRXZlbnRcbiAgICBjYXNlIFBpY2tsZVN0ZXBUeXBlLk9VVENPTUU6XG4gICAgICByZXR1cm4gS2V5d29yZFR5cGUuT3V0Y29tZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gS2V5d29yZFR5cGUuUHJlY29uZGl0aW9uXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VTdWdnZXN0aW9uKHtcbiAgbmV3SWQsXG4gIHNuaXBwZXRCdWlsZGVyLFxuICBwaWNrbGVTdGVwLFxufToge1xuICBuZXdJZDogSWRHZW5lcmF0b3IuTmV3SWRcbiAgc25pcHBldEJ1aWxkZXI6IFN0ZXBEZWZpbml0aW9uU25pcHBldEJ1aWxkZXJcbiAgcGlja2xlU3RlcDogUGlja2xlU3RlcFxufSk6IFN1Z2dlc3Rpb24ge1xuICBjb25zdCBrZXl3b3JkVHlwZSA9IG1hcFBpY2tsZVN0ZXBUeXBlVG9LZXl3b3JkVHlwZShwaWNrbGVTdGVwLnR5cGUpXG4gIGNvbnN0IGNvZGVzID0gc25pcHBldEJ1aWxkZXIuYnVpbGRNdWx0aXBsZSh7IGtleXdvcmRUeXBlLCBwaWNrbGVTdGVwIH0pXG4gIGNvbnN0IHNuaXBwZXRzID0gY29kZXMubWFwKChjb2RlKSA9PiAoe1xuICAgIGNvZGUsXG4gICAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0JyxcbiAgfSkpXG5cbiAgcmV0dXJuIHtcbiAgICBpZDogbmV3SWQoKSxcbiAgICBwaWNrbGVTdGVwSWQ6IHBpY2tsZVN0ZXAuaWQsXG4gICAgc25pcHBldHMsXG4gIH1cbn1cbiJdfQ==
@@ -1,28 +1,18 @@
1
- import { ChildProcess } from 'node:child_process';
2
- import { EventEmitter } from 'node:events';
3
- import { SupportCodeLibrary } from '../../support_code_library_builder/types';
4
- import { AssembledTestCase } from '../../assemble';
5
- import { ILogger, IRunEnvironment } from '../../environment';
6
- import { RuntimeAdapter } from '../types';
7
- import { IRunOptionsRuntime } from '../../api';
8
- import { FormatOptions } from '../../formatter';
9
- import { WorkerToCoordinatorEvent } from './types';
10
- declare const enum WorkerState {
11
- 'idle' = 0,
12
- 'closed' = 1,
13
- 'running' = 2,
14
- 'new' = 3
15
- }
16
- interface ManagedWorker {
17
- state: WorkerState;
18
- process: ChildProcess;
19
- id: string;
20
- }
21
- interface WorkPlacement {
22
- index: number;
23
- item: AssembledTestCase;
24
- }
25
- export declare class ChildProcessAdapter implements RuntimeAdapter {
1
+ import type { EventEmitter } from 'node:events';
2
+ import type { IRunOptionsRuntime } from '../../api';
3
+ import type { AssembledTestCase } from '../../assemble';
4
+ import type { ILogger, IRunEnvironment } from '../../environment';
5
+ import type { FormatOptions } from '../../formatter';
6
+ import type { SupportCodeLibrary } from '../../support_code_library_builder/types';
7
+ import type { RuntimeAdapter } from '../types';
8
+ /**
9
+ * An adapter that distributes work across multiple worker threads
10
+ * @remarks
11
+ * Each phase of the test run is self-contained and self-orchestrating - every
12
+ * FINISHED message from a worker may cause the next piece of work to be
13
+ * triggered or the phase to be settled.
14
+ */
15
+ export declare class WorkerThreadsAdapter implements RuntimeAdapter {
26
16
  private readonly testRunStartedId;
27
17
  private readonly environment;
28
18
  private readonly logger;
@@ -30,20 +20,18 @@ export declare class ChildProcessAdapter implements RuntimeAdapter {
30
20
  private readonly options;
31
21
  private readonly snippetOptions;
32
22
  private readonly supportCodeLibrary;
33
- private idleInterventions;
34
- private failing;
35
- private onFinish;
36
- private todo;
37
- private readonly inProgress;
23
+ private readiness;
24
+ private phase;
38
25
  private readonly workers;
26
+ private readonly running;
39
27
  constructor(testRunStartedId: string, environment: IRunEnvironment, logger: ILogger, eventBroadcaster: EventEmitter, options: IRunOptionsRuntime, snippetOptions: Pick<FormatOptions, 'snippetInterface' | 'snippetSyntax'>, supportCodeLibrary: SupportCodeLibrary);
40
- parseWorkerMessage(worker: ManagedWorker, message: WorkerToCoordinatorEvent): void;
41
- awakenWorkers(triggeringWorker: ManagedWorker): void;
42
- startWorker(id: string, total: number): void;
43
- onWorkerProcessClose(exitCode: number): void;
44
- run(assembledTestCases: ReadonlyArray<AssembledTestCase>): Promise<boolean>;
45
- nextWorkPlacement(): WorkPlacement;
46
- placementAt(index: number): WorkPlacement;
47
- giveWork(worker: ManagedWorker, force?: boolean): void;
28
+ setup(): Promise<void>;
29
+ runBeforeAllHooks(): Promise<boolean>;
30
+ runTestCases(assembledTestCases: ReadonlyArray<AssembledTestCase>): Promise<boolean>;
31
+ runAfterAllHooks(): Promise<boolean>;
32
+ teardown(): Promise<void>;
33
+ private startPhase;
34
+ private issueCommandToWorker;
35
+ private handleEventFromWorker;
36
+ private handleErrorFromWorker;
48
37
  }
49
- export {};
@@ -3,11 +3,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ChildProcessAdapter = void 0;
7
- const node_child_process_1 = require("node:child_process");
6
+ exports.WorkerThreadsAdapter = void 0;
8
7
  const node_path_1 = __importDefault(require("node:path"));
9
- const runWorkerPath = node_path_1.default.resolve(__dirname, 'run_worker.js');
10
- class ChildProcessAdapter {
8
+ const node_worker_threads_1 = require("node:worker_threads");
9
+ const test_cases_phase_1 = require("./test_cases_phase");
10
+ const test_run_hooks_phase_1 = require("./test_run_hooks_phase");
11
+ /**
12
+ * An adapter that distributes work across multiple worker threads
13
+ * @remarks
14
+ * Each phase of the test run is self-contained and self-orchestrating - every
15
+ * FINISHED message from a worker may cause the next piece of work to be
16
+ * triggered or the phase to be settled.
17
+ */
18
+ class WorkerThreadsAdapter {
11
19
  testRunStartedId;
12
20
  environment;
13
21
  logger;
@@ -15,12 +23,10 @@ class ChildProcessAdapter {
15
23
  options;
16
24
  snippetOptions;
17
25
  supportCodeLibrary;
18
- idleInterventions = 0;
19
- failing = false;
20
- onFinish;
21
- todo = [];
22
- inProgress = {};
23
- workers = {};
26
+ readiness;
27
+ phase;
28
+ workers = new Set();
29
+ running = new Map();
24
30
  constructor(testRunStartedId, environment, logger, eventBroadcaster, options, snippetOptions, supportCodeLibrary) {
25
31
  this.testRunStartedId = testRunStartedId;
26
32
  this.environment = environment;
@@ -30,131 +36,127 @@ class ChildProcessAdapter {
30
36
  this.snippetOptions = snippetOptions;
31
37
  this.supportCodeLibrary = supportCodeLibrary;
32
38
  }
33
- parseWorkerMessage(worker, message) {
34
- switch (message.type) {
35
- case 'READY':
36
- worker.state = 0 /* WorkerState.idle */;
37
- this.awakenWorkers(worker);
38
- break;
39
- case 'ENVELOPE':
40
- this.eventBroadcaster.emit('envelope', message.envelope);
41
- break;
42
- case 'FINISHED':
43
- if (!message.success) {
44
- this.failing = true;
45
- }
46
- delete this.inProgress[worker.id];
47
- worker.state = 0 /* WorkerState.idle */;
48
- this.awakenWorkers(worker);
49
- break;
50
- default:
51
- throw new Error(`Unexpected message from worker: ${JSON.stringify(message)}`);
52
- }
53
- }
54
- awakenWorkers(triggeringWorker) {
55
- Object.values(this.workers).forEach((worker) => {
56
- if (worker.state === 0 /* WorkerState.idle */) {
57
- this.giveWork(worker);
39
+ async setup() {
40
+ await new Promise((resolve, reject) => {
41
+ this.readiness = { resolve, reject };
42
+ const total = this.options.parallel;
43
+ for (let i = 0; i < total; i++) {
44
+ const id = i.toString();
45
+ // spin up a dedicated message channel for coordinator-worker comms
46
+ const { port1, port2 } = new node_worker_threads_1.MessageChannel();
47
+ const workerThread = new node_worker_threads_1.Worker(node_path_1.default.resolve(__dirname, 'worker.mjs'), {
48
+ env: {
49
+ ...this.environment.env,
50
+ CUCUMBER_PARALLEL: 'true',
51
+ CUCUMBER_TOTAL_WORKERS: total.toString(),
52
+ CUCUMBER_WORKER_ID: id,
53
+ },
54
+ resourceLimits: this.options.workerOptions?.resourceLimits,
55
+ workerData: {
56
+ cwd: this.environment.cwd,
57
+ testRunStartedId: this.testRunStartedId,
58
+ supportCodeCoordinates: this.supportCodeLibrary.originalCoordinates,
59
+ supportCodeIds: {
60
+ stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id),
61
+ beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id),
62
+ afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id),
63
+ beforeTestRunHookDefinitionIds: this.supportCodeLibrary.beforeTestRunHookDefinitions.map((h) => h.id),
64
+ afterTestRunHookDefinitionIds: this.supportCodeLibrary.afterTestRunHookDefinitions.map((h) => h.id),
65
+ },
66
+ options: this.options,
67
+ snippetOptions: this.snippetOptions,
68
+ port: port2,
69
+ },
70
+ transferList: [port2],
71
+ });
72
+ const worker = {
73
+ id,
74
+ workerThread,
75
+ port: port1,
76
+ ready: false,
77
+ };
78
+ this.workers.add(worker);
79
+ port1.on('message', (event) => {
80
+ this.handleEventFromWorker(worker, event);
81
+ });
82
+ workerThread.on('error', (error) => {
83
+ this.handleErrorFromWorker(error, worker);
84
+ });
58
85
  }
59
- return worker.state !== 0 /* WorkerState.idle */;
60
86
  });
61
- if (Object.keys(this.inProgress).length == 0 && this.todo.length > 0) {
62
- this.giveWork(triggeringWorker, true);
63
- this.idleInterventions++;
64
- }
87
+ delete this.readiness;
65
88
  }
66
- startWorker(id, total) {
67
- const workerProcess = (0, node_child_process_1.fork)(runWorkerPath, [], {
68
- cwd: this.environment.cwd,
69
- env: {
70
- ...this.environment.env,
71
- CUCUMBER_PARALLEL: 'true',
72
- CUCUMBER_TOTAL_WORKERS: total.toString(),
73
- CUCUMBER_WORKER_ID: id,
74
- },
75
- stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
89
+ async runBeforeAllHooks() {
90
+ const success = await new Promise((resolve, reject) => {
91
+ this.phase = new test_run_hooks_phase_1.TestRunHooksPhase(resolve, reject, 'BEFOREALL_HOOKS');
92
+ this.startPhase();
76
93
  });
77
- const worker = { state: 3 /* WorkerState.new */, process: workerProcess, id };
78
- this.workers[id] = worker;
79
- worker.process.on('message', (message) => {
80
- this.parseWorkerMessage(worker, message);
81
- });
82
- worker.process.on('close', (exitCode) => {
83
- worker.state = 1 /* WorkerState.closed */;
84
- this.onWorkerProcessClose(exitCode);
94
+ delete this.phase;
95
+ return success;
96
+ }
97
+ async runTestCases(assembledTestCases) {
98
+ const success = await new Promise((resolve, reject) => {
99
+ this.phase = new test_cases_phase_1.TestCasesPhase(resolve, reject, this.logger, this.supportCodeLibrary.parallelCanAssign, assembledTestCases);
100
+ this.startPhase();
85
101
  });
86
- worker.process.send({
87
- type: 'INITIALIZE',
88
- testRunStartedId: this.testRunStartedId,
89
- supportCodeCoordinates: this.supportCodeLibrary.originalCoordinates,
90
- supportCodeIds: {
91
- stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id),
92
- beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id),
93
- afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id),
94
- beforeTestRunHookDefinitionIds: this.supportCodeLibrary.beforeTestRunHookDefinitions.map((h) => h.id),
95
- afterTestRunHookDefinitionIds: this.supportCodeLibrary.afterTestRunHookDefinitions.map((h) => h.id),
96
- },
97
- options: this.options,
98
- snippetOptions: this.snippetOptions,
102
+ delete this.phase;
103
+ return success;
104
+ }
105
+ async runAfterAllHooks() {
106
+ const success = await new Promise((resolve, reject) => {
107
+ this.phase = new test_run_hooks_phase_1.TestRunHooksPhase(resolve, reject, 'AFTERALL_HOOKS');
108
+ this.startPhase();
99
109
  });
110
+ delete this.phase;
111
+ return success;
100
112
  }
101
- onWorkerProcessClose(exitCode) {
102
- if (exitCode !== 0) {
103
- this.failing = true;
104
- }
105
- if (Object.values(this.workers).every((x) => x.state === 1 /* WorkerState.closed */)) {
106
- this.onFinish(!this.failing);
113
+ async teardown() {
114
+ for (const worker of this.workers.values()) {
115
+ await worker.workerThread.terminate();
116
+ // close our end of the channel so it stops keeping the loop alive
117
+ worker.port.close();
107
118
  }
108
119
  }
109
- async run(assembledTestCases) {
110
- this.todo = Array.from(assembledTestCases);
111
- return await new Promise((resolve) => {
112
- for (let i = 0; i < this.options.parallel; i++) {
113
- this.startWorker(i.toString(), this.options.parallel);
114
- }
115
- this.onFinish = (status) => {
116
- if (this.idleInterventions > 0) {
117
- this.logger.warn(`WARNING: All workers went idle ${this.idleInterventions} time(s). Consider revising handler passed to setParallelCanAssign.`);
118
- }
119
- resolve(status);
120
- };
121
- });
122
- }
123
- nextWorkPlacement() {
124
- for (let index = 0; index < this.todo.length; index++) {
125
- const placement = this.placementAt(index);
126
- if (this.supportCodeLibrary.parallelCanAssign(placement.item.pickle, Object.values(this.inProgress).map(({ pickle }) => pickle))) {
127
- return placement;
120
+ startPhase() {
121
+ for (const worker of this.workers) {
122
+ const command = this.phase.fill();
123
+ if (command) {
124
+ this.issueCommandToWorker(worker, command);
128
125
  }
129
126
  }
130
- return null;
131
127
  }
132
- placementAt(index) {
133
- return {
134
- index,
135
- item: this.todo[index],
136
- };
128
+ issueCommandToWorker(worker, command) {
129
+ this.running.set(worker, command);
130
+ worker.port.postMessage(command);
137
131
  }
138
- giveWork(worker, force = false) {
139
- if (this.todo.length < 1) {
140
- worker.state = 2 /* WorkerState.running */;
141
- worker.process.send({ type: 'FINALIZE' });
142
- return;
143
- }
144
- const workPlacement = force ? this.placementAt(0) : this.nextWorkPlacement();
145
- if (workPlacement === null) {
146
- return;
132
+ handleEventFromWorker(worker, event) {
133
+ switch (event.type) {
134
+ case 'READY':
135
+ worker.ready = true;
136
+ if ([...this.workers].every((mw) => mw.ready)) {
137
+ this.readiness?.resolve();
138
+ }
139
+ break;
140
+ case 'ENVELOPE':
141
+ this.eventBroadcaster.emit('envelope', event.envelope);
142
+ break;
143
+ case 'FINISHED': {
144
+ const previousCommand = this.running.get(worker);
145
+ this.running.delete(worker);
146
+ const nextCommand = this.phase?.next(previousCommand, event);
147
+ if (nextCommand) {
148
+ this.issueCommandToWorker(worker, nextCommand);
149
+ }
150
+ break;
151
+ }
147
152
  }
148
- const { index: nextIndex, item } = workPlacement;
149
- this.todo.splice(nextIndex, 1);
150
- this.inProgress[worker.id] = item;
151
- worker.state = 2 /* WorkerState.running */;
152
- worker.process.send({
153
- type: 'RUN',
154
- assembledTestCase: item,
155
- failing: this.failing,
156
- });
153
+ }
154
+ handleErrorFromWorker(error, worker) {
155
+ const reason = new Error(`Error on worker ${worker.id}`, { cause: error });
156
+ this.readiness?.reject(reason);
157
+ this.phase?.reject(reason);
158
+ void this.teardown();
157
159
  }
158
160
  }
159
- exports.ChildProcessAdapter = ChildProcessAdapter;
160
- //# sourceMappingURL=adapter.js.map
161
+ exports.WorkerThreadsAdapter = WorkerThreadsAdapter;
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW50aW1lL3BhcmFsbGVsL2FkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsMERBQTRCO0FBQzVCLDZEQUE0RDtBQU81RCx5REFBbUQ7QUFDbkQsaUVBQTBEO0FBRzFEOzs7Ozs7R0FNRztBQUNILE1BQWEsb0JBQW9CO0lBVVo7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFmWCxTQUFTLENBR2hCO0lBQ08sS0FBSyxDQUFPO0lBQ0gsT0FBTyxHQUF1QixJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3ZDLE9BQU8sR0FBc0MsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV2RSxZQUNtQixnQkFBd0IsRUFDeEIsV0FBNEIsRUFDNUIsTUFBZSxFQUNmLGdCQUE4QixFQUM5QixPQUEyQixFQUMzQixjQUF5RSxFQUN6RSxrQkFBc0M7UUFOdEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQ2YscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFjO1FBQzlCLFlBQU8sR0FBUCxPQUFPLENBQW9CO1FBQzNCLG1CQUFjLEdBQWQsY0FBYyxDQUEyRDtRQUN6RSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO0lBQ3RELENBQUM7SUFFSixLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQTtZQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQTtZQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENB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LGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUN0RCxNQUFLO1lBQ1AsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQzNCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQTtnQkFDNUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQTtnQkFDaEQsQ0FBQztnQkFDRCxNQUFLO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsS0FBWSxFQUFFLE1BQXFCO1FBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLG1CQUFtQixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUMxRSxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5QixJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMxQixLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUN0QixDQUFDO0NBQ0Y7QUE5SkQsb0RBOEpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdub2RlOmV2ZW50cydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB7IE1lc3NhZ2VDaGFubmVsLCBXb3JrZXIgfSBmcm9tICdub2RlOndvcmtlcl90aHJlYWRzJ1xuaW1wb3J0IHR5cGUgeyBJUnVuT3B0aW9uc1J1bnRpbWUgfSBmcm9tICcuLi8uLi9hcGknXG5pbXBvcnQgdHlwZSB7IEFzc2VtYmxlZFRlc3RDYXNlIH0gZnJvbSAnLi4vLi4vYXNzZW1ibGUnXG5pbXBvcnQgdHlwZSB7IElMb2dnZXIsIElSdW5FbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL2Vudmlyb25tZW50J1xuaW1wb3J0IHR5cGUgeyBGb3JtYXRPcHRpb25zIH0gZnJvbSAnLi4vLi4vZm9ybWF0dGVyJ1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0Q29kZUxpYnJhcnkgfSBmcm9tICcuLi8uLi9zdXBwb3J0X2NvZGVfbGlicmFyeV9idWlsZGVyL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBSdW50aW1lQWRhcHRlciB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgVGVzdENhc2VzUGhhc2UgfSBmcm9tICcuL3Rlc3RfY2FzZXNfcGhhc2UnXG5pbXBvcnQgeyBUZXN0UnVuSG9va3NQaGFzZSB9IGZyb20gJy4vdGVzdF9ydW5faG9va3NfcGhhc2UnXG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRXb3JrZXIsIFBoYXNlLCBXb3JrZXJDb21tYW5kLCBXb3JrZXJEYXRhLCBXb3JrZXJFdmVudCB9IGZyb20gJy4vdHlwZXMnXG5cbi8qKlxuICogQW4gYWRhcHRlciB0aGF0IGRpc3RyaWJ1dGVzIHdvcmsgYWNyb3NzIG11bHRpcGxlIHdvcmtlciB0aHJlYWRzXG4gKiBAcmVtYXJrc1xuICogRWFjaCBwaGFzZSBvZiB0aGUgdGVzdCBydW4gaXMgc2VsZi1jb250YWluZWQgYW5kIHNlbGYtb3JjaGVzdHJhdGluZyAtIGV2ZXJ5XG4gKiBGSU5JU0hFRCBtZXNzYWdlIGZyb20gYSB3b3JrZXIgbWF5IGNhdXNlIHRoZSBuZXh0IHBpZWNlIG9mIHdvcmsgdG8gYmVcbiAqIHRyaWdnZXJlZCBvciB0aGUgcGhhc2UgdG8gYmUgc2V0dGxlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtlclRocmVhZHNBZGFwdGVyIGltcGxlbWVudHMgUnVudGltZUFkYXB0ZXIge1xuICBwcml2YXRlIHJlYWRpbmVzczoge1xuICAgIHJlc29sdmU6ICgpID0+IHZvaWRcbiAgICByZWplY3Q6IChyZWFzb246IHVua25vd24pID0+IHZvaWRcbiAgfVxuICBwcml2YXRlIHBoYXNlOiBQaGFzZVxuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlcnM6IFNldDxNYW5hZ2VkV29ya2VyPiA9IG5ldyBTZXQoKVxuICBwcml2YXRlIHJlYWRvbmx5IHJ1bm5pbmc6IE1hcDxNYW5hZ2VkV29ya2VyLCBXb3JrZXJDb21tYW5kPiA9IG5ldyBNYXAoKVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVzdFJ1blN0YXJ0ZWRJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IElSdW5FbnZpcm9ubWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnJvYWRjYXN0ZXI6IEV2ZW50RW1pdHRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IElSdW5PcHRpb25zUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNuaXBwZXRPcHRpb25zOiBQaWNrPEZvcm1hdE9wdGlvbnMsICdzbmlwcGV0SW50ZXJmYWNlJyB8ICdzbmlwcGV0U3ludGF4Jz4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdXBwb3J0Q29kZUxpYnJhcnk6IFN1cHBvcnRDb2RlTGlicmFyeVxuICApIHt9XG5cbiAgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZWFkaW5lc3MgPSB7IHJlc29sdmUsIHJlamVjdCB9XG4gICAgICBjb25zdCB0b3RhbCA9IHRoaXMub3B0aW9ucy5wYXJhbGxlbFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGlkID0gaS50b1N0cmluZygpXG4gICAgICAgIC8vIHNwaW4gdXAgYSBkZWRpY2F0ZWQgbWVzc2FnZSBjaGFubmVsIGZvciBjb29yZGluYXRvci13b3JrZXIgY29tbXNcbiAgICAgICAgY29uc3QgeyBwb3J0MSwgcG9ydDIgfSA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpXG4gICAgICAgIGNvbnN0IHdvcmtlclRocmVhZCA9IG5ldyBXb3JrZXIocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3dvcmtlci5tanMnKSwge1xuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgLi4udGhpcy5lbnZpcm9ubWVudC5lbnYsXG4gICAgICAgICAgICBDVUNVTUJFUl9QQVJBTExFTDogJ3RydWUnLFxuICAgICAgICAgICAgQ1VDVU1CRVJfVE9UQUxfV09SS0VSUzogdG90YWwudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIENVQ1VNQkVSX1dPUktFUl9JRDogaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvdXJjZUxpbWl0czogdGhpcy5vcHRpb25zLndvcmtlck9wdGlvbnM/LnJlc291cmNlTGltaXRzLFxuICAgICAgICAgIHdvcmtlckRhdGE6IHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5lbnZpcm9ubWVudC5jd2QsXG4gICAgICAgICAgICB0ZXN0UnVuU3RhcnRlZElkOiB0aGlzLnRlc3RSdW5TdGFydGVkSWQsXG4gICAgICAgICAgICBzdXBwb3J0Q29kZUNvb3JkaW5hdGVzOiB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5vcmlnaW5hbENvb3JkaW5hdGVzLFxuICAgICAgICAgICAgc3VwcG9ydENvZGVJZHM6IHtcbiAgICAgICAgICAgICAgc3RlcERlZmluaXRpb25JZHM6IHRoaXMuc3VwcG9ydENvZGVMaWJyYXJ5LnN0ZXBEZWZpbml0aW9ucy5tYXAoKHMpID0+IHMuaWQpLFxuICAgICAgICAgICAgICBiZWZvcmVUZXN0Q2FzZUhvb2tEZWZpbml0aW9uSWRzOlxuICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydENvZGVMaWJyYXJ5LmJlZm9yZVRlc3RDYXNlSG9va0RlZmluaXRpb25zLm1hcCgoaCkgPT4gaC5pZCksXG4gICAgICAgICAgICAgIGFmdGVyVGVzdENhc2VIb29rRGVmaW5pdGlvbklkczpcbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5hZnRlclRlc3RDYXNlSG9va0RlZmluaXRpb25zLm1hcCgoaCkgPT4gaC5pZCksXG4gICAgICAgICAgICAgIGJlZm9yZVRlc3RSdW5Ib29rRGVmaW5pdGlvbklkczpcbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5iZWZvcmVUZXN0UnVuSG9va0RlZmluaXRpb25zLm1hcCgoaCkgPT4gaC5pZCksXG4gICAgICAgICAgICAgIGFmdGVyVGVzdFJ1bkhvb2tEZWZpbml0aW9uSWRzOlxuICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydENvZGVMaWJyYXJ5LmFmdGVyVGVzdFJ1bkhvb2tEZWZpbml0aW9ucy5tYXAoKGgpID0+IGguaWQpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIHNuaXBwZXRPcHRpb25zOiB0aGlzLnNuaXBwZXRPcHRpb25zLFxuICAgICAgICAgICAgcG9ydDogcG9ydDIsXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2VyRGF0YSxcbiAgICAgICAgICB0cmFuc2Zlckxpc3Q6IFtwb3J0Ml0sXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHdvcmtlciA9IHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICB3b3JrZXJUaHJlYWQsXG4gICAgICAgICAgcG9ydDogcG9ydDEsXG4gICAgICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICAgIHRoaXMud29ya2Vycy5hZGQod29ya2VyKVxuICAgICAgICBwb3J0MS5vbignbWVzc2FnZScsIChldmVudDogV29ya2VyRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUV2ZW50RnJvbVdvcmtlcih3b3JrZXIsIGV2ZW50KVxuICAgICAgICB9KVxuICAgICAgICB3b3JrZXJUaHJlYWQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvckZyb21Xb3JrZXIoZXJyb3IsIHdvcmtlcilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGRlbGV0ZSB0aGlzLnJlYWRpbmVzc1xuICB9XG5cbiAgYXN5bmMgcnVuQmVmb3JlQWxsSG9va3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGhhc2UgPSBuZXcgVGVzdFJ1bkhvb2tzUGhhc2UocmVzb2x2ZSwgcmVqZWN0LCAnQkVGT1JFQUxMX0hPT0tTJylcbiAgICAgIHRoaXMuc3RhcnRQaGFzZSgpXG4gICAgfSlcbiAgICBkZWxldGUgdGhpcy5waGFzZVxuICAgIHJldHVybiBzdWNjZXNzXG4gIH1cblxuICBhc3luYyBydW5UZXN0Q2FzZXMoYXNzZW1ibGVkVGVzdENhc2VzOiBSZWFkb25seUFycmF5PEFzc2VtYmxlZFRlc3RDYXNlPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnBoYXNlID0gbmV3IFRlc3RDYXNlc1BoYXNlKFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgICAgIHRoaXMubG9nZ2VyLFxuICAgICAgICB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5wYXJhbGxlbENhbkFzc2lnbixcbiAgICAgICAgYXNzZW1ibGVkVGVzdENhc2VzXG4gICAgICApXG4gICAgICB0aGlzLnN0YXJ0UGhhc2UoKVxuICAgIH0pXG4gICAgZGVsZXRlIHRoaXMucGhhc2VcbiAgICByZXR1cm4gc3VjY2Vzc1xuICB9XG5cbiAgYXN5bmMgcnVuQWZ0ZXJBbGxIb29rcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5waGFzZSA9IG5ldyBUZXN0UnVuSG9va3NQaGFzZShyZXNvbHZlLCByZWplY3QsICdBRlRFUkFMTF9IT09LUycpXG4gICAgICB0aGlzLnN0YXJ0UGhhc2UoKVxuICAgIH0pXG4gICAgZGVsZXRlIHRoaXMucGhhc2VcbiAgICByZXR1cm4gc3VjY2Vzc1xuICB9XG5cbiAgYXN5bmMgdGVhcmRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy53b3JrZXJzLnZhbHVlcygpKSB7XG4gICAgICBhd2FpdCB3b3JrZXIud29ya2VyVGhyZWFkLnRlcm1pbmF0ZSgpXG4gICAgICAvLyBjbG9zZSBvdXIgZW5kIG9mIHRoZSBjaGFubmVsIHNvIGl0IHN0b3BzIGtlZXBpbmcgdGhlIGxvb3AgYWxpdmVcbiAgICAgIHdvcmtlci5wb3J0LmNsb3NlKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UGhhc2UoKSB7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy53b3JrZXJzKSB7XG4gICAgICBjb25zdCBjb21tYW5kID0gdGhpcy5waGFzZS5maWxsKClcbiAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgIHRoaXMuaXNzdWVDb21tYW5kVG9Xb3JrZXIod29ya2VyLCBjb21tYW5kKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNzdWVDb21tYW5kVG9Xb3JrZXIod29ya2VyOiBNYW5hZ2VkV29ya2VyLCBjb21tYW5kOiBXb3JrZXJDb21tYW5kKSB7XG4gICAgdGhpcy5ydW5uaW5nLnNldCh3b3JrZXIsIGNvbW1hbmQpXG4gICAgd29ya2VyLnBvcnQucG9zdE1lc3NhZ2UoY29tbWFuZClcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXZlbnRGcm9tV29ya2VyKHdvcmtlcjogTWFuYWdlZFdvcmtlciwgZXZlbnQ6IFdvcmtlckV2ZW50KSB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdSRUFEWSc6XG4gICAgICAgIHdvcmtlci5yZWFkeSA9IHRydWVcbiAgICAgICAgaWYgKFsuLi50aGlzLndvcmtlcnNdLmV2ZXJ5KChtdykgPT4gbXcucmVhZHkpKSB7XG4gICAgICAgICAgdGhpcy5yZWFkaW5lc3M/LnJlc29sdmUoKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdFTlZFTE9QRSc6XG4gICAgICAgIHRoaXMuZXZlbnRCcm9hZGNhc3Rlci5lbWl0KCdlbnZlbG9wZScsIGV2ZW50LmVudmVsb3BlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnRklOSVNIRUQnOiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQ29tbWFuZCA9IHRoaXMucnVubmluZy5nZXQod29ya2VyKVxuICAgICAgICB0aGlzLnJ1bm5pbmcuZGVsZXRlKHdvcmtlcilcbiAgICAgICAgY29uc3QgbmV4dENvbW1hbmQgPSB0aGlzLnBoYXNlPy5uZXh0KHByZXZpb3VzQ29tbWFuZCwgZXZlbnQpXG4gICAgICAgIGlmIChuZXh0Q29tbWFuZCkge1xuICAgICAgICAgIHRoaXMuaXNzdWVDb21tYW5kVG9Xb3JrZXIod29ya2VyLCBuZXh0Q29tbWFuZClcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3JGcm9tV29ya2VyKGVycm9yOiBFcnJvciwgd29ya2VyOiBNYW5hZ2VkV29ya2VyKSB7XG4gICAgY29uc3QgcmVhc29uID0gbmV3IEVycm9yKGBFcnJvciBvbiB3b3JrZXIgJHt3b3JrZXIuaWR9YCwgeyBjYXVzZTogZXJyb3IgfSlcbiAgICB0aGlzLnJlYWRpbmVzcz8ucmVqZWN0KHJlYXNvbilcbiAgICB0aGlzLnBoYXNlPy5yZWplY3QocmVhc29uKVxuICAgIHZvaWQgdGhpcy50ZWFyZG93bigpXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,19 @@
1
+ import type { AssembledTestCase } from '../../assemble';
2
+ import type { ILogger } from '../../environment';
3
+ import type { ParallelAssignmentValidator } from '../../support_code_library_builder/types';
4
+ import type { FinishedEvent, Phase, RunTestCaseCommand } from './types';
5
+ export declare class TestCasesPhase implements Phase<RunTestCaseCommand> {
6
+ private readonly resolve;
7
+ readonly reject: (reason: unknown) => void;
8
+ private readonly logger;
9
+ private readonly canAssign;
10
+ private failing;
11
+ private idleInterventions;
12
+ private readonly queue;
13
+ private readonly running;
14
+ constructor(resolve: (success: boolean) => void, reject: (reason: unknown) => void, logger: ILogger, canAssign: ParallelAssignmentValidator, assembledTestCases: ReadonlyArray<AssembledTestCase>);
15
+ fill(): RunTestCaseCommand | undefined;
16
+ next(command: RunTestCaseCommand, event: FinishedEvent): RunTestCaseCommand | undefined;
17
+ private select;
18
+ private dequeue;
19
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TestCasesPhase = void 0;
4
+ class TestCasesPhase {
5
+ resolve;
6
+ reject;
7
+ logger;
8
+ canAssign;
9
+ failing = false;
10
+ idleInterventions = 0;
11
+ queue = [];
12
+ running = new Set();
13
+ constructor(resolve, reject, logger, canAssign, assembledTestCases) {
14
+ this.resolve = resolve;
15
+ this.reject = reject;
16
+ this.logger = logger;
17
+ this.canAssign = canAssign;
18
+ this.queue.push(...assembledTestCases);
19
+ }
20
+ fill() {
21
+ return this.select();
22
+ }
23
+ next(command, event) {
24
+ if (!event.success) {
25
+ this.failing = true;
26
+ }
27
+ this.running.delete(command.assembledTestCase.pickle);
28
+ if (this.queue.length === 0 && this.running.size === 0) {
29
+ if (this.idleInterventions > 0) {
30
+ this.logger.warn(`WARNING: All workers went idle ${this.idleInterventions} time(s). Consider revising handler passed to setParallelCanAssign.`);
31
+ }
32
+ this.resolve(!this.failing);
33
+ return undefined;
34
+ }
35
+ return this.select();
36
+ }
37
+ select() {
38
+ if (this.queue.length === 0) {
39
+ return undefined;
40
+ }
41
+ for (const assembledTestCase of this.queue) {
42
+ if (this.canAssign(assembledTestCase.pickle, [...this.running])) {
43
+ return this.dequeue(assembledTestCase);
44
+ }
45
+ }
46
+ if (this.running.size === 0) {
47
+ this.idleInterventions++;
48
+ return this.dequeue(this.queue.at(0));
49
+ }
50
+ return undefined;
51
+ }
52
+ dequeue(assembledTestCase) {
53
+ this.queue.splice(this.queue.indexOf(assembledTestCase), 1);
54
+ this.running.add(assembledTestCase.pickle);
55
+ return {
56
+ type: 'TEST_CASE',
57
+ assembledTestCase,
58
+ failing: this.failing,
59
+ };
60
+ }
61
+ }
62
+ exports.TestCasesPhase = TestCasesPhase;
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9jYXNlc19waGFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW50aW1lL3BhcmFsbGVsL3Rlc3RfY2FzZXNfcGhhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsTUFBYSxjQUFjO0lBT047SUFDUjtJQUNRO0lBQ0E7SUFUWCxPQUFPLEdBQUcsS0FBSyxDQUFBO0lBQ2YsaUJBQWlCLEdBQUcsQ0FBQyxDQUFBO0lBQ1osS0FBSyxHQUE2QixFQUFFLENBQUE7SUFDcEMsT0FBTyxHQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRWpELFlBQ21CLE9BQW1DLEVBQzNDLE1BQWlDLEVBQ3pCLE1BQWUsRUFDZixTQUFzQyxFQUN2RCxrQkFBb0Q7UUFKbkMsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUFDM0MsV0FBTSxHQUFOLE1BQU0sQ0FBMkI7UUFDekIsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNmLGNBQVMsR0FBVCxTQUFTLENBQTZCO1FBR3ZELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQTtJQUN4QyxDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ3RCLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBMkIsRUFBRSxLQUFvQjtRQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDckQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLGtDQUFrQyxJQUFJLENBQUMsaUJBQWlCLHFFQUFxRSxDQUM5SCxDQUFBO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDM0IsT0FBTyxTQUFTLENBQUE7UUFDbEIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ3RCLENBQUM7SUFFTyxNQUFNO1FBQ1osSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLFNBQVMsQ0FBQTtRQUNsQixDQUFDO1FBQ0QsS0FBSyxNQUFNLGlCQUFpQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNoRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtZQUN4QyxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7WUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkMsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFTyxPQUFPLENBQUMsaUJBQW9DO1FBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDMUMsT0FBTztZQUNMLElBQUksRUFBRSxXQUFXO1lBQ2pCLGlCQUFpQjtZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQTlERCx3Q0E4REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBpY2tsZSB9IGZyb20gJ0BjdWN1bWJlci9tZXNzYWdlcydcbmltcG9ydCB0eXBlIHsgQXNzZW1ibGVkVGVzdENhc2UgfSBmcm9tICcuLi8uLi9hc3NlbWJsZSdcbmltcG9ydCB0eXBlIHsgSUxvZ2dlciB9IGZyb20gJy4uLy4uL2Vudmlyb25tZW50J1xuaW1wb3J0IHR5cGUgeyBQYXJhbGxlbEFzc2lnbm1lbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zdXBwb3J0X2NvZGVfbGlicmFyeV9idWlsZGVyL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBGaW5pc2hlZEV2ZW50LCBQaGFzZSwgUnVuVGVzdENhc2VDb21tYW5kIH0gZnJvbSAnLi90eXBlcydcblxuZXhwb3J0IGNsYXNzIFRlc3RDYXNlc1BoYXNlIGltcGxlbWVudHMgUGhhc2U8UnVuVGVzdENhc2VDb21tYW5kPiB7XG4gIHByaXZhdGUgZmFpbGluZyA9IGZhbHNlXG4gIHByaXZhdGUgaWRsZUludGVydmVudGlvbnMgPSAwXG4gIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IEFycmF5PEFzc2VtYmxlZFRlc3RDYXNlPiA9IFtdXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVubmluZzogU2V0PFBpY2tsZT4gPSBuZXcgU2V0KClcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmU6IChzdWNjZXNzOiBib29sZWFuKSA9PiB2b2lkLFxuICAgIHJlYWRvbmx5IHJlamVjdDogKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbkFzc2lnbjogUGFyYWxsZWxBc3NpZ25tZW50VmFsaWRhdG9yLFxuICAgIGFzc2VtYmxlZFRlc3RDYXNlczogUmVhZG9ubHlBcnJheTxBc3NlbWJsZWRUZXN0Q2FzZT5cbiAgKSB7XG4gICAgdGhpcy5xdWV1ZS5wdXNoKC4uLmFzc2VtYmxlZFRlc3RDYXNlcylcbiAgfVxuXG4gIGZpbGwoKTogUnVuVGVzdENhc2VDb21tYW5kIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoKVxuICB9XG5cbiAgbmV4dChjb21tYW5kOiBSdW5UZXN0Q2FzZUNvbW1hbmQsIGV2ZW50OiBGaW5pc2hlZEV2ZW50KTogUnVuVGVzdENhc2VDb21tYW5kIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWV2ZW50LnN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuZmFpbGluZyA9IHRydWVcbiAgICB9XG4gICAgdGhpcy5ydW5uaW5nLmRlbGV0ZShjb21tYW5kLmFzc2VtYmxlZFRlc3RDYXNlLnBpY2tsZSlcbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPT09IDAgJiYgdGhpcy5ydW5uaW5nLnNpemUgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLmlkbGVJbnRlcnZlbnRpb25zID4gMCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBXQVJOSU5HOiBBbGwgd29ya2VycyB3ZW50IGlkbGUgJHt0aGlzLmlkbGVJbnRlcnZlbnRpb25zfSB0aW1lKHMpLiBDb25zaWRlciByZXZpc2luZyBoYW5kbGVyIHBhc3NlZCB0byBzZXRQYXJhbGxlbENhbkFzc2lnbi5gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzb2x2ZSghdGhpcy5mYWlsaW5nKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoKVxuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3QoKTogUnVuVGVzdENhc2VDb21tYW5kIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gICAgZm9yIChjb25zdCBhc3NlbWJsZWRUZXN0Q2FzZSBvZiB0aGlzLnF1ZXVlKSB7XG4gICAgICBpZiAodGhpcy5jYW5Bc3NpZ24oYXNzZW1ibGVkVGVzdENhc2UucGlja2xlLCBbLi4udGhpcy5ydW5uaW5nXSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVxdWV1ZShhc3NlbWJsZWRUZXN0Q2FzZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMucnVubmluZy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmlkbGVJbnRlcnZlbnRpb25zKytcbiAgICAgIHJldHVybiB0aGlzLmRlcXVldWUodGhpcy5xdWV1ZS5hdCgwKSlcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcHJpdmF0ZSBkZXF1ZXVlKGFzc2VtYmxlZFRlc3RDYXNlOiBBc3NlbWJsZWRUZXN0Q2FzZSk6IFJ1blRlc3RDYXNlQ29tbWFuZCB7XG4gICAgdGhpcy5xdWV1ZS5zcGxpY2UodGhpcy5xdWV1ZS5pbmRleE9mKGFzc2VtYmxlZFRlc3RDYXNlKSwgMSlcbiAgICB0aGlzLnJ1bm5pbmcuYWRkKGFzc2VtYmxlZFRlc3RDYXNlLnBpY2tsZSlcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1RFU1RfQ0FTRScsXG4gICAgICBhc3NlbWJsZWRUZXN0Q2FzZSxcbiAgICAgIGZhaWxpbmc6IHRoaXMuZmFpbGluZyxcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import type { FinishedEvent, Phase, RunAfterAllHooksCommand, RunBeforeAllHooksCommand } from './types';
2
+ export declare class TestRunHooksPhase implements Phase<RunBeforeAllHooksCommand | RunAfterAllHooksCommand> {
3
+ private readonly resolve;
4
+ readonly reject: (reason: unknown) => void;
5
+ private readonly type;
6
+ private failing;
7
+ private waiting;
8
+ constructor(resolve: (success: boolean) => void, reject: (reason: unknown) => void, type: 'BEFOREALL_HOOKS' | 'AFTERALL_HOOKS');
9
+ fill(): RunBeforeAllHooksCommand | RunAfterAllHooksCommand;
10
+ next(_command: RunBeforeAllHooksCommand | RunAfterAllHooksCommand, event: FinishedEvent): undefined;
11
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TestRunHooksPhase = void 0;
4
+ class TestRunHooksPhase {
5
+ resolve;
6
+ reject;
7
+ type;
8
+ failing = false;
9
+ waiting = 0;
10
+ constructor(resolve, reject, type) {
11
+ this.resolve = resolve;
12
+ this.reject = reject;
13
+ this.type = type;
14
+ }
15
+ fill() {
16
+ this.waiting++;
17
+ return {
18
+ type: this.type,
19
+ };
20
+ }
21
+ next(_command, event) {
22
+ if (!event.success) {
23
+ this.failing = true;
24
+ }
25
+ this.waiting--;
26
+ if (this.waiting === 0) {
27
+ this.resolve(!this.failing);
28
+ }
29
+ return undefined;
30
+ }
31
+ }
32
+ exports.TestRunHooksPhase = TestRunHooksPhase;
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9ydW5faG9va3NfcGhhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVudGltZS9wYXJhbGxlbC90ZXN0X3J1bl9ob29rc19waGFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSxNQUFhLGlCQUFpQjtJQU9UO0lBQ1I7SUFDUTtJQU5YLE9BQU8sR0FBRyxLQUFLLENBQUE7SUFDZixPQUFPLEdBQUcsQ0FBQyxDQUFBO0lBRW5CLFlBQ21CLE9BQW1DLEVBQzNDLE1BQWlDLEVBQ3pCLElBQTBDO1FBRjFDLFlBQU8sR0FBUCxPQUFPLENBQTRCO1FBQzNDLFdBQU0sR0FBTixNQUFNLENBQTJCO1FBQ3pCLFNBQUksR0FBSixJQUFJLENBQXNDO0lBQzFELENBQUM7SUFFSixJQUFJO1FBQ0YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ2QsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNoQixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FDRixRQUE0RCxFQUM1RCxLQUFvQjtRQUVwQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDZCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM3QixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztDQUNGO0FBaENELDhDQWdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgRmluaXNoZWRFdmVudCxcbiAgUGhhc2UsXG4gIFJ1bkFmdGVyQWxsSG9va3NDb21tYW5kLFxuICBSdW5CZWZvcmVBbGxIb29rc0NvbW1hbmQsXG59IGZyb20gJy4vdHlwZXMnXG5cbmV4cG9ydCBjbGFzcyBUZXN0UnVuSG9va3NQaGFzZVxuICBpbXBsZW1lbnRzIFBoYXNlPFJ1bkJlZm9yZUFsbEhvb2tzQ29tbWFuZCB8IFJ1bkFmdGVyQWxsSG9va3NDb21tYW5kPlxue1xuICBwcml2YXRlIGZhaWxpbmcgPSBmYWxzZVxuICBwcml2YXRlIHdhaXRpbmcgPSAwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlOiAoc3VjY2VzczogYm9vbGVhbikgPT4gdm9pZCxcbiAgICByZWFkb25seSByZWplY3Q6IChyZWFzb246IHVua25vd24pID0+IHZvaWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiAnQkVGT1JFQUxMX0hPT0tTJyB8ICdBRlRFUkFMTF9IT09LUydcbiAgKSB7fVxuXG4gIGZpbGwoKTogUnVuQmVmb3JlQWxsSG9va3NDb21tYW5kIHwgUnVuQWZ0ZXJBbGxIb29rc0NvbW1hbmQge1xuICAgIHRoaXMud2FpdGluZysrXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICB9XG4gIH1cblxuICBuZXh0KFxuICAgIF9jb21tYW5kOiBSdW5CZWZvcmVBbGxIb29rc0NvbW1hbmQgfCBSdW5BZnRlckFsbEhvb2tzQ29tbWFuZCxcbiAgICBldmVudDogRmluaXNoZWRFdmVudFxuICApOiB1bmRlZmluZWQge1xuICAgIGlmICghZXZlbnQuc3VjY2Vzcykge1xuICAgICAgdGhpcy5mYWlsaW5nID0gdHJ1ZVxuICAgIH1cbiAgICB0aGlzLndhaXRpbmctLVxuICAgIGlmICh0aGlzLndhaXRpbmcgPT09IDApIHtcbiAgICAgIHRoaXMucmVzb2x2ZSghdGhpcy5mYWlsaW5nKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cbiJdfQ==
@@ -1,35 +1,51 @@
1
- import { Envelope } from '@cucumber/messages';
2
- import { RuntimeOptions } from '../index';
3
- import { ISupportCodeCoordinates } from '../../api';
4
- import { AssembledTestCase } from '../../assemble';
5
- import { CanonicalSupportCodeIds } from '../../support_code_library_builder/types';
6
- import { FormatOptions } from '../../formatter';
7
- export type CoordinatorToWorkerCommand = InitializeCommand | RunCommand | FinalizeCommand;
8
- export interface InitializeCommand {
9
- type: 'INITIALIZE';
1
+ import type { MessagePort, Worker } from 'node:worker_threads';
2
+ import type { Envelope } from '@cucumber/messages';
3
+ import type { ISupportCodeCoordinates } from '../../api';
4
+ import type { AssembledTestCase } from '../../assemble';
5
+ import type { FormatOptions } from '../../formatter';
6
+ import type { CanonicalSupportCodeIds } from '../../support_code_library_builder/types';
7
+ import type { RuntimeOptions } from '../types';
8
+ export type ManagedWorker = {
9
+ id: string;
10
+ workerThread: Worker;
11
+ port: MessagePort;
12
+ ready: boolean;
13
+ };
14
+ export type WorkerData = {
15
+ cwd: string;
10
16
  testRunStartedId: string;
11
17
  supportCodeCoordinates: ISupportCodeCoordinates;
12
18
  supportCodeIds: CanonicalSupportCodeIds;
13
19
  options: RuntimeOptions;
14
20
  snippetOptions: Pick<FormatOptions, 'snippetInterface' | 'snippetSyntax'>;
15
- }
16
- export interface RunCommand {
17
- type: 'RUN';
21
+ port: MessagePort;
22
+ };
23
+ export type RunBeforeAllHooksCommand = {
24
+ type: 'BEFOREALL_HOOKS';
25
+ };
26
+ export type RunTestCaseCommand = {
27
+ type: 'TEST_CASE';
18
28
  assembledTestCase: AssembledTestCase;
19
29
  failing: boolean;
20
- }
21
- export interface FinalizeCommand {
22
- type: 'FINALIZE';
23
- }
24
- export type WorkerToCoordinatorEvent = ReadyEvent | EnvelopeEvent | FinishedEvent;
25
- export interface ReadyEvent {
30
+ };
31
+ export type RunAfterAllHooksCommand = {
32
+ type: 'AFTERALL_HOOKS';
33
+ };
34
+ export type WorkerCommand = RunBeforeAllHooksCommand | RunTestCaseCommand | RunAfterAllHooksCommand;
35
+ export type ReadyEvent = {
26
36
  type: 'READY';
27
- }
28
- export interface EnvelopeEvent {
37
+ };
38
+ export type EnvelopeEvent = {
29
39
  type: 'ENVELOPE';
30
40
  envelope: Envelope;
31
- }
32
- export interface FinishedEvent {
41
+ };
42
+ export type FinishedEvent = {
33
43
  type: 'FINISHED';
34
44
  success: boolean;
45
+ };
46
+ export type WorkerEvent = ReadyEvent | EnvelopeEvent | FinishedEvent;
47
+ export interface Phase<T extends WorkerCommand = WorkerCommand> {
48
+ fill: () => T | undefined;
49
+ next: (command: T, event: FinishedEvent) => T | undefined;
50
+ reject: (reason: unknown) => void;
35
51
  }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=types.js.map
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVudGltZS9wYXJhbGxlbC90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNZXNzYWdlUG9ydCwgV29ya2VyIH0gZnJvbSAnbm9kZTp3b3JrZXJfdGhyZWFkcydcbmltcG9ydCB0eXBlIHsgRW52ZWxvcGUgfSBmcm9tICdAY3VjdW1iZXIvbWVzc2FnZXMnXG5pbXBvcnQgdHlwZSB7IElTdXBwb3J0Q29kZUNvb3JkaW5hdGVzIH0gZnJvbSAnLi4vLi4vYXBpJ1xuaW1wb3J0IHR5cGUgeyBBc3NlbWJsZWRUZXN0Q2FzZSB9IGZyb20gJy4uLy4uL2Fzc2VtYmxlJ1xuaW1wb3J0IHR5cGUgeyBGb3JtYXRPcHRpb25zIH0gZnJvbSAnLi4vLi4vZm9ybWF0dGVyJ1xuaW1wb3J0IHR5cGUgeyBDYW5vbmljYWxTdXBwb3J0Q29kZUlkcyB9IGZyb20gJy4uLy4uL3N1cHBvcnRfY29kZV9saWJyYXJ5X2J1aWxkZXIvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmV4cG9ydCB0eXBlIE1hbmFnZWRXb3JrZXIgPSB7XG4gIGlkOiBzdHJpbmdcbiAgd29ya2VyVGhyZWFkOiBXb3JrZXJcbiAgcG9ydDogTWVzc2FnZVBvcnRcbiAgcmVhZHk6IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgV29ya2VyRGF0YSA9IHtcbiAgY3dkOiBzdHJpbmdcbiAgdGVzdFJ1blN0YXJ0ZWRJZDogc3RyaW5nXG4gIHN1cHBvcnRDb2RlQ29vcmRpbmF0ZXM6IElTdXBwb3J0Q29kZUNvb3JkaW5hdGVzXG4gIHN1cHBvcnRDb2RlSWRzOiBDYW5vbmljYWxTdXBwb3J0Q29kZUlkc1xuICBvcHRpb25zOiBSdW50aW1lT3B0aW9uc1xuICBzbmlwcGV0T3B0aW9uczogUGljazxGb3JtYXRPcHRpb25zLCAnc25pcHBldEludGVyZmFjZScgfCAnc25pcHBldFN5bnRheCc+XG4gIHBvcnQ6IE1lc3NhZ2VQb3J0XG59XG5cbmV4cG9ydCB0eXBlIFJ1bkJlZm9yZUFsbEhvb2tzQ29tbWFuZCA9IHtcbiAgdHlwZTogJ0JFRk9SRUFMTF9IT09LUydcbn1cblxuZXhwb3J0IHR5cGUgUnVuVGVzdENhc2VDb21tYW5kID0ge1xuICB0eXBlOiAnVEVTVF9DQVNFJ1xuICBhc3NlbWJsZWRUZXN0Q2FzZTogQXNzZW1ibGVkVGVzdENhc2VcbiAgZmFpbGluZzogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBSdW5BZnRlckFsbEhvb2tzQ29tbWFuZCA9IHtcbiAgdHlwZTogJ0FGVEVSQUxMX0hPT0tTJ1xufVxuXG5leHBvcnQgdHlwZSBXb3JrZXJDb21tYW5kID0gUnVuQmVmb3JlQWxsSG9va3NDb21tYW5kIHwgUnVuVGVzdENhc2VDb21tYW5kIHwgUnVuQWZ0ZXJBbGxIb29rc0NvbW1hbmRcblxuZXhwb3J0IHR5cGUgUmVhZHlFdmVudCA9IHtcbiAgdHlwZTogJ1JFQURZJ1xufVxuXG5leHBvcnQgdHlwZSBFbnZlbG9wZUV2ZW50ID0ge1xuICB0eXBlOiAnRU5WRUxPUEUnXG4gIGVudmVsb3BlOiBFbnZlbG9wZVxufVxuXG5leHBvcnQgdHlwZSBGaW5pc2hlZEV2ZW50ID0ge1xuICB0eXBlOiAnRklOSVNIRUQnXG4gIHN1Y2Nlc3M6IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgV29ya2VyRXZlbnQgPSBSZWFkeUV2ZW50IHwgRW52ZWxvcGVFdmVudCB8IEZpbmlzaGVkRXZlbnRcblxuZXhwb3J0IGludGVyZmFjZSBQaGFzZTxUIGV4dGVuZHMgV29ya2VyQ29tbWFuZCA9IFdvcmtlckNvbW1hbmQ+IHtcbiAgZmlsbDogKCkgPT4gVCB8IHVuZGVmaW5lZFxuICBuZXh0OiAoY29tbWFuZDogVCwgZXZlbnQ6IEZpbmlzaGVkRXZlbnQpID0+IFQgfCB1bmRlZmluZWRcbiAgcmVqZWN0OiAocmVhc29uOiB1bmtub3duKSA9PiB2b2lkXG59XG4iXX0=