@cucumber/cucumber 8.0.0-rc.2 → 8.0.0-rc.3

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 (174) hide show
  1. package/README.md +81 -51
  2. package/api/index.d.ts +6 -0
  3. package/lib/api/convert_configuration.d.ts +4 -0
  4. package/lib/api/convert_configuration.js +64 -0
  5. package/lib/api/convert_configuration.js.map +1 -0
  6. package/lib/api/environment.d.ts +2 -0
  7. package/lib/api/environment.js +13 -0
  8. package/lib/api/environment.js.map +1 -0
  9. package/lib/{run → api}/formatters.d.ts +5 -3
  10. package/lib/{run → api}/formatters.js +13 -17
  11. package/lib/api/formatters.js.map +1 -0
  12. package/lib/api/gherkin.d.ts +21 -0
  13. package/lib/api/gherkin.js +65 -0
  14. package/lib/api/gherkin.js.map +1 -0
  15. package/lib/api/index.d.ts +11 -0
  16. package/lib/{run → api}/index.js +10 -1
  17. package/lib/api/index.js.map +1 -0
  18. package/lib/api/load_configuration.d.ts +9 -0
  19. package/lib/api/load_configuration.js +32 -0
  20. package/lib/api/load_configuration.js.map +1 -0
  21. package/lib/api/load_sources.d.ts +9 -0
  22. package/lib/api/load_sources.js +53 -0
  23. package/lib/api/load_sources.js.map +1 -0
  24. package/lib/api/load_support.d.ts +10 -0
  25. package/lib/api/load_support.js +28 -0
  26. package/lib/api/load_support.js.map +1 -0
  27. package/lib/api/paths.d.ts +7 -0
  28. package/lib/{run → api}/paths.js +25 -9
  29. package/lib/api/paths.js.map +1 -0
  30. package/lib/api/run_cucumber.d.ts +11 -0
  31. package/lib/api/run_cucumber.js +108 -0
  32. package/lib/api/run_cucumber.js.map +1 -0
  33. package/lib/{run → api}/runtime.d.ts +8 -7
  34. package/lib/api/runtime.js +36 -0
  35. package/lib/api/runtime.js.map +1 -0
  36. package/lib/{run → api}/support.d.ts +4 -3
  37. package/lib/{run → api}/support.js +5 -10
  38. package/lib/api/support.js.map +1 -0
  39. package/lib/api/types.d.ts +168 -0
  40. package/lib/{run → api}/types.js +0 -0
  41. package/lib/api/types.js.map +1 -0
  42. package/lib/api/wrapper.mjs +6 -0
  43. package/lib/cli/helpers.d.ts +16 -11
  44. package/lib/cli/helpers.js +19 -29
  45. package/lib/cli/helpers.js.map +1 -1
  46. package/lib/cli/index.d.ts +3 -1
  47. package/lib/cli/index.js +35 -19
  48. package/lib/cli/index.js.map +1 -1
  49. package/lib/cli/publish_banner.js +6 -6
  50. package/lib/cli/publish_banner.js.map +1 -1
  51. package/lib/cli/run.js +12 -3
  52. package/lib/cli/run.js.map +1 -1
  53. package/lib/cli/validate_node_engine_version.d.ts +7 -0
  54. package/lib/cli/validate_node_engine_version.js +20 -0
  55. package/lib/cli/validate_node_engine_version.js.map +1 -0
  56. package/lib/configuration/argv_parser.d.ts +20 -0
  57. package/lib/{cli → configuration}/argv_parser.js +44 -45
  58. package/lib/configuration/argv_parser.js.map +1 -0
  59. package/lib/configuration/check_schema.d.ts +2 -0
  60. package/lib/configuration/check_schema.js +56 -0
  61. package/lib/configuration/check_schema.js.map +1 -0
  62. package/lib/configuration/default_configuration.d.ts +2 -0
  63. package/lib/configuration/default_configuration.js +27 -0
  64. package/lib/configuration/default_configuration.js.map +1 -0
  65. package/lib/configuration/from_file.d.ts +2 -0
  66. package/lib/configuration/from_file.js +68 -0
  67. package/lib/configuration/from_file.js.map +1 -0
  68. package/lib/configuration/helpers.d.ts +1 -0
  69. package/lib/configuration/helpers.js +11 -0
  70. package/lib/configuration/helpers.js.map +1 -0
  71. package/lib/configuration/index.d.ts +6 -0
  72. package/lib/configuration/index.js +11 -0
  73. package/lib/configuration/index.js.map +1 -1
  74. package/lib/configuration/locate_file.d.ts +1 -0
  75. package/lib/configuration/locate_file.js +19 -0
  76. package/lib/configuration/locate_file.js.map +1 -0
  77. package/lib/configuration/merge_configurations.d.ts +2 -0
  78. package/lib/configuration/merge_configurations.js +48 -0
  79. package/lib/configuration/merge_configurations.js.map +1 -0
  80. package/lib/configuration/option_splitter.d.ts +3 -0
  81. package/lib/{cli → configuration}/option_splitter.js +2 -2
  82. package/lib/configuration/option_splitter.js.map +1 -0
  83. package/lib/configuration/types.d.ts +24 -28
  84. package/lib/configuration/types.js.map +1 -1
  85. package/lib/configuration/validate_configuration.d.ts +2 -0
  86. package/lib/configuration/validate_configuration.js +10 -0
  87. package/lib/configuration/validate_configuration.js.map +1 -0
  88. package/lib/formatter/builder.d.ts +2 -3
  89. package/lib/formatter/builder.js +8 -1
  90. package/lib/formatter/builder.js.map +1 -1
  91. package/lib/formatter/get_color_fns.js +15 -16
  92. package/lib/formatter/get_color_fns.js.map +1 -1
  93. package/lib/formatter/helpers/issue_helpers.d.ts +2 -2
  94. package/lib/formatter/helpers/issue_helpers.js +2 -2
  95. package/lib/formatter/helpers/issue_helpers.js.map +1 -1
  96. package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +2 -2
  97. package/lib/formatter/helpers/test_case_attempt_formatter.js +9 -8
  98. package/lib/formatter/helpers/test_case_attempt_formatter.js.map +1 -1
  99. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +1 -2
  100. package/lib/formatter/helpers/test_case_attempt_parser.js +1 -1
  101. package/lib/formatter/helpers/test_case_attempt_parser.js.map +1 -1
  102. package/lib/formatter/helpers/usage_helpers/index.d.ts +1 -2
  103. package/lib/formatter/helpers/usage_helpers/index.js +3 -3
  104. package/lib/formatter/helpers/usage_helpers/index.js.map +1 -1
  105. package/lib/formatter/index.d.ts +14 -2
  106. package/lib/formatter/index.js +2 -0
  107. package/lib/formatter/index.js.map +1 -1
  108. package/lib/formatter/json_formatter.js.map +1 -1
  109. package/lib/formatter/progress_bar_formatter.js +1 -1
  110. package/lib/formatter/progress_bar_formatter.js.map +1 -1
  111. package/lib/formatter/snippets_formatter.js +0 -1
  112. package/lib/formatter/snippets_formatter.js.map +1 -1
  113. package/lib/formatter/summary_formatter.js +1 -1
  114. package/lib/formatter/summary_formatter.js.map +1 -1
  115. package/lib/formatter/usage_formatter.js +0 -1
  116. package/lib/formatter/usage_formatter.js.map +1 -1
  117. package/lib/formatter/usage_json_formatter.js +0 -1
  118. package/lib/formatter/usage_json_formatter.js.map +1 -1
  119. package/lib/index.d.ts +2 -0
  120. package/lib/index.js +4 -1
  121. package/lib/index.js.map +1 -1
  122. package/lib/models/pickle_order.d.ts +1 -0
  123. package/lib/models/pickle_order.js +3 -0
  124. package/lib/models/pickle_order.js.map +1 -0
  125. package/lib/runtime/index.d.ts +3 -5
  126. package/lib/runtime/index.js +7 -36
  127. package/lib/runtime/index.js.map +1 -1
  128. package/lib/runtime/parallel/command_types.d.ts +3 -2
  129. package/lib/runtime/parallel/command_types.js.map +1 -1
  130. package/lib/runtime/parallel/coordinator.d.ts +27 -8
  131. package/lib/runtime/parallel/coordinator.js +66 -19
  132. package/lib/runtime/parallel/coordinator.js.map +1 -1
  133. package/lib/runtime/parallel/worker.d.ts +2 -4
  134. package/lib/runtime/parallel/worker.js +11 -34
  135. package/lib/runtime/parallel/worker.js.map +1 -1
  136. package/lib/runtime/run_test_run_hooks.d.ts +3 -0
  137. package/lib/runtime/run_test_run_hooks.js +28 -0
  138. package/lib/runtime/run_test_run_hooks.js.map +1 -0
  139. package/lib/support_code_library_builder/index.d.ts +4 -2
  140. package/lib/support_code_library_builder/index.js +25 -2
  141. package/lib/support_code_library_builder/index.js.map +1 -1
  142. package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +2 -0
  143. package/lib/support_code_library_builder/parallel_can_assign_helpers.js +16 -0
  144. package/lib/support_code_library_builder/parallel_can_assign_helpers.js.map +1 -0
  145. package/lib/support_code_library_builder/types.d.ts +9 -0
  146. package/lib/support_code_library_builder/types.js.map +1 -1
  147. package/lib/version.d.ts +1 -1
  148. package/lib/version.js +1 -1
  149. package/lib/version.js.map +1 -1
  150. package/lib/wrapper.mjs +4 -0
  151. package/package.json +47 -28
  152. package/lib/cli/argv_parser.d.ts +0 -51
  153. package/lib/cli/argv_parser.js.map +0 -1
  154. package/lib/cli/configuration_builder.d.ts +0 -5
  155. package/lib/cli/configuration_builder.js +0 -71
  156. package/lib/cli/configuration_builder.js.map +0 -1
  157. package/lib/cli/option_splitter.d.ts +0 -4
  158. package/lib/cli/option_splitter.js.map +0 -1
  159. package/lib/cli/profile_loader.d.ts +0 -7
  160. package/lib/cli/profile_loader.js +0 -49
  161. package/lib/cli/profile_loader.js.map +0 -1
  162. package/lib/run/formatters.js.map +0 -1
  163. package/lib/run/index.d.ts +0 -2
  164. package/lib/run/index.js.map +0 -1
  165. package/lib/run/paths.d.ts +0 -6
  166. package/lib/run/paths.js.map +0 -1
  167. package/lib/run/runCucumber.d.ts +0 -3
  168. package/lib/run/runCucumber.js +0 -88
  169. package/lib/run/runCucumber.js.map +0 -1
  170. package/lib/run/runtime.js +0 -58
  171. package/lib/run/runtime.js.map +0 -1
  172. package/lib/run/support.js.map +0 -1
  173. package/lib/run/types.d.ts +0 -12
  174. package/lib/run/types.js.map +0 -1
@@ -5,23 +5,28 @@ import { EventDataCollector } from '../formatter/helpers';
5
5
  import { Readable } from 'stream';
6
6
  import { IdGenerator } from '@cucumber/messages';
7
7
  import { ISupportCodeLibrary } from '../support_code_library_builder/types';
8
- export interface IGetExpandedArgvRequest {
9
- argv: string[];
10
- cwd: string;
11
- }
12
- export declare function getExpandedArgv({ argv, cwd, }: IGetExpandedArgvRequest): Promise<string[]>;
8
+ import { PickleOrder } from '../models/pickle_order';
13
9
  interface IParseGherkinMessageStreamRequest {
14
- cwd: string;
10
+ cwd?: string;
15
11
  eventBroadcaster: EventEmitter;
16
12
  eventDataCollector: EventDataCollector;
17
13
  gherkinMessageStream: Readable;
18
- order: PickleOrder;
14
+ order: string;
19
15
  pickleFilter: PickleFilter;
20
16
  }
21
- export declare type PickleOrder = 'defined' | 'random';
22
- export declare function parseGherkinMessageStream({ cwd, eventBroadcaster, eventDataCollector, gherkinMessageStream, order, pickleFilter, }: IParseGherkinMessageStreamRequest): Promise<string[]>;
23
- export declare function orderPickleIds(pickleIds: string[], order: PickleOrder): void;
24
- export declare function isJavaScript(filePath: string): boolean;
17
+ /**
18
+ * Process a stream of envelopes from Gherkin and resolve to an array of filtered, ordered pickle Ids
19
+ *
20
+ * @deprecated use `loadSources` instead
21
+ *
22
+ * @param eventBroadcaster
23
+ * @param eventDataCollector
24
+ * @param gherkinMessageStream
25
+ * @param order
26
+ * @param pickleFilter
27
+ */
28
+ export declare function parseGherkinMessageStream({ eventBroadcaster, eventDataCollector, gherkinMessageStream, order, pickleFilter, }: IParseGherkinMessageStreamRequest): Promise<string[]>;
29
+ export declare function orderPickles<T = string>(pickleIds: T[], order: PickleOrder, logger: Console): void;
25
30
  export declare function emitMetaMessage(eventBroadcaster: EventEmitter, env: NodeJS.ProcessEnv): Promise<void>;
26
31
  export declare function emitSupportCodeMessages({ eventBroadcaster, supportCodeLibrary, newId, }: {
27
32
  eventBroadcaster: EventEmitter;
@@ -22,28 +22,27 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
22
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
23
  };
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.emitSupportCodeMessages = exports.emitMetaMessage = exports.isJavaScript = exports.orderPickleIds = exports.parseGherkinMessageStream = exports.getExpandedArgv = void 0;
26
- const argv_parser_1 = __importDefault(require("./argv_parser"));
27
- const profile_loader_1 = __importDefault(require("./profile_loader"));
25
+ exports.emitSupportCodeMessages = exports.emitMetaMessage = exports.orderPickles = exports.parseGherkinMessageStream = void 0;
28
26
  const knuth_shuffle_seeded_1 = __importDefault(require("knuth-shuffle-seeded"));
29
27
  const value_checker_1 = require("../value_checker");
30
- const option_splitter_1 = __importDefault(require("./option_splitter"));
28
+ const configuration_1 = require("../configuration");
31
29
  const os_1 = __importDefault(require("os"));
32
30
  const messages = __importStar(require("@cucumber/messages"));
33
31
  const ci_environment_1 = __importDefault(require("@cucumber/ci-environment"));
34
32
  const support_code_library_builder_1 = require("../support_code_library_builder");
35
33
  const version_1 = require("../version");
36
- async function getExpandedArgv({ argv, cwd, }) {
37
- const { options } = argv_parser_1.default.parse(argv);
38
- let fullArgv = argv;
39
- const profileArgv = await new profile_loader_1.default(cwd).getArgv(options.profile, options.config);
40
- if (profileArgv.length > 0) {
41
- fullArgv = argv.slice(0, 2).concat(profileArgv).concat(argv.slice(2));
42
- }
43
- return fullArgv;
44
- }
45
- exports.getExpandedArgv = getExpandedArgv;
46
- async function parseGherkinMessageStream({ cwd, eventBroadcaster, eventDataCollector, gherkinMessageStream, order, pickleFilter, }) {
34
+ /**
35
+ * Process a stream of envelopes from Gherkin and resolve to an array of filtered, ordered pickle Ids
36
+ *
37
+ * @deprecated use `loadSources` instead
38
+ *
39
+ * @param eventBroadcaster
40
+ * @param eventDataCollector
41
+ * @param gherkinMessageStream
42
+ * @param order
43
+ * @param pickleFilter
44
+ */
45
+ async function parseGherkinMessageStream({ eventBroadcaster, eventDataCollector, gherkinMessageStream, order, pickleFilter, }) {
47
46
  return await new Promise((resolve, reject) => {
48
47
  const result = [];
49
48
  gherkinMessageStream.on('data', (envelope) => {
@@ -56,12 +55,9 @@ async function parseGherkinMessageStream({ cwd, eventBroadcaster, eventDataColle
56
55
  result.push(pickleId);
57
56
  }
58
57
  }
59
- if ((0, value_checker_1.doesHaveValue)(envelope.parseError)) {
60
- reject(new Error(`Parse error in '${envelope.parseError.source.uri}': ${envelope.parseError.message}`));
61
- }
62
58
  });
63
59
  gherkinMessageStream.on('end', () => {
64
- orderPickleIds(result, order);
60
+ orderPickles(result, order, console);
65
61
  resolve(result);
66
62
  });
67
63
  gherkinMessageStream.on('error', reject);
@@ -69,15 +65,15 @@ async function parseGherkinMessageStream({ cwd, eventBroadcaster, eventDataColle
69
65
  }
70
66
  exports.parseGherkinMessageStream = parseGherkinMessageStream;
71
67
  // Orders the pickleIds in place - morphs input
72
- function orderPickleIds(pickleIds, order) {
73
- const [type, seed] = option_splitter_1.default.split(order);
68
+ function orderPickles(pickleIds, order, logger) {
69
+ const [type, seed] = configuration_1.OptionSplitter.split(order);
74
70
  switch (type) {
75
71
  case 'defined':
76
72
  break;
77
73
  case 'random':
78
74
  if (seed === '') {
79
75
  const newSeed = Math.floor(Math.random() * 1000 * 1000).toString();
80
- console.warn(`Random order using seed: ${newSeed}`);
76
+ logger.warn(`Random order using seed: ${newSeed}`);
81
77
  (0, knuth_shuffle_seeded_1.default)(pickleIds, newSeed);
82
78
  }
83
79
  else {
@@ -88,13 +84,7 @@ function orderPickleIds(pickleIds, order) {
88
84
  throw new Error('Unrecgonized order type. Should be `defined` or `random`');
89
85
  }
90
86
  }
91
- exports.orderPickleIds = orderPickleIds;
92
- function isJavaScript(filePath) {
93
- return (filePath.endsWith('.js') ||
94
- filePath.endsWith('.mjs') ||
95
- filePath.endsWith('.cjs'));
96
- }
97
- exports.isJavaScript = isJavaScript;
87
+ exports.orderPickles = orderPickles;
98
88
  async function emitMetaMessage(eventBroadcaster, env) {
99
89
  const meta = {
100
90
  protocolVersion: messages.version,
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/cli/helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gEAAsC;AACtC,sEAA4C;AAC5C,gFAA0C;AAI1C,oDAAgD;AAChD,wEAA8C;AAE9C,4CAAmB;AACnB,6DAA8C;AAE9C,8EAA0D;AAI1D,kFAAuE;AACvE,wCAAoC;AAO7B,KAAK,UAAU,eAAe,CAAC,EACpC,IAAI,EACJ,GAAG,GACqB;IACxB,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC1C,IAAI,QAAQ,GAAG,IAAI,CAAA;IACnB,MAAM,WAAW,GAAG,MAAM,IAAI,wBAAa,CAAC,GAAG,CAAC,CAAC,OAAO,CACtD,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,MAAM,CACf,CAAA;IACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAC1B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;KACtE;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAdD,0CAcC;AAaM,KAAK,UAAU,yBAAyB,CAAC,EAC9C,GAAG,EACH,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,EACL,YAAY,GACsB;IAClC,OAAO,MAAM,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrD,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAA2B,EAAE,EAAE;YAC9D,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;YAC3C,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;gBAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAA;gBAC1B,MAAM,eAAe,GAAG,kBAAkB,CAAC,kBAAkB,CAC3D,MAAM,CAAC,GAAG,CACX,CAAA;gBACD,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,EAAE;oBACrD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;iBACtB;aACF;YACD,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;gBACtC,MAAM,CACJ,IAAI,KAAK,CACP,mBAAmB,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,CACrF,CACF,CAAA;aACF;QACH,CAAC,CAAC,CAAA;QACF,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAClC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YAC7B,OAAO,CAAC,MAAM,CAAC,CAAA;QACjB,CAAC,CAAC,CAAA;QACF,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC;AApCD,8DAoCC;AAED,+CAA+C;AAC/C,SAAgB,cAAc,CAAC,SAAmB,EAAE,KAAkB;IACpE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,yBAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAChD,QAAQ,IAAI,EAAE;QACZ,KAAK,SAAS;YACZ,MAAK;QACP,KAAK,QAAQ;YACX,IAAI,IAAI,KAAK,EAAE,EAAE;gBACf,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;gBAClE,OAAO,CAAC,IAAI,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAA;gBACnD,IAAA,8BAAO,EAAC,SAAS,EAAE,OAAO,CAAC,CAAA;aAC5B;iBAAM;gBACL,IAAA,8BAAO,EAAC,SAAS,EAAE,IAAI,CAAC,CAAA;aACzB;YACD,MAAK;QACP;YACE,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAA;KACJ;AACH,CAAC;AAnBD,wCAmBC;AAED,SAAgB,YAAY,CAAC,QAAgB;IAC3C,OAAO,CACL,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC1B,CAAA;AACH,CAAC;AAND,oCAMC;AAEM,KAAK,UAAU,eAAe,CACnC,gBAA8B,EAC9B,GAAsB;IAEtB,MAAM,IAAI,GAAkB;QAC1B,eAAe,EAAE,QAAQ,CAAC,OAAO;QACjC,cAAc,EAAE;YACd,OAAO,EAAP,iBAAO;YACP,IAAI,EAAE,aAAa;SACpB;QACD,GAAG,EAAE;YACH,IAAI,EAAE,YAAE,CAAC,IAAI,EAAE;SAChB;QACD,EAAE,EAAE;YACF,IAAI,EAAE,YAAE,CAAC,QAAQ,EAAE;YACnB,OAAO,EAAE,YAAE,CAAC,OAAO,EAAE;SACtB;QACD,OAAO,EAAE;YACP,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;SAC/B;QACD,EAAE,EAAE,IAAA,wBAAmB,EAAC,GAAG,CAAC;KAC7B,CAAA;IACD,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE;QAChC,IAAI;KACL,CAAC,CAAA;AACJ,CAAC;AA1BD,0CA0BC;AAED,SAAS,kBAAkB,CACzB,kBAAuC,EACvC,gBAA8B,EAC9B,KAAwB;IAExB,KAAK,MAAM,aAAa,IAAI,kBAAkB,CAAC,qBAAqB;SACjE,cAAc,EAAE;QACjB,IAAI,oDAAqB,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;YACtD,SAAQ;SACT;QACD,MAAM,QAAQ,GAAsB;YAClC,aAAa,EAAE;gBACb,EAAE,EAAE,KAAK,EAAE;gBACX,IAAI,EAAE,aAAa,CAAC,IAAI;gBACxB,+BAA+B,EAAE,aAAa,CAAC,oBAAoB;gBACnE,kBAAkB,EAAE,aAAa,CAAC,aAAa;gBAC/C,cAAc,EAAE,aAAa,CAAC,cAAc;aAC7C;SACF,CAAA;QACD,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;KAC5C;AACH,CAAC;AAED,SAAS,2BAA2B,CAClC,kBAAuC,EACvC,gBAA8B;IAE9B,KAAK,MAAM,sBAAsB,IAAI,kBAAkB,CAAC,uBAAuB,EAAE;QAC/E,MAAM,QAAQ,GAAsB;YAClC,sBAAsB;SACvB,CAAA;QACD,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;KAC5C;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,kBAAuC,EACvC,gBAA8B;IAE9B,kBAAkB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QAC5D,MAAM,QAAQ,GAAsB;YAClC,cAAc,EAAE;gBACd,EAAE,EAAE,cAAc,CAAC,EAAE;gBACrB,OAAO,EAAE;oBACP,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE;oBACzC,IAAI,EACF,OAAO,cAAc,CAAC,OAAO,KAAK,QAAQ;wBACxC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,mBAAmB;wBACxD,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,kBAAkB;iBAC5D;gBACD,eAAe,EAAE;oBACf,GAAG,EAAE,cAAc,CAAC,GAAG;oBACvB,QAAQ,EAAE;wBACR,IAAI,EAAE,cAAc,CAAC,IAAI;qBAC1B;iBACF;aACF;SACF,CAAA;QACD,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,kBAAuC,EACvC,gBAA8B;IAE9B,CAAC;IAAA,EAAE;SACA,MAAM,CACL,kBAAkB,CAAC,6BAA6B,EAChD,kBAAkB,CAAC,4BAA4B,CAChD;SACA,OAAO,CAAC,CAAC,sBAA8C,EAAE,EAAE;QAC1D,MAAM,QAAQ,GAAsB;YAClC,IAAI,EAAE;gBACJ,EAAE,EAAE,sBAAsB,CAAC,EAAE;gBAC7B,aAAa,EAAE,sBAAsB,CAAC,aAAa;gBACnD,eAAe,EAAE;oBACf,GAAG,EAAE,sBAAsB,CAAC,GAAG;oBAC/B,QAAQ,EAAE;wBACR,IAAI,EAAE,sBAAsB,CAAC,IAAI;qBAClC;iBACF;aACF;SACF,CAAA;QACD,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,gBAAgB,CACvB,kBAAuC,EACvC,gBAA8B;IAE9B,CAAC;IAAA,EAAE;SACA,MAAM,CACL,kBAAkB,CAAC,4BAA4B,EAC/C,kBAAkB,CAAC,2BAA2B,CAC/C;SACA,OAAO,CAAC,CAAC,qBAA4C,EAAE,EAAE;QACxD,MAAM,QAAQ,GAAsB;YAClC,IAAI,EAAE;gBACJ,EAAE,EAAE,qBAAqB,CAAC,EAAE;gBAC5B,eAAe,EAAE;oBACf,GAAG,EAAE,qBAAqB,CAAC,GAAG;oBAC9B,QAAQ,EAAE;wBACR,IAAI,EAAE,qBAAqB,CAAC,IAAI;qBACjC;iBACF;aACF;SACF,CAAA;QACD,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAgB,uBAAuB,CAAC,EACtC,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,GAKN;IACC,kBAAkB,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAA;IAC/D,2BAA2B,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;IACjE,mBAAmB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;IACzD,iBAAiB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;IACvD,gBAAgB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;AACxD,CAAC;AAdD,0DAcC","sourcesContent":["import ArgvParser from './argv_parser'\nimport ProfileLoader from './profile_loader'\nimport shuffle from 'knuth-shuffle-seeded'\nimport { EventEmitter } from 'events'\nimport PickleFilter from '../pickle_filter'\nimport { EventDataCollector } from '../formatter/helpers'\nimport { doesHaveValue } from '../value_checker'\nimport OptionSplitter from './option_splitter'\nimport { Readable } from 'stream'\nimport os from 'os'\nimport * as messages from '@cucumber/messages'\nimport { IdGenerator } from '@cucumber/messages'\nimport detectCiEnvironment from '@cucumber/ci-environment'\nimport { ISupportCodeLibrary } from '../support_code_library_builder/types'\nimport TestCaseHookDefinition from '../models/test_case_hook_definition'\nimport TestRunHookDefinition from '../models/test_run_hook_definition'\nimport { builtinParameterTypes } from '../support_code_library_builder'\nimport { version } from '../version'\n\nexport interface IGetExpandedArgvRequest {\n argv: string[]\n cwd: string\n}\n\nexport async function getExpandedArgv({\n argv,\n cwd,\n}: IGetExpandedArgvRequest): Promise<string[]> {\n const { options } = ArgvParser.parse(argv)\n let fullArgv = argv\n const profileArgv = await new ProfileLoader(cwd).getArgv(\n options.profile,\n options.config\n )\n if (profileArgv.length > 0) {\n fullArgv = argv.slice(0, 2).concat(profileArgv).concat(argv.slice(2))\n }\n return fullArgv\n}\n\ninterface IParseGherkinMessageStreamRequest {\n cwd: string\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n gherkinMessageStream: Readable\n order: PickleOrder\n pickleFilter: PickleFilter\n}\n\nexport type PickleOrder = 'defined' | 'random'\n\nexport async function parseGherkinMessageStream({\n cwd,\n eventBroadcaster,\n eventDataCollector,\n gherkinMessageStream,\n order,\n pickleFilter,\n}: IParseGherkinMessageStreamRequest): Promise<string[]> {\n return await new Promise<string[]>((resolve, reject) => {\n const result: string[] = []\n gherkinMessageStream.on('data', (envelope: messages.Envelope) => {\n eventBroadcaster.emit('envelope', envelope)\n if (doesHaveValue(envelope.pickle)) {\n const pickle = envelope.pickle\n const pickleId = pickle.id\n const gherkinDocument = eventDataCollector.getGherkinDocument(\n pickle.uri\n )\n if (pickleFilter.matches({ gherkinDocument, pickle })) {\n result.push(pickleId)\n }\n }\n if (doesHaveValue(envelope.parseError)) {\n reject(\n new Error(\n `Parse error in '${envelope.parseError.source.uri}': ${envelope.parseError.message}`\n )\n )\n }\n })\n gherkinMessageStream.on('end', () => {\n orderPickleIds(result, order)\n resolve(result)\n })\n gherkinMessageStream.on('error', reject)\n })\n}\n\n// Orders the pickleIds in place - morphs input\nexport function orderPickleIds(pickleIds: string[], order: PickleOrder): void {\n const [type, seed] = OptionSplitter.split(order)\n switch (type) {\n case 'defined':\n break\n case 'random':\n if (seed === '') {\n const newSeed = Math.floor(Math.random() * 1000 * 1000).toString()\n console.warn(`Random order using seed: ${newSeed}`)\n shuffle(pickleIds, newSeed)\n } else {\n shuffle(pickleIds, seed)\n }\n break\n default:\n throw new Error(\n 'Unrecgonized order type. Should be `defined` or `random`'\n )\n }\n}\n\nexport function isJavaScript(filePath: string): boolean {\n return (\n filePath.endsWith('.js') ||\n filePath.endsWith('.mjs') ||\n filePath.endsWith('.cjs')\n )\n}\n\nexport async function emitMetaMessage(\n eventBroadcaster: EventEmitter,\n env: NodeJS.ProcessEnv\n): Promise<void> {\n const meta: messages.Meta = {\n protocolVersion: messages.version,\n implementation: {\n version,\n name: 'cucumber-js',\n },\n cpu: {\n name: os.arch(),\n },\n os: {\n name: os.platform(),\n version: os.release(),\n },\n runtime: {\n name: 'node.js',\n version: process.versions.node,\n },\n ci: detectCiEnvironment(env),\n }\n eventBroadcaster.emit('envelope', {\n meta,\n })\n}\n\nfunction emitParameterTypes(\n supportCodeLibrary: ISupportCodeLibrary,\n eventBroadcaster: EventEmitter,\n newId: IdGenerator.NewId\n): void {\n for (const parameterType of supportCodeLibrary.parameterTypeRegistry\n .parameterTypes) {\n if (builtinParameterTypes.includes(parameterType.name)) {\n continue\n }\n const envelope: messages.Envelope = {\n parameterType: {\n id: newId(),\n name: parameterType.name,\n preferForRegularExpressionMatch: parameterType.preferForRegexpMatch,\n regularExpressions: parameterType.regexpStrings,\n useForSnippets: parameterType.useForSnippets,\n },\n }\n eventBroadcaster.emit('envelope', envelope)\n }\n}\n\nfunction emitUndefinedParameterTypes(\n supportCodeLibrary: ISupportCodeLibrary,\n eventBroadcaster: EventEmitter\n): void {\n for (const undefinedParameterType of supportCodeLibrary.undefinedParameterTypes) {\n const envelope: messages.Envelope = {\n undefinedParameterType,\n }\n eventBroadcaster.emit('envelope', envelope)\n }\n}\n\nfunction emitStepDefinitions(\n supportCodeLibrary: ISupportCodeLibrary,\n eventBroadcaster: EventEmitter\n): void {\n supportCodeLibrary.stepDefinitions.forEach((stepDefinition) => {\n const envelope: messages.Envelope = {\n stepDefinition: {\n id: stepDefinition.id,\n pattern: {\n source: stepDefinition.pattern.toString(),\n type:\n typeof stepDefinition.pattern === 'string'\n ? messages.StepDefinitionPatternType.CUCUMBER_EXPRESSION\n : messages.StepDefinitionPatternType.REGULAR_EXPRESSION,\n },\n sourceReference: {\n uri: stepDefinition.uri,\n location: {\n line: stepDefinition.line,\n },\n },\n },\n }\n eventBroadcaster.emit('envelope', envelope)\n })\n}\n\nfunction emitTestCaseHooks(\n supportCodeLibrary: ISupportCodeLibrary,\n eventBroadcaster: EventEmitter\n): void {\n ;[]\n .concat(\n supportCodeLibrary.beforeTestCaseHookDefinitions,\n supportCodeLibrary.afterTestCaseHookDefinitions\n )\n .forEach((testCaseHookDefinition: TestCaseHookDefinition) => {\n const envelope: messages.Envelope = {\n hook: {\n id: testCaseHookDefinition.id,\n tagExpression: testCaseHookDefinition.tagExpression,\n sourceReference: {\n uri: testCaseHookDefinition.uri,\n location: {\n line: testCaseHookDefinition.line,\n },\n },\n },\n }\n eventBroadcaster.emit('envelope', envelope)\n })\n}\n\nfunction emitTestRunHooks(\n supportCodeLibrary: ISupportCodeLibrary,\n eventBroadcaster: EventEmitter\n): void {\n ;[]\n .concat(\n supportCodeLibrary.beforeTestRunHookDefinitions,\n supportCodeLibrary.afterTestRunHookDefinitions\n )\n .forEach((testRunHookDefinition: TestRunHookDefinition) => {\n const envelope: messages.Envelope = {\n hook: {\n id: testRunHookDefinition.id,\n sourceReference: {\n uri: testRunHookDefinition.uri,\n location: {\n line: testRunHookDefinition.line,\n },\n },\n },\n }\n eventBroadcaster.emit('envelope', envelope)\n })\n}\n\nexport function emitSupportCodeMessages({\n eventBroadcaster,\n supportCodeLibrary,\n newId,\n}: {\n eventBroadcaster: EventEmitter\n supportCodeLibrary: ISupportCodeLibrary\n newId: IdGenerator.NewId\n}): void {\n emitParameterTypes(supportCodeLibrary, eventBroadcaster, newId)\n emitUndefinedParameterTypes(supportCodeLibrary, eventBroadcaster)\n emitStepDefinitions(supportCodeLibrary, eventBroadcaster)\n emitTestCaseHooks(supportCodeLibrary, eventBroadcaster)\n emitTestRunHooks(supportCodeLibrary, eventBroadcaster)\n}\n"]}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/cli/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import shuffle from 'knuth-shuffle-seeded'\nimport { EventEmitter } from 'events'\nimport PickleFilter from '../pickle_filter'\nimport { EventDataCollector } from '../formatter/helpers'\nimport { doesHaveValue } from '../value_checker'\nimport { OptionSplitter } from '../configuration'\nimport { Readable } from 'stream'\nimport os from 'os'\nimport * as messages from '@cucumber/messages'\nimport { IdGenerator } from '@cucumber/messages'\nimport detectCiEnvironment from '@cucumber/ci-environment'\nimport { ISupportCodeLibrary } from '../support_code_library_builder/types'\nimport TestCaseHookDefinition from '../models/test_case_hook_definition'\nimport TestRunHookDefinition from '../models/test_run_hook_definition'\nimport { PickleOrder } from '../models/pickle_order'\nimport { builtinParameterTypes } from '../support_code_library_builder'\nimport { version } from '../version'\n\ninterface IParseGherkinMessageStreamRequest {\n cwd?: string\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n gherkinMessageStream: Readable\n order: string\n pickleFilter: PickleFilter\n}\n\n/**\n * Process a stream of envelopes from Gherkin and resolve to an array of filtered, ordered pickle Ids\n *\n * @deprecated use `loadSources` instead\n *\n * @param eventBroadcaster\n * @param eventDataCollector\n * @param gherkinMessageStream\n * @param order\n * @param pickleFilter\n */\nexport async function parseGherkinMessageStream({\n eventBroadcaster,\n eventDataCollector,\n gherkinMessageStream,\n order,\n pickleFilter,\n}: IParseGherkinMessageStreamRequest): Promise<string[]> {\n return await new Promise<string[]>((resolve, reject) => {\n const result: string[] = []\n gherkinMessageStream.on('data', (envelope: messages.Envelope) => {\n eventBroadcaster.emit('envelope', envelope)\n if (doesHaveValue(envelope.pickle)) {\n const pickle = envelope.pickle\n const pickleId = pickle.id\n const gherkinDocument = eventDataCollector.getGherkinDocument(\n pickle.uri\n )\n if (pickleFilter.matches({ gherkinDocument, pickle })) {\n result.push(pickleId)\n }\n }\n })\n gherkinMessageStream.on('end', () => {\n orderPickles(result, order, console)\n resolve(result)\n })\n gherkinMessageStream.on('error', reject)\n })\n}\n\n// Orders the pickleIds in place - morphs input\nexport function orderPickles<T = string>(\n pickleIds: T[],\n order: PickleOrder,\n logger: Console\n): void {\n const [type, seed] = OptionSplitter.split(order)\n switch (type) {\n case 'defined':\n break\n case 'random':\n if (seed === '') {\n const newSeed = Math.floor(Math.random() * 1000 * 1000).toString()\n logger.warn(`Random order using seed: ${newSeed}`)\n shuffle(pickleIds, newSeed)\n } else {\n shuffle(pickleIds, seed)\n }\n break\n default:\n throw new Error(\n 'Unrecgonized order type. Should be `defined` or `random`'\n )\n }\n}\n\nexport async function emitMetaMessage(\n eventBroadcaster: EventEmitter,\n env: NodeJS.ProcessEnv\n): Promise<void> {\n const meta: messages.Meta = {\n protocolVersion: messages.version,\n implementation: {\n version,\n name: 'cucumber-js',\n },\n cpu: {\n name: os.arch(),\n },\n os: {\n name: os.platform(),\n version: os.release(),\n },\n runtime: {\n name: 'node.js',\n version: process.versions.node,\n },\n ci: detectCiEnvironment(env),\n }\n eventBroadcaster.emit('envelope', {\n meta,\n })\n}\n\nfunction emitParameterTypes(\n supportCodeLibrary: ISupportCodeLibrary,\n eventBroadcaster: EventEmitter,\n newId: IdGenerator.NewId\n): void {\n for (const parameterType of supportCodeLibrary.parameterTypeRegistry\n .parameterTypes) {\n if (builtinParameterTypes.includes(parameterType.name)) {\n continue\n }\n const envelope: messages.Envelope = {\n parameterType: {\n id: newId(),\n name: parameterType.name,\n preferForRegularExpressionMatch: parameterType.preferForRegexpMatch,\n regularExpressions: parameterType.regexpStrings,\n useForSnippets: parameterType.useForSnippets,\n },\n }\n eventBroadcaster.emit('envelope', envelope)\n }\n}\n\nfunction emitUndefinedParameterTypes(\n supportCodeLibrary: ISupportCodeLibrary,\n eventBroadcaster: EventEmitter\n): void {\n for (const undefinedParameterType of supportCodeLibrary.undefinedParameterTypes) {\n const envelope: messages.Envelope = {\n undefinedParameterType,\n }\n eventBroadcaster.emit('envelope', envelope)\n }\n}\n\nfunction emitStepDefinitions(\n supportCodeLibrary: ISupportCodeLibrary,\n eventBroadcaster: EventEmitter\n): void {\n supportCodeLibrary.stepDefinitions.forEach((stepDefinition) => {\n const envelope: messages.Envelope = {\n stepDefinition: {\n id: stepDefinition.id,\n pattern: {\n source: stepDefinition.pattern.toString(),\n type:\n typeof stepDefinition.pattern === 'string'\n ? messages.StepDefinitionPatternType.CUCUMBER_EXPRESSION\n : messages.StepDefinitionPatternType.REGULAR_EXPRESSION,\n },\n sourceReference: {\n uri: stepDefinition.uri,\n location: {\n line: stepDefinition.line,\n },\n },\n },\n }\n eventBroadcaster.emit('envelope', envelope)\n })\n}\n\nfunction emitTestCaseHooks(\n supportCodeLibrary: ISupportCodeLibrary,\n eventBroadcaster: EventEmitter\n): void {\n ;[]\n .concat(\n supportCodeLibrary.beforeTestCaseHookDefinitions,\n supportCodeLibrary.afterTestCaseHookDefinitions\n )\n .forEach((testCaseHookDefinition: TestCaseHookDefinition) => {\n const envelope: messages.Envelope = {\n hook: {\n id: testCaseHookDefinition.id,\n tagExpression: testCaseHookDefinition.tagExpression,\n sourceReference: {\n uri: testCaseHookDefinition.uri,\n location: {\n line: testCaseHookDefinition.line,\n },\n },\n },\n }\n eventBroadcaster.emit('envelope', envelope)\n })\n}\n\nfunction emitTestRunHooks(\n supportCodeLibrary: ISupportCodeLibrary,\n eventBroadcaster: EventEmitter\n): void {\n ;[]\n .concat(\n supportCodeLibrary.beforeTestRunHookDefinitions,\n supportCodeLibrary.afterTestRunHookDefinitions\n )\n .forEach((testRunHookDefinition: TestRunHookDefinition) => {\n const envelope: messages.Envelope = {\n hook: {\n id: testRunHookDefinition.id,\n sourceReference: {\n uri: testRunHookDefinition.uri,\n location: {\n line: testRunHookDefinition.line,\n },\n },\n },\n }\n eventBroadcaster.emit('envelope', envelope)\n })\n}\n\nexport function emitSupportCodeMessages({\n eventBroadcaster,\n supportCodeLibrary,\n newId,\n}: {\n eventBroadcaster: EventEmitter\n supportCodeLibrary: ISupportCodeLibrary\n newId: IdGenerator.NewId\n}): void {\n emitParameterTypes(supportCodeLibrary, eventBroadcaster, newId)\n emitUndefinedParameterTypes(supportCodeLibrary, eventBroadcaster)\n emitStepDefinitions(supportCodeLibrary, eventBroadcaster)\n emitTestCaseHooks(supportCodeLibrary, eventBroadcaster)\n emitTestRunHooks(supportCodeLibrary, eventBroadcaster)\n}\n"]}
@@ -9,11 +9,13 @@ export default class Cli {
9
9
  private readonly argv;
10
10
  private readonly cwd;
11
11
  private readonly stdout;
12
+ private readonly stderr;
12
13
  private readonly env;
13
- constructor({ argv, cwd, stdout, env, }: {
14
+ constructor({ argv, cwd, stdout, stderr, env, }: {
14
15
  argv: string[];
15
16
  cwd: string;
16
17
  stdout: IFormatterStream;
18
+ stderr: IFormatterStream;
17
19
  env: NodeJS.ProcessEnv;
18
20
  });
19
21
  run(): Promise<ICliRunResult>;
package/lib/cli/index.js CHANGED
@@ -1,37 +1,53 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const helpers_1 = require("./helpers");
3
+ const configuration_1 = require("../configuration");
4
+ const api_1 = require("../api");
5
+ const i18n_1 = require("./i18n");
7
6
  const install_validator_1 = require("./install_validator");
8
- const configuration_builder_1 = require("./configuration_builder");
9
- const run_1 = require("../run");
10
- const argv_parser_1 = __importDefault(require("./argv_parser"));
11
7
  class Cli {
12
- constructor({ argv, cwd, stdout, env, }) {
8
+ constructor({ argv, cwd, stdout, stderr, env, }) {
13
9
  this.argv = argv;
14
10
  this.cwd = cwd;
15
11
  this.stdout = stdout;
12
+ this.stderr = stderr;
16
13
  this.env = env;
17
14
  }
18
15
  async run() {
19
16
  await (0, install_validator_1.validateInstall)(this.cwd);
20
- const fromArgv = argv_parser_1.default.parse(await (0, helpers_1.getExpandedArgv)({
21
- argv: this.argv,
22
- cwd: this.cwd,
23
- }));
24
- const configuration = await (0, configuration_builder_1.buildConfiguration)(fromArgv, this.env);
25
- const { success } = await (0, run_1.runCucumber)(configuration, {
17
+ const { options, configuration: argvConfiguration } = configuration_1.ArgvParser.parse(this.argv);
18
+ if (options.i18nLanguages) {
19
+ this.stdout.write((0, i18n_1.getLanguages)());
20
+ return {
21
+ shouldAdvertisePublish: false,
22
+ shouldExitImmediately: true,
23
+ success: true,
24
+ };
25
+ }
26
+ if (options.i18nKeywords) {
27
+ this.stdout.write((0, i18n_1.getKeywords)(options.i18nKeywords));
28
+ return {
29
+ shouldAdvertisePublish: false,
30
+ shouldExitImmediately: true,
31
+ success: true,
32
+ };
33
+ }
34
+ const environment = {
26
35
  cwd: this.cwd,
27
36
  stdout: this.stdout,
37
+ stderr: this.stderr,
28
38
  env: this.env,
29
- });
39
+ };
40
+ const { useConfiguration: configuration, runConfiguration } = await (0, api_1.loadConfiguration)({
41
+ file: options.config,
42
+ profiles: options.profile,
43
+ provided: argvConfiguration,
44
+ }, environment);
45
+ const { success } = await (0, api_1.runCucumber)(runConfiguration, environment);
30
46
  return {
31
- shouldAdvertisePublish: !configuration.formats.publish &&
32
- !fromArgv.options.publishQuiet &&
33
- !(0, configuration_builder_1.isTruthyString)(this.env.CUCUMBER_PUBLISH_QUIET),
34
- shouldExitImmediately: fromArgv.options.exit,
47
+ shouldAdvertisePublish: !runConfiguration.formats.publish &&
48
+ !configuration.publishQuiet &&
49
+ !(0, configuration_1.isTruthyString)(this.env.CUCUMBER_PUBLISH_QUIET),
50
+ shouldExitImmediately: configuration.forceExit,
35
51
  success,
36
52
  };
37
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;AAAA,uCAA2C;AAC3C,2DAAqD;AACrD,mEAA4E;AAE5E,gCAAoC;AACpC,gEAAsC;AAQtC,MAAqB,GAAG;IAMtB,YAAY,EACV,IAAI,EACJ,GAAG,EACH,MAAM,EACN,GAAG,GAMJ;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,IAAA,mCAAe,EAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/B,MAAM,QAAQ,GAAG,qBAAU,CAAC,KAAK,CAC/B,MAAM,IAAA,yBAAe,EAAC;YACpB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CACH,CAAA;QACD,MAAM,aAAa,GAAG,MAAM,IAAA,0CAAkB,EAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QAClE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,iBAAW,EAAC,aAAa,EAAE;YACnD,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAA;QACF,OAAO;YACL,sBAAsB,EACpB,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO;gBAC9B,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY;gBAC9B,CAAC,IAAA,sCAAc,EAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAClD,qBAAqB,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI;YAC5C,OAAO;SACR,CAAA;IACH,CAAC;CACF;AA9CD,sBA8CC","sourcesContent":["import { getExpandedArgv } from './helpers'\nimport { validateInstall } from './install_validator'\nimport { buildConfiguration, isTruthyString } from './configuration_builder'\nimport { IFormatterStream } from '../formatter'\nimport { runCucumber } from '../run'\nimport ArgvParser from './argv_parser'\n\nexport interface ICliRunResult {\n shouldAdvertisePublish: boolean\n shouldExitImmediately: boolean\n success: boolean\n}\n\nexport default class Cli {\n private readonly argv: string[]\n private readonly cwd: string\n private readonly stdout: IFormatterStream\n private readonly env: NodeJS.ProcessEnv\n\n constructor({\n argv,\n cwd,\n stdout,\n env,\n }: {\n argv: string[]\n cwd: string\n stdout: IFormatterStream\n env: NodeJS.ProcessEnv\n }) {\n this.argv = argv\n this.cwd = cwd\n this.stdout = stdout\n this.env = env\n }\n\n async run(): Promise<ICliRunResult> {\n await validateInstall(this.cwd)\n const fromArgv = ArgvParser.parse(\n await getExpandedArgv({\n argv: this.argv,\n cwd: this.cwd,\n })\n )\n const configuration = await buildConfiguration(fromArgv, this.env)\n const { success } = await runCucumber(configuration, {\n cwd: this.cwd,\n stdout: this.stdout,\n env: this.env,\n })\n return {\n shouldAdvertisePublish:\n !configuration.formats.publish &&\n !fromArgv.options.publishQuiet &&\n !isTruthyString(this.env.CUCUMBER_PUBLISH_QUIET),\n shouldExitImmediately: fromArgv.options.exit,\n success,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AAAA,oDAA6D;AAE7D,gCAAuD;AACvD,iCAAkD;AAClD,2DAAqD;AAQrD,MAAqB,GAAG;IAOtB,YAAY,EACV,IAAI,EACJ,GAAG,EACH,MAAM,EACN,MAAM,EACN,GAAG,GAOJ;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,IAAA,mCAAe,EAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/B,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,0BAAU,CAAC,KAAK,CACpE,IAAI,CAAC,IAAI,CACV,CAAA;QACD,IAAI,OAAO,CAAC,aAAa,EAAE;YACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,mBAAY,GAAE,CAAC,CAAA;YACjC,OAAO;gBACL,sBAAsB,EAAE,KAAK;gBAC7B,qBAAqB,EAAE,IAAI;gBAC3B,OAAO,EAAE,IAAI;aACd,CAAA;SACF;QACD,IAAI,OAAO,CAAC,YAAY,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,kBAAW,EAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA;YACpD,OAAO;gBACL,sBAAsB,EAAE,KAAK;gBAC7B,qBAAqB,EAAE,IAAI;gBAC3B,OAAO,EAAE,IAAI;aACd,CAAA;SACF;QACD,MAAM,WAAW,GAAG;YAClB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAA;QACD,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,GACzD,MAAM,IAAA,uBAAiB,EACrB;YACE,IAAI,EAAE,OAAO,CAAC,MAAM;YACpB,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,QAAQ,EAAE,iBAAiB;SAC5B,EACD,WAAW,CACZ,CAAA;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,iBAAW,EAAC,gBAAgB,EAAE,WAAW,CAAC,CAAA;QACpE,OAAO;YACL,sBAAsB,EACpB,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO;gBACjC,CAAC,aAAa,CAAC,YAAY;gBAC3B,CAAC,IAAA,8BAAc,EAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAClD,qBAAqB,EAAE,aAAa,CAAC,SAAS;YAC9C,OAAO;SACR,CAAA;IACH,CAAC;CACF;AAzED,sBAyEC","sourcesContent":["import { ArgvParser, isTruthyString } from '../configuration'\nimport { IFormatterStream } from '../formatter'\nimport { loadConfiguration, runCucumber } from '../api'\nimport { getKeywords, getLanguages } from './i18n'\nimport { validateInstall } from './install_validator'\n\nexport interface ICliRunResult {\n shouldAdvertisePublish: boolean\n shouldExitImmediately: boolean\n success: boolean\n}\n\nexport default class Cli {\n private readonly argv: string[]\n private readonly cwd: string\n private readonly stdout: IFormatterStream\n private readonly stderr: IFormatterStream\n private readonly env: NodeJS.ProcessEnv\n\n constructor({\n argv,\n cwd,\n stdout,\n stderr,\n env,\n }: {\n argv: string[]\n cwd: string\n stdout: IFormatterStream\n stderr: IFormatterStream\n env: NodeJS.ProcessEnv\n }) {\n this.argv = argv\n this.cwd = cwd\n this.stdout = stdout\n this.stderr = stderr\n this.env = env\n }\n\n async run(): Promise<ICliRunResult> {\n await validateInstall(this.cwd)\n const { options, configuration: argvConfiguration } = ArgvParser.parse(\n this.argv\n )\n if (options.i18nLanguages) {\n this.stdout.write(getLanguages())\n return {\n shouldAdvertisePublish: false,\n shouldExitImmediately: true,\n success: true,\n }\n }\n if (options.i18nKeywords) {\n this.stdout.write(getKeywords(options.i18nKeywords))\n return {\n shouldAdvertisePublish: false,\n shouldExitImmediately: true,\n success: true,\n }\n }\n const environment = {\n cwd: this.cwd,\n stdout: this.stdout,\n stderr: this.stderr,\n env: this.env,\n }\n const { useConfiguration: configuration, runConfiguration } =\n await loadConfiguration(\n {\n file: options.config,\n profiles: options.profile,\n provided: argvConfiguration,\n },\n environment\n )\n const { success } = await runCucumber(runConfiguration, environment)\n return {\n shouldAdvertisePublish:\n !runConfiguration.formats.publish &&\n !configuration.publishQuiet &&\n !isTruthyString(this.env.CUCUMBER_PUBLISH_QUIET),\n shouldExitImmediately: configuration.forceExit,\n success,\n }\n }\n}\n"]}
@@ -3,22 +3,22 @@ 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
- const safe_1 = __importDefault(require("colors/safe"));
6
+ const chalk_1 = __importDefault(require("chalk"));
7
7
  const cli_table3_1 = __importDefault(require("cli-table3"));
8
- const underlineBoldCyan = (x) => safe_1.default.underline(safe_1.default.bold(safe_1.default.cyan(x)));
8
+ const underlineBoldCyan = (x) => chalk_1.default.underline(chalk_1.default.bold(chalk_1.default.cyan(x)));
9
9
  const formattedReportUrl = underlineBoldCyan('https://reports.cucumber.io');
10
- const formattedEnv = safe_1.default.cyan('CUCUMBER_PUBLISH_ENABLED') + '=' + safe_1.default.cyan('true');
10
+ const formattedEnv = chalk_1.default.cyan('CUCUMBER_PUBLISH_ENABLED') + '=' + chalk_1.default.cyan('true');
11
11
  const formattedMoreInfoUrl = underlineBoldCyan('https://cucumber.io/docs/cucumber/environment-variables/');
12
12
  const text = `\
13
13
  Share your Cucumber Report with your team at ${formattedReportUrl}
14
14
 
15
- Command line option: ${safe_1.default.cyan('--publish')}
15
+ Command line option: ${chalk_1.default.cyan('--publish')}
16
16
  Environment variable: ${formattedEnv}
17
17
 
18
18
  More information at ${formattedMoreInfoUrl}
19
19
 
20
- To disable this message, add this to your ${safe_1.default.bold('./cucumber.js')}:
21
- ${safe_1.default.bold("module.exports = { default: '--publish-quiet' }")}`;
20
+ To disable this message, add this to your ${chalk_1.default.bold('./cucumber.js')}:
21
+ ${chalk_1.default.bold("module.exports = { default: '--publish-quiet' }")}`;
22
22
  const table = new cli_table3_1.default({
23
23
  style: {
24
24
  head: [],
@@ -1 +1 @@
1
- {"version":3,"file":"publish_banner.js","sourceRoot":"","sources":["../../src/cli/publish_banner.ts"],"names":[],"mappings":";;;;;AAAA,uDAAgC;AAChC,4DAA8B;AAE9B,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAU,EAAE,CAC9C,cAAM,CAAC,SAAS,CAAC,cAAM,CAAC,IAAI,CAAC,cAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE/C,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,6BAA6B,CAAC,CAAA;AAC3E,MAAM,YAAY,GAChB,cAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,GAAG,GAAG,GAAG,cAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACrE,MAAM,oBAAoB,GAAG,iBAAiB,CAC5C,0DAA0D,CAC3D,CAAA;AAED,MAAM,IAAI,GAAG;+CACkC,kBAAkB;;0BAEvC,cAAM,CAAC,IAAI,CAAC,WAAW,CAAC;0BACxB,YAAY;;sBAEhB,oBAAoB;;4CAEE,cAAM,CAAC,IAAI,CAAC,eAAe,CAAC;EACtE,cAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,EAAE,CAAA;AAElE,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;IACtB,KAAK,EAAE;QACL,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,CAAC,OAAO,CAAC;KAClB;CACF,CAAC,CAAA;AAEF,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AAElB,kBAAe,KAAK,CAAC,QAAQ,EAAE,CAAA","sourcesContent":["import colors from 'colors/safe'\nimport Table from 'cli-table3'\n\nconst underlineBoldCyan = (x: string): string =>\n colors.underline(colors.bold(colors.cyan(x)))\n\nconst formattedReportUrl = underlineBoldCyan('https://reports.cucumber.io')\nconst formattedEnv =\n colors.cyan('CUCUMBER_PUBLISH_ENABLED') + '=' + colors.cyan('true')\nconst formattedMoreInfoUrl = underlineBoldCyan(\n 'https://cucumber.io/docs/cucumber/environment-variables/'\n)\n\nconst text = `\\\nShare your Cucumber Report with your team at ${formattedReportUrl}\n\nCommand line option: ${colors.cyan('--publish')}\nEnvironment variable: ${formattedEnv}\n\nMore information at ${formattedMoreInfoUrl}\n\nTo disable this message, add this to your ${colors.bold('./cucumber.js')}: \n${colors.bold(\"module.exports = { default: '--publish-quiet' }\")}`\n\nconst table = new Table({\n style: {\n head: [],\n border: ['green'],\n },\n})\n\ntable.push([text])\n\nexport default table.toString()\n"]}
1
+ {"version":3,"file":"publish_banner.js","sourceRoot":"","sources":["../../src/cli/publish_banner.ts"],"names":[],"mappings":";;;;;AAAA,kDAAyB;AACzB,4DAA8B;AAE9B,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAU,EAAE,CAC9C,eAAK,CAAC,SAAS,CAAC,eAAK,CAAC,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE5C,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,6BAA6B,CAAC,CAAA;AAC3E,MAAM,YAAY,GAChB,eAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,GAAG,GAAG,GAAG,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACnE,MAAM,oBAAoB,GAAG,iBAAiB,CAC5C,0DAA0D,CAC3D,CAAA;AAED,MAAM,IAAI,GAAG;+CACkC,kBAAkB;;0BAEvC,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC;0BACvB,YAAY;;sBAEhB,oBAAoB;;4CAEE,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC;EACrE,eAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,EAAE,CAAA;AAEjE,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;IACtB,KAAK,EAAE;QACL,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,CAAC,OAAO,CAAC;KAClB;CACF,CAAC,CAAA;AAEF,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AAElB,kBAAe,KAAK,CAAC,QAAQ,EAAE,CAAA","sourcesContent":["import chalk from 'chalk'\nimport Table from 'cli-table3'\n\nconst underlineBoldCyan = (x: string): string =>\n chalk.underline(chalk.bold(chalk.cyan(x)))\n\nconst formattedReportUrl = underlineBoldCyan('https://reports.cucumber.io')\nconst formattedEnv =\n chalk.cyan('CUCUMBER_PUBLISH_ENABLED') + '=' + chalk.cyan('true')\nconst formattedMoreInfoUrl = underlineBoldCyan(\n 'https://cucumber.io/docs/cucumber/environment-variables/'\n)\n\nconst text = `\\\nShare your Cucumber Report with your team at ${formattedReportUrl}\n\nCommand line option: ${chalk.cyan('--publish')}\nEnvironment variable: ${formattedEnv}\n\nMore information at ${formattedMoreInfoUrl}\n\nTo disable this message, add this to your ${chalk.bold('./cucumber.js')}: \n${chalk.bold(\"module.exports = { default: '--publish-quiet' }\")}`\n\nconst table = new Table({\n style: {\n head: [],\n border: ['green'],\n },\n})\n\ntable.push([text])\n\nexport default table.toString()\n"]}
package/lib/cli/run.js CHANGED
@@ -3,21 +3,30 @@ 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
+ /* eslint-disable no-console */
7
+ /* This is one rare place where we're fine to use process/console directly,
8
+ * but other code abstracts those to remain composable and testable. */
6
9
  const _1 = __importDefault(require("./"));
7
10
  const verror_1 = __importDefault(require("verror"));
8
11
  const publish_banner_1 = __importDefault(require("./publish_banner"));
9
- function exitWithError(error) {
10
- console.error(verror_1.default.fullStack(error)); // eslint-disable-line no-console
12
+ const validate_node_engine_version_1 = require("./validate_node_engine_version");
13
+ function logErrorMessageAndExit(message) {
14
+ console.error(message);
11
15
  process.exit(1);
12
16
  }
13
17
  function displayPublishAdvertisementBanner() {
14
18
  console.error(publish_banner_1.default);
15
19
  }
16
20
  async function run() {
21
+ (0, validate_node_engine_version_1.validateNodeEngineVersion)(process.version, (error) => {
22
+ console.error(error);
23
+ process.exit(1);
24
+ });
17
25
  const cli = new _1.default({
18
26
  argv: process.argv,
19
27
  cwd: process.cwd(),
20
28
  stdout: process.stdout,
29
+ stderr: process.stderr,
21
30
  env: process.env,
22
31
  });
23
32
  let result;
@@ -25,7 +34,7 @@ async function run() {
25
34
  result = await cli.run();
26
35
  }
27
36
  catch (error) {
28
- exitWithError(error);
37
+ logErrorMessageAndExit(verror_1.default.fullStack(error));
29
38
  }
30
39
  if (result.shouldAdvertisePublish) {
31
40
  displayPublishAdvertisementBanner();
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":";;;;;AAAA,0CAAuC;AACvC,oDAA2B;AAC3B,sEAA4C;AAE5C,SAAS,aAAa,CAAC,KAAY;IACjC,OAAO,CAAC,KAAK,CAAC,gBAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA,CAAC,iCAAiC;IACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,SAAS,iCAAiC;IACxC,OAAO,CAAC,KAAK,CAAC,wBAAa,CAAC,CAAA;AAC9B,CAAC;AAEc,KAAK,UAAU,GAAG;IAC/B,MAAM,GAAG,GAAG,IAAI,UAAG,CAAC;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAA;IAEF,IAAI,MAAqB,CAAA;IACzB,IAAI;QACF,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;KACzB;IAAC,OAAO,KAAK,EAAE;QACd,aAAa,CAAC,KAAK,CAAC,CAAA;KACrB;IAED,IAAI,MAAM,CAAC,sBAAsB,EAAE;QACjC,iCAAiC,EAAE,CAAA;KACpC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,IAAI,MAAM,CAAC,qBAAqB,EAAE;QAChC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;KACvB;SAAM;QACL,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;KAC5B;AACH,CAAC;AAzBD,sBAyBC","sourcesContent":["import Cli, { ICliRunResult } from './'\nimport VError from 'verror'\nimport publishBanner from './publish_banner'\n\nfunction exitWithError(error: Error): void {\n console.error(VError.fullStack(error)) // eslint-disable-line no-console\n process.exit(1)\n}\n\nfunction displayPublishAdvertisementBanner(): void {\n console.error(publishBanner)\n}\n\nexport default async function run(): Promise<void> {\n const cli = new Cli({\n argv: process.argv,\n cwd: process.cwd(),\n stdout: process.stdout,\n env: process.env,\n })\n\n let result: ICliRunResult\n try {\n result = await cli.run()\n } catch (error) {\n exitWithError(error)\n }\n\n if (result.shouldAdvertisePublish) {\n displayPublishAdvertisementBanner()\n }\n\n const exitCode = result.success ? 0 : 1\n if (result.shouldExitImmediately) {\n process.exit(exitCode)\n } else {\n process.exitCode = exitCode\n }\n}\n"]}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B;uEACuE;AACvE,0CAAuC;AACvC,oDAA2B;AAC3B,sEAA4C;AAC5C,iFAA0E;AAE1E,SAAS,sBAAsB,CAAC,OAAe;IAC7C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,SAAS,iCAAiC;IACxC,OAAO,CAAC,KAAK,CAAC,wBAAa,CAAC,CAAA;AAC9B,CAAC;AAEc,KAAK,UAAU,GAAG;IAC/B,IAAA,wDAAyB,EAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACnD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,IAAI,UAAG,CAAC;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAA;IAEF,IAAI,MAAqB,CAAA;IACzB,IAAI;QACF,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;KACzB;IAAC,OAAO,KAAK,EAAE;QACd,sBAAsB,CAAC,gBAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;KAChD;IAED,IAAI,MAAM,CAAC,sBAAsB,EAAE;QACjC,iCAAiC,EAAE,CAAA;KACpC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,IAAI,MAAM,CAAC,qBAAqB,EAAE;QAChC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;KACvB;SAAM;QACL,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;KAC5B;AACH,CAAC;AA/BD,sBA+BC","sourcesContent":["/* eslint-disable no-console */\n/* This is one rare place where we're fine to use process/console directly,\n * but other code abstracts those to remain composable and testable. */\nimport Cli, { ICliRunResult } from './'\nimport VError from 'verror'\nimport publishBanner from './publish_banner'\nimport { validateNodeEngineVersion } from './validate_node_engine_version'\n\nfunction logErrorMessageAndExit(message: string): void {\n console.error(message)\n process.exit(1)\n}\n\nfunction displayPublishAdvertisementBanner(): void {\n console.error(publishBanner)\n}\n\nexport default async function run(): Promise<void> {\n validateNodeEngineVersion(process.version, (error) => {\n console.error(error)\n process.exit(1)\n })\n\n const cli = new Cli({\n argv: process.argv,\n cwd: process.cwd(),\n stdout: process.stdout,\n stderr: process.stderr,\n env: process.env,\n })\n\n let result: ICliRunResult\n try {\n result = await cli.run()\n } catch (error) {\n logErrorMessageAndExit(VError.fullStack(error))\n }\n\n if (result.shouldAdvertisePublish) {\n displayPublishAdvertisementBanner()\n }\n\n const exitCode = result.success ? 0 : 1\n if (result.shouldExitImmediately) {\n process.exit(exitCode)\n } else {\n process.exitCode = exitCode\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ declare type PackageJSON = {
2
+ engines: {
3
+ node: string;
4
+ };
5
+ };
6
+ export declare function validateNodeEngineVersion(currentVersion: string, onError: (message: string) => void, readPackageJSON?: () => PackageJSON): void;
7
+ export {};
@@ -0,0 +1,20 @@
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
+ exports.validateNodeEngineVersion = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const semver_1 = __importDefault(require("semver"));
10
+ const readActualPackageJSON = () => JSON.parse(fs_1.default
11
+ .readFileSync(path_1.default.resolve(__dirname, '..', '..', 'package.json'))
12
+ .toString());
13
+ function validateNodeEngineVersion(currentVersion, onError, readPackageJSON = readActualPackageJSON) {
14
+ const requiredVersion = readPackageJSON().engines.node;
15
+ if (!semver_1.default.satisfies(currentVersion, requiredVersion)) {
16
+ onError(`Cucumber can only run on Node.js versions ${requiredVersion}. This Node.js version is ${currentVersion}`);
17
+ }
18
+ }
19
+ exports.validateNodeEngineVersion = validateNodeEngineVersion;
20
+ //# sourceMappingURL=validate_node_engine_version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate_node_engine_version.js","sourceRoot":"","sources":["../../src/cli/validate_node_engine_version.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAmB;AACnB,gDAAuB;AACvB,oDAA2B;AAM3B,MAAM,qBAAqB,GAAsB,GAAG,EAAE,CACpD,IAAI,CAAC,KAAK,CACR,YAAE;KACC,YAAY,CAAC,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;KACjE,QAAQ,EAAE,CACd,CAAA;AAEH,SAAgB,yBAAyB,CACvC,cAAsB,EACtB,OAAkC,EAClC,kBAAqC,qBAAqB;IAE1D,MAAM,eAAe,GAAG,eAAe,EAAE,CAAC,OAAO,CAAC,IAAI,CAAA;IACtD,IAAI,CAAC,gBAAM,CAAC,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC,EAAE;QACtD,OAAO,CACL,6CAA6C,eAAe,6BAA6B,cAAc,EAAE,CAC1G,CAAA;KACF;AACH,CAAC;AAXD,8DAWC","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport semver from 'semver'\n\ntype PackageJSON = {\n engines: { node: string }\n}\n\nconst readActualPackageJSON: () => PackageJSON = () =>\n JSON.parse(\n fs\n .readFileSync(path.resolve(__dirname, '..', '..', 'package.json'))\n .toString()\n )\n\nexport function validateNodeEngineVersion(\n currentVersion: string,\n onError: (message: string) => void,\n readPackageJSON: () => PackageJSON = readActualPackageJSON\n): void {\n const requiredVersion = readPackageJSON().engines.node\n if (!semver.satisfies(currentVersion, requiredVersion)) {\n onError(\n `Cucumber can only run on Node.js versions ${requiredVersion}. This Node.js version is ${currentVersion}`\n )\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { IConfiguration } from './types';
2
+ export interface IParsedArgvOptions {
3
+ config?: string;
4
+ i18nKeywords?: string;
5
+ i18nLanguages?: boolean;
6
+ profile: string[];
7
+ }
8
+ export interface IParsedArgv {
9
+ options: IParsedArgvOptions;
10
+ configuration: Partial<IConfiguration>;
11
+ }
12
+ declare const ArgvParser: {
13
+ collect<T>(val: T, memo?: T[]): T[];
14
+ mergeJson(option: string): (str: string, memo?: object) => object;
15
+ mergeTags(value: string, memo?: string): string;
16
+ validateCountOption(value: string, optionName: string): number;
17
+ validateLanguage(value: string): string;
18
+ parse(argv: string[]): IParsedArgv;
19
+ };
20
+ export default ArgvParser;
@@ -4,18 +4,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const commander_1 = require("commander");
7
+ const lodash_merge_1 = __importDefault(require("lodash.merge"));
7
8
  const path_1 = __importDefault(require("path"));
8
9
  const gherkin_1 = require("@cucumber/gherkin");
9
- const i18n_1 = require("./i18n");
10
10
  const formatters_1 = __importDefault(require("../formatter/helpers/formatters"));
11
11
  const version_1 = require("../version");
12
12
  const ArgvParser = {
13
- collect(val, memo) {
14
- memo.push(val);
15
- return memo;
13
+ collect(val, memo = []) {
14
+ if (val) {
15
+ return [...memo, val];
16
+ }
17
+ return undefined;
16
18
  },
17
19
  mergeJson(option) {
18
- return function (str, memo) {
20
+ return function (str, memo = {}) {
19
21
  let val;
20
22
  try {
21
23
  val = JSON.parse(str);
@@ -27,11 +29,11 @@ const ArgvParser = {
27
29
  if (typeof val !== 'object' || Array.isArray(val)) {
28
30
  throw new Error(`${option} must be passed JSON of an object: ${str}`);
29
31
  }
30
- return { ...memo, ...val };
32
+ return (0, lodash_merge_1.default)(memo, val);
31
33
  };
32
34
  },
33
35
  mergeTags(value, memo) {
34
- return memo === '' ? `(${value})` : `${memo} and (${value})`;
36
+ return memo ? `${memo} and (${value})` : `(${value})`;
35
37
  },
36
38
  validateCountOption(value, optionName) {
37
39
  const numericValue = parseInt(value);
@@ -46,11 +48,6 @@ const ArgvParser = {
46
48
  }
47
49
  return value;
48
50
  },
49
- validateRetryOptions(options) {
50
- if (options.retryTagFilter !== '' && options.retry === 0) {
51
- throw new Error('a positive --retry count must be specified when setting --retry-tag-filter');
52
- }
53
- },
54
51
  parse(argv) {
55
52
  const program = new commander_1.Command(path_1.default.basename(argv[1]));
56
53
  program
@@ -58,45 +55,47 @@ const ArgvParser = {
58
55
  .usage('[options] [<GLOB|DIR|FILE[:LINE]>...]')
59
56
  .version(version_1.version, '-v, --version')
60
57
  .option('-b, --backtrace', 'show full backtrace for errors')
61
- .option('-c, --config <TYPE[:PATH]>', 'specify configuration file')
62
- .option('-d, --dry-run', 'invoke formatters without executing steps', false)
63
- .option('--exit', 'force shutdown of the event loop when the test run has finished: cucumber will call process.exit', false)
64
- .option('--fail-fast', 'abort the run on first failure', false)
58
+ .option('-c, --config <PATH>', 'specify configuration file')
59
+ .option('-d, --dry-run', 'invoke formatters without executing steps')
60
+ .option('--exit, --force-exit', 'force shutdown of the event loop when the test run has finished: cucumber will call process.exit')
61
+ .option('--fail-fast', 'abort the run on first failure')
65
62
  .option('-f, --format <TYPE[:PATH]>', 'specify the output format, optionally supply PATH to redirect formatter output (repeatable). Available formats:\n' +
66
- formatters_1.default.buildFormattersDocumentationString(), ArgvParser.collect, [])
67
- .option('--format-options <JSON>', 'provide options for formatters (repeatable)', ArgvParser.mergeJson('--format-options'), {})
68
- .option('--i18n-keywords <ISO 639-1>', 'list language keywords', ArgvParser.validateLanguage, '')
69
- .option('--i18n-languages', 'list languages', false)
70
- .option('--language <ISO 639-1>', 'provide the default language for feature files', 'en')
71
- .option('--name <REGEXP>', 'only execute the scenarios with name matching the expression (repeatable)', ArgvParser.collect, [])
72
- .option('--no-strict', 'succeed even if there are pending steps')
73
- .option('--order <TYPE[:SEED]>', 'run scenarios in the specified order. Type should be `defined` or `random`', 'defined')
63
+ formatters_1.default.buildFormattersDocumentationString(), ArgvParser.collect)
64
+ .option('--format-options <JSON>', 'provide options for formatters (repeatable)', ArgvParser.mergeJson('--format-options'))
65
+ .option('--i18n-keywords <ISO 639-1>', 'list language keywords', ArgvParser.validateLanguage)
66
+ .option('--i18n-languages', 'list languages')
67
+ .option('-i, --import <GLOB|DIR|FILE>', 'import files before executing features (repeatable)', ArgvParser.collect)
68
+ .option('--language <ISO 639-1>', 'provide the default language for feature files')
69
+ .option('--name <REGEXP>', 'only execute the scenarios with name matching the expression (repeatable)', ArgvParser.collect)
70
+ .option('--order <TYPE[:SEED]>', 'run scenarios in the specified order. Type should be `defined` or `random`')
74
71
  .option('-p, --profile <NAME>', 'specify the profile to use (repeatable)', ArgvParser.collect, [])
75
- .option('--parallel <NUMBER_OF_WORKERS>', 'run in parallel with the given number of workers', (val) => ArgvParser.validateCountOption(val, '--parallel'), 0)
76
- .option('--publish', 'Publish a report to https://reports.cucumber.io', false)
77
- .option('--publish-quiet', "Don't print information banner about publishing reports", false)
78
- .option('-r, --require <GLOB|DIR|FILE>', 'require files before executing features (repeatable)', ArgvParser.collect, [])
79
- .option('--require-module <NODE_MODULE>', 'require node modules before requiring files (repeatable)', ArgvParser.collect, [])
80
- .option('--retry <NUMBER_OF_RETRIES>', 'specify the number of times to retry failing test cases (default: 0)', (val) => ArgvParser.validateCountOption(val, '--retry'), 0)
72
+ .option('--parallel <NUMBER_OF_WORKERS>', 'run in parallel with the given number of workers', (val) => ArgvParser.validateCountOption(val, '--parallel'))
73
+ .option('--publish', 'Publish a report to https://reports.cucumber.io')
74
+ .option('--publish-quiet', "Don't print information banner about publishing reports")
75
+ .option('-r, --require <GLOB|DIR|FILE>', 'require files before executing features (repeatable)', ArgvParser.collect)
76
+ .option('--require-module <NODE_MODULE>', 'require node modules before requiring files (repeatable)', ArgvParser.collect)
77
+ .option('--retry <NUMBER_OF_RETRIES>', 'specify the number of times to retry failing test cases (default: 0)', (val) => ArgvParser.validateCountOption(val, '--retry'))
81
78
  .option('--retry-tag-filter <EXPRESSION>', `only retries the features or scenarios with tags matching the expression (repeatable).
82
- This option requires '--retry' to be specified.`, ArgvParser.mergeTags, '')
83
- .option('-t, --tags <EXPRESSION>', 'only execute the features or scenarios with tags matching the expression (repeatable)', ArgvParser.mergeTags, '')
84
- .option('--world-parameters <JSON>', 'provide parameters that will be passed to the world constructor (repeatable)', ArgvParser.mergeJson('--world-parameters'), {});
85
- program.on('option:i18n-languages', () => {
86
- console.log((0, i18n_1.getLanguages)());
87
- process.exit();
88
- });
89
- program.on('option:i18n-keywords', function (isoCode) {
90
- console.log((0, i18n_1.getKeywords)(isoCode));
91
- process.exit();
92
- });
79
+ This option requires '--retry' to be specified.`, ArgvParser.mergeTags)
80
+ .option('--strict', 'fail if there are pending steps')
81
+ .option('--no-strict', 'succeed even if there are pending steps')
82
+ .option('-t, --tags <EXPRESSION>', 'only execute the features or scenarios with tags matching the expression (repeatable)', ArgvParser.mergeTags)
83
+ .option('--world-parameters <JSON>', 'provide parameters that will be passed to the world constructor (repeatable)', ArgvParser.mergeJson('--world-parameters'));
93
84
  program.addHelpText('afterAll', 'For more details please visit https://github.com/cucumber/cucumber-js/blob/main/docs/cli.md');
94
85
  program.parse(argv);
95
- const options = program.opts();
96
- ArgvParser.validateRetryOptions(options);
86
+ const { config, i18nKeywords, i18nLanguages, profile, ...regularStuff } = program.opts();
87
+ const configuration = regularStuff;
88
+ if (program.args.length > 0) {
89
+ configuration.paths = program.args;
90
+ }
97
91
  return {
98
- options,
99
- args: program.args,
92
+ options: {
93
+ config,
94
+ i18nKeywords,
95
+ i18nLanguages,
96
+ profile,
97
+ },
98
+ configuration,
100
99
  };
101
100
  },
102
101
  };