vitest-cucumber-plugin 0.6.0 → 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 (197) hide show
  1. package/RELEASE_NOTES.md +2 -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/{src → dist}/generate/example.js +7 -10
  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/{src → dist}/generate/rule.js +9 -12
  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 +9 -9
  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/{src → dist}/generate/util.js +5 -5
  37. package/dist/generate/util.js.map +1 -0
  38. package/dist/gherkin-lexer-shared.d.ts +6 -0
  39. package/dist/gherkin-lexer-shared.d.ts.map +1 -0
  40. package/dist/gherkin-lexer-shared.js +4 -0
  41. package/dist/gherkin-lexer-shared.js.map +1 -0
  42. package/dist/gherkin-lexer.d.ts +4 -0
  43. package/dist/gherkin-lexer.d.ts.map +1 -0
  44. package/dist/gherkin-lexer.js +68 -0
  45. package/dist/gherkin-lexer.js.map +1 -0
  46. package/{src → dist}/gherkin.js +1 -1
  47. package/{src → dist}/gherkin.umd.js +1 -1
  48. package/dist/hooks.d.ts +25 -0
  49. package/dist/hooks.d.ts.map +1 -0
  50. package/dist/hooks.js +94 -0
  51. package/dist/hooks.js.map +1 -0
  52. package/dist/index.d.ts +4 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +4 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/logger.d.ts +5 -0
  57. package/dist/logger.d.ts.map +1 -0
  58. package/dist/logger.js +8 -0
  59. package/dist/logger.js.map +1 -0
  60. package/dist/parameterize.d.ts +3 -0
  61. package/dist/parameterize.d.ts.map +1 -0
  62. package/dist/parameterize.js +8 -0
  63. package/dist/parameterize.js.map +1 -0
  64. package/dist/parse.d.ts +3 -0
  65. package/dist/parse.d.ts.map +1 -0
  66. package/{src → dist}/parse.js +5 -9
  67. package/dist/parse.js.map +1 -0
  68. package/dist/state.d.ts +4 -0
  69. package/dist/state.d.ts.map +1 -0
  70. package/dist/state.js +2 -0
  71. package/dist/state.js.map +1 -0
  72. package/dist/statement.d.ts +71 -0
  73. package/dist/statement.d.ts.map +1 -0
  74. package/dist/statement.js +10 -0
  75. package/dist/statement.js.map +1 -0
  76. package/dist/steps.d.ts +20 -0
  77. package/dist/steps.d.ts.map +1 -0
  78. package/{src → dist}/steps.js +16 -23
  79. package/dist/steps.js.map +1 -0
  80. package/dist/tags.d.ts +5 -0
  81. package/dist/tags.d.ts.map +1 -0
  82. package/{src → dist}/tags.js +15 -28
  83. package/dist/tags.js.map +1 -0
  84. package/dist/vitest-cucumber-plugin.d.ts +13 -0
  85. package/dist/vitest-cucumber-plugin.d.ts.map +1 -0
  86. package/dist/vitest-cucumber-plugin.js +69 -0
  87. package/dist/vitest-cucumber-plugin.js.map +1 -0
  88. package/package.json +64 -34
  89. package/generate-parsers +0 -6
  90. package/rollup-gherkin.js +0 -12
  91. package/rollup-tags-expression.js +0 -11
  92. package/run-tests +0 -9
  93. package/src/generate/examples.js +0 -48
  94. package/src/generate/feature.js +0 -72
  95. package/src/generate/index.js +0 -15
  96. package/src/generate/scenario-outline.js +0 -21
  97. package/src/gherkin-lexer-shared.cjs +0 -4
  98. package/src/gherkin-lexer.js +0 -63
  99. package/src/gherkin.ne +0 -211
  100. package/src/hooks.js +0 -77
  101. package/src/index.js +0 -95
  102. package/src/logger.js +0 -14
  103. package/src/parameterize.js +0 -7
  104. package/src/tags-expression.ne +0 -43
  105. package/tests/background/features/background.feature +0 -25
  106. package/tests/background/features/step_definitions/steps.js +0 -30
  107. package/tests/background/features/support/hooks.js +0 -3
  108. package/tests/background/package-lock.json +0 -1204
  109. package/tests/background/package.json +0 -11
  110. package/tests/background/vite.config.js +0 -13
  111. package/tests/comments/features/is-it-friday.feature +0 -10
  112. package/tests/comments/features/step_definitions/stepdefs.js +0 -15
  113. package/tests/comments/package-lock.json +0 -1933
  114. package/tests/comments/package.json +0 -11
  115. package/tests/comments/vite.config.js +0 -9
  116. package/tests/data-tables/features/data-tables-escaping.feature +0 -27
  117. package/tests/data-tables/features/data-tables.feature +0 -44
  118. package/tests/data-tables/features/step_definitions/data-tables.js +0 -21
  119. package/tests/data-tables/package-lock.json +0 -1933
  120. package/tests/data-tables/package.json +0 -11
  121. package/tests/data-tables/vite.config.js +0 -13
  122. package/tests/doc-strings/features/doc-strings.feature +0 -21
  123. package/tests/doc-strings/features/step_definitions/doc-strings.js +0 -15
  124. package/tests/doc-strings/package-lock.json +0 -1933
  125. package/tests/doc-strings/package.json +0 -11
  126. package/tests/doc-strings/vite.config.js +0 -13
  127. package/tests/hooks/features/after-all.feature +0 -5
  128. package/tests/hooks/features/after.feature +0 -5
  129. package/tests/hooks/features/before-all.feature +0 -14
  130. package/tests/hooks/features/before-step.feature +0 -6
  131. package/tests/hooks/features/before.feature +0 -14
  132. package/tests/hooks/features/step_definitions/steps.js +0 -28
  133. package/tests/hooks/features/support/hooks.js +0 -75
  134. package/tests/hooks/features/support/tags-hooks.js +0 -11
  135. package/tests/hooks/features/tags.feature +0 -14
  136. package/tests/hooks/package-lock.json +0 -1204
  137. package/tests/hooks/package.json +0 -11
  138. package/tests/hooks/vite.config.js +0 -13
  139. package/tests/is-it-friday/features/is-it-friday.feature +0 -7
  140. package/tests/is-it-friday/features/step_definitions/stepdefs.js +0 -15
  141. package/tests/is-it-friday/package-lock.json +0 -1933
  142. package/tests/is-it-friday/package.json +0 -11
  143. package/tests/is-it-friday/vite.config.js +0 -13
  144. package/tests/is-it-friday-scenario-outline/features/is-it-friday.feature +0 -13
  145. package/tests/is-it-friday-scenario-outline/features/step_definitions/stepdefs.js +0 -15
  146. package/tests/is-it-friday-scenario-outline/package-lock.json +0 -1933
  147. package/tests/is-it-friday-scenario-outline/package.json +0 -11
  148. package/tests/is-it-friday-scenario-outline/vite.config.js +0 -9
  149. package/tests/is-it-friday-two-scenarios/features/is-it-friday.feature +0 -12
  150. package/tests/is-it-friday-two-scenarios/features/step_definitions/stepdefs.js +0 -19
  151. package/tests/is-it-friday-two-scenarios/package-lock.json +0 -1933
  152. package/tests/is-it-friday-two-scenarios/package.json +0 -11
  153. package/tests/is-it-friday-two-scenarios/vite.config.js +0 -9
  154. package/tests/is-it-friday-two-scenarios-multiple-feature-files/features/friday.feature +0 -7
  155. package/tests/is-it-friday-two-scenarios-multiple-feature-files/features/step_definitions/stepdefs.js +0 -19
  156. package/tests/is-it-friday-two-scenarios-multiple-feature-files/features/sunday.feature +0 -8
  157. package/tests/is-it-friday-two-scenarios-multiple-feature-files/package-lock.json +0 -1933
  158. package/tests/is-it-friday-two-scenarios-multiple-feature-files/package.json +0 -11
  159. package/tests/is-it-friday-two-scenarios-multiple-feature-files/vite.config.js +0 -9
  160. package/tests/keyword-aliases/features/scenario-outline.feature +0 -20
  161. package/tests/keyword-aliases/features/scenario.feature +0 -14
  162. package/tests/keyword-aliases/features/step_definitions/steps.js +0 -30
  163. package/tests/keyword-aliases/features/steps.feature +0 -28
  164. package/tests/keyword-aliases/features/support/hooks.js +0 -6
  165. package/tests/keyword-aliases/package-lock.json +0 -1933
  166. package/tests/keyword-aliases/package.json +0 -11
  167. package/tests/keyword-aliases/vite.config.js +0 -9
  168. package/tests/languages/features/en.feature +0 -8
  169. package/tests/languages/features/no.feature +0 -10
  170. package/tests/languages/features/step_definitions/en.js +0 -15
  171. package/tests/languages/features/step_definitions/no.js +0 -21
  172. package/tests/languages/package-lock.json +0 -1204
  173. package/tests/languages/package.json +0 -11
  174. package/tests/languages/vite.config.js +0 -13
  175. package/tests/rule/features/rule.feature +0 -14
  176. package/tests/rule/features/step_definitions/stepdefs.js +0 -19
  177. package/tests/rule/package-lock.json +0 -1933
  178. package/tests/rule/package.json +0 -11
  179. package/tests/rule/vite.config.js +0 -9
  180. package/tests/tags/features/skip.feature +0 -9
  181. package/tests/tags/features/step_definitions/steps.js +0 -30
  182. package/tests/tags/features/support/hooks.js +0 -6
  183. package/tests/tags/features/tags-scenario-outline.feature +0 -37
  184. package/tests/tags/features/tags.feature +0 -26
  185. package/tests/tags/package-lock.json +0 -1204
  186. package/tests/tags/package.json +0 -11
  187. package/tests/tags/vite.config.js +0 -12
  188. package/tests/vue/features/step_definitions/test.js +0 -25
  189. package/tests/vue/features/support/components.js +0 -19
  190. package/tests/vue/features/test.feature +0 -10
  191. package/tests/vue/package-lock.json +0 -2164
  192. package/tests/vue/package.json +0 -18
  193. package/tests/vue/src/test.vue +0 -10
  194. package/tests/vue/vite.config.js +0 -15
  195. /package/{src → dist}/gherkin-languages.json +0 -0
  196. /package/{src → dist}/tags-expression.js +0 -0
  197. /package/{src → dist}/tags-expression.umd.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-cucumber-plugin.js","sourceRoot":"","sources":["../src/vitest-cucumber-plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,35 +1,65 @@
1
1
  {
2
- "name": "vitest-cucumber-plugin",
3
- "version": "0.6.0",
4
- "description": "Plugin for Vitest which allows for tests to be written in Cucumber format.",
5
- "keywords": [
6
- "vite",
7
- "vitest",
8
- "cucumber"
9
- ],
10
- "homepage": "https://github.com/samuel-ziegler/vitest-cucumber-plugin#readme",
11
- "bugs": {
12
- "url": "https://github.com/samuel-ziegler/vitest-cucumber-plugin/issues"
13
- },
14
- "license": "MIT",
15
- "main": "src/index.js",
16
- "type": "module",
17
- "scripts": {
18
- "nearley": "./generate-parsers",
19
- "test": "./run-tests"
20
- },
21
- "dependencies": {
22
- "@cucumber/cucumber-expressions": "^16.1.2",
23
- "glob": "^10.2.2",
24
- "lodash": "^4.17.21",
25
- "moo": "^0.5.2",
26
- "nearley": "^2.20.1",
27
- "pino": "^8.11.0"
28
- },
29
- "devDependencies": {
30
- "@rollup/plugin-commonjs": "^24.1.0",
31
- "@types/lodash": "^4.14.194",
32
- "rollup": "^3.20.7"
33
- },
34
- "repository": "https://github.com/samuel-ziegler/vitest-cucumber-plugin.git"
35
- }
2
+ "name": "vitest-cucumber-plugin",
3
+ "version": "0.6.2",
4
+ "description": "Plugin for Vitest which allows for tests to be written in Cucumber format.",
5
+ "keywords": [
6
+ "vite",
7
+ "vitest",
8
+ "cucumber"
9
+ ],
10
+ "homepage": "https://github.com/samuel-ziegler/vitest-cucumber-plugin#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/samuel-ziegler/vitest-cucumber-plugin/issues"
13
+ },
14
+ "license": "MIT",
15
+ "main": "src/index.js",
16
+ "type": "module",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js",
21
+ "default": "./dist/index.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md",
27
+ "CONTRIBUTING.md",
28
+ "LICENSE",
29
+ "RELEASE_NOTES.md"
30
+ ],
31
+ "scripts": {
32
+ "dev": "tsx src/index.ts",
33
+ "clean": "rm -r dist/ || true",
34
+ "build": "yarn tsc && cpy \"src/**/*.{json,js}\" dist --parents",
35
+ "watch": "yarn tsc --watch",
36
+ "nearley": "./generate-parsers",
37
+ "test": "./run-tests"
38
+ },
39
+ "prettier": {
40
+ "tabWidth": 4,
41
+ "singleQuote": true,
42
+ "printWidth": 120
43
+ },
44
+ "dependencies": {
45
+ "@cucumber/cucumber-expressions": "^16.1.2",
46
+ "glob": "^13.0.6",
47
+ "lodash": "^4.17.23",
48
+ "moo": "^0.5.3",
49
+ "nearley": "^2.20.1",
50
+ "pino": "^10.3.1",
51
+ "vitest": "^4.1.0"
52
+ },
53
+ "devDependencies": {
54
+ "@rollup/plugin-commonjs": "^24.1.0",
55
+ "@types/lodash": "^4.17.24",
56
+ "@types/nearley": "^2.11.5",
57
+ "@types/node": "^25.5.0",
58
+ "cpy-cli": "^7.0.0",
59
+ "rollup": "^3.20.7",
60
+ "tsx": "^4.21.0",
61
+ "typescript": "^5.9.3"
62
+ },
63
+ "repository": "https://github.com/samuel-ziegler/vitest-cucumber-plugin.git",
64
+ "packageManager": "yarn@4.13.0"
65
+ }
package/generate-parsers DELETED
@@ -1,6 +0,0 @@
1
- #!/bin/bash
2
-
3
- nearleyc src/gherkin.ne -o src/gherkin.umd.js || exit 1
4
- nearleyc src/tags-expression.ne -o src/tags-expression.umd.js || exit 1
5
- rollup -c rollup-gherkin.js || exit 1
6
- rollup -c rollup-tags-expression.js || exit 1
package/rollup-gherkin.js DELETED
@@ -1,12 +0,0 @@
1
- import commonjs from "@rollup/plugin-commonjs";
2
-
3
- export default {
4
- input: "src/gherkin.umd.js",
5
- output: {
6
- file: "src/gherkin.js",
7
- format: "es",
8
- },
9
- external : [ 'moo', 'lodash/fp.js', './gherkin-lexer-shared.cjs' ],
10
- plugins: [commonjs()],
11
- makeAbsoluteExternalsRelative : false,
12
- };
@@ -1,11 +0,0 @@
1
- import commonjs from "@rollup/plugin-commonjs";
2
-
3
- export default {
4
- input: "src/tags-expression.umd.js",
5
- output: {
6
- file: "src/tags-expression.js",
7
- format: "es",
8
- },
9
- external : [ 'moo', 'lodash/fp.js' ],
10
- plugins: [commonjs()],
11
- };
package/run-tests DELETED
@@ -1,9 +0,0 @@
1
- #!/usr/bin/bash
2
-
3
- for i in `ls tests`; do
4
- echo $i
5
- pushd tests/$i
6
- npm install || exit 1
7
- npm test || exit 1
8
- popd
9
- done
@@ -1,48 +0,0 @@
1
- import { escape, shouldSkip } from './util.js';
2
- import { generateTests } from './tests.js';
3
- import _ from 'lodash/fp.js';
4
- import { log } from '../logger.js';
5
-
6
- const createParameterMap = (parameters,values) => {
7
- const parameterMap = _.reduce((parameterMap,value) => {
8
- return {
9
- map : _.set(parameters[parameterMap.index],value,parameterMap.map),
10
- index : parameterMap.index + 1
11
- };
12
- },{ map : {}, index : 0 })(values);
13
-
14
- return parameterMap.map;
15
- }
16
-
17
- const generateAllTests = (steps,parameters,parameterValues,tags) => {
18
- const allTests = _.reduce((allTests,values) => {
19
- const parameterMap = createParameterMap(parameters,values);
20
- log.debug(`parameterMap : ${JSON.stringify(parameterMap)}`);
21
-
22
- const tests = generateTests(steps,parameterMap,tags,' ');
23
-
24
- return { tests : allTests.tests + `
25
- describe('${allTests.index}',() => {${tests}
26
- });`, index : allTests.index + 1 };
27
- },{ tests : '', index : 0})(parameterValues);
28
-
29
- return allTests.tests;
30
- }
31
-
32
- export const generateExamples = (config,steps,examplesStatement) => {
33
- log.debug(`generateExamples steps:${JSON.stringify(steps)} examples: ${JSON.stringify(examplesStatement)}`);
34
-
35
- const parameters = _.head(examplesStatement.dataTable);
36
- const parameterValues = _.tail(examplesStatement.dataTable);
37
-
38
- log.debug(`generateExamples parameters:${JSON.stringify(parameters)} parameterValues: ${JSON.stringify(parameterValues)}`);
39
-
40
- const skip = shouldSkip(config,examplesStatement.tags) ? '.skip' : '';
41
-
42
- const allTests = generateAllTests(steps,parameters,parameterValues,examplesStatement.tags);
43
- const code = `
44
- // tags : ${JSON.stringify(examplesStatement.tags)}
45
- describe${skip}('${escape(examplesStatement.type.name)}: ${escape(examplesStatement.name)}', () => {${allTests}
46
- });`;
47
- return code;
48
- }
@@ -1,72 +0,0 @@
1
- import _ from 'lodash/fp.js';
2
- import { log } from '../logger.js';
3
- import { generateExample, generateScenarioOutline, generateRule } from './index.js';
4
- import { escape, shouldSkip } from './util.js';
5
- import { glob } from 'glob';
6
-
7
- const findJsFiles = async () => glob('features/**/*.js');
8
-
9
- export const generateFeature = async (config,feature) => {
10
- const name = feature.name;
11
- const statements = feature.statements;
12
-
13
- const testStatements = _.reduce((testStatements,statement) => {
14
- if (feature.background) {
15
- statement = _.set('background',feature.background,statement);
16
- }
17
-
18
- statement = _.set('tags',_.concat(feature.tags,statement.tags),statement);
19
-
20
- if (statement.type.type === 'example') {
21
- return testStatements + generateExample(config,statement);
22
- } else if (statement.type.type === 'scenarioOutline') {
23
- return testStatements + generateScenarioOutline(config,statement);
24
- } else if (statement.type.type === 'rule') {
25
- return testStatements + generateRule(config,statement);
26
- }
27
- },'')(statements);
28
-
29
- const skip = shouldSkip(config,feature.tags) ? '.skip' : '';
30
- const configStr = JSON.stringify(config);
31
- const tagsStr = JSON.stringify(feature.tags);
32
-
33
- const jsFilesImportReducer = (imports,file) => {
34
- file = file.slice('features/'.length);
35
- return imports+`
36
- import './${file}';`;
37
- };
38
- const jsFiles = await findJsFiles();
39
- const jsFilesImport = _.reduce(jsFilesImportReducer,'',jsFiles);
40
-
41
- const code = `import { expect, test, describe, beforeAll, afterAll, beforeEach, afterEach } from 'vitest';
42
- import {
43
- Test,
44
- applyBeforeAllHooks,
45
- applyBeforeHooks,
46
- applyBeforeStepHooks,
47
- applyAfterAllHooks,
48
- applyAfterHooks,
49
- applyAfterStepHooks,
50
- } from 'vitest-cucumber-plugin';
51
- import { readdir } from 'node:fs/promises';
52
- import { log, logConfig } from 'vitest-cucumber-plugin';${jsFilesImport}
53
-
54
- logConfig(${JSON.stringify(config.log)});
55
-
56
- var state = {};
57
-
58
- beforeAll(async () => {
59
- state = await applyBeforeAllHooks(state,${tagsStr});
60
- });
61
-
62
- afterAll(async () => {
63
- state = await applyAfterAllHooks(state,${tagsStr});
64
- });
65
-
66
- // tags : ${tagsStr}
67
- describe${skip}('${escape(feature.type.name)}: ${escape(name)}', () => {
68
- ${testStatements}});
69
- `;
70
-
71
- return code;
72
- }
@@ -1,15 +0,0 @@
1
- import { generateTests } from './tests.js';
2
- import { generateExample } from './example.js';
3
- import { generateExamples } from './examples.js';
4
- import { generateScenarioOutline } from './scenario-outline.js';
5
- import { generateFeature } from './feature.js';
6
- import { generateRule } from './rule.js';
7
-
8
- export {
9
- generateTests,
10
- generateExample,
11
- generateExamples,
12
- generateScenarioOutline,
13
- generateFeature,
14
- generateRule,
15
- };
@@ -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,4 +0,0 @@
1
- module.exports = {
2
- states : {},
3
- language : 'en',
4
- };
@@ -1,63 +0,0 @@
1
- import _ from 'lodash/fp.js';
2
- import gherkinLexerShared from './gherkin-lexer-shared.cjs';
3
- import fs from 'fs';
4
-
5
- const base = {
6
- language : { match : /^#[ \t]*language:[ \t]*[a-z\-A-Z]+\n/, lineBreaks : true },
7
- emptyLine : { match: /^[ \t]*(?:\#[^\n]+)?\n/, lineBreaks : true },
8
- newline : { match : '\n', lineBreaks : true },
9
- ws : /[ \t]+/,
10
- at : '@',
11
- colon : ':',
12
- repeatStep : '*',
13
- pipe : '|',
14
- escapedPipe : '\\|',
15
- escapedNewline : '\\n',
16
- escapedBackSlash : '\\\\',
17
- scenarioOutline : [],
18
- docString : ['```','"""'],
19
- word : {
20
- match : /[^ \t\n\:\|\@\*]+/,
21
- },
22
- };
23
-
24
- const trimKeywords = (keywords) => _.map(_.trim);
25
- const filterStars = (keywords) => _.filter((v) => (v !== '*'));
26
- const cleanKeywords = (keywords) => filterStars()(trimKeywords()(keywords));
27
-
28
- const createState = (languageKeywords) => {
29
- let state = base;
30
-
31
- state = _.set('scenarioOutline',cleanKeywords(languageKeywords.scenarioOutline),state);
32
-
33
- let keywords = {};
34
-
35
- let repeatStepKeys = ['and','but'];
36
- const repeatStepReducer = (keywords,repeatStepKey) =>
37
- _.concat(keywords,cleanKeywords(languageKeywords[repeatStepKey]));
38
- const repeatStepKeywords = _.reduce(repeatStepReducer,[])(repeatStepKeys);
39
-
40
- let otherKeys = ['feature','examples','given','when','then','scenario','background','rule'];
41
- const otherKeyReducer = (acc,key) => _.set(key,cleanKeywords(languageKeywords[key]),acc);
42
- const otherKeywords = _.reduce(otherKeyReducer,{})(otherKeys);
43
-
44
- keywords = _.set('repeatStep',repeatStepKeywords,otherKeywords);
45
-
46
- state = _.set(['word','rawKeywords'],keywords,state);
47
-
48
- return state;
49
- }
50
-
51
- export const gherkinLexerConfig = (options) => {
52
- const gherkinLanguagesPath = new URL('./gherkin-languages.json', import.meta.url);
53
- const gherkinLanguages = JSON.parse(fs.readFileSync(gherkinLanguagesPath));
54
- const language = _.getOr('en','language',options);
55
- const languageKeys = _.keys(gherkinLanguages);
56
- const languageKeyReducer = (acc,languageKey) => _.set(languageKey,createState(gherkinLanguages[languageKey]),acc);
57
- const states = _.reduce(languageKeyReducer,{},languageKeys);
58
- if (!_.has(language,states)) {
59
- throw new Error('unknown language "'+language+'"');
60
- }
61
- gherkinLexerShared.states = states;
62
- gherkinLexerShared.language = language;
63
- };
package/src/gherkin.ne DELETED
@@ -1,211 +0,0 @@
1
- @{%
2
- const fp = require('lodash/fp.js');
3
- const moo = require('moo');
4
-
5
- const gherkinLexerShared = require('./gherkin-lexer-shared.cjs');
6
-
7
- const transformKeywords = (state) => fp.set(['word','type'],moo.keywords(state.word.rawKeywords),state);
8
-
9
- const transformStates = (states) => fp.mapValues(transformKeywords)(states);
10
-
11
- gherkinLexerShared.states = transformStates(gherkinLexerShared.states);
12
-
13
- const lexer = moo.states(gherkinLexerShared.states,gherkinLexerShared.language);
14
-
15
- const trimWhitespace = (cols,str) => {
16
- const lines = str.split('\n').slice(0,-1);
17
- return fp.reduce((s,line) => {
18
- return s+line.slice(cols)+'\n'
19
- },'')(lines);
20
- };
21
-
22
- const setRepeatStepTypesReducer = (steps,step) => {
23
- if (!fp.has('type.type',step)) {
24
- step = fp.set('type.type',fp.last(steps).type.type,step);
25
- }
26
- return fp.concat(steps,step);
27
- };
28
-
29
- const setRepeatStepTypes = (steps) => fp.reduce(setRepeatStepTypesReducer,[],steps);
30
-
31
- %}
32
-
33
- @lexer lexer
34
-
35
- main -> body {% data => data[0] %}
36
- | language body {% data => data[1] %}
37
-
38
- language -> %language {%
39
- (data) => {
40
- const languageRegex = /^#[ \t]*language:[ \t]*([a-z\-A-Z]+)\n/;
41
- const languageMatches = data[0].value.match(languageRegex);
42
- const newLanguage = languageMatches[1];
43
- lexer.setState(newLanguage);
44
- }
45
- %}
46
-
47
- body -> emptyLines tags feature {% data => fp.set('tags',data[1],data[2]) %}
48
-
49
- feature -> featureStatement freeform background statements {%
50
- (data) => fp.assign(data[0],{ description : data[1].trim(), background : data[2], statements : data[3] })
51
- %}
52
- featureStatement -> _ %feature _ %colon text %newline {%
53
- (data) => { return { type : { type : 'feature', name : data[1].value.trim() }, name : data[4].trim() } }
54
- %}
55
-
56
- tags -> null {% data => [] %}
57
- | _ tag tagList %newline {% data => fp.concat(data[1],data[2]) %}
58
-
59
- tagList -> null {% data => [] %}
60
- | tagList %ws tag {% data => fp.concat(data[0],data[2]) %}
61
-
62
- tag -> %at %word {% data => data[1].value.trim() %}
63
-
64
- background -> null {% data => null %}
65
- | backgroundStatement freeform steps {%
66
- data => fp.assign(data[0],{ description : data[1].trim(), steps : data[2] })
67
- %}
68
-
69
- backgroundStatement -> _ %background _ %colon text %newline {%
70
- (data) => { return { type : { type : 'background', name : data[1].value }, name : data[4].trim() } }
71
- %}
72
-
73
- statement -> example {% data => data[0] %}
74
- | scenarioOutline {% data => data[0] %}
75
- | rule {% data => data[0] %}
76
-
77
- statements -> null {% data => [] %}
78
- | statements statement {% data => fp.concat(data[0],data[1]) %}
79
-
80
- example -> tags exampleStatement steps {% (data) => fp.assign(data[1],{ tags : data[0], steps : data[2] }) %}
81
- exampleStatement -> _ exampleKeyword _ %colon text %newline {%
82
- (data) => { return { type : { type : 'example', name : data[1] }, name : data[4].trim() } }
83
- %}
84
- exampleKeyword -> %scenario {% data => data[0].value %}
85
-
86
- exampleList -> null {% data => [] %}
87
- | exampleList example {% data => fp.concat(data[0],data[1]) %}
88
-
89
- scenarioOutline -> tags scenarioOutlineStatement steps examplesList {%
90
- data => fp.assign(data[1],{ tags : data[0], steps : data[2], examples : data[3] })
91
- %}
92
- scenarioOutlineStatement -> _ scenarioOutlineKeyword _ %colon text %newline {%
93
- (data) => { return { type : { type : 'scenarioOutline', name : data[1] }, name : data[4].trim() } }
94
- %}
95
- scenarioOutlineKeyword -> %scenarioOutline {% data => data[0].value %}
96
-
97
- rule -> tags ruleStatement example exampleList {%
98
- data => fp.assign(data[1],{ tags : data[0], examples : fp.concat(data[2],data[3]) })
99
- %}
100
- ruleStatement -> _ ruleKeyword _ %colon text %newline {%
101
- (data) => { return { type : { type : 'rule', name : data[1] }, name : data[4].trim() } }
102
- %}
103
- ruleKeyword -> %rule {% data => data[0].value %}
104
-
105
- examplesList -> null {% data => [] %}
106
- | examplesList examples {% data => fp.concat(data[0],data[1]) %}
107
-
108
- examples -> tags examplesStatement dataTable emptyLines {%
109
- data => fp.assign(data[1],{ tags : data[0], dataTable : data[2] })
110
- %}
111
- examplesStatement -> _ examplesKeyword _ %colon text %newline {%
112
- (data) => { return { type : { type : 'examples', name : data[1] }, name : data[4] } }
113
- %}
114
- examplesKeyword -> %examples {% data => data[0].value %}
115
-
116
- dataTable -> dataTableRow {% data => [data[0]] %}
117
- | dataTable dataTableRow {% data => fp.concat(data[0],[data[1]]) %}
118
-
119
- dataTableRow -> _ %pipe dataTableColumns %newline {% data => data[2] %}
120
-
121
- dataTableColumns -> null {% data => [] %}
122
- | dataTableColumns dataTableColumnText %pipe {% data => fp.concat(data[0],data[1].trim()) %}
123
-
124
- dataTableColumnText -> null {% data => '' %}
125
- | dataTableColumnText escapedColumnCharaters {% data => data[0]+data[1] %}
126
- | dataTableColumnText keywords {% data => data[0]+data[1] %}
127
- | dataTableColumnText %word {% data => data[0]+data[1].value %}
128
- | dataTableColumnText %ws {% data => data[0]+data[1].value %}
129
- | dataTableColumnText %at {% data => data[0]+data[1].value %}
130
-
131
- escapedColumnCharaters -> %escapedPipe {% data => '|' %}
132
- | %escapedBackSlash {% data => '\\' %}
133
- | %escapedNewline {% data => '\n' %}
134
-
135
- steps -> step moreSteps {% data => setRepeatStepTypes(fp.concat(data[0],data[1])) %}
136
-
137
- moreSteps -> null {% data => [] %}
138
- | moreSteps step {% data => fp.concat(data[0],data[1]) %}
139
- | moreSteps repeatStep {% data => fp.concat(data[0],data[1]) %}
140
- | moreSteps %emptyLine {% data => data[0] %}
141
-
142
- step -> stepStatement
143
- | stepStatement dataTable {% data => fp.set('dataTable',data[1],data[0]) %}
144
- | stepStatement docString {% data => fp.set('docString',data[1],data[0]) %}
145
-
146
- stepStatement -> _ stepKeyword text %newline {% data => { return { type : data[1], text : data[2].trim() } } %}
147
-
148
- stepKeyword -> %given {% (data) => { return { type : 'given', name : data[0].value } } %}
149
- | %when {% (data) => { return { type : 'when', name : data[0].value } } %}
150
- | %then {% (data) => { return { type : 'then', name : data[0].value } } %}
151
-
152
- repeatStep -> repeatStepStatement
153
- | repeatStepStatement dataTable {% data => fp.set('dataTable',data[1],data[0]) %}
154
- | repeatStepStatement docString {% data => fp.set('docString',data[1],data[0]) %}
155
-
156
- repeatStepStatement -> _ repeatStepKeyword text %newline {%
157
- data => { return { type : data[1], text : data[2].trim() } }
158
- %}
159
-
160
- repeatStepKeyword -> %repeatStep {% (data) => { return { name : data[0].value } } %}
161
-
162
- text -> null {% data => '' %}
163
- | text %word {% data => data[0]+data[1].value %}
164
- | text %ws {% data => data[0]+data[1].value %}
165
- | text keywords {% data => data[0]+data[1] %}
166
- | text %at {% data => data[0]+data[1].value %}
167
- | text %pipe {% data => data[0]+data[1].value %}
168
- | text %escapedPipe {% data => data[0]+data[1].value %}
169
- | text %escapedNewline {% data => data[0]+data[1].value %}
170
- | text %escapedBackSlash {% data => data[0]+data[1].value %}
171
-
172
- keywords -> %given {% data => data[0].value %}
173
- | %when {% data => data[0].value %}
174
- | %then {% data => data[0].value %}
175
- | %repeatStep {% data => data[0].value %}
176
- | %colon {% data => data[0].value %}
177
- | %scenario {% data => data[0].value %}
178
- | %examples {% data => data[0].value %}
179
- | %scenarioOutline {% data => data[0].value %}
180
- | %background {% data => data[0].value %}
181
-
182
- bolText -> %ws %word {% data => data[1].value %}
183
- | %word {% data => data[0].value %}
184
-
185
- freeform -> null {% data => '' %}
186
- | freeform bolText text %newline {% (data) => {
187
- return data[0]+data[1]+data[2]+'\n'
188
- }
189
- %}
190
- | freeform %emptyLine {% data => data[0]+'\n' %}
191
-
192
- docString -> docStringStatement docText docStringStatement {%
193
- data => fp.set('text',trimWhitespace(data[0].ws.length,data[1]),data[0])
194
- %}
195
- docStringStatement -> _ %docString contentType %newline {%
196
- (data) => { return { type : { type : 'docString', name : data[1].value }, ws : data[0], contentType : data[2] } }
197
- %}
198
-
199
- contentType -> null {% data => null %}
200
- | %ws {% data => null %}
201
- | %word {% data => data[0].value %}
202
-
203
- docText -> null {% data => '' %}
204
- | docText text %newline {% data => data[0]+data[1]+data[2].value %}
205
- | docText %emptyLine {% data => data[0]+data[1].value %}
206
-
207
- _ -> null {% data => '' %}
208
- | %ws {% data => data[0].value %}
209
-
210
- emptyLines -> null {% data => '' %}
211
- | emptyLines %emptyLine {% data => data[0]+'\n' %}
package/src/hooks.js DELETED
@@ -1,77 +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({ state }, `applyHooks: ${hooksName}`);
27
- for (let i = 0; i < hooks.length; i++) {
28
- let hook = hooks[i];
29
-
30
- log.debug({ state }, `applyHooks name: ${hook.name}`);
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({ state, origState }, `${hookNames[hooksName]}('${hook.name}')`);
39
- }
40
- }
41
- return state;
42
- };
43
-
44
- const addHook = (hooksName,opts,f) => {
45
- if (_.isFunction(opts)) {
46
- opts = { name : '', f : opts };
47
- } else if (_.isString(opts)) {
48
- opts = { name : opts, f };
49
- } else if (_.isObject(opts)) {
50
- opts.f = f;
51
- } else {
52
- throw new Error('Unknown options argument: '+JSON.stringify(opts));
53
- }
54
-
55
- opts = _.set('tagsFunction',tagsFunction(opts.tags),opts);
56
-
57
- log.debug(`addHook hooksName: ${hooksName} name: ${opts.name}`);
58
- allHooks[hooksName] = _.concat(allHooks[hooksName],opts);
59
- };
60
-
61
- export const BeforeAll = (opts,f) => { addHook('beforeAll',opts,f) };
62
- export const applyBeforeAllHooks = (state,tags) => applyHooks('beforeAll',state,tags);
63
-
64
- export const Before = (opts,f) => { addHook('before',opts,f) };
65
- export const applyBeforeHooks = (state,tags) => applyHooks('before',state,tags);
66
-
67
- export const BeforeStep = (opts,f) => { addHook('beforeStep',opts,f) };
68
- export const applyBeforeStepHooks = (state,tags) => applyHooks('beforeStep',state,tags);
69
-
70
- export const AfterAll = (opts,f) => { addHook('afterAll',opts,f) };
71
- export const applyAfterAllHooks = (state,tags) => applyHooks('afterAll',state,tags);
72
-
73
- export const After = (opts,f) => { addHook('after',opts,f) };
74
- export const applyAfterHooks = (state,tags) => applyHooks('after',state,tags);
75
-
76
- export const AfterStep = (opts,f) => { addHook('afterStep',opts,f) };
77
- export const applyAfterStepHooks = (state,tags) => applyHooks('afterStep',state,tags);