@dev-blinq/cucumber-js 1.0.24 → 1.0.26-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.
Files changed (32) hide show
  1. package/bin/download-install.js +167 -0
  2. package/lib/api/gherkin.js +47 -1
  3. package/lib/api/gherkin.js.map +1 -1
  4. package/lib/cli/index.js +3 -0
  5. package/lib/cli/index.js.map +1 -1
  6. package/lib/configuration/argv_parser.js +2 -1
  7. package/lib/configuration/argv_parser.js.map +1 -1
  8. package/lib/configuration/axios_client.d.ts +1 -0
  9. package/lib/configuration/axios_client.js +40 -0
  10. package/lib/configuration/axios_client.js.map +1 -0
  11. package/lib/configuration/default_configuration.js +1 -0
  12. package/lib/configuration/default_configuration.js.map +1 -1
  13. package/lib/configuration/types.d.ts +1 -0
  14. package/lib/configuration/types.js.map +1 -1
  15. package/lib/formatter/bvt_analysis_formatter.d.ts +1 -0
  16. package/lib/formatter/bvt_analysis_formatter.js +63 -160
  17. package/lib/formatter/bvt_analysis_formatter.js.map +1 -1
  18. package/lib/formatter/feature_data_format.d.ts +12 -3
  19. package/lib/formatter/feature_data_format.js +96 -8
  20. package/lib/formatter/feature_data_format.js.map +1 -1
  21. package/lib/formatter/helpers/report_generator.d.ts +26 -3
  22. package/lib/formatter/helpers/report_generator.js +163 -21
  23. package/lib/formatter/helpers/report_generator.js.map +1 -1
  24. package/lib/formatter/helpers/upload_serivce.d.ts +3 -0
  25. package/lib/formatter/helpers/upload_serivce.js +64 -3
  26. package/lib/formatter/helpers/upload_serivce.js.map +1 -1
  27. package/lib/formatter/helpers/uploader.js +86 -7
  28. package/lib/formatter/helpers/uploader.js.map +1 -1
  29. package/lib/version.d.ts +1 -1
  30. package/lib/version.js +1 -1
  31. package/lib/version.js.map +1 -1
  32. package/package.json +7 -3
@@ -1,15 +1,55 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
28
+ var _a, _b;
5
29
  Object.defineProperty(exports, "__esModule", { value: true });
6
30
  const upload_serivce_1 = require("./upload_serivce");
7
31
  const form_data_1 = __importDefault(require("form-data"));
8
- const fs_1 = __importDefault(require("fs"));
32
+ const fs_1 = __importStar(require("fs"));
9
33
  const jszip_1 = __importDefault(require("jszip"));
10
34
  const path_1 = __importDefault(require("path"));
11
- const REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL;
12
- const REPORT_SERVICE_TOKEN = process.env.REPORT_SERVICE_TOKEN;
35
+ let URL;
36
+ switch (process.env.NODE_ENV_BLINQ) {
37
+ case 'stage':
38
+ URL = 'https://stage.api.blinq.io/api/runs';
39
+ break;
40
+ case 'dev':
41
+ URL = 'https://dev.api.blinq.io/api/runs';
42
+ break;
43
+ case 'local':
44
+ URL = 'http://localhost:5001/api/runs';
45
+ break;
46
+ default:
47
+ URL = 'https://api.blinq.io/api/runs';
48
+ }
49
+ const REPORT_SERVICE_URL = (_a = process.env.REPORT_SERVICE_URL) !== null && _a !== void 0 ? _a : URL;
50
+ const BATCH_SIZE = 10;
51
+ const MAX_RETRIES = 3;
52
+ const REPORT_SERVICE_TOKEN = (_b = process.env.TOKEN) !== null && _b !== void 0 ? _b : process.env.REPORT_SERVICE_TOKEN;
13
53
  class ReportUploader {
14
54
  constructor(reportGenerator) {
15
55
  this.uploadService = new upload_serivce_1.RunUploadService(REPORT_SERVICE_URL, REPORT_SERVICE_TOKEN);
@@ -21,17 +61,52 @@ class ReportUploader {
21
61
  async uploadRun(report, runName) {
22
62
  const runDoc = await this.uploadService.createRunDocument(runName);
23
63
  const runDocId = runDoc._id;
24
- const formData = new form_data_1.default();
25
64
  const reportFolder = this.reportGenerator.reportFolder;
26
65
  if (!fs_1.default.existsSync(reportFolder)) {
27
66
  fs_1.default.mkdirSync(reportFolder);
28
67
  }
29
- const zipPath = await this.createZip(reportFolder, report);
30
- formData.append(runDocId, fs_1.default.readFileSync(zipPath), 'report.zip');
31
- await this.uploadService.upload(formData);
68
+ (0, fs_1.writeFileSync)(path_1.default.join(reportFolder, 'report.json'), JSON.stringify(report, null, 2));
69
+ if (process.env.NODE_ENV_BLINQ === 'local') {
70
+ const formData = new form_data_1.default();
71
+ const zipPath = await this.createZip(reportFolder, report);
72
+ formData.append(runDocId, fs_1.default.readFileSync(zipPath), 'report.zip');
73
+ await this.uploadService.upload(formData);
74
+ }
75
+ else {
76
+ const fileUris = [
77
+ ...getFileUrisScreenShotDir(reportFolder),
78
+ 'report.json',
79
+ ];
80
+ try {
81
+ const preSignedUrls = await this.uploadService.getPreSignedUrls(fileUris, runDocId);
82
+ for (let i = 0; i < fileUris.length; i += BATCH_SIZE) {
83
+ const batch = fileUris.slice(i, Math.min(i + BATCH_SIZE, fileUris.length));
84
+ await Promise.all(batch
85
+ .filter((fileUri) => preSignedUrls[fileUri])
86
+ .map(async (fileUri) => {
87
+ for (let j = 0; j < MAX_RETRIES; j++) {
88
+ const success = await this.uploadService.uploadFile(path_1.default.join(reportFolder, fileUri), preSignedUrls[fileUri]);
89
+ if (success) {
90
+ return;
91
+ }
92
+ }
93
+ console.error('Failed to upload file:', fileUri);
94
+ }));
95
+ }
96
+ await this.uploadService.uploadComplete(runDocId, runDoc.project_id);
97
+ }
98
+ catch (err) {
99
+ throw new Error('Failed to upload all the files');
100
+ }
101
+ }
32
102
  return { runId: runDoc._id, projectId: runDoc.project_id };
33
103
  }
34
104
  async createZip(reportFolder, report) {
105
+ if (reportFolder === null) {
106
+ console.error('report folder is empty');
107
+ console.error('it is likey that there are no scenarios to run');
108
+ throw new Error('Empty report folder');
109
+ }
35
110
  const zip = new jszip_1.default();
36
111
  zip.file('report.json', JSON.stringify(report, null, 2));
37
112
  const folder = zip.folder('screenshots');
@@ -48,4 +123,8 @@ class ReportUploader {
48
123
  }
49
124
  }
50
125
  exports.default = ReportUploader;
126
+ const getFileUrisScreenShotDir = (reportFolder) => {
127
+ const files = fs_1.default.readdirSync(path_1.default.join(reportFolder, 'screenshots'));
128
+ return files.map((file) => ['screenshots', file].join('/'));
129
+ };
51
130
  //# sourceMappingURL=uploader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"uploader.js","sourceRoot":"","sources":["../../../src/formatter/helpers/uploader.ts"],"names":[],"mappings":";;;;;AACA,qDAAmD;AAEnD,0DAAgC;AAChC,4CAAmB;AACnB,kDAAyB;AACzB,gDAAuB;AACvB,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;AACzD,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAA;AAC7D,MAAqB,cAAc;IAMjC,YAAY,eAAgC;QALpC,kBAAa,GAAG,IAAI,iCAAgB,CAC1C,kBAAkB,EAClB,oBAAoB,CACrB,CAAA;QAGC,IAAI,CAAC,kBAAkB,IAAI,CAAC,oBAAoB,EAAE;YAChD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;SAC3E;QACD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAkB,EAAE,OAAe;QACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;QAC3B,MAAM,QAAQ,GAAG,IAAI,mBAAQ,EAAE,CAAA;QAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAA;QACtD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;YAChC,YAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;SAC3B;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QAC1D,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAA;QACjE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACzC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,CAAA;IAC5D,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,YAA2B,EAAE,MAAkB;QAC7D,MAAM,GAAG,GAAG,IAAI,eAAK,EAAE,CAAA;QACvB,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAA;QACpE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,MAAM,CAAC,IAAI,CACT,IAAI,EACJ,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,CAC9D,CAAA;QACH,CAAC,CAAC,CAAA;QACF,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;QACjE,gBAAgB;QAChB,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;QACrD,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QACpC,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAChC,CAAA;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;CACF;AA/CD,iCA+CC","sourcesContent":["import ReportGenerator, { JsonReport } from './report_generator'\nimport { RunUploadService } from './upload_serivce'\n\nimport FormData from 'form-data'\nimport fs from 'fs'\nimport JSZip from 'jszip'\nimport path from 'path'\nconst REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL\nconst REPORT_SERVICE_TOKEN = process.env.REPORT_SERVICE_TOKEN\nexport default class ReportUploader {\n private uploadService = new RunUploadService(\n REPORT_SERVICE_URL,\n REPORT_SERVICE_TOKEN\n )\n private reportGenerator: ReportGenerator\n constructor(reportGenerator: ReportGenerator) {\n if (!REPORT_SERVICE_URL || !REPORT_SERVICE_TOKEN) {\n throw new Error('REPORT_SERVICE_URL and REPORT_SERVICE_TOKEN must be set')\n }\n this.reportGenerator = reportGenerator\n }\n\n async uploadRun(report: JsonReport, runName: string) {\n const runDoc = await this.uploadService.createRunDocument(runName)\n const runDocId = runDoc._id\n const formData = new FormData()\n const reportFolder = this.reportGenerator.reportFolder\n if (!fs.existsSync(reportFolder)) {\n fs.mkdirSync(reportFolder)\n }\n const zipPath = await this.createZip(reportFolder, report)\n formData.append(runDocId, fs.readFileSync(zipPath), 'report.zip')\n await this.uploadService.upload(formData)\n return { runId: runDoc._id, projectId: runDoc.project_id }\n }\n async createZip(reportFolder: string | null, report: JsonReport) {\n const zip = new JSZip()\n zip.file('report.json', JSON.stringify(report, null, 2))\n const folder = zip.folder('screenshots')\n const files = fs.readdirSync(path.join(reportFolder, 'screenshots'))\n files.forEach((file) => {\n folder.file(\n file,\n fs.readFileSync(path.join(reportFolder, 'screenshots', file))\n )\n })\n const zipBuffer = await zip.generateAsync({ type: 'nodebuffer' })\n // save zip file\n const zipPath = path.join(reportFolder, 'report.zip')\n fs.writeFileSync(zipPath, zipBuffer)\n fs.writeFileSync(\n path.join(reportFolder, 'report.json'),\n JSON.stringify(report, null, 2)\n )\n return zipPath\n }\n}\n"]}
1
+ {"version":3,"file":"uploader.js","sourceRoot":"","sources":["../../../src/formatter/helpers/uploader.ts"],"names":[],"mappings":"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","sourcesContent":["import ReportGenerator, { JsonReport } from './report_generator'\nimport { RunUploadService } from './upload_serivce'\n\nimport FormData from 'form-data'\nimport fs, { writeFileSync } from 'fs'\nimport JSZip from 'jszip'\nimport path from 'path'\n\nlet URL\n\nswitch (process.env.NODE_ENV_BLINQ) {\n case 'stage':\n URL = 'https://stage.api.blinq.io/api/runs'\n break\n case 'dev':\n URL = 'https://dev.api.blinq.io/api/runs'\n break\n case 'local':\n URL = 'http://localhost:5001/api/runs'\n break\n default:\n URL = 'https://api.blinq.io/api/runs'\n}\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\n\nexport default class ReportUploader {\n private uploadService = new RunUploadService(\n REPORT_SERVICE_URL,\n REPORT_SERVICE_TOKEN\n )\n private reportGenerator: ReportGenerator\n constructor(reportGenerator: ReportGenerator) {\n if (!REPORT_SERVICE_URL || !REPORT_SERVICE_TOKEN) {\n throw new Error('REPORT_SERVICE_URL and REPORT_SERVICE_TOKEN must be set')\n }\n this.reportGenerator = reportGenerator\n }\n\n async uploadRun(report: JsonReport, runName: string) {\n const runDoc = await this.uploadService.createRunDocument(runName)\n const runDocId = runDoc._id\n const reportFolder = this.reportGenerator.reportFolder\n if (!fs.existsSync(reportFolder)) {\n fs.mkdirSync(reportFolder)\n }\n writeFileSync(\n path.join(reportFolder, 'report.json'),\n JSON.stringify(report, null, 2)\n )\n if (process.env.NODE_ENV_BLINQ === 'local') {\n const formData = new FormData()\n const zipPath = await this.createZip(reportFolder, report)\n formData.append(runDocId, fs.readFileSync(zipPath), 'report.zip')\n await this.uploadService.upload(formData)\n } else {\n const fileUris = [\n ...getFileUrisScreenShotDir(reportFolder),\n 'report.json',\n ]\n try {\n const preSignedUrls = await this.uploadService.getPreSignedUrls(\n fileUris,\n runDocId\n )\n for (let i = 0; i < fileUris.length; i += BATCH_SIZE) {\n const batch = fileUris.slice(\n i,\n Math.min(i + BATCH_SIZE, fileUris.length)\n )\n await Promise.all(\n batch\n .filter((fileUri) => preSignedUrls[fileUri])\n .map(async (fileUri) => {\n for (let j = 0; j < MAX_RETRIES; j++) {\n const success = await this.uploadService.uploadFile(\n path.join(reportFolder, fileUri),\n preSignedUrls[fileUri]\n )\n if (success) {\n return\n }\n }\n console.error('Failed to upload file:', fileUri)\n })\n )\n }\n await this.uploadService.uploadComplete(runDocId, runDoc.project_id)\n } catch (err) {\n throw new Error('Failed to upload all the files')\n }\n }\n return { runId: runDoc._id, projectId: runDoc.project_id }\n }\n async createZip(reportFolder: string | null, report: JsonReport) {\n if (reportFolder === null) {\n console.error('report folder is empty')\n console.error('it is likey that there are no scenarios to run')\n throw new Error('Empty report folder')\n }\n const zip = new JSZip()\n zip.file('report.json', JSON.stringify(report, null, 2))\n const folder = zip.folder('screenshots')\n const files = fs.readdirSync(path.join(reportFolder, 'screenshots'))\n files.forEach((file) => {\n folder.file(\n file,\n fs.readFileSync(path.join(reportFolder, 'screenshots', file))\n )\n })\n const zipBuffer = await zip.generateAsync({ type: 'nodebuffer' })\n // save zip file\n const zipPath = path.join(reportFolder, 'report.zip')\n fs.writeFileSync(zipPath, zipBuffer)\n fs.writeFileSync(\n path.join(reportFolder, 'report.json'),\n JSON.stringify(report, null, 2)\n )\n return zipPath\n }\n}\nconst getFileUrisScreenShotDir = (reportFolder: string) => {\n const files = fs.readdirSync(path.join(reportFolder, 'screenshots'))\n\n return files.map((file) => ['screenshots', file].join('/'))\n}\n"]}
package/lib/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "1.0.24";
1
+ export declare const version = "1.0.26-stage";
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.24';
5
+ exports.version = '1.0.26-stage';
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,QAAQ,CAAA","sourcesContent":["// Generated by genversion.\nexport const version = '1.0.24'\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AACd,QAAA,OAAO,GAAG,cAAc,CAAA","sourcesContent":["// Generated by genversion.\nexport const version = '1.0.26-stage'\n"]}
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "gherkin",
9
9
  "tests"
10
10
  ],
11
- "version": "1.0.24",
11
+ "version": "1.0.26-stage",
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/tunnel": "^0.0.7",
63
64
  "assertion-error-formatter": "^3.0.0",
64
65
  "axios": "^1.6.2",
65
66
  "capital-case": "^1.0.4",
@@ -74,6 +75,7 @@
74
75
  "indent-string": "^4.0.0",
75
76
  "is-installed-globally": "^0.4.0",
76
77
  "is-stream": "^2.0.0",
78
+ "json5": "^2.2.3",
77
79
  "jszip": "^3.10.1",
78
80
  "knuth-shuffle-seeded": "^1.0.6",
79
81
  "lodash.merge": "^4.6.2",
@@ -87,8 +89,9 @@
87
89
  "string-argv": "^0.3.1",
88
90
  "strip-ansi": "6.0.1",
89
91
  "supports-color": "^8.1.1",
90
- "tempy": "^3.1.0",
91
92
  "tmp": "^0.2.1",
93
+ "tmp-promise": "^3.0.3",
94
+ "tunnel": "^0.0.6",
92
95
  "util-arity": "^1.1.0",
93
96
  "verror": "^1.10.0",
94
97
  "xmlbuilder": "^15.1.1",
@@ -182,7 +185,8 @@
182
185
  "update-dependencies": "npx npm-check-updates --upgrade"
183
186
  },
184
187
  "bin": {
185
- "cucumber-js": "bin/cucumber.js"
188
+ "cucumber-js": "bin/cucumber.js",
189
+ "download-install": "bin/download-install.js"
186
190
  },
187
191
  "license": "MIT",
188
192
  "files": [