@lynxwall/cucumber-tsflow 6.0.2 → 6.1.1

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 (98) hide show
  1. package/bin/cucumber-tsflow +0 -0
  2. package/lib/behave.d.ts +1 -1
  3. package/lib/behave.js +27 -27
  4. package/lib/cli/argv-parser.d.ts +24 -24
  5. package/lib/cli/argv-parser.js +103 -103
  6. package/lib/cli/index.d.ts +22 -22
  7. package/lib/cli/index.js +100 -100
  8. package/lib/cli/load-configuration.d.ts +20 -20
  9. package/lib/cli/load-configuration.js +90 -93
  10. package/lib/cli/run.d.ts +1 -1
  11. package/lib/cli/run.js +47 -49
  12. package/lib/cucumber/binding-decorator.d.ts +10 -10
  13. package/lib/cucumber/binding-decorator.js +180 -180
  14. package/lib/cucumber/binding-registry.d.ts +82 -82
  15. package/lib/cucumber/binding-registry.js +215 -215
  16. package/lib/cucumber/hook-decorators.d.ts +46 -46
  17. package/lib/cucumber/hook-decorators.js +102 -102
  18. package/lib/cucumber/managed-scenario-context.d.ts +21 -21
  19. package/lib/cucumber/managed-scenario-context.js +95 -95
  20. package/lib/cucumber/message-collector.d.ts +81 -81
  21. package/lib/cucumber/message-collector.js +250 -250
  22. package/lib/cucumber/parallel/coordinator.d.ts +79 -79
  23. package/lib/cucumber/parallel/coordinator.js +246 -246
  24. package/lib/cucumber/parallel/run-worker.d.ts +1 -1
  25. package/lib/cucumber/parallel/run-worker.js +31 -31
  26. package/lib/cucumber/parallel/worker.d.ts +30 -30
  27. package/lib/cucumber/parallel/worker.js +103 -103
  28. package/lib/cucumber/run-cucumber.d.ts +14 -14
  29. package/lib/cucumber/run-cucumber.js +117 -117
  30. package/lib/cucumber/runtime.d.ts +25 -25
  31. package/lib/cucumber/runtime.js +39 -39
  32. package/lib/cucumber/step-definition-decorators.d.ts +24 -24
  33. package/lib/cucumber/step-definition-decorators.js +91 -91
  34. package/lib/cucumber/utils.d.ts +16 -16
  35. package/lib/cucumber/utils.js +77 -77
  36. package/lib/esnode.js +18 -18
  37. package/lib/esvue.d.ts +1 -1
  38. package/lib/esvue.js +40 -40
  39. package/lib/formatters/behave-json-formatter.d.ts +49 -49
  40. package/lib/formatters/behave-json-formatter.js +74 -74
  41. package/lib/formatters/tsflow-snippet-syntax.d.ts +9 -9
  42. package/lib/formatters/tsflow-snippet-syntax.js +89 -89
  43. package/lib/gherkin/configuration.d.ts +30 -30
  44. package/lib/gherkin/configuration.js +26 -26
  45. package/lib/gherkin/gherkin-feature.d.ts +28 -28
  46. package/lib/gherkin/gherkin-feature.js +353 -333
  47. package/lib/gherkin/gherkin-manager.d.ts +29 -29
  48. package/lib/gherkin/gherkin-manager.js +143 -114
  49. package/lib/gherkin/models.d.ts +46 -45
  50. package/lib/gherkin/models.js +2 -2
  51. package/lib/index.d.ts +4 -4
  52. package/lib/index.js +22 -22
  53. package/lib/snippet.d.ts +1 -1
  54. package/lib/snippet.js +27 -27
  55. package/lib/transpilers/esbuild-transpiler.d.ts +4 -4
  56. package/lib/transpilers/esbuild-transpiler.js +18 -18
  57. package/lib/transpilers/esbuild.d.ts +12 -12
  58. package/lib/transpilers/esbuild.js +54 -54
  59. package/lib/transpilers/vue-sfc/compiler.d.ts +7 -7
  60. package/lib/transpilers/vue-sfc/compiler.js +21 -21
  61. package/lib/transpilers/vue-sfc/index.d.ts +23 -23
  62. package/lib/transpilers/vue-sfc/index.js +46 -46
  63. package/lib/transpilers/vue-sfc/main.d.ts +8 -8
  64. package/lib/transpilers/vue-sfc/main.js +247 -247
  65. package/lib/transpilers/vue-sfc/script.d.ts +5 -5
  66. package/lib/transpilers/vue-sfc/script.js +41 -41
  67. package/lib/transpilers/vue-sfc/template.d.ts +8 -8
  68. package/lib/transpilers/vue-sfc/template.js +101 -101
  69. package/lib/transpilers/vue-sfc/types.d.ts +55 -55
  70. package/lib/transpilers/vue-sfc/types.js +2 -2
  71. package/lib/transpilers/vue-sfc/utils/descriptorCache.d.ts +13 -13
  72. package/lib/transpilers/vue-sfc/utils/descriptorCache.js +67 -67
  73. package/lib/transpilers/vue-sfc/utils/error.d.ts +3 -3
  74. package/lib/transpilers/vue-sfc/utils/error.js +22 -22
  75. package/lib/transpilers/vue-sfc/utils/query.d.ts +13 -13
  76. package/lib/transpilers/vue-sfc/utils/query.js +35 -35
  77. package/lib/tsnode.js +17 -17
  78. package/lib/tsvue.d.ts +1 -1
  79. package/lib/tsvue.js +39 -39
  80. package/lib/types/scenario-context.d.ts +16 -16
  81. package/lib/types/scenario-context.js +17 -17
  82. package/lib/types/scenario-info.d.ts +16 -16
  83. package/lib/types/scenario-info.js +22 -22
  84. package/lib/types/step-binding-flags.d.ts +53 -53
  85. package/lib/types/step-binding-flags.js +58 -58
  86. package/lib/types/step-binding.d.ts +50 -50
  87. package/lib/types/step-binding.js +17 -17
  88. package/lib/types/types.d.ts +21 -21
  89. package/lib/types/types.js +2 -2
  90. package/lib/utils/helpers.d.ts +6 -6
  91. package/lib/utils/helpers.js +17 -17
  92. package/lib/utils/logger.d.ts +3 -3
  93. package/lib/utils/logger.js +29 -29
  94. package/lib/utils/our-callsite.d.ts +27 -27
  95. package/lib/utils/our-callsite.js +72 -72
  96. package/lib/version.d.ts +1 -1
  97. package/lib/version.js +5 -5
  98. package/package.json +7 -7
@@ -1,333 +1,353 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- const fs_1 = require("fs");
27
- const glob_1 = require("glob");
28
- const messages = __importStar(require("@cucumber/messages"));
29
- const configuration_1 = require("./configuration");
30
- const src_1 = require("@cucumber/gherkin/dist/src");
31
- class GherkinFeature {
32
- cwd = process.cwd();
33
- loadFeature = (featureFilePath, options) => {
34
- try {
35
- const featureText = (0, fs_1.readFileSync)(featureFilePath, 'utf8');
36
- return this.parseFeature(featureText, featureFilePath, options);
37
- }
38
- catch (err) {
39
- if (err.code === 'ENOENT') {
40
- throw new Error(`Feature file not found (${featureFilePath})`);
41
- }
42
- throw err;
43
- }
44
- };
45
- loadFeatures = (globPattern, options) => {
46
- const featureFiles = (0, glob_1.sync)(globPattern);
47
- return featureFiles.map(featureFilePath => this.loadFeature(featureFilePath, options));
48
- };
49
- parseFeature = (featureText, featureFilePath, options) => {
50
- let ast;
51
- options = (0, configuration_1.getJestCucumberConfiguration)(options);
52
- try {
53
- const builder = new src_1.AstBuilder(messages.IdGenerator.uuid());
54
- const matcher = new src_1.GherkinClassicTokenMatcher(); // or Gherkin.GherkinInMarkdownTokenMatcher()
55
- ast = new src_1.Parser(builder, matcher).parse(featureText);
56
- }
57
- catch (err) {
58
- throw new Error(`Error parsing feature Gherkin: ${err.message}`);
59
- }
60
- let astFeature = this.collapseRulesAndBackgrounds(ast.feature);
61
- if (astFeature.language !== 'en') {
62
- astFeature = this.translateKeywords(astFeature);
63
- }
64
- return {
65
- title: astFeature.name,
66
- featureFile: featureFilePath.replace(`${this.cwd}\\`, ''),
67
- scenarios: this.parseScenarios(astFeature),
68
- scenarioOutlines: this.parseScenarioOutlines(astFeature),
69
- tags: this.parseTags(astFeature),
70
- options
71
- };
72
- };
73
- parseDataTableRow = (astDataTableRow) => {
74
- return astDataTableRow.cells.map((col) => col.value);
75
- };
76
- parseDataTable = (astDataTable, astDataTableHeader) => {
77
- let headerRow;
78
- let bodyRows;
79
- if (astDataTableHeader) {
80
- headerRow = this.parseDataTableRow(astDataTableHeader);
81
- bodyRows = astDataTable;
82
- }
83
- else {
84
- headerRow = this.parseDataTableRow(astDataTable.rows[0]);
85
- bodyRows = astDataTable && astDataTable.rows && astDataTable.rows.length && astDataTable.rows.slice(1);
86
- }
87
- if (bodyRows && bodyRows.length > 0) {
88
- return bodyRows.map(nextRow => {
89
- const parsedRow = this.parseDataTableRow(nextRow);
90
- return parsedRow.reduce((rowObj, nextCol, index) => {
91
- return {
92
- ...rowObj,
93
- [headerRow[index]]: nextCol
94
- };
95
- }, {});
96
- });
97
- }
98
- else {
99
- return [];
100
- }
101
- };
102
- parseStepArgument = (astStep) => {
103
- if (astStep) {
104
- switch (astStep.argument) {
105
- case 'dataTable':
106
- return this.parseDataTable(astStep.dataTable);
107
- case 'docString':
108
- return astStep.docString.content;
109
- default:
110
- return null;
111
- }
112
- }
113
- else {
114
- return null;
115
- }
116
- };
117
- parseStep = (astStep) => {
118
- return {
119
- stepText: astStep.text,
120
- keyword: astStep.keyword.trim().toLowerCase(),
121
- stepArgument: this.parseStepArgument(astStep),
122
- lineNumber: astStep.location.line
123
- };
124
- };
125
- parseSteps = (astScenario) => {
126
- return astScenario.steps.map((astStep) => this.parseStep(astStep));
127
- };
128
- parseTags = (ast) => {
129
- if (!ast.tags) {
130
- return [];
131
- }
132
- else {
133
- return ast.tags.map((tag) => tag.name);
134
- }
135
- };
136
- parseScenario = (astScenario, astFeature) => {
137
- return {
138
- title: astScenario.name,
139
- steps: this.parseSteps(astScenario),
140
- tags: [...this.parseTags(astFeature), ...this.parseTags(astScenario)],
141
- lineNumber: astScenario.location.line,
142
- scenarioContext: undefined
143
- };
144
- };
145
- parseScenarioOutlineExampleSteps = (exampleTableRow, scenarioSteps) => {
146
- return scenarioSteps.map(scenarioStep => {
147
- const stepText = Object.keys(exampleTableRow).reduce((processedStepText, nextTableColumn) => {
148
- return processedStepText.replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
149
- }, scenarioStep.stepText);
150
- let stepArgument = '';
151
- if (scenarioStep.stepArgument) {
152
- if (Array.isArray(scenarioStep.stepArgument)) {
153
- stepArgument = scenarioStep.stepArgument.map((stepArgumentRow) => {
154
- const modifiedStepArgumentRow = { ...stepArgumentRow };
155
- Object.keys(exampleTableRow).forEach(nextTableColumn => {
156
- Object.keys(modifiedStepArgumentRow).forEach(prop => {
157
- modifiedStepArgumentRow[prop] = modifiedStepArgumentRow[prop].replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
158
- });
159
- });
160
- return modifiedStepArgumentRow;
161
- });
162
- }
163
- else {
164
- stepArgument = scenarioStep.stepArgument;
165
- if (typeof scenarioStep.stepArgument === 'string' || scenarioStep.stepArgument instanceof String) {
166
- Object.keys(exampleTableRow).forEach(nextTableColumn => {
167
- stepArgument = stepArgument.replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
168
- });
169
- }
170
- }
171
- }
172
- return {
173
- ...scenarioStep,
174
- stepText,
175
- stepArgument
176
- };
177
- });
178
- };
179
- getOutlineDynamicTitle = (exampleTableRow, title) => {
180
- return title.replace(/<(\S*)>/g, (_, firstMatch) => {
181
- return exampleTableRow[firstMatch || ''];
182
- });
183
- };
184
- parseScenarioOutlineExample = (exampleTableRow, outlineScenario, exampleSetTags) => {
185
- return {
186
- title: this.getOutlineDynamicTitle(exampleTableRow, outlineScenario.title),
187
- steps: this.parseScenarioOutlineExampleSteps(exampleTableRow, outlineScenario.steps),
188
- tags: Array.from(new Set([...outlineScenario.tags, ...exampleSetTags]))
189
- };
190
- };
191
- parseScenarioOutlineExampleSet = (astExampleSet, outlineScenario) => {
192
- const exampleTable = this.parseDataTable(astExampleSet.tableBody, astExampleSet.tableHeader);
193
- return exampleTable.map(tableRow => this.parseScenarioOutlineExample(tableRow, outlineScenario, this.parseTags(astExampleSet)));
194
- };
195
- parseScenarioOutlineExampleSets = (astExampleSets, outlineScenario) => {
196
- const exampleSets = astExampleSets.map((astExampleSet) => {
197
- return this.parseScenarioOutlineExampleSet(astExampleSet, outlineScenario);
198
- });
199
- return exampleSets.reduce((scenarios, nextExampleSet) => {
200
- return [...scenarios, ...nextExampleSet];
201
- }, []);
202
- };
203
- parseScenarioOutline = (astScenarioOutline, astFeature) => {
204
- const outlineScenario = this.parseScenario(astScenarioOutline.scenario, astFeature);
205
- return {
206
- title: outlineScenario.title,
207
- scenarios: this.parseScenarioOutlineExampleSets(astScenarioOutline.scenario.examples, outlineScenario),
208
- tags: outlineScenario.tags,
209
- steps: outlineScenario.steps,
210
- lineNumber: astScenarioOutline.scenario.location.line,
211
- scenarioContext: undefined
212
- };
213
- };
214
- parseScenarios = (astFeature) => {
215
- return astFeature.children
216
- .filter((child) => {
217
- const keywords = ['Scenario Outline', 'Scenario Template'];
218
- return child.scenario && keywords.indexOf(child.scenario.keyword) === -1;
219
- })
220
- .map((astScenario) => this.parseScenario(astScenario.scenario, astFeature));
221
- };
222
- parseScenarioOutlines = (astFeature) => {
223
- return astFeature.children
224
- .filter((child) => {
225
- const keywords = ['Scenario Outline', 'Scenario Template'];
226
- return child.scenario && keywords.indexOf(child.scenario.keyword) !== -1;
227
- })
228
- .map((astScenarioOutline) => this.parseScenarioOutline(astScenarioOutline, astFeature));
229
- };
230
- collapseBackgrounds = (astChildren, backgrounds) => {
231
- const backgroundSteps = backgrounds.reduce((allBackgroundSteps, nextBackground) => {
232
- return [...allBackgroundSteps, ...nextBackground.steps];
233
- }, []);
234
- astChildren.forEach(child => {
235
- if (child.scenario) {
236
- child.scenario.steps = [...backgroundSteps, ...child.scenario.steps];
237
- }
238
- });
239
- return astChildren;
240
- };
241
- parseBackgrounds = (ast) => {
242
- return ast.children.filter((child) => child.background).map((child) => child.background);
243
- };
244
- collapseRulesAndBackgrounds = (astFeature) => {
245
- const featureBackgrounds = this.parseBackgrounds(astFeature);
246
- const children = this.collapseBackgrounds(astFeature.children, featureBackgrounds).reduce((newChildren, nextChild) => {
247
- if (nextChild.rule) {
248
- const rule = nextChild.rule;
249
- const ruleBackgrounds = this.parseBackgrounds(rule);
250
- return [
251
- ...newChildren,
252
- ...this.collapseBackgrounds(rule.children, [...featureBackgrounds, ...ruleBackgrounds])
253
- ];
254
- }
255
- else {
256
- return [...newChildren, nextChild];
257
- }
258
- }, []);
259
- return {
260
- ...astFeature,
261
- children
262
- };
263
- };
264
- createTranslationMap = (translateDialect) => {
265
- const englishDialect = src_1.dialects.en;
266
- const translationMap = {};
267
- const props = [
268
- 'and',
269
- 'background',
270
- 'but',
271
- 'examples',
272
- 'feature',
273
- 'given',
274
- 'scenario',
275
- 'scenarioOutline',
276
- 'then',
277
- 'when',
278
- 'rule'
279
- ];
280
- for (const prop of props) {
281
- const dialectWords = translateDialect[prop];
282
- const translationWords = englishDialect[prop];
283
- let index = 0;
284
- let defaultWordIndex = null;
285
- for (const dialectWord of dialectWords) {
286
- // skip "* " word
287
- if (dialectWord.indexOf('*') !== 0) {
288
- if (translationWords[index] !== undefined) {
289
- translationMap[dialectWord] = translationWords[index];
290
- if (defaultWordIndex === null) {
291
- // set default when non is set yet
292
- defaultWordIndex = index;
293
- }
294
- }
295
- else {
296
- // index has undefined value, translate to default word
297
- if (defaultWordIndex !== null) {
298
- translationMap[dialectWord] = translationWords[defaultWordIndex];
299
- }
300
- else {
301
- throw new Error('No translation found for ' + dialectWord);
302
- }
303
- }
304
- }
305
- index++;
306
- }
307
- }
308
- return translationMap;
309
- };
310
- translateKeywords = (astFeature) => {
311
- const languageDialect = src_1.dialects[astFeature.language];
312
- const translationMap = this.createTranslationMap(languageDialect);
313
- astFeature.language = 'en';
314
- astFeature.keyword = translationMap[astFeature.keyword] || astFeature.keyword;
315
- for (const child of astFeature.children) {
316
- if (child.background) {
317
- child.background.keyword = translationMap[child.background.keyword] || child.background.keyword;
318
- }
319
- if (child.scenario) {
320
- child.scenario.keyword = translationMap[child.scenario.keyword] || child.scenario.keyword;
321
- for (const step of child.scenario.steps) {
322
- step.keyword = translationMap[step.keyword] || step.keyword;
323
- }
324
- for (const example of child.scenario.examples) {
325
- example.keyword = translationMap[example.keyword] || example.keyword;
326
- }
327
- }
328
- }
329
- return astFeature;
330
- };
331
- }
332
- exports.default = GherkinFeature;
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2hlcmtpbi1mZWF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2doZXJraW4vZ2hlcmtpbi1mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQkFBa0M7QUFDbEMsK0JBQXdDO0FBQ3hDLDZEQUErQztBQUMvQyxtREFBd0U7QUFDeEUsb0RBQStHO0FBRy9HLE1BQXFCLGNBQWM7SUFDMUIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUVyQixXQUFXLEdBQUcsQ0FBQyxlQUF1QixFQUFFLE9BQWlCLEVBQUUsRUFBRTtRQUNuRSxJQUFJO1lBQ0gsTUFBTSxXQUFXLEdBQVcsSUFBQSxpQkFBWSxFQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNoRTtRQUFDLE9BQU8sR0FBUSxFQUFFO1lBQ2xCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLGVBQWUsR0FBRyxDQUFDLENBQUM7YUFDL0Q7WUFFRCxNQUFNLEdBQUcsQ0FBQztTQUNWO0lBQ0YsQ0FBQyxDQUFDO0lBRUssWUFBWSxHQUFHLENBQUMsV0FBbUIsRUFBRSxPQUFpQixFQUFFLEVBQUU7UUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBQSxXQUFRLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0MsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUM7SUFFTSxZQUFZLEdBQUcsQ0FBQyxXQUFtQixFQUFFLGVBQXVCLEVBQUUsT0FBaUIsRUFBaUIs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
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const path = __importStar(require("path"));
27
+ const fs = __importStar(require("fs"));
28
+ const glob_1 = require("glob");
29
+ const messages = __importStar(require("@cucumber/messages"));
30
+ const configuration_1 = require("./configuration");
31
+ const src_1 = require("@cucumber/gherkin/dist/src");
32
+ class GherkinFeature {
33
+ cwd = process.cwd();
34
+ loadFeature = async (featureFilePath, addCwd, options) => {
35
+ try {
36
+ if (addCwd) {
37
+ featureFilePath = path.join(this.cwd, featureFilePath);
38
+ }
39
+ const featureText = await fs.promises.readFile(featureFilePath, { encoding: 'utf8' });
40
+ return this.parseFeature(featureText, featureFilePath, options);
41
+ }
42
+ catch (err) {
43
+ if (err.code === 'ENOENT') {
44
+ throw new Error(`Feature file not found (${featureFilePath})`);
45
+ }
46
+ else {
47
+ throw err;
48
+ }
49
+ }
50
+ };
51
+ loadFeatures = async (globPattern, options) => {
52
+ const featureFiles = await (0, glob_1.glob)(globPattern, { cwd: this.cwd });
53
+ return await Promise.all(featureFiles.map(featureFilePath => this.loadFeature(featureFilePath, true, options)));
54
+ };
55
+ parseFeature = (featureText, featureFilePath, options) => {
56
+ let ast;
57
+ options = (0, configuration_1.getJestCucumberConfiguration)(options);
58
+ try {
59
+ const builder = new src_1.AstBuilder(messages.IdGenerator.uuid());
60
+ const matcher = new src_1.GherkinClassicTokenMatcher(); // or Gherkin.GherkinInMarkdownTokenMatcher()
61
+ ast = new src_1.Parser(builder, matcher).parse(featureText);
62
+ }
63
+ catch (err) {
64
+ throw new Error(`Error parsing feature Gherkin: ${err.message}`);
65
+ }
66
+ let astFeature = this.collapseRulesAndBackgrounds(ast.feature);
67
+ if (astFeature.language !== 'en') {
68
+ astFeature = this.translateKeywords(astFeature);
69
+ }
70
+ return {
71
+ title: astFeature.name,
72
+ featureFile: featureFilePath,
73
+ scenarios: this.parseScenarios(astFeature),
74
+ scenarioOutlines: this.parseScenarioOutlines(astFeature),
75
+ tags: this.parseTags(astFeature),
76
+ options
77
+ };
78
+ };
79
+ parseDataTableRow = (astDataTableRow) => {
80
+ return astDataTableRow.cells.map((col) => col.value);
81
+ };
82
+ parseDataTable = (astDataTable, astDataTableHeader) => {
83
+ let headerRow;
84
+ let bodyRows;
85
+ if (astDataTableHeader) {
86
+ headerRow = this.parseDataTableRow(astDataTableHeader);
87
+ bodyRows = astDataTable;
88
+ }
89
+ else {
90
+ headerRow = this.parseDataTableRow(astDataTable.rows[0]);
91
+ bodyRows = astDataTable && astDataTable.rows && astDataTable.rows.length && astDataTable.rows.slice(1);
92
+ }
93
+ if (bodyRows && bodyRows.length > 0) {
94
+ return bodyRows.map(nextRow => {
95
+ const parsedRow = this.parseDataTableRow(nextRow);
96
+ return parsedRow.reduce((rowObj, nextCol, index) => {
97
+ return {
98
+ ...rowObj,
99
+ [headerRow[index]]: nextCol
100
+ };
101
+ }, {});
102
+ });
103
+ }
104
+ else {
105
+ return [];
106
+ }
107
+ };
108
+ parseStepArgument = (astStep) => {
109
+ if (astStep) {
110
+ switch (astStep.argument) {
111
+ case 'dataTable':
112
+ return this.parseDataTable(astStep.dataTable);
113
+ case 'docString':
114
+ return astStep.docString.content;
115
+ default:
116
+ return null;
117
+ }
118
+ }
119
+ else {
120
+ return null;
121
+ }
122
+ };
123
+ parseStep = (astStep) => {
124
+ return {
125
+ stepText: astStep.text,
126
+ keyword: astStep.keyword.trim().toLowerCase(),
127
+ stepArgument: this.parseStepArgument(astStep),
128
+ lineNumber: astStep.location.line
129
+ };
130
+ };
131
+ parseSteps = (astScenario) => {
132
+ return astScenario.steps.map((astStep) => this.parseStep(astStep));
133
+ };
134
+ parseTags = (ast) => {
135
+ if (!ast.tags) {
136
+ return [];
137
+ }
138
+ else {
139
+ return ast.tags.map((tag) => tag.name);
140
+ }
141
+ };
142
+ parseScenario = (astScenario, astFeature) => {
143
+ return {
144
+ title: astScenario.name,
145
+ steps: this.parseSteps(astScenario),
146
+ tags: [...this.parseTags(astFeature), ...this.parseTags(astScenario)],
147
+ lineNumber: astScenario.location.line,
148
+ scenarioContext: undefined
149
+ };
150
+ };
151
+ parseScenarioOutlineExampleSteps = (exampleTableRow, scenarioSteps) => {
152
+ return scenarioSteps.map(scenarioStep => {
153
+ const stepText = Object.keys(exampleTableRow).reduce((processedStepText, nextTableColumn) => {
154
+ return processedStepText.replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
155
+ }, scenarioStep.stepText);
156
+ let stepArgument = '';
157
+ if (scenarioStep.stepArgument) {
158
+ if (Array.isArray(scenarioStep.stepArgument)) {
159
+ stepArgument = scenarioStep.stepArgument.map((stepArgumentRow) => {
160
+ const modifiedStepArgumentRow = { ...stepArgumentRow };
161
+ const exampleKeys = Object.keys(exampleTableRow);
162
+ const modifiedKeys = Object.keys(modifiedStepArgumentRow);
163
+ if (exampleKeys.length > 0 && modifiedKeys.length > 0) {
164
+ const exampleLen = exampleKeys.length;
165
+ const modifiedLen = modifiedKeys.length;
166
+ for (let exampleIdx = 0; exampleIdx < exampleLen; exampleIdx++) {
167
+ const nextTableColumn = exampleKeys[exampleIdx];
168
+ for (let modifiedIdx = 0; modifiedIdx < modifiedLen; modifiedIdx++) {
169
+ const prop = modifiedKeys[modifiedIdx];
170
+ modifiedStepArgumentRow[prop] = modifiedStepArgumentRow[prop].replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
171
+ }
172
+ }
173
+ }
174
+ return modifiedStepArgumentRow;
175
+ });
176
+ }
177
+ else {
178
+ stepArgument = scenarioStep.stepArgument;
179
+ if (typeof scenarioStep.stepArgument === 'string' || scenarioStep.stepArgument instanceof String) {
180
+ const exampleKeys = Object.keys(exampleTableRow);
181
+ const exampleLen = exampleKeys.length;
182
+ if (exampleKeys.length > 0) {
183
+ for (let exampleIdx = 0; exampleIdx < exampleLen; exampleIdx++) {
184
+ const nextTableColumn = exampleKeys[exampleIdx];
185
+ stepArgument = stepArgument.replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ return {
192
+ ...scenarioStep,
193
+ stepText,
194
+ stepArgument
195
+ };
196
+ });
197
+ };
198
+ getOutlineDynamicTitle = (exampleTableRow, title) => {
199
+ return title.replace(/<(\S*)>/g, (_, firstMatch) => {
200
+ return exampleTableRow[firstMatch || ''];
201
+ });
202
+ };
203
+ parseScenarioOutlineExample = (exampleTableRow, outlineScenario, exampleSetTags) => {
204
+ return {
205
+ title: this.getOutlineDynamicTitle(exampleTableRow, outlineScenario.title),
206
+ steps: this.parseScenarioOutlineExampleSteps(exampleTableRow, outlineScenario.steps),
207
+ tags: Array.from(new Set([...outlineScenario.tags, ...exampleSetTags])),
208
+ exampleRow: exampleTableRow
209
+ };
210
+ };
211
+ parseScenarioOutlineExampleSet = (astExampleSet, outlineScenario) => {
212
+ const exampleTable = this.parseDataTable(astExampleSet.tableBody, astExampleSet.tableHeader);
213
+ return exampleTable.map(tableRow => this.parseScenarioOutlineExample(tableRow, outlineScenario, this.parseTags(astExampleSet)));
214
+ };
215
+ parseScenarioOutlineExampleSets = (astExampleSets, outlineScenario) => {
216
+ const exampleSets = astExampleSets.map((astExampleSet) => {
217
+ return this.parseScenarioOutlineExampleSet(astExampleSet, outlineScenario);
218
+ });
219
+ return exampleSets.reduce((scenarios, nextExampleSet) => {
220
+ return [...scenarios, ...nextExampleSet];
221
+ }, []);
222
+ };
223
+ parseScenarioOutline = (astScenarioOutline, astFeature) => {
224
+ const outlineScenario = this.parseScenario(astScenarioOutline.scenario, astFeature);
225
+ return {
226
+ title: outlineScenario.title,
227
+ tags: outlineScenario.tags,
228
+ exampleScenarios: this.parseScenarioOutlineExampleSets(astScenarioOutline.scenario.examples, outlineScenario),
229
+ steps: outlineScenario.steps,
230
+ lineNumber: astScenarioOutline.scenario.location.line,
231
+ scenarioContext: undefined
232
+ };
233
+ };
234
+ parseScenarios = (astFeature) => {
235
+ return astFeature.children
236
+ .filter((child) => {
237
+ const keywords = ['Scenario Outline', 'Scenario Template'];
238
+ return child.scenario && keywords.indexOf(child.scenario.keyword) === -1;
239
+ })
240
+ .map((astScenario) => this.parseScenario(astScenario.scenario, astFeature));
241
+ };
242
+ parseScenarioOutlines = (astFeature) => {
243
+ return astFeature.children
244
+ .filter((child) => {
245
+ const keywords = ['Scenario Outline', 'Scenario Template'];
246
+ return child.scenario && keywords.indexOf(child.scenario.keyword) !== -1;
247
+ })
248
+ .map((astScenarioOutline) => this.parseScenarioOutline(astScenarioOutline, astFeature));
249
+ };
250
+ collapseBackgrounds = (astChildren, backgrounds) => {
251
+ const backgroundSteps = backgrounds.reduce((allBackgroundSteps, nextBackground) => {
252
+ return [...allBackgroundSteps, ...nextBackground.steps];
253
+ }, []);
254
+ for (const child of astChildren) {
255
+ if (child.scenario) {
256
+ child.scenario.steps = [...backgroundSteps, ...child.scenario.steps];
257
+ }
258
+ }
259
+ return astChildren;
260
+ };
261
+ parseBackgrounds = (ast) => {
262
+ return ast.children.filter((child) => child.background).map((child) => child.background);
263
+ };
264
+ collapseRulesAndBackgrounds = (astFeature) => {
265
+ const featureBackgrounds = this.parseBackgrounds(astFeature);
266
+ const children = this.collapseBackgrounds(astFeature.children, featureBackgrounds).reduce((newChildren, nextChild) => {
267
+ if (nextChild.rule) {
268
+ const rule = nextChild.rule;
269
+ const ruleBackgrounds = this.parseBackgrounds(rule);
270
+ return [
271
+ ...newChildren,
272
+ ...this.collapseBackgrounds(rule.children, [...featureBackgrounds, ...ruleBackgrounds])
273
+ ];
274
+ }
275
+ else {
276
+ return [...newChildren, nextChild];
277
+ }
278
+ }, []);
279
+ return {
280
+ ...astFeature,
281
+ children
282
+ };
283
+ };
284
+ createTranslationMap = (translateDialect) => {
285
+ const englishDialect = src_1.dialects.en;
286
+ const translationMap = {};
287
+ const props = [
288
+ 'and',
289
+ 'background',
290
+ 'but',
291
+ 'examples',
292
+ 'feature',
293
+ 'given',
294
+ 'scenario',
295
+ 'scenarioOutline',
296
+ 'then',
297
+ 'when',
298
+ 'rule'
299
+ ];
300
+ for (const prop of props) {
301
+ const dialectWords = translateDialect[prop];
302
+ const translationWords = englishDialect[prop];
303
+ let index = 0;
304
+ let defaultWordIndex = null;
305
+ for (const dialectWord of dialectWords) {
306
+ // skip "* " word
307
+ if (dialectWord.indexOf('*') !== 0) {
308
+ if (translationWords[index] !== undefined) {
309
+ translationMap[dialectWord] = translationWords[index];
310
+ if (defaultWordIndex === null) {
311
+ // set default when non is set yet
312
+ defaultWordIndex = index;
313
+ }
314
+ }
315
+ else {
316
+ // index has undefined value, translate to default word
317
+ if (defaultWordIndex !== null) {
318
+ translationMap[dialectWord] = translationWords[defaultWordIndex];
319
+ }
320
+ else {
321
+ throw new Error('No translation found for ' + dialectWord);
322
+ }
323
+ }
324
+ }
325
+ index++;
326
+ }
327
+ }
328
+ return translationMap;
329
+ };
330
+ translateKeywords = (astFeature) => {
331
+ const languageDialect = src_1.dialects[astFeature.language];
332
+ const translationMap = this.createTranslationMap(languageDialect);
333
+ astFeature.language = 'en';
334
+ astFeature.keyword = translationMap[astFeature.keyword] || astFeature.keyword;
335
+ for (const child of astFeature.children) {
336
+ if (child.background) {
337
+ child.background.keyword = translationMap[child.background.keyword] || child.background.keyword;
338
+ }
339
+ if (child.scenario) {
340
+ child.scenario.keyword = translationMap[child.scenario.keyword] || child.scenario.keyword;
341
+ for (const step of child.scenario.steps) {
342
+ step.keyword = translationMap[step.keyword] || step.keyword;
343
+ }
344
+ for (const example of child.scenario.examples) {
345
+ example.keyword = translationMap[example.keyword] || example.keyword;
346
+ }
347
+ }
348
+ }
349
+ return astFeature;
350
+ };
351
+ }
352
+ exports.default = GherkinFeature;
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2hlcmtpbi1mZWF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2doZXJraW4vZ2hlcmtpbi1mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBQ3pCLCtCQUE0QjtBQUM1Qiw2REFBK0M7QUFDL0MsbURBQXdFO0FBQ3hFLG9EQUErRztBQUcvRyxNQUFxQixjQUFjO0lBQzFCLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFckIsV0FBVyxHQUFHLEtBQUssRUFBRSxlQUF1QixFQUFFLE1BQWUsRUFBRSxPQUFpQixFQUFFLEVBQUU7UUFDMUYsSUFBSTtZQUNILElBQUksTUFBTSxFQUFFO2dCQUNYLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7YUFDdkQ7WUFDRCxNQUFNLFdBQVcsR0FBVyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ2hFO1FBQUMsT0FBTyxHQUFRLEVBQUU7WUFDbEIsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsZUFBZSxHQUFHLENBQUMsQ0FBQzthQUMvRDtpQkFBTTtnQkFDTixNQUFNLEdBQUcsQ0FBQzthQUNWO1NBQ0Q7SUFDRixDQUFDLENBQUM7SUFFSyxZQUFZLEdBQUcsS0FBSyxFQUFFLFdBQW1CLEVBQUUsT0FBaUIsRUFBRSxFQUFFO1FBQ3RFLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBQSxXQUFJLEVBQUMs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