@cucumber/cucumber 7.3.0 → 8.0.0-rc.2
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.
- package/README.md +11 -4
- package/lib/cli/argv_parser.d.ts +3 -3
- package/lib/cli/argv_parser.js +19 -19
- package/lib/cli/argv_parser.js.map +1 -1
- package/lib/cli/configuration_builder.d.ts +5 -46
- package/lib/cli/configuration_builder.js +61 -150
- package/lib/cli/configuration_builder.js.map +1 -1
- package/lib/cli/helpers.d.ts +5 -3
- package/lib/cli/helpers.js +42 -15
- package/lib/cli/helpers.js.map +1 -1
- package/lib/cli/i18n.js +7 -7
- package/lib/cli/i18n.js.map +1 -1
- package/lib/cli/index.d.ts +4 -23
- package/lib/cli/index.js +18 -193
- package/lib/cli/index.js.map +1 -1
- package/lib/cli/install_validator.js +1 -1
- package/lib/cli/install_validator.js.map +1 -1
- package/lib/cli/option_splitter.js +1 -0
- package/lib/cli/option_splitter.js.map +1 -1
- package/lib/cli/profile_loader.d.ts +3 -2
- package/lib/cli/profile_loader.js +20 -13
- package/lib/cli/profile_loader.js.map +1 -1
- package/lib/cli/publish_banner.js +1 -1
- package/lib/cli/publish_banner.js.map +1 -1
- package/lib/cli/run.js +3 -4
- package/lib/cli/run.js.map +1 -1
- package/lib/configuration/index.d.ts +1 -0
- package/lib/configuration/index.js +14 -0
- package/lib/configuration/index.js.map +1 -0
- package/lib/configuration/types.d.ts +29 -0
- package/lib/configuration/types.js +3 -0
- package/lib/configuration/types.js.map +1 -0
- package/lib/formatter/builder.d.ts +5 -4
- package/lib/formatter/builder.js +41 -55
- package/lib/formatter/builder.js.map +1 -1
- package/lib/formatter/get_color_fns.d.ts +4 -0
- package/lib/formatter/get_color_fns.js +11 -4
- package/lib/formatter/get_color_fns.js.map +1 -1
- package/lib/formatter/helpers/event_data_collector.d.ts +2 -1
- package/lib/formatter/helpers/event_data_collector.js +16 -15
- package/lib/formatter/helpers/event_data_collector.js.map +1 -1
- package/lib/formatter/helpers/formatters.d.ts +6 -0
- package/lib/formatter/helpers/formatters.js +41 -0
- package/lib/formatter/helpers/formatters.js.map +1 -0
- package/lib/formatter/helpers/gherkin_document_parser.js +29 -42
- package/lib/formatter/helpers/gherkin_document_parser.js.map +1 -1
- package/lib/formatter/helpers/issue_helpers.d.ts +2 -2
- package/lib/formatter/helpers/issue_helpers.js +6 -7
- package/lib/formatter/helpers/issue_helpers.js.map +1 -1
- package/lib/formatter/helpers/keyword_type.js +2 -6
- package/lib/formatter/helpers/keyword_type.js.map +1 -1
- package/lib/formatter/helpers/location_helpers.js +1 -1
- package/lib/formatter/helpers/location_helpers.js.map +1 -1
- package/lib/formatter/helpers/pickle_parser.js +9 -18
- package/lib/formatter/helpers/pickle_parser.js.map +1 -1
- package/lib/formatter/helpers/step_argument_formatter.js +1 -1
- package/lib/formatter/helpers/step_argument_formatter.js.map +1 -1
- package/lib/formatter/helpers/summary_helpers.js +8 -7
- package/lib/formatter/helpers/summary_helpers.js.map +1 -1
- package/lib/formatter/helpers/test_case_attempt_formatter.js +12 -12
- package/lib/formatter/helpers/test_case_attempt_formatter.js.map +1 -1
- package/lib/formatter/helpers/test_case_attempt_parser.js +17 -20
- package/lib/formatter/helpers/test_case_attempt_parser.js.map +1 -1
- package/lib/formatter/helpers/usage_helpers/index.js +26 -40
- package/lib/formatter/helpers/usage_helpers/index.js.map +1 -1
- package/lib/formatter/html_formatter.d.ts +1 -0
- package/lib/formatter/html_formatter.js +5 -4
- package/lib/formatter/html_formatter.js.map +1 -1
- package/lib/formatter/http_stream.js +7 -7
- package/lib/formatter/http_stream.js.map +1 -1
- package/lib/formatter/index.d.ts +1 -0
- package/lib/formatter/index.js.map +1 -1
- package/lib/formatter/json_formatter.d.ts +1 -0
- package/lib/formatter/json_formatter.js +25 -20
- package/lib/formatter/json_formatter.js.map +1 -1
- package/lib/formatter/message_formatter.d.ts +1 -0
- package/lib/formatter/message_formatter.js +1 -0
- package/lib/formatter/message_formatter.js.map +1 -1
- package/lib/formatter/progress_bar_formatter.d.ts +1 -0
- package/lib/formatter/progress_bar_formatter.js +17 -16
- package/lib/formatter/progress_bar_formatter.js.map +1 -1
- package/lib/formatter/progress_formatter.d.ts +1 -0
- package/lib/formatter/progress_formatter.js +3 -2
- package/lib/formatter/progress_formatter.js.map +1 -1
- package/lib/formatter/publish.d.ts +1 -0
- package/lib/formatter/publish.js +5 -0
- package/lib/formatter/publish.js.map +1 -0
- package/lib/formatter/rerun_formatter.d.ts +1 -0
- package/lib/formatter/rerun_formatter.js +15 -11
- package/lib/formatter/rerun_formatter.js.map +1 -1
- package/lib/formatter/snippets_formatter.d.ts +1 -0
- package/lib/formatter/snippets_formatter.js +3 -2
- package/lib/formatter/snippets_formatter.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/index.js +2 -2
- package/lib/formatter/step_definition_snippet_builder/index.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +3 -0
- package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +1 -1
- package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map +1 -1
- package/lib/formatter/summary_formatter.d.ts +1 -0
- package/lib/formatter/summary_formatter.js +10 -10
- package/lib/formatter/summary_formatter.js.map +1 -1
- package/lib/formatter/usage_formatter.d.ts +1 -0
- package/lib/formatter/usage_formatter.js +9 -9
- package/lib/formatter/usage_formatter.js.map +1 -1
- package/lib/formatter/usage_json_formatter.d.ts +1 -0
- package/lib/formatter/usage_json_formatter.js +3 -2
- package/lib/formatter/usage_json_formatter.js.map +1 -1
- package/lib/importer.js +13 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +6 -1
- package/lib/index.js.map +1 -1
- package/lib/models/data_table.js +9 -7
- package/lib/models/data_table.js.map +1 -1
- package/lib/models/step_definition.js +4 -5
- package/lib/models/step_definition.js.map +1 -1
- package/lib/pickle_filter.js +13 -13
- package/lib/pickle_filter.js.map +1 -1
- package/lib/run/formatters.d.ts +14 -0
- package/lib/run/formatters.js +76 -0
- package/lib/run/formatters.js.map +1 -0
- package/lib/run/index.d.ts +2 -0
- package/lib/run/index.js +15 -0
- package/lib/run/index.js.map +1 -0
- package/lib/run/paths.d.ts +6 -0
- package/lib/run/paths.js +83 -0
- package/lib/run/paths.js.map +1 -0
- package/lib/run/runCucumber.d.ts +3 -0
- package/lib/run/runCucumber.js +88 -0
- package/lib/run/runCucumber.js.map +1 -0
- package/lib/run/runtime.d.ts +19 -0
- package/lib/run/runtime.js +58 -0
- package/lib/run/runtime.js.map +1 -0
- package/lib/run/support.d.ts +8 -0
- package/lib/run/support.js +26 -0
- package/lib/run/support.js.map +1 -0
- package/lib/run/types.d.ts +12 -0
- package/lib/run/types.js +3 -0
- package/lib/run/types.js.map +1 -0
- package/lib/runtime/assemble_test_cases.js +3 -3
- package/lib/runtime/assemble_test_cases.js.map +1 -1
- package/lib/runtime/attachment_manager/index.js +4 -4
- package/lib/runtime/attachment_manager/index.js.map +1 -1
- package/lib/runtime/helpers.d.ts +1 -0
- package/lib/runtime/helpers.js +42 -4
- package/lib/runtime/helpers.js.map +1 -1
- package/lib/runtime/index.d.ts +5 -3
- package/lib/runtime/index.js +22 -46
- package/lib/runtime/index.js.map +1 -1
- package/lib/runtime/parallel/coordinator.d.ts +6 -5
- package/lib/runtime/parallel/coordinator.js +19 -22
- package/lib/runtime/parallel/coordinator.js.map +1 -1
- package/lib/runtime/parallel/run_worker.js +1 -1
- package/lib/runtime/parallel/run_worker.js.map +1 -1
- package/lib/runtime/parallel/worker.js +21 -13
- package/lib/runtime/parallel/worker.js.map +1 -1
- package/lib/runtime/step_runner.js +5 -7
- package/lib/runtime/step_runner.js.map +1 -1
- package/lib/runtime/stopwatch.js +4 -4
- package/lib/runtime/stopwatch.js.map +1 -1
- package/lib/runtime/test_case_runner.d.ts +3 -3
- package/lib/runtime/test_case_runner.js +19 -28
- package/lib/runtime/test_case_runner.js.map +1 -1
- package/lib/stack_trace_filter.js +6 -7
- package/lib/stack_trace_filter.js.map +1 -1
- package/lib/step_arguments.js +2 -2
- package/lib/step_arguments.js.map +1 -1
- package/lib/support_code_library_builder/{build_helpers.d.ts → build_parameter_type.d.ts} +0 -2
- package/lib/support_code_library_builder/build_parameter_type.js +13 -0
- package/lib/support_code_library_builder/build_parameter_type.js.map +1 -0
- package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +3 -0
- package/lib/support_code_library_builder/get_definition_line_and_uri.js +30 -0
- package/lib/support_code_library_builder/get_definition_line_and_uri.js.map +1 -0
- package/lib/support_code_library_builder/index.js +18 -31
- package/lib/support_code_library_builder/index.js.map +1 -1
- package/lib/support_code_library_builder/types.d.ts +2 -1
- package/lib/support_code_library_builder/types.js.map +1 -1
- package/lib/support_code_library_builder/validate_arguments.js +14 -19
- package/lib/support_code_library_builder/validate_arguments.js.map +1 -1
- package/lib/time.d.ts +1 -0
- package/lib/time.js +17 -2
- package/lib/time.js.map +1 -1
- package/lib/user_code_runner.js +10 -17
- package/lib/user_code_runner.js.map +1 -1
- package/lib/value_checker.d.ts +2 -2
- package/lib/value_checker.js.map +1 -1
- package/lib/version.d.ts +1 -0
- package/lib/version.js +6 -0
- package/lib/version.js.map +1 -0
- package/lib/wrapper.mjs +38 -0
- package/package.json +77 -67
- package/CHANGELOG.md +0 -1908
- package/lib/support_code_library_builder/build_helpers.js +0 -41
- package/lib/support_code_library_builder/build_helpers.js.map +0 -1
- package/lib/support_code_library_builder/finalize_helpers.d.ts +0 -10
- package/lib/support_code_library_builder/finalize_helpers.js +0 -26
- package/lib/support_code_library_builder/finalize_helpers.js.map +0 -1
|
@@ -18,28 +18,25 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
18
18
|
__setModuleDefault(result, mod);
|
|
19
19
|
return result;
|
|
20
20
|
};
|
|
21
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
22
|
exports.parseTestCaseAttempt = void 0;
|
|
26
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
27
23
|
const keyword_type_1 = require("./keyword_type");
|
|
28
24
|
const gherkin_document_parser_1 = require("./gherkin_document_parser");
|
|
29
25
|
const pickle_parser_1 = require("./pickle_parser");
|
|
30
26
|
const messages = __importStar(require("@cucumber/messages"));
|
|
31
27
|
const value_checker_1 = require("../../value_checker");
|
|
28
|
+
const messages_1 = require("@cucumber/messages");
|
|
32
29
|
function parseStep({ isBeforeHook, gherkinStepMap, keyword, keywordType, pickleStep, pickleUri, snippetBuilder, supportCodeLibrary, testStep, testStepResult, testStepAttachments, }) {
|
|
33
30
|
const out = {
|
|
34
31
|
attachments: testStepAttachments,
|
|
35
|
-
keyword: value_checker_1.doesHaveValue(testStep.pickleStepId)
|
|
32
|
+
keyword: (0, value_checker_1.doesHaveValue)(testStep.pickleStepId)
|
|
36
33
|
? keyword
|
|
37
34
|
: isBeforeHook
|
|
38
35
|
? 'Before'
|
|
39
36
|
: 'After',
|
|
40
37
|
result: testStepResult,
|
|
41
38
|
};
|
|
42
|
-
if (value_checker_1.doesHaveValue(testStep.hookId)) {
|
|
39
|
+
if ((0, value_checker_1.doesHaveValue)(testStep.hookId)) {
|
|
43
40
|
let hookDefinition;
|
|
44
41
|
if (isBeforeHook) {
|
|
45
42
|
hookDefinition = supportCodeLibrary.beforeTestCaseHookDefinitions.find((x) => x.id === testStep.hookId);
|
|
@@ -52,7 +49,7 @@ function parseStep({ isBeforeHook, gherkinStepMap, keyword, keywordType, pickleS
|
|
|
52
49
|
line: hookDefinition.line,
|
|
53
50
|
};
|
|
54
51
|
}
|
|
55
|
-
if (value_checker_1.doesHaveValue(testStep.stepDefinitionIds) &&
|
|
52
|
+
if ((0, value_checker_1.doesHaveValue)(testStep.stepDefinitionIds) &&
|
|
56
53
|
testStep.stepDefinitionIds.length === 1) {
|
|
57
54
|
const stepDefinition = supportCodeLibrary.stepDefinitions.find((x) => x.id === testStep.stepDefinitionIds[0]);
|
|
58
55
|
out.actionLocation = {
|
|
@@ -60,13 +57,13 @@ function parseStep({ isBeforeHook, gherkinStepMap, keyword, keywordType, pickleS
|
|
|
60
57
|
line: stepDefinition.line,
|
|
61
58
|
};
|
|
62
59
|
}
|
|
63
|
-
if (value_checker_1.doesHaveValue(testStep.pickleStepId)) {
|
|
60
|
+
if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) {
|
|
64
61
|
out.sourceLocation = {
|
|
65
62
|
uri: pickleUri,
|
|
66
63
|
line: gherkinStepMap[pickleStep.astNodeIds[0]].location.line,
|
|
67
64
|
};
|
|
68
65
|
out.text = pickleStep.text;
|
|
69
|
-
if (value_checker_1.doesHaveValue(pickleStep.argument)) {
|
|
66
|
+
if ((0, value_checker_1.doesHaveValue)(pickleStep.argument)) {
|
|
70
67
|
out.argument = pickleStep.argument;
|
|
71
68
|
}
|
|
72
69
|
}
|
|
@@ -79,30 +76,30 @@ function parseStep({ isBeforeHook, gherkinStepMap, keyword, keywordType, pickleS
|
|
|
79
76
|
// displaying it in a pretty format
|
|
80
77
|
function parseTestCaseAttempt({ cwd, testCaseAttempt, snippetBuilder, supportCodeLibrary, }) {
|
|
81
78
|
const { testCase, pickle, gherkinDocument } = testCaseAttempt;
|
|
82
|
-
const gherkinStepMap = gherkin_document_parser_1.getGherkinStepMap(gherkinDocument);
|
|
83
|
-
const gherkinScenarioLocationMap = gherkin_document_parser_1.getGherkinScenarioLocationMap(gherkinDocument);
|
|
84
|
-
const pickleStepMap = pickle_parser_1.getPickleStepMap(pickle);
|
|
79
|
+
const gherkinStepMap = (0, gherkin_document_parser_1.getGherkinStepMap)(gherkinDocument);
|
|
80
|
+
const gherkinScenarioLocationMap = (0, gherkin_document_parser_1.getGherkinScenarioLocationMap)(gherkinDocument);
|
|
81
|
+
const pickleStepMap = (0, pickle_parser_1.getPickleStepMap)(pickle);
|
|
85
82
|
const relativePickleUri = pickle.uri;
|
|
86
83
|
const parsedTestCase = {
|
|
87
84
|
attempt: testCaseAttempt.attempt,
|
|
88
85
|
name: pickle.name,
|
|
89
86
|
sourceLocation: {
|
|
90
87
|
uri: relativePickleUri,
|
|
91
|
-
line: gherkinScenarioLocationMap[
|
|
88
|
+
line: gherkinScenarioLocationMap[pickle.astNodeIds[pickle.astNodeIds.length - 1]].line,
|
|
92
89
|
},
|
|
93
90
|
worstTestStepResult: testCaseAttempt.worstTestStepResult,
|
|
94
91
|
};
|
|
95
92
|
const parsedTestSteps = [];
|
|
96
93
|
let isBeforeHook = true;
|
|
97
94
|
let previousKeywordType = keyword_type_1.KeywordType.Precondition;
|
|
98
|
-
|
|
99
|
-
const testStepResult = testCaseAttempt.stepResults[testStep.id];
|
|
100
|
-
isBeforeHook = isBeforeHook && value_checker_1.doesHaveValue(testStep.hookId);
|
|
95
|
+
testCase.testSteps.forEach((testStep) => {
|
|
96
|
+
const testStepResult = testCaseAttempt.stepResults[testStep.id] || new messages_1.TestStepResult();
|
|
97
|
+
isBeforeHook = isBeforeHook && (0, value_checker_1.doesHaveValue)(testStep.hookId);
|
|
101
98
|
let keyword, keywordType, pickleStep;
|
|
102
|
-
if (value_checker_1.doesHaveValue(testStep.pickleStepId)) {
|
|
99
|
+
if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) {
|
|
103
100
|
pickleStep = pickleStepMap[testStep.pickleStepId];
|
|
104
|
-
keyword = pickle_parser_1.getStepKeyword({ pickleStep, gherkinStepMap });
|
|
105
|
-
keywordType = keyword_type_1.getStepKeywordType({
|
|
101
|
+
keyword = (0, pickle_parser_1.getStepKeyword)({ pickleStep, gherkinStepMap });
|
|
102
|
+
keywordType = (0, keyword_type_1.getStepKeywordType)({
|
|
106
103
|
keyword,
|
|
107
104
|
language: gherkinDocument.feature.language,
|
|
108
105
|
previousKeywordType,
|
|
@@ -119,7 +116,7 @@ function parseTestCaseAttempt({ cwd, testCaseAttempt, snippetBuilder, supportCod
|
|
|
119
116
|
supportCodeLibrary,
|
|
120
117
|
testStep,
|
|
121
118
|
testStepResult,
|
|
122
|
-
testStepAttachments: value_checker_1.valueOrDefault(testCaseAttempt.stepAttachments[testStep.id], []),
|
|
119
|
+
testStepAttachments: (0, value_checker_1.valueOrDefault)(testCaseAttempt.stepAttachments[testStep.id], []),
|
|
123
120
|
});
|
|
124
121
|
parsedTestSteps.push(parsedStep);
|
|
125
122
|
previousKeywordType = keywordType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_case_attempt_parser.js","sourceRoot":"","sources":["../../../src/formatter/helpers/test_case_attempt_parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test_case_attempt_parser.js","sourceRoot":"","sources":["../../../src/formatter/helpers/test_case_attempt_parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { getStepKeywordType, KeywordType } from './keyword_type'\nimport {\n getGherkinScenarioLocationMap,\n getGherkinStepMap,\n} from './gherkin_document_parser'\nimport { getPickleStepMap, getStepKeyword } from './pickle_parser'\nimport * as messages from '@cucumber/messages'\nimport { ITestCaseAttempt } from './event_data_collector'\nimport StepDefinitionSnippetBuilder from '../step_definition_snippet_builder'\nimport { ISupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { doesHaveValue, valueOrDefault } from '../../value_checker'\nimport TestCaseHookDefinition from '../../models/test_case_hook_definition'\nimport { ILineAndUri } from '../../types'\nimport { TestStepResult } from '@cucumber/messages'\n\nexport interface IParsedTestStep {\n actionLocation?: ILineAndUri\n argument?: messages.PickleStepArgument\n attachments: messages.Attachment[]\n keyword: string\n result: messages.TestStepResult\n snippet?: string\n sourceLocation?: ILineAndUri\n text?: string\n}\n\nexport interface IParsedTestCase {\n attempt: number\n name: string\n sourceLocation?: ILineAndUri\n worstTestStepResult: messages.TestStepResult\n}\n\nexport interface IParsedTestCaseAttempt {\n testCase: IParsedTestCase\n testSteps: IParsedTestStep[]\n}\n\ninterface IParseStepRequest {\n isBeforeHook: boolean\n gherkinStepMap: Record<string, messages.Step>\n keyword: string\n keywordType: KeywordType\n pickleStep: messages.PickleStep\n pickleUri: string\n snippetBuilder: StepDefinitionSnippetBuilder\n supportCodeLibrary: ISupportCodeLibrary\n testStep: messages.TestStep\n testStepResult: messages.TestStepResult\n testStepAttachments: messages.Attachment[]\n}\n\nfunction parseStep({\n isBeforeHook,\n gherkinStepMap,\n keyword,\n keywordType,\n pickleStep,\n pickleUri,\n snippetBuilder,\n supportCodeLibrary,\n testStep,\n testStepResult,\n testStepAttachments,\n}: IParseStepRequest): IParsedTestStep {\n const out: IParsedTestStep = {\n attachments: testStepAttachments,\n keyword: doesHaveValue(testStep.pickleStepId)\n ? keyword\n : isBeforeHook\n ? 'Before'\n : 'After',\n result: testStepResult,\n }\n if (doesHaveValue(testStep.hookId)) {\n let hookDefinition: TestCaseHookDefinition\n if (isBeforeHook) {\n hookDefinition = supportCodeLibrary.beforeTestCaseHookDefinitions.find(\n (x) => x.id === testStep.hookId\n )\n } else {\n hookDefinition = supportCodeLibrary.afterTestCaseHookDefinitions.find(\n (x) => x.id === testStep.hookId\n )\n }\n out.actionLocation = {\n uri: hookDefinition.uri,\n line: hookDefinition.line,\n }\n }\n if (\n doesHaveValue(testStep.stepDefinitionIds) &&\n testStep.stepDefinitionIds.length === 1\n ) {\n const stepDefinition = supportCodeLibrary.stepDefinitions.find(\n (x) => x.id === testStep.stepDefinitionIds[0]\n )\n out.actionLocation = {\n uri: stepDefinition.uri,\n line: stepDefinition.line,\n }\n }\n if (doesHaveValue(testStep.pickleStepId)) {\n out.sourceLocation = {\n uri: pickleUri,\n line: gherkinStepMap[pickleStep.astNodeIds[0]].location.line,\n }\n out.text = pickleStep.text\n if (doesHaveValue(pickleStep.argument)) {\n out.argument = pickleStep.argument\n }\n }\n if (testStepResult.status === messages.TestStepResultStatus.UNDEFINED) {\n out.snippet = snippetBuilder.build({ keywordType, pickleStep })\n }\n return out\n}\n\nexport interface IParseTestCaseAttemptRequest {\n cwd: string\n testCaseAttempt: ITestCaseAttempt\n snippetBuilder: StepDefinitionSnippetBuilder\n supportCodeLibrary: ISupportCodeLibrary\n}\n\n// Converts a testCaseAttempt into a json object with all data needed for\n// displaying it in a pretty format\nexport function parseTestCaseAttempt({\n cwd,\n testCaseAttempt,\n snippetBuilder,\n supportCodeLibrary,\n}: IParseTestCaseAttemptRequest): IParsedTestCaseAttempt {\n const { testCase, pickle, gherkinDocument } = testCaseAttempt\n const gherkinStepMap = getGherkinStepMap(gherkinDocument)\n const gherkinScenarioLocationMap =\n getGherkinScenarioLocationMap(gherkinDocument)\n const pickleStepMap = getPickleStepMap(pickle)\n const relativePickleUri = pickle.uri\n const parsedTestCase: IParsedTestCase = {\n attempt: testCaseAttempt.attempt,\n name: pickle.name,\n sourceLocation: {\n uri: relativePickleUri,\n line: gherkinScenarioLocationMap[\n pickle.astNodeIds[pickle.astNodeIds.length - 1]\n ].line,\n },\n worstTestStepResult: testCaseAttempt.worstTestStepResult,\n }\n const parsedTestSteps: IParsedTestStep[] = []\n let isBeforeHook = true\n let previousKeywordType = KeywordType.Precondition\n\n testCase.testSteps.forEach((testStep) => {\n const testStepResult =\n testCaseAttempt.stepResults[testStep.id] || new TestStepResult()\n\n isBeforeHook = isBeforeHook && doesHaveValue(testStep.hookId)\n\n let keyword, keywordType, pickleStep\n if (doesHaveValue(testStep.pickleStepId)) {\n pickleStep = pickleStepMap[testStep.pickleStepId]\n keyword = getStepKeyword({ pickleStep, gherkinStepMap })\n keywordType = getStepKeywordType({\n keyword,\n language: gherkinDocument.feature.language,\n previousKeywordType,\n })\n }\n const parsedStep = parseStep({\n isBeforeHook,\n gherkinStepMap,\n keyword,\n keywordType,\n pickleStep,\n pickleUri: relativePickleUri,\n snippetBuilder,\n supportCodeLibrary,\n testStep,\n testStepResult,\n testStepAttachments: valueOrDefault(\n testCaseAttempt.stepAttachments[testStep.id],\n []\n ),\n })\n parsedTestSteps.push(parsedStep)\n previousKeywordType = keywordType\n })\n return {\n testCase: parsedTestCase,\n testSteps: parsedTestSteps,\n }\n}\n"]}
|
|
@@ -18,23 +18,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
18
18
|
__setModuleDefault(result, mod);
|
|
19
19
|
return result;
|
|
20
20
|
};
|
|
21
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
22
|
-
var t = {};
|
|
23
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
24
|
-
t[p] = s[p];
|
|
25
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
26
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
27
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
28
|
-
t[p[i]] = s[p[i]];
|
|
29
|
-
}
|
|
30
|
-
return t;
|
|
31
|
-
};
|
|
32
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
33
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
34
|
-
};
|
|
35
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
22
|
exports.getUsage = void 0;
|
|
37
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
38
23
|
const pickle_parser_1 = require("../pickle_parser");
|
|
39
24
|
const gherkin_document_parser_1 = require("../gherkin_document_parser");
|
|
40
25
|
const messages = __importStar(require("@cucumber/messages"));
|
|
@@ -60,11 +45,11 @@ const unexecutedStatuses = [
|
|
|
60
45
|
];
|
|
61
46
|
function buildMapping({ cwd, stepDefinitions, eventDataCollector, }) {
|
|
62
47
|
const mapping = buildEmptyMapping(stepDefinitions);
|
|
63
|
-
|
|
64
|
-
const pickleStepMap = pickle_parser_1.getPickleStepMap(testCaseAttempt.pickle);
|
|
65
|
-
const gherkinStepMap = gherkin_document_parser_1.getGherkinStepMap(testCaseAttempt.gherkinDocument);
|
|
48
|
+
eventDataCollector.getTestCaseAttempts().forEach((testCaseAttempt) => {
|
|
49
|
+
const pickleStepMap = (0, pickle_parser_1.getPickleStepMap)(testCaseAttempt.pickle);
|
|
50
|
+
const gherkinStepMap = (0, gherkin_document_parser_1.getGherkinStepMap)(testCaseAttempt.gherkinDocument);
|
|
66
51
|
testCaseAttempt.testCase.testSteps.forEach((testStep) => {
|
|
67
|
-
if (value_checker_1.doesHaveValue(testStep.pickleStepId) &&
|
|
52
|
+
if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId) &&
|
|
68
53
|
testStep.stepDefinitionIds.length === 1) {
|
|
69
54
|
const stepDefinitionId = testStep.stepDefinitionIds[0];
|
|
70
55
|
const pickleStep = pickleStepMap[testStep.pickleStepId];
|
|
@@ -75,10 +60,10 @@ function buildMapping({ cwd, stepDefinitions, eventDataCollector, }) {
|
|
|
75
60
|
uri: testCaseAttempt.pickle.uri,
|
|
76
61
|
};
|
|
77
62
|
const { duration, status } = testCaseAttempt.stepResults[testStep.id];
|
|
78
|
-
if (!unexecutedStatuses.includes(status) && value_checker_1.doesHaveValue(duration)) {
|
|
63
|
+
if (!unexecutedStatuses.includes(status) && (0, value_checker_1.doesHaveValue)(duration)) {
|
|
79
64
|
match.duration = duration;
|
|
80
65
|
}
|
|
81
|
-
if (value_checker_1.doesHaveValue(mapping[stepDefinitionId])) {
|
|
66
|
+
if ((0, value_checker_1.doesHaveValue)(mapping[stepDefinitionId])) {
|
|
82
67
|
mapping[stepDefinitionId].matches.push(match);
|
|
83
68
|
}
|
|
84
69
|
}
|
|
@@ -86,32 +71,33 @@ function buildMapping({ cwd, stepDefinitions, eventDataCollector, }) {
|
|
|
86
71
|
});
|
|
87
72
|
return mapping;
|
|
88
73
|
}
|
|
89
|
-
function
|
|
90
|
-
if (
|
|
91
|
-
return
|
|
74
|
+
function normalizeDuration(duration) {
|
|
75
|
+
if (duration == null) {
|
|
76
|
+
return Number.MIN_SAFE_INTEGER;
|
|
92
77
|
}
|
|
93
|
-
return
|
|
78
|
+
return messages.TimeConversion.durationToMilliseconds(duration);
|
|
94
79
|
}
|
|
95
80
|
function buildResult(mapping) {
|
|
96
|
-
return
|
|
97
|
-
.map((
|
|
98
|
-
|
|
99
|
-
const sortedMatches =
|
|
100
|
-
(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.
|
|
81
|
+
return Object.keys(mapping)
|
|
82
|
+
.map((stepDefinitionId) => {
|
|
83
|
+
const { matches, ...rest } = mapping[stepDefinitionId];
|
|
84
|
+
const sortedMatches = matches.sort((a, b) => {
|
|
85
|
+
if (a.duration === b.duration) {
|
|
86
|
+
return a.text < b.text ? -1 : 1;
|
|
87
|
+
}
|
|
88
|
+
return normalizeDuration(b.duration) - normalizeDuration(a.duration);
|
|
89
|
+
});
|
|
90
|
+
const result = { matches: sortedMatches, ...rest };
|
|
91
|
+
const durations = matches
|
|
92
|
+
.filter((m) => m.duration != null)
|
|
93
|
+
.map((m) => m.duration);
|
|
108
94
|
if (durations.length > 0) {
|
|
109
|
-
|
|
95
|
+
const totalMilliseconds = durations.reduce((acc, x) => acc + messages.TimeConversion.durationToMilliseconds(x), 0);
|
|
96
|
+
result.meanDuration = messages.TimeConversion.millisecondsToDuration(totalMilliseconds / durations.length);
|
|
110
97
|
}
|
|
111
98
|
return result;
|
|
112
99
|
})
|
|
113
|
-
.
|
|
114
|
-
.value();
|
|
100
|
+
.sort((a, b) => normalizeDuration(b.meanDuration) - normalizeDuration(a.meanDuration));
|
|
115
101
|
}
|
|
116
102
|
function getUsage({ cwd, stepDefinitions, eventDataCollector, }) {
|
|
117
103
|
const mapping = buildMapping({ cwd, stepDefinitions, eventDataCollector });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/formatter/helpers/usage_helpers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/formatter/helpers/usage_helpers/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getPickleStepMap } from '../pickle_parser'\nimport { getGherkinStepMap } from '../gherkin_document_parser'\nimport * as messages from '@cucumber/messages'\nimport StepDefinition from '../../../models/step_definition'\nimport { doesHaveValue } from '../../../value_checker'\nimport EventDataCollector from '../event_data_collector'\n\nexport interface IUsageMatch {\n duration?: messages.Duration\n line: number\n text: string\n uri: string\n}\n\nexport interface IUsage {\n code: string\n line: number\n matches: IUsageMatch[]\n meanDuration?: messages.Duration\n pattern: string\n patternType: string\n uri: string\n}\n\nexport interface IGetUsageRequest {\n cwd: string\n eventDataCollector: EventDataCollector\n stepDefinitions: StepDefinition[]\n}\n\nfunction buildEmptyMapping(\n stepDefinitions: StepDefinition[]\n): Record<string, IUsage> {\n const mapping: Record<string, IUsage> = {}\n stepDefinitions.forEach((stepDefinition) => {\n mapping[stepDefinition.id] = {\n code: stepDefinition.unwrappedCode.toString(),\n line: stepDefinition.line,\n pattern: stepDefinition.expression.source,\n patternType: stepDefinition.expression.constructor.name,\n matches: [],\n uri: stepDefinition.uri,\n }\n })\n return mapping\n}\n\nconst unexecutedStatuses: readonly messages.TestStepResultStatus[] = [\n messages.TestStepResultStatus.AMBIGUOUS,\n messages.TestStepResultStatus.SKIPPED,\n messages.TestStepResultStatus.UNDEFINED,\n]\n\nfunction buildMapping({\n cwd,\n stepDefinitions,\n eventDataCollector,\n}: IGetUsageRequest): Record<string, IUsage> {\n const mapping = buildEmptyMapping(stepDefinitions)\n eventDataCollector.getTestCaseAttempts().forEach((testCaseAttempt) => {\n const pickleStepMap = getPickleStepMap(testCaseAttempt.pickle)\n const gherkinStepMap = getGherkinStepMap(testCaseAttempt.gherkinDocument)\n testCaseAttempt.testCase.testSteps.forEach((testStep) => {\n if (\n doesHaveValue(testStep.pickleStepId) &&\n testStep.stepDefinitionIds.length === 1\n ) {\n const stepDefinitionId = testStep.stepDefinitionIds[0]\n const pickleStep = pickleStepMap[testStep.pickleStepId]\n const gherkinStep = gherkinStepMap[pickleStep.astNodeIds[0]]\n const match: IUsageMatch = {\n line: gherkinStep.location.line,\n text: pickleStep.text,\n uri: testCaseAttempt.pickle.uri,\n }\n const { duration, status } = testCaseAttempt.stepResults[testStep.id]\n if (!unexecutedStatuses.includes(status) && doesHaveValue(duration)) {\n match.duration = duration\n }\n if (doesHaveValue(mapping[stepDefinitionId])) {\n mapping[stepDefinitionId].matches.push(match)\n }\n }\n })\n })\n return mapping\n}\n\nfunction normalizeDuration(duration?: messages.Duration): number {\n if (duration == null) {\n return Number.MIN_SAFE_INTEGER\n }\n return messages.TimeConversion.durationToMilliseconds(duration)\n}\n\nfunction buildResult(mapping: Record<string, IUsage>): IUsage[] {\n return Object.keys(mapping)\n .map((stepDefinitionId) => {\n const { matches, ...rest } = mapping[stepDefinitionId]\n const sortedMatches = matches.sort((a: IUsageMatch, b: IUsageMatch) => {\n if (a.duration === b.duration) {\n return a.text < b.text ? -1 : 1\n }\n return normalizeDuration(b.duration) - normalizeDuration(a.duration)\n })\n const result = { matches: sortedMatches, ...rest }\n const durations: messages.Duration[] = matches\n .filter((m) => m.duration != null)\n .map((m) => m.duration)\n if (durations.length > 0) {\n const totalMilliseconds = durations.reduce(\n (acc, x) => acc + messages.TimeConversion.durationToMilliseconds(x),\n 0\n )\n result.meanDuration = messages.TimeConversion.millisecondsToDuration(\n totalMilliseconds / durations.length\n )\n }\n return result\n })\n .sort(\n (a: IUsage, b: IUsage) =>\n normalizeDuration(b.meanDuration) - normalizeDuration(a.meanDuration)\n )\n}\n\nexport function getUsage({\n cwd,\n stepDefinitions,\n eventDataCollector,\n}: IGetUsageRequest): IUsage[] {\n const mapping = buildMapping({ cwd, stepDefinitions, eventDataCollector })\n return buildResult(mapping)\n}\n"]}
|
|
@@ -12,17 +12,17 @@ const util_1 = require("util");
|
|
|
12
12
|
class HtmlFormatter extends _1.default {
|
|
13
13
|
constructor(options) {
|
|
14
14
|
super(options);
|
|
15
|
-
const cucumberHtmlStream = new html_formatter_1.default(resolve_pkg_1.default('@cucumber/html-formatter', { cwd: __dirname }) +
|
|
16
|
-
'/dist/main.css', resolve_pkg_1.default('@cucumber/html-formatter', { cwd: __dirname }) +
|
|
15
|
+
const cucumberHtmlStream = new html_formatter_1.default((0, resolve_pkg_1.default)('@cucumber/html-formatter', { cwd: __dirname }) +
|
|
16
|
+
'/dist/main.css', (0, resolve_pkg_1.default)('@cucumber/html-formatter', { cwd: __dirname }) +
|
|
17
17
|
'/dist/main.js');
|
|
18
18
|
options.eventBroadcaster.on('envelope', (envelope) => {
|
|
19
19
|
cucumberHtmlStream.write(envelope);
|
|
20
|
-
if (value_checker_1.doesHaveValue(envelope.testRunFinished)) {
|
|
20
|
+
if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) {
|
|
21
21
|
cucumberHtmlStream.end();
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
24
|
cucumberHtmlStream.on('data', (chunk) => this.log(chunk));
|
|
25
|
-
this._finished = util_1.promisify(stream_1.finished)(cucumberHtmlStream);
|
|
25
|
+
this._finished = (0, util_1.promisify)(stream_1.finished)(cucumberHtmlStream);
|
|
26
26
|
}
|
|
27
27
|
async finished() {
|
|
28
28
|
await this._finished;
|
|
@@ -30,4 +30,5 @@ class HtmlFormatter extends _1.default {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
exports.default = HtmlFormatter;
|
|
33
|
+
HtmlFormatter.documentation = 'Outputs HTML report';
|
|
33
34
|
//# sourceMappingURL=html_formatter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html_formatter.js","sourceRoot":"","sources":["../../src/formatter/html_formatter.ts"],"names":[],"mappings":";;;;;AAAA,yCAAgD;AAEhD,8DAAoC;AACpC,8EAAyD;AACzD,oDAAgD;AAChD,mCAAiC;AACjC,+BAAgC;AAEhC,MAAqB,aAAc,SAAQ,UAAS;
|
|
1
|
+
{"version":3,"file":"html_formatter.js","sourceRoot":"","sources":["../../src/formatter/html_formatter.ts"],"names":[],"mappings":";;;;;AAAA,yCAAgD;AAEhD,8DAAoC;AACpC,8EAAyD;AACzD,oDAAgD;AAChD,mCAAiC;AACjC,+BAAgC;AAEhC,MAAqB,aAAc,SAAQ,UAAS;IAIlD,YAAY,OAA0B;QACpC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,MAAM,kBAAkB,GAAG,IAAI,wBAAkB,CAC/C,IAAA,qBAAU,EAAC,0BAA0B,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YACxD,gBAAgB,EAClB,IAAA,qBAAU,EAAC,0BAA0B,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YACxD,eAAe,CAClB,CAAA;QACD,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,QAA2B,EAAE,EAAE;YACtE,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAClC,IAAI,IAAA,6BAAa,EAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;gBAC3C,kBAAkB,CAAC,GAAG,EAAE,CAAA;aACzB;QACH,CAAC,CAAC,CAAA;QACF,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;QACzD,IAAI,CAAC,SAAS,GAAG,IAAA,gBAAS,EAAC,iBAAQ,CAAC,CAAC,kBAAkB,CAAC,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,SAAS,CAAA;QACpB,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAA;IACxB,CAAC;;AAzBH,gCA0BC;AAxBwB,2BAAa,GAAW,qBAAqB,CAAA","sourcesContent":["import Formatter, { IFormatterOptions } from '.'\nimport * as messages from '@cucumber/messages'\nimport resolvePkg from 'resolve-pkg'\nimport CucumberHtmlStream from '@cucumber/html-formatter'\nimport { doesHaveValue } from '../value_checker'\nimport { finished } from 'stream'\nimport { promisify } from 'util'\n\nexport default class HtmlFormatter extends Formatter {\n private readonly _finished: Promise<void>\n public static readonly documentation: string = 'Outputs HTML report'\n\n constructor(options: IFormatterOptions) {\n super(options)\n const cucumberHtmlStream = new CucumberHtmlStream(\n resolvePkg('@cucumber/html-formatter', { cwd: __dirname }) +\n '/dist/main.css',\n resolvePkg('@cucumber/html-formatter', { cwd: __dirname }) +\n '/dist/main.js'\n )\n options.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => {\n cucumberHtmlStream.write(envelope)\n if (doesHaveValue(envelope.testRunFinished)) {\n cucumberHtmlStream.end()\n }\n })\n cucumberHtmlStream.on('data', (chunk) => this.log(chunk))\n this._finished = promisify(finished)(cucumberHtmlStream)\n }\n\n async finished(): Promise<void> {\n await this._finished\n await super.finished()\n }\n}\n"]}
|
|
@@ -31,7 +31,7 @@ class HttpStream extends stream_1.Transform {
|
|
|
31
31
|
_write(chunk, encoding, callback) {
|
|
32
32
|
if (this.tempFile === undefined) {
|
|
33
33
|
tmp_1.default.file((err, name, fd) => {
|
|
34
|
-
if (value_checker_1.doesHaveValue(err))
|
|
34
|
+
if ((0, value_checker_1.doesHaveValue)(err))
|
|
35
35
|
return callback(err);
|
|
36
36
|
this.tempFilePath = name;
|
|
37
37
|
this.tempFile = fs_1.default.createWriteStream(name, { fd });
|
|
@@ -45,14 +45,14 @@ class HttpStream extends stream_1.Transform {
|
|
|
45
45
|
_final(callback) {
|
|
46
46
|
this.tempFile.end(() => {
|
|
47
47
|
this.sendHttpRequest(this.url, this.method, this.headers, (err1, res1) => {
|
|
48
|
-
if (value_checker_1.doesHaveValue(err1))
|
|
48
|
+
if ((0, value_checker_1.doesHaveValue)(err1))
|
|
49
49
|
return callback(err1);
|
|
50
50
|
this.pushResponseBody(res1, () => {
|
|
51
51
|
this.emitErrorUnlessHttp2xx(res1, this.url, this.method);
|
|
52
52
|
if (res1.statusCode === 202 &&
|
|
53
53
|
res1.headers.location !== undefined) {
|
|
54
54
|
this.sendHttpRequest(res1.headers.location, 'PUT', {}, (err2, res2) => {
|
|
55
|
-
if (value_checker_1.doesHaveValue(err2))
|
|
55
|
+
if ((0, value_checker_1.doesHaveValue)(err2))
|
|
56
56
|
return callback(err2);
|
|
57
57
|
this.emitErrorUnlessHttp2xx(res2, this.url, this.method);
|
|
58
58
|
callback();
|
|
@@ -80,13 +80,13 @@ class HttpStream extends stream_1.Transform {
|
|
|
80
80
|
this.emit('error', new Error(`Unexpected http status ${res.statusCode} from ${method} ${url}`));
|
|
81
81
|
}
|
|
82
82
|
sendHttpRequest(url, method, headers, callback) {
|
|
83
|
-
const httpx = value_checker_1.doesHaveValue(url.match(/^https:/)) ? https_1.default : http_1.default;
|
|
83
|
+
const httpx = (0, value_checker_1.doesHaveValue)(url.match(/^https:/)) ? https_1.default : http_1.default;
|
|
84
84
|
const additionalHttpHeaders = {};
|
|
85
85
|
const upload = method === 'PUT' || method === 'POST';
|
|
86
86
|
if (upload) {
|
|
87
87
|
additionalHttpHeaders['Content-Length'] = fs_1.default.statSync(this.tempFilePath).size;
|
|
88
88
|
}
|
|
89
|
-
const allHeaders =
|
|
89
|
+
const allHeaders = { ...headers, ...additionalHttpHeaders };
|
|
90
90
|
const req = httpx.request(url, {
|
|
91
91
|
method,
|
|
92
92
|
headers: allHeaders,
|
|
@@ -97,8 +97,8 @@ class HttpStream extends stream_1.Transform {
|
|
|
97
97
|
callback(null, res);
|
|
98
98
|
});
|
|
99
99
|
if (upload) {
|
|
100
|
-
stream_1.pipeline(fs_1.default.createReadStream(this.tempFilePath), req, (err) => {
|
|
101
|
-
if (value_checker_1.doesHaveValue(err)) {
|
|
100
|
+
(0, stream_1.pipeline)(fs_1.default.createReadStream(this.tempFilePath), req, (err) => {
|
|
101
|
+
if ((0, value_checker_1.doesHaveValue)(err)) {
|
|
102
102
|
this.emit('error', err);
|
|
103
103
|
}
|
|
104
104
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http_stream.js","sourceRoot":"","sources":["../../src/formatter/http_stream.ts"],"names":[],"mappings":";;;;;AAAA,mCAAsD;AACtD,8CAAqB;AACrB,4CAAmB;AACnB,gDAAuB;AACvB,kDAAyB;AACzB,oDAAgD;AAIhD;;;;;;;;;GASG;AACH,MAAqB,UAAW,SAAQ,kBAAS;IAI/C,YACmB,GAAW,EACX,MAAkB,EAClB,OAAiC;QAElD,KAAK,CAAC;YACJ,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAA;QANe,QAAG,GAAH,GAAG,CAAQ;QACX,WAAM,GAAN,MAAM,CAAY;QAClB,YAAO,GAAP,OAAO,CAA0B;IAKpD,CAAC;IAED,MAAM,CACJ,KAAU,EACV,QAAwB,EACxB,QAAsC;QAEtC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YAC/B,aAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;gBACzB,IAAI,6BAAa,
|
|
1
|
+
{"version":3,"file":"http_stream.js","sourceRoot":"","sources":["../../src/formatter/http_stream.ts"],"names":[],"mappings":"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","sourcesContent":["import { pipeline, Transform, Writable } from 'stream'\nimport tmp from 'tmp'\nimport fs from 'fs'\nimport http from 'http'\nimport https from 'https'\nimport { doesHaveValue } from '../value_checker'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT'\n\n/**\n * This Writable writes data to a HTTP/HTTPS URL.\n *\n * It has special handling for https://reports.cucumber.io/\n * which uses an API where the first request is a `GET`,\n * and if the response is 202 with a Location header, issues\n * a PUT request to that URL.\n *\n * 3xx redirects are not currently followed.\n */\nexport default class HttpStream extends Transform {\n private tempFilePath: string\n private tempFile: Writable\n\n constructor(\n private readonly url: string,\n private readonly method: HttpMethod,\n private readonly headers: http.OutgoingHttpHeaders\n ) {\n super({\n readableObjectMode: true,\n })\n }\n\n _write(\n chunk: any,\n encoding: BufferEncoding,\n callback: (err?: Error | null) => void\n ): void {\n if (this.tempFile === undefined) {\n tmp.file((err, name, fd) => {\n if (doesHaveValue(err)) return callback(err)\n this.tempFilePath = name\n this.tempFile = fs.createWriteStream(name, { fd })\n this.tempFile.write(chunk, encoding, callback)\n })\n } else {\n this.tempFile.write(chunk, encoding, callback)\n }\n }\n\n _final(callback: (error?: Error | null) => void): void {\n this.tempFile.end(() => {\n this.sendHttpRequest(\n this.url,\n this.method,\n this.headers,\n (err1, res1) => {\n if (doesHaveValue(err1)) return callback(err1)\n this.pushResponseBody(res1, () => {\n this.emitErrorUnlessHttp2xx(res1, this.url, this.method)\n if (\n res1.statusCode === 202 &&\n res1.headers.location !== undefined\n ) {\n this.sendHttpRequest(\n res1.headers.location,\n 'PUT',\n {},\n (err2, res2) => {\n if (doesHaveValue(err2)) return callback(err2)\n this.emitErrorUnlessHttp2xx(res2, this.url, this.method)\n callback()\n }\n )\n } else {\n callback()\n }\n })\n }\n )\n })\n }\n\n private pushResponseBody(res: http.IncomingMessage, done: () => void): void {\n let body = Buffer.alloc(0)\n res.on('data', (chunk) => {\n body = Buffer.concat([body, chunk])\n })\n res.on('end', () => {\n this.push(body.toString('utf-8'))\n done()\n })\n }\n\n private emitErrorUnlessHttp2xx(\n res: http.IncomingMessage,\n url: string,\n method: string\n ): void {\n if (res.statusCode >= 300)\n this.emit(\n 'error',\n new Error(\n `Unexpected http status ${res.statusCode} from ${method} ${url}`\n )\n )\n }\n\n private sendHttpRequest(\n url: string,\n method: HttpMethod,\n headers: http.OutgoingHttpHeaders,\n callback: (err?: Error | null, res?: http.IncomingMessage) => void\n ): void {\n const httpx = doesHaveValue(url.match(/^https:/)) ? https : http\n const additionalHttpHeaders: http.OutgoingHttpHeaders = {}\n\n const upload = method === 'PUT' || method === 'POST'\n if (upload) {\n additionalHttpHeaders['Content-Length'] = fs.statSync(\n this.tempFilePath\n ).size\n }\n\n const allHeaders = { ...headers, ...additionalHttpHeaders }\n const req = httpx.request(url, {\n method,\n headers: allHeaders,\n })\n req.on('error', (err) => this.emit('error', err))\n req.on('response', (res) => {\n res.on('error', (err) => this.emit('error', err))\n callback(null, res)\n })\n\n if (upload) {\n pipeline(fs.createReadStream(this.tempFilePath), req, (err) => {\n if (doesHaveValue(err)) {\n this.emit('error', err)\n }\n })\n } else {\n req.end()\n }\n }\n}\n"]}
|
package/lib/formatter/index.d.ts
CHANGED
|
@@ -33,6 +33,7 @@ export default class Formatter {
|
|
|
33
33
|
protected stream: WritableStream;
|
|
34
34
|
protected supportCodeLibrary: ISupportCodeLibrary;
|
|
35
35
|
private readonly cleanup;
|
|
36
|
+
static readonly documentation: string;
|
|
36
37
|
constructor(options: IFormatterOptions);
|
|
37
38
|
finished(): Promise<void>;
|
|
38
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatter/index.ts"],"names":[],"mappings":";;AAgCA,MAAqB,SAAS;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatter/index.ts"],"names":[],"mappings":";;AAgCA,MAAqB,SAAS;IAW5B,YAAY,OAA0B;QACpC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QAChC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;QACtB,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAA;QACpD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;QACtB,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAA;QACpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;CACF;AAzBD,4BAyBC","sourcesContent":["import { IColorFns } from './get_color_fns'\nimport { EventDataCollector } from './helpers'\nimport StepDefinitionSnippetBuilder from './step_definition_snippet_builder'\nimport { PassThrough, Writable as WritableStream } from 'stream'\nimport { ISupportCodeLibrary } from '../support_code_library_builder/types'\nimport { WriteStream as FsWriteStream } from 'fs'\nimport { WriteStream as TtyWriteStream } from 'tty'\nimport { EventEmitter } from 'events'\nimport { IParsedArgvFormatOptions } from '../cli/argv_parser'\nimport HttpStream from './http_stream'\n\nexport type IFormatterStream =\n | FsWriteStream\n | TtyWriteStream\n | PassThrough\n | HttpStream\nexport type IFormatterLogFn = (buffer: string | Uint8Array) => void\nexport type IFormatterCleanupFn = () => Promise<any>\n\nexport interface IFormatterOptions {\n colorFns: IColorFns\n cwd: string\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n log: IFormatterLogFn\n parsedArgvOptions: IParsedArgvFormatOptions\n snippetBuilder: StepDefinitionSnippetBuilder\n stream: WritableStream\n cleanup: IFormatterCleanupFn\n supportCodeLibrary: ISupportCodeLibrary\n}\n\nexport default class Formatter {\n protected colorFns: IColorFns\n protected cwd: string\n protected eventDataCollector: EventDataCollector\n protected log: IFormatterLogFn\n protected snippetBuilder: StepDefinitionSnippetBuilder\n protected stream: WritableStream\n protected supportCodeLibrary: ISupportCodeLibrary\n private readonly cleanup: IFormatterCleanupFn\n static readonly documentation: string\n\n constructor(options: IFormatterOptions) {\n this.colorFns = options.colorFns\n this.cwd = options.cwd\n this.eventDataCollector = options.eventDataCollector\n this.log = options.log\n this.snippetBuilder = options.snippetBuilder\n this.stream = options.stream\n this.supportCodeLibrary = options.supportCodeLibrary\n this.cleanup = options.cleanup\n }\n\n async finished(): Promise<void> {\n await this.cleanup()\n }\n}\n"]}
|
|
@@ -56,6 +56,7 @@ interface IBuildJsonStepOptions {
|
|
|
56
56
|
testStepResult: messages.TestStepResult;
|
|
57
57
|
}
|
|
58
58
|
export default class JsonFormatter extends Formatter {
|
|
59
|
+
static readonly documentation: string;
|
|
59
60
|
constructor(options: IFormatterOptions);
|
|
60
61
|
convertNameToId(obj: messages.Feature | messages.Pickle): string;
|
|
61
62
|
formatDataTable(dataTable: messages.PickleTable): any;
|