@dev-blinq/cucumber-js 1.0.36 → 1.0.38

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 (239) hide show
  1. package/bin/cucumber-js +0 -0
  2. package/bin/cucumber.js +0 -0
  3. package/lib/api/console_logger.d.ts +12 -12
  4. package/lib/api/console_logger.js +23 -23
  5. package/lib/api/convert_configuration.d.ts +4 -4
  6. package/lib/api/convert_configuration.js +65 -65
  7. package/lib/api/environment.d.ts +2 -2
  8. package/lib/api/environment.js +13 -13
  9. package/lib/api/formatters.d.ts +20 -20
  10. package/lib/api/formatters.js +60 -60
  11. package/lib/api/gherkin.d.ts +21 -21
  12. package/lib/api/gherkin.js +99 -99
  13. package/lib/api/index.d.ts +12 -12
  14. package/lib/api/index.js +27 -27
  15. package/lib/api/load_configuration.d.ts +9 -9
  16. package/lib/api/load_configuration.js +40 -40
  17. package/lib/api/load_sources.d.ts +9 -9
  18. package/lib/api/load_sources.js +52 -52
  19. package/lib/api/load_support.d.ts +10 -10
  20. package/lib/api/load_support.js +29 -29
  21. package/lib/api/paths.d.ts +8 -8
  22. package/lib/api/paths.js +101 -101
  23. package/lib/api/plugins.d.ts +4 -4
  24. package/lib/api/plugins.js +18 -18
  25. package/lib/api/run_cucumber.d.ts +11 -11
  26. package/lib/api/run_cucumber.js +114 -114
  27. package/lib/api/runtime.d.ts +21 -21
  28. package/lib/api/runtime.js +35 -35
  29. package/lib/api/support.d.ts +9 -9
  30. package/lib/api/support.js +25 -25
  31. package/lib/api/test_helpers.d.ts +3 -3
  32. package/lib/api/test_helpers.js +30 -30
  33. package/lib/api/types.d.ts +177 -177
  34. package/lib/api/types.js +2 -2
  35. package/lib/cli/helpers.d.ts +39 -39
  36. package/lib/cli/helpers.js +223 -223
  37. package/lib/cli/i18n.d.ts +2 -2
  38. package/lib/cli/i18n.js +69 -69
  39. package/lib/cli/index.d.ts +21 -21
  40. package/lib/cli/index.js +63 -63
  41. package/lib/cli/install_validator.d.ts +1 -1
  42. package/lib/cli/install_validator.js +13 -13
  43. package/lib/cli/run.d.ts +1 -1
  44. package/lib/cli/run.js +43 -43
  45. package/lib/cli/validate_node_engine_version.d.ts +10 -10
  46. package/lib/cli/validate_node_engine_version.js +23 -23
  47. package/lib/configuration/argv_parser.d.ts +20 -20
  48. package/lib/configuration/argv_parser.js +102 -102
  49. package/lib/configuration/check_schema.d.ts +2 -2
  50. package/lib/configuration/check_schema.js +59 -59
  51. package/lib/configuration/default_configuration.d.ts +2 -2
  52. package/lib/configuration/default_configuration.js +28 -28
  53. package/lib/configuration/from_file.d.ts +3 -3
  54. package/lib/configuration/from_file.js +84 -84
  55. package/lib/configuration/helpers.d.ts +1 -1
  56. package/lib/configuration/helpers.js +10 -10
  57. package/lib/configuration/index.d.ts +7 -7
  58. package/lib/configuration/index.js +28 -28
  59. package/lib/configuration/locate_file.d.ts +1 -1
  60. package/lib/configuration/locate_file.js +20 -20
  61. package/lib/configuration/merge_configurations.d.ts +2 -2
  62. package/lib/configuration/merge_configurations.js +47 -47
  63. package/lib/configuration/option_splitter.d.ts +3 -3
  64. package/lib/configuration/option_splitter.js +22 -22
  65. package/lib/configuration/types.d.ts +30 -30
  66. package/lib/configuration/types.js +2 -2
  67. package/lib/configuration/validate_configuration.d.ts +3 -3
  68. package/lib/configuration/validate_configuration.js +12 -12
  69. package/lib/filter_stack_trace.d.ts +3 -3
  70. package/lib/filter_stack_trace.js +37 -37
  71. package/lib/formatter/builder.d.ts +37 -37
  72. package/lib/formatter/builder.js +100 -100
  73. package/lib/formatter/bvt_analysis_formatter.d.ts +18 -18
  74. package/lib/formatter/bvt_analysis_formatter.js +192 -192
  75. package/lib/formatter/feature_data_format.d.ts +14 -14
  76. package/lib/formatter/feature_data_format.js +80 -80
  77. package/lib/formatter/fixtures/typescript.d.ts +2 -2
  78. package/lib/formatter/fixtures/typescript.js +5 -5
  79. package/lib/formatter/get_color_fns.d.ts +15 -15
  80. package/lib/formatter/get_color_fns.js +55 -55
  81. package/lib/formatter/helpers/duration_helpers.d.ts +2 -2
  82. package/lib/formatter/helpers/duration_helpers.js +8 -8
  83. package/lib/formatter/helpers/event_data_collector.d.ts +30 -30
  84. package/lib/formatter/helpers/event_data_collector.js +125 -125
  85. package/lib/formatter/helpers/formatters.d.ts +6 -6
  86. package/lib/formatter/helpers/formatters.js +44 -44
  87. package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -5
  88. package/lib/formatter/helpers/gherkin_document_parser.js +65 -65
  89. package/lib/formatter/helpers/index.d.ts +10 -10
  90. package/lib/formatter/helpers/index.js +51 -51
  91. package/lib/formatter/helpers/issue_helpers.d.ts +19 -19
  92. package/lib/formatter/helpers/issue_helpers.js +58 -58
  93. package/lib/formatter/helpers/keyword_type.d.ts +11 -11
  94. package/lib/formatter/helpers/keyword_type.js +31 -31
  95. package/lib/formatter/helpers/location_helpers.d.ts +2 -2
  96. package/lib/formatter/helpers/location_helpers.js +16 -16
  97. package/lib/formatter/helpers/pickle_parser.d.ts +17 -17
  98. package/lib/formatter/helpers/pickle_parser.js +27 -27
  99. package/lib/formatter/helpers/report_generator.d.ts +107 -103
  100. package/lib/formatter/helpers/report_generator.js +310 -247
  101. package/lib/formatter/helpers/report_generator.js.map +1 -1
  102. package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
  103. package/lib/formatter/helpers/step_argument_formatter.js +47 -47
  104. package/lib/formatter/helpers/summary_helpers.d.ts +9 -9
  105. package/lib/formatter/helpers/summary_helpers.js +95 -95
  106. package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +12 -12
  107. package/lib/formatter/helpers/test_case_attempt_formatter.js +113 -113
  108. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +32 -32
  109. package/lib/formatter/helpers/test_case_attempt_parser.js +134 -134
  110. package/lib/formatter/helpers/upload_serivce.d.ts +9 -9
  111. package/lib/formatter/helpers/upload_serivce.js +46 -46
  112. package/lib/formatter/helpers/uploader.d.ts +11 -11
  113. package/lib/formatter/helpers/uploader.js +56 -56
  114. package/lib/formatter/helpers/usage_helpers/index.d.ts +23 -23
  115. package/lib/formatter/helpers/usage_helpers/index.js +110 -110
  116. package/lib/formatter/html_formatter.d.ts +7 -7
  117. package/lib/formatter/html_formatter.js +29 -29
  118. package/lib/formatter/index.d.ts +53 -53
  119. package/lib/formatter/index.js +20 -20
  120. package/lib/formatter/json_formatter.d.ts +78 -78
  121. package/lib/formatter/json_formatter.js +229 -229
  122. package/lib/formatter/junit_formatter.d.ts +17 -17
  123. package/lib/formatter/junit_formatter.js +180 -180
  124. package/lib/formatter/message_formatter.d.ts +5 -5
  125. package/lib/formatter/message_formatter.js +14 -14
  126. package/lib/formatter/progress_bar_formatter.d.ts +18 -18
  127. package/lib/formatter/progress_bar_formatter.js +98 -98
  128. package/lib/formatter/progress_formatter.d.ts +9 -9
  129. package/lib/formatter/progress_formatter.js +58 -58
  130. package/lib/formatter/rerun_formatter.d.ts +13 -13
  131. package/lib/formatter/rerun_formatter.js +79 -79
  132. package/lib/formatter/snippets_formatter.d.ts +6 -6
  133. package/lib/formatter/snippets_formatter.js +60 -60
  134. package/lib/formatter/step_definition_snippet_builder/index.d.ts +20 -20
  135. package/lib/formatter/step_definition_snippet_builder/index.js +45 -45
  136. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts +7 -7
  137. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +45 -45
  138. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +16 -16
  139. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js +10 -10
  140. package/lib/formatter/summary_formatter.d.ts +14 -14
  141. package/lib/formatter/summary_formatter.js +67 -67
  142. package/lib/formatter/usage_formatter.d.ts +6 -6
  143. package/lib/formatter/usage_formatter.js +97 -97
  144. package/lib/formatter/usage_json_formatter.d.ts +7 -7
  145. package/lib/formatter/usage_json_formatter.js +33 -33
  146. package/lib/index.d.ts +58 -58
  147. package/lib/index.js +108 -108
  148. package/lib/logger.d.ts +5 -5
  149. package/lib/logger.js +2 -2
  150. package/lib/models/data_table.d.ts +10 -10
  151. package/lib/models/data_table.js +45 -45
  152. package/lib/models/definition.d.ts +55 -55
  153. package/lib/models/definition.js +21 -21
  154. package/lib/models/gherkin_step_keyword.d.ts +1 -1
  155. package/lib/models/gherkin_step_keyword.js +2 -2
  156. package/lib/models/pickle_order.d.ts +1 -1
  157. package/lib/models/pickle_order.js +2 -2
  158. package/lib/models/step_definition.d.ts +11 -11
  159. package/lib/models/step_definition.js +36 -36
  160. package/lib/models/test_case_hook_definition.d.ts +10 -10
  161. package/lib/models/test_case_hook_definition.js +26 -26
  162. package/lib/models/test_run_hook_definition.d.ts +3 -3
  163. package/lib/models/test_run_hook_definition.js +9 -9
  164. package/lib/models/test_step_hook_definition.d.ts +9 -9
  165. package/lib/models/test_step_hook_definition.js +25 -25
  166. package/lib/pickle_filter.d.ts +42 -42
  167. package/lib/pickle_filter.js +98 -98
  168. package/lib/plugin/index.d.ts +2 -2
  169. package/lib/plugin/index.js +18 -18
  170. package/lib/plugin/plugin_manager.d.ts +13 -13
  171. package/lib/plugin/plugin_manager.js +35 -35
  172. package/lib/plugin/types.d.ts +14 -14
  173. package/lib/plugin/types.js +2 -2
  174. package/lib/publish/http_stream.d.ts +30 -30
  175. package/lib/publish/http_stream.js +111 -111
  176. package/lib/publish/index.d.ts +2 -2
  177. package/lib/publish/index.js +4 -4
  178. package/lib/publish/publish_plugin.d.ts +2 -2
  179. package/lib/publish/publish_plugin.js +47 -47
  180. package/lib/runtime/assemble_test_cases.d.ts +13 -13
  181. package/lib/runtime/assemble_test_cases.js +87 -87
  182. package/lib/runtime/attachment_manager/index.d.ts +33 -33
  183. package/lib/runtime/attachment_manager/index.js +118 -118
  184. package/lib/runtime/format_error.d.ts +2 -2
  185. package/lib/runtime/format_error.js +35 -35
  186. package/lib/runtime/helpers.d.ts +6 -6
  187. package/lib/runtime/helpers.js +100 -100
  188. package/lib/runtime/index.d.ts +40 -40
  189. package/lib/runtime/index.js +75 -75
  190. package/lib/runtime/parallel/command_types.d.ts +32 -32
  191. package/lib/runtime/parallel/command_types.js +2 -2
  192. package/lib/runtime/parallel/coordinator.d.ts +72 -72
  193. package/lib/runtime/parallel/coordinator.js +221 -221
  194. package/lib/runtime/parallel/run_worker.d.ts +1 -1
  195. package/lib/runtime/parallel/run_worker.js +28 -28
  196. package/lib/runtime/parallel/worker.d.ts +26 -26
  197. package/lib/runtime/parallel/worker.js +86 -86
  198. package/lib/runtime/run_test_run_hooks.d.ts +3 -3
  199. package/lib/runtime/run_test_run_hooks.js +27 -27
  200. package/lib/runtime/step_runner.d.ts +16 -16
  201. package/lib/runtime/step_runner.js +87 -87
  202. package/lib/runtime/stopwatch.d.ts +12 -12
  203. package/lib/runtime/stopwatch.js +33 -33
  204. package/lib/runtime/test_case_runner.d.ts +54 -54
  205. package/lib/runtime/test_case_runner.js +267 -267
  206. package/lib/step_arguments.d.ts +6 -6
  207. package/lib/step_arguments.js +18 -18
  208. package/lib/support_code_library_builder/build_parameter_type.d.ts +3 -3
  209. package/lib/support_code_library_builder/build_parameter_type.js +12 -12
  210. package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +3 -3
  211. package/lib/support_code_library_builder/get_definition_line_and_uri.js +28 -28
  212. package/lib/support_code_library_builder/index.d.ts +74 -74
  213. package/lib/support_code_library_builder/index.js +296 -296
  214. package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +2 -2
  215. package/lib/support_code_library_builder/parallel_can_assign_helpers.js +15 -15
  216. package/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts +7 -7
  217. package/lib/support_code_library_builder/sourced_parameter_type_registry.js +18 -18
  218. package/lib/support_code_library_builder/types.d.ts +88 -88
  219. package/lib/support_code_library_builder/types.js +2 -2
  220. package/lib/support_code_library_builder/validate_arguments.d.ts +12 -12
  221. package/lib/support_code_library_builder/validate_arguments.js +72 -72
  222. package/lib/support_code_library_builder/world.d.ts +18 -18
  223. package/lib/support_code_library_builder/world.js +10 -10
  224. package/lib/time.d.ts +18 -18
  225. package/lib/time.js +60 -60
  226. package/lib/try_require.d.ts +7 -7
  227. package/lib/try_require.js +22 -22
  228. package/lib/types/index.d.ts +4 -4
  229. package/lib/types/index.js +2 -2
  230. package/lib/uncaught_exception_manager.d.ts +7 -7
  231. package/lib/uncaught_exception_manager.js +11 -11
  232. package/lib/user_code_runner.d.ts +14 -14
  233. package/lib/user_code_runner.js +81 -81
  234. package/lib/value_checker.d.ts +3 -3
  235. package/lib/value_checker.js +18 -18
  236. package/lib/version.d.ts +1 -1
  237. package/lib/version.js +5 -5
  238. package/lib/version.js.map +1 -1
  239. package/package.json +1 -1
@@ -1,222 +1,222 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- const child_process_1 = require("child_process");
30
- const path_1 = __importDefault(require("path"));
31
- const helpers_1 = require("../helpers");
32
- const messages = __importStar(require("@cucumber/messages"));
33
- const value_checker_1 = require("../../value_checker");
34
- const stopwatch_1 = require("../stopwatch");
35
- const assemble_test_cases_1 = require("../assemble_test_cases");
36
- const runWorkerPath = path_1.default.resolve(__dirname, 'run_worker.js');
37
- class Coordinator {
38
- constructor({ cwd, logger, eventBroadcaster, eventDataCollector, pickleIds, options, newId, supportCodeLibrary, requireModules, requirePaths, importPaths, numberOfWorkers, }) {
39
- this.cwd = cwd;
40
- this.logger = logger;
41
- this.eventBroadcaster = eventBroadcaster;
42
- this.eventDataCollector = eventDataCollector;
43
- this.stopwatch = (0, stopwatch_1.create)();
44
- this.options = options;
45
- this.newId = newId;
46
- this.supportCodeLibrary = supportCodeLibrary;
47
- this.requireModules = requireModules;
48
- this.requirePaths = requirePaths;
49
- this.importPaths = importPaths;
50
- this.pickleIds = Array.from(pickleIds);
51
- this.numberOfWorkers = numberOfWorkers;
52
- this.success = true;
53
- this.workers = {};
54
- this.inProgressPickles = {};
55
- this.idleInterventions = 0;
56
- }
57
- parseWorkerMessage(worker, message) {
58
- if (message.ready) {
59
- worker.state = 0 /* WorkerState.idle */;
60
- this.awakenWorkers(worker);
61
- }
62
- else if ((0, value_checker_1.doesHaveValue)(message.jsonEnvelope)) {
63
- const envelope = messages.parseEnvelope(message.jsonEnvelope);
64
- this.eventBroadcaster.emit('envelope', envelope);
65
- if ((0, value_checker_1.doesHaveValue)(envelope.testCaseFinished)) {
66
- delete this.inProgressPickles[worker.id];
67
- this.parseTestCaseResult(envelope.testCaseFinished);
68
- }
69
- }
70
- else {
71
- throw new Error(`Unexpected message from worker: ${JSON.stringify(message)}`);
72
- }
73
- }
74
- awakenWorkers(triggeringWorker) {
75
- Object.values(this.workers).forEach((worker) => {
76
- if (worker.state === 0 /* WorkerState.idle */) {
77
- this.giveWork(worker);
78
- }
79
- return worker.state !== 0 /* WorkerState.idle */;
80
- });
81
- if (Object.keys(this.inProgressPickles).length == 0 &&
82
- this.pickleIds.length > 0) {
83
- this.giveWork(triggeringWorker, true);
84
- this.idleInterventions++;
85
- }
86
- }
87
- startWorker(id, total) {
88
- const workerProcess = (0, child_process_1.fork)(runWorkerPath, [], {
89
- cwd: this.cwd,
90
- env: {
91
- ...process.env,
92
- CUCUMBER_PARALLEL: 'true',
93
- CUCUMBER_TOTAL_WORKERS: total.toString(),
94
- CUCUMBER_WORKER_ID: id,
95
- },
96
- stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
97
- });
98
- const worker = { state: 3 /* WorkerState.new */, process: workerProcess, id };
99
- this.workers[id] = worker;
100
- worker.process.on('message', (message) => {
101
- this.parseWorkerMessage(worker, message);
102
- });
103
- worker.process.on('close', (exitCode) => {
104
- worker.state = 1 /* WorkerState.closed */;
105
- this.onWorkerProcessClose(exitCode);
106
- });
107
- const initializeCommand = {
108
- initialize: {
109
- filterStacktraces: this.options.filterStacktraces,
110
- requireModules: this.requireModules,
111
- requirePaths: this.requirePaths,
112
- importPaths: this.importPaths,
113
- supportCodeIds: {
114
- stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id),
115
- beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id),
116
- afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id),
117
- },
118
- options: this.options,
119
- },
120
- };
121
- worker.process.send(initializeCommand);
122
- }
123
- onWorkerProcessClose(exitCode) {
124
- const success = exitCode === 0;
125
- if (!success) {
126
- this.success = false;
127
- }
128
- if (Object.values(this.workers).every((x) => x.state === 1 /* WorkerState.closed */)) {
129
- const envelope = {
130
- testRunFinished: {
131
- timestamp: this.stopwatch.timestamp(),
132
- success,
133
- },
134
- };
135
- this.eventBroadcaster.emit('envelope', envelope);
136
- this.onFinish(this.success);
137
- }
138
- }
139
- parseTestCaseResult(testCaseFinished) {
140
- const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
141
- if (!testCaseFinished.willBeRetried &&
142
- (0, helpers_1.shouldCauseFailure)(worstTestStepResult.status, this.options)) {
143
- this.success = false;
144
- }
145
- }
146
- async start() {
147
- const envelope = {
148
- testRunStarted: {
149
- timestamp: this.stopwatch.timestamp(),
150
- },
151
- };
152
- this.eventBroadcaster.emit('envelope', envelope);
153
- this.stopwatch.start();
154
- this.assembledTestCases = await (0, assemble_test_cases_1.assembleTestCases)({
155
- eventBroadcaster: this.eventBroadcaster,
156
- newId: this.newId,
157
- pickles: this.pickleIds.map((pickleId) => this.eventDataCollector.getPickle(pickleId)),
158
- supportCodeLibrary: this.supportCodeLibrary,
159
- });
160
- return await new Promise((resolve) => {
161
- for (let i = 0; i < this.numberOfWorkers; i++) {
162
- this.startWorker(i.toString(), this.numberOfWorkers);
163
- }
164
- this.onFinish = (status) => {
165
- if (this.idleInterventions > 0) {
166
- this.logger.warn(`WARNING: All workers went idle ${this.idleInterventions} time(s). Consider revising handler passed to setParallelCanAssign.`);
167
- }
168
- resolve(status);
169
- };
170
- });
171
- }
172
- nextPicklePlacement() {
173
- for (let index = 0; index < this.pickleIds.length; index++) {
174
- const placement = this.placementAt(index);
175
- if (this.supportCodeLibrary.parallelCanAssign(placement.pickle, Object.values(this.inProgressPickles))) {
176
- return placement;
177
- }
178
- }
179
- return null;
180
- }
181
- placementAt(index) {
182
- return {
183
- index,
184
- pickle: this.eventDataCollector.getPickle(this.pickleIds[index]),
185
- };
186
- }
187
- giveWork(worker, force = false) {
188
- if (this.pickleIds.length < 1) {
189
- const finalizeCommand = { finalize: true };
190
- worker.state = 2 /* WorkerState.running */;
191
- worker.process.send(finalizeCommand);
192
- return;
193
- }
194
- const picklePlacement = force
195
- ? this.placementAt(0)
196
- : this.nextPicklePlacement();
197
- if (picklePlacement === null) {
198
- return;
199
- }
200
- const { index: nextPickleIndex, pickle } = picklePlacement;
201
- this.pickleIds.splice(nextPickleIndex, 1);
202
- this.inProgressPickles[worker.id] = pickle;
203
- const testCase = this.assembledTestCases[pickle.id];
204
- const gherkinDocument = this.eventDataCollector.getGherkinDocument(pickle.uri);
205
- const retries = (0, helpers_1.retriesForPickle)(pickle, this.options);
206
- const skip = this.options.dryRun || (this.options.failFast && !this.success);
207
- const runCommand = {
208
- run: {
209
- retries,
210
- skip,
211
- elapsed: this.stopwatch.duration(),
212
- pickle,
213
- testCase,
214
- gherkinDocument,
215
- },
216
- };
217
- worker.state = 2 /* WorkerState.running */;
218
- worker.process.send(runCommand);
219
- }
220
- }
221
- exports.default = Coordinator;
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const child_process_1 = require("child_process");
30
+ const path_1 = __importDefault(require("path"));
31
+ const helpers_1 = require("../helpers");
32
+ const messages = __importStar(require("@cucumber/messages"));
33
+ const value_checker_1 = require("../../value_checker");
34
+ const stopwatch_1 = require("../stopwatch");
35
+ const assemble_test_cases_1 = require("../assemble_test_cases");
36
+ const runWorkerPath = path_1.default.resolve(__dirname, 'run_worker.js');
37
+ class Coordinator {
38
+ constructor({ cwd, logger, eventBroadcaster, eventDataCollector, pickleIds, options, newId, supportCodeLibrary, requireModules, requirePaths, importPaths, numberOfWorkers, }) {
39
+ this.cwd = cwd;
40
+ this.logger = logger;
41
+ this.eventBroadcaster = eventBroadcaster;
42
+ this.eventDataCollector = eventDataCollector;
43
+ this.stopwatch = (0, stopwatch_1.create)();
44
+ this.options = options;
45
+ this.newId = newId;
46
+ this.supportCodeLibrary = supportCodeLibrary;
47
+ this.requireModules = requireModules;
48
+ this.requirePaths = requirePaths;
49
+ this.importPaths = importPaths;
50
+ this.pickleIds = Array.from(pickleIds);
51
+ this.numberOfWorkers = numberOfWorkers;
52
+ this.success = true;
53
+ this.workers = {};
54
+ this.inProgressPickles = {};
55
+ this.idleInterventions = 0;
56
+ }
57
+ parseWorkerMessage(worker, message) {
58
+ if (message.ready) {
59
+ worker.state = 0 /* WorkerState.idle */;
60
+ this.awakenWorkers(worker);
61
+ }
62
+ else if ((0, value_checker_1.doesHaveValue)(message.jsonEnvelope)) {
63
+ const envelope = messages.parseEnvelope(message.jsonEnvelope);
64
+ this.eventBroadcaster.emit('envelope', envelope);
65
+ if ((0, value_checker_1.doesHaveValue)(envelope.testCaseFinished)) {
66
+ delete this.inProgressPickles[worker.id];
67
+ this.parseTestCaseResult(envelope.testCaseFinished);
68
+ }
69
+ }
70
+ else {
71
+ throw new Error(`Unexpected message from worker: ${JSON.stringify(message)}`);
72
+ }
73
+ }
74
+ awakenWorkers(triggeringWorker) {
75
+ Object.values(this.workers).forEach((worker) => {
76
+ if (worker.state === 0 /* WorkerState.idle */) {
77
+ this.giveWork(worker);
78
+ }
79
+ return worker.state !== 0 /* WorkerState.idle */;
80
+ });
81
+ if (Object.keys(this.inProgressPickles).length == 0 &&
82
+ this.pickleIds.length > 0) {
83
+ this.giveWork(triggeringWorker, true);
84
+ this.idleInterventions++;
85
+ }
86
+ }
87
+ startWorker(id, total) {
88
+ const workerProcess = (0, child_process_1.fork)(runWorkerPath, [], {
89
+ cwd: this.cwd,
90
+ env: {
91
+ ...process.env,
92
+ CUCUMBER_PARALLEL: 'true',
93
+ CUCUMBER_TOTAL_WORKERS: total.toString(),
94
+ CUCUMBER_WORKER_ID: id,
95
+ },
96
+ stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
97
+ });
98
+ const worker = { state: 3 /* WorkerState.new */, process: workerProcess, id };
99
+ this.workers[id] = worker;
100
+ worker.process.on('message', (message) => {
101
+ this.parseWorkerMessage(worker, message);
102
+ });
103
+ worker.process.on('close', (exitCode) => {
104
+ worker.state = 1 /* WorkerState.closed */;
105
+ this.onWorkerProcessClose(exitCode);
106
+ });
107
+ const initializeCommand = {
108
+ initialize: {
109
+ filterStacktraces: this.options.filterStacktraces,
110
+ requireModules: this.requireModules,
111
+ requirePaths: this.requirePaths,
112
+ importPaths: this.importPaths,
113
+ supportCodeIds: {
114
+ stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id),
115
+ beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id),
116
+ afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id),
117
+ },
118
+ options: this.options,
119
+ },
120
+ };
121
+ worker.process.send(initializeCommand);
122
+ }
123
+ onWorkerProcessClose(exitCode) {
124
+ const success = exitCode === 0;
125
+ if (!success) {
126
+ this.success = false;
127
+ }
128
+ if (Object.values(this.workers).every((x) => x.state === 1 /* WorkerState.closed */)) {
129
+ const envelope = {
130
+ testRunFinished: {
131
+ timestamp: this.stopwatch.timestamp(),
132
+ success,
133
+ },
134
+ };
135
+ this.eventBroadcaster.emit('envelope', envelope);
136
+ this.onFinish(this.success);
137
+ }
138
+ }
139
+ parseTestCaseResult(testCaseFinished) {
140
+ const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
141
+ if (!testCaseFinished.willBeRetried &&
142
+ (0, helpers_1.shouldCauseFailure)(worstTestStepResult.status, this.options)) {
143
+ this.success = false;
144
+ }
145
+ }
146
+ async start() {
147
+ const envelope = {
148
+ testRunStarted: {
149
+ timestamp: this.stopwatch.timestamp(),
150
+ },
151
+ };
152
+ this.eventBroadcaster.emit('envelope', envelope);
153
+ this.stopwatch.start();
154
+ this.assembledTestCases = await (0, assemble_test_cases_1.assembleTestCases)({
155
+ eventBroadcaster: this.eventBroadcaster,
156
+ newId: this.newId,
157
+ pickles: this.pickleIds.map((pickleId) => this.eventDataCollector.getPickle(pickleId)),
158
+ supportCodeLibrary: this.supportCodeLibrary,
159
+ });
160
+ return await new Promise((resolve) => {
161
+ for (let i = 0; i < this.numberOfWorkers; i++) {
162
+ this.startWorker(i.toString(), this.numberOfWorkers);
163
+ }
164
+ this.onFinish = (status) => {
165
+ if (this.idleInterventions > 0) {
166
+ this.logger.warn(`WARNING: All workers went idle ${this.idleInterventions} time(s). Consider revising handler passed to setParallelCanAssign.`);
167
+ }
168
+ resolve(status);
169
+ };
170
+ });
171
+ }
172
+ nextPicklePlacement() {
173
+ for (let index = 0; index < this.pickleIds.length; index++) {
174
+ const placement = this.placementAt(index);
175
+ if (this.supportCodeLibrary.parallelCanAssign(placement.pickle, Object.values(this.inProgressPickles))) {
176
+ return placement;
177
+ }
178
+ }
179
+ return null;
180
+ }
181
+ placementAt(index) {
182
+ return {
183
+ index,
184
+ pickle: this.eventDataCollector.getPickle(this.pickleIds[index]),
185
+ };
186
+ }
187
+ giveWork(worker, force = false) {
188
+ if (this.pickleIds.length < 1) {
189
+ const finalizeCommand = { finalize: true };
190
+ worker.state = 2 /* WorkerState.running */;
191
+ worker.process.send(finalizeCommand);
192
+ return;
193
+ }
194
+ const picklePlacement = force
195
+ ? this.placementAt(0)
196
+ : this.nextPicklePlacement();
197
+ if (picklePlacement === null) {
198
+ return;
199
+ }
200
+ const { index: nextPickleIndex, pickle } = picklePlacement;
201
+ this.pickleIds.splice(nextPickleIndex, 1);
202
+ this.inProgressPickles[worker.id] = pickle;
203
+ const testCase = this.assembledTestCases[pickle.id];
204
+ const gherkinDocument = this.eventDataCollector.getGherkinDocument(pickle.uri);
205
+ const retries = (0, helpers_1.retriesForPickle)(pickle, this.options);
206
+ const skip = this.options.dryRun || (this.options.failFast && !this.success);
207
+ const runCommand = {
208
+ run: {
209
+ retries,
210
+ skip,
211
+ elapsed: this.stopwatch.duration(),
212
+ pickle,
213
+ testCase,
214
+ gherkinDocument,
215
+ },
216
+ };
217
+ worker.state = 2 /* WorkerState.running */;
218
+ worker.process.send(runCommand);
219
+ }
220
+ }
221
+ exports.default = Coordinator;
222
222
  //# sourceMappingURL=coordinator.js.map
@@ -1 +1 @@
1
- export {};
1
+ export {};
@@ -1,29 +1,29 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const worker_1 = __importDefault(require("./worker"));
7
- const verror_1 = __importDefault(require("verror"));
8
- const value_checker_1 = require("../../value_checker");
9
- function run() {
10
- const exit = (exitCode, error, message) => {
11
- if ((0, value_checker_1.doesHaveValue)(error)) {
12
- console.error(verror_1.default.fullStack(new verror_1.default(error, message))); // eslint-disable-line no-console
13
- }
14
- process.exit(exitCode);
15
- };
16
- const worker = new worker_1.default({
17
- id: process.env.CUCUMBER_WORKER_ID,
18
- sendMessage: (message) => process.send(message),
19
- cwd: process.cwd(),
20
- exit,
21
- });
22
- process.on('message', (m) => {
23
- worker
24
- .receiveMessage(m)
25
- .catch((error) => exit(1, error, 'Unexpected error on worker.receiveMessage'));
26
- });
27
- }
28
- run();
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const worker_1 = __importDefault(require("./worker"));
7
+ const verror_1 = __importDefault(require("verror"));
8
+ const value_checker_1 = require("../../value_checker");
9
+ function run() {
10
+ const exit = (exitCode, error, message) => {
11
+ if ((0, value_checker_1.doesHaveValue)(error)) {
12
+ console.error(verror_1.default.fullStack(new verror_1.default(error, message))); // eslint-disable-line no-console
13
+ }
14
+ process.exit(exitCode);
15
+ };
16
+ const worker = new worker_1.default({
17
+ id: process.env.CUCUMBER_WORKER_ID,
18
+ sendMessage: (message) => process.send(message),
19
+ cwd: process.cwd(),
20
+ exit,
21
+ });
22
+ process.on('message', (m) => {
23
+ worker
24
+ .receiveMessage(m)
25
+ .catch((error) => exit(1, error, 'Unexpected error on worker.receiveMessage'));
26
+ });
27
+ }
28
+ run();
29
29
  //# sourceMappingURL=run_worker.js.map
@@ -1,26 +1,26 @@
1
- import { ICoordinatorReport, IWorkerCommand, IWorkerCommandInitialize, IWorkerCommandRun } from './command_types';
2
- type IExitFunction = (exitCode: number, error?: Error, message?: string) => void;
3
- type IMessageSender = (command: ICoordinatorReport) => void;
4
- export default class Worker {
5
- private readonly cwd;
6
- private readonly exit;
7
- private readonly id;
8
- private readonly eventBroadcaster;
9
- private filterStacktraces;
10
- private readonly newId;
11
- private readonly sendMessage;
12
- private supportCodeLibrary;
13
- private worldParameters;
14
- private runTestRunHooks;
15
- constructor({ cwd, exit, id, sendMessage, }: {
16
- cwd: string;
17
- exit: IExitFunction;
18
- id: string;
19
- sendMessage: IMessageSender;
20
- });
21
- initialize({ filterStacktraces, requireModules, requirePaths, importPaths, supportCodeIds, options, }: IWorkerCommandInitialize): Promise<void>;
22
- finalize(): Promise<void>;
23
- receiveMessage(message: IWorkerCommand): Promise<void>;
24
- runTestCase({ gherkinDocument, pickle, testCase, elapsed, retries, skip, }: IWorkerCommandRun): Promise<void>;
25
- }
26
- export {};
1
+ import { ICoordinatorReport, IWorkerCommand, IWorkerCommandInitialize, IWorkerCommandRun } from './command_types';
2
+ type IExitFunction = (exitCode: number, error?: Error, message?: string) => void;
3
+ type IMessageSender = (command: ICoordinatorReport) => void;
4
+ export default class Worker {
5
+ private readonly cwd;
6
+ private readonly exit;
7
+ private readonly id;
8
+ private readonly eventBroadcaster;
9
+ private filterStacktraces;
10
+ private readonly newId;
11
+ private readonly sendMessage;
12
+ private supportCodeLibrary;
13
+ private worldParameters;
14
+ private runTestRunHooks;
15
+ constructor({ cwd, exit, id, sendMessage, }: {
16
+ cwd: string;
17
+ exit: IExitFunction;
18
+ id: string;
19
+ sendMessage: IMessageSender;
20
+ });
21
+ initialize({ filterStacktraces, requireModules, requirePaths, importPaths, supportCodeIds, options, }: IWorkerCommandInitialize): Promise<void>;
22
+ finalize(): Promise<void>;
23
+ receiveMessage(message: IWorkerCommand): Promise<void>;
24
+ runTestCase({ gherkinDocument, pickle, testCase, elapsed, retries, skip, }: IWorkerCommandRun): Promise<void>;
25
+ }
26
+ export {};