vitest-cucumber-plugin 0.5.6 → 0.6.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.
Files changed (192) hide show
  1. package/RELEASE_NOTES.md +3 -0
  2. package/dist/config.d.ts +11 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +2 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/generate/example.d.ts +5 -0
  7. package/dist/generate/example.d.ts.map +1 -0
  8. package/dist/generate/example.js +18 -0
  9. package/dist/generate/example.js.map +1 -0
  10. package/dist/generate/examples.d.ts +5 -0
  11. package/dist/generate/examples.d.ts.map +1 -0
  12. package/dist/generate/examples.js +46 -0
  13. package/dist/generate/examples.js.map +1 -0
  14. package/dist/generate/feature.d.ts +10 -0
  15. package/dist/generate/feature.d.ts.map +1 -0
  16. package/dist/generate/feature.js +77 -0
  17. package/dist/generate/feature.js.map +1 -0
  18. package/dist/generate/index.d.ts +3 -0
  19. package/dist/generate/index.d.ts.map +1 -0
  20. package/dist/generate/index.js +3 -0
  21. package/dist/generate/index.js.map +1 -0
  22. package/dist/generate/rule.d.ts +5 -0
  23. package/dist/generate/rule.d.ts.map +1 -0
  24. package/dist/generate/rule.js +19 -0
  25. package/dist/generate/rule.js.map +1 -0
  26. package/dist/generate/scenario-outline.d.ts +5 -0
  27. package/dist/generate/scenario-outline.d.ts.map +1 -0
  28. package/dist/generate/scenario-outline.js +18 -0
  29. package/dist/generate/scenario-outline.js.map +1 -0
  30. package/dist/generate/tests.d.ts +4 -0
  31. package/dist/generate/tests.d.ts.map +1 -0
  32. package/{src → dist}/generate/tests.js +10 -10
  33. package/dist/generate/tests.js.map +1 -0
  34. package/dist/generate/util.d.ts +6 -0
  35. package/dist/generate/util.d.ts.map +1 -0
  36. package/dist/generate/util.js +9 -0
  37. package/dist/generate/util.js.map +1 -0
  38. package/dist/gherkin-languages.json +3790 -0
  39. package/dist/gherkin-lexer-shared.d.ts +6 -0
  40. package/dist/gherkin-lexer-shared.d.ts.map +1 -0
  41. package/dist/gherkin-lexer-shared.js +4 -0
  42. package/dist/gherkin-lexer-shared.js.map +1 -0
  43. package/dist/gherkin-lexer.d.ts +4 -0
  44. package/dist/gherkin-lexer.d.ts.map +1 -0
  45. package/dist/gherkin-lexer.js +68 -0
  46. package/dist/gherkin-lexer.js.map +1 -0
  47. package/{src → dist}/gherkin.js +24 -31
  48. package/{src → dist}/gherkin.umd.js +23 -31
  49. package/dist/hooks.d.ts +25 -0
  50. package/dist/hooks.d.ts.map +1 -0
  51. package/dist/hooks.js +94 -0
  52. package/dist/hooks.js.map +1 -0
  53. package/dist/index.d.ts +4 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +4 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/logger.d.ts +5 -0
  58. package/dist/logger.d.ts.map +1 -0
  59. package/dist/logger.js +8 -0
  60. package/dist/logger.js.map +1 -0
  61. package/dist/parameterize.d.ts +3 -0
  62. package/dist/parameterize.d.ts.map +1 -0
  63. package/dist/parameterize.js +8 -0
  64. package/dist/parameterize.js.map +1 -0
  65. package/dist/parse.d.ts +3 -0
  66. package/dist/parse.d.ts.map +1 -0
  67. package/dist/parse.js +28 -0
  68. package/dist/parse.js.map +1 -0
  69. package/dist/state.d.ts +4 -0
  70. package/dist/state.d.ts.map +1 -0
  71. package/dist/state.js +2 -0
  72. package/dist/state.js.map +1 -0
  73. package/dist/statement.d.ts +71 -0
  74. package/dist/statement.d.ts.map +1 -0
  75. package/dist/statement.js +10 -0
  76. package/dist/statement.js.map +1 -0
  77. package/dist/steps.d.ts +20 -0
  78. package/dist/steps.d.ts.map +1 -0
  79. package/{src → dist}/steps.js +17 -24
  80. package/dist/steps.js.map +1 -0
  81. package/dist/tags.d.ts +5 -0
  82. package/dist/tags.d.ts.map +1 -0
  83. package/{src → dist}/tags.js +20 -33
  84. package/dist/tags.js.map +1 -0
  85. package/dist/vitest-cucumber-plugin.d.ts +13 -0
  86. package/dist/vitest-cucumber-plugin.d.ts.map +1 -0
  87. package/dist/vitest-cucumber-plugin.js +69 -0
  88. package/dist/vitest-cucumber-plugin.js.map +1 -0
  89. package/package.json +64 -34
  90. package/generate-parsers +0 -6
  91. package/rollup-gherkin.js +0 -10
  92. package/rollup-tags-expression.js +0 -10
  93. package/run-tests +0 -9
  94. package/src/generate/example.js +0 -21
  95. package/src/generate/examples.js +0 -49
  96. package/src/generate/feature.js +0 -72
  97. package/src/generate/index.js +0 -15
  98. package/src/generate/rule.js +0 -22
  99. package/src/generate/scenario-outline.js +0 -21
  100. package/src/generate/util.js +0 -9
  101. package/src/gherkin.ne +0 -217
  102. package/src/hooks.js +0 -78
  103. package/src/index.js +0 -92
  104. package/src/logger.js +0 -14
  105. package/src/parameterize.js +0 -7
  106. package/src/parse.js +0 -21
  107. package/src/tags-expression.ne +0 -43
  108. package/tests/background/features/background.feature +0 -25
  109. package/tests/background/features/step_definitions/steps.js +0 -30
  110. package/tests/background/features/support/hooks.js +0 -3
  111. package/tests/background/package-lock.json +0 -1204
  112. package/tests/background/package.json +0 -11
  113. package/tests/background/vite.config.js +0 -13
  114. package/tests/comments/features/is-it-friday.feature +0 -10
  115. package/tests/comments/features/step_definitions/stepdefs.js +0 -15
  116. package/tests/comments/package-lock.json +0 -1933
  117. package/tests/comments/package.json +0 -11
  118. package/tests/comments/vite.config.js +0 -9
  119. package/tests/data-tables/features/data-tables-escaping.feature +0 -27
  120. package/tests/data-tables/features/data-tables.feature +0 -44
  121. package/tests/data-tables/features/step_definitions/data-tables.js +0 -21
  122. package/tests/data-tables/package-lock.json +0 -1933
  123. package/tests/data-tables/package.json +0 -11
  124. package/tests/data-tables/vite.config.js +0 -13
  125. package/tests/doc-strings/features/doc-strings.feature +0 -21
  126. package/tests/doc-strings/features/step_definitions/doc-strings.js +0 -15
  127. package/tests/doc-strings/package-lock.json +0 -1933
  128. package/tests/doc-strings/package.json +0 -11
  129. package/tests/doc-strings/vite.config.js +0 -13
  130. package/tests/hooks/features/after-all.feature +0 -5
  131. package/tests/hooks/features/after.feature +0 -5
  132. package/tests/hooks/features/before-all.feature +0 -14
  133. package/tests/hooks/features/before-step.feature +0 -6
  134. package/tests/hooks/features/before.feature +0 -14
  135. package/tests/hooks/features/step_definitions/steps.js +0 -28
  136. package/tests/hooks/features/support/hooks.js +0 -75
  137. package/tests/hooks/features/support/tags-hooks.js +0 -11
  138. package/tests/hooks/features/tags.feature +0 -14
  139. package/tests/hooks/package-lock.json +0 -1204
  140. package/tests/hooks/package.json +0 -11
  141. package/tests/hooks/vite.config.js +0 -13
  142. package/tests/is-it-friday/features/is-it-friday.feature +0 -7
  143. package/tests/is-it-friday/features/step_definitions/stepdefs.js +0 -15
  144. package/tests/is-it-friday/package-lock.json +0 -1933
  145. package/tests/is-it-friday/package.json +0 -11
  146. package/tests/is-it-friday/vite.config.js +0 -13
  147. package/tests/is-it-friday-scenario-outline/features/is-it-friday.feature +0 -13
  148. package/tests/is-it-friday-scenario-outline/features/step_definitions/stepdefs.js +0 -15
  149. package/tests/is-it-friday-scenario-outline/package-lock.json +0 -1933
  150. package/tests/is-it-friday-scenario-outline/package.json +0 -11
  151. package/tests/is-it-friday-scenario-outline/vite.config.js +0 -9
  152. package/tests/is-it-friday-two-scenarios/features/is-it-friday.feature +0 -12
  153. package/tests/is-it-friday-two-scenarios/features/step_definitions/stepdefs.js +0 -19
  154. package/tests/is-it-friday-two-scenarios/package-lock.json +0 -1933
  155. package/tests/is-it-friday-two-scenarios/package.json +0 -11
  156. package/tests/is-it-friday-two-scenarios/vite.config.js +0 -9
  157. package/tests/is-it-friday-two-scenarios-multiple-feature-files/features/friday.feature +0 -7
  158. package/tests/is-it-friday-two-scenarios-multiple-feature-files/features/step_definitions/stepdefs.js +0 -19
  159. package/tests/is-it-friday-two-scenarios-multiple-feature-files/features/sunday.feature +0 -8
  160. package/tests/is-it-friday-two-scenarios-multiple-feature-files/package-lock.json +0 -1933
  161. package/tests/is-it-friday-two-scenarios-multiple-feature-files/package.json +0 -11
  162. package/tests/is-it-friday-two-scenarios-multiple-feature-files/vite.config.js +0 -9
  163. package/tests/keyword-aliases/features/scenario-outline.feature +0 -20
  164. package/tests/keyword-aliases/features/scenario.feature +0 -14
  165. package/tests/keyword-aliases/features/step_definitions/steps.js +0 -30
  166. package/tests/keyword-aliases/features/steps.feature +0 -28
  167. package/tests/keyword-aliases/features/support/hooks.js +0 -6
  168. package/tests/keyword-aliases/package-lock.json +0 -1933
  169. package/tests/keyword-aliases/package.json +0 -11
  170. package/tests/keyword-aliases/vite.config.js +0 -9
  171. package/tests/rule/features/rule.feature +0 -14
  172. package/tests/rule/features/step_definitions/stepdefs.js +0 -19
  173. package/tests/rule/package-lock.json +0 -1933
  174. package/tests/rule/package.json +0 -11
  175. package/tests/rule/vite.config.js +0 -9
  176. package/tests/tags/features/skip.feature +0 -9
  177. package/tests/tags/features/step_definitions/steps.js +0 -30
  178. package/tests/tags/features/support/hooks.js +0 -6
  179. package/tests/tags/features/tags-scenario-outline.feature +0 -37
  180. package/tests/tags/features/tags.feature +0 -26
  181. package/tests/tags/package-lock.json +0 -1204
  182. package/tests/tags/package.json +0 -11
  183. package/tests/tags/vite.config.js +0 -12
  184. package/tests/vue/features/step_definitions/test.js +0 -25
  185. package/tests/vue/features/support/components.js +0 -19
  186. package/tests/vue/features/test.feature +0 -10
  187. package/tests/vue/package-lock.json +0 -2164
  188. package/tests/vue/package.json +0 -18
  189. package/tests/vue/src/test.vue +0 -10
  190. package/tests/vue/vite.config.js +0 -15
  191. /package/{src → dist}/tags-expression.js +0 -0
  192. /package/{src → dist}/tags-expression.umd.js +0 -0
@@ -1,22 +0,0 @@
1
- import _ from 'lodash/fp.js';
2
- import { generateExample } from './index.js';
3
- import { escape, shouldSkip } from './util.js';
4
- import { log } from '../logger.js';
5
-
6
- export const generateRule = (config,rule) => {
7
- log.debug('generateRule config: '+JSON.stringify(config)+' rule: '+JSON.stringify(rule));
8
-
9
- const examplesCode = _.reduce((examplesCode,example) => {
10
- return examplesCode + generateExample(config,example);
11
- },'')(rule.examples);
12
-
13
- const skip = shouldSkip(config,rule.tags) ? '.skip' : '';
14
- const tagsStr = JSON.stringify(rule.tags);
15
-
16
- const code = ` // tags : ${tagsStr}
17
- describe${skip}('${escape(rule.type.name)}: ${escape(rule.name)}', () => {
18
- ${examplesCode}});
19
- `;
20
-
21
- return code;
22
- }
@@ -1,21 +0,0 @@
1
- import _ from 'lodash/fp.js';
2
- import { generateExamples } from './examples.js';
3
- import { escape, shouldSkip } from './util.js';
4
-
5
- export const generateScenarioOutline = (config,scenarioOutline) => {
6
- const examplesStatements = _.reduce((examplesStatements,examplesStatement) => {
7
- examplesStatement = _.set('tags',_.concat(scenarioOutline.tags,examplesStatement.tags),examplesStatement);
8
-
9
- return examplesStatements + generateExamples(config,scenarioOutline.steps,examplesStatement);
10
- },'')(scenarioOutline.examples);
11
-
12
- const skip = shouldSkip(config,scenarioOutline.tags) ? '.skip' : '';
13
-
14
- const code = ` // tags : ${JSON.stringify(scenarioOutline.tags)}
15
- describe${skip}('${escape(scenarioOutline.type.name)}: ${escape(scenarioOutline.name)}', () => {
16
- ${examplesStatements}
17
- });
18
- `;
19
-
20
- return code;
21
- }
@@ -1,9 +0,0 @@
1
- import _ from 'lodash/fp.js';
2
- import { log } from '../logger.js';
3
-
4
- export const escape = (str) => str.replace(/'/g,"\\'");
5
- export const shouldSkip = (config,tags) => {
6
- const result = !config.tagsFunction(tags);
7
- log.debug('shouldSkip? '+result+' tags: '+JSON.stringify(tags));
8
- return result;
9
- }
package/src/gherkin.ne DELETED
@@ -1,217 +0,0 @@
1
- @{%
2
- const fp = require('lodash/fp.js');
3
- const moo = require('moo');
4
- const lexer = moo.compile({
5
- emptyLine : { match: /^[ \t]*(?:\#[^\n]+)?\n/, lineBreaks : true },
6
- newline : { match : '\n', lineBreaks : true },
7
- ws : /[ \t]+/,
8
- at : '@',
9
- colon : ':',
10
- repeatStep : '*',
11
- pipe : '|',
12
- escapedPipe : '\\|',
13
- escapedNewline : '\\n',
14
- escapedBackSlash : '\\\\',
15
- scenarioOutline : ['Scenario Outline','Scenario Template'],
16
- docString : ['```','"""'],
17
- word : {
18
- match : /[^ \t\n\:\|\@\*]+/,
19
- type : moo.keywords({
20
- feature : 'Feature',
21
- examples : ['Examples','Scenarios'],
22
- given : 'Given',
23
- when : 'When',
24
- then : 'Then',
25
- repeatStep : ['And','But'],
26
- example : ['Example','Scenario'],
27
- background : 'Background',
28
- rule : 'Rule',
29
- }),
30
- },
31
- });
32
-
33
- const trimWhitespace = (cols,str) => {
34
- const lines = str.split('\n').slice(0,-1);
35
- return fp.reduce((s,line) => {
36
- return s+line.slice(cols)+'\n'
37
- },'')(lines);
38
- };
39
-
40
- const setRepeatStepTypesReducer = (steps,step) => {
41
- if (!fp.has('type.type',step)) {
42
- step = fp.set('type.type',fp.last(steps).type.type,step);
43
- }
44
- return fp.concat(steps,step);
45
- };
46
-
47
- const setRepeatStepTypes = (steps) => fp.reduce(setRepeatStepTypesReducer,[],steps);
48
-
49
- %}
50
-
51
- @lexer lexer
52
-
53
- main -> emptyLines tags feature {% data => fp.set('tags',data[1],data[2]) %}
54
-
55
- feature -> featureStatement freeform background statements {%
56
- (data) => fp.assign(data[0],{ description : data[1].trim(), background : data[2], statements : data[3] })
57
- %}
58
- featureStatement -> _ %feature _ %colon text %newline {%
59
- (data) => { return { type : { type : 'feature', name : data[1].value.trim() }, name : data[4].trim() } }
60
- %}
61
-
62
- tags -> null {% data => [] %}
63
- | _ tag tagList %newline {% data => fp.concat(data[1],data[2]) %}
64
-
65
- tagList -> null {% data => [] %}
66
- | tagList %ws tag {% data => fp.concat(data[0],data[2]) %}
67
-
68
- tag -> %at %word {% data => data[1].value.trim() %}
69
-
70
- background -> null {% data => null %}
71
- | backgroundStatement freeform steps {%
72
- data => fp.assign(data[0],{ description : data[1].trim(), steps : data[2] })
73
- %}
74
-
75
- backgroundStatement -> _ %background _ %colon text %newline {%
76
- (data) => { return { type : { type : 'background', name : data[1].value }, name : data[4].trim() } }
77
- %}
78
-
79
- statement -> example {% data => data[0] %}
80
- | scenarioOutline {% data => data[0] %}
81
- | rule {% data => data[0] %}
82
-
83
- statements -> null {% data => [] %}
84
- | statements statement {% data => fp.concat(data[0],data[1]) %}
85
-
86
- example -> tags exampleStatement steps {% (data) => fp.assign(data[1],{ tags : data[0], steps : data[2] }) %}
87
- exampleStatement -> _ exampleKeyword _ %colon text %newline {%
88
- (data) => { return { type : { type : 'example', name : data[1] }, name : data[4].trim() } }
89
- %}
90
- exampleKeyword -> %example {% data => data[0].value %}
91
-
92
- exampleList -> null {% data => [] %}
93
- | exampleList example {% data => fp.concat(data[0],data[1]) %}
94
-
95
- scenarioOutline -> tags scenarioOutlineStatement steps examplesList {%
96
- data => fp.assign(data[1],{ tags : data[0], steps : data[2], examples : data[3] })
97
- %}
98
- scenarioOutlineStatement -> _ scenarioOutlineKeyword _ %colon text %newline {%
99
- (data) => { return { type : { type : 'scenarioOutline', name : data[1] }, name : data[4].trim() } }
100
- %}
101
- scenarioOutlineKeyword -> %scenarioOutline {% data => data[0].value %}
102
-
103
- rule -> tags ruleStatement example exampleList {%
104
- data => fp.assign(data[1],{ tags : data[0], examples : fp.concat(data[2],data[3]) })
105
- %}
106
- ruleStatement -> _ ruleKeyword _ %colon text %newline {%
107
- (data) => { return { type : { type : 'rule', name : data[1] }, name : data[4].trim() } }
108
- %}
109
- ruleKeyword -> %rule {% data => data[0].value %}
110
-
111
- examplesList -> null {% data => [] %}
112
- | examplesList examples {% data => fp.concat(data[0],data[1]) %}
113
-
114
- examples -> tags examplesStatement dataTable emptyLines {%
115
- data => fp.assign(data[1],{ tags : data[0], dataTable : data[2] })
116
- %}
117
- examplesStatement -> _ examplesKeyword _ %colon text %newline {%
118
- (data) => { return { type : { type : 'examples', name : data[1] }, name : data[4] } }
119
- %}
120
- examplesKeyword -> %examples {% data => data[0].value %}
121
-
122
- dataTable -> dataTableRow {% data => [data[0]] %}
123
- | dataTable dataTableRow {% data => fp.concat(data[0],[data[1]]) %}
124
-
125
- dataTableRow -> _ %pipe dataTableColumns %newline {% data => data[2] %}
126
-
127
- dataTableColumns -> null {% data => [] %}
128
- | dataTableColumns dataTableColumnText %pipe {% data => fp.concat(data[0],data[1].trim()) %}
129
-
130
- dataTableColumnText -> null {% data => '' %}
131
- | dataTableColumnText escapedColumnCharaters {% data => data[0]+data[1] %}
132
- | dataTableColumnText keywords {% data => data[0]+data[1] %}
133
- | dataTableColumnText %word {% data => data[0]+data[1].value %}
134
- | dataTableColumnText %ws {% data => data[0]+data[1].value %}
135
- | dataTableColumnText %at {% data => data[0]+data[1].value %}
136
-
137
- escapedColumnCharaters -> %escapedPipe {% data => '|' %}
138
- | %escapedBackSlash {% data => '\\' %}
139
- | %escapedNewline {% data => '\n' %}
140
-
141
- steps -> step moreSteps {% data => setRepeatStepTypes(fp.concat(data[0],data[1])) %}
142
-
143
- moreSteps -> null {% data => [] %}
144
- | moreSteps step {% data => fp.concat(data[0],data[1]) %}
145
- | moreSteps repeatStep {% data => fp.concat(data[0],data[1]) %}
146
- | moreSteps %emptyLine {% data => data[0] %}
147
-
148
- step -> stepStatement
149
- | stepStatement dataTable {% data => fp.set('dataTable',data[1],data[0]) %}
150
- | stepStatement docString {% data => fp.set('docString',data[1],data[0]) %}
151
-
152
- stepStatement -> _ stepKeyword text %newline {% data => { return { type : data[1], text : data[2].trim() } } %}
153
-
154
- stepKeyword -> %given {% (data) => { return { type : 'given', name : data[0].value } } %}
155
- | %when {% (data) => { return { type : 'when', name : data[0].value } } %}
156
- | %then {% (data) => { return { type : 'then', name : data[0].value } } %}
157
-
158
- repeatStep -> repeatStepStatement
159
- | repeatStepStatement dataTable {% data => fp.set('dataTable',data[1],data[0]) %}
160
- | repeatStepStatement docString {% data => fp.set('docString',data[1],data[0]) %}
161
-
162
- repeatStepStatement -> _ repeatStepKeyword text %newline {%
163
- data => { return { type : data[1], text : data[2].trim() } }
164
- %}
165
-
166
- repeatStepKeyword -> %repeatStep {% (data) => { return { name : data[0].value } } %}
167
-
168
- text -> null {% data => '' %}
169
- | text %word {% data => data[0]+data[1].value %}
170
- | text %ws {% data => data[0]+data[1].value %}
171
- | text keywords {% data => data[0]+data[1] %}
172
- | text %at {% data => data[0]+data[1].value %}
173
- | text %pipe {% data => data[0]+data[1].value %}
174
- | text %escapedPipe {% data => data[0]+data[1].value %}
175
- | text %escapedNewline {% data => data[0]+data[1].value %}
176
- | text %escapedBackSlash {% data => data[0]+data[1].value %}
177
-
178
- keywords -> %given {% data => data[0].value %}
179
- | %when {% data => data[0].value %}
180
- | %then {% data => data[0].value %}
181
- | %repeatStep {% data => data[0].value %}
182
- | %colon {% data => data[0].value %}
183
- | %example {% data => data[0].value %}
184
- | %examples {% data => data[0].value %}
185
- | %scenarioOutline {% data => data[0].value %}
186
- | %background {% data => data[0].value %}
187
-
188
- bolText -> %ws %word {% data => data[1].value %}
189
- | %word {% data => data[0].value %}
190
-
191
- freeform -> null {% data => '' %}
192
- | freeform bolText text %newline {% (data) => {
193
- return data[0]+data[1]+data[2]+'\n'
194
- }
195
- %}
196
- | freeform %emptyLine {% data => data[0]+'\n' %}
197
-
198
- docString -> docStringStatement docText docStringStatement {%
199
- data => fp.set('text',trimWhitespace(data[0].ws.length,data[1]),data[0])
200
- %}
201
- docStringStatement -> _ %docString contentType %newline {%
202
- (data) => { return { type : { type : 'docString', name : data[1].value }, ws : data[0], contentType : data[2] } }
203
- %}
204
-
205
- contentType -> null {% data => null %}
206
- | %ws {% data => null %}
207
- | %word {% data => data[0].value %}
208
-
209
- docText -> null {% data => '' %}
210
- | docText text %newline {% data => data[0]+data[1]+data[2].value %}
211
- | docText %emptyLine {% data => data[0]+data[1].value %}
212
-
213
- _ -> null {% data => '' %}
214
- | %ws {% data => data[0].value %}
215
-
216
- emptyLines -> null {% data => '' %}
217
- | emptyLines %emptyLine {% data => data[0]+'\n' %}
package/src/hooks.js DELETED
@@ -1,78 +0,0 @@
1
- import { log } from './logger.js';
2
- import _ from 'lodash/fp.js';
3
- import { tagsFunction } from './tags.js';
4
-
5
- const allHooks = {
6
- beforeAll : [],
7
- before : [],
8
- beforeStep : [],
9
- afterAll : [],
10
- after : [],
11
- afterStep : [],
12
- };
13
-
14
- const hookNames = {
15
- beforeAll : 'BeforeAll',
16
- before : 'Before',
17
- beforeStep : 'BeforeStep',
18
- afterAll : 'AfterAll',
19
- after : 'After',
20
- afterStep : 'AfterStep',
21
- }
22
-
23
-
24
- const applyHooks = async (hooksName,state,tags) => {
25
- const hooks = allHooks[hooksName];
26
- log.debug('applyHooks: '+hooksName+' state: '+JSON.stringify(state));
27
- for (let i = 0; i < hooks.length; i++) {
28
- let hook = hooks[i];
29
-
30
- log.debug('applyHooks name: '+hook.name+' state: '+JSON.stringify(state));
31
-
32
- const result = hook.tagsFunction(tags);
33
-
34
- log.debug('applyHooks match? '+result+' tags: '+JSON.stringify(tags));
35
- if (result) {
36
- const origState = state;
37
- state = await hook.f(state);
38
- log.info(hookNames[hooksName]+'(\''+hook.name+'\') ('+JSON.stringify(origState)+') => '+
39
- JSON.stringify(state));
40
- }
41
- }
42
- return state;
43
- };
44
-
45
- const addHook = (hooksName,opts,f) => {
46
- if (_.isFunction(opts)) {
47
- opts = { name : '', f : opts };
48
- } else if (_.isString(opts)) {
49
- opts = { name : opts, f };
50
- } else if (_.isObject(opts)) {
51
- opts.f = f;
52
- } else {
53
- throw new Error('Unknown options argument: '+JSON.stringify(opts));
54
- }
55
-
56
- opts = _.set('tagsFunction',tagsFunction(opts.tags),opts);
57
-
58
- log.debug('addHook hooksName: '+hooksName+' name: '+opts.name);
59
- allHooks[hooksName] = _.concat(allHooks[hooksName],opts);
60
- };
61
-
62
- export const BeforeAll = (opts,f) => { addHook('beforeAll',opts,f) };
63
- export const applyBeforeAllHooks = (state,tags) => applyHooks('beforeAll',state,tags);
64
-
65
- export const Before = (opts,f) => { addHook('before',opts,f) };
66
- export const applyBeforeHooks = (state,tags) => applyHooks('before',state,tags);
67
-
68
- export const BeforeStep = (opts,f) => { addHook('beforeStep',opts,f) };
69
- export const applyBeforeStepHooks = (state,tags) => applyHooks('beforeStep',state,tags);
70
-
71
- export const AfterAll = (opts,f) => { addHook('afterAll',opts,f) };
72
- export const applyAfterAllHooks = (state,tags) => applyHooks('afterAll',state,tags);
73
-
74
- export const After = (opts,f) => { addHook('after',opts,f) };
75
- export const applyAfterHooks = (state,tags) => applyHooks('after',state,tags);
76
-
77
- export const AfterStep = (opts,f) => { addHook('afterStep',opts,f) };
78
- export const applyAfterStepHooks = (state,tags) => applyHooks('afterStep',state,tags);
package/src/index.js DELETED
@@ -1,92 +0,0 @@
1
- import _ from 'lodash/fp.js';
2
- import { addStepDefinition, findStepDefinitionMatch } from './steps.js';
3
- import { parameterizeText } from './parameterize.js';
4
- import { generateFeature } from './generate/index.js';
5
- import { log, logConfig } from './logger.js';
6
- import { parse } from './parse.js';
7
- import { tagsFunction } from './tags.js';
8
- import {
9
- BeforeAll, applyBeforeAllHooks,
10
- Before, applyBeforeHooks,
11
- AfterAll, applyAfterAllHooks,
12
- After, applyAfterHooks,
13
- BeforeStep, applyBeforeStepHooks,
14
- AfterStep, applyAfterStepHooks,
15
- } from './hooks.js';
16
-
17
- const featureRegex = /\.feature$/;
18
-
19
- const compileFeatureToJS = async (config,featureSrc) => {
20
- const feature = parse(featureSrc);
21
-
22
- const code = await generateFeature(config,feature);
23
-
24
- return code;
25
- }
26
-
27
- export { BeforeAll, Before, AfterAll, After, BeforeStep, AfterStep };
28
-
29
- export {
30
- applyBeforeAllHooks,
31
- applyBeforeHooks,
32
- applyAfterAllHooks,
33
- applyAfterHooks,
34
- applyBeforeStepHooks,
35
- applyAfterStepHooks,
36
- };
37
-
38
- export { log, logConfig };
39
-
40
- export const Given = addStepDefinition;
41
- export const When = addStepDefinition;
42
- export const Then = addStepDefinition;
43
-
44
- export const Test = (state,step) => {
45
- log.debug('Test step: '+JSON.stringify(step)+' state:'+JSON.stringify(state));
46
- const stepDefinitionMatch = findStepDefinitionMatch(step);
47
-
48
- const extraData = step.dataTable ? step.dataTable : (step.docString ? step.docString.text : null );
49
-
50
- const newState = stepDefinitionMatch.stepDefinition.f(state,stepDefinitionMatch.parameters,extraData);
51
- log.info(step.type.name+'(\''+stepDefinitionMatch.stepDefinition.expression+'\') ('+
52
- JSON.stringify(state)+','+JSON.stringify(stepDefinitionMatch.parameters)+','+JSON.stringify(extraData)+
53
- ') => '+JSON.stringify(newState));
54
- log.debug('Test newState: '+JSON.stringify(newState));
55
-
56
- return newState;
57
- };
58
-
59
- export const DataTable = (dataTable) => {
60
- const parameters = _.first(dataTable);
61
- const rows = _.tail(dataTable);
62
-
63
- return _.map((row) => _.zipObject(parameters,row))(rows);
64
- }
65
-
66
- export default function vitestCucumberPlugin() {
67
- let config;
68
-
69
- return {
70
- name : 'vitest-cucumber-transform',
71
- configResolved : (resolvedConfig) => {
72
- config = _.defaults({ root : resolvedConfig.root, log : { level : 'warn' } },
73
- _.get('test.cucumber',resolvedConfig))
74
- logConfig(config.log);
75
-
76
- config = _.set('tagsFunction',tagsFunction(_.get('tags',config)),config);
77
-
78
- log.debug('config: '+JSON.stringify(config));
79
- },
80
- transform : async (src,id) => {
81
- if (featureRegex.test(id)) {
82
- const code = await compileFeatureToJS(config,src);
83
-
84
- log.debug('transform '+id+' -> '+code);
85
-
86
- return {
87
- code
88
- }
89
- }
90
- }
91
- }
92
- }
package/src/logger.js DELETED
@@ -1,14 +0,0 @@
1
- import _ from 'lodash/fp.js';
2
- import pino from 'pino';
3
-
4
- export var log = pino();
5
-
6
- log.level = 'warn';
7
-
8
- export const logConfig = (config) => {
9
- if (_.has('file',config)) {
10
- log = pino(config,config.file);
11
- } else {
12
- log = pino(config);
13
- }
14
- };
@@ -1,7 +0,0 @@
1
- import _ from 'lodash/fp.js';
2
-
3
- export const parameterizeText = (text,parameterMap) => {
4
- return _.reduce((text,parameter) => {
5
- return text.replaceAll('<'+parameter+'>',parameterMap[parameter]);
6
- },text)(_.keys(parameterMap));
7
- };
package/src/parse.js DELETED
@@ -1,21 +0,0 @@
1
- import nearley from 'nearley';
2
- import gherkin from './gherkin.js';
3
- import { log } from './logger.js';
4
-
5
- export const parse = (src) => {
6
- const parser = new nearley.Parser(nearley.Grammar.fromCompiled(gherkin));
7
-
8
- log.debug('parsing src: '+src);
9
- parser.feed(src);
10
-
11
- if (parser.results.length == 0) {
12
- throw new Error('Unexpected end of file');
13
- }
14
- log.debug('parsing result: '+JSON.stringify(parser.results));
15
- if (parser.results.length > 1) {
16
- throw new Error('Ambiguous parsing: '+parser.results.length);
17
- }
18
-
19
- const results = parser.results;
20
- return results[0];
21
- }
@@ -1,43 +0,0 @@
1
- @{%
2
- const fp = require('lodash/fp.js');
3
- const moo = require('moo');
4
- const lexer = moo.compile({
5
- and : 'and',
6
- or : 'or',
7
- not : 'not',
8
- openParen : '(',
9
- closeParen : ')',
10
- newline : { match : '\n', lineBreaks : true },
11
- ws : /[ \t]+/,
12
- tag : /\@[\w\.]+/,
13
- });
14
- %}
15
-
16
- @lexer lexer
17
-
18
- main -> expression %newline {% data => data[0] %}
19
-
20
- expression -> tag {% data => data[0] %}
21
- | unaryOperation {% data => data[0] %}
22
- | binaryOperation {% data => data[0] %}
23
- | parenOperation {% data => data[0] %}
24
-
25
- parenOperation -> %openParen _ expression _ %closeParen {% data => data[2] %}
26
-
27
- unaryOperation -> %not %ws unaryExpression {% data => { return { operator : 'not', expression : data[2] } } %}
28
-
29
- unaryExpression -> tag {% id %}
30
- | parenOperation {% id %}
31
-
32
- binaryOperation -> expression _ binaryOperator _ expression {%
33
- data => { return { operator : data[2], left : data[0], right : data[4] } }
34
- %}
35
-
36
- binaryOperator -> %and {% data => data[0].value %}
37
- | %or {% data => data[0].value %}
38
-
39
- tag -> %tag {% data => data[0].value.slice(1) %}
40
-
41
- _ -> null
42
- | %ws
43
-
@@ -1,25 +0,0 @@
1
- Feature: The Background keyword behaviors
2
- The Background keyword allow you to add context to scenarios that follow it.
3
-
4
- # This is the background.
5
- Background: Set up some background data
6
- It's the cool thing to do.
7
-
8
- Given I have a "orange"
9
- And I have a "grape"
10
-
11
- Scenario: What's the scenario?
12
- Given I have a "apple"
13
- When I get a "pea"
14
- Then I have the following items:
15
- | orange |
16
- | grape |
17
- | apple |
18
- | pea |
19
-
20
- Scenario: It's another scenario!
21
- When I get a "pea"
22
- Then I have the following items:
23
- | orange |
24
- | grape |
25
- | pea |
@@ -1,30 +0,0 @@
1
- import { Given, When, Then, DataTable } from 'vitest-cucumber-plugin';
2
- import { expect } from 'vitest'
3
- import _ from 'lodash/fp';
4
-
5
- const addItem = (state,[ item ],data) => { return { items : _.concat(state.items ? state.items : [],item) } };
6
-
7
- Given('I have a {string}',addItem);
8
- Then('I get a {string}',addItem);
9
- Then('I have the following items:',(state,params,data) => {
10
- const items = _.flatten(data);
11
- expect(state.items).toEqual(items);
12
- return state;
13
- });
14
- Then('I don\'t have a {string}',(state,[ item ],data) => {
15
- expect(state.items).not.toContain(item);
16
- return state;
17
- });
18
-
19
- Given('there are {int} cucumbers',(state,[ count ],data) => {
20
- return _.set('cucumbers',count,state);
21
- });
22
-
23
- When('I eat {int} cucumbers',(state,[ count ],data) => {
24
- return _.set('cucumbers',state.cucumbers - count,state);
25
- });
26
-
27
- Then('I should have {int} cucumbers',(state,[ count ],data) => {
28
- expect(state.cucumbers).toEqual(count);
29
- return state;
30
- });
@@ -1,3 +0,0 @@
1
- import { Before } from 'vitest-cucumber-plugin';
2
-
3
- Before('clear state before scenarios',async (state) => { return {} });