@dev-blinq/cucumber-js 1.0.160-dev → 1.0.162-dev

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.
@@ -1,40 +1,40 @@
1
- import * as messages from '@cucumber/messages';
1
+ import * as messages from "@cucumber/messages";
2
2
  type JsonTimestamp = number;
3
- type JsonStepType = 'Unknown' | 'Context' | 'Action' | 'Outcome' | 'Conjunction';
3
+ type JsonStepType = "Unknown" | "Context" | "Action" | "Outcome" | "Conjunction";
4
4
  export type JsonResultUnknown = {
5
- status: 'UNKNOWN';
5
+ status: "UNKNOWN";
6
6
  };
7
7
  type JsonResultSkipped = {
8
- status: 'SKIPPED';
8
+ status: "SKIPPED";
9
9
  };
10
10
  type JsonResultUndefined = {
11
- status: 'UNDEFINED';
11
+ status: "UNDEFINED";
12
12
  };
13
13
  type JsonResultAmbiguous = {
14
- status: 'AMBIGUOUS';
14
+ status: "AMBIGUOUS";
15
15
  };
16
16
  export type JsonResultStarted = {
17
- status: 'STARTED';
17
+ status: "STARTED";
18
18
  startTime: JsonTimestamp;
19
19
  };
20
20
  type JsonResultPending = {
21
- status: 'PENDING';
21
+ status: "PENDING";
22
22
  startTime: JsonTimestamp;
23
23
  endTime: JsonTimestamp;
24
24
  };
25
25
  export type JsonResultPassed = {
26
- status: 'PASSED';
26
+ status: "PASSED";
27
27
  startTime: JsonTimestamp;
28
28
  endTime: JsonTimestamp;
29
29
  };
30
30
  export type JsonResultFailed = {
31
- status: 'FAILED';
31
+ status: "FAILED";
32
32
  startTime: JsonTimestamp;
33
33
  endTime: JsonTimestamp;
34
34
  message?: string;
35
35
  };
36
36
  export type JsonFixedByAi = {
37
- status: 'FIXED_BY_AI';
37
+ status: "FIXED_BY_AI";
38
38
  startTime: JsonTimestamp;
39
39
  endTime: JsonTimestamp;
40
40
  };
@@ -32,16 +32,18 @@ const fs_1 = __importDefault(require("fs"));
32
32
  const path_1 = __importDefault(require("path"));
33
33
  const upload_serivce_1 = require("./upload_serivce");
34
34
  const fs_extra_1 = require("fs-extra");
35
- const URL = process.env.NODE_ENV_BLINQ === 'dev'
36
- ? 'https://dev.api.blinq.io/api/runs'
37
- : process.env.NODE_ENV_BLINQ === 'local'
38
- ? 'http://localhost:5001/api/runs'
39
- : process.env.NODE_ENV_BLINQ === 'stage'
40
- ? 'https://stage.api.blinq.io/api/runs'
41
- : process.env.NODE_ENV_BLINQ === 'prod'
42
- ? 'https://api.blinq.io/api/runs'
35
+ // type JsonException = messages.Exception
36
+ const object_path_1 = __importDefault(require("object-path"));
37
+ const URL = process.env.NODE_ENV_BLINQ === "dev"
38
+ ? "https://dev.api.blinq.io/api/runs"
39
+ : process.env.NODE_ENV_BLINQ === "local"
40
+ ? "http://localhost:5001/api/runs"
41
+ : process.env.NODE_ENV_BLINQ === "stage"
42
+ ? "https://stage.api.blinq.io/api/runs"
43
+ : process.env.NODE_ENV_BLINQ === "prod"
44
+ ? "https://api.blinq.io/api/runs"
43
45
  : !process.env.NODE_ENV_BLINQ
44
- ? 'https://api.blinq.io/api/runs'
46
+ ? "https://api.blinq.io/api/runs"
45
47
  : `${process.env.NODE_ENV_BLINQ}/api/runs`;
46
48
  const REPORT_SERVICE_URL = (_a = process.env.REPORT_SERVICE_URL) !== null && _a !== void 0 ? _a : URL;
47
49
  const BATCH_SIZE = 10;
@@ -51,12 +53,12 @@ class ReportGenerator {
51
53
  constructor() {
52
54
  this.report = {
53
55
  result: {
54
- status: 'UNKNOWN',
56
+ status: "UNKNOWN",
55
57
  },
56
58
  testCases: [],
57
59
  env: {
58
- name: '',
59
- baseUrl: '',
60
+ name: "",
61
+ baseUrl: "",
60
62
  },
61
63
  };
62
64
  this.gherkinDocumentMap = new Map();
@@ -71,73 +73,73 @@ class ReportGenerator {
71
73
  this.networkLog = [];
72
74
  this.stepLogs = [];
73
75
  this.stepNetworkLogs = [];
74
- this.runName = '';
75
- this.ariaSnapshot = '';
76
- this.initialAriaSnapshot = '';
76
+ this.runName = "";
77
+ this.ariaSnapshot = "";
78
+ this.initialAriaSnapshot = "";
77
79
  this.reportFolder = null;
78
80
  this.uploadService = new upload_serivce_1.RunUploadService(REPORT_SERVICE_URL, REPORT_SERVICE_TOKEN);
79
81
  }
80
82
  async handleMessage(envelope, reRunId) {
81
- if (envelope.meta && 'runName' in envelope.meta) {
83
+ if (envelope.meta && "runName" in envelope.meta) {
82
84
  this.runName = envelope.meta.runName;
83
85
  }
84
86
  const type = Object.keys(envelope)[0];
85
87
  switch (type) {
86
88
  // case "meta": { break}
87
89
  // case "source": { break}
88
- case 'parseError': {
90
+ case "parseError": {
89
91
  const parseError = envelope[type];
90
92
  this.handleParseError(parseError);
91
93
  break;
92
94
  }
93
- case 'gherkinDocument': {
95
+ case "gherkinDocument": {
94
96
  const doc = envelope[type];
95
97
  this.onGherkinDocument(doc);
96
98
  break;
97
99
  }
98
- case 'pickle': {
100
+ case "pickle": {
99
101
  const pickle = envelope[type];
100
102
  this.onPickle(pickle);
101
103
  break;
102
104
  }
103
105
  // case "stepDefinition": { break}
104
106
  // case "hook": { break} // Before Hook
105
- case 'testRunStarted': {
107
+ case "testRunStarted": {
106
108
  const testRunStarted = envelope[type];
107
109
  this.onTestRunStarted(testRunStarted);
108
110
  break;
109
111
  }
110
- case 'testCase': {
112
+ case "testCase": {
111
113
  const testCase = envelope[type];
112
114
  this.onTestCase(testCase);
113
115
  break;
114
116
  }
115
- case 'testCaseStarted': {
117
+ case "testCaseStarted": {
116
118
  const testCaseStarted = envelope[type];
117
119
  this.onTestCaseStarted(testCaseStarted);
118
120
  break;
119
121
  }
120
- case 'testStepStarted': {
122
+ case "testStepStarted": {
121
123
  const testStepStarted = envelope[type];
122
124
  this.onTestStepStarted(testStepStarted);
123
125
  break;
124
126
  }
125
- case 'attachment': {
127
+ case "attachment": {
126
128
  const attachment = envelope[type];
127
129
  this.onAttachment(attachment);
128
130
  break;
129
131
  }
130
- case 'testStepFinished': {
132
+ case "testStepFinished": {
131
133
  const testStepFinished = envelope[type];
132
134
  this.onTestStepFinished(testStepFinished);
133
135
  break;
134
136
  }
135
- case 'testCaseFinished': {
137
+ case "testCaseFinished": {
136
138
  const testCaseFinished = envelope[type];
137
139
  return await this.onTestCaseFinished(testCaseFinished, reRunId);
138
140
  }
139
141
  // case "hook": { break} // After Hook
140
- case 'testRunFinished': {
142
+ case "testRunFinished": {
141
143
  const testRunFinished = envelope[type];
142
144
  this.onTestRunFinished(testRunFinished);
143
145
  break;
@@ -153,7 +155,7 @@ class ReportGenerator {
153
155
  const { message } = parseError;
154
156
  const timestamp = new Date().getTime();
155
157
  this.report.result = {
156
- status: 'FAILED',
158
+ status: "FAILED",
157
159
  startTime: timestamp,
158
160
  endTime: timestamp,
159
161
  message: message,
@@ -196,7 +198,7 @@ class ReportGenerator {
196
198
  }
197
199
  onTestRunStarted(testRunStarted) {
198
200
  this.report.result = {
199
- status: 'STARTED',
201
+ status: "STARTED",
200
202
  startTime: this.getTimeStamp(testRunStarted.timestamp),
201
203
  };
202
204
  }
@@ -229,8 +231,7 @@ class ReportGenerator {
229
231
  for (const tableRow of examples.tableBody) {
230
232
  if (tableRow.id === exampleId) {
231
233
  for (let i = 0; i < examples.tableHeader.cells.length; i++) {
232
- parameters[examples.tableHeader.cells[i].value] =
233
- tableRow.cells[i].value;
234
+ parameters[examples.tableHeader.cells[i].value] = tableRow.cells[i].value;
234
235
  }
235
236
  }
236
237
  }
@@ -268,7 +269,7 @@ class ReportGenerator {
268
269
  text: step.text,
269
270
  commands: [],
270
271
  result: {
271
- status: 'UNKNOWN',
272
+ status: "UNKNOWN",
272
273
  },
273
274
  networkData: [],
274
275
  webLog: [],
@@ -285,7 +286,7 @@ class ReportGenerator {
285
286
  parameters,
286
287
  steps,
287
288
  result: {
288
- status: 'STARTED',
289
+ status: "STARTED",
289
290
  startTime: this.getTimeStamp(timestamp),
290
291
  },
291
292
  webLog: [],
@@ -306,25 +307,25 @@ class ReportGenerator {
306
307
  return;
307
308
  const stepProgess = this.stepReportMap.get(testStep.pickleStepId);
308
309
  stepProgess.result = {
309
- status: 'STARTED',
310
+ status: "STARTED",
310
311
  startTime: this.getTimeStamp(timestamp),
311
312
  };
312
313
  }
313
314
  onAttachment(attachment) {
314
315
  const { testStepId, body, mediaType } = attachment;
315
- if (mediaType === 'text/plain') {
316
- this.reportFolder = body.replaceAll('\\', '/');
316
+ if (mediaType === "text/plain") {
317
+ this.reportFolder = body.replaceAll("\\", "/");
317
318
  return;
318
319
  }
319
- if (mediaType === 'application/json+snapshot-before') {
320
+ if (mediaType === "application/json+snapshot-before") {
320
321
  this.initialAriaSnapshot = body;
321
322
  return;
322
323
  }
323
- if (mediaType === 'application/json+snapshot-after') {
324
+ if (mediaType === "application/json+snapshot-after") {
324
325
  this.ariaSnapshot = body;
325
326
  return;
326
327
  }
327
- if (mediaType === 'application/json+env') {
328
+ if (mediaType === "application/json+env") {
328
329
  const data = JSON.parse(body);
329
330
  this.report.env = data;
330
331
  this.report.testCases.map((testCase) => {
@@ -332,14 +333,14 @@ class ReportGenerator {
332
333
  return testCase;
333
334
  });
334
335
  }
335
- if (mediaType === 'application/json+log') {
336
+ if (mediaType === "application/json+log") {
336
337
  const log = JSON.parse(body);
337
338
  if (this.logs.length < 1000) {
338
339
  this.logs.push(log);
339
340
  this.stepLogs.push(log);
340
341
  }
341
342
  }
342
- if (mediaType === 'application/json+network') {
343
+ if (mediaType === "application/json+network") {
343
344
  const networkLog = JSON.parse(body);
344
345
  if (this.networkLog.length < 1000)
345
346
  this.networkLog.push(networkLog);
@@ -349,20 +350,20 @@ class ReportGenerator {
349
350
  if (testStep.pickleStepId === undefined)
350
351
  return;
351
352
  const stepProgess = this.stepReportMap.get(testStep.pickleStepId);
352
- if (mediaType === 'application/json') {
353
+ if (mediaType === "application/json") {
353
354
  const command = JSON.parse(body);
354
355
  stepProgess.commands.push(command);
355
356
  }
356
- else if (mediaType === 'application/json+trace') {
357
+ else if (mediaType === "application/json+trace") {
357
358
  const data = JSON.parse(body);
358
359
  stepProgess.traceFilePath = data.traceFilePath;
359
360
  }
360
361
  }
361
362
  getFailedTestStepResult({ commands, startTime, endTime, result, }) {
362
363
  for (const command of commands) {
363
- if (command.result.status === 'FAILED') {
364
+ if (command.result.status === "FAILED") {
364
365
  return {
365
- status: 'FAILED',
366
+ status: "FAILED",
366
367
  message: command.result.message,
367
368
  startTime,
368
369
  endTime,
@@ -370,7 +371,7 @@ class ReportGenerator {
370
371
  }
371
372
  }
372
373
  return {
373
- status: 'FAILED',
374
+ status: "FAILED",
374
375
  startTime,
375
376
  endTime,
376
377
  message: result.message,
@@ -380,26 +381,26 @@ class ReportGenerator {
380
381
  const { testStepId, testStepResult, timestamp } = testStepFinished;
381
382
  const testStep = this.testStepMap.get(testStepId);
382
383
  if (testStep.pickleStepId === undefined) {
383
- if (testStepResult.status === 'FAILED') {
384
+ if (testStepResult.status === "FAILED") {
384
385
  console.error(`Before/After hook failed with message: ${testStepResult.message}`);
385
386
  }
386
387
  return;
387
388
  }
388
- if (testStepResult.status === 'UNDEFINED') {
389
+ if (testStepResult.status === "UNDEFINED") {
389
390
  const step = this.stepReportMap.get(testStep.pickleStepId);
390
- const stepName = step ? step.keyword + ' ' + step.text : 'Undefined step';
391
+ const stepName = step ? step.keyword + " " + step.text : "Undefined step";
391
392
  const undefinedCommand = {
392
393
  testStepId: testStepId,
393
394
  body: JSON.stringify({
394
- type: 'error',
395
- text: 'Undefined step: ' + stepName,
395
+ type: "error",
396
+ text: "Undefined step: " + stepName,
396
397
  result: {
397
- status: 'FAILED',
398
+ status: "FAILED",
398
399
  startTime: this.getTimeStamp(timestamp),
399
400
  endTime: this.getTimeStamp(timestamp),
400
401
  },
401
402
  }),
402
- mediaType: 'application/json',
403
+ mediaType: "application/json",
403
404
  contentEncoding: messages.AttachmentContentEncoding.IDENTITY,
404
405
  };
405
406
  this.onAttachment(undefinedCommand);
@@ -412,14 +413,14 @@ class ReportGenerator {
412
413
  if (reportFolder === null) {
413
414
  throw new Error('"reportFolder" is "null". Failed to run BVT hooks. Please retry after running "Generate All" or "Record Scenario" ');
414
415
  }
415
- if (fs_1.default.existsSync(path_1.default.join(reportFolder, 'data.json'))) {
416
- data = JSON.parse(fs_1.default.readFileSync(path_1.default.join(reportFolder, 'data.json'), 'utf8'));
416
+ if (fs_1.default.existsSync(path_1.default.join(reportFolder, "data.json"))) {
417
+ data = JSON.parse(fs_1.default.readFileSync(path_1.default.join(reportFolder, "data.json"), "utf8"));
417
418
  }
418
419
  }
419
420
  catch (error) {
420
- console.log('Error reading data.json');
421
+ console.log("Error reading data.json");
421
422
  }
422
- if (testStepResult.status === 'FAILED') {
423
+ if (testStepResult.status === "FAILED") {
423
424
  stepProgess.result = this.getFailedTestStepResult({
424
425
  commands: stepProgess.commands,
425
426
  startTime: prevStepResult.startTime,
@@ -437,19 +438,60 @@ class ReportGenerator {
437
438
  stepProgess.webLog = this.stepLogs;
438
439
  stepProgess.networkData = this.stepNetworkLogs;
439
440
  stepProgess.ariaSnapshot = this.ariaSnapshot;
440
- this.ariaSnapshot = '';
441
+ this.ariaSnapshot = "";
441
442
  this.stepNetworkLogs = [];
442
443
  this.stepLogs = [];
443
444
  if (Object.keys(data).length > 0) {
444
445
  stepProgess.data = data;
445
- }
446
+ const id = testStepFinished.testCaseStartedId;
447
+ const parameters = this.testCaseReportMap.get(id).parameters;
448
+ const _parameters = {};
449
+ Object.keys(parameters).map((key) => {
450
+ if (parameters[key].startsWith("{{") && parameters[key].endsWith("}}")) {
451
+ const path = parameters[key].slice(2, -2).split(".");
452
+ let value = object_path_1.default.get(data, path);
453
+ if (value) {
454
+ if (value.startsWith("secret:")) {
455
+ value = "secret:****";
456
+ }
457
+ else if (value.startsWith("totp:")) {
458
+ value = "totp:****";
459
+ }
460
+ else if (value.startsWith("mask:")) {
461
+ value = "mask:****";
462
+ }
463
+ _parameters[key] = value;
464
+ }
465
+ }
466
+ else {
467
+ _parameters[key] = parameters[key];
468
+ }
469
+ });
470
+ this.report.testCases.find((testCase) => {
471
+ return testCase.id === id;
472
+ }).parameters = _parameters;
473
+ }
474
+ // if (process.env.TESTCASE_REPORT_FOLDER_PATH) {
475
+ // this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH
476
+ // if (!fs.existsSync(this.reportFolder)) {
477
+ // fs.mkdirSync(this.reportFolder)
478
+ // }
479
+ // const reportFilePath = path.join(
480
+ // this.reportFolder,
481
+ // `report.json`
482
+ // )
483
+ // writeFileSync(reportFilePath, JSON.stringify(this.report, null, 2))
484
+ // return undefined
485
+ // // } else {
486
+ // // return await this.uploadTestCase(testProgress, reRunId)
487
+ // }
446
488
  }
447
489
  getLogFileContent() {
448
490
  let projectPath = process.cwd();
449
491
  if (process.env.PROJECT_PATH) {
450
492
  projectPath = process.env.PROJECT_PATH;
451
493
  }
452
- const logFolder = path_1.default.join(projectPath, 'logs', 'web');
494
+ const logFolder = path_1.default.join(projectPath, "logs", "web");
453
495
  if (!fs_1.default.existsSync(logFolder)) {
454
496
  return [];
455
497
  }
@@ -461,7 +503,7 @@ class ReportGenerator {
461
503
  return [];
462
504
  }
463
505
  try {
464
- const logFileContent = fs_1.default.readFileSync(path_1.default.join(logFolder, `${nextId - 1}.json`), 'utf8');
506
+ const logFileContent = fs_1.default.readFileSync(path_1.default.join(logFolder, `${nextId - 1}.json`), "utf8");
465
507
  return JSON.parse(logFileContent);
466
508
  }
467
509
  catch (error) {
@@ -471,23 +513,23 @@ class ReportGenerator {
471
513
  getTestCaseResult(steps) {
472
514
  for (const step of steps) {
473
515
  switch (step.result.status) {
474
- case 'FAILED':
516
+ case "FAILED":
475
517
  return {
476
518
  status: step.result.status,
477
519
  message: step.result.message,
478
520
  // exception: step.result.exception,
479
521
  };
480
- case 'AMBIGUOUS':
481
- case 'UNDEFINED':
482
- case 'PENDING':
522
+ case "AMBIGUOUS":
523
+ case "UNDEFINED":
524
+ case "PENDING":
483
525
  return {
484
- status: 'FAILED',
526
+ status: "FAILED",
485
527
  message: `step "${step.text}" is ${step.result.status}`,
486
528
  };
487
529
  }
488
530
  }
489
531
  return {
490
- status: 'PASSED',
532
+ status: "PASSED",
491
533
  };
492
534
  }
493
535
  async onTestCaseFinished(testCaseFinished, reRunId) {
@@ -505,7 +547,7 @@ class ReportGenerator {
505
547
  testProgress.webLog = this.logs;
506
548
  testProgress.networkLog = this.networkLog;
507
549
  testProgress.initialAriaSnapshot = this.initialAriaSnapshot;
508
- this.initialAriaSnapshot = '';
550
+ this.initialAriaSnapshot = "";
509
551
  this.networkLog = [];
510
552
  this.logs = [];
511
553
  if (process.env.TESTCASE_REPORT_FOLDER_PATH) {
@@ -522,10 +564,10 @@ class ReportGenerator {
522
564
  }
523
565
  }
524
566
  async uploadTestCase(testCase, rerunId) {
525
- let runId = '';
526
- let projectId = '';
567
+ let runId = "";
568
+ let projectId = "";
527
569
  if (!process.env.UPLOADING_TEST_CASE) {
528
- process.env.UPLOADING_TEST_CASE = '[]';
570
+ process.env.UPLOADING_TEST_CASE = "[]";
529
571
  }
530
572
  const anyRemArr = JSON.parse(process.env.UPLOADING_TEST_CASE);
531
573
  const randomID = Math.random().toString(36).substring(7);
@@ -533,9 +575,7 @@ class ReportGenerator {
533
575
  let data;
534
576
  process.env.UPLOADING_TEST_CASE = JSON.stringify(anyRemArr);
535
577
  try {
536
- if (process.env.RUN_ID &&
537
- process.env.PROJECT_ID &&
538
- !process.env.IGNORE_ENV_VARIABLES) {
578
+ if (process.env.RUN_ID && process.env.PROJECT_ID && !process.env.IGNORE_ENV_VARIABLES) {
539
579
  runId = process.env.RUN_ID;
540
580
  projectId = process.env.PROJECT_ID;
541
581
  }
@@ -552,7 +592,7 @@ class ReportGenerator {
552
592
  this.writeTestCaseReportToDisk(testCase);
553
593
  }
554
594
  catch (e) {
555
- console.error('Error uploading test case:', e);
595
+ console.error("Error uploading test case:", e);
556
596
  }
557
597
  finally {
558
598
  const arrRem = JSON.parse(process.env.UPLOADING_TEST_CASE);
@@ -562,27 +602,33 @@ class ReportGenerator {
562
602
  return data ? data : null;
563
603
  }
564
604
  writeTestCaseReportToDisk(testCase) {
605
+ var _a;
606
+ const reportFolder = (_a = this.reportFolder) !== null && _a !== void 0 ? _a : process.env.TESTCASE_REPORT_FOLDER_PATH;
607
+ if (!reportFolder) {
608
+ console.error("Report folder is not defined");
609
+ return;
610
+ }
565
611
  try {
566
612
  let i = 0;
567
- while (fs_1.default.existsSync(path_1.default.join(this.reportFolder, `${i}`))) {
613
+ while (fs_1.default.existsSync(path_1.default.join(reportFolder, `${i}`))) {
568
614
  i++;
569
615
  }
570
- fs_1.default.mkdirSync(path_1.default.join(this.reportFolder, `${i}`));
616
+ fs_1.default.mkdirSync(path_1.default.join(reportFolder, `${i}`));
571
617
  //exclude network log from the saved report
572
618
  const networkLog = testCase.networkLog;
573
619
  delete testCase.networkLog;
574
- fs_1.default.writeFileSync(path_1.default.join(this.reportFolder, `${i}`, `report.json`), JSON.stringify(testCase, null, 2));
575
- fs_1.default.writeFileSync(path_1.default.join(this.reportFolder, `${i}`, `network.json`), JSON.stringify(networkLog, null, 2));
620
+ fs_1.default.writeFileSync(path_1.default.join(reportFolder, `${i}`, `report.json`), JSON.stringify(testCase, null, 2));
621
+ fs_1.default.writeFileSync(path_1.default.join(reportFolder, `${i}`, `network.json`), JSON.stringify(networkLog, null, 2));
576
622
  }
577
623
  catch (error) {
578
- console.error('Error writing test case report to disk:', error);
624
+ console.error("Error writing test case report to disk:", error);
579
625
  }
580
626
  }
581
627
  onTestRunFinished(testRunFinished) {
582
628
  const { timestamp, success, message } = testRunFinished;
583
629
  const prevResult = this.report.result;
584
630
  this.report.result = {
585
- status: success ? 'PASSED' : 'FAILED',
631
+ status: success ? "PASSED" : "FAILED",
586
632
  startTime: prevResult.startTime,
587
633
  endTime: this.getTimeStamp(timestamp),
588
634
  message,
@@ -1 +1 @@
1
- {"version":3,"file":"report_generator.js","sourceRoot":"","sources":["../../../src/formatter/helpers/report_generator.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from '@cucumber/messages'\nimport fs from 'fs'\nimport path from 'path'\nimport { RunUploadService } from './upload_serivce'\nimport { writeFileSync } from 'fs-extra'\n// type JsonException = messages.Exception\ntype JsonTimestamp = number //messages.Timestamp\ntype JsonStepType = 'Unknown' | 'Context' | 'Action' | 'Outcome' | 'Conjunction'\n\nconst URL =\n process.env.NODE_ENV_BLINQ === 'dev'\n ? 'https://dev.api.blinq.io/api/runs'\n : process.env.NODE_ENV_BLINQ === 'local'\n ? 'http://localhost:5001/api/runs'\n : process.env.NODE_ENV_BLINQ === 'stage'\n ? 'https://stage.api.blinq.io/api/runs'\n : process.env.NODE_ENV_BLINQ === 'prod'\n ? 'https://api.blinq.io/api/runs'\n : !process.env.NODE_ENV_BLINQ\n ? 'https://api.blinq.io/api/runs'\n : `${process.env.NODE_ENV_BLINQ}/api/runs`\n\nconst REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL ?? URL\nconst BATCH_SIZE = 10\nconst MAX_RETRIES = 3\nconst REPORT_SERVICE_TOKEN =\n process.env.TOKEN ?? process.env.REPORT_SERVICE_TOKEN\nexport type JsonResultUnknown = {\n status: 'UNKNOWN'\n}\ntype JsonResultSkipped = {\n status: 'SKIPPED'\n}\ntype JsonResultUndefined = {\n status: 'UNDEFINED'\n}\ntype JsonResultAmbiguous = {\n status: 'AMBIGUOUS'\n}\nexport type JsonResultStarted = {\n status: 'STARTED'\n startTime: JsonTimestamp\n}\ntype JsonResultPending = {\n status: 'PENDING'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\nexport type JsonResultPassed = {\n status: 'PASSED'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\nexport type JsonResultFailed = {\n status: 'FAILED'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n message?: string\n // exception?: JsonException\n}\nexport type JsonFixedByAi = {\n status: 'FIXED_BY_AI'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\n\ntype JsonCommandResult = JsonResultPassed | JsonResultFailed\ntype JsonStepResult =\n | JsonResultUnknown\n | JsonResultSkipped\n | JsonResultUndefined\n | JsonResultAmbiguous\n | JsonResultStarted\n | JsonResultPending\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi\nexport type JsonTestResult =\n | JsonResultUnknown\n | JsonResultStarted\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi\ntype JsonReportResult = JsonTestResult\n\ntype JsonCommand = {\n type: string\n value?: string\n text: string\n screenshotId?: string\n result: JsonCommandResult\n netWorkLog?: any[]\n}\ntype webLog = {\n type: string\n text: string\n location: string\n time: string\n}\nexport type JsonStep = {\n keyword: string\n type: JsonStepType\n text: string\n commands: JsonCommand[]\n result: JsonStepResult\n webLog: webLog[]\n networkData: any[]\n data?: any\n ariaSnapshot: string\n traceFilePath?: string\n}\nexport type RetrainStats = {\n result: JsonTestResult\n totalSteps: number\n upload_id: string\n local_id: number\n}\nexport type JsonTestProgress = {\n id: string\n featureName: string\n uri: string\n scenarioName: string\n parameters: Record<string, string>\n steps: JsonStep[]\n result: JsonTestResult\n retrainStats?: RetrainStats\n initialAriaSnapshot?: string\n webLog: any\n networkLog: any\n env: {\n name: string\n baseUrl: string\n }\n}\n\nexport type JsonReport = {\n testCases: JsonTestProgress[]\n result: JsonReportResult\n env: {\n name: string\n baseUrl: string\n }\n}\n\ninterface MetaMessage extends messages.Meta {\n runName: string\n}\ninterface EnvelopeWithMetaMessage extends messages.Envelope {\n meta: MetaMessage\n}\nexport default class ReportGenerator {\n private report: JsonReport = {\n result: {\n status: 'UNKNOWN',\n },\n testCases: [] as JsonTestProgress[],\n env: {\n name: '',\n baseUrl: '',\n },\n }\n private gherkinDocumentMap = new Map<string, messages.GherkinDocument>()\n private stepMap = new Map<string, messages.Step>()\n private pickleMap = new Map<string, messages.Pickle>()\n private testCaseMap = new Map<string, messages.TestCase>()\n private testStepMap = new Map<string, messages.TestStep>()\n private stepReportMap = new Map<string, JsonStep>()\n private testCaseReportMap = new Map<string, JsonTestProgress>()\n private scenarioIterationCountMap = new Map<string, number>()\n private logs: webLog[] = []\n private networkLog: any[] = []\n private stepLogs: webLog[] = []\n private stepNetworkLogs: any[] = []\n private runName = ''\n private ariaSnapshot = ''\n private initialAriaSnapshot = ''\n reportFolder: null | string = null\n private uploadService = new RunUploadService(\n REPORT_SERVICE_URL,\n REPORT_SERVICE_TOKEN\n )\n\n async handleMessage(\n envelope: EnvelopeWithMetaMessage | messages.Envelope,\n reRunId?: string\n ): Promise<any> {\n if (envelope.meta && 'runName' in envelope.meta) {\n this.runName = envelope.meta.runName\n }\n const type = Object.keys(envelope)[0] as keyof messages.Envelope\n switch (type) {\n // case \"meta\": { break}\n // case \"source\": { break}\n case 'parseError': {\n const parseError = envelope[type]\n this.handleParseError(parseError)\n break\n }\n case 'gherkinDocument': {\n const doc = envelope[type]\n this.onGherkinDocument(doc)\n break\n }\n case 'pickle': {\n const pickle = envelope[type]\n this.onPickle(pickle)\n break\n }\n // case \"stepDefinition\": { break}\n // case \"hook\": { break} // Before Hook\n case 'testRunStarted': {\n const testRunStarted = envelope[type]\n this.onTestRunStarted(testRunStarted)\n break\n }\n case 'testCase': {\n const testCase = envelope[type]\n this.onTestCase(testCase)\n break\n }\n case 'testCaseStarted': {\n const testCaseStarted = envelope[type]\n this.onTestCaseStarted(testCaseStarted)\n break\n }\n case 'testStepStarted': {\n const testStepStarted = envelope[type]\n this.onTestStepStarted(testStepStarted)\n break\n }\n case 'attachment': {\n const attachment = envelope[type]\n this.onAttachment(attachment)\n break\n }\n case 'testStepFinished': {\n const testStepFinished = envelope[type]\n this.onTestStepFinished(testStepFinished)\n break\n }\n case 'testCaseFinished': {\n const testCaseFinished = envelope[type]\n return await this.onTestCaseFinished(testCaseFinished, reRunId)\n }\n // case \"hook\": { break} // After Hook\n case 'testRunFinished': {\n const testRunFinished = envelope[type]\n this.onTestRunFinished(testRunFinished)\n break\n }\n\n // case \"parameterType\" : { break}\n // case \"undefinedParameterType\": { break}\n }\n }\n getReport() {\n return this.report\n }\n private handleParseError(parseError: messages.ParseError) {\n const { message } = parseError\n const timestamp = new Date().getTime()\n this.report.result = {\n status: 'FAILED',\n startTime: timestamp,\n endTime: timestamp,\n message: message,\n }\n }\n\n private onGherkinDocument(doc: messages.GherkinDocument) {\n this.gherkinDocumentMap.set(doc.uri, doc)\n doc.feature.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.rule) {\n child.rule.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n }\n })\n }\n })\n }\n private onPickle(pickle: messages.Pickle) {\n this.pickleMap.set(pickle.id, pickle)\n }\n private getTimeStamp(timestamp: messages.Timestamp) {\n return timestamp.seconds * 1000 + timestamp.nanos / 1000000\n }\n private onTestRunStarted(testRunStarted: messages.TestRunStarted) {\n this.report.result = {\n status: 'STARTED',\n startTime: this.getTimeStamp(testRunStarted.timestamp),\n }\n }\n private onTestCase(testCase: messages.TestCase) {\n this.testCaseMap.set(testCase.id, testCase)\n testCase.testSteps.forEach((testStep) => {\n this.testStepMap.set(testStep.id, testStep)\n })\n }\n private _findScenario(doc: messages.GherkinDocument, scenarioId: string) {\n for (const child of doc.feature.children) {\n if (child.scenario && child.scenario.id === scenarioId) {\n return child.scenario\n }\n if (child.rule) {\n for (const scenario of child.rule.children) {\n if (scenario.scenario && scenario.scenario.id === scenarioId) {\n return scenario.scenario\n }\n }\n }\n }\n throw new Error(`scenario \"${scenarioId}\" not found`)\n }\n private _getParameters(scenario: messages.Scenario, exampleId: string) {\n const parameters: Record<string, string> = {}\n if (scenario.examples.length === 0) return parameters\n for (const examples of scenario.examples) {\n for (const tableRow of examples.tableBody) {\n if (tableRow.id === exampleId) {\n for (let i = 0; i < examples.tableHeader.cells.length; i++) {\n parameters[examples.tableHeader.cells[i].value] =\n tableRow.cells[i].value\n }\n }\n }\n }\n return parameters\n }\n private onTestCaseStarted(testCaseStarted: messages.TestCaseStarted) {\n const { testCaseId, id, timestamp } = testCaseStarted\n const testCase = this.testCaseMap.get(testCaseId)\n if (testCase === undefined)\n throw new Error(`testCase with id ${testCaseId} not found`)\n const pickle = this.pickleMap.get(testCase.pickleId)\n if (pickle === undefined)\n throw new Error(`pickle with id ${testCase.pickleId} not found`)\n\n const doc = this.gherkinDocumentMap.get(pickle.uri)\n if (doc === undefined)\n throw new Error(`gherkinDocument with uri ${pickle.uri} not found`)\n const featureName = doc.feature.name\n\n const scenarioId = pickle.astNodeIds[0]\n const scenario = this._findScenario(doc, scenarioId)\n const scenarioName = scenario.name\n if (!this.scenarioIterationCountMap.has(scenarioId)) {\n this.scenarioIterationCountMap.set(scenarioId, 1)\n }\n const parameters = this._getParameters(scenario, pickle.astNodeIds[1])\n console.log(\n `Running scenario ${scenarioName} iteration ${this.scenarioIterationCountMap.get(\n scenarioId\n )} with parameters:\\n${JSON.stringify(parameters, null, 4)}\\n \n `\n )\n this.scenarioIterationCountMap.set(\n scenarioId,\n this.scenarioIterationCountMap.get(scenarioId) + 1\n )\n const steps: JsonStep[] = pickle.steps.map((pickleStep) => {\n const stepId = pickleStep.astNodeIds[0]\n const step = this.stepMap.get(stepId)\n this.stepReportMap.set(pickleStep.id, {\n type: step.keywordType,\n keyword: step.keyword,\n text: step.text,\n commands: [],\n result: {\n status: 'UNKNOWN',\n },\n networkData: [],\n webLog: [],\n data: {},\n ariaSnapshot: this.ariaSnapshot,\n })\n return this.stepReportMap.get(pickleStep.id)\n })\n this.testCaseReportMap.set(id, {\n id,\n uri: pickle.uri,\n featureName,\n scenarioName,\n parameters,\n steps,\n result: {\n status: 'STARTED',\n startTime: this.getTimeStamp(timestamp),\n },\n webLog: [],\n networkLog: [],\n env: {\n name: this.report.env.name,\n baseUrl: this.report.env.baseUrl,\n },\n })\n this.report.testCases.push(this.testCaseReportMap.get(id))\n }\n private onTestStepStarted(testStepStarted: messages.TestStepStarted) {\n const { testStepId, timestamp } = testStepStarted\n const testStep = this.testStepMap.get(testStepId)\n if (testStep === undefined)\n throw new Error(`testStep with id ${testStepId} not found`)\n if (testStep.pickleStepId === undefined) return\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n stepProgess.result = {\n status: 'STARTED',\n startTime: this.getTimeStamp(timestamp),\n }\n }\n private onAttachment(attachment: messages.Attachment) {\n const { testStepId, body, mediaType } = attachment\n if (mediaType === 'text/plain') {\n this.reportFolder = body.replaceAll('\\\\', '/')\n return\n }\n if (mediaType === 'application/json+snapshot-before') {\n this.initialAriaSnapshot = body\n return\n }\n if (mediaType === 'application/json+snapshot-after') {\n this.ariaSnapshot = body\n return\n }\n if (mediaType === 'application/json+env') {\n const data = JSON.parse(body)\n this.report.env = data\n this.report.testCases.map((testCase) => {\n testCase.env = data\n return testCase\n })\n }\n if (mediaType === 'application/json+log') {\n const log: webLog = JSON.parse(body)\n if (this.logs.length < 1000) {\n this.logs.push(log)\n this.stepLogs.push(log)\n }\n }\n if (mediaType === 'application/json+network') {\n const networkLog = JSON.parse(body)\n if (this.networkLog.length < 1000) this.networkLog.push(networkLog)\n this.stepNetworkLogs.push(networkLog)\n }\n const testStep = this.testStepMap.get(testStepId)\n if (testStep.pickleStepId === undefined) return\n\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n if (mediaType === 'application/json') {\n const command: JsonCommand = JSON.parse(body)\n stepProgess.commands.push(command)\n } else if (mediaType === 'application/json+trace') {\n const data = JSON.parse(body)\n stepProgess.traceFilePath = data.traceFilePath\n }\n }\n private getFailedTestStepResult({\n commands,\n startTime,\n endTime,\n result,\n }: {\n commands: JsonCommand[]\n startTime: number\n endTime: number\n result: messages.TestStepResult\n }): JsonStepResult {\n for (const command of commands) {\n if (command.result.status === 'FAILED') {\n return {\n status: 'FAILED',\n message: command.result.message,\n startTime,\n endTime,\n } as const\n }\n }\n return {\n status: 'FAILED',\n startTime,\n endTime,\n message: result.message,\n }\n }\n private onTestStepFinished(testStepFinished: messages.TestStepFinished) {\n const { testStepId, testStepResult, timestamp } = testStepFinished\n const testStep = this.testStepMap.get(testStepId)\n if (testStep.pickleStepId === undefined) {\n if (testStepResult.status === 'FAILED') {\n console.error(\n `Before/After hook failed with message: ${testStepResult.message}`\n )\n }\n return\n }\n if (testStepResult.status === 'UNDEFINED') {\n const step = this.stepReportMap.get(testStep.pickleStepId)\n const stepName = step ? step.keyword + ' ' + step.text : 'Undefined step'\n const undefinedCommand: messages.Attachment = {\n testStepId: testStepId,\n body: JSON.stringify({\n type: 'error',\n text: 'Undefined step: ' + stepName,\n result: {\n status: 'FAILED',\n startTime: this.getTimeStamp(timestamp),\n endTime: this.getTimeStamp(timestamp),\n },\n }),\n mediaType: 'application/json',\n contentEncoding: messages.AttachmentContentEncoding.IDENTITY,\n }\n this.onAttachment(undefinedCommand)\n }\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n const prevStepResult = stepProgess.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n let data = {}\n try {\n const reportFolder = this.reportFolder\n if (reportFolder === null) {\n throw new Error(\n '\"reportFolder\" is \"null\". Failed to run BVT hooks. Please retry after running \"Generate All\" or \"Record Scenario\" '\n )\n }\n if (fs.existsSync(path.join(reportFolder, 'data.json'))) {\n data = JSON.parse(\n fs.readFileSync(path.join(reportFolder, 'data.json'), 'utf8')\n )\n }\n } catch (error) {\n console.log('Error reading data.json')\n }\n if (testStepResult.status === 'FAILED') {\n stepProgess.result = this.getFailedTestStepResult({\n commands: stepProgess.commands,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n result: testStepResult,\n })\n } else {\n stepProgess.result = {\n status: testStepResult.status,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n }\n }\n\n stepProgess.webLog = this.stepLogs\n stepProgess.networkData = this.stepNetworkLogs\n stepProgess.ariaSnapshot = this.ariaSnapshot\n this.ariaSnapshot = ''\n this.stepNetworkLogs = []\n this.stepLogs = []\n if (Object.keys(data).length > 0) {\n stepProgess.data = data\n }\n }\n getLogFileContent() {\n let projectPath = process.cwd()\n if (process.env.PROJECT_PATH) {\n projectPath = process.env.PROJECT_PATH\n }\n const logFolder = path.join(projectPath, 'logs', 'web')\n if (!fs.existsSync(logFolder)) {\n return []\n }\n let nextId = 1\n while (fs.existsSync(path.join(logFolder, `${nextId}.json`))) {\n nextId++\n }\n if (nextId === 1) {\n return []\n }\n try {\n const logFileContent = fs.readFileSync(\n path.join(logFolder, `${nextId - 1}.json`),\n 'utf8'\n )\n return JSON.parse(logFileContent)\n } catch (error) {\n return []\n }\n }\n private getTestCaseResult(steps: JsonStep[]) {\n for (const step of steps) {\n switch (step.result.status) {\n case 'FAILED':\n return {\n status: step.result.status,\n message: step.result.message,\n // exception: step.result.exception,\n } as const\n case 'AMBIGUOUS':\n case 'UNDEFINED':\n case 'PENDING':\n return {\n status: 'FAILED',\n message: `step \"${step.text}\" is ${step.result.status}`,\n } as const\n }\n }\n return {\n status: 'PASSED',\n } as const\n }\n private async onTestCaseFinished(\n testCaseFinished: messages.TestCaseFinished,\n reRunId?: string\n ) {\n const { testCaseStartedId, timestamp } = testCaseFinished\n const testProgress = this.testCaseReportMap.get(testCaseStartedId)\n const prevResult = testProgress.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n const steps = Object.values(testProgress.steps)\n const result = this.getTestCaseResult(steps)\n const endTime = this.getTimeStamp(timestamp)\n testProgress.result = {\n ...result,\n startTime: prevResult.startTime,\n endTime,\n }\n testProgress.webLog = this.logs\n testProgress.networkLog = this.networkLog\n testProgress.initialAriaSnapshot = this.initialAriaSnapshot\n this.initialAriaSnapshot = ''\n this.networkLog = []\n this.logs = []\n\n if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH\n if (!fs.existsSync(this.reportFolder)) {\n fs.mkdirSync(this.reportFolder)\n }\n const reportFilePath = path.join(\n this.reportFolder,\n `${endTime}_${testProgress.scenarioName}.json`\n )\n writeFileSync(reportFilePath, JSON.stringify(testProgress, null, 2))\n return undefined\n } else {\n return await this.uploadTestCase(testProgress, reRunId)\n }\n }\n private async uploadTestCase(testCase: JsonTestProgress, rerunId?: string) {\n let runId = ''\n let projectId = ''\n if (!process.env.UPLOADING_TEST_CASE) {\n process.env.UPLOADING_TEST_CASE = '[]'\n }\n const anyRemArr = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[]\n const randomID = Math.random().toString(36).substring(7)\n anyRemArr.push(randomID)\n let data\n process.env.UPLOADING_TEST_CASE = JSON.stringify(anyRemArr)\n try {\n if (\n process.env.RUN_ID &&\n process.env.PROJECT_ID &&\n !process.env.IGNORE_ENV_VARIABLES\n ) {\n runId = process.env.RUN_ID\n projectId = process.env.PROJECT_ID\n } else {\n const runDoc = await this.uploadService.createRunDocument(this.runName)\n runId = runDoc._id\n projectId = runDoc.project_id\n if (!process.env.IGNORE_ENV_VARIABLES) {\n process.env.RUN_ID = runId\n process.env.PROJECT_ID = projectId\n }\n }\n data = await this.uploadService.uploadTestCase(\n testCase,\n runId,\n projectId,\n this.reportFolder,\n rerunId\n )\n this.writeTestCaseReportToDisk(testCase)\n } catch (e) {\n console.error('Error uploading test case:', e)\n } finally {\n const arrRem = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[]\n arrRem.splice(arrRem.indexOf(randomID), 1)\n process.env.UPLOADING_TEST_CASE = JSON.stringify(arrRem)\n }\n return data ? data : null\n }\n private writeTestCaseReportToDisk(testCase: JsonTestProgress) {\n try {\n let i = 0\n while (fs.existsSync(path.join(this.reportFolder, `${i}`))) {\n i++\n }\n fs.mkdirSync(path.join(this.reportFolder, `${i}`))\n //exclude network log from the saved report\n const networkLog = testCase.networkLog\n delete testCase.networkLog\n fs.writeFileSync(\n path.join(this.reportFolder, `${i}`, `report.json`),\n JSON.stringify(testCase, null, 2)\n )\n fs.writeFileSync(\n path.join(this.reportFolder, `${i}`, `network.json`),\n JSON.stringify(networkLog, null, 2)\n )\n } catch (error) {\n console.error('Error writing test case report to disk:', error)\n }\n }\n private onTestRunFinished(testRunFinished: messages.TestRunFinished) {\n const { timestamp, success, message } = testRunFinished\n const prevResult = this.report.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n this.report.result = {\n status: success ? 'PASSED' : 'FAILED',\n startTime: prevResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n message,\n // exception,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"report_generator.js","sourceRoot":"","sources":["../../../src/formatter/helpers/report_generator.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from \"@cucumber/messages\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { RunUploadService } from \"./upload_serivce\";\nimport { writeFileSync } from \"fs-extra\";\n// type JsonException = messages.Exception\nimport objectPath from \"object-path\";\ntype JsonTimestamp = number; //messages.Timestamp\ntype JsonStepType = \"Unknown\" | \"Context\" | \"Action\" | \"Outcome\" | \"Conjunction\";\n\nconst URL =\n process.env.NODE_ENV_BLINQ === \"dev\"\n ? \"https://dev.api.blinq.io/api/runs\"\n : process.env.NODE_ENV_BLINQ === \"local\"\n ? \"http://localhost:5001/api/runs\"\n : process.env.NODE_ENV_BLINQ === \"stage\"\n ? \"https://stage.api.blinq.io/api/runs\"\n : process.env.NODE_ENV_BLINQ === \"prod\"\n ? \"https://api.blinq.io/api/runs\"\n : !process.env.NODE_ENV_BLINQ\n ? \"https://api.blinq.io/api/runs\"\n : `${process.env.NODE_ENV_BLINQ}/api/runs`;\n\nconst REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL ?? URL;\nconst BATCH_SIZE = 10;\nconst MAX_RETRIES = 3;\nconst REPORT_SERVICE_TOKEN = process.env.TOKEN ?? process.env.REPORT_SERVICE_TOKEN;\nexport type JsonResultUnknown = {\n status: \"UNKNOWN\";\n};\ntype JsonResultSkipped = {\n status: \"SKIPPED\";\n};\ntype JsonResultUndefined = {\n status: \"UNDEFINED\";\n};\ntype JsonResultAmbiguous = {\n status: \"AMBIGUOUS\";\n};\nexport type JsonResultStarted = {\n status: \"STARTED\";\n startTime: JsonTimestamp;\n};\ntype JsonResultPending = {\n status: \"PENDING\";\n startTime: JsonTimestamp;\n endTime: JsonTimestamp;\n};\nexport type JsonResultPassed = {\n status: \"PASSED\";\n startTime: JsonTimestamp;\n endTime: JsonTimestamp;\n};\nexport type JsonResultFailed = {\n status: \"FAILED\";\n startTime: JsonTimestamp;\n endTime: JsonTimestamp;\n message?: string;\n // exception?: JsonException\n};\nexport type JsonFixedByAi = {\n status: \"FIXED_BY_AI\";\n startTime: JsonTimestamp;\n endTime: JsonTimestamp;\n};\n\ntype JsonCommandResult = JsonResultPassed | JsonResultFailed;\ntype JsonStepResult =\n | JsonResultUnknown\n | JsonResultSkipped\n | JsonResultUndefined\n | JsonResultAmbiguous\n | JsonResultStarted\n | JsonResultPending\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi;\nexport type JsonTestResult =\n | JsonResultUnknown\n | JsonResultStarted\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi;\ntype JsonReportResult = JsonTestResult;\n\ntype JsonCommand = {\n type: string;\n value?: string;\n text: string;\n screenshotId?: string;\n result: JsonCommandResult;\n netWorkLog?: any[];\n};\ntype webLog = {\n type: string;\n text: string;\n location: string;\n time: string;\n};\nexport type JsonStep = {\n keyword: string;\n type: JsonStepType;\n text: string;\n commands: JsonCommand[];\n result: JsonStepResult;\n webLog: webLog[];\n networkData: any[];\n data?: any;\n ariaSnapshot: string;\n traceFilePath?: string;\n};\nexport type RetrainStats = {\n result: JsonTestResult;\n totalSteps: number;\n upload_id: string;\n local_id: number;\n};\nexport type JsonTestProgress = {\n id: string;\n featureName: string;\n uri: string;\n scenarioName: string;\n parameters: Record<string, string>;\n steps: JsonStep[];\n result: JsonTestResult;\n retrainStats?: RetrainStats;\n initialAriaSnapshot?: string;\n webLog: any;\n networkLog: any;\n env: {\n name: string;\n baseUrl: string;\n };\n};\n\nexport type JsonReport = {\n testCases: JsonTestProgress[];\n result: JsonReportResult;\n env: {\n name: string;\n baseUrl: string;\n };\n};\n\ninterface MetaMessage extends messages.Meta {\n runName: string;\n}\ninterface EnvelopeWithMetaMessage extends messages.Envelope {\n meta: MetaMessage;\n}\nexport default class ReportGenerator {\n private report: JsonReport = {\n result: {\n status: \"UNKNOWN\",\n },\n testCases: [] as JsonTestProgress[],\n env: {\n name: \"\",\n baseUrl: \"\",\n },\n };\n private gherkinDocumentMap = new Map<string, messages.GherkinDocument>();\n private stepMap = new Map<string, messages.Step>();\n private pickleMap = new Map<string, messages.Pickle>();\n private testCaseMap = new Map<string, messages.TestCase>();\n private testStepMap = new Map<string, messages.TestStep>();\n private stepReportMap = new Map<string, JsonStep>();\n private testCaseReportMap = new Map<string, JsonTestProgress>();\n private scenarioIterationCountMap = new Map<string, number>();\n private logs: webLog[] = [];\n private networkLog: any[] = [];\n private stepLogs: webLog[] = [];\n private stepNetworkLogs: any[] = [];\n private runName = \"\";\n private ariaSnapshot = \"\";\n private initialAriaSnapshot = \"\";\n reportFolder: null | string = null;\n private uploadService = new RunUploadService(REPORT_SERVICE_URL, REPORT_SERVICE_TOKEN);\n\n async handleMessage(envelope: EnvelopeWithMetaMessage | messages.Envelope, reRunId?: string): Promise<any> {\n if (envelope.meta && \"runName\" in envelope.meta) {\n this.runName = envelope.meta.runName;\n }\n const type = Object.keys(envelope)[0] as keyof messages.Envelope;\n switch (type) {\n // case \"meta\": { break}\n // case \"source\": { break}\n case \"parseError\": {\n const parseError = envelope[type];\n this.handleParseError(parseError);\n break;\n }\n case \"gherkinDocument\": {\n const doc = envelope[type];\n this.onGherkinDocument(doc);\n break;\n }\n case \"pickle\": {\n const pickle = envelope[type];\n this.onPickle(pickle);\n break;\n }\n // case \"stepDefinition\": { break}\n // case \"hook\": { break} // Before Hook\n case \"testRunStarted\": {\n const testRunStarted = envelope[type];\n this.onTestRunStarted(testRunStarted);\n break;\n }\n case \"testCase\": {\n const testCase = envelope[type];\n this.onTestCase(testCase);\n break;\n }\n case \"testCaseStarted\": {\n const testCaseStarted = envelope[type];\n this.onTestCaseStarted(testCaseStarted);\n break;\n }\n case \"testStepStarted\": {\n const testStepStarted = envelope[type];\n this.onTestStepStarted(testStepStarted);\n break;\n }\n case \"attachment\": {\n const attachment = envelope[type];\n this.onAttachment(attachment);\n break;\n }\n case \"testStepFinished\": {\n const testStepFinished = envelope[type];\n this.onTestStepFinished(testStepFinished);\n break;\n }\n case \"testCaseFinished\": {\n const testCaseFinished = envelope[type];\n return await this.onTestCaseFinished(testCaseFinished, reRunId);\n }\n // case \"hook\": { break} // After Hook\n case \"testRunFinished\": {\n const testRunFinished = envelope[type];\n this.onTestRunFinished(testRunFinished);\n break;\n }\n\n // case \"parameterType\" : { break}\n // case \"undefinedParameterType\": { break}\n }\n }\n getReport() {\n return this.report;\n }\n private handleParseError(parseError: messages.ParseError) {\n const { message } = parseError;\n const timestamp = new Date().getTime();\n this.report.result = {\n status: \"FAILED\",\n startTime: timestamp,\n endTime: timestamp,\n message: message,\n };\n }\n\n private onGherkinDocument(doc: messages.GherkinDocument) {\n this.gherkinDocumentMap.set(doc.uri, doc);\n doc.feature.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step);\n });\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step);\n });\n } else if (child.rule) {\n child.rule.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step);\n });\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step);\n });\n }\n });\n }\n });\n }\n private onPickle(pickle: messages.Pickle) {\n this.pickleMap.set(pickle.id, pickle);\n }\n private getTimeStamp(timestamp: messages.Timestamp) {\n return timestamp.seconds * 1000 + timestamp.nanos / 1000000;\n }\n private onTestRunStarted(testRunStarted: messages.TestRunStarted) {\n this.report.result = {\n status: \"STARTED\",\n startTime: this.getTimeStamp(testRunStarted.timestamp),\n };\n }\n private onTestCase(testCase: messages.TestCase) {\n this.testCaseMap.set(testCase.id, testCase);\n testCase.testSteps.forEach((testStep) => {\n this.testStepMap.set(testStep.id, testStep);\n });\n }\n private _findScenario(doc: messages.GherkinDocument, scenarioId: string) {\n for (const child of doc.feature.children) {\n if (child.scenario && child.scenario.id === scenarioId) {\n return child.scenario;\n }\n if (child.rule) {\n for (const scenario of child.rule.children) {\n if (scenario.scenario && scenario.scenario.id === scenarioId) {\n return scenario.scenario;\n }\n }\n }\n }\n throw new Error(`scenario \"${scenarioId}\" not found`);\n }\n private _getParameters(scenario: messages.Scenario, exampleId: string) {\n const parameters: Record<string, string> = {};\n if (scenario.examples.length === 0) return parameters;\n for (const examples of scenario.examples) {\n for (const tableRow of examples.tableBody) {\n if (tableRow.id === exampleId) {\n for (let i = 0; i < examples.tableHeader.cells.length; i++) {\n parameters[examples.tableHeader.cells[i].value] = tableRow.cells[i].value;\n }\n }\n }\n }\n return parameters;\n }\n private onTestCaseStarted(testCaseStarted: messages.TestCaseStarted) {\n const { testCaseId, id, timestamp } = testCaseStarted;\n const testCase = this.testCaseMap.get(testCaseId);\n if (testCase === undefined) throw new Error(`testCase with id ${testCaseId} not found`);\n const pickle = this.pickleMap.get(testCase.pickleId);\n if (pickle === undefined) throw new Error(`pickle with id ${testCase.pickleId} not found`);\n\n const doc = this.gherkinDocumentMap.get(pickle.uri);\n if (doc === undefined) throw new Error(`gherkinDocument with uri ${pickle.uri} not found`);\n const featureName = doc.feature.name;\n\n const scenarioId = pickle.astNodeIds[0];\n const scenario = this._findScenario(doc, scenarioId);\n const scenarioName = scenario.name;\n if (!this.scenarioIterationCountMap.has(scenarioId)) {\n this.scenarioIterationCountMap.set(scenarioId, 1);\n }\n const parameters = this._getParameters(scenario, pickle.astNodeIds[1]);\n console.log(\n `Running scenario ${scenarioName} iteration ${this.scenarioIterationCountMap.get(\n scenarioId\n )} with parameters:\\n${JSON.stringify(parameters, null, 4)}\\n \n `\n );\n this.scenarioIterationCountMap.set(scenarioId, this.scenarioIterationCountMap.get(scenarioId) + 1);\n const steps: JsonStep[] = pickle.steps.map((pickleStep) => {\n const stepId = pickleStep.astNodeIds[0];\n const step = this.stepMap.get(stepId);\n this.stepReportMap.set(pickleStep.id, {\n type: step.keywordType,\n keyword: step.keyword,\n text: step.text,\n commands: [],\n result: {\n status: \"UNKNOWN\",\n },\n networkData: [],\n webLog: [],\n data: {},\n ariaSnapshot: this.ariaSnapshot,\n });\n return this.stepReportMap.get(pickleStep.id);\n });\n this.testCaseReportMap.set(id, {\n id,\n uri: pickle.uri,\n featureName,\n scenarioName,\n parameters,\n steps,\n result: {\n status: \"STARTED\",\n startTime: this.getTimeStamp(timestamp),\n },\n webLog: [],\n networkLog: [],\n env: {\n name: this.report.env.name,\n baseUrl: this.report.env.baseUrl,\n },\n });\n this.report.testCases.push(this.testCaseReportMap.get(id));\n }\n private onTestStepStarted(testStepStarted: messages.TestStepStarted) {\n const { testStepId, timestamp } = testStepStarted;\n const testStep = this.testStepMap.get(testStepId);\n if (testStep === undefined) throw new Error(`testStep with id ${testStepId} not found`);\n if (testStep.pickleStepId === undefined) return;\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId);\n stepProgess.result = {\n status: \"STARTED\",\n startTime: this.getTimeStamp(timestamp),\n };\n }\n private onAttachment(attachment: messages.Attachment) {\n const { testStepId, body, mediaType } = attachment;\n if (mediaType === \"text/plain\") {\n this.reportFolder = body.replaceAll(\"\\\\\", \"/\");\n return;\n }\n if (mediaType === \"application/json+snapshot-before\") {\n this.initialAriaSnapshot = body;\n return;\n }\n if (mediaType === \"application/json+snapshot-after\") {\n this.ariaSnapshot = body;\n return;\n }\n if (mediaType === \"application/json+env\") {\n const data = JSON.parse(body);\n this.report.env = data;\n this.report.testCases.map((testCase) => {\n testCase.env = data;\n return testCase;\n });\n }\n if (mediaType === \"application/json+log\") {\n const log: webLog = JSON.parse(body);\n if (this.logs.length < 1000) {\n this.logs.push(log);\n this.stepLogs.push(log);\n }\n }\n if (mediaType === \"application/json+network\") {\n const networkLog = JSON.parse(body);\n if (this.networkLog.length < 1000) this.networkLog.push(networkLog);\n this.stepNetworkLogs.push(networkLog);\n }\n const testStep = this.testStepMap.get(testStepId);\n if (testStep.pickleStepId === undefined) return;\n\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId);\n if (mediaType === \"application/json\") {\n const command: JsonCommand = JSON.parse(body);\n stepProgess.commands.push(command);\n } else if (mediaType === \"application/json+trace\") {\n const data = JSON.parse(body);\n stepProgess.traceFilePath = data.traceFilePath;\n }\n }\n private getFailedTestStepResult({\n commands,\n startTime,\n endTime,\n result,\n }: {\n commands: JsonCommand[];\n startTime: number;\n endTime: number;\n result: messages.TestStepResult;\n }): JsonStepResult {\n for (const command of commands) {\n if (command.result.status === \"FAILED\") {\n return {\n status: \"FAILED\",\n message: command.result.message,\n startTime,\n endTime,\n } as const;\n }\n }\n return {\n status: \"FAILED\",\n startTime,\n endTime,\n message: result.message,\n };\n }\n private onTestStepFinished(testStepFinished: messages.TestStepFinished) {\n const { testStepId, testStepResult, timestamp } = testStepFinished;\n const testStep = this.testStepMap.get(testStepId);\n if (testStep.pickleStepId === undefined) {\n if (testStepResult.status === \"FAILED\") {\n console.error(`Before/After hook failed with message: ${testStepResult.message}`);\n }\n return;\n }\n if (testStepResult.status === \"UNDEFINED\") {\n const step = this.stepReportMap.get(testStep.pickleStepId);\n const stepName = step ? step.keyword + \" \" + step.text : \"Undefined step\";\n const undefinedCommand: messages.Attachment = {\n testStepId: testStepId,\n body: JSON.stringify({\n type: \"error\",\n text: \"Undefined step: \" + stepName,\n result: {\n status: \"FAILED\",\n startTime: this.getTimeStamp(timestamp),\n endTime: this.getTimeStamp(timestamp),\n },\n }),\n mediaType: \"application/json\",\n contentEncoding: messages.AttachmentContentEncoding.IDENTITY,\n };\n this.onAttachment(undefinedCommand);\n }\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId);\n const prevStepResult = stepProgess.result as {\n status: \"STARTED\";\n startTime: JsonTimestamp;\n };\n let data = {};\n try {\n const reportFolder = this.reportFolder;\n if (reportFolder === null) {\n throw new Error(\n '\"reportFolder\" is \"null\". Failed to run BVT hooks. Please retry after running \"Generate All\" or \"Record Scenario\" '\n );\n }\n if (fs.existsSync(path.join(reportFolder, \"data.json\"))) {\n data = JSON.parse(fs.readFileSync(path.join(reportFolder, \"data.json\"), \"utf8\"));\n }\n } catch (error) {\n console.log(\"Error reading data.json\");\n }\n if (testStepResult.status === \"FAILED\") {\n stepProgess.result = this.getFailedTestStepResult({\n commands: stepProgess.commands,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n result: testStepResult,\n });\n } else {\n stepProgess.result = {\n status: testStepResult.status,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n };\n }\n\n stepProgess.webLog = this.stepLogs;\n stepProgess.networkData = this.stepNetworkLogs;\n stepProgess.ariaSnapshot = this.ariaSnapshot;\n this.ariaSnapshot = \"\";\n this.stepNetworkLogs = [];\n this.stepLogs = [];\n if (Object.keys(data).length > 0) {\n stepProgess.data = data;\n const id = testStepFinished.testCaseStartedId;\n const parameters = this.testCaseReportMap.get(id).parameters;\n const _parameters: typeof parameters = {};\n Object.keys(parameters).map((key) => {\n if (parameters[key].startsWith(\"{{\") && parameters[key].endsWith(\"}}\")) {\n const path = parameters[key].slice(2, -2).split(\".\");\n let value = objectPath.get(data, path);\n if (value) {\n if (value.startsWith(\"secret:\")) {\n value = \"secret:****\";\n } else if (value.startsWith(\"totp:\")) {\n value = \"totp:****\";\n } else if (value.startsWith(\"mask:\")) {\n value = \"mask:****\";\n }\n _parameters[key] = value;\n }\n } else {\n _parameters[key] = parameters[key];\n }\n });\n this.report.testCases.find((testCase) => {\n return testCase.id === id;\n }).parameters = _parameters;\n }\n\n // if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n // this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH\n // if (!fs.existsSync(this.reportFolder)) {\n // fs.mkdirSync(this.reportFolder)\n // }\n // const reportFilePath = path.join(\n // this.reportFolder,\n // `report.json`\n // )\n // writeFileSync(reportFilePath, JSON.stringify(this.report, null, 2))\n // return undefined\n // // } else {\n // // return await this.uploadTestCase(testProgress, reRunId)\n // }\n }\n getLogFileContent() {\n let projectPath = process.cwd();\n if (process.env.PROJECT_PATH) {\n projectPath = process.env.PROJECT_PATH;\n }\n const logFolder = path.join(projectPath, \"logs\", \"web\");\n if (!fs.existsSync(logFolder)) {\n return [];\n }\n let nextId = 1;\n while (fs.existsSync(path.join(logFolder, `${nextId}.json`))) {\n nextId++;\n }\n if (nextId === 1) {\n return [];\n }\n try {\n const logFileContent = fs.readFileSync(path.join(logFolder, `${nextId - 1}.json`), \"utf8\");\n return JSON.parse(logFileContent);\n } catch (error) {\n return [];\n }\n }\n private getTestCaseResult(steps: JsonStep[]) {\n for (const step of steps) {\n switch (step.result.status) {\n case \"FAILED\":\n return {\n status: step.result.status,\n message: step.result.message,\n // exception: step.result.exception,\n } as const;\n case \"AMBIGUOUS\":\n case \"UNDEFINED\":\n case \"PENDING\":\n return {\n status: \"FAILED\",\n message: `step \"${step.text}\" is ${step.result.status}`,\n } as const;\n }\n }\n return {\n status: \"PASSED\",\n } as const;\n }\n private async onTestCaseFinished(testCaseFinished: messages.TestCaseFinished, reRunId?: string) {\n const { testCaseStartedId, timestamp } = testCaseFinished;\n const testProgress = this.testCaseReportMap.get(testCaseStartedId);\n const prevResult = testProgress.result as {\n status: \"STARTED\";\n startTime: JsonTimestamp;\n };\n const steps = Object.values(testProgress.steps);\n const result = this.getTestCaseResult(steps);\n const endTime = this.getTimeStamp(timestamp);\n testProgress.result = {\n ...result,\n startTime: prevResult.startTime,\n endTime,\n };\n testProgress.webLog = this.logs;\n testProgress.networkLog = this.networkLog;\n testProgress.initialAriaSnapshot = this.initialAriaSnapshot;\n this.initialAriaSnapshot = \"\";\n this.networkLog = [];\n this.logs = [];\n\n if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH;\n if (!fs.existsSync(this.reportFolder)) {\n fs.mkdirSync(this.reportFolder);\n }\n const reportFilePath = path.join(this.reportFolder, `${endTime}_${testProgress.scenarioName}.json`);\n writeFileSync(reportFilePath, JSON.stringify(testProgress, null, 2));\n return undefined;\n } else {\n return await this.uploadTestCase(testProgress, reRunId);\n }\n }\n private async uploadTestCase(testCase: JsonTestProgress, rerunId?: string) {\n let runId = \"\";\n let projectId = \"\";\n if (!process.env.UPLOADING_TEST_CASE) {\n process.env.UPLOADING_TEST_CASE = \"[]\";\n }\n const anyRemArr = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[];\n const randomID = Math.random().toString(36).substring(7);\n anyRemArr.push(randomID);\n let data;\n process.env.UPLOADING_TEST_CASE = JSON.stringify(anyRemArr);\n try {\n if (process.env.RUN_ID && process.env.PROJECT_ID && !process.env.IGNORE_ENV_VARIABLES) {\n runId = process.env.RUN_ID;\n projectId = process.env.PROJECT_ID;\n } else {\n const runDoc = await this.uploadService.createRunDocument(this.runName);\n runId = runDoc._id;\n projectId = runDoc.project_id;\n if (!process.env.IGNORE_ENV_VARIABLES) {\n process.env.RUN_ID = runId;\n process.env.PROJECT_ID = projectId;\n }\n }\n data = await this.uploadService.uploadTestCase(testCase, runId, projectId, this.reportFolder, rerunId);\n this.writeTestCaseReportToDisk(testCase);\n } catch (e) {\n console.error(\"Error uploading test case:\", e);\n } finally {\n const arrRem = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[];\n arrRem.splice(arrRem.indexOf(randomID), 1);\n process.env.UPLOADING_TEST_CASE = JSON.stringify(arrRem);\n }\n return data ? data : null;\n }\n private writeTestCaseReportToDisk(testCase: JsonTestProgress) {\n const reportFolder = this.reportFolder ?? process.env.TESTCASE_REPORT_FOLDER_PATH;\n if (!reportFolder) {\n console.error(\"Report folder is not defined\");\n return;\n }\n try {\n let i = 0;\n while (fs.existsSync(path.join(reportFolder, `${i}`))) {\n i++;\n }\n fs.mkdirSync(path.join(reportFolder, `${i}`));\n //exclude network log from the saved report\n const networkLog = testCase.networkLog;\n delete testCase.networkLog;\n fs.writeFileSync(path.join(reportFolder, `${i}`, `report.json`), JSON.stringify(testCase, null, 2));\n fs.writeFileSync(path.join(reportFolder, `${i}`, `network.json`), JSON.stringify(networkLog, null, 2));\n } catch (error) {\n console.error(\"Error writing test case report to disk:\", error);\n }\n }\n private onTestRunFinished(testRunFinished: messages.TestRunFinished) {\n const { timestamp, success, message } = testRunFinished;\n const prevResult = this.report.result as {\n status: \"STARTED\";\n startTime: JsonTimestamp;\n };\n this.report.result = {\n status: success ? \"PASSED\" : \"FAILED\",\n startTime: prevResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n message,\n // exception,\n };\n }\n}\n"]}
package/lib/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "1.0.160-dev";
1
+ export declare const version = "1.0.162-dev";
package/lib/version.js CHANGED
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.version = void 0;
4
4
  // Generated by genversion.
5
- exports.version = '1.0.160-dev';
5
+ exports.version = '1.0.162-dev';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AACd,QAAA,OAAO,GAAG,aAAa,CAAA","sourcesContent":["// Generated by genversion.\nexport const version = '1.0.160-dev'\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AACd,QAAA,OAAO,GAAG,aAAa,CAAA","sourcesContent":["// Generated by genversion.\nexport const version = '1.0.162-dev'\n"]}
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "gherkin",
9
9
  "tests"
10
10
  ],
11
- "version": "1.0.160-dev",
11
+ "version": "1.0.162-dev",
12
12
  "homepage": "https://github.com/blinq-io/cucumber-js",
13
13
  "author": "blinq.io",
14
14
  "contributors": [
@@ -60,6 +60,7 @@
60
60
  "@cucumber/messages": "22.0.0",
61
61
  "@cucumber/tag-expressions": "5.0.1",
62
62
  "@faker-js/faker": "^8.0.2",
63
+ "@types/object-path": "^0.11.4",
63
64
  "@types/tunnel": "^0.0.7",
64
65
  "assertion-error-formatter": "^3.0.0",
65
66
  "axios": "^1.6.2",
@@ -83,6 +84,7 @@
83
84
  "luxon": "3.2.1",
84
85
  "mkdirp": "^2.1.5",
85
86
  "mz": "^2.7.0",
87
+ "object-path": "^0.11.8",
86
88
  "progress": "^2.0.3",
87
89
  "resolve-pkg": "^2.0.0",
88
90
  "semver": "7.5.3",