@cucumber/cucumber 7.0.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/CHANGELOG.md +63 -17
  2. package/README.md +8 -11
  3. package/lib/cli/argv_parser.js.map +1 -1
  4. package/lib/cli/configuration_builder.js +3 -3
  5. package/lib/cli/configuration_builder.js.map +1 -1
  6. package/lib/cli/helpers.js +40 -18
  7. package/lib/cli/helpers.js.map +1 -1
  8. package/lib/cli/i18n.js.map +1 -1
  9. package/lib/cli/index.js +40 -23
  10. package/lib/cli/index.js.map +1 -1
  11. package/lib/cli/install_validator.js.map +1 -1
  12. package/lib/cli/option_splitter.js.map +1 -1
  13. package/lib/cli/profile_loader.d.ts +1 -2
  14. package/lib/cli/profile_loader.js.map +1 -1
  15. package/lib/cli/publish_banner.js.map +1 -1
  16. package/lib/cli/run.js.map +1 -1
  17. package/lib/formatter/builder.js.map +1 -1
  18. package/lib/formatter/get_color_fns.d.ts +2 -2
  19. package/lib/formatter/get_color_fns.js +7 -8
  20. package/lib/formatter/get_color_fns.js.map +1 -1
  21. package/lib/formatter/helpers/event_data_collector.d.ts +14 -17
  22. package/lib/formatter/helpers/event_data_collector.js +14 -8
  23. package/lib/formatter/helpers/event_data_collector.js.map +1 -1
  24. package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -6
  25. package/lib/formatter/helpers/gherkin_document_parser.js +1 -4
  26. package/lib/formatter/helpers/gherkin_document_parser.js.map +1 -1
  27. package/lib/formatter/helpers/index.js.map +1 -1
  28. package/lib/formatter/helpers/issue_helpers.d.ts +6 -6
  29. package/lib/formatter/helpers/issue_helpers.js +5 -6
  30. package/lib/formatter/helpers/issue_helpers.js.map +1 -1
  31. package/lib/formatter/helpers/keyword_type.js.map +1 -1
  32. package/lib/formatter/helpers/location_helpers.js.map +1 -1
  33. package/lib/formatter/helpers/pickle_parser.d.ts +9 -10
  34. package/lib/formatter/helpers/pickle_parser.js.map +1 -1
  35. package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
  36. package/lib/formatter/helpers/step_argument_formatter.js.map +1 -1
  37. package/lib/formatter/helpers/summary_helpers.d.ts +2 -2
  38. package/lib/formatter/helpers/summary_helpers.js +32 -14
  39. package/lib/formatter/helpers/summary_helpers.js.map +1 -1
  40. package/lib/formatter/helpers/test_case_attempt_formatter.js +33 -14
  41. package/lib/formatter/helpers/test_case_attempt_formatter.js.map +1 -1
  42. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +5 -5
  43. package/lib/formatter/helpers/test_case_attempt_parser.js +27 -9
  44. package/lib/formatter/helpers/test_case_attempt_parser.js.map +1 -1
  45. package/lib/formatter/helpers/usage_helpers/index.d.ts +3 -3
  46. package/lib/formatter/helpers/usage_helpers/index.js +30 -13
  47. package/lib/formatter/helpers/usage_helpers/index.js.map +1 -1
  48. package/lib/formatter/html_formatter.js +2 -2
  49. package/lib/formatter/html_formatter.js.map +1 -1
  50. package/lib/formatter/http_stream.d.ts +8 -9
  51. package/lib/formatter/http_stream.js +58 -54
  52. package/lib/formatter/http_stream.js.map +1 -1
  53. package/lib/formatter/index.js.map +1 -1
  54. package/lib/formatter/json_formatter.d.ts +21 -27
  55. package/lib/formatter/json_formatter.js +50 -23
  56. package/lib/formatter/json_formatter.js.map +1 -1
  57. package/lib/formatter/message_formatter.js +1 -1
  58. package/lib/formatter/message_formatter.js.map +1 -1
  59. package/lib/formatter/progress_bar_formatter.d.ts +6 -6
  60. package/lib/formatter/progress_bar_formatter.js +3 -3
  61. package/lib/formatter/progress_bar_formatter.js.map +1 -1
  62. package/lib/formatter/progress_formatter.d.ts +2 -2
  63. package/lib/formatter/progress_formatter.js +29 -10
  64. package/lib/formatter/progress_formatter.js.map +1 -1
  65. package/lib/formatter/rerun_formatter.js +22 -4
  66. package/lib/formatter/rerun_formatter.js.map +1 -1
  67. package/lib/formatter/snippets_formatter.js +22 -3
  68. package/lib/formatter/snippets_formatter.js.map +1 -1
  69. package/lib/formatter/step_definition_snippet_builder/index.d.ts +3 -3
  70. package/lib/formatter/step_definition_snippet_builder/index.js +1 -1
  71. package/lib/formatter/step_definition_snippet_builder/index.js.map +1 -1
  72. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map +1 -1
  73. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map +1 -1
  74. package/lib/formatter/summary_formatter.d.ts +2 -2
  75. package/lib/formatter/summary_formatter.js.map +1 -1
  76. package/lib/formatter/usage_formatter.js +22 -3
  77. package/lib/formatter/usage_formatter.js.map +1 -1
  78. package/lib/formatter/usage_json_formatter.js.map +1 -1
  79. package/lib/index.d.ts +14 -12
  80. package/lib/index.js +3 -3
  81. package/lib/index.js.map +1 -1
  82. package/lib/models/data_table.d.ts +3 -4
  83. package/lib/models/data_table.js.map +1 -1
  84. package/lib/models/definition.d.ts +2 -2
  85. package/lib/models/definition.js.map +1 -1
  86. package/lib/models/step_definition.js.map +1 -1
  87. package/lib/models/test_case_hook_definition.d.ts +2 -2
  88. package/lib/models/test_case_hook_definition.js.map +1 -1
  89. package/lib/models/test_run_hook_definition.js.map +1 -1
  90. package/lib/models/test_step_hook_definition.d.ts +2 -2
  91. package/lib/models/test_step_hook_definition.js.map +1 -1
  92. package/lib/pickle_filter.d.ts +9 -11
  93. package/lib/pickle_filter.js +4 -4
  94. package/lib/pickle_filter.js.map +1 -1
  95. package/lib/runtime/assemble_test_cases.d.ts +13 -0
  96. package/lib/runtime/assemble_test_cases.js +88 -0
  97. package/lib/runtime/assemble_test_cases.js.map +1 -0
  98. package/lib/runtime/attachment_manager/index.d.ts +6 -6
  99. package/lib/runtime/attachment_manager/index.js +33 -6
  100. package/lib/runtime/attachment_manager/index.js.map +1 -1
  101. package/lib/runtime/helpers.d.ts +2 -2
  102. package/lib/runtime/helpers.js.map +1 -1
  103. package/lib/runtime/index.d.ts +4 -3
  104. package/lib/runtime/index.js +31 -13
  105. package/lib/runtime/index.js.map +1 -1
  106. package/lib/runtime/parallel/command_types.d.ts +10 -9
  107. package/lib/runtime/parallel/command_types.js.map +1 -1
  108. package/lib/runtime/parallel/coordinator.d.ts +10 -9
  109. package/lib/runtime/parallel/coordinator.js +54 -43
  110. package/lib/runtime/parallel/coordinator.js.map +1 -1
  111. package/lib/runtime/parallel/run_worker.js.map +1 -1
  112. package/lib/runtime/parallel/worker.d.ts +2 -2
  113. package/lib/runtime/parallel/worker.js +8 -14
  114. package/lib/runtime/parallel/worker.js.map +1 -1
  115. package/lib/runtime/step_runner.d.ts +3 -3
  116. package/lib/runtime/step_runner.js +16 -12
  117. package/lib/runtime/step_runner.js.map +1 -1
  118. package/lib/runtime/stopwatch.d.ts +4 -4
  119. package/lib/runtime/stopwatch.js +21 -2
  120. package/lib/runtime/stopwatch.js.map +1 -1
  121. package/lib/runtime/{pickle_runner.d.ts → test_case_runner.d.ts} +16 -32
  122. package/lib/runtime/{pickle_runner.js → test_case_runner.js} +104 -147
  123. package/lib/runtime/test_case_runner.js.map +1 -0
  124. package/lib/stack_trace_filter.js.map +1 -1
  125. package/lib/step_arguments.d.ts +4 -4
  126. package/lib/step_arguments.js.map +1 -1
  127. package/lib/support_code_library_builder/build_helpers.js.map +1 -1
  128. package/lib/support_code_library_builder/finalize_helpers.js.map +1 -1
  129. package/lib/support_code_library_builder/index.d.ts +9 -7
  130. package/lib/support_code_library_builder/index.js +10 -10
  131. package/lib/support_code_library_builder/index.js.map +1 -1
  132. package/lib/support_code_library_builder/types.d.ts +20 -22
  133. package/lib/support_code_library_builder/types.js.map +1 -1
  134. package/lib/support_code_library_builder/validate_arguments.js.map +1 -1
  135. package/lib/support_code_library_builder/world.d.ts +7 -1
  136. package/lib/support_code_library_builder/world.js.map +1 -1
  137. package/lib/time.d.ts +2 -10
  138. package/lib/time.js +24 -48
  139. package/lib/time.js.map +1 -1
  140. package/lib/types/index.js.map +1 -1
  141. package/lib/uncaught_exception_manager.js +2 -12
  142. package/lib/uncaught_exception_manager.js.map +1 -1
  143. package/lib/user_code_runner.js.map +1 -1
  144. package/lib/value_checker.js.map +1 -1
  145. package/package.json +49 -46
  146. package/lib/runtime/pickle_runner.js.map +0 -1
  147. package/lib/status.d.ts +0 -3
  148. package/lib/status.js +0 -5
  149. package/lib/status.js.map +0 -1
@@ -1,7 +1,6 @@
1
- import { Dictionary } from 'lodash';
2
- import { messages } from '@cucumber/messages';
3
- import IGherkinDocument = messages.IGherkinDocument;
4
- import IPickle = messages.IPickle;
1
+ import * as messages from '@cucumber/messages';
2
+ import IGherkinDocument = messages.GherkinDocument;
3
+ import IPickle = messages.Pickle;
5
4
  export interface IPickleFilterOptions {
6
5
  cwd: string;
7
6
  featurePaths?: string[];
@@ -9,8 +8,8 @@ export interface IPickleFilterOptions {
9
8
  tagExpression?: string;
10
9
  }
11
10
  export interface IMatchesAnyLineRequest {
12
- gherkinDocument: messages.IGherkinDocument;
13
- pickle: messages.IPickle;
11
+ gherkinDocument: messages.GherkinDocument;
12
+ pickle: messages.Pickle;
14
13
  }
15
14
  export default class PickleFilter {
16
15
  private readonly lineFilter;
@@ -25,19 +24,18 @@ export default class PickleFilter {
25
24
  export declare class PickleLineFilter {
26
25
  private readonly featureUriToLinesMapping;
27
26
  constructor(cwd: string, featurePaths?: string[]);
28
- getFeatureUriToLinesMapping({ cwd, featurePaths, }: {
29
- cwd: string;
27
+ getFeatureUriToLinesMapping({ featurePaths, }: {
30
28
  featurePaths: string[];
31
- }): Dictionary<number[]>;
29
+ }): Record<string, number[]>;
32
30
  matchesAnyLine({ gherkinDocument, pickle }: IMatchesAnyLineRequest): boolean;
33
31
  }
34
32
  export declare class PickleNameFilter {
35
33
  private readonly names;
36
34
  constructor(names?: string[]);
37
- matchesAnyName(pickle: messages.IPickle): boolean;
35
+ matchesAnyName(pickle: messages.Pickle): boolean;
38
36
  }
39
37
  export declare class PickleTagFilter {
40
38
  private readonly tagExpressionNode;
41
39
  constructor(tagExpression: string);
42
- matchesAllTagExpressions(pickle: messages.IPickle): boolean;
40
+ matchesAllTagExpressions(pickle: messages.Pickle): boolean;
43
41
  }
@@ -26,16 +26,15 @@ exports.default = PickleFilter;
26
26
  class PickleLineFilter {
27
27
  constructor(cwd, featurePaths = []) {
28
28
  this.featureUriToLinesMapping = this.getFeatureUriToLinesMapping({
29
- cwd,
30
29
  featurePaths,
31
30
  });
32
31
  }
33
- getFeatureUriToLinesMapping({ cwd, featurePaths, }) {
32
+ getFeatureUriToLinesMapping({ featurePaths, }) {
34
33
  const mapping = {};
35
34
  featurePaths.forEach((featurePath) => {
36
35
  const match = FEATURE_LINENUM_REGEXP.exec(featurePath);
37
36
  if (value_checker_1.doesHaveValue(match)) {
38
- const uri = path_1.default.resolve(cwd, match[1]);
37
+ const uri = path_1.default.normalize(match[1]);
39
38
  const linesExpression = match[2];
40
39
  if (value_checker_1.doesHaveValue(linesExpression)) {
41
40
  if (value_checker_1.doesNotHaveValue(mapping[uri])) {
@@ -53,7 +52,8 @@ class PickleLineFilter {
53
52
  return mapping;
54
53
  }
55
54
  matchesAnyLine({ gherkinDocument, pickle }) {
56
- const linesToMatch = this.featureUriToLinesMapping[pickle.uri];
55
+ const uri = path_1.default.normalize(pickle.uri);
56
+ const linesToMatch = this.featureUriToLinesMapping[uri];
57
57
  if (value_checker_1.doesHaveValue(linesToMatch)) {
58
58
  const gherkinScenarioLocationMap = gherkin_document_parser_1.getGherkinScenarioLocationMap(gherkinDocument);
59
59
  const pickleLines = pickle.astNodeIds.map((sourceId) => gherkinScenarioLocationMap[sourceId].line);
@@ -1 +1 @@
1
- {"version":3,"file":"pickle_filter.js","sourceRoot":"","sources":["../src/pickle_filter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pickle_filter.js","sourceRoot":"","sources":["../src/pickle_filter.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash'\nimport path from 'path'\nimport parse from '@cucumber/tag-expressions'\nimport { getGherkinScenarioLocationMap } from './formatter/helpers/gherkin_document_parser'\nimport { doesHaveValue, doesNotHaveValue } from './value_checker'\nimport * as messages from '@cucumber/messages'\nimport IGherkinDocument = messages.GherkinDocument\nimport IPickle = messages.Pickle\n\nconst FEATURE_LINENUM_REGEXP = /^(.*?)((?::[\\d]+)+)?$/\n\nexport interface IPickleFilterOptions {\n cwd: string\n featurePaths?: string[]\n names?: string[]\n tagExpression?: string\n}\n\nexport interface IMatchesAnyLineRequest {\n gherkinDocument: messages.GherkinDocument\n pickle: messages.Pickle\n}\n\nexport default class PickleFilter {\n private readonly lineFilter: PickleLineFilter\n private readonly nameFilter: PickleNameFilter\n private readonly tagFilter: PickleTagFilter\n\n constructor({\n cwd,\n featurePaths,\n names,\n tagExpression,\n }: IPickleFilterOptions) {\n this.lineFilter = new PickleLineFilter(cwd, featurePaths)\n this.nameFilter = new PickleNameFilter(names)\n this.tagFilter = new PickleTagFilter(tagExpression)\n }\n\n matches({\n gherkinDocument,\n pickle,\n }: {\n gherkinDocument: IGherkinDocument\n pickle: IPickle\n }): boolean {\n return (\n this.lineFilter.matchesAnyLine({ gherkinDocument, pickle }) &&\n this.nameFilter.matchesAnyName(pickle) &&\n this.tagFilter.matchesAllTagExpressions(pickle)\n )\n }\n}\n\nexport class PickleLineFilter {\n private readonly featureUriToLinesMapping: Record<string, number[]>\n\n constructor(cwd: string, featurePaths: string[] = []) {\n this.featureUriToLinesMapping = this.getFeatureUriToLinesMapping({\n featurePaths,\n })\n }\n\n getFeatureUriToLinesMapping({\n featurePaths,\n }: {\n featurePaths: string[]\n }): Record<string, number[]> {\n const mapping: Record<string, number[]> = {}\n featurePaths.forEach((featurePath) => {\n const match = FEATURE_LINENUM_REGEXP.exec(featurePath)\n if (doesHaveValue(match)) {\n const uri = path.normalize(match[1])\n const linesExpression = match[2]\n if (doesHaveValue(linesExpression)) {\n if (doesNotHaveValue(mapping[uri])) {\n mapping[uri] = []\n }\n linesExpression\n .slice(1)\n .split(':')\n .forEach((line) => {\n mapping[uri].push(parseInt(line))\n })\n }\n }\n })\n return mapping\n }\n\n matchesAnyLine({ gherkinDocument, pickle }: IMatchesAnyLineRequest): boolean {\n const uri = path.normalize(pickle.uri)\n const linesToMatch = this.featureUriToLinesMapping[uri]\n if (doesHaveValue(linesToMatch)) {\n const gherkinScenarioLocationMap =\n getGherkinScenarioLocationMap(gherkinDocument)\n const pickleLines = pickle.astNodeIds.map(\n (sourceId) => gherkinScenarioLocationMap[sourceId].line\n )\n return _.size(_.intersection(linesToMatch, pickleLines)) > 0\n }\n return true\n }\n}\n\nexport class PickleNameFilter {\n private readonly names: string[]\n\n constructor(names: string[] = []) {\n this.names = names\n }\n\n matchesAnyName(pickle: messages.Pickle): boolean {\n if (this.names.length === 0) {\n return true\n }\n return _.some(this.names, (name) => pickle.name.match(name))\n }\n}\n\nexport class PickleTagFilter {\n private readonly tagExpressionNode: any // cucumber-tag-expressions does not export interface\n\n constructor(tagExpression: string) {\n if (doesHaveValue(tagExpression) && tagExpression !== '') {\n this.tagExpressionNode = parse(tagExpression)\n }\n }\n\n matchesAllTagExpressions(pickle: messages.Pickle): boolean {\n if (doesNotHaveValue(this.tagExpressionNode)) {\n return true\n }\n return this.tagExpressionNode.evaluate(_.map(pickle.tags, 'name'))\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'events';
3
+ import * as messages from '@cucumber/messages';
4
+ import { IdGenerator } from '@cucumber/messages';
5
+ import { ISupportCodeLibrary } from '../support_code_library_builder/types';
6
+ export declare type IAssembledTestCases = Record<string, messages.TestCase>;
7
+ export interface IAssembleTestCasesOptions {
8
+ eventBroadcaster: EventEmitter;
9
+ newId: IdGenerator.NewId;
10
+ pickles: messages.Pickle[];
11
+ supportCodeLibrary: ISupportCodeLibrary;
12
+ }
13
+ export declare function assembleTestCases({ eventBroadcaster, newId, pickles, supportCodeLibrary, }: IAssembleTestCasesOptions): Promise<IAssembledTestCases>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assembleTestCases = void 0;
4
+ const value_checker_1 = require("../value_checker");
5
+ const lodash_1 = require("lodash");
6
+ async function assembleTestCases({ eventBroadcaster, newId, pickles, supportCodeLibrary, }) {
7
+ const result = {};
8
+ for (const pickle of pickles) {
9
+ const { id: pickleId } = pickle;
10
+ const testCaseId = newId();
11
+ const fromBeforeHooks = makeBeforeHookSteps({
12
+ supportCodeLibrary,
13
+ pickle,
14
+ newId,
15
+ });
16
+ const fromStepDefinitions = makeSteps({
17
+ pickle,
18
+ supportCodeLibrary,
19
+ newId,
20
+ });
21
+ const fromAfterHooks = makeAfterHookSteps({
22
+ supportCodeLibrary,
23
+ pickle,
24
+ newId,
25
+ });
26
+ const testCase = {
27
+ pickleId,
28
+ id: testCaseId,
29
+ testSteps: [
30
+ ...fromBeforeHooks,
31
+ ...fromStepDefinitions,
32
+ ...fromAfterHooks,
33
+ ],
34
+ };
35
+ eventBroadcaster.emit('envelope', { testCase });
36
+ result[pickleId] = testCase;
37
+ }
38
+ return result;
39
+ }
40
+ exports.assembleTestCases = assembleTestCases;
41
+ function makeAfterHookSteps({ supportCodeLibrary, pickle, newId, }) {
42
+ return lodash_1.clone(supportCodeLibrary.afterTestCaseHookDefinitions)
43
+ .reverse()
44
+ .filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle))
45
+ .map((hookDefinition) => ({
46
+ id: newId(),
47
+ hookId: hookDefinition.id,
48
+ }));
49
+ }
50
+ function makeBeforeHookSteps({ supportCodeLibrary, pickle, newId, }) {
51
+ return supportCodeLibrary.beforeTestCaseHookDefinitions
52
+ .filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle))
53
+ .map((hookDefinition) => ({
54
+ id: newId(),
55
+ hookId: hookDefinition.id,
56
+ }));
57
+ }
58
+ function makeSteps({ pickle, supportCodeLibrary, newId, }) {
59
+ return pickle.steps.map((pickleStep) => {
60
+ const stepDefinitions = supportCodeLibrary.stepDefinitions.filter((stepDefinition) => stepDefinition.matchesStepName(pickleStep.text));
61
+ return {
62
+ id: newId(),
63
+ pickleStepId: pickleStep.id,
64
+ stepDefinitionIds: stepDefinitions.map((stepDefinition) => stepDefinition.id),
65
+ stepMatchArgumentsLists: stepDefinitions.map((stepDefinition) => {
66
+ const result = stepDefinition.expression.match(pickleStep.text);
67
+ return {
68
+ stepMatchArguments: result.map((arg) => {
69
+ return {
70
+ group: mapArgumentGroup(arg.group),
71
+ parameterTypeName: arg.parameterType.name,
72
+ };
73
+ }),
74
+ };
75
+ }),
76
+ };
77
+ });
78
+ }
79
+ function mapArgumentGroup(group) {
80
+ return {
81
+ start: group.start,
82
+ value: group.value,
83
+ children: value_checker_1.doesHaveValue(group.children)
84
+ ? group.children.map((child) => mapArgumentGroup(child))
85
+ : undefined,
86
+ };
87
+ }
88
+ //# sourceMappingURL=assemble_test_cases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assemble_test_cases.js","sourceRoot":"","sources":["../../src/runtime/assemble_test_cases.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'events'\nimport * as messages from '@cucumber/messages'\nimport { IdGenerator } from '@cucumber/messages'\nimport { ISupportCodeLibrary } from '../support_code_library_builder/types'\nimport { Group } from '@cucumber/cucumber-expressions'\nimport { doesHaveValue } from '../value_checker'\nimport { clone } from 'lodash'\n\nexport declare type IAssembledTestCases = Record<string, messages.TestCase>\n\nexport interface IAssembleTestCasesOptions {\n eventBroadcaster: EventEmitter\n newId: IdGenerator.NewId\n pickles: messages.Pickle[]\n supportCodeLibrary: ISupportCodeLibrary\n}\n\nexport async function assembleTestCases({\n eventBroadcaster,\n newId,\n pickles,\n supportCodeLibrary,\n}: IAssembleTestCasesOptions): Promise<IAssembledTestCases> {\n const result: IAssembledTestCases = {}\n for (const pickle of pickles) {\n const { id: pickleId } = pickle\n const testCaseId = newId()\n const fromBeforeHooks: messages.TestStep[] = makeBeforeHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n })\n const fromStepDefinitions: messages.TestStep[] = makeSteps({\n pickle,\n supportCodeLibrary,\n newId,\n })\n const fromAfterHooks: messages.TestStep[] = makeAfterHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n })\n const testCase: messages.TestCase = {\n pickleId,\n id: testCaseId,\n testSteps: [\n ...fromBeforeHooks,\n ...fromStepDefinitions,\n ...fromAfterHooks,\n ],\n }\n eventBroadcaster.emit('envelope', { testCase })\n result[pickleId] = testCase\n }\n return result\n}\n\nfunction makeAfterHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n}: {\n supportCodeLibrary: ISupportCodeLibrary\n pickle: messages.Pickle\n newId: IdGenerator.NewId\n}): messages.TestStep[] {\n return clone(supportCodeLibrary.afterTestCaseHookDefinitions)\n .reverse()\n .filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle))\n .map((hookDefinition) => ({\n id: newId(),\n hookId: hookDefinition.id,\n }))\n}\n\nfunction makeBeforeHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n}: {\n supportCodeLibrary: ISupportCodeLibrary\n pickle: messages.Pickle\n newId: IdGenerator.NewId\n}): messages.TestStep[] {\n return supportCodeLibrary.beforeTestCaseHookDefinitions\n .filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle))\n .map((hookDefinition) => ({\n id: newId(),\n hookId: hookDefinition.id,\n }))\n}\n\nfunction makeSteps({\n pickle,\n supportCodeLibrary,\n newId,\n}: {\n pickle: messages.Pickle\n supportCodeLibrary: ISupportCodeLibrary\n newId: () => string\n}): messages.TestStep[] {\n return pickle.steps.map((pickleStep) => {\n const stepDefinitions = supportCodeLibrary.stepDefinitions.filter(\n (stepDefinition) => stepDefinition.matchesStepName(pickleStep.text)\n )\n return {\n id: newId(),\n pickleStepId: pickleStep.id,\n stepDefinitionIds: stepDefinitions.map(\n (stepDefinition) => stepDefinition.id\n ),\n stepMatchArgumentsLists: stepDefinitions.map((stepDefinition) => {\n const result = stepDefinition.expression.match(pickleStep.text)\n return {\n stepMatchArguments: result.map((arg) => {\n return {\n group: mapArgumentGroup(arg.group),\n parameterTypeName: arg.parameterType.name,\n }\n }),\n }\n }),\n }\n })\n}\n\nfunction mapArgumentGroup(group: Group): messages.Group {\n return {\n start: group.start,\n value: group.value,\n children: doesHaveValue(group.children)\n ? group.children.map((child) => mapArgumentGroup(child))\n : undefined,\n }\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  /// <reference types="node" />
2
- import stream from 'stream';
3
- import { messages } from '@cucumber/messages';
2
+ import { Readable } from 'stream';
3
+ import * as messages from '@cucumber/messages';
4
4
  export interface IAttachmentMedia {
5
- encoding: messages.Attachment.ContentEncoding;
5
+ encoding: messages.AttachmentContentEncoding;
6
6
  contentType: string;
7
7
  }
8
8
  export interface IAttachment {
@@ -10,14 +10,14 @@ export interface IAttachment {
10
10
  media: IAttachmentMedia;
11
11
  }
12
12
  export declare type IAttachFunction = (attachment: IAttachment) => void;
13
- export declare type ICreateAttachment = (data: Buffer | stream.Readable | string, mediaType?: string, callback?: () => void) => void | Promise<void>;
13
+ export declare type ICreateAttachment = (data: Buffer | Readable | string, mediaType?: string, callback?: () => void) => void | Promise<void>;
14
14
  export declare type ICreateLog = (text: string) => void | Promise<void>;
15
15
  export default class AttachmentManager {
16
16
  private readonly onAttachment;
17
17
  constructor(onAttachment: IAttachFunction);
18
18
  log(text: string): void | Promise<void>;
19
- create(data: Buffer | stream.Readable | string, mediaType?: string, callback?: () => void): void | Promise<void>;
19
+ create(data: Buffer | Readable | string, mediaType?: string, callback?: () => void): void | Promise<void>;
20
20
  createBufferAttachment(data: Buffer, mediaType: string): void;
21
- createStreamAttachment(data: stream.Readable, mediaType: string, callback: () => void): void | Promise<void>;
21
+ createStreamAttachment(data: Readable, mediaType: string, callback: () => void): void | Promise<void>;
22
22
  createStringAttachment(data: string, media: IAttachmentMedia): void;
23
23
  }
@@ -1,10 +1,29 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
2
21
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
23
  };
5
24
  Object.defineProperty(exports, "__esModule", { value: true });
6
25
  const is_stream_1 = __importDefault(require("is-stream"));
7
- const messages_1 = require("@cucumber/messages");
26
+ const messages = __importStar(require("@cucumber/messages"));
8
27
  const value_checker_1 = require("../../value_checker");
9
28
  class AttachmentManager {
10
29
  constructor(onAttachment) {
@@ -30,10 +49,18 @@ class AttachmentManager {
30
49
  if (value_checker_1.doesNotHaveValue(mediaType)) {
31
50
  mediaType = 'text/plain';
32
51
  }
33
- this.createStringAttachment(data, {
34
- encoding: messages_1.messages.Attachment.ContentEncoding.IDENTITY,
35
- contentType: mediaType,
36
- });
52
+ if (mediaType.startsWith('base64:')) {
53
+ this.createStringAttachment(data, {
54
+ encoding: messages.AttachmentContentEncoding.BASE64,
55
+ contentType: mediaType.replace('base64:', ''),
56
+ });
57
+ }
58
+ else {
59
+ this.createStringAttachment(data, {
60
+ encoding: messages.AttachmentContentEncoding.IDENTITY,
61
+ contentType: mediaType,
62
+ });
63
+ }
37
64
  }
38
65
  else {
39
66
  throw Error('Invalid attachment data: must be a buffer, readable stream, or string');
@@ -41,7 +68,7 @@ class AttachmentManager {
41
68
  }
42
69
  createBufferAttachment(data, mediaType) {
43
70
  this.createStringAttachment(data.toString('base64'), {
44
- encoding: messages_1.messages.Attachment.ContentEncoding.BASE64,
71
+ encoding: messages.AttachmentContentEncoding.BASE64,
45
72
  contentType: mediaType,
46
73
  });
47
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/attachment_manager/index.ts"],"names":[],"mappings":";;;;;AAAA,0DAAgC;AAEhC,iDAA6C;AAC7C,uDAAqE;AAoBrE,MAAqB,iBAAiB;IAGpC,YAAY,YAA6B;QACvC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IAClC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,CACJ,IAAuC,EACvC,SAAkB,EAClB,QAAqB;QAErB,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACzB,IAAI,gCAAgB,CAAC,SAAS,CAAC,EAAE;gBAC/B,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAA;aAC5D;YACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;SAC7C;aAAM,IAAI,mBAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAClC,IAAI,gCAAgB,CAAC,SAAS,CAAC,EAAE;gBAC/B,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAA;aAC5D;YACD,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;SAC9D;aAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YACnC,IAAI,gCAAgB,CAAC,SAAS,CAAC,EAAE;gBAC/B,SAAS,GAAG,YAAY,CAAA;aACzB;YACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE;gBAChC,QAAQ,EAAE,mBAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ;gBACtD,WAAW,EAAE,SAAS;aACvB,CAAC,CAAA;SACH;aAAM;YACL,MAAM,KAAK,CACT,uEAAuE,CACxE,CAAA;SACF;IACH,CAAC;IAED,sBAAsB,CAAC,IAAY,EAAE,SAAiB;QACpD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YACnD,QAAQ,EAAE,mBAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM;YACpD,WAAW,EAAE,SAAS;SACvB,CAAC,CAAA;IACJ,CAAC;IAED,sBAAsB,CACpB,IAAqB,EACrB,SAAiB,EACjB,QAAoB;QAEpB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,OAAO,GAAiB,EAAE,CAAA;YAChC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACxB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAA;gBAC9D,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC1B,CAAC,CAAC,CAAA;QACF,IAAI,6BAAa,CAAC,QAAQ,CAAC,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;SACjC;aAAM;YACL,OAAO,OAAO,CAAA;SACf;IACH,CAAC;IAED,sBAAsB,CAAC,IAAY,EAAE,KAAuB;QAC1D,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACpC,CAAC;CACF;AA1ED,oCA0EC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/attachment_manager/index.ts"],"names":[],"mappings":"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","sourcesContent":["import isStream from 'is-stream'\nimport { Readable } from 'stream'\nimport * as messages from '@cucumber/messages'\nimport { doesHaveValue, doesNotHaveValue } from '../../value_checker'\n\nexport interface IAttachmentMedia {\n encoding: messages.AttachmentContentEncoding\n contentType: string\n}\n\nexport interface IAttachment {\n data: string\n media: IAttachmentMedia\n}\n\nexport type IAttachFunction = (attachment: IAttachment) => void\nexport type ICreateAttachment = (\n data: Buffer | Readable | string,\n mediaType?: string,\n callback?: () => void\n) => void | Promise<void>\nexport type ICreateLog = (text: string) => void | Promise<void>\n\nexport default class AttachmentManager {\n private readonly onAttachment: IAttachFunction\n\n constructor(onAttachment: IAttachFunction) {\n this.onAttachment = onAttachment\n }\n\n log(text: string): void | Promise<void> {\n return this.create(text, 'text/x.cucumber.log+plain')\n }\n\n create(\n data: Buffer | Readable | string,\n mediaType?: string,\n callback?: () => void\n ): void | Promise<void> {\n if (Buffer.isBuffer(data)) {\n if (doesNotHaveValue(mediaType)) {\n throw Error('Buffer attachments must specify a media type')\n }\n this.createBufferAttachment(data, mediaType)\n } else if (isStream.readable(data)) {\n if (doesNotHaveValue(mediaType)) {\n throw Error('Stream attachments must specify a media type')\n }\n return this.createStreamAttachment(data, mediaType, callback)\n } else if (typeof data === 'string') {\n if (doesNotHaveValue(mediaType)) {\n mediaType = 'text/plain'\n }\n if (mediaType.startsWith('base64:')) {\n this.createStringAttachment(data, {\n encoding: messages.AttachmentContentEncoding.BASE64,\n contentType: mediaType.replace('base64:', ''),\n })\n } else {\n this.createStringAttachment(data, {\n encoding: messages.AttachmentContentEncoding.IDENTITY,\n contentType: mediaType,\n })\n }\n } else {\n throw Error(\n 'Invalid attachment data: must be a buffer, readable stream, or string'\n )\n }\n }\n\n createBufferAttachment(data: Buffer, mediaType: string): void {\n this.createStringAttachment(data.toString('base64'), {\n encoding: messages.AttachmentContentEncoding.BASE64,\n contentType: mediaType,\n })\n }\n\n createStreamAttachment(\n data: Readable,\n mediaType: string,\n callback: () => void\n ): void | Promise<void> {\n const promise = new Promise<void>((resolve, reject) => {\n const buffers: Uint8Array[] = []\n data.on('data', (chunk) => {\n buffers.push(chunk)\n })\n data.on('end', () => {\n this.createBufferAttachment(Buffer.concat(buffers), mediaType)\n resolve()\n })\n data.on('error', reject)\n })\n if (doesHaveValue(callback)) {\n promise.then(callback, callback)\n } else {\n return promise\n }\n }\n\n createStringAttachment(data: string, media: IAttachmentMedia): void {\n this.onAttachment({ data, media })\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import StepDefinition from '../models/step_definition';
2
- import { messages } from '@cucumber/messages';
2
+ import * as messages from '@cucumber/messages';
3
3
  import { IRuntimeOptions } from '.';
4
4
  export declare function getAmbiguousStepException(stepDefinitions: StepDefinition[]): string;
5
- export declare function retriesForPickle(pickle: messages.IPickle, options: IRuntimeOptions): number;
5
+ export declare function retriesForPickle(pickle: messages.Pickle, options: IRuntimeOptions): number;
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":";;;;;;AAAA,4EAAsE;AACtE,4DAA8B;AAC9B,kEAAwC;AACxC,oDAAkD;AAKlD,SAAgB,yBAAyB,CACvC,eAAiC;IAEjC,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;QACtB,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,EAAE;YACd,GAAG,EAAE,EAAE;YACP,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,EAAE;YACP,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;SAChB;QACD,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SACnB;KACF,CAAC,CAAA;IACF,KAAK,CAAC,IAAI,CACR,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;QACjD,OAAO,CAAC,OAAO,EAAE,iCAAc,CAAC,cAAc,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CACH,CAAA;IACD,OAAO,GAAG,kCAAkC,GAAG,IAAI,GAAG,uBAAY,CAChE,KAAK,CAAC,QAAQ,EAAE,EAChB,CAAC,CACF,EAAE,CAAA;AACL,CAAC;AArCD,8DAqCC;AAED,SAAgB,gBAAgB,CAC9B,MAAwB,EACxB,OAAwB;IAExB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAA;IAC7B,IAAI,OAAO,KAAK,CAAC,EAAE;QACjB,OAAO,CAAC,CAAA;KACT;IACD,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;IAC7C,IAAI,cAAc,KAAK,EAAE,EAAE;QACzB,OAAO,OAAO,CAAA;KACf;IACD,MAAM,eAAe,GAAG,IAAI,+BAAe,CAAC,cAAc,CAAC,CAAA;IAC3D,IAAI,eAAe,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE;QACpD,OAAO,OAAO,CAAA;KACf;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAjBD,4CAiBC"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":";;;;;;AAAA,4EAAsE;AACtE,4DAA8B;AAC9B,kEAAwC;AACxC,oDAAkD;AAKlD,SAAgB,yBAAyB,CACvC,eAAiC;IAEjC,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;QACtB,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,EAAE;YACd,GAAG,EAAE,EAAE;YACP,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,EAAE;YACP,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;SAChB;QACD,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SACnB;KACF,CAAC,CAAA;IACF,KAAK,CAAC,IAAI,CACR,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;QACjD,OAAO,CAAC,OAAO,EAAE,iCAAc,CAAC,cAAc,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CACH,CAAA;IACD,OAAO,GAAG,kCAAkC,GAAG,IAAI,GAAG,uBAAY,CAChE,KAAK,CAAC,QAAQ,EAAE,EAChB,CAAC,CACF,EAAE,CAAA;AACL,CAAC;AArCD,8DAqCC;AAED,SAAgB,gBAAgB,CAC9B,MAAuB,EACvB,OAAwB;IAExB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAA;IAC7B,IAAI,OAAO,KAAK,CAAC,EAAE;QACjB,OAAO,CAAC,CAAA;KACT;IACD,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;IAC7C,IAAI,cAAc,KAAK,EAAE,EAAE;QACzB,OAAO,OAAO,CAAA;KACf;IACD,MAAM,eAAe,GAAG,IAAI,+BAAe,CAAC,cAAc,CAAC,CAAA;IAC3D,IAAI,eAAe,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE;QACpD,OAAO,OAAO,CAAA;KACf;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAjBD,4CAiBC","sourcesContent":["import { formatLocation } from '../formatter/helpers/location_helpers'\nimport Table from 'cli-table3'\nimport indentString from 'indent-string'\nimport { PickleTagFilter } from '../pickle_filter'\nimport StepDefinition from '../models/step_definition'\nimport * as messages from '@cucumber/messages'\nimport { IRuntimeOptions } from '.'\n\nexport function getAmbiguousStepException(\n stepDefinitions: StepDefinition[]\n): string {\n const table = new Table({\n chars: {\n bottom: '',\n 'bottom-left': '',\n 'bottom-mid': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n middle: ' - ',\n right: '',\n 'right-mid': '',\n top: '',\n 'top-left': '',\n 'top-mid': '',\n 'top-right': '',\n },\n style: {\n border: [],\n 'padding-left': 0,\n 'padding-right': 0,\n },\n })\n table.push(\n ...stepDefinitions.map((stepDefinition) => {\n const pattern = stepDefinition.pattern.toString()\n return [pattern, formatLocation(stepDefinition)]\n })\n )\n return `${'Multiple step definitions match:' + '\\n'}${indentString(\n table.toString(),\n 2\n )}`\n}\n\nexport function retriesForPickle(\n pickle: messages.Pickle,\n options: IRuntimeOptions\n): number {\n const retries = options.retry\n if (retries === 0) {\n return 0\n }\n const retryTagFilter = options.retryTagFilter\n if (retryTagFilter === '') {\n return retries\n }\n const pickleTagFilter = new PickleTagFilter(retryTagFilter)\n if (pickleTagFilter.matchesAllTagExpressions(pickle)) {\n return retries\n }\n return 0\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import { EventDataCollector } from '../formatter/helpers';
3
- import { IdGenerator, messages } from '@cucumber/messages';
3
+ import { IdGenerator } from '@cucumber/messages';
4
+ import * as messages from '@cucumber/messages';
4
5
  import { EventEmitter } from 'events';
5
6
  import { ISupportCodeLibrary } from '../support_code_library_builder/types';
6
7
  import TestRunHookDefinition from '../models/test_run_hook_definition';
@@ -34,7 +35,7 @@ export default class Runtime {
34
35
  private success;
35
36
  constructor({ eventBroadcaster, eventDataCollector, newId, options, pickleIds, supportCodeLibrary, }: INewRuntimeOptions);
36
37
  runTestRunHooks(definitions: TestRunHookDefinition[], name: string): Promise<void>;
37
- runPickle(pickleId: string): Promise<void>;
38
+ runTestCase(pickleId: string, testCase: messages.TestCase): Promise<void>;
38
39
  start(): Promise<boolean>;
39
- shouldCauseFailure(status: messages.TestStepFinished.TestStepResult.Status): boolean;
40
+ shouldCauseFailure(status: messages.TestStepResultStatus): boolean;
40
41
  }
@@ -26,14 +26,14 @@ const lodash_1 = __importStar(require("lodash"));
26
26
  const helpers_1 = require("../formatter/helpers");
27
27
  const bluebird_1 = __importDefault(require("bluebird"));
28
28
  const stack_trace_filter_1 = __importDefault(require("../stack_trace_filter"));
29
- const status_1 = __importDefault(require("../status"));
30
29
  const user_code_runner_1 = __importDefault(require("../user_code_runner"));
31
30
  const verror_1 = __importDefault(require("verror"));
32
31
  const helpers_2 = require("./helpers");
33
- const messages_1 = require("@cucumber/messages");
34
- const pickle_runner_1 = __importDefault(require("./pickle_runner"));
32
+ const messages = __importStar(require("@cucumber/messages"));
33
+ const test_case_runner_1 = __importDefault(require("./test_case_runner"));
35
34
  const value_checker_1 = require("../value_checker");
36
35
  const stopwatch_1 = require("./stopwatch");
36
+ const assemble_test_cases_1 = require("./assemble_test_cases");
37
37
  class Runtime {
38
38
  constructor({ eventBroadcaster, eventDataCollector, newId, options, pickleIds, supportCodeLibrary, }) {
39
39
  this.eventBroadcaster = eventBroadcaster;
@@ -65,22 +65,23 @@ class Runtime {
65
65
  }
66
66
  });
67
67
  }
68
- async runPickle(pickleId) {
68
+ async runTestCase(pickleId, testCase) {
69
69
  const pickle = this.eventDataCollector.getPickle(pickleId);
70
70
  const retries = helpers_2.retriesForPickle(pickle, this.options);
71
71
  const skip = this.options.dryRun || (this.options.failFast && !this.success);
72
- const pickleRunner = new pickle_runner_1.default({
72
+ const testCaseRunner = new test_case_runner_1.default({
73
73
  eventBroadcaster: this.eventBroadcaster,
74
74
  stopwatch: this.stopwatch,
75
75
  gherkinDocument: this.eventDataCollector.getGherkinDocument(pickle.uri),
76
76
  newId: this.newId,
77
77
  pickle,
78
+ testCase,
78
79
  retries,
79
80
  skip,
80
81
  supportCodeLibrary: this.supportCodeLibrary,
81
82
  worldParameters: this.options.worldParameters,
82
83
  });
83
- const status = await pickleRunner.run();
84
+ const status = await testCaseRunner.run();
84
85
  if (this.shouldCauseFailure(status)) {
85
86
  this.success = false;
86
87
  }
@@ -89,29 +90,46 @@ class Runtime {
89
90
  if (this.options.filterStacktraces) {
90
91
  this.stackTraceFilter.filter();
91
92
  }
92
- this.eventBroadcaster.emit('envelope', new messages_1.messages.Envelope({
93
+ const testRunStarted = {
93
94
  testRunStarted: {
94
95
  timestamp: this.stopwatch.timestamp(),
95
96
  },
96
- }));
97
+ };
98
+ this.eventBroadcaster.emit('envelope', testRunStarted);
97
99
  this.stopwatch.start();
98
100
  await this.runTestRunHooks(this.supportCodeLibrary.beforeTestRunHookDefinitions, 'a BeforeAll');
99
- await bluebird_1.default.each(this.pickleIds, this.runPickle.bind(this));
101
+ const assembledTestCases = await assemble_test_cases_1.assembleTestCases({
102
+ eventBroadcaster: this.eventBroadcaster,
103
+ newId: this.newId,
104
+ pickles: this.pickleIds.map((pickleId) => this.eventDataCollector.getPickle(pickleId)),
105
+ supportCodeLibrary: this.supportCodeLibrary,
106
+ });
107
+ await bluebird_1.default.each(this.pickleIds, async (pickleId) => {
108
+ await this.runTestCase(pickleId, assembledTestCases[pickleId]);
109
+ });
100
110
  await this.runTestRunHooks(lodash_1.clone(this.supportCodeLibrary.afterTestRunHookDefinitions).reverse(), 'an AfterAll');
101
111
  this.stopwatch.stop();
102
- this.eventBroadcaster.emit('envelope', messages_1.messages.Envelope.fromObject({
112
+ const testRunFinished = {
103
113
  testRunFinished: {
104
114
  timestamp: this.stopwatch.timestamp(),
115
+ success: this.success,
105
116
  },
106
- }));
117
+ };
118
+ this.eventBroadcaster.emit('envelope', testRunFinished);
107
119
  if (this.options.filterStacktraces) {
108
120
  this.stackTraceFilter.unfilter();
109
121
  }
110
122
  return this.success;
111
123
  }
112
124
  shouldCauseFailure(status) {
113
- return (lodash_1.default.includes([status_1.default.AMBIGUOUS, status_1.default.FAILED, status_1.default.UNDEFINED], status) ||
114
- (status === status_1.default.PENDING && this.options.strict));
125
+ const failureStatuses = [
126
+ messages.TestStepResultStatus.AMBIGUOUS,
127
+ messages.TestStepResultStatus.FAILED,
128
+ messages.TestStepResultStatus.UNDEFINED,
129
+ ];
130
+ if (this.options.strict)
131
+ failureStatuses.push(messages.TestStepResultStatus.PENDING);
132
+ return lodash_1.default.includes(failureStatuses, status);
115
133
  }
116
134
  }
117
135
  exports.default = Runtime;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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","sourcesContent":["import _, { clone } from 'lodash'\nimport { EventDataCollector, formatLocation } from '../formatter/helpers'\nimport bluebird from 'bluebird'\nimport StackTraceFilter from '../stack_trace_filter'\nimport UserCodeRunner from '../user_code_runner'\nimport VError from 'verror'\nimport { retriesForPickle } from './helpers'\nimport { IdGenerator } from '@cucumber/messages'\nimport * as messages from '@cucumber/messages'\nimport TestCaseRunner from './test_case_runner'\nimport { EventEmitter } from 'events'\nimport { ISupportCodeLibrary } from '../support_code_library_builder/types'\nimport TestRunHookDefinition from '../models/test_run_hook_definition'\nimport { doesHaveValue, valueOrDefault } from '../value_checker'\nimport {\n ITestRunStopwatch,\n PredictableTestRunStopwatch,\n RealTestRunStopwatch,\n} from './stopwatch'\nimport { assembleTestCases } from './assemble_test_cases'\n\nexport interface INewRuntimeOptions {\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n newId: IdGenerator.NewId\n options: IRuntimeOptions\n pickleIds: string[]\n supportCodeLibrary: ISupportCodeLibrary\n}\n\nexport interface IRuntimeOptions {\n dryRun: boolean\n predictableIds: boolean\n failFast: boolean\n filterStacktraces: boolean\n retry: number\n retryTagFilter: string\n strict: boolean\n worldParameters: any\n}\n\nexport default class Runtime {\n private readonly eventBroadcaster: EventEmitter\n private readonly eventDataCollector: EventDataCollector\n private readonly stopwatch: ITestRunStopwatch\n private readonly newId: IdGenerator.NewId\n private readonly options: IRuntimeOptions\n private readonly pickleIds: string[]\n private readonly stackTraceFilter: StackTraceFilter\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private success: boolean\n\n constructor({\n eventBroadcaster,\n eventDataCollector,\n newId,\n options,\n pickleIds,\n supportCodeLibrary,\n }: INewRuntimeOptions) {\n this.eventBroadcaster = eventBroadcaster\n this.eventDataCollector = eventDataCollector\n this.stopwatch = options.predictableIds\n ? new PredictableTestRunStopwatch()\n : new RealTestRunStopwatch()\n this.newId = newId\n this.options = options\n this.pickleIds = pickleIds\n this.stackTraceFilter = new StackTraceFilter()\n this.supportCodeLibrary = supportCodeLibrary\n this.success = true\n }\n\n async runTestRunHooks(\n definitions: TestRunHookDefinition[],\n name: string\n ): Promise<void> {\n if (this.options.dryRun) {\n return\n }\n await bluebird.each(\n definitions,\n async (hookDefinition: TestRunHookDefinition) => {\n const { error } = await UserCodeRunner.run({\n argsArray: [],\n fn: hookDefinition.code,\n thisArg: null,\n timeoutInMilliseconds: valueOrDefault(\n hookDefinition.options.timeout,\n this.supportCodeLibrary.defaultTimeout\n ),\n })\n if (doesHaveValue(error)) {\n const location = formatLocation(hookDefinition)\n throw new VError(\n error,\n `${name} hook errored, process exiting: ${location}`\n )\n }\n }\n )\n }\n\n async runTestCase(\n pickleId: string,\n testCase: messages.TestCase\n ): Promise<void> {\n const pickle = this.eventDataCollector.getPickle(pickleId)\n const retries = retriesForPickle(pickle, this.options)\n const skip = this.options.dryRun || (this.options.failFast && !this.success)\n const testCaseRunner = new TestCaseRunner({\n eventBroadcaster: this.eventBroadcaster,\n stopwatch: this.stopwatch,\n gherkinDocument: this.eventDataCollector.getGherkinDocument(pickle.uri),\n newId: this.newId,\n pickle,\n testCase,\n retries,\n skip,\n supportCodeLibrary: this.supportCodeLibrary,\n worldParameters: this.options.worldParameters,\n })\n const status = await testCaseRunner.run()\n if (this.shouldCauseFailure(status)) {\n this.success = false\n }\n }\n\n async start(): Promise<boolean> {\n if (this.options.filterStacktraces) {\n this.stackTraceFilter.filter()\n }\n const testRunStarted: messages.Envelope = {\n testRunStarted: {\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testRunStarted)\n this.stopwatch.start()\n await this.runTestRunHooks(\n this.supportCodeLibrary.beforeTestRunHookDefinitions,\n 'a BeforeAll'\n )\n const assembledTestCases = await assembleTestCases({\n eventBroadcaster: this.eventBroadcaster,\n newId: this.newId,\n pickles: this.pickleIds.map((pickleId) =>\n this.eventDataCollector.getPickle(pickleId)\n ),\n supportCodeLibrary: this.supportCodeLibrary,\n })\n await bluebird.each(this.pickleIds, async (pickleId) => {\n await this.runTestCase(pickleId, assembledTestCases[pickleId])\n })\n await this.runTestRunHooks(\n clone(this.supportCodeLibrary.afterTestRunHookDefinitions).reverse(),\n 'an AfterAll'\n )\n this.stopwatch.stop()\n const testRunFinished: messages.Envelope = {\n testRunFinished: {\n timestamp: this.stopwatch.timestamp(),\n success: this.success,\n },\n }\n this.eventBroadcaster.emit('envelope', testRunFinished)\n if (this.options.filterStacktraces) {\n this.stackTraceFilter.unfilter()\n }\n return this.success\n }\n\n shouldCauseFailure(status: messages.TestStepResultStatus): boolean {\n const failureStatuses: messages.TestStepResultStatus[] = [\n messages.TestStepResultStatus.AMBIGUOUS,\n messages.TestStepResultStatus.FAILED,\n messages.TestStepResultStatus.UNDEFINED,\n ]\n if (this.options.strict)\n failureStatuses.push(messages.TestStepResultStatus.PENDING)\n return _.includes(failureStatuses, status)\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { messages } from '@cucumber/messages';
1
+ import * as messages from '@cucumber/messages';
2
2
  import { IRuntimeOptions } from '../index';
3
3
  export interface IWorkerCommand {
4
4
  initialize?: IWorkerCommandInitialize;
@@ -9,22 +9,23 @@ export interface IWorkerCommandInitialize {
9
9
  filterStacktraces: boolean;
10
10
  supportCodePaths: string[];
11
11
  supportCodeRequiredModules: string[];
12
+ supportCodeIds?: ICanonicalSupportCodeIds;
12
13
  options: IRuntimeOptions;
13
14
  }
15
+ export interface ICanonicalSupportCodeIds {
16
+ stepDefinitionIds: string[];
17
+ beforeTestCaseHookDefinitionIds: string[];
18
+ afterTestCaseHookDefinitionIds: string[];
19
+ }
14
20
  export interface IWorkerCommandRun {
15
21
  retries: number;
16
22
  skip: boolean;
17
23
  elapsed: number;
18
- pickle: messages.IPickle;
19
- gherkinDocument: messages.IGherkinDocument;
24
+ pickle: messages.Pickle;
25
+ testCase: messages.TestCase;
26
+ gherkinDocument: messages.GherkinDocument;
20
27
  }
21
28
  export interface ICoordinatorReport {
22
29
  jsonEnvelope?: string;
23
30
  ready?: boolean;
24
- supportCodeIds?: ICoordinatorReportSupportCodeIds;
25
- }
26
- export interface ICoordinatorReportSupportCodeIds {
27
- stepDefinitionIds: string[];
28
- beforeTestCaseHookDefinitionIds: string[];
29
- afterTestCaseHookDefinitionIds: string[];
30
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"command_types.js","sourceRoot":"","sources":["../../../src/runtime/parallel/command_types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"command_types.js","sourceRoot":"","sources":["../../../src/runtime/parallel/command_types.ts"],"names":[],"mappings":"","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { IRuntimeOptions } from '../index'\n\n// Messages from Coordinator to Worker\n\nexport interface IWorkerCommand {\n initialize?: IWorkerCommandInitialize\n run?: IWorkerCommandRun\n finalize?: boolean\n}\n\nexport interface IWorkerCommandInitialize {\n filterStacktraces: boolean\n supportCodePaths: string[]\n supportCodeRequiredModules: string[]\n supportCodeIds?: ICanonicalSupportCodeIds\n options: IRuntimeOptions\n}\n\nexport interface ICanonicalSupportCodeIds {\n stepDefinitionIds: string[]\n beforeTestCaseHookDefinitionIds: string[]\n afterTestCaseHookDefinitionIds: string[]\n}\n\nexport interface IWorkerCommandRun {\n retries: number\n skip: boolean\n elapsed: number\n pickle: messages.Pickle\n testCase: messages.TestCase\n gherkinDocument: messages.GherkinDocument\n}\n\n// Messages from Worker to Coordinator\n\nexport interface ICoordinatorReport {\n jsonEnvelope?: string\n ready?: boolean\n}\n"]}
@@ -1,16 +1,18 @@
1
1
  /// <reference types="node" />
2
2
  import { ChildProcess } from 'child_process';
3
- import { messages } from '@cucumber/messages';
3
+ import * as messages from '@cucumber/messages';
4
4
  import { EventEmitter } from 'events';
5
5
  import { EventDataCollector } from '../../formatter/helpers';
6
6
  import { IRuntimeOptions } from '..';
7
7
  import { ISupportCodeLibrary } from '../../support_code_library_builder/types';
8
- import { ICoordinatorReport, ICoordinatorReportSupportCodeIds } from './command_types';
8
+ import { ICoordinatorReport } from './command_types';
9
+ import { IdGenerator } from '@cucumber/messages';
9
10
  export interface INewCoordinatorOptions {
10
11
  cwd: string;
11
12
  eventBroadcaster: EventEmitter;
12
13
  eventDataCollector: EventDataCollector;
13
14
  options: IRuntimeOptions;
15
+ newId: IdGenerator.NewId;
14
16
  pickleIds: string[];
15
17
  supportCodeLibrary: ISupportCodeLibrary;
16
18
  supportCodePaths: string[];
@@ -28,22 +30,21 @@ export default class Coordinator {
28
30
  private onFinish;
29
31
  private nextPickleIdIndex;
30
32
  private readonly options;
33
+ private readonly newId;
31
34
  private readonly pickleIds;
35
+ private assembledTestCases;
32
36
  private workers;
33
- private supportCodeIdMap;
34
37
  private readonly supportCodeLibrary;
35
38
  private readonly supportCodePaths;
36
39
  private readonly supportCodeRequiredModules;
37
40
  private success;
38
- constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, supportCodeLibrary, supportCodePaths, supportCodeRequiredModules, }: INewCoordinatorOptions);
41
+ constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, newId, supportCodeLibrary, supportCodePaths, supportCodeRequiredModules, }: INewCoordinatorOptions);
39
42
  parseWorkerMessage(worker: IWorker, message: ICoordinatorReport): void;
40
- saveDefinitionIdMapping(message: ICoordinatorReportSupportCodeIds): void;
41
- remapDefinitionIds(testCase: messages.ITestCase): void;
42
43
  startWorker(id: string, total: number): void;
43
44
  onWorkerProcessClose(exitCode: number): void;
44
- parseTestCaseResult(testCaseFinished: messages.ITestCaseFinished): void;
45
- run(numberOfWorkers: number, done: (success: boolean) => void): void;
45
+ parseTestCaseResult(testCaseFinished: messages.TestCaseFinished): void;
46
+ run(numberOfWorkers: number): Promise<boolean>;
46
47
  giveWork(worker: IWorker): void;
47
- shouldCauseFailure(status: messages.TestStepFinished.TestStepResult.Status): boolean;
48
+ shouldCauseFailure(status: messages.TestStepResultStatus): boolean;
48
49
  }
49
50
  export {};