@lynxwall/cucumber-tsflow 6.1.1 → 6.2.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 (98) hide show
  1. package/README.md +62 -21
  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 +21 -22
  7. package/lib/cli/index.js +95 -101
  8. package/lib/cli/load-configuration.d.ts +20 -20
  9. package/lib/cli/load-configuration.js +101 -90
  10. package/lib/cli/run.d.ts +1 -1
  11. package/lib/cli/run.js +49 -47
  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 +118 -118
  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 +352 -352
  47. package/lib/gherkin/gherkin-manager.d.ts +29 -29
  48. package/lib/gherkin/gherkin-manager.js +143 -143
  49. package/lib/gherkin/models.d.ts +46 -46
  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 +59 -59
  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 +11 -11
@@ -1,353 +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 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;
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
353
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2hlcmtpbi1mZWF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2doZXJraW4vZ2hlcmtpbi1mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBQ3pCLCtCQUE0QjtBQUM1Qiw2REFBK0M7QUFDL0MsbURBQXdFO0FBQ3hFLG9EQUErRztBQUcvRyxNQUFxQixjQUFjO0lBQzFCLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFckIsV0FBVyxHQUFHLEtBQUssRUFBRSxlQUF1QixFQUFFLE1BQWUsRUFBRSxPQUFpQixFQUFFLEVBQUU7UUFDMUYsSUFBSTtZQUNILElBQUksTUFBTSxFQUFFO2dCQUNYLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7YUFDdkQ7WUFDRCxNQUFNLFdBQVcsR0FBVyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ2hFO1FBQUMsT0FBTyxHQUFRLEVBQUU7WUFDbEIsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsZUFBZSxHQUFHLENBQUMsQ0FBQzthQUMvRDtpQkFBTTtnQkFDTixNQUFNLEdBQUcsQ0FBQzthQUNWO1NBQ0Q7SUFDRixDQUFDLENBQUM7SUFFSyxZQUFZLEdBQUcsS0FBSyxFQUFFLFdBQW1CLEVBQUUsT0FBaUIsRUFBRSxFQUFFO1FBQ3RFLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBQSxXQUFJLEVBQUMs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