@dev-blinq/cucumber-js 1.0.28 → 1.0.30-stage
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.
- package/bin/download-install.js +167 -0
- package/lib/api/gherkin.js +47 -1
- package/lib/api/gherkin.js.map +1 -1
- package/lib/cli/index.js +3 -0
- package/lib/cli/index.js.map +1 -1
- package/lib/configuration/argv_parser.js +2 -1
- package/lib/configuration/argv_parser.js.map +1 -1
- package/lib/configuration/axios_client.d.ts +1 -0
- package/lib/configuration/axios_client.js +40 -0
- package/lib/configuration/axios_client.js.map +1 -0
- package/lib/configuration/default_configuration.js +1 -0
- package/lib/configuration/default_configuration.js.map +1 -1
- package/lib/configuration/types.d.ts +1 -0
- package/lib/configuration/types.js.map +1 -1
- package/lib/formatter/bvt_analysis_formatter.d.ts +1 -0
- package/lib/formatter/bvt_analysis_formatter.js +42 -11
- package/lib/formatter/bvt_analysis_formatter.js.map +1 -1
- package/lib/formatter/feature_data_format.d.ts +12 -3
- package/lib/formatter/feature_data_format.js +96 -8
- package/lib/formatter/feature_data_format.js.map +1 -1
- package/lib/formatter/helpers/report_generator.d.ts +26 -3
- package/lib/formatter/helpers/report_generator.js +167 -21
- package/lib/formatter/helpers/report_generator.js.map +1 -1
- package/lib/formatter/helpers/upload_serivce.d.ts +3 -0
- package/lib/formatter/helpers/upload_serivce.js +91 -13
- package/lib/formatter/helpers/upload_serivce.js.map +1 -1
- package/lib/formatter/helpers/uploader.js +83 -10
- package/lib/formatter/helpers/uploader.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
/* eslint-disable no-undef */
|
|
4
|
+
const { argv } = require('node:process')
|
|
5
|
+
const fs = require('fs')
|
|
6
|
+
const path = require('path')
|
|
7
|
+
const JSZip = require('jszip')
|
|
8
|
+
const { mkdirSync, writeFileSync } = require('node:fs')
|
|
9
|
+
const axios = require('axios').default
|
|
10
|
+
const tunnel = require('tunnel')
|
|
11
|
+
|
|
12
|
+
let token = null
|
|
13
|
+
let extractPath = null
|
|
14
|
+
const getSSoUrl = () => {
|
|
15
|
+
switch (process.env.NODE_ENV_BLINQ) {
|
|
16
|
+
case 'local':
|
|
17
|
+
return 'http://localhost:5000/api/auth'
|
|
18
|
+
case 'dev':
|
|
19
|
+
return 'https://dev.api.blinq.io/api/auth'
|
|
20
|
+
case "stage":
|
|
21
|
+
return 'https://stage.api.blinq.io/api/auth'
|
|
22
|
+
default:
|
|
23
|
+
return 'https://api.blinq.io/api/auth'
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const getProxy = () => {
|
|
28
|
+
if (!process.env.PROXY) {
|
|
29
|
+
return null
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const proxy = process.env.PROXY
|
|
33
|
+
const url = new URL(proxy)
|
|
34
|
+
const proxyObject = {
|
|
35
|
+
host: url.hostname,
|
|
36
|
+
port: Number(url.port),
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const { username, password } = url
|
|
40
|
+
|
|
41
|
+
if (username && password) {
|
|
42
|
+
proxyObject.proxyAuth = `${username}:${password}`
|
|
43
|
+
}
|
|
44
|
+
return tunnel.httpsOverHttp({ proxy: proxyObject })
|
|
45
|
+
}
|
|
46
|
+
const getWorkSpaceUrl = () => {
|
|
47
|
+
switch (process.env.NODE_ENV_BLINQ) {
|
|
48
|
+
case 'local':
|
|
49
|
+
return 'http://localhost:6000/api/workspace'
|
|
50
|
+
case 'dev':
|
|
51
|
+
return 'https://dev.api.blinq.io/api/workspace'
|
|
52
|
+
case "stage":
|
|
53
|
+
return 'https://stage.api.blinq.io/api/workspace'
|
|
54
|
+
default:
|
|
55
|
+
return 'https://api.blinq.io/api/workspace'
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
for (let i = 2; i < argv.length; i++) {
|
|
60
|
+
const arg = argv[i]
|
|
61
|
+
switch (arg) {
|
|
62
|
+
case '--token':
|
|
63
|
+
if (i + 1 < argv.length && !argv[i + 1].startsWith('--')) {
|
|
64
|
+
token = argv[++i]
|
|
65
|
+
} else {
|
|
66
|
+
console.error('Error: --token argument provided without a token.')
|
|
67
|
+
process.exit(1)
|
|
68
|
+
}
|
|
69
|
+
break
|
|
70
|
+
case '--extractDir':
|
|
71
|
+
if (i + 1 < argv.length && !argv[i + 1].startsWith('--')) {
|
|
72
|
+
extractPath = argv[++i]
|
|
73
|
+
} else {
|
|
74
|
+
console.error('Error: --extractPath argument provided without a path.')
|
|
75
|
+
process.exit(1)
|
|
76
|
+
}
|
|
77
|
+
break
|
|
78
|
+
default:
|
|
79
|
+
console.error(`Unexpected argument: ${arg}`)
|
|
80
|
+
process.exit(1)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (token === null || token === undefined || token === '') {
|
|
85
|
+
console.error('Error: --token argument not provided')
|
|
86
|
+
process.exit(1)
|
|
87
|
+
}
|
|
88
|
+
if (extractPath === '' || extractPath === null || extractPath === undefined) {
|
|
89
|
+
console.error('Error: --extractPath argument not provided')
|
|
90
|
+
process.exit(1)
|
|
91
|
+
}
|
|
92
|
+
const dirExists = (path) => {
|
|
93
|
+
try {
|
|
94
|
+
return fs.statSync(path).isDirectory()
|
|
95
|
+
} catch (e) {
|
|
96
|
+
if (e.code == 'ENOENT') {
|
|
97
|
+
// no such file or directory. File really does not exist
|
|
98
|
+
console.log('Not a valid directory: ' + path)
|
|
99
|
+
return false
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
console.log('Exception fs.statSync (' + path + '): ' + e)
|
|
103
|
+
throw e // something else went wrong, we don't have rights, ...
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const ssoUrl = getSSoUrl()
|
|
107
|
+
|
|
108
|
+
const downloadAndInstall = async (extractPath, token) => {
|
|
109
|
+
if (!dirExists(extractPath)) {
|
|
110
|
+
fs.mkdirSync(extractPath, { recursive: true })
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const accessKeyUrl = `${ssoUrl}/getProjectByAccessKey`
|
|
114
|
+
const response = await axios.post(accessKeyUrl, {
|
|
115
|
+
access_key: token,
|
|
116
|
+
httpAgent: getProxy(),
|
|
117
|
+
proxy: false,
|
|
118
|
+
})
|
|
119
|
+
if (response.status !== 200) {
|
|
120
|
+
console.error('Error: Unable to fetch project')
|
|
121
|
+
process.exit(1)
|
|
122
|
+
}
|
|
123
|
+
const data = response.data
|
|
124
|
+
if (!data.status) {
|
|
125
|
+
console.error('Error: Invalid access key')
|
|
126
|
+
process.exit(1)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const workspaceUrl = getWorkSpaceUrl() + '/pull-workspace'
|
|
130
|
+
const res = await axios.get(workspaceUrl, {
|
|
131
|
+
params: {
|
|
132
|
+
projectId: response.data.project._id,
|
|
133
|
+
},
|
|
134
|
+
httpAgent: getProxy(),
|
|
135
|
+
proxy: false,
|
|
136
|
+
responseType: 'arraybuffer',
|
|
137
|
+
headers: {
|
|
138
|
+
Authorization: `Bearer ${token}`,
|
|
139
|
+
'Response-Type': 'arraybuffer',
|
|
140
|
+
},
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
if (res.status !== 200) {
|
|
144
|
+
console.error('Error: Unable to fetch workspace')
|
|
145
|
+
process.exit(1)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const zip = await JSZip.loadAsync(res.data)
|
|
149
|
+
for (const filename of Object.keys(zip.files)) {
|
|
150
|
+
const fileData = zip.files[filename]
|
|
151
|
+
if (!fileData.dir) {
|
|
152
|
+
const content = await fileData.async('nodebuffer')
|
|
153
|
+
const filePath = path.join(extractPath, filename)
|
|
154
|
+
mkdirSync(path.dirname(filePath), { recursive: true })
|
|
155
|
+
writeFileSync(filePath, content)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
console.log('Extraction completed to:', extractPath)
|
|
160
|
+
} catch (error) {
|
|
161
|
+
console.error('Error:', error)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
downloadAndInstall(extractPath, token).then(() =>
|
|
166
|
+
console.log('Download completed!')
|
|
167
|
+
)
|
package/lib/api/gherkin.js
CHANGED
|
@@ -9,17 +9,33 @@ const gherkin_utils_1 = require("@cucumber/gherkin-utils");
|
|
|
9
9
|
const pickle_filter_1 = __importDefault(require("../pickle_filter"));
|
|
10
10
|
const helpers_1 = require("../cli/helpers");
|
|
11
11
|
const feature_data_format_1 = require("../formatter/feature_data_format");
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
13
|
async function getFilteredPicklesAndErrors({ newId, cwd, logger, unexpandedFeaturePaths, featurePaths, coordinates, onEnvelope, }) {
|
|
13
14
|
const gherkinQuery = new gherkin_utils_1.Query();
|
|
14
15
|
const parseErrors = [];
|
|
15
16
|
let variables, fakeData, pickleIndex = 0;
|
|
17
|
+
let dataFunction = null;
|
|
18
|
+
let functionVars = null;
|
|
19
|
+
let mjsDataFiles = null;
|
|
20
|
+
let projectDir = process.cwd();
|
|
21
|
+
if (featurePaths.length > 0) {
|
|
22
|
+
projectDir = node_path_1.default.join(node_path_1.default.dirname(featurePaths[0]), '..', '..');
|
|
23
|
+
}
|
|
16
24
|
await gherkinFromPaths(featurePaths, {
|
|
17
25
|
newId,
|
|
18
26
|
relativeTo: cwd,
|
|
19
27
|
defaultDialect: coordinates.defaultDialect,
|
|
20
28
|
}, (envelope) => {
|
|
21
29
|
if (envelope.source) {
|
|
22
|
-
|
|
30
|
+
let newDataAfterExamplesModify = envelope.source.data;
|
|
31
|
+
const functionMatch = envelope.source.data.match(/@data:function:(.*?)\.(.*)/);
|
|
32
|
+
if (functionMatch) {
|
|
33
|
+
dataFunction = functionMatch[2];
|
|
34
|
+
const { newData, mjsData } = (0, feature_data_format_1.generateExamplesFromFunction)(envelope.source.data, featurePaths[0], dataFunction, functionMatch[1]);
|
|
35
|
+
newDataAfterExamplesModify = newData;
|
|
36
|
+
mjsDataFiles = mjsData;
|
|
37
|
+
}
|
|
38
|
+
const data = (0, feature_data_format_1.generateTestData)(newDataAfterExamplesModify, undefined, undefined, projectDir);
|
|
23
39
|
envelope.source.data = data.newContent;
|
|
24
40
|
variables = data.variables;
|
|
25
41
|
fakeData = data.otherFakeData;
|
|
@@ -28,6 +44,31 @@ async function getFilteredPicklesAndErrors({ newId, cwd, logger, unexpandedFeatu
|
|
|
28
44
|
envelope.gherkinDocument.feature.children =
|
|
29
45
|
envelope.gherkinDocument.feature.children.map((scenario) => {
|
|
30
46
|
if (scenario.scenario) {
|
|
47
|
+
if (dataFunction) {
|
|
48
|
+
const { tableHeader, tableBody } = scenario.scenario.examples[0];
|
|
49
|
+
functionVars = {
|
|
50
|
+
previous: tableHeader.cells.map((cell, index) => ({
|
|
51
|
+
header: cell.value,
|
|
52
|
+
value: tableBody[0].cells[index].value,
|
|
53
|
+
})),
|
|
54
|
+
new: [],
|
|
55
|
+
};
|
|
56
|
+
const generateResult = (0, feature_data_format_1.generateExamplesFromFunctionGherkin)(tableHeader.cells, tableBody[0].cells, mjsDataFiles);
|
|
57
|
+
functionVars.new = generateResult;
|
|
58
|
+
generateResult.map(({ value }, index) => (scenario.scenario.examples[0].tableBody[0].cells[index].value = value));
|
|
59
|
+
}
|
|
60
|
+
let fakeDataIdx = 0;
|
|
61
|
+
scenario.scenario.examples.forEach((example) => {
|
|
62
|
+
example.tableBody.forEach((row) => {
|
|
63
|
+
row.cells.forEach((cell, index) => {
|
|
64
|
+
if (fakeDataIdx < fakeData.length &&
|
|
65
|
+
fakeData[fakeDataIdx].var === cell.value) {
|
|
66
|
+
cell.value = fakeData[fakeDataIdx].fake;
|
|
67
|
+
fakeDataIdx++;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
31
72
|
scenario.scenario.steps = scenario.scenario.steps.map((step) => {
|
|
32
73
|
step.text = (0, feature_data_format_1.generateTestData)(step.text, variables, fakeData).newContent;
|
|
33
74
|
return step;
|
|
@@ -38,6 +79,11 @@ async function getFilteredPicklesAndErrors({ newId, cwd, logger, unexpandedFeatu
|
|
|
38
79
|
}
|
|
39
80
|
if (envelope.pickle) {
|
|
40
81
|
envelope.pickle.steps = envelope.pickle.steps.map((step) => {
|
|
82
|
+
if (functionVars) {
|
|
83
|
+
functionVars.new.forEach(({ value }, index) => {
|
|
84
|
+
step.text = step.text.replace(functionVars.previous[index].value, value);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
41
87
|
const generateData = (0, feature_data_format_1.generateTestData)(step.text, variables, fakeData);
|
|
42
88
|
step.text = generateData.newContent;
|
|
43
89
|
pickleIndex =
|
package/lib/api/gherkin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gherkin.js","sourceRoot":"","sources":["../../src/api/gherkin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n GherkinStreams,\n IGherkinStreamOptions,\n} from '@cucumber/gherkin-streams'\nimport {\n Envelope,\n GherkinDocument,\n IdGenerator,\n Location,\n ParseError,\n Pickle,\n} from '@cucumber/messages'\nimport { Query as GherkinQuery } from '@cucumber/gherkin-utils'\nimport PickleFilter from '../pickle_filter'\nimport { orderPickles } from '../cli/helpers'\nimport { ISourcesCoordinates } from './types'\nimport { ILogger } from '../logger'\nimport { generateTestData } from '../formatter/feature_data_format'\n\ninterface PickleWithDocument {\n gherkinDocument: GherkinDocument\n location: Location\n pickle: Pickle\n}\n\nexport async function getFilteredPicklesAndErrors({\n newId,\n cwd,\n logger,\n unexpandedFeaturePaths,\n featurePaths,\n coordinates,\n onEnvelope,\n}: {\n newId: IdGenerator.NewId\n cwd: string\n logger: ILogger\n unexpandedFeaturePaths: string[]\n featurePaths: string[]\n coordinates: ISourcesCoordinates\n onEnvelope?: (envelope: Envelope) => void\n}): Promise<{\n filteredPickles: PickleWithDocument[]\n parseErrors: ParseError[]\n}> {\n const gherkinQuery = new GherkinQuery()\n const parseErrors: ParseError[] = []\n let variables: any,\n fakeData: {\n var: string\n fake: string\n }[],\n pickleIndex = 0\n\n await gherkinFromPaths(\n featurePaths,\n {\n newId,\n relativeTo: cwd,\n defaultDialect: coordinates.defaultDialect,\n },\n (envelope) => {\n if (envelope.source) {\n const data = generateTestData(envelope.source.data)\n envelope.source.data = data.newContent\n variables = data.variables\n fakeData = data.otherFakeData\n }\n\n if (envelope.gherkinDocument && envelope.gherkinDocument.feature) {\n envelope.gherkinDocument.feature.children =\n envelope.gherkinDocument.feature.children.map((scenario) => {\n if (scenario.scenario) {\n scenario.scenario.steps = scenario.scenario.steps.map((step) => {\n step.text = generateTestData(\n step.text,\n variables,\n fakeData\n ).newContent\n return step\n })\n }\n return scenario\n })\n }\n\n if (envelope.pickle) {\n envelope.pickle.steps = envelope.pickle.steps.map((step) => {\n const generateData = generateTestData(step.text, variables, fakeData)\n step.text = generateData.newContent\n pickleIndex =\n generateData.fakeIndex > pickleIndex\n ? generateData.fakeIndex\n : pickleIndex\n return step\n })\n\n for (let i = 0; i < pickleIndex; i++) {\n fakeData.shift()\n }\n pickleIndex = 0\n }\n\n gherkinQuery.update(envelope)\n if (envelope.parseError) {\n parseErrors.push(envelope.parseError)\n }\n onEnvelope?.(envelope)\n }\n )\n const pickleFilter = new PickleFilter({\n cwd,\n featurePaths: unexpandedFeaturePaths,\n names: coordinates.names,\n tagExpression: coordinates.tagExpression,\n })\n const filteredPickles: PickleWithDocument[] = gherkinQuery\n .getPickles()\n .filter((pickle) => {\n const gherkinDocument = gherkinQuery\n .getGherkinDocuments()\n .find((doc) => doc.uri === pickle.uri)\n return pickleFilter.matches({ gherkinDocument, pickle })\n })\n .map((pickle) => {\n const gherkinDocument = gherkinQuery\n .getGherkinDocuments()\n .find((doc) => doc.uri === pickle.uri)\n const location = gherkinQuery.getLocation(\n pickle.astNodeIds[pickle.astNodeIds.length - 1]\n )\n return {\n gherkinDocument,\n location,\n pickle,\n }\n })\n orderPickles(filteredPickles, coordinates.order, logger)\n return {\n filteredPickles,\n parseErrors,\n }\n}\n\nasync function gherkinFromPaths(\n paths: string[],\n options: IGherkinStreamOptions,\n onEnvelope: (envelope: Envelope) => void\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const gherkinMessageStream = GherkinStreams.fromPaths(paths, options)\n gherkinMessageStream.on('data', onEnvelope)\n gherkinMessageStream.on('end', resolve)\n gherkinMessageStream.on('error', reject)\n })\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gherkin.js","sourceRoot":"","sources":["../../src/api/gherkin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n GherkinStreams,\n IGherkinStreamOptions,\n} from '@cucumber/gherkin-streams'\nimport {\n Envelope,\n GherkinDocument,\n IdGenerator,\n Location,\n ParseError,\n Pickle,\n} from '@cucumber/messages'\nimport { Query as GherkinQuery } from '@cucumber/gherkin-utils'\nimport PickleFilter from '../pickle_filter'\nimport { orderPickles } from '../cli/helpers'\nimport { ISourcesCoordinates } from './types'\nimport { ILogger } from '../logger'\nimport {\n generateExamplesFromFunction,\n generateTestData,\n generateExamplesFromFunctionGherkin,\n} from '../formatter/feature_data_format'\nimport path from 'node:path'\ninterface PickleWithDocument {\n gherkinDocument: GherkinDocument\n location: Location\n pickle: Pickle\n}\n\ninterface FunctionVars {\n previous: {\n header: string\n value: any\n }[]\n new: {\n header: string\n value: any\n }[]\n}\n\nexport async function getFilteredPicklesAndErrors({\n newId,\n cwd,\n logger,\n unexpandedFeaturePaths,\n featurePaths,\n coordinates,\n onEnvelope,\n}: {\n newId: IdGenerator.NewId\n cwd: string\n logger: ILogger\n unexpandedFeaturePaths: string[]\n featurePaths: string[]\n coordinates: ISourcesCoordinates\n onEnvelope?: (envelope: Envelope) => void\n}): Promise<{\n filteredPickles: PickleWithDocument[]\n parseErrors: ParseError[]\n}> {\n const gherkinQuery = new GherkinQuery()\n const parseErrors: ParseError[] = []\n let variables: any,\n fakeData: {\n var: string\n fake: string\n }[],\n pickleIndex = 0\n let dataFunction: string | null = null\n let functionVars: FunctionVars | null = null\n let mjsDataFiles: any = null\n let projectDir = process.cwd()\n if (featurePaths.length > 0) {\n projectDir = path.join(path.dirname(featurePaths[0]), '..', '..')\n }\n await gherkinFromPaths(\n featurePaths,\n {\n newId,\n relativeTo: cwd,\n defaultDialect: coordinates.defaultDialect,\n },\n (envelope) => {\n if (envelope.source) {\n let newDataAfterExamplesModify = envelope.source.data\n const functionMatch = envelope.source.data.match(\n /@data:function:(.*?)\\.(.*)/\n )\n\n if (functionMatch) {\n dataFunction = functionMatch[2]\n const { newData, mjsData } = generateExamplesFromFunction(\n envelope.source.data,\n featurePaths[0],\n dataFunction,\n functionMatch[1]\n )\n newDataAfterExamplesModify = newData\n mjsDataFiles = mjsData\n }\n\n const data = generateTestData(\n newDataAfterExamplesModify,\n undefined,\n undefined,\n projectDir\n )\n envelope.source.data = data.newContent\n variables = data.variables\n fakeData = data.otherFakeData\n }\n\n if (envelope.gherkinDocument && envelope.gherkinDocument.feature) {\n envelope.gherkinDocument.feature.children =\n envelope.gherkinDocument.feature.children.map((scenario) => {\n if (scenario.scenario) {\n if (dataFunction) {\n const { tableHeader, tableBody } = scenario.scenario.examples[0]\n\n functionVars = {\n previous: tableHeader.cells.map((cell, index) => ({\n header: cell.value,\n value: tableBody[0].cells[index].value,\n })),\n new: [],\n }\n\n const generateResult = generateExamplesFromFunctionGherkin(\n tableHeader.cells,\n tableBody[0].cells,\n mjsDataFiles\n )\n\n functionVars.new = generateResult\n\n generateResult.map(\n ({ value }, index) =>\n (scenario.scenario.examples[0].tableBody[0].cells[\n index\n ].value = value)\n )\n }\n let fakeDataIdx = 0\n scenario.scenario.examples.forEach((example) => {\n example.tableBody.forEach((row) => {\n row.cells.forEach((cell, index) => {\n if (\n fakeDataIdx < fakeData.length &&\n fakeData[fakeDataIdx].var === cell.value\n ) {\n cell.value = fakeData[fakeDataIdx].fake\n fakeDataIdx++\n }\n })\n })\n })\n scenario.scenario.steps = scenario.scenario.steps.map((step) => {\n step.text = generateTestData(\n step.text,\n variables,\n fakeData\n ).newContent\n return step\n })\n }\n return scenario\n })\n }\n\n if (envelope.pickle) {\n envelope.pickle.steps = envelope.pickle.steps.map((step) => {\n if (functionVars) {\n functionVars.new.forEach(({ value }, index) => {\n step.text = step.text.replace(\n functionVars.previous[index].value,\n value\n )\n })\n }\n const generateData = generateTestData(step.text, variables, fakeData)\n step.text = generateData.newContent\n pickleIndex =\n generateData.fakeIndex > pickleIndex\n ? generateData.fakeIndex\n : pickleIndex\n return step\n })\n\n for (let i = 0; i < pickleIndex; i++) {\n fakeData.shift()\n }\n pickleIndex = 0\n }\n\n gherkinQuery.update(envelope)\n if (envelope.parseError) {\n parseErrors.push(envelope.parseError)\n }\n onEnvelope?.(envelope)\n }\n )\n const pickleFilter = new PickleFilter({\n cwd,\n featurePaths: unexpandedFeaturePaths,\n names: coordinates.names,\n tagExpression: coordinates.tagExpression,\n })\n const filteredPickles: PickleWithDocument[] = gherkinQuery\n .getPickles()\n .filter((pickle) => {\n const gherkinDocument = gherkinQuery\n .getGherkinDocuments()\n .find((doc) => doc.uri === pickle.uri)\n return pickleFilter.matches({ gherkinDocument, pickle })\n })\n .map((pickle) => {\n const gherkinDocument = gherkinQuery\n .getGherkinDocuments()\n .find((doc) => doc.uri === pickle.uri)\n const location = gherkinQuery.getLocation(\n pickle.astNodeIds[pickle.astNodeIds.length - 1]\n )\n return {\n gherkinDocument,\n location,\n pickle,\n }\n })\n orderPickles(filteredPickles, coordinates.order, logger)\n return {\n filteredPickles,\n parseErrors,\n }\n}\n\nasync function gherkinFromPaths(\n paths: string[],\n options: IGherkinStreamOptions,\n onEnvelope: (envelope: Envelope) => void\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const gherkinMessageStream = GherkinStreams.fromPaths(paths, options)\n gherkinMessageStream.on('data', onEnvelope)\n gherkinMessageStream.on('end', resolve)\n gherkinMessageStream.on('error', reject)\n })\n}\n"]}
|
package/lib/cli/index.js
CHANGED
|
@@ -24,6 +24,9 @@ class Cli {
|
|
|
24
24
|
}
|
|
25
25
|
const { options, configuration: argvConfiguration } = configuration_1.ArgvParser.parse(this.argv);
|
|
26
26
|
argvConfiguration.runName = (0, helpers_1.getRunName)(argvConfiguration);
|
|
27
|
+
if (argvConfiguration.bvtRerun) {
|
|
28
|
+
process.env.BVT_FORMATTER = 'ANALYSIS';
|
|
29
|
+
}
|
|
27
30
|
if (options.i18nLanguages) {
|
|
28
31
|
this.stdout.write((0, i18n_1.getLanguages)());
|
|
29
32
|
return {
|
package/lib/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;AAAA,kDAAyB;AACzB,gCAAuD;AACvD,oDAA6C;AAE7C,uCAAsC;AACtC,iCAAkD;AAClD,2DAAqD;AAOrD,MAAqB,GAAG;IAOtB,YAAY,EACV,IAAI,EACJ,GAAG,EACH,MAAM,EACN,MAAM,GAAG,OAAO,CAAC,MAAM,EACvB,GAAG,GAOJ;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,YAAY,GAAG,eAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC9C,IAAI,YAAY,EAAE;YAChB,MAAM,IAAA,mCAAe,GAAE,CAAA;SACxB;QACD,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,0BAAU,CAAC,KAAK,CACpE,IAAI,CAAC,IAAI,CACV,CAAA;QACD,iBAAiB,CAAC,OAAO,GAAG,IAAA,oBAAU,EAAC,iBAAiB,CAAC,CAAA;QACzD,IAAI,OAAO,CAAC,aAAa,EAAE;YACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,mBAAY,GAAE,CAAC,CAAA;YACjC,OAAO;gBACL,qBAAqB,EAAE,IAAI;gBAC3B,OAAO,EAAE,IAAI;aACd,CAAA;SACF;QACD,IAAI,OAAO,CAAC,YAAY,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,kBAAW,EAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA;YACpD,OAAO;gBACL,qBAAqB,EAAE,IAAI;gBAC3B,OAAO,EAAE,IAAI;aACd,CAAA;SACF;QAED,MAAM,WAAW,GAAG;YAClB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,YAAY;SACpB,CAAA;QACD,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,GACzD,MAAM,IAAA,uBAAiB,EACrB;YACE,IAAI,EAAE,OAAO,CAAC,MAAM;YACpB,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,QAAQ,EAAE,iBAAiB;SAC5B,EACD,WAAW,CACZ,CAAA;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,iBAAW,EAAC,gBAAgB,EAAE,WAAW,CAAC,CAAA;QACpE,OAAO;YACL,qBAAqB,EAAE,aAAa,CAAC,SAAS;YAC9C,OAAO;SACR,CAAA;IACH,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;AAAA,kDAAyB;AACzB,gCAAuD;AACvD,oDAA6C;AAE7C,uCAAsC;AACtC,iCAAkD;AAClD,2DAAqD;AAOrD,MAAqB,GAAG;IAOtB,YAAY,EACV,IAAI,EACJ,GAAG,EACH,MAAM,EACN,MAAM,GAAG,OAAO,CAAC,MAAM,EACvB,GAAG,GAOJ;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,YAAY,GAAG,eAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC9C,IAAI,YAAY,EAAE;YAChB,MAAM,IAAA,mCAAe,GAAE,CAAA;SACxB;QACD,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,0BAAU,CAAC,KAAK,CACpE,IAAI,CAAC,IAAI,CACV,CAAA;QACD,iBAAiB,CAAC,OAAO,GAAG,IAAA,oBAAU,EAAC,iBAAiB,CAAC,CAAA;QACzD,IAAI,iBAAiB,CAAC,QAAQ,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,UAAU,CAAA;SACvC;QACD,IAAI,OAAO,CAAC,aAAa,EAAE;YACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,mBAAY,GAAE,CAAC,CAAA;YACjC,OAAO;gBACL,qBAAqB,EAAE,IAAI;gBAC3B,OAAO,EAAE,IAAI;aACd,CAAA;SACF;QACD,IAAI,OAAO,CAAC,YAAY,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,kBAAW,EAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA;YACpD,OAAO;gBACL,qBAAqB,EAAE,IAAI;gBAC3B,OAAO,EAAE,IAAI;aACd,CAAA;SACF;QAED,MAAM,WAAW,GAAG;YAClB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,YAAY;SACpB,CAAA;QACD,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,GACzD,MAAM,IAAA,uBAAiB,EACrB;YACE,IAAI,EAAE,OAAO,CAAC,MAAM;YACpB,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,QAAQ,EAAE,iBAAiB;SAC5B,EACD,WAAW,CACZ,CAAA;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,iBAAW,EAAC,gBAAgB,EAAE,WAAW,CAAC,CAAA;QACpE,OAAO;YACL,qBAAqB,EAAE,aAAa,CAAC,SAAS;YAC9C,OAAO;SACR,CAAA;IACH,CAAC;CACF;AA5ED,sBA4EC","sourcesContent":["import debug from 'debug'\nimport { loadConfiguration, runCucumber } from '../api'\nimport { ArgvParser } from '../configuration'\nimport { IFormatterStream } from '../formatter'\nimport { getRunName } from './helpers'\nimport { getKeywords, getLanguages } from './i18n'\nimport { validateInstall } from './install_validator'\n\nexport interface ICliRunResult {\n shouldExitImmediately: boolean\n success: boolean\n}\n\nexport default class Cli {\n private readonly argv: string[]\n private readonly cwd: string\n private readonly stdout: IFormatterStream\n private readonly stderr: IFormatterStream\n private readonly env: NodeJS.ProcessEnv\n\n constructor({\n argv,\n cwd,\n stdout,\n stderr = process.stderr,\n env,\n }: {\n argv: string[]\n cwd: string\n stdout: IFormatterStream\n stderr?: IFormatterStream\n env: NodeJS.ProcessEnv\n }) {\n this.argv = argv\n this.cwd = cwd\n this.stdout = stdout\n this.stderr = stderr\n this.env = env\n }\n\n async run(): Promise<ICliRunResult> {\n const debugEnabled = debug.enabled('cucumber')\n if (debugEnabled) {\n await validateInstall()\n }\n const { options, configuration: argvConfiguration } = ArgvParser.parse(\n this.argv\n )\n argvConfiguration.runName = getRunName(argvConfiguration)\n if (argvConfiguration.bvtRerun) {\n process.env.BVT_FORMATTER = 'ANALYSIS'\n }\n if (options.i18nLanguages) {\n this.stdout.write(getLanguages())\n return {\n shouldExitImmediately: true,\n success: true,\n }\n }\n if (options.i18nKeywords) {\n this.stdout.write(getKeywords(options.i18nKeywords))\n return {\n shouldExitImmediately: true,\n success: true,\n }\n }\n\n const environment = {\n cwd: this.cwd,\n stdout: this.stdout,\n stderr: this.stderr,\n env: this.env,\n debug: debugEnabled,\n }\n const { useConfiguration: configuration, runConfiguration } =\n await loadConfiguration(\n {\n file: options.config,\n profiles: options.profile,\n provided: argvConfiguration,\n },\n environment\n )\n const { success } = await runCucumber(runConfiguration, environment)\n return {\n shouldExitImmediately: configuration.forceExit,\n success,\n }\n }\n}\n"]}
|
|
@@ -80,7 +80,8 @@ const ArgvParser = {
|
|
|
80
80
|
.option('--no-strict', 'succeed even if there are pending steps')
|
|
81
81
|
.option('-t, --tags <EXPRESSION>', 'only execute the features or scenarios with tags matching the expression (repeatable)', ArgvParser.mergeTags)
|
|
82
82
|
.option('--world-parameters <JSON>', 'provide parameters that will be passed to the world constructor (repeatable)', ArgvParser.mergeJson('--world-parameters'))
|
|
83
|
-
.option('--run-name <NAME>', 'provide a name for the run')
|
|
83
|
+
.option('--run-name <NAME>', 'provide a name for the run')
|
|
84
|
+
.option('--bvt-rerun', 'rerun failed scenarios from the last run');
|
|
84
85
|
program.addHelpText('afterAll', 'For more details please visit https://github.com/cucumber/cucumber-js/blob/main/docs/cli.md');
|
|
85
86
|
program.parse(argv);
|
|
86
87
|
const { config, i18nKeywords, i18nLanguages, profile, ...regularStuff } = program.opts();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argv_parser.js","sourceRoot":"","sources":["../../src/configuration/argv_parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { dialects } from '@cucumber/gherkin'\nimport { Command } from 'commander'\nimport merge from 'lodash.merge'\nimport Formatters from '../formatter/helpers/formatters'\nimport { version } from '../version'\nimport { IConfiguration } from './types'\n\nexport interface IParsedArgvOptions {\n config?: string\n i18nKeywords?: string\n i18nLanguages?: boolean\n profile: string[]\n}\n\nexport interface IParsedArgv {\n options: IParsedArgvOptions\n configuration: Partial<IConfiguration>\n}\n\ntype IRawArgvOptions = Partial<Omit<IConfiguration, 'paths'>> &\n IParsedArgvOptions\n\nconst ArgvParser = {\n collect<T>(val: T, memo: T[] = []): T[] {\n if (val) {\n return [...memo, val]\n }\n return undefined\n },\n\n mergeJson(option: string): (str: string, memo?: object) => object {\n return function (str: string, memo: object = {}) {\n let val: object\n try {\n val = JSON.parse(str)\n } catch (error) {\n const e: Error = error\n throw new Error(`${option} passed invalid JSON: ${e.message}: ${str}`)\n }\n if (typeof val !== 'object' || Array.isArray(val)) {\n throw new Error(`${option} must be passed JSON of an object: ${str}`)\n }\n return merge(memo, val)\n }\n },\n\n mergeTags(value: string, memo?: string): string {\n return memo ? `${memo} and (${value})` : `(${value})`\n },\n\n validateCountOption(value: string, optionName: string): number {\n const numericValue = parseInt(value)\n if (isNaN(numericValue) || numericValue < 0) {\n throw new Error(`${optionName} must be a non negative integer`)\n }\n return numericValue\n },\n\n validateLanguage(value: string): string {\n if (!Object.keys(dialects).includes(value)) {\n throw new Error(`Unsupported ISO 639-1: ${value}`)\n }\n return value\n },\n\n parse(argv: string[]): IParsedArgv {\n const program = new Command('cucumber-js')\n\n program\n .storeOptionsAsProperties(false)\n .usage('[options] [<GLOB|DIR|FILE[:LINE]>...]')\n .version(version, '-v, --version')\n .option('-b, --backtrace', 'show full backtrace for errors')\n .option('-c, --config <PATH>', 'specify configuration file')\n .option('-d, --dry-run', 'invoke formatters without executing steps')\n .option(\n '--exit, --force-exit',\n 'force shutdown of the event loop when the test run has finished: cucumber will call process.exit'\n )\n .option('--fail-fast', 'abort the run on first failure')\n .option(\n '-f, --format <TYPE[:PATH]>',\n 'specify the output format, optionally supply PATH to redirect formatter output (repeatable). Available formats:\\n' +\n Formatters.buildFormattersDocumentationString(),\n ArgvParser.collect\n )\n .option(\n '--format-options <JSON>',\n 'provide options for formatters (repeatable)',\n ArgvParser.mergeJson('--format-options')\n )\n .option(\n '--i18n-keywords <ISO 639-1>',\n 'list language keywords',\n ArgvParser.validateLanguage\n )\n .option('--i18n-languages', 'list languages')\n .option(\n '-i, --import <GLOB|DIR|FILE>',\n 'import files before executing features (repeatable)',\n ArgvParser.collect\n )\n .option(\n '--language <ISO 639-1>',\n 'provide the default language for feature files'\n )\n .option(\n '--name <REGEXP>',\n 'only execute the scenarios with name matching the expression (repeatable)',\n ArgvParser.collect\n )\n\n .option(\n '--order <TYPE[:SEED]>',\n 'run scenarios in the specified order. Type should be `defined` or `random`'\n )\n .option(\n '-p, --profile <NAME>',\n 'specify the profile to use (repeatable)',\n ArgvParser.collect,\n []\n )\n .option(\n '--parallel <NUMBER_OF_WORKERS>',\n 'run in parallel with the given number of workers',\n (val) => ArgvParser.validateCountOption(val, '--parallel')\n )\n .option('--publish', 'Publish a report to https://reports.cucumber.io')\n .option(\n '--publish-quiet',\n \"Don't print information banner about publishing reports\"\n )\n .option(\n '-r, --require <GLOB|DIR|FILE>',\n 'require files before executing features (repeatable)',\n ArgvParser.collect\n )\n .option(\n '--require-module <NODE_MODULE>',\n 'require node modules before requiring files (repeatable)',\n ArgvParser.collect\n )\n .option(\n '--retry <NUMBER_OF_RETRIES>',\n 'specify the number of times to retry failing test cases (default: 0)',\n (val) => ArgvParser.validateCountOption(val, '--retry')\n )\n .option(\n '--retry-tag-filter <EXPRESSION>',\n `only retries the features or scenarios with tags matching the expression (repeatable).\n This option requires '--retry' to be specified.`,\n ArgvParser.mergeTags\n )\n .option('--strict', 'fail if there are pending steps')\n .option('--no-strict', 'succeed even if there are pending steps')\n .option(\n '-t, --tags <EXPRESSION>',\n 'only execute the features or scenarios with tags matching the expression (repeatable)',\n ArgvParser.mergeTags\n )\n .option(\n '--world-parameters <JSON>',\n 'provide parameters that will be passed to the world constructor (repeatable)',\n ArgvParser.mergeJson('--world-parameters')\n )\n .option('--run-name <NAME>', 'provide a name for the run')\n\n program.addHelpText(\n 'afterAll',\n 'For more details please visit https://github.com/cucumber/cucumber-js/blob/main/docs/cli.md'\n )\n\n program.parse(argv)\n const {\n config,\n i18nKeywords,\n i18nLanguages,\n profile,\n ...regularStuff\n }: IRawArgvOptions = program.opts()\n const configuration: Partial<IConfiguration> = regularStuff\n if (program.args.length > 0) {\n configuration.paths = program.args\n }\n\n return {\n options: {\n config,\n i18nKeywords,\n i18nLanguages,\n profile,\n },\n configuration,\n }\n },\n}\n\nexport default ArgvParser\n"]}
|
|
1
|
+
{"version":3,"file":"argv_parser.js","sourceRoot":"","sources":["../../src/configuration/argv_parser.ts"],"names":[],"mappings":";;;;;AAAA,+CAA4C;AAC5C,yCAAmC;AACnC,gEAAgC;AAChC,iFAAwD;AACxD,wCAAoC;AAkBpC,MAAM,UAAU,GAAG;IACjB,OAAO,CAAI,GAAM,EAAE,OAAY,EAAE;QAC/B,IAAI,GAAG,EAAE;YACP,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAA;SACtB;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,OAAO,UAAU,GAAW,EAAE,OAAe,EAAE;YAC7C,IAAI,GAAW,CAAA;YACf,IAAI;gBACF,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;aACtB;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,CAAC,GAAU,KAAK,CAAA;gBACtB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yBAAyB,CAAC,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC,CAAA;aACvE;YACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACjD,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,sCAAsC,GAAG,EAAE,CAAC,CAAA;aACtE;YACD,OAAO,IAAA,sBAAK,EAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACzB,CAAC,CAAA;IACH,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,IAAa;QACpC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAA;IACvD,CAAC;IAED,mBAAmB,CAAC,KAAa,EAAE,UAAkB;QACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QACpC,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE;YAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,iCAAiC,CAAC,CAAA;SAChE;QACD,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAC1C,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAA;SACnD;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,IAAc;QAClB,MAAM,OAAO,GAAG,IAAI,mBAAO,CAAC,aAAa,CAAC,CAAA;QAE1C,OAAO;aACJ,wBAAwB,CAAC,KAAK,CAAC;aAC/B,KAAK,CAAC,uCAAuC,CAAC;aAC9C,OAAO,CAAC,iBAAO,EAAE,eAAe,CAAC;aACjC,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;aAC3D,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;aAC3D,MAAM,CAAC,eAAe,EAAE,2CAA2C,CAAC;aACpE,MAAM,CACL,sBAAsB,EACtB,kGAAkG,CACnG;aACA,MAAM,CAAC,aAAa,EAAE,gCAAgC,CAAC;aACvD,MAAM,CACL,4BAA4B,EAC5B,oHAAoH;YAClH,oBAAU,CAAC,kCAAkC,EAAE,EACjD,UAAU,CAAC,OAAO,CACnB;aACA,MAAM,CACL,yBAAyB,EACzB,6CAA6C,EAC7C,UAAU,CAAC,SAAS,CAAC,kBAAkB,CAAC,CACzC;aACA,MAAM,CACL,6BAA6B,EAC7B,wBAAwB,EACxB,UAAU,CAAC,gBAAgB,CAC5B;aACA,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;aAC5C,MAAM,CACL,8BAA8B,EAC9B,qDAAqD,EACrD,UAAU,CAAC,OAAO,CACnB;aACA,MAAM,CACL,wBAAwB,EACxB,gDAAgD,CACjD;aACA,MAAM,CACL,iBAAiB,EACjB,2EAA2E,EAC3E,UAAU,CAAC,OAAO,CACnB;aAEA,MAAM,CACL,uBAAuB,EACvB,4EAA4E,CAC7E;aACA,MAAM,CACL,sBAAsB,EACtB,yCAAyC,EACzC,UAAU,CAAC,OAAO,EAClB,EAAE,CACH;aACA,MAAM,CACL,gCAAgC,EAChC,kDAAkD,EAClD,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,CAC3D;aACA,MAAM,CAAC,WAAW,EAAE,iDAAiD,CAAC;aACtE,MAAM,CACL,iBAAiB,EACjB,yDAAyD,CAC1D;aACA,MAAM,CACL,+BAA+B,EAC/B,sDAAsD,EACtD,UAAU,CAAC,OAAO,CACnB;aACA,MAAM,CACL,gCAAgC,EAChC,0DAA0D,EAC1D,UAAU,CAAC,OAAO,CACnB;aACA,MAAM,CACL,6BAA6B,EAC7B,sEAAsE,EACtE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,CACxD;aACA,MAAM,CACL,iCAAiC,EACjC;wDACgD,EAChD,UAAU,CAAC,SAAS,CACrB;aACA,MAAM,CAAC,UAAU,EAAE,iCAAiC,CAAC;aACrD,MAAM,CAAC,aAAa,EAAE,yCAAyC,CAAC;aAChE,MAAM,CACL,yBAAyB,EACzB,uFAAuF,EACvF,UAAU,CAAC,SAAS,CACrB;aACA,MAAM,CACL,2BAA2B,EAC3B,8EAA8E,EAC9E,UAAU,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAC3C;aACA,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;aACzD,MAAM,CAAC,aAAa,EAAE,0CAA0C,CAAC,CAAA;QAEpE,OAAO,CAAC,WAAW,CACjB,UAAU,EACV,6FAA6F,CAC9F,CAAA;QAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,MAAM,EACJ,MAAM,EACN,YAAY,EACZ,aAAa,EACb,OAAO,EACP,GAAG,YAAY,EAChB,GAAoB,OAAO,CAAC,IAAI,EAAE,CAAA;QACnC,MAAM,aAAa,GAA4B,YAAY,CAAA;QAC3D,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,aAAa,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAA;SACnC;QAED,OAAO;YACL,OAAO,EAAE;gBACP,MAAM;gBACN,YAAY;gBACZ,aAAa;gBACb,OAAO;aACR;YACD,aAAa;SACd,CAAA;IACH,CAAC;CACF,CAAA;AAED,kBAAe,UAAU,CAAA","sourcesContent":["import { dialects } from '@cucumber/gherkin'\nimport { Command } from 'commander'\nimport merge from 'lodash.merge'\nimport Formatters from '../formatter/helpers/formatters'\nimport { version } from '../version'\nimport { IConfiguration } from './types'\n\nexport interface IParsedArgvOptions {\n config?: string\n i18nKeywords?: string\n i18nLanguages?: boolean\n profile: string[]\n}\n\nexport interface IParsedArgv {\n options: IParsedArgvOptions\n configuration: Partial<IConfiguration>\n}\n\ntype IRawArgvOptions = Partial<Omit<IConfiguration, 'paths'>> &\n IParsedArgvOptions\n\nconst ArgvParser = {\n collect<T>(val: T, memo: T[] = []): T[] {\n if (val) {\n return [...memo, val]\n }\n return undefined\n },\n\n mergeJson(option: string): (str: string, memo?: object) => object {\n return function (str: string, memo: object = {}) {\n let val: object\n try {\n val = JSON.parse(str)\n } catch (error) {\n const e: Error = error\n throw new Error(`${option} passed invalid JSON: ${e.message}: ${str}`)\n }\n if (typeof val !== 'object' || Array.isArray(val)) {\n throw new Error(`${option} must be passed JSON of an object: ${str}`)\n }\n return merge(memo, val)\n }\n },\n\n mergeTags(value: string, memo?: string): string {\n return memo ? `${memo} and (${value})` : `(${value})`\n },\n\n validateCountOption(value: string, optionName: string): number {\n const numericValue = parseInt(value)\n if (isNaN(numericValue) || numericValue < 0) {\n throw new Error(`${optionName} must be a non negative integer`)\n }\n return numericValue\n },\n\n validateLanguage(value: string): string {\n if (!Object.keys(dialects).includes(value)) {\n throw new Error(`Unsupported ISO 639-1: ${value}`)\n }\n return value\n },\n\n parse(argv: string[]): IParsedArgv {\n const program = new Command('cucumber-js')\n\n program\n .storeOptionsAsProperties(false)\n .usage('[options] [<GLOB|DIR|FILE[:LINE]>...]')\n .version(version, '-v, --version')\n .option('-b, --backtrace', 'show full backtrace for errors')\n .option('-c, --config <PATH>', 'specify configuration file')\n .option('-d, --dry-run', 'invoke formatters without executing steps')\n .option(\n '--exit, --force-exit',\n 'force shutdown of the event loop when the test run has finished: cucumber will call process.exit'\n )\n .option('--fail-fast', 'abort the run on first failure')\n .option(\n '-f, --format <TYPE[:PATH]>',\n 'specify the output format, optionally supply PATH to redirect formatter output (repeatable). Available formats:\\n' +\n Formatters.buildFormattersDocumentationString(),\n ArgvParser.collect\n )\n .option(\n '--format-options <JSON>',\n 'provide options for formatters (repeatable)',\n ArgvParser.mergeJson('--format-options')\n )\n .option(\n '--i18n-keywords <ISO 639-1>',\n 'list language keywords',\n ArgvParser.validateLanguage\n )\n .option('--i18n-languages', 'list languages')\n .option(\n '-i, --import <GLOB|DIR|FILE>',\n 'import files before executing features (repeatable)',\n ArgvParser.collect\n )\n .option(\n '--language <ISO 639-1>',\n 'provide the default language for feature files'\n )\n .option(\n '--name <REGEXP>',\n 'only execute the scenarios with name matching the expression (repeatable)',\n ArgvParser.collect\n )\n\n .option(\n '--order <TYPE[:SEED]>',\n 'run scenarios in the specified order. Type should be `defined` or `random`'\n )\n .option(\n '-p, --profile <NAME>',\n 'specify the profile to use (repeatable)',\n ArgvParser.collect,\n []\n )\n .option(\n '--parallel <NUMBER_OF_WORKERS>',\n 'run in parallel with the given number of workers',\n (val) => ArgvParser.validateCountOption(val, '--parallel')\n )\n .option('--publish', 'Publish a report to https://reports.cucumber.io')\n .option(\n '--publish-quiet',\n \"Don't print information banner about publishing reports\"\n )\n .option(\n '-r, --require <GLOB|DIR|FILE>',\n 'require files before executing features (repeatable)',\n ArgvParser.collect\n )\n .option(\n '--require-module <NODE_MODULE>',\n 'require node modules before requiring files (repeatable)',\n ArgvParser.collect\n )\n .option(\n '--retry <NUMBER_OF_RETRIES>',\n 'specify the number of times to retry failing test cases (default: 0)',\n (val) => ArgvParser.validateCountOption(val, '--retry')\n )\n .option(\n '--retry-tag-filter <EXPRESSION>',\n `only retries the features or scenarios with tags matching the expression (repeatable).\n This option requires '--retry' to be specified.`,\n ArgvParser.mergeTags\n )\n .option('--strict', 'fail if there are pending steps')\n .option('--no-strict', 'succeed even if there are pending steps')\n .option(\n '-t, --tags <EXPRESSION>',\n 'only execute the features or scenarios with tags matching the expression (repeatable)',\n ArgvParser.mergeTags\n )\n .option(\n '--world-parameters <JSON>',\n 'provide parameters that will be passed to the world constructor (repeatable)',\n ArgvParser.mergeJson('--world-parameters')\n )\n .option('--run-name <NAME>', 'provide a name for the run')\n .option('--bvt-rerun', 'rerun failed scenarios from the last run')\n\n program.addHelpText(\n 'afterAll',\n 'For more details please visit https://github.com/cucumber/cucumber-js/blob/main/docs/cli.md'\n )\n\n program.parse(argv)\n const {\n config,\n i18nKeywords,\n i18nLanguages,\n profile,\n ...regularStuff\n }: IRawArgvOptions = program.opts()\n const configuration: Partial<IConfiguration> = regularStuff\n if (program.args.length > 0) {\n configuration.paths = program.args\n }\n\n return {\n options: {\n config,\n i18nKeywords,\n i18nLanguages,\n profile,\n },\n configuration,\n }\n },\n}\n\nexport default ArgvParser\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const axiosClient: import("axios").AxiosInstance;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.axiosClient = void 0;
|
|
7
|
+
/* eslint-disable no-console */
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
const tunnel_1 = __importDefault(require("tunnel"));
|
|
10
|
+
const getProxy = () => {
|
|
11
|
+
if (!process.env.PROXY) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const proxy = process.env.PROXY;
|
|
15
|
+
const url = new URL(proxy);
|
|
16
|
+
const proxyObject = {
|
|
17
|
+
host: url.hostname,
|
|
18
|
+
port: Number(url.port),
|
|
19
|
+
};
|
|
20
|
+
const { username, password } = url;
|
|
21
|
+
if (username && password) {
|
|
22
|
+
proxyObject.proxyAuth = `${username}:${password}`;
|
|
23
|
+
}
|
|
24
|
+
return tunnel_1.default.httpsOverHttp({ proxy: proxyObject });
|
|
25
|
+
};
|
|
26
|
+
const createAxiosClient = () => {
|
|
27
|
+
try {
|
|
28
|
+
const agent = getProxy();
|
|
29
|
+
return axios_1.default.create({
|
|
30
|
+
httpsAgent: agent,
|
|
31
|
+
proxy: false,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.log(error.message);
|
|
36
|
+
throw new Error(`Error creating axios client ${error instanceof Error ? error.message : error.response.data}`);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
exports.axiosClient = createAxiosClient();
|
|
40
|
+
//# sourceMappingURL=axios_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"axios_client.js","sourceRoot":"","sources":["../../src/configuration/axios_client.ts"],"names":[],"mappings":";;;;;;AAAA,+BAA+B;AAC/B,kDAAyB;AACzB,oDAA6C;AAG7C,MAAM,QAAQ,GAAG,GAAiB,EAAE;IAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;QACtB,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,KAAK,GAAkB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAA;IAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IAC1B,MAAM,WAAW,GAAiB;QAChC,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;KACvB,CAAA;IAED,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IAElC,IAAI,QAAQ,IAAI,QAAQ,EAAE;QACxB,WAAW,CAAC,SAAS,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAA;KAClD;IACD,OAAO,gBAAM,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;AACrD,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAC7B,IAAI;QACF,MAAM,KAAK,GAAmB,QAAQ,EAAE,CAAA;QACxC,OAAO,eAAK,CAAC,MAAM,CAAC;YAClB,UAAU,EAAE,KAAK;YACjB,KAAK,EAAE,KAAK;SACb,CAAC,CAAA;KACH;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC1B,MAAM,IAAI,KAAK,CACb,+BACE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAC1D,EAAE,CACH,CAAA;KACF;AACH,CAAC,CAAA;AAEY,QAAA,WAAW,GAAG,iBAAiB,EAAE,CAAA","sourcesContent":["/* eslint-disable no-console */\nimport axios from 'axios'\nimport tunnel, { ProxyOptions } from 'tunnel'\nimport { Agent } from 'http'\n\nconst getProxy = (): Agent | null => {\n if (!process.env.PROXY) {\n return null\n }\n\n const proxy: string | null = process.env.PROXY\n const url = new URL(proxy)\n const proxyObject: ProxyOptions = {\n host: url.hostname,\n port: Number(url.port),\n }\n\n const { username, password } = url\n\n if (username && password) {\n proxyObject.proxyAuth = `${username}:${password}`\n }\n return tunnel.httpsOverHttp({ proxy: proxyObject })\n}\n\nconst createAxiosClient = () => {\n try {\n const agent: string | Agent = getProxy()\n return axios.create({\n httpsAgent: agent,\n proxy: false,\n })\n } catch (error) {\n console.log(error.message)\n throw new Error(\n `Error creating axios client ${\n error instanceof Error ? error.message : error.response.data\n }`\n )\n }\n}\n\nexport const axiosClient = createAxiosClient()\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default_configuration.js","sourceRoot":"","sources":["../../src/configuration/default_configuration.ts"],"names":[],"mappings":";;;AAEa,QAAA,qBAAqB,GAAmB;IACnD,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,KAAK;IACb,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,EAAE;IACjB,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,EAAE;IACX,aAAa,EAAE,EAAE;IACjB,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,EAAE;IACR,eAAe,EAAE,EAAE;IACnB,OAAO,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"default_configuration.js","sourceRoot":"","sources":["../../src/configuration/default_configuration.ts"],"names":[],"mappings":";;;AAEa,QAAA,qBAAqB,GAAmB;IACnD,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,KAAK;IACb,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,EAAE;IACjB,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,EAAE;IACX,aAAa,EAAE,EAAE;IACjB,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,EAAE;IACR,eAAe,EAAE,EAAE;IACnB,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,KAAK;CAChB,CAAA","sourcesContent":["import { IConfiguration } from './types'\n\nexport const DEFAULT_CONFIGURATION: IConfiguration = {\n backtrace: false,\n dryRun: false,\n forceExit: false,\n failFast: false,\n format: [],\n formatOptions: {},\n import: [],\n language: 'en',\n name: [],\n order: 'defined',\n paths: [],\n parallel: 0,\n publish: false,\n publishQuiet: false,\n require: [],\n requireModule: [],\n retry: 0,\n retryTagFilter: '',\n strict: true,\n tags: '',\n worldParameters: {},\n runName: '',\n bvtRerun: false,\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/configuration/types.ts"],"names":[],"mappings":"","sourcesContent":["import { FormatOptions } from '../formatter'\nimport { PickleOrder } from '../models/pickle_order'\n\nexport interface IConfiguration {\n backtrace: boolean\n dryRun: boolean\n forceExit: boolean\n failFast: boolean\n format: string[]\n formatOptions: FormatOptions\n import: string[]\n language: string\n name: string[]\n order: PickleOrder\n paths: string[]\n parallel: number\n publish: boolean\n /**\n * @deprecated no longer needed; see <https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md>\n */\n publishQuiet: boolean\n require: string[]\n requireModule: string[]\n retry: number\n retryTagFilter: string\n strict: boolean\n tags: string\n worldParameters: any\n runName: string\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/configuration/types.ts"],"names":[],"mappings":"","sourcesContent":["import { FormatOptions } from '../formatter'\nimport { PickleOrder } from '../models/pickle_order'\n\nexport interface IConfiguration {\n backtrace: boolean\n dryRun: boolean\n forceExit: boolean\n failFast: boolean\n format: string[]\n formatOptions: FormatOptions\n import: string[]\n language: string\n name: string[]\n order: PickleOrder\n paths: string[]\n parallel: number\n publish: boolean\n /**\n * @deprecated no longer needed; see <https://github.com/cucumber/cucumber-js/blob/main/docs/deprecations.md>\n */\n publishQuiet: boolean\n require: string[]\n requireModule: string[]\n retry: number\n retryTagFilter: string\n strict: boolean\n tags: string\n worldParameters: any\n runName: string\n bvtRerun: boolean\n}\n"]}
|
|
@@ -4,13 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const child_process_1 = require("child_process");
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const promises_1 = require("fs/promises");
|
|
7
9
|
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const tmp_1 = require("tmp");
|
|
8
11
|
const _1 = __importDefault(require("."));
|
|
9
12
|
const value_checker_1 = require("../value_checker");
|
|
10
13
|
const report_generator_1 = __importDefault(require("./helpers/report_generator"));
|
|
11
14
|
const uploader_1 = __importDefault(require("./helpers/uploader"));
|
|
12
|
-
const
|
|
13
|
-
const tmp_promise_1 = require("tmp-promise");
|
|
15
|
+
const os_1 = __importDefault(require("os"));
|
|
14
16
|
//User token
|
|
15
17
|
const TOKEN = process.env.TOKEN;
|
|
16
18
|
class BVTAnalysisFormatter extends _1.default {
|
|
@@ -60,7 +62,7 @@ class BVTAnalysisFormatter extends _1.default {
|
|
|
60
62
|
}
|
|
61
63
|
async analyzeReport(report) {
|
|
62
64
|
if (report.result.status === 'PASSED') {
|
|
63
|
-
this.log('
|
|
65
|
+
this.log('No test failed. No need to retrain\n');
|
|
64
66
|
const uploadSuccessful = await this.uploadFinalReport(report);
|
|
65
67
|
if (uploadSuccessful) {
|
|
66
68
|
process.exit(0);
|
|
@@ -98,6 +100,7 @@ class BVTAnalysisFormatter extends _1.default {
|
|
|
98
100
|
return {
|
|
99
101
|
result: finalResult,
|
|
100
102
|
testCases: finalTestCases,
|
|
103
|
+
env: report.env,
|
|
101
104
|
};
|
|
102
105
|
}
|
|
103
106
|
async processTestCase(testCase, report) {
|
|
@@ -105,7 +108,7 @@ class BVTAnalysisFormatter extends _1.default {
|
|
|
105
108
|
return testCase;
|
|
106
109
|
}
|
|
107
110
|
const failedTestSteps = testCase.steps
|
|
108
|
-
.map((step, i) => (step.result.status
|
|
111
|
+
.map((step, i) => (step.result.status === 'FAILED' ? i : null))
|
|
109
112
|
.filter((i) => i !== null);
|
|
110
113
|
const retrainStats = await this.retrain(failedTestSteps, testCase);
|
|
111
114
|
if (!retrainStats) {
|
|
@@ -133,8 +136,7 @@ class BVTAnalysisFormatter extends _1.default {
|
|
|
133
136
|
return success;
|
|
134
137
|
}
|
|
135
138
|
async retrain(failedTestCases, testCase) {
|
|
136
|
-
|
|
137
|
-
return await this.call_cucumber_client(stepsToRetrain, testCase);
|
|
139
|
+
return await this.call_cucumber_client(failedTestCases, testCase);
|
|
138
140
|
}
|
|
139
141
|
async call_cucumber_client(stepsToRetrain, testCase) {
|
|
140
142
|
return new Promise((resolve, reject) => {
|
|
@@ -143,14 +145,21 @@ class BVTAnalysisFormatter extends _1.default {
|
|
|
143
145
|
process.cwd(),
|
|
144
146
|
path_1.default.join(process.cwd(), testCase.uri),
|
|
145
147
|
`${testCase.scenarioName}`,
|
|
148
|
+
'undefined',
|
|
146
149
|
`${stepsToRetrain.join(',')}`,
|
|
147
150
|
];
|
|
148
151
|
if (process.env.BLINQ_ENV) {
|
|
149
152
|
args.push(`--env=${process.env.BLINQ_ENV}`);
|
|
150
153
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
+
if (!(0, fs_1.existsSync)(path_1.default.join(this.getAppDataDir(), 'blinq.io', '.temp'))) {
|
|
155
|
+
(0, promises_1.mkdir)(path_1.default.join(this.getAppDataDir(), 'blinq.io', '.temp'), {
|
|
156
|
+
recursive: true,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
(0, tmp_1.tmpName)(async (err, name) => {
|
|
160
|
+
const tempFile = path_1.default.join(this.getAppDataDir(), 'blinq.io', '.temp', path_1.default.basename(name));
|
|
161
|
+
console.log('File path: ', tempFile);
|
|
162
|
+
await (0, promises_1.writeFile)(tempFile, '', 'utf-8');
|
|
154
163
|
args.push(`--temp-file=${tempFile}`);
|
|
155
164
|
const cucumberClient = (0, child_process_1.spawn)('node', [cucumber_client_path, ...args], {
|
|
156
165
|
env: {
|
|
@@ -163,10 +172,11 @@ class BVTAnalysisFormatter extends _1.default {
|
|
|
163
172
|
cucumberClient.stderr.on('data', (data) => {
|
|
164
173
|
console.error(data.toString());
|
|
165
174
|
});
|
|
166
|
-
cucumberClient.on('close', (code) => {
|
|
175
|
+
cucumberClient.on('close', async (code) => {
|
|
167
176
|
if (code === 0) {
|
|
168
177
|
const reportData = (0, fs_1.readFileSync)(tempFile, 'utf-8');
|
|
169
178
|
const retrainStats = JSON.parse(reportData);
|
|
179
|
+
await (0, promises_1.unlink)(tempFile);
|
|
170
180
|
resolve(retrainStats);
|
|
171
181
|
}
|
|
172
182
|
else {
|
|
@@ -178,16 +188,37 @@ class BVTAnalysisFormatter extends _1.default {
|
|
|
178
188
|
});
|
|
179
189
|
}
|
|
180
190
|
logReportLink(runId, projectId) {
|
|
181
|
-
let reportLinkBaseUrl = 'https://app.blinq.io';
|
|
191
|
+
let reportLinkBaseUrl = 'https://www.app.blinq.io';
|
|
182
192
|
if (process.env.NODE_ENV_BLINQ === 'local') {
|
|
183
193
|
reportLinkBaseUrl = 'http://localhost:3000';
|
|
184
194
|
}
|
|
185
195
|
else if (process.env.NODE_ENV_BLINQ === 'dev') {
|
|
186
196
|
reportLinkBaseUrl = 'https://dev.app.blinq.io';
|
|
187
197
|
}
|
|
198
|
+
else if (process.env.NODE_ENV_BLINQ === 'stage') {
|
|
199
|
+
reportLinkBaseUrl = 'https://stage.app.blinq.io';
|
|
200
|
+
}
|
|
188
201
|
const reportLink = `${reportLinkBaseUrl}/${projectId}/run-report/${runId}`;
|
|
189
202
|
this.log(`Report link: ${reportLink}\n`);
|
|
190
203
|
}
|
|
204
|
+
getAppDataDir() {
|
|
205
|
+
if (process.env.BLINQ_APPDATA_DIR) {
|
|
206
|
+
return process.env.BLINQ_APPDATA_DIR;
|
|
207
|
+
}
|
|
208
|
+
let appDataDir;
|
|
209
|
+
switch (process.platform) {
|
|
210
|
+
case 'win32':
|
|
211
|
+
appDataDir = process.env.APPDATA;
|
|
212
|
+
break;
|
|
213
|
+
case 'darwin':
|
|
214
|
+
appDataDir = path_1.default.join(os_1.default.homedir(), 'Library', 'Application Support');
|
|
215
|
+
break;
|
|
216
|
+
default:
|
|
217
|
+
appDataDir = path_1.default.join(os_1.default.homedir(), '.config');
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
return appDataDir;
|
|
221
|
+
}
|
|
191
222
|
}
|
|
192
223
|
exports.default = BVTAnalysisFormatter;
|
|
193
224
|
//# sourceMappingURL=bvt_analysis_formatter.js.map
|