@qualflare/cucumberjs 0.2.0 → 0.3.0

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,9 +1,12 @@
1
1
  // src/formatter/formatter.ts
2
- import { randomUUID as randomUUID2 } from "crypto";
2
+ import { randomUUID as randomUUID3 } from "crypto";
3
3
  import * as fs3 from "fs";
4
4
  import * as path4 from "path";
5
5
  import { Formatter } from "@cucumber/cucumber";
6
6
 
7
+ // src/config/resolve-config.ts
8
+ import { randomUUID } from "crypto";
9
+
7
10
  // src/shared/constants.ts
8
11
  var RESERVED_MESSAGE_MEDIA_TYPE = "application/vnd.qualflare.message+json";
9
12
  var MAX_SUITES_PER_LAUNCH = 2e3;
@@ -29,6 +32,7 @@ var PROVIDERS = [
29
32
  detect: (env) => env.GITHUB_ACTIONS === "true",
30
33
  providerName: "GitHub Actions",
31
34
  buildNumber: (env) => nonEmpty(env.GITHUB_RUN_NUMBER),
35
+ runId: (env) => nonEmpty(env.GITHUB_RUN_ID),
32
36
  runUrl: (env) => env.GITHUB_SERVER_URL && env.GITHUB_REPOSITORY && env.GITHUB_RUN_ID ? `${env.GITHUB_SERVER_URL}/${env.GITHUB_REPOSITORY}/actions/runs/${env.GITHUB_RUN_ID}` : void 0,
33
37
  prNumber: (env) => {
34
38
  const match = /^refs\/pull\/(\d+)\/merge$/.exec(env.GITHUB_REF ?? "");
@@ -39,6 +43,7 @@ var PROVIDERS = [
39
43
  detect: (env) => env.GITLAB_CI === "true",
40
44
  providerName: "GitLab CI",
41
45
  buildNumber: (env) => nonEmpty(env.CI_PIPELINE_IID),
46
+ runId: (env) => nonEmpty(env.CI_PIPELINE_ID),
42
47
  runUrl: (env) => nonEmpty(env.CI_PIPELINE_URL),
43
48
  prNumber: (env) => parsePositiveInt(env.CI_MERGE_REQUEST_IID)
44
49
  },
@@ -46,6 +51,7 @@ var PROVIDERS = [
46
51
  detect: (env) => env.CIRCLECI === "true",
47
52
  providerName: "CircleCI",
48
53
  buildNumber: (env) => nonEmpty(env.CIRCLE_BUILD_NUM),
54
+ runId: (env) => nonEmpty(env.CIRCLE_WORKFLOW_ID ?? env.CIRCLE_BUILD_NUM),
49
55
  runUrl: (env) => nonEmpty(env.CIRCLE_BUILD_URL),
50
56
  prNumber: (env) => parsePositiveInt(env.CIRCLE_PR_NUMBER)
51
57
  },
@@ -53,6 +59,7 @@ var PROVIDERS = [
53
59
  detect: (env) => env.BUILDKITE === "true",
54
60
  providerName: "Buildkite",
55
61
  buildNumber: (env) => nonEmpty(env.BUILDKITE_BUILD_NUMBER),
62
+ runId: (env) => nonEmpty(env.BUILDKITE_BUILD_ID),
56
63
  runUrl: (env) => nonEmpty(env.BUILDKITE_BUILD_URL),
57
64
  prNumber: (env) => {
58
65
  const raw = env.BUILDKITE_PULL_REQUEST;
@@ -68,6 +75,7 @@ var PROVIDERS = [
68
75
  detect: (env) => Boolean(env.JENKINS_URL),
69
76
  providerName: "Jenkins",
70
77
  buildNumber: (env) => nonEmpty(env.BUILD_NUMBER),
78
+ runId: (env) => nonEmpty(env.BUILD_TAG ?? env.BUILD_NUMBER),
71
79
  runUrl: (env) => nonEmpty(env.BUILD_URL)
72
80
  // Jenkins has no standardized PR-number env var across its many PR
73
81
  // plugins (Multibranch, GitHub Branch Source, etc.) — deliberately
@@ -77,6 +85,7 @@ var PROVIDERS = [
77
85
  detect: (env) => env.TF_BUILD === "True" || env.TF_BUILD === "true",
78
86
  providerName: "Azure Pipelines",
79
87
  buildNumber: (env) => nonEmpty(env.BUILD_BUILDID),
88
+ runId: (env) => nonEmpty(env.BUILD_BUILDID),
80
89
  runUrl: (env) => {
81
90
  const collectionUri = env.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI;
82
91
  const project = env.SYSTEM_TEAMPROJECT;
@@ -92,6 +101,7 @@ var PROVIDERS = [
92
101
  detect: (env) => Boolean(env.BITBUCKET_BUILD_NUMBER),
93
102
  providerName: "Bitbucket Pipelines",
94
103
  buildNumber: (env) => nonEmpty(env.BITBUCKET_BUILD_NUMBER),
104
+ runId: (env) => nonEmpty(env.BITBUCKET_BUILD_NUMBER),
95
105
  runUrl: (env) => {
96
106
  const origin = env.BITBUCKET_GIT_HTTP_ORIGIN;
97
107
  if (!origin) {
@@ -113,6 +123,8 @@ function detectCi(env = process.env) {
113
123
  if (runUrl !== void 0) result.ciRunUrl = runUrl;
114
124
  const prNumber = provider.prNumber?.(env);
115
125
  if (prNumber !== void 0) result.ciPrNumber = prNumber;
126
+ const runId = provider.runId?.(env);
127
+ if (runId !== void 0) result.ciRunId = runId;
116
128
  return result;
117
129
  }
118
130
  if (ciInfo.name) {
@@ -220,6 +232,7 @@ function resolveConfig(options, deps = {}) {
220
232
  const ciBuildNumber = options.ciBuildNumber ?? detectedCi.ciBuildNumber;
221
233
  const ciRunUrl = options.ciRunUrl ?? detectedCi.ciRunUrl;
222
234
  const ciPrNumber = options.ciPrNumber ?? detectedCi.ciPrNumber;
235
+ const runId = options.runId ?? firstEnv2("QUALFLARE_RUN_ID") ?? detectedCi.ciRunId ?? randomUUID();
223
236
  return {
224
237
  // `||` (truthy check), not `??`, for these three REQUIRED-non-empty wire
225
238
  // fields — an explicit `''` option must not silently win over the
@@ -239,6 +252,7 @@ function resolveConfig(options, deps = {}) {
239
252
  ciBuildNumber,
240
253
  ciRunUrl,
241
254
  ciPrNumber,
255
+ runId,
242
256
  attachScreenshots: options.attachScreenshots ?? envBool("QUALFLARE_ATTACH_SCREENSHOTS") ?? true,
243
257
  includeStepHooks: options.includeStepHooks ?? envBool("QUALFLARE_INCLUDE_STEP_HOOKS") ?? false,
244
258
  maxAttachmentBytes: options.maxAttachmentBytes ?? envInt("QUALFLARE_MAX_ATTACHMENT_BYTES") ?? 15e5,
@@ -272,8 +286,8 @@ var logger = {
272
286
  import * as fs2 from "fs";
273
287
  import * as path2 from "path";
274
288
 
275
- // src/formatter/video-uploader.ts
276
- import { randomUUID } from "crypto";
289
+ // src/formatter/video-writer.ts
290
+ import { randomUUID as randomUUID2 } from "crypto";
277
291
  import * as fs from "fs";
278
292
  import * as path from "path";
279
293
  var VIDEO_MIME_TYPES_BY_EXTENSION = {
@@ -302,7 +316,7 @@ function writeVideoAttachment(pending, outputDir, maxVideoBytes) {
302
316
  logger.warn(`skipping video attachment "${pending.name}": unsupported video format.`);
303
317
  return void 0;
304
318
  }
305
- const localVideoPath = `${randomUUID()}${resolved.extension}`;
319
+ const localVideoPath = `${randomUUID2()}${resolved.extension}`;
306
320
  const destination = path.join(outputDir, localVideoPath);
307
321
  if (pending.path !== void 0) {
308
322
  let fileSize;
@@ -953,7 +967,7 @@ function timestampMs(ts) {
953
967
  import * as os from "os";
954
968
 
955
969
  // src/config/version.ts
956
- var PACKAGE_VERSION = "0.2.0";
970
+ var PACKAGE_VERSION = "0.3.0";
957
971
 
958
972
  // src/formatter/collect-builder.ts
959
973
  function resolveOs(config) {
@@ -976,7 +990,8 @@ function buildCollectPayload(suites, config) {
976
990
  metadata: {
977
991
  version: PACKAGE_VERSION,
978
992
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
979
- cliName: "qualflare-cucumberjs"
993
+ cliName: "qualflare-cucumberjs",
994
+ runId: config.runId
980
995
  },
981
996
  properties: config.properties,
982
997
  suites,
@@ -1309,7 +1324,7 @@ var QualflareCucumberFormatter = class extends Formatter {
1309
1324
  }
1310
1325
  }
1311
1326
  fs3.mkdirSync(this.config.outputDir, { recursive: true });
1312
- const outputPath = path4.join(this.config.outputDir, `${randomUUID2()}.json`);
1327
+ const outputPath = path4.join(this.config.outputDir, `${randomUUID3()}.json`);
1313
1328
  fs3.writeFileSync(outputPath, JSON.stringify(payload));
1314
1329
  logger.info(
1315
1330
  `wrote Collect payload to ${outputPath} \u2014 run \`qualflare-cli collect ${this.config.outputDir}\` to upload it.`