UNPKG

3.35 kBJavaScriptView Raw
1// To gen snippets in project and in ide
2// node scripts/generateSnippetsVSCode.js --genFiles
3
4// To gen snippets just in ide
5// node scripts/generateSnippetsVSCode.js --genFiles --justForIDE
6
7const fs = require('fs');
8const os = require('os');
9const { argv } = require('yargs');
10
11const givenSteps = require('../uiTestHelpers/stepDefinitions/commonGivenSteps');
12const whenSteps = require('../uiTestHelpers/stepDefinitions/commonWhenSteps');
13const thenSteps = require('../uiTestHelpers/stepDefinitions/commonThenSteps');
14const placeholders = require('../placeholders');
15
16let ideSnippetsFolder;
17let ideInstalled = true;
18
19const snippetsFolder = 'snippets/vscode';
20
21if (!fs.existsSync('snippets')) {
22 fs.mkdirSync('snippets');
23}
24if (!fs.existsSync(snippetsFolder)) {
25 fs.mkdirSync(snippetsFolder);
26}
27
28
29try {
30 ideSnippetsFolder = `${os.homedir()}/Library/Application Support/Code/User/snippets`;
31 if (!fs.existsSync(ideSnippetsFolder)) {
32 fs.mkdirSync(ideSnippetsFolder);
33 }
34} catch (e) {
35 console.log('VSCode not installed on your mac');
36 ideInstalled = false;
37}
38
39const snippetCodes = {};
40
41/* eslint-disable indent */
42
43const genSnippet = (matcher, code) => {
44 const snippet = `{
45 "Print to console": {
46 "prefix": "${code}",
47 "body": [
48 "${matcher.replace(/\((.*)\)/g, '$1')}"
49 ],
50 "description": "${matcher.replace(/\((.*)\)/g, '$1')}"
51 }
52}`;
53
54 /* eslint-enable indent */
55
56 if (!argv.justForIDE) {
57 fs.writeFileSync(`${snippetsFolder}/cuketractor-${code}.code-snippets`, snippet);
58 }
59
60 if (ideInstalled) {
61 fs.writeFileSync(`${ideSnippetsFolder}/cuketractor-${code}.code-snippets`, snippet);
62 }
63};
64
65const genSnippets = (steps, type) => {
66 if (!snippetCodes[type]) {
67 snippetCodes[type] = [];
68 }
69 steps.forEach((step) => {
70 const allPlaceholders = placeholders.join('|');
71 const matcherWithReplacedPlaceholders = step.matcher
72 .replace(new RegExp(`'(${allPlaceholders})'`), (m, p1) => `'\${1:${p1}\}'`)
73 .replace(new RegExp(`'(${allPlaceholders})'`), (m, p1) => `'\${2:${p1}\}'`)
74 .replace(new RegExp(`'(${allPlaceholders})'`), (m, p1) => `'\${3:${p1}\}'`)
75 .replace(new RegExp(`'(${allPlaceholders})'`), (m, p1) => `'\${4:${p1}\}'`)
76 .replace(/\(\?\:(.*)\)\?/g, '$1');
77
78 const zeroOrManyNotMatcher = /\((.*not.*)\)\*/g;
79 const newMatcher = step.matcher
80 .replace(/\(\?\:(.*)\)\?/g, (match, p1) =>
81 p1.replace(/([^ ]+)/, '_$1_'))
82 .replace(/\(\?\:(.*)\)/g, '$1');
83
84 const generatedCode = `${step.path ?
85 step.path.replace(/[./]*/g, '').replace(/^(actions|checks)/g, '') : 'die'}`;
86
87 const matcher = matcherWithReplacedPlaceholders
88 .replace(zeroOrManyNotMatcher, '')
89 .replace(/\((.*)\)\*/g, '$1');
90
91 const newCode = `${type}${step.code || generatedCode}`;
92 snippetCodes[type].push(newCode);
93 genSnippet(matcher, newCode);
94
95 if (newMatcher.match(zeroOrManyNotMatcher)) {
96 const newCode2 = `${type}not${step.code || generatedCode}`;
97 const matcher2 = matcherWithReplacedPlaceholders
98 .replace(/\((.*)\)\*/g, '$1');
99 snippetCodes[type].push(newCode2);
100 genSnippet(matcher2, newCode2);
101 }
102
103 // console.log(`${type}${step.code || generatedCode}`);
104 });
105};
106
107genSnippets(givenSteps, 'given');
108genSnippets(whenSteps, 'when');
109genSnippets(thenSteps, 'then');
110
111module.exports = snippetCodes;