@cucumber/cucumber 12.9.0 → 13.1.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 (400) 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 +16 -65
  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 +19 -3
  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/api/wrapper.d.mts +5 -0
  30. package/lib/api/wrapper.mjs +6 -6
  31. package/lib/assemble/assemble_test_cases.d.ts +4 -4
  32. package/lib/assemble/assemble_test_cases.js +2 -6
  33. package/lib/assemble/index.js +1 -1
  34. package/lib/assemble/types.d.ts +1 -1
  35. package/lib/assemble/types.js +1 -1
  36. package/lib/cli/i18n.js +5 -3
  37. package/lib/cli/index.d.ts +1 -1
  38. package/lib/cli/index.js +2 -2
  39. package/lib/cli/install_validator.js +4 -3
  40. package/lib/cli/run.js +7 -6
  41. package/lib/cli/validate_node_engine_version.js +2 -4
  42. package/lib/configuration/argv_parser.d.ts +1 -1
  43. package/lib/configuration/argv_parser.js +7 -7
  44. package/lib/configuration/check_schema.d.ts +1 -1
  45. package/lib/configuration/check_schema.js +17 -6
  46. package/lib/configuration/default_configuration.d.ts +1 -1
  47. package/lib/configuration/default_configuration.js +2 -1
  48. package/lib/configuration/from_file.d.ts +2 -2
  49. package/lib/configuration/from_file.js +6 -6
  50. package/lib/configuration/helpers.js +1 -1
  51. package/lib/configuration/index.js +1 -1
  52. package/lib/configuration/locate_file.js +3 -3
  53. package/lib/configuration/merge_configurations.d.ts +1 -1
  54. package/lib/configuration/merge_configurations.js +2 -10
  55. package/lib/configuration/parse_configuration.d.ts +2 -2
  56. package/lib/configuration/parse_configuration.js +3 -11
  57. package/lib/configuration/split_format_descriptor.d.ts +1 -2
  58. package/lib/configuration/split_format_descriptor.js +11 -71
  59. package/lib/configuration/types.d.ts +26 -3
  60. package/lib/configuration/types.js +1 -1
  61. package/lib/configuration/validate_configuration.d.ts +2 -2
  62. package/lib/configuration/validate_configuration.js +5 -3
  63. package/lib/environment/console_logger.d.ts +2 -2
  64. package/lib/environment/console_logger.js +1 -1
  65. package/lib/environment/index.js +1 -1
  66. package/lib/environment/make_environment.d.ts +1 -1
  67. package/lib/environment/make_environment.js +1 -1
  68. package/lib/environment/types.d.ts +1 -1
  69. package/lib/environment/types.js +1 -1
  70. package/lib/filter/filter_plugin.d.ts +1 -1
  71. package/lib/filter/filter_plugin.js +1 -1
  72. package/lib/filter/index.d.ts +1 -1
  73. package/lib/filter/index.js +2 -2
  74. package/lib/filter/order_pickles.d.ts +2 -2
  75. package/lib/filter/order_pickles.js +1 -1
  76. package/lib/filter/types.d.ts +1 -1
  77. package/lib/filter/types.js +1 -1
  78. package/lib/filter_stack_trace.d.ts +1 -1
  79. package/lib/filter_stack_trace.js +1 -1
  80. package/lib/formatter/builder.d.ts +8 -7
  81. package/lib/formatter/builder.js +6 -7
  82. package/lib/formatter/builtin/html.js +2 -2
  83. package/lib/formatter/builtin/index.d.ts +4 -4
  84. package/lib/formatter/builtin/index.js +14 -13
  85. package/lib/formatter/builtin/message.js +2 -2
  86. package/lib/formatter/builtin/pretty.d.ts +6 -0
  87. package/lib/formatter/builtin/pretty.js +19 -0
  88. package/lib/formatter/builtin/progress-bar.d.ts +6 -0
  89. package/lib/formatter/builtin/progress-bar.js +22 -0
  90. package/lib/formatter/builtin/progress.d.ts +6 -0
  91. package/lib/formatter/builtin/progress.js +18 -0
  92. package/lib/formatter/builtin/resolve_terminal_options.d.ts +3 -0
  93. package/lib/formatter/builtin/resolve_terminal_options.js +15 -0
  94. package/lib/formatter/builtin/summary.d.ts +6 -0
  95. package/lib/formatter/builtin/summary.js +15 -0
  96. package/lib/formatter/create_stream.d.ts +2 -2
  97. package/lib/formatter/create_stream.js +4 -7
  98. package/lib/formatter/find_class_or_plugin.js +1 -1
  99. package/lib/formatter/get_color_fns.d.ts +3 -3
  100. package/lib/formatter/get_color_fns.js +23 -52
  101. package/lib/formatter/helpers/duration_helpers.d.ts +1 -1
  102. package/lib/formatter/helpers/duration_helpers.js +1 -1
  103. package/lib/formatter/helpers/event_data_collector.d.ts +15 -15
  104. package/lib/formatter/helpers/event_data_collector.js +17 -44
  105. package/lib/formatter/helpers/formatters.d.ts +1 -1
  106. package/lib/formatter/helpers/formatters.js +1 -3
  107. package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -5
  108. package/lib/formatter/helpers/gherkin_document_parser.js +20 -18
  109. package/lib/formatter/helpers/index.d.ts +3 -3
  110. package/lib/formatter/helpers/index.js +8 -8
  111. package/lib/formatter/helpers/issue_helpers.d.ts +10 -10
  112. package/lib/formatter/helpers/issue_helpers.js +2 -2
  113. package/lib/formatter/helpers/keyword_type.js +2 -2
  114. package/lib/formatter/helpers/location_helpers.d.ts +1 -1
  115. package/lib/formatter/helpers/location_helpers.js +1 -1
  116. package/lib/formatter/helpers/pickle_parser.d.ts +10 -10
  117. package/lib/formatter/helpers/pickle_parser.js +8 -9
  118. package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
  119. package/lib/formatter/helpers/step_argument_formatter.js +1 -1
  120. package/lib/formatter/helpers/summary_helpers.d.ts +4 -4
  121. package/lib/formatter/helpers/summary_helpers.js +19 -48
  122. package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +4 -4
  123. package/lib/formatter/helpers/test_case_attempt_formatter.js +16 -49
  124. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +9 -9
  125. package/lib/formatter/helpers/test_case_attempt_parser.js +12 -45
  126. package/lib/formatter/helpers/usage_helpers/index.d.ts +6 -6
  127. package/lib/formatter/helpers/usage_helpers/index.js +13 -49
  128. package/lib/formatter/import_code.js +2 -2
  129. package/lib/formatter/index.d.ts +25 -13
  130. package/lib/formatter/index.js +2 -2
  131. package/lib/formatter/json_formatter.d.ts +22 -22
  132. package/lib/formatter/json_formatter.js +11 -49
  133. package/lib/formatter/progress_formatter.d.ts +7 -3
  134. package/lib/formatter/progress_formatter.js +11 -41
  135. package/lib/formatter/rerun_formatter.d.ts +1 -1
  136. package/lib/formatter/rerun_formatter.js +4 -37
  137. package/lib/formatter/resolve_implementation.d.ts +1 -1
  138. package/lib/formatter/resolve_implementation.js +2 -2
  139. package/lib/formatter/snippets_formatter.d.ts +1 -1
  140. package/lib/formatter/snippets_formatter.js +4 -37
  141. package/lib/formatter/step_definition_snippet_builder/index.d.ts +6 -6
  142. package/lib/formatter/step_definition_snippet_builder/index.js +3 -3
  143. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts +1 -1
  144. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +3 -5
  145. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +1 -1
  146. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js +1 -1
  147. package/lib/formatter/summary_formatter.d.ts +7 -4
  148. package/lib/formatter/summary_formatter.js +6 -3
  149. package/lib/formatter/usage_formatter.d.ts +1 -1
  150. package/lib/formatter/usage_formatter.js +6 -39
  151. package/lib/formatter/usage_json_formatter.d.ts +1 -1
  152. package/lib/formatter/usage_json_formatter.js +3 -3
  153. package/lib/index.d.ts +9 -14
  154. package/lib/index.js +17 -25
  155. package/lib/models/data_table.d.ts +2 -2
  156. package/lib/models/data_table.js +9 -5
  157. package/lib/models/definition.d.ts +5 -5
  158. package/lib/models/definition.js +1 -1
  159. package/lib/models/gherkin_step_keyword.js +1 -1
  160. package/lib/models/step_definition.d.ts +3 -3
  161. package/lib/models/step_definition.js +1 -1
  162. package/lib/models/test_case_hook_definition.d.ts +3 -3
  163. package/lib/models/test_case_hook_definition.js +1 -1
  164. package/lib/models/test_run_hook_definition.d.ts +1 -1
  165. package/lib/models/test_run_hook_definition.js +1 -1
  166. package/lib/models/test_step_hook_definition.d.ts +3 -3
  167. package/lib/models/test_step_hook_definition.js +1 -1
  168. package/lib/paths/index.js +1 -1
  169. package/lib/paths/paths.d.ts +3 -3
  170. package/lib/paths/paths.js +42 -18
  171. package/lib/paths/types.js +1 -1
  172. package/lib/pickle_filter.d.ts +9 -8
  173. package/lib/pickle_filter.js +3 -3
  174. package/lib/plugin/index.d.ts +1 -1
  175. package/lib/plugin/index.js +2 -2
  176. package/lib/plugin/plugin_manager.d.ts +2 -2
  177. package/lib/plugin/plugin_manager.js +1 -1
  178. package/lib/plugin/types.d.ts +59 -9
  179. package/lib/plugin/types.js +1 -1
  180. package/lib/publish/index.js +1 -1
  181. package/lib/publish/publish_plugin.d.ts +1 -1
  182. package/lib/publish/publish_plugin.js +14 -15
  183. package/lib/publish/types.js +1 -1
  184. package/lib/runtime/attachment_manager/index.d.ts +3 -3
  185. package/lib/runtime/attachment_manager/index.js +12 -48
  186. package/lib/runtime/coordinator.d.ts +16 -8
  187. package/lib/runtime/coordinator.js +38 -19
  188. package/lib/runtime/format_error.d.ts +1 -1
  189. package/lib/runtime/format_error.js +43 -15
  190. package/lib/runtime/helpers.d.ts +5 -5
  191. package/lib/runtime/helpers.js +6 -39
  192. package/lib/runtime/index.js +1 -1
  193. package/lib/runtime/make_runtime.d.ts +10 -9
  194. package/lib/runtime/make_runtime.js +5 -6
  195. package/lib/runtime/make_suggestion.d.ts +2 -2
  196. package/lib/runtime/make_suggestion.js +1 -1
  197. package/lib/runtime/parallel/adapter.d.ts +30 -39
  198. package/lib/runtime/parallel/adapter.js +134 -120
  199. package/lib/runtime/parallel/test_cases_phase.d.ts +19 -0
  200. package/lib/runtime/parallel/test_cases_phase.js +63 -0
  201. package/lib/runtime/parallel/test_run_hooks_phase.d.ts +11 -0
  202. package/lib/runtime/parallel/test_run_hooks_phase.js +33 -0
  203. package/lib/runtime/parallel/types.d.ts +38 -22
  204. package/lib/runtime/parallel/types.js +1 -1
  205. package/lib/runtime/parallel/worker.mjs +65 -0
  206. package/lib/runtime/scope/index.js +1 -1
  207. package/lib/runtime/scope/make_proxy.js +1 -1
  208. package/lib/runtime/scope/test_case_scope.d.ts +1 -1
  209. package/lib/runtime/scope/test_case_scope.js +1 -1
  210. package/lib/runtime/scope/test_run_scope.d.ts +1 -1
  211. package/lib/runtime/scope/test_run_scope.js +1 -1
  212. package/lib/runtime/serial/adapter.d.ts +15 -9
  213. package/lib/runtime/serial/adapter.js +21 -9
  214. package/lib/runtime/step_runner.d.ts +5 -5
  215. package/lib/runtime/step_runner.js +7 -40
  216. package/lib/runtime/stopwatch.d.ts +2 -2
  217. package/lib/runtime/stopwatch.js +1 -1
  218. package/lib/runtime/test_case_runner.d.ts +20 -20
  219. package/lib/runtime/test_case_runner.js +31 -60
  220. package/lib/runtime/types.d.ts +13 -4
  221. package/lib/runtime/types.js +1 -1
  222. package/lib/runtime/worker.d.ts +14 -13
  223. package/lib/runtime/worker.js +26 -44
  224. package/lib/sharding/index.js +1 -1
  225. package/lib/sharding/sharding_plugin.d.ts +1 -1
  226. package/lib/sharding/sharding_plugin.js +1 -1
  227. package/lib/step_arguments.d.ts +4 -4
  228. package/lib/step_arguments.js +1 -1
  229. package/lib/support_code_library_builder/build_parameter_type.d.ts +1 -1
  230. package/lib/support_code_library_builder/build_parameter_type.js +5 -3
  231. package/lib/support_code_library_builder/context.js +1 -1
  232. package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +1 -1
  233. package/lib/support_code_library_builder/get_definition_line_and_uri.js +1 -1
  234. package/lib/support_code_library_builder/index.d.ts +7 -8
  235. package/lib/support_code_library_builder/index.js +9 -9
  236. package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +1 -1
  237. package/lib/support_code_library_builder/parallel_can_assign_helpers.js +3 -4
  238. package/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts +2 -2
  239. package/lib/support_code_library_builder/sourced_parameter_type_registry.js +1 -1
  240. package/lib/support_code_library_builder/types.d.ts +17 -17
  241. package/lib/support_code_library_builder/types.js +1 -1
  242. package/lib/support_code_library_builder/validate_arguments.d.ts +1 -1
  243. package/lib/support_code_library_builder/validate_arguments.js +1 -1
  244. package/lib/support_code_library_builder/world.d.ts +2 -2
  245. package/lib/support_code_library_builder/world.js +2 -2
  246. package/lib/time.d.ts +2 -2
  247. package/lib/time.js +6 -39
  248. package/lib/try_require.js +3 -2
  249. package/lib/types/index.js +1 -1
  250. package/lib/uncaught_exception_manager.js +1 -1
  251. package/lib/user_code_runner.d.ts +1 -1
  252. package/lib/user_code_runner.js +3 -3
  253. package/lib/value_checker.js +1 -1
  254. package/lib/version.d.ts +1 -1
  255. package/lib/version.js +3 -3
  256. package/lib/wrapper.d.mts +43 -0
  257. package/lib/wrapper.mjs +37 -45
  258. package/package.json +50 -75
  259. package/lib/api/convert_configuration.js.map +0 -1
  260. package/lib/api/emit_support_code_messages.js.map +0 -1
  261. package/lib/api/formatters.js.map +0 -1
  262. package/lib/api/gherkin.js.map +0 -1
  263. package/lib/api/index.js.map +0 -1
  264. package/lib/api/load_configuration.js.map +0 -1
  265. package/lib/api/load_sources.js.map +0 -1
  266. package/lib/api/load_support.js.map +0 -1
  267. package/lib/api/plugins.js.map +0 -1
  268. package/lib/api/run_cucumber.js.map +0 -1
  269. package/lib/api/support.js.map +0 -1
  270. package/lib/api/test_helpers.js.map +0 -1
  271. package/lib/api/types.js.map +0 -1
  272. package/lib/assemble/assemble_test_cases.js.map +0 -1
  273. package/lib/assemble/index.js.map +0 -1
  274. package/lib/assemble/types.js.map +0 -1
  275. package/lib/cli/i18n.js.map +0 -1
  276. package/lib/cli/index.js.map +0 -1
  277. package/lib/cli/install_validator.js.map +0 -1
  278. package/lib/cli/run.js.map +0 -1
  279. package/lib/cli/validate_node_engine_version.js.map +0 -1
  280. package/lib/configuration/argv_parser.js.map +0 -1
  281. package/lib/configuration/check_schema.js.map +0 -1
  282. package/lib/configuration/default_configuration.js.map +0 -1
  283. package/lib/configuration/from_file.js.map +0 -1
  284. package/lib/configuration/helpers.js.map +0 -1
  285. package/lib/configuration/index.js.map +0 -1
  286. package/lib/configuration/locate_file.js.map +0 -1
  287. package/lib/configuration/merge_configurations.js.map +0 -1
  288. package/lib/configuration/parse_configuration.js.map +0 -1
  289. package/lib/configuration/split_format_descriptor.js.map +0 -1
  290. package/lib/configuration/types.js.map +0 -1
  291. package/lib/configuration/validate_configuration.js.map +0 -1
  292. package/lib/environment/console_logger.js.map +0 -1
  293. package/lib/environment/index.js.map +0 -1
  294. package/lib/environment/make_environment.js.map +0 -1
  295. package/lib/environment/types.js.map +0 -1
  296. package/lib/filter/filter_plugin.js.map +0 -1
  297. package/lib/filter/index.js.map +0 -1
  298. package/lib/filter/order_pickles.js.map +0 -1
  299. package/lib/filter/types.js.map +0 -1
  300. package/lib/filter_stack_trace.js.map +0 -1
  301. package/lib/formatter/builder.js.map +0 -1
  302. package/lib/formatter/builtin/html.js.map +0 -1
  303. package/lib/formatter/builtin/index.js.map +0 -1
  304. package/lib/formatter/builtin/message.js.map +0 -1
  305. package/lib/formatter/create_stream.js.map +0 -1
  306. package/lib/formatter/find_class_or_plugin.js.map +0 -1
  307. package/lib/formatter/get_color_fns.js.map +0 -1
  308. package/lib/formatter/helpers/duration_helpers.js.map +0 -1
  309. package/lib/formatter/helpers/event_data_collector.js.map +0 -1
  310. package/lib/formatter/helpers/formatters.js.map +0 -1
  311. package/lib/formatter/helpers/gherkin_document_parser.js.map +0 -1
  312. package/lib/formatter/helpers/index.js.map +0 -1
  313. package/lib/formatter/helpers/issue_helpers.js.map +0 -1
  314. package/lib/formatter/helpers/keyword_type.js.map +0 -1
  315. package/lib/formatter/helpers/location_helpers.js.map +0 -1
  316. package/lib/formatter/helpers/pickle_parser.js.map +0 -1
  317. package/lib/formatter/helpers/step_argument_formatter.js.map +0 -1
  318. package/lib/formatter/helpers/summary_helpers.js.map +0 -1
  319. package/lib/formatter/helpers/test_case_attempt_formatter.js.map +0 -1
  320. package/lib/formatter/helpers/test_case_attempt_parser.js.map +0 -1
  321. package/lib/formatter/helpers/usage_helpers/index.js.map +0 -1
  322. package/lib/formatter/import_code.js.map +0 -1
  323. package/lib/formatter/index.js.map +0 -1
  324. package/lib/formatter/json_formatter.js.map +0 -1
  325. package/lib/formatter/progress_bar_formatter.d.ts +0 -18
  326. package/lib/formatter/progress_bar_formatter.js +0 -103
  327. package/lib/formatter/progress_bar_formatter.js.map +0 -1
  328. package/lib/formatter/progress_formatter.js.map +0 -1
  329. package/lib/formatter/rerun_formatter.js.map +0 -1
  330. package/lib/formatter/resolve_implementation.js.map +0 -1
  331. package/lib/formatter/snippets_formatter.js.map +0 -1
  332. package/lib/formatter/step_definition_snippet_builder/index.js.map +0 -1
  333. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map +0 -1
  334. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map +0 -1
  335. package/lib/formatter/summary_formatter.js.map +0 -1
  336. package/lib/formatter/usage_formatter.js.map +0 -1
  337. package/lib/formatter/usage_json_formatter.js.map +0 -1
  338. package/lib/index.js.map +0 -1
  339. package/lib/models/data_table.js.map +0 -1
  340. package/lib/models/definition.js.map +0 -1
  341. package/lib/models/gherkin_step_keyword.js.map +0 -1
  342. package/lib/models/step_definition.js.map +0 -1
  343. package/lib/models/test_case_hook_definition.js.map +0 -1
  344. package/lib/models/test_run_hook_definition.js.map +0 -1
  345. package/lib/models/test_step_hook_definition.js.map +0 -1
  346. package/lib/paths/index.js.map +0 -1
  347. package/lib/paths/paths.js.map +0 -1
  348. package/lib/paths/types.js.map +0 -1
  349. package/lib/pickle_filter.js.map +0 -1
  350. package/lib/plugin/index.js.map +0 -1
  351. package/lib/plugin/plugin_manager.js.map +0 -1
  352. package/lib/plugin/types.js.map +0 -1
  353. package/lib/publish/index.js.map +0 -1
  354. package/lib/publish/publish_plugin.js.map +0 -1
  355. package/lib/publish/types.js.map +0 -1
  356. package/lib/runtime/attachment_manager/index.js.map +0 -1
  357. package/lib/runtime/coordinator.js.map +0 -1
  358. package/lib/runtime/format_error.js.map +0 -1
  359. package/lib/runtime/helpers.js.map +0 -1
  360. package/lib/runtime/index.js.map +0 -1
  361. package/lib/runtime/make_runtime.js.map +0 -1
  362. package/lib/runtime/make_suggestion.js.map +0 -1
  363. package/lib/runtime/parallel/adapter.js.map +0 -1
  364. package/lib/runtime/parallel/run_worker.js +0 -25
  365. package/lib/runtime/parallel/run_worker.js.map +0 -1
  366. package/lib/runtime/parallel/types.js.map +0 -1
  367. package/lib/runtime/parallel/worker.d.ts +0 -25
  368. package/lib/runtime/parallel/worker.js +0 -83
  369. package/lib/runtime/parallel/worker.js.map +0 -1
  370. package/lib/runtime/scope/index.js.map +0 -1
  371. package/lib/runtime/scope/make_proxy.js.map +0 -1
  372. package/lib/runtime/scope/test_case_scope.js.map +0 -1
  373. package/lib/runtime/scope/test_run_scope.js.map +0 -1
  374. package/lib/runtime/serial/adapter.js.map +0 -1
  375. package/lib/runtime/step_runner.js.map +0 -1
  376. package/lib/runtime/stopwatch.js.map +0 -1
  377. package/lib/runtime/test_case_runner.js.map +0 -1
  378. package/lib/runtime/types.js.map +0 -1
  379. package/lib/runtime/worker.js.map +0 -1
  380. package/lib/sharding/index.js.map +0 -1
  381. package/lib/sharding/sharding_plugin.js.map +0 -1
  382. package/lib/step_arguments.js.map +0 -1
  383. package/lib/support_code_library_builder/build_parameter_type.js.map +0 -1
  384. package/lib/support_code_library_builder/context.js.map +0 -1
  385. package/lib/support_code_library_builder/get_definition_line_and_uri.js.map +0 -1
  386. package/lib/support_code_library_builder/index.js.map +0 -1
  387. package/lib/support_code_library_builder/parallel_can_assign_helpers.js.map +0 -1
  388. package/lib/support_code_library_builder/sourced_parameter_type_registry.js.map +0 -1
  389. package/lib/support_code_library_builder/types.js.map +0 -1
  390. package/lib/support_code_library_builder/validate_arguments.js.map +0 -1
  391. package/lib/support_code_library_builder/world.js.map +0 -1
  392. package/lib/time.js.map +0 -1
  393. package/lib/try_require.js.map +0 -1
  394. package/lib/tsconfig.node.tsbuildinfo +0 -1
  395. package/lib/types/index.js.map +0 -1
  396. package/lib/uncaught_exception_manager.js.map +0 -1
  397. package/lib/user_code_runner.js.map +0 -1
  398. package/lib/value_checker.js.map +0 -1
  399. package/lib/version.js.map +0 -1
  400. /package/lib/runtime/parallel/{run_worker.d.ts → worker.d.mts} +0 -0
@@ -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,11 @@ 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
+ tearingDown = false;
29
+ workers = new Set();
30
+ running = new Map();
24
31
  constructor(testRunStartedId, environment, logger, eventBroadcaster, options, snippetOptions, supportCodeLibrary) {
25
32
  this.testRunStartedId = testRunStartedId;
26
33
  this.environment = environment;
@@ -30,131 +37,138 @@ class ChildProcessAdapter {
30
37
  this.snippetOptions = snippetOptions;
31
38
  this.supportCodeLibrary = supportCodeLibrary;
32
39
  }
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);
40
+ async setup() {
41
+ await new Promise((resolve, reject) => {
42
+ this.readiness = { resolve, reject };
43
+ const total = this.options.parallel;
44
+ for (let i = 0; i < total; i++) {
45
+ const id = i.toString();
46
+ // spin up a dedicated message channel for coordinator-worker comms
47
+ const { port1, port2 } = new node_worker_threads_1.MessageChannel();
48
+ const workerThread = new node_worker_threads_1.Worker(node_path_1.default.resolve(__dirname, 'worker.mjs'), {
49
+ env: {
50
+ ...this.environment.env,
51
+ CUCUMBER_PARALLEL: 'true',
52
+ CUCUMBER_TOTAL_WORKERS: total.toString(),
53
+ CUCUMBER_WORKER_ID: id,
54
+ },
55
+ resourceLimits: this.options.workerOptions?.resourceLimits,
56
+ workerData: {
57
+ cwd: this.environment.cwd,
58
+ testRunStartedId: this.testRunStartedId,
59
+ supportCodeCoordinates: this.supportCodeLibrary.originalCoordinates,
60
+ supportCodeIds: {
61
+ stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id),
62
+ beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id),
63
+ afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id),
64
+ beforeTestRunHookDefinitionIds: this.supportCodeLibrary.beforeTestRunHookDefinitions.map((h) => h.id),
65
+ afterTestRunHookDefinitionIds: this.supportCodeLibrary.afterTestRunHookDefinitions.map((h) => h.id),
66
+ },
67
+ options: this.options,
68
+ snippetOptions: this.snippetOptions,
69
+ port: port2,
70
+ },
71
+ transferList: [port2],
72
+ });
73
+ const worker = {
74
+ id,
75
+ workerThread,
76
+ port: port1,
77
+ ready: false,
78
+ };
79
+ this.workers.add(worker);
80
+ port1.on('message', (event) => {
81
+ this.handleEventFromWorker(worker, event);
82
+ });
83
+ workerThread.on('error', (error) => {
84
+ this.handleErrorFromWorker(error, worker);
85
+ });
86
+ workerThread.on('exit', (exitCode) => {
87
+ this.handleExitFromWorker(exitCode, worker);
88
+ });
58
89
  }
59
- return worker.state !== 0 /* WorkerState.idle */;
60
90
  });
61
- if (Object.keys(this.inProgress).length == 0 && this.todo.length > 0) {
62
- this.giveWork(triggeringWorker, true);
63
- this.idleInterventions++;
64
- }
91
+ delete this.readiness;
65
92
  }
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'],
93
+ async runBeforeAllHooks() {
94
+ const success = await new Promise((resolve, reject) => {
95
+ this.phase = new test_run_hooks_phase_1.TestRunHooksPhase(resolve, reject, 'BEFOREALL_HOOKS');
96
+ this.startPhase();
76
97
  });
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);
98
+ delete this.phase;
99
+ return success;
100
+ }
101
+ async runTestCases(assembledTestCases) {
102
+ const success = await new Promise((resolve, reject) => {
103
+ this.phase = new test_cases_phase_1.TestCasesPhase(resolve, reject, this.logger, this.supportCodeLibrary.parallelCanAssign, assembledTestCases);
104
+ this.startPhase();
85
105
  });
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,
106
+ delete this.phase;
107
+ return success;
108
+ }
109
+ async runAfterAllHooks() {
110
+ const success = await new Promise((resolve, reject) => {
111
+ this.phase = new test_run_hooks_phase_1.TestRunHooksPhase(resolve, reject, 'AFTERALL_HOOKS');
112
+ this.startPhase();
99
113
  });
114
+ delete this.phase;
115
+ return success;
100
116
  }
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);
117
+ async teardown() {
118
+ this.tearingDown = true;
119
+ for (const worker of this.workers.values()) {
120
+ await worker.workerThread.terminate();
121
+ // close our end of the channel so it stops keeping the loop alive
122
+ worker.port.close();
107
123
  }
108
124
  }
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);
125
+ startPhase() {
126
+ for (const worker of this.workers) {
127
+ const command = this.phase.fill();
128
+ if (command) {
129
+ this.issueCommandToWorker(worker, command);
114
130
  }
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
- });
131
+ }
122
132
  }
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;
133
+ issueCommandToWorker(worker, command) {
134
+ this.running.set(worker, command);
135
+ worker.port.postMessage(command);
136
+ }
137
+ handleEventFromWorker(worker, event) {
138
+ switch (event.type) {
139
+ case 'READY':
140
+ worker.ready = true;
141
+ if ([...this.workers].every((mw) => mw.ready)) {
142
+ this.readiness?.resolve();
143
+ }
144
+ break;
145
+ case 'ENVELOPE':
146
+ this.eventBroadcaster.emit('envelope', event.envelope);
147
+ break;
148
+ case 'FINISHED': {
149
+ const previousCommand = this.running.get(worker);
150
+ this.running.delete(worker);
151
+ const nextCommand = this.phase?.next(previousCommand, event);
152
+ if (nextCommand) {
153
+ this.issueCommandToWorker(worker, nextCommand);
154
+ }
155
+ break;
128
156
  }
129
157
  }
130
- return null;
131
158
  }
132
- placementAt(index) {
133
- return {
134
- index,
135
- item: this.todo[index],
136
- };
159
+ handleErrorFromWorker(error, worker) {
160
+ this.fail(new Error(`Error on worker ${worker.id}`, { cause: error }));
137
161
  }
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;
162
+ handleExitFromWorker(exitCode, worker) {
163
+ if (!this.tearingDown) {
164
+ this.fail(new Error(`Worker ${worker.id} exited unexpectedly with code ${exitCode}`));
143
165
  }
144
- const workPlacement = force ? this.placementAt(0) : this.nextWorkPlacement();
145
- if (workPlacement === null) {
146
- return;
147
- }
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
- });
166
+ }
167
+ fail(reason) {
168
+ this.readiness?.reject(reason);
169
+ this.phase?.reject(reason);
170
+ void this.teardown();
157
171
  }
158
172
  }
159
- exports.ChildProcessAdapter = ChildProcessAdapter;
160
- //# sourceMappingURL=adapter.js.map
173
+ exports.WorkerThreadsAdapter = WorkerThreadsAdapter;
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW50aW1lL3BhcmFsbGVsL2FkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsMERBQTRCO0FBQzVCLDZEQUE0RDtBQU81RCx5REFBbUQ7QUFDbkQsaUVBQTBEO0FBRzFEOzs7Ozs7R0FNRztBQUNILE1BQWEsb0JBQW9CO0lBV1o7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFoQlgsU0FBUyxDQUdoQjtJQUNPLEtBQUssQ0FBUTtJQUNiLFdBQVcsR0FBRyxLQUFLLENBQUE7SUFDVixPQUFPLEdBQXVCLElBQUksR0FBRyxFQUFFLENBQUE7SUFDdkMsT0FBTyxHQUFzQyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXZFLFlBQ21CLGdCQUF3QixFQUN4QixXQUE0QixFQUM1QixNQUFlLEVBQ2YsZ0JBQThCLEVBQzlCLE9BQTJCLEVBQzNCLGNBQXlFLEVBQ3pFLGtCQUFzQztRQU50QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVE7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQVM7UUFDZixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWM7UUFDOUIsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0IsbUJBQWMsR0FBZCxjQUFjLENBQTJEO1FBQ3pFLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7SUFDdEQsQ0FBQztJQUVKLEtBQUssQ0FBQyxLQUFLO1FBQ1QsTUFBTSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFBO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFBO1lBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxF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VSxNQUFNLENBQUMsRUFBRSxrQ0FBa0MsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3ZGLENBQUM7SUFDSCxDQUFDO0lBRU8sSUFBSSxDQUFDLE1BQWE7UUFDeEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDOUIsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDMUIsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDdEIsQ0FBQztDQUNGO0FBNUtELG9EQTRLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyBNZXNzYWdlQ2hhbm5lbCwgV29ya2VyIH0gZnJvbSAnbm9kZTp3b3JrZXJfdGhyZWFkcydcbmltcG9ydCB0eXBlIHsgSVJ1bk9wdGlvbnNSdW50aW1lIH0gZnJvbSAnLi4vLi4vYXBpJ1xuaW1wb3J0IHR5cGUgeyBBc3NlbWJsZWRUZXN0Q2FzZSB9IGZyb20gJy4uLy4uL2Fzc2VtYmxlJ1xuaW1wb3J0IHR5cGUgeyBJTG9nZ2VyLCBJUnVuRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9lbnZpcm9ubWVudCdcbmltcG9ydCB0eXBlIHsgRm9ybWF0T3B0aW9ucyB9IGZyb20gJy4uLy4uL2Zvcm1hdHRlcidcbmltcG9ydCB0eXBlIHsgU3VwcG9ydENvZGVMaWJyYXJ5IH0gZnJvbSAnLi4vLi4vc3VwcG9ydF9jb2RlX2xpYnJhcnlfYnVpbGRlci90eXBlcydcbmltcG9ydCB0eXBlIHsgUnVudGltZUFkYXB0ZXIgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IFRlc3RDYXNlc1BoYXNlIH0gZnJvbSAnLi90ZXN0X2Nhc2VzX3BoYXNlJ1xuaW1wb3J0IHsgVGVzdFJ1bkhvb2tzUGhhc2UgfSBmcm9tICcuL3Rlc3RfcnVuX2hvb2tzX3BoYXNlJ1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VkV29ya2VyLCBQaGFzZSwgV29ya2VyQ29tbWFuZCwgV29ya2VyRGF0YSwgV29ya2VyRXZlbnQgfSBmcm9tICcuL3R5cGVzJ1xuXG4vKipcbiAqIEFuIGFkYXB0ZXIgdGhhdCBkaXN0cmlidXRlcyB3b3JrIGFjcm9zcyBtdWx0aXBsZSB3b3JrZXIgdGhyZWFkc1xuICogQHJlbWFya3NcbiAqIEVhY2ggcGhhc2Ugb2YgdGhlIHRlc3QgcnVuIGlzIHNlbGYtY29udGFpbmVkIGFuZCBzZWxmLW9yY2hlc3RyYXRpbmcgLSBldmVyeVxuICogRklOSVNIRUQgbWVzc2FnZSBmcm9tIGEgd29ya2VyIG1heSBjYXVzZSB0aGUgbmV4dCBwaWVjZSBvZiB3b3JrIHRvIGJlXG4gKiB0cmlnZ2VyZWQgb3IgdGhlIHBoYXNlIHRvIGJlIHNldHRsZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZXJUaHJlYWRzQWRhcHRlciBpbXBsZW1lbnRzIFJ1bnRpbWVBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkaW5lc3M/OiB7XG4gICAgcmVzb2x2ZTogKCkgPT4gdm9pZFxuICAgIHJlamVjdDogKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZFxuICB9XG4gIHByaXZhdGUgcGhhc2U/OiBQaGFzZVxuICBwcml2YXRlIHRlYXJpbmdEb3duID0gZmFsc2VcbiAgcHJpdmF0ZSByZWFkb25seSB3b3JrZXJzOiBTZXQ8TWFuYWdlZFdvcmtlcj4gPSBuZXcgU2V0KClcbiAgcHJpdmF0ZSByZWFkb25seSBydW5uaW5nOiBNYXA8TWFuYWdlZFdvcmtlciwgV29ya2VyQ29tbWFuZD4gPSBuZXcgTWFwKClcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlc3RSdW5TdGFydGVkSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50OiBJUnVuRW52aXJvbm1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IElMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudEJyb2FkY2FzdGVyOiBFdmVudEVtaXR0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJUnVuT3B0aW9uc1J1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzbmlwcGV0T3B0aW9uczogUGljazxGb3JtYXRPcHRpb25zLCAnc25pcHBldEludGVyZmFjZScgfCAnc25pcHBldFN5bnRheCc+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3VwcG9ydENvZGVMaWJyYXJ5OiBTdXBwb3J0Q29kZUxpYnJhcnlcbiAgKSB7fVxuXG4gIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVhZGluZXNzID0geyByZXNvbHZlLCByZWplY3QgfVxuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLm9wdGlvbnMucGFyYWxsZWxcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkrKykge1xuICAgICAgICBjb25zdCBpZCA9IGkudG9TdHJpbmcoKVxuICAgICAgICAvLyBzcGluIHVwIGEgZGVkaWNhdGVkIG1lc3NhZ2UgY2hhbm5lbCBmb3IgY29vcmRpbmF0b3Itd29ya2VyIGNvbW1zXG4gICAgICAgIGNvbnN0IHsgcG9ydDEsIHBvcnQyIH0gPSBuZXcgTWVzc2FnZUNoYW5uZWwoKVxuICAgICAgICBjb25zdCB3b3JrZXJUaHJlYWQgPSBuZXcgV29ya2VyKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICd3b3JrZXIubWpzJyksIHtcbiAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZW52aXJvbm1lbnQuZW52LFxuICAgICAgICAgICAgQ1VDVU1CRVJfUEFSQUxMRUw6ICd0cnVlJyxcbiAgICAgICAgICAgIENVQ1VNQkVSX1RPVEFMX1dPUktFUlM6IHRvdGFsLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBDVUNVTUJFUl9XT1JLRVJfSUQ6IGlkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb3VyY2VMaW1pdHM6IHRoaXMub3B0aW9ucy53b3JrZXJPcHRpb25zPy5yZXNvdXJjZUxpbWl0cyxcbiAgICAgICAgICB3b3JrZXJEYXRhOiB7XG4gICAgICAgICAgICBjd2Q6IHRoaXMuZW52aXJvbm1lbnQuY3dkLFxuICAgICAgICAgICAgdGVzdFJ1blN0YXJ0ZWRJZDogdGhpcy50ZXN0UnVuU3RhcnRlZElkLFxuICAgICAgICAgICAgc3VwcG9ydENvZGVDb29yZGluYXRlczogdGhpcy5zdXBwb3J0Q29kZUxpYnJhcnkub3JpZ2luYWxDb29yZGluYXRlcyxcbiAgICAgICAgICAgIHN1cHBvcnRDb2RlSWRzOiB7XG4gICAgICAgICAgICAgIHN0ZXBEZWZpbml0aW9uSWRzOiB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5zdGVwRGVmaW5pdGlvbnMubWFwKChzKSA9PiBzLmlkKSxcbiAgICAgICAgICAgICAgYmVmb3JlVGVzdENhc2VIb29rRGVmaW5pdGlvbklkczpcbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5iZWZvcmVUZXN0Q2FzZUhvb2tEZWZpbml0aW9ucy5tYXAoKGgpID0+IGguaWQpLFxuICAgICAgICAgICAgICBhZnRlclRlc3RDYXNlSG9va0RlZmluaXRpb25JZHM6XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0Q29kZUxpYnJhcnkuYWZ0ZXJUZXN0Q2FzZUhvb2tEZWZpbml0aW9ucy5tYXAoKGgpID0+IGguaWQpLFxuICAgICAgICAgICAgICBiZWZvcmVUZXN0UnVuSG9va0RlZmluaXRpb25JZHM6XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0Q29kZUxpYnJhcnkuYmVmb3JlVGVzdFJ1bkhvb2tEZWZpbml0aW9ucy5tYXAoKGgpID0+IGguaWQpLFxuICAgICAgICAgICAgICBhZnRlclRlc3RSdW5Ib29rRGVmaW5pdGlvbklkczpcbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5hZnRlclRlc3RSdW5Ib29rRGVmaW5pdGlvbnMubWFwKChoKSA9PiBoLmlkKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICBzbmlwcGV0T3B0aW9uczogdGhpcy5zbmlwcGV0T3B0aW9ucyxcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQyLFxuICAgICAgICAgIH0gc2F0aXNmaWVzIFdvcmtlckRhdGEsXG4gICAgICAgICAgdHJhbnNmZXJMaXN0OiBbcG9ydDJdLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCB3b3JrZXIgPSB7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgd29ya2VyVGhyZWFkLFxuICAgICAgICAgIHBvcnQ6IHBvcnQxLFxuICAgICAgICAgIHJlYWR5OiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndvcmtlcnMuYWRkKHdvcmtlcilcbiAgICAgICAgcG9ydDEub24oJ21lc3NhZ2UnLCAoZXZlbnQ6IFdvcmtlckV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFdmVudEZyb21Xb3JrZXIod29ya2VyLCBldmVudClcbiAgICAgICAgfSlcbiAgICAgICAgd29ya2VyVGhyZWFkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3JGcm9tV29ya2VyKGVycm9yLCB3b3JrZXIpXG4gICAgICAgIH0pXG4gICAgICAgIHdvcmtlclRocmVhZC5vbignZXhpdCcsIChleGl0Q29kZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRXhpdEZyb21Xb3JrZXIoZXhpdENvZGUsIHdvcmtlcilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGRlbGV0ZSB0aGlzLnJlYWRpbmVzc1xuICB9XG5cbiAgYXN5bmMgcnVuQmVmb3JlQWxsSG9va3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGhhc2UgPSBuZXcgVGVzdFJ1bkhvb2tzUGhhc2UocmVzb2x2ZSwgcmVqZWN0LCAnQkVGT1JFQUxMX0hPT0tTJylcbiAgICAgIHRoaXMuc3RhcnRQaGFzZSgpXG4gICAgfSlcbiAgICBkZWxldGUgdGhpcy5waGFzZVxuICAgIHJldHVybiBzdWNjZXNzXG4gIH1cblxuICBhc3luYyBydW5UZXN0Q2FzZXMoYXNzZW1ibGVkVGVzdENhc2VzOiBSZWFkb25seUFycmF5PEFzc2VtYmxlZFRlc3RDYXNlPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnBoYXNlID0gbmV3IFRlc3RDYXNlc1BoYXNlKFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgICAgIHRoaXMubG9nZ2VyLFxuICAgICAgICB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5wYXJhbGxlbENhbkFzc2lnbixcbiAgICAgICAgYXNzZW1ibGVkVGVzdENhc2VzXG4gICAgICApXG4gICAgICB0aGlzLnN0YXJ0UGhhc2UoKVxuICAgIH0pXG4gICAgZGVsZXRlIHRoaXMucGhhc2VcbiAgICByZXR1cm4gc3VjY2Vzc1xuICB9XG5cbiAgYXN5bmMgcnVuQWZ0ZXJBbGxIb29rcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5waGFzZSA9IG5ldyBUZXN0UnVuSG9va3NQaGFzZShyZXNvbHZlLCByZWplY3QsICdBRlRFUkFMTF9IT09LUycpXG4gICAgICB0aGlzLnN0YXJ0UGhhc2UoKVxuICAgIH0pXG4gICAgZGVsZXRlIHRoaXMucGhhc2VcbiAgICByZXR1cm4gc3VjY2Vzc1xuICB9XG5cbiAgYXN5bmMgdGVhcmRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50ZWFyaW5nRG93biA9IHRydWVcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB0aGlzLndvcmtlcnMudmFsdWVzKCkpIHtcbiAgICAgIGF3YWl0IHdvcmtlci53b3JrZXJUaHJlYWQudGVybWluYXRlKClcbiAgICAgIC8vIGNsb3NlIG91ciBlbmQgb2YgdGhlIGNoYW5uZWwgc28gaXQgc3RvcHMga2VlcGluZyB0aGUgbG9vcCBhbGl2ZVxuICAgICAgd29ya2VyLnBvcnQuY2xvc2UoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQaGFzZSgpIHtcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB0aGlzLndvcmtlcnMpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSB0aGlzLnBoYXNlLmZpbGwoKVxuICAgICAgaWYgKGNvbW1hbmQpIHtcbiAgICAgICAgdGhpcy5pc3N1ZUNvbW1hbmRUb1dvcmtlcih3b3JrZXIsIGNvbW1hbmQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc3N1ZUNvbW1hbmRUb1dvcmtlcih3b3JrZXI6IE1hbmFnZWRXb3JrZXIsIGNvbW1hbmQ6IFdvcmtlckNvbW1hbmQpIHtcbiAgICB0aGlzLnJ1bm5pbmcuc2V0KHdvcmtlciwgY29tbWFuZClcbiAgICB3b3JrZXIucG9ydC5wb3N0TWVzc2FnZShjb21tYW5kKVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFdmVudEZyb21Xb3JrZXIod29ya2VyOiBNYW5hZ2VkV29ya2VyLCBldmVudDogV29ya2VyRXZlbnQpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ1JFQURZJzpcbiAgICAgICAgd29ya2VyLnJlYWR5ID0gdHJ1ZVxuICAgICAgICBpZiAoWy4uLnRoaXMud29ya2Vyc10uZXZlcnkoKG13KSA9PiBtdy5yZWFkeSkpIHtcbiAgICAgICAgICB0aGlzLnJlYWRpbmVzcz8ucmVzb2x2ZSgpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ0VOVkVMT1BFJzpcbiAgICAgICAgdGhpcy5ldmVudEJyb2FkY2FzdGVyLmVtaXQoJ2VudmVsb3BlJywgZXZlbnQuZW52ZWxvcGUpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdGSU5JU0hFRCc6IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNDb21tYW5kID0gdGhpcy5ydW5uaW5nLmdldCh3b3JrZXIpXG4gICAgICAgIHRoaXMucnVubmluZy5kZWxldGUod29ya2VyKVxuICAgICAgICBjb25zdCBuZXh0Q29tbWFuZCA9IHRoaXMucGhhc2U/Lm5leHQocHJldmlvdXNDb21tYW5kLCBldmVudClcbiAgICAgICAgaWYgKG5leHRDb21tYW5kKSB7XG4gICAgICAgICAgdGhpcy5pc3N1ZUNvbW1hbmRUb1dvcmtlcih3b3JrZXIsIG5leHRDb21tYW5kKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvckZyb21Xb3JrZXIoZXJyb3I6IEVycm9yLCB3b3JrZXI6IE1hbmFnZWRXb3JrZXIpIHtcbiAgICB0aGlzLmZhaWwobmV3IEVycm9yKGBFcnJvciBvbiB3b3JrZXIgJHt3b3JrZXIuaWR9YCwgeyBjYXVzZTogZXJyb3IgfSkpXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUV4aXRGcm9tV29ya2VyKGV4aXRDb2RlOiBudW1iZXIsIHdvcmtlcjogTWFuYWdlZFdvcmtlcikge1xuICAgIGlmICghdGhpcy50ZWFyaW5nRG93bikge1xuICAgICAgdGhpcy5mYWlsKG5ldyBFcnJvcihgV29ya2VyICR7d29ya2VyLmlkfSBleGl0ZWQgdW5leHBlY3RlZGx5IHdpdGggY29kZSAke2V4aXRDb2RlfWApKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmFpbChyZWFzb246IEVycm9yKSB7XG4gICAgdGhpcy5yZWFkaW5lc3M/LnJlamVjdChyZWFzb24pXG4gICAgdGhpcy5waGFzZT8ucmVqZWN0KHJlYXNvbilcbiAgICB2b2lkIHRoaXMudGVhcmRvd24oKVxuICB9XG59XG4iXX0=
@@ -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=
@@ -0,0 +1,65 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { register } from 'node:module';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { workerData } from 'node:worker_threads';
5
+ import { IdGenerator } from '@cucumber/messages';
6
+ import FormatterBuilder from '../../formatter/builder.js';
7
+ import supportCodeLibraryBuilder from '../../support_code_library_builder/index.js';
8
+ import tryRequire from '../../try_require.js';
9
+ import { Worker } from '../worker.js';
10
+ const { cwd, testRunStartedId, supportCodeCoordinates, supportCodeIds, options, snippetOptions, port, } = workerData;
11
+ const newId = IdGenerator.uuid();
12
+ supportCodeLibraryBuilder.default.reset(cwd, newId, supportCodeCoordinates);
13
+ supportCodeCoordinates.requireModules.map((module) => tryRequire.default(module));
14
+ supportCodeCoordinates.requirePaths.map((module) => tryRequire.default(module));
15
+ for (const specifier of supportCodeCoordinates.loaders) {
16
+ register(specifier, pathToFileURL('./'));
17
+ }
18
+ for (const path of supportCodeCoordinates.importPaths) {
19
+ await import(pathToFileURL(path).toString());
20
+ }
21
+ const supportCodeLibrary = supportCodeLibraryBuilder.default.finalize(supportCodeIds);
22
+ const snippetBuilder = await FormatterBuilder.default.getStepDefinitionSnippetBuilder({
23
+ cwd,
24
+ snippetInterface: snippetOptions.snippetInterface,
25
+ snippetSyntax: snippetOptions.snippetSyntax,
26
+ supportCodeLibrary,
27
+ });
28
+ const eventBroadcaster = new EventEmitter();
29
+ eventBroadcaster.on('envelope', (envelope) => port.postMessage({
30
+ type: 'ENVELOPE',
31
+ envelope,
32
+ }));
33
+ const worker = new Worker(testRunStartedId, process.env.CUCUMBER_WORKER_ID, eventBroadcaster, IdGenerator.uuid(), options, supportCodeLibrary, snippetBuilder);
34
+ port.on('message', (command) => {
35
+ switch (command.type) {
36
+ case 'BEFOREALL_HOOKS':
37
+ worker.runBeforeAllHooks().then((success) => {
38
+ port.postMessage({
39
+ type: 'FINISHED',
40
+ success,
41
+ });
42
+ });
43
+ break;
44
+ case 'TEST_CASE':
45
+ worker.runTestCase(command.assembledTestCase, command.failing).then((success) => {
46
+ port.postMessage({
47
+ type: 'FINISHED',
48
+ success,
49
+ });
50
+ });
51
+ break;
52
+ case 'AFTERALL_HOOKS':
53
+ worker.runAfterAllHooks().then((success) => {
54
+ port.postMessage({
55
+ type: 'FINISHED',
56
+ success,
57
+ });
58
+ });
59
+ break;
60
+ }
61
+ });
62
+ port.postMessage({
63
+ type: 'READY',
64
+ });
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLm1qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW50aW1lL3BhcmFsbGVsL3dvcmtlci5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ2hELE9BQU8sRUFBaUIsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDL0QsT0FBTyxnQkFBZ0IsTUFBTSw0QkFBNEIsQ0FBQTtBQUN6RCxPQUFPLHlCQUF5QixNQUFNLDZDQUE2QyxDQUFBO0FBQ25GLE9BQU8sVUFBVSxNQUFNLHNCQUFzQixDQUFBO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFHckMsTUFBTSxFQUNKLEdBQUcsRUFDSCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLGNBQWMsRUFDZCxPQUFPLEVBQ1AsY0FBYyxFQUNkLElBQUksR0FDTCxHQUFHLFVBQXdCLENBQUE7QUFDNUIsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFBO0FBRWhDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxzQkFBc0IsQ0FBQyxDQUFBO0FBQzNFLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtBQUNqRixzQkFBc0IsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7QUFDL0UsS0FBSyxNQUFNLFNBQVMsSUFBSSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN2RCxRQUFRLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQzFDLENBQUM7QUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RELE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0FBQzlDLENBQUM7QUFDRCxNQUFNLGtCQUFrQixHQUFHLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDckYsTUFBTSxjQUFjLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUM7SUFDcEYsR0FBRztJQUNILGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxnQkFBZ0I7SUFDakQsYUFBYSxFQUFFLGNBQWMsQ0FBQyxhQUFhO0lBQzNDLGtCQUFrQjtDQUNuQixDQUFDLENBQUE7QUFFRixNQUFNLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7QUFDM0MsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQWtCLEVBQUUsRUFBRSxDQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ2YsSUFBSSxFQUFFLFVBQVU7SUFDaEIsUUFBUTtDQUNhLENBQUMsQ0FDekIsQ0FBQTtBQUVELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUN2QixnQkFBZ0IsRUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFDOUIsZ0JBQWdCLEVBQ2hCLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFDbEIsT0FBTyxFQUNQLGtCQUFrQixFQUNsQixjQUFjLENBQ2YsQ0FBQTtBQUVELElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBc0IsRUFBRSxFQUFFO0lBQzVDLFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLEtBQUssaUJBQWlCO1lBQ3BCLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDO29CQUNmLElBQUksRUFBRSxVQUFVO29CQUNoQixPQUFPO2lCQUNjLENBQUMsQ0FBQTtZQUMxQixDQUFDLENBQUMsQ0FBQTtZQUNGLE1BQUs7UUFDUCxLQUFLLFdBQVc7WUFDZCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzlFLElBQUksQ0FBQyxXQUFXLENBQUM7b0JBQ2YsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLE9BQU87aUJBQ2MsQ0FBQyxDQUFBO1lBQzFCLENBQUMsQ0FBQyxDQUFBO1lBQ0YsTUFBSztRQUNQLEtBQUssZ0JBQWdCO1lBQ25CLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDO29CQUNmLElBQUksRUFBRSxVQUFVO29CQUNoQixPQUFPO2lCQUNjLENBQUMsQ0FBQTtZQUMxQixDQUFDLENBQUMsQ0FBQTtZQUNGLE1BQUs7SUFDVCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ2YsSUFBSSxFQUFFLE9BQU87Q0FDUSxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdub2RlOmV2ZW50cydcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnbm9kZTptb2R1bGUnXG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAnbm9kZTp1cmwnXG5pbXBvcnQgeyB3b3JrZXJEYXRhIH0gZnJvbSAnbm9kZTp3b3JrZXJfdGhyZWFkcydcbmltcG9ydCB7IHR5cGUgRW52ZWxvcGUsIElkR2VuZXJhdG9yIH0gZnJvbSAnQGN1Y3VtYmVyL21lc3NhZ2VzJ1xuaW1wb3J0IEZvcm1hdHRlckJ1aWxkZXIgZnJvbSAnLi4vLi4vZm9ybWF0dGVyL2J1aWxkZXIuanMnXG5pbXBvcnQgc3VwcG9ydENvZGVMaWJyYXJ5QnVpbGRlciBmcm9tICcuLi8uLi9zdXBwb3J0X2NvZGVfbGlicmFyeV9idWlsZGVyL2luZGV4LmpzJ1xuaW1wb3J0IHRyeVJlcXVpcmUgZnJvbSAnLi4vLi4vdHJ5X3JlcXVpcmUuanMnXG5pbXBvcnQgeyBXb3JrZXIgfSBmcm9tICcuLi93b3JrZXIuanMnXG5pbXBvcnQgdHlwZSB7IFdvcmtlckNvbW1hbmQsIFdvcmtlckRhdGEsIFdvcmtlckV2ZW50IH0gZnJvbSAnLi90eXBlcy5qcydcblxuY29uc3Qge1xuICBjd2QsXG4gIHRlc3RSdW5TdGFydGVkSWQsXG4gIHN1cHBvcnRDb2RlQ29vcmRpbmF0ZXMsXG4gIHN1cHBvcnRDb2RlSWRzLFxuICBvcHRpb25zLFxuICBzbmlwcGV0T3B0aW9ucyxcbiAgcG9ydCxcbn0gPSB3b3JrZXJEYXRhIGFzIFdvcmtlckRhdGFcbmNvbnN0IG5ld0lkID0gSWRHZW5lcmF0b3IudXVpZCgpXG5cbnN1cHBvcnRDb2RlTGlicmFyeUJ1aWxkZXIuZGVmYXVsdC5yZXNldChjd2QsIG5ld0lkLCBzdXBwb3J0Q29kZUNvb3JkaW5hdGVzKVxuc3VwcG9ydENvZGVDb29yZGluYXRlcy5yZXF1aXJlTW9kdWxlcy5tYXAoKG1vZHVsZSkgPT4gdHJ5UmVxdWlyZS5kZWZhdWx0KG1vZHVsZSkpXG5zdXBwb3J0Q29kZUNvb3JkaW5hdGVzLnJlcXVpcmVQYXRocy5tYXAoKG1vZHVsZSkgPT4gdHJ5UmVxdWlyZS5kZWZhdWx0KG1vZHVsZSkpXG5mb3IgKGNvbnN0IHNwZWNpZmllciBvZiBzdXBwb3J0Q29kZUNvb3JkaW5hdGVzLmxvYWRlcnMpIHtcbiAgcmVnaXN0ZXIoc3BlY2lmaWVyLCBwYXRoVG9GaWxlVVJMKCcuLycpKVxufVxuZm9yIChjb25zdCBwYXRoIG9mIHN1cHBvcnRDb2RlQ29vcmRpbmF0ZXMuaW1wb3J0UGF0aHMpIHtcbiAgYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwocGF0aCkudG9TdHJpbmcoKSlcbn1cbmNvbnN0IHN1cHBvcnRDb2RlTGlicmFyeSA9IHN1cHBvcnRDb2RlTGlicmFyeUJ1aWxkZXIuZGVmYXVsdC5maW5hbGl6ZShzdXBwb3J0Q29kZUlkcylcbmNvbnN0IHNuaXBwZXRCdWlsZGVyID0gYXdhaXQgRm9ybWF0dGVyQnVpbGRlci5kZWZhdWx0LmdldFN0ZXBEZWZpbml0aW9uU25pcHBldEJ1aWxkZXIoe1xuICBjd2QsXG4gIHNuaXBwZXRJbnRlcmZhY2U6IHNuaXBwZXRPcHRpb25zLnNuaXBwZXRJbnRlcmZhY2UsXG4gIHNuaXBwZXRTeW50YXg6IHNuaXBwZXRPcHRpb25zLnNuaXBwZXRTeW50YXgsXG4gIHN1cHBvcnRDb2RlTGlicmFyeSxcbn0pXG5cbmNvbnN0IGV2ZW50QnJvYWRjYXN0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKClcbmV2ZW50QnJvYWRjYXN0ZXIub24oJ2VudmVsb3BlJywgKGVudmVsb3BlOiBFbnZlbG9wZSkgPT5cbiAgcG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgdHlwZTogJ0VOVkVMT1BFJyxcbiAgICBlbnZlbG9wZSxcbiAgfSBzYXRpc2ZpZXMgV29ya2VyRXZlbnQpXG4pXG5cbmNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIoXG4gIHRlc3RSdW5TdGFydGVkSWQsXG4gIHByb2Nlc3MuZW52LkNVQ1VNQkVSX1dPUktFUl9JRCxcbiAgZXZlbnRCcm9hZGNhc3RlcixcbiAgSWRHZW5lcmF0b3IudXVpZCgpLFxuICBvcHRpb25zLFxuICBzdXBwb3J0Q29kZUxpYnJhcnksXG4gIHNuaXBwZXRCdWlsZGVyXG4pXG5cbnBvcnQub24oJ21lc3NhZ2UnLCAoY29tbWFuZDogV29ya2VyQ29tbWFuZCkgPT4ge1xuICBzd2l0Y2ggKGNvbW1hbmQudHlwZSkge1xuICAgIGNhc2UgJ0JFRk9SRUFMTF9IT09LUyc6XG4gICAgICB3b3JrZXIucnVuQmVmb3JlQWxsSG9va3MoKS50aGVuKChzdWNjZXNzKSA9PiB7XG4gICAgICAgIHBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHR5cGU6ICdGSU5JU0hFRCcsXG4gICAgICAgICAgc3VjY2VzcyxcbiAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2VyRXZlbnQpXG4gICAgICB9KVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdURVNUX0NBU0UnOlxuICAgICAgd29ya2VyLnJ1blRlc3RDYXNlKGNvbW1hbmQuYXNzZW1ibGVkVGVzdENhc2UsIGNvbW1hbmQuZmFpbGluZykudGhlbigoc3VjY2VzcykgPT4ge1xuICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICB0eXBlOiAnRklOSVNIRUQnLFxuICAgICAgICAgIHN1Y2Nlc3MsXG4gICAgICAgIH0gc2F0aXNmaWVzIFdvcmtlckV2ZW50KVxuICAgICAgfSlcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnQUZURVJBTExfSE9PS1MnOlxuICAgICAgd29ya2VyLnJ1bkFmdGVyQWxsSG9va3MoKS50aGVuKChzdWNjZXNzKSA9PiB7XG4gICAgICAgIHBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHR5cGU6ICdGSU5JU0hFRCcsXG4gICAgICAgICAgc3VjY2VzcyxcbiAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2VyRXZlbnQpXG4gICAgICB9KVxuICAgICAgYnJlYWtcbiAgfVxufSlcblxucG9ydC5wb3N0TWVzc2FnZSh7XG4gIHR5cGU6ICdSRUFEWScsXG59IHNhdGlzZmllcyBXb3JrZXJFdmVudClcbiJdfQ==