@qawolf/ci-sdk 1.1.0 ā 1.1.1
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/dist/index.cjs +14 -56
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +14 -56
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -38,49 +38,7 @@ var defaultServiceBase = "https://app.qawolf.com/";
|
|
|
38
38
|
|
|
39
39
|
// package.json
|
|
40
40
|
var package_default = {
|
|
41
|
-
|
|
42
|
-
version: "1.1.0",
|
|
43
|
-
private: false,
|
|
44
|
-
description: "A simple SDK for interacting with QAWolf in CI scripts.",
|
|
45
|
-
keywords: [],
|
|
46
|
-
license: "MIT",
|
|
47
|
-
author: "Jules Sam. Randolph<jules@qawolf.com>",
|
|
48
|
-
sideEffects: false,
|
|
49
|
-
type: "module",
|
|
50
|
-
exports: {
|
|
51
|
-
".": {
|
|
52
|
-
types: "./dist/index.d.ts",
|
|
53
|
-
require: "./dist/index.cjs",
|
|
54
|
-
import: "./dist/index.js",
|
|
55
|
-
default: "./dist/index.js"
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
files: [
|
|
59
|
-
"/dist",
|
|
60
|
-
"/README.md"
|
|
61
|
-
],
|
|
62
|
-
scripts: {
|
|
63
|
-
build: "tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022",
|
|
64
|
-
lint: "dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .",
|
|
65
|
-
"lint:fix": "eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .",
|
|
66
|
-
"lint:warnings": "eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx",
|
|
67
|
-
prepublishOnly: "nx run ci-sdk:build",
|
|
68
|
-
test: 'NODE_OPTIONS="--experimental-vm-modules" NODE_NO_WARNINGS=1 jest',
|
|
69
|
-
"tsc:check": "tsc --noEmit"
|
|
70
|
-
},
|
|
71
|
-
dependencies: {
|
|
72
|
-
"@qawolf/ci-utils": "^1.0.0",
|
|
73
|
-
"@sinonjs/fake-timers": "^10.3.0",
|
|
74
|
-
slugify: "^1.6.6",
|
|
75
|
-
tslib: "^2.6.2"
|
|
76
|
-
},
|
|
77
|
-
devDependencies: {
|
|
78
|
-
tsup: "8.3.5"
|
|
79
|
-
},
|
|
80
|
-
engines: {
|
|
81
|
-
node: ">=20"
|
|
82
|
-
}
|
|
83
|
-
};
|
|
41
|
+
version: "1.1.1"};
|
|
84
42
|
|
|
85
43
|
// src/lib/sdk/defaults/userAgent.ts
|
|
86
44
|
var defaultUserAgent = `ci-sdk/${package_default.version}`;
|
|
@@ -103,8 +61,8 @@ async function logFetchError({ log, methodName, response }) {
|
|
|
103
61
|
};
|
|
104
62
|
} catch {
|
|
105
63
|
return {
|
|
106
|
-
eventId:
|
|
107
|
-
failureMessage:
|
|
64
|
+
eventId: void 0,
|
|
65
|
+
failureMessage: void 0
|
|
108
66
|
};
|
|
109
67
|
}
|
|
110
68
|
})();
|
|
@@ -151,7 +109,7 @@ async function attemptNotifyDeploy(deps, apiConfig, config) {
|
|
|
151
109
|
log.error(`\u{1F6AB} Network error from deploy_success, aborting.`);
|
|
152
110
|
return {
|
|
153
111
|
abortReason: "network-error",
|
|
154
|
-
httpStatus:
|
|
112
|
+
httpStatus: void 0,
|
|
155
113
|
outcome: "aborted"
|
|
156
114
|
};
|
|
157
115
|
}
|
|
@@ -160,7 +118,7 @@ __name(attemptNotifyDeploy, "attemptNotifyDeploy");
|
|
|
160
118
|
async function handleErrorResponse(response, log) {
|
|
161
119
|
const status = response.status;
|
|
162
120
|
let abortReason;
|
|
163
|
-
if (status ===
|
|
121
|
+
if (status === void 0) abortReason = "network-error";
|
|
164
122
|
else if (status === 401) abortReason = "401-unauthorized";
|
|
165
123
|
else if (status === 403) abortReason = "403-forbidden";
|
|
166
124
|
else if (status >= 500) abortReason = "5XX-server-error";
|
|
@@ -190,10 +148,10 @@ async function handleSuccessResponse(data, log) {
|
|
|
190
148
|
return {
|
|
191
149
|
environmentId: environment.id,
|
|
192
150
|
outcome: "success",
|
|
193
|
-
runId:
|
|
151
|
+
runId: void 0
|
|
194
152
|
};
|
|
195
153
|
}
|
|
196
|
-
log.error(`\u{1F6AB} No trigger matched the request. Please contact support.`);
|
|
154
|
+
log.error(`\u{1F6AB} No trigger matched the request. Please make sure there is at least one active test in the QA Wolf environment, or contact support.`);
|
|
197
155
|
return {
|
|
198
156
|
failReason: "no-matched-trigger",
|
|
199
157
|
outcome: "failed"
|
|
@@ -464,11 +422,11 @@ var safeDefaults = {
|
|
|
464
422
|
runInProgressInterval: 30 * 1e3,
|
|
465
423
|
runUnderReviewInterval: 60 * 1e3
|
|
466
424
|
};
|
|
467
|
-
async function pollCiGreenlightStatus(deps, apiConfig, { onRunStageChanged = /* @__PURE__ */ __name(() =>
|
|
425
|
+
async function pollCiGreenlightStatus(deps, apiConfig, { onRunStageChanged = /* @__PURE__ */ __name(() => void 0, "onRunStageChanged"), runId, ...pollConfig }) {
|
|
468
426
|
let retries = 0;
|
|
469
427
|
const { log } = deps;
|
|
470
428
|
const { abortOnSuperseded = safeDefaults.abortOnSuperseded, maxRetries = safeDefaults.maxRetries, pollTimeout = safeDefaults.pollTimeout, retryInterval = safeDefaults.retryInterval, runInProgressInterval = safeDefaults.runInProgressInterval, runUnderReviewInterval = safeDefaults.runUnderReviewInterval } = pollConfig;
|
|
471
|
-
let currentStatus =
|
|
429
|
+
let currentStatus = void 0;
|
|
472
430
|
const startedAt = Date.now();
|
|
473
431
|
let hasTimedOut = false;
|
|
474
432
|
while (!(hasTimedOut = Date.now() - startedAt > pollTimeout)) {
|
|
@@ -490,7 +448,7 @@ async function pollCiGreenlightStatus(deps, apiConfig, { onRunStageChanged = /*
|
|
|
490
448
|
if (responseState.errorType === "network") {
|
|
491
449
|
return {
|
|
492
450
|
abortReason: "network-error",
|
|
493
|
-
httpStatus:
|
|
451
|
+
httpStatus: void 0,
|
|
494
452
|
outcome: "aborted"
|
|
495
453
|
};
|
|
496
454
|
}
|
|
@@ -533,7 +491,7 @@ async function pollCiGreenlightStatus(deps, apiConfig, { onRunStageChanged = /*
|
|
|
533
491
|
log.warn(`\u274C Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`);
|
|
534
492
|
return {
|
|
535
493
|
abortReason: "superseded-run",
|
|
536
|
-
httpStatus:
|
|
494
|
+
httpStatus: void 0,
|
|
537
495
|
outcome: "aborted"
|
|
538
496
|
};
|
|
539
497
|
}
|
|
@@ -571,7 +529,7 @@ You may review the priority of certain bugs to mark these non-blocking and retry
|
|
|
571
529
|
${urlInfo}`);
|
|
572
530
|
return {
|
|
573
531
|
abortReason: "run-canceled",
|
|
574
|
-
httpStatus:
|
|
532
|
+
httpStatus: void 0,
|
|
575
533
|
outcome: "aborted"
|
|
576
534
|
};
|
|
577
535
|
}
|
|
@@ -579,7 +537,7 @@ ${urlInfo}`);
|
|
|
579
537
|
log.warn(`\u274C Poll timed out after ${pollTimeout / 1e3}s. Aborting...`);
|
|
580
538
|
return {
|
|
581
539
|
abortReason: "poll-timed-out",
|
|
582
|
-
httpStatus:
|
|
540
|
+
httpStatus: void 0,
|
|
583
541
|
outcome: "aborted"
|
|
584
542
|
};
|
|
585
543
|
}
|
|
@@ -594,7 +552,7 @@ ${urlInfo}`);
|
|
|
594
552
|
log.warn(`\u274C Poll timed out after ${pollTimeout / 1e3}s. Aborting...`);
|
|
595
553
|
return {
|
|
596
554
|
abortReason: "poll-timed-out",
|
|
597
|
-
httpStatus:
|
|
555
|
+
httpStatus: void 0,
|
|
598
556
|
outcome: "aborted"
|
|
599
557
|
};
|
|
600
558
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/other.ts","../src/lib/sdk/defaults/fetch.ts","../src/lib/sdk/defaults/log.ts","../src/lib/sdk/defaults/serviceBase.ts","../package.json","../src/lib/sdk/defaults/userAgent.ts","../src/lib/api/log.ts","../src/lib/sdk/domain/attemptDeploy/index.ts","../src/lib/api/generate-signed-url-for-run-inputs-executables.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.ts","../src/lib/api/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-team-storage.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/poll-ci-greenlight.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","timeout","args","signal","AbortSignal","defaultFetch","globalThis","defaultLogDriver","error","message","console","info","log","warn","defaultServiceBase","defaultUserAgent","packageJson","version","logFetchError","methodName","response","ok","eventId","failureMessage","body","json","catch","text","undefined","eventIdSuffix","messageSuffix","statusText","status","attemptNotifyDeploy","deps","apiConfig","config","localFetch","URL","serviceBase","JSON","stringify","branch","commit_url","commitUrl","deduplication_key","deduplicationKey","deployment_type","deploymentType","deployment_url","deploymentUrl","ephemeral_environment","ephemeralEnvironment","hosting_service","hostingService","merge_request_number","mergeRequestNumber","pull_request_number","pullRequestNumber","repository","sha","variables","headers","Authorization","apiKey","userAgent","method","handleErrorResponse","data","handleSuccessResponse","abortReason","httpStatus","outcome","environment","results","isPreviewDeployment","isStatic","logPrefix","alias","id","length","environmentId","runId","failReason","failedTrigger","find","t","failure_reason","duplicateSuite","duplicate_suite_id","successfulTrigger","created_suite_id","callGenerateSignedUrlForRunInputsExecutablesStorage","destinationFilePath","encodeURIComponent","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","e","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","fetchCiGreenlightStatus","resp","greenlightStatus","canRetry","errorType","safeDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","pollCiGreenlightStatus","onRunStageChanged","pollConfig","retries","currentStatus","startedAt","Date","now","hasTimedOut","retryLabel","previousStatus","runStage","urlInfo","relevantRunUrl","greenlight","relevantRunId","relevantRunWithBugsUrl","rootRunId","rootRunUrl","supersedingDetails","blockingBugsCount","blockingBugUrls","nonBlockingBugsCount","nonBlockingBugUrls","blockingBugList","map","url","join","nonBlockingBugList","bugsListInText","Error","makeQaWolfSdk","bind"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { FetchDriver } from \"./sdk/dependencies.js\";\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function pluralize(count: number) {\n return count === 1 ? \"\" : \"s\";\n}\n\nexport function getBackoffMs(\n attemptNumber: number,\n minWaitMs = 1000,\n maxWaitMs = 10000,\n): number {\n return Math.min(maxWaitMs, minWaitMs * 1.2 ** attemptNumber);\n}\n\nexport const buildFetchWithTimeout =\n (fetch: FetchDriver, timeout: number) =>\n async (...args: Parameters<FetchDriver>) =>\n fetch(args[0], { ...args[1], signal: AbortSignal.timeout(timeout) });\n","export const defaultFetch = globalThis.fetch;\n","import type { LogDriver } from \"../dependencies.js\";\n\nexport const defaultLogDriver: LogDriver = {\n error(message, error) {\n console.error(message, error);\n },\n info(message) {\n console.log(message);\n },\n warn(message) {\n console.warn(message);\n },\n};\n","export const defaultServiceBase = \"https://app.qawolf.com/\";\n","{\n \"name\": \"@qawolf/ci-sdk\",\n \"version\": \"1.1.0\",\n \"private\": false,\n \"description\": \"A simple SDK for interacting with QAWolf in CI scripts.\",\n \"keywords\": [],\n \"license\": \"MIT\",\n \"author\": \"Jules Sam. Randolph<jules@qawolf.com>\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"/dist\",\n \"/README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022\",\n \"lint\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .\",\n \"lint:fix\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:warnings\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx\",\n \"prepublishOnly\": \"nx run ci-sdk:build\",\n \"test\": \"NODE_OPTIONS=\\\"--experimental-vm-modules\\\" NODE_NO_WARNINGS=1 jest\",\n \"tsc:check\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@qawolf/ci-utils\": \"^1.0.0\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"8.3.5\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n","import packageJson from \"../../../../package.json\" with { type: \"json\" };\n\nexport const defaultUserAgent = `ci-sdk/${packageJson.version}`;\n","import type { LogDriver } from \"@qawolf/ci-utils\";\n\nexport async function logFetchError({\n log,\n methodName,\n response,\n}: {\n log: LogDriver;\n methodName: string;\n response: Response;\n}) {\n if (response.ok) return;\n\n const { eventId, failureMessage } = await (async () => {\n try {\n const body = (await response.json().catch(() => response.text())) as\n | Record<string, unknown>\n | string;\n if (typeof body === \"object\" && body !== null) {\n return {\n eventId: body.eventId,\n failureMessage: body.failureMessage,\n };\n }\n // If body is not an object (i.e., it's the text from catch)\n return {\n eventId: undefined,\n failureMessage: body,\n };\n } catch {\n // If both parsing attempts somehow fail\n return {\n eventId: undefined,\n failureMessage: undefined,\n };\n }\n })();\n\n const eventIdSuffix = eventId ? ` (Event ID: ${eventId})` : \"\";\n const messageSuffix = failureMessage ? `: ${failureMessage}` : \"\";\n\n const statusText =\n response.status >= 500\n ? \"Server Error\"\n : response.statusText || \"Unknown Error\";\n\n log.error(\n `ā [${methodName}] ${response.status} ${statusText}${eventIdSuffix}${messageSuffix}`,\n );\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\n DeployStatus,\n NotifyDeployStatus,\n} from \"./types.js\";\n\nexport async function attemptNotifyDeploy(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: Partial<DeployConfig>,\n): Promise<NotifyDeployStatus> {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/deploy_success\", apiConfig.serviceBase),\n {\n body: JSON.stringify({\n branch: config.branch,\n commit_url: config.commitUrl,\n deduplication_key: config.deduplicationKey,\n deployment_type: config.deploymentType,\n deployment_url: config.deploymentUrl,\n ...(\"ephemeralEnvironment\" in config\n ? {\n ephemeral_environment: config.ephemeralEnvironment,\n }\n : \"hostingService\" in config && {\n hosting_service: config.hostingService,\n merge_request_number:\n config.hostingService === \"GitLab\"\n ? config.mergeRequestNumber\n : undefined,\n pull_request_number:\n config.hostingService === \"GitHub\"\n ? config.pullRequestNumber\n : undefined,\n repository: config.repository,\n }),\n sha: config.sha,\n variables: config.variables,\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n const data = (await response.json()) as DeployStatus;\n return handleSuccessResponse(data, log);\n } catch (error) {\n log.error(`š« Network error from deploy_success, aborting.`);\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n}\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const status = response.status;\n let abortReason: AttemptDeployHttpAbortReason;\n if (status === undefined) abortReason = \"network-error\";\n else if (status === 401) abortReason = \"401-unauthorized\";\n else if (status === 403) abortReason = \"403-forbidden\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"attemptNotifyDeploy\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n\nasync function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const isPreviewDeployment = environment && !environment.isStatic;\n\n if (environment) {\n const logPrefix = environment.isStatic\n ? \"Static environment\"\n : \"Preview environment\";\n log.info(`${logPrefix}: ${environment.alias} (id: ${environment.id})`);\n }\n\n // No triggers were matched\n if (results.length === 0) {\n if (isPreviewDeployment) {\n log.info(\n `ā
Deployment notification was successful. No run was created for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n log.error(`š« No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n\n // If there are results, environment must be defined\n if (!environment) {\n log.error(`š« No environment matched the request. Please contact support.`);\n return { failReason: \"no-environment\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((t) => \"failure_reason\" in t);\n if (failedTrigger) {\n log.error(\n `š« Run could not be created. Reason: \"${failedTrigger.failure_reason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((t) => \"duplicate_suite_id\" in t);\n if (duplicateSuite) {\n log.info(\n `ā
Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicate_suite_id} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicate_suite_id,\n };\n }\n\n const successfulTrigger = results.find((t) => \"created_suite_id\" in t);\n if (!successfulTrigger) {\n log.error(`š« No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n log.info(\n `ā
Deployment notification was successful. Run created with ID: ${successfulTrigger.created_suite_id}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.created_suite_id,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForRunInputsExecutablesStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: GenerateSignedUrlConfig,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/run-inputs-executables-signed-urls?file=${encodeURIComponent(destinationFilePath)}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForRunInputsExecutablesStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForRunInputsExecutablesStorage } from \"../../../api/generate-signed-url-for-run-inputs-executables.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n GenerateSignedUrlAbortReason,\n GenerateSignedUrlConfig,\n GenerateSignedUrlStatus,\n} from \"./types.js\";\n\nexport async function generateSignedUrlForRunInputsExecutablesStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`š« destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState =\n await callGenerateSignedUrlForRunInputsExecutablesStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`ā
Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForTempTeamStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: Partial<GenerateSignedUrlConfig>,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/team-storage-signed-url?file=${destinationFilePath}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForTempTeamStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForTempTeamStorage } from \"../../../api/generate-signed-url-for-team-storage.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type { GenerateSignedUrlConfig } from \"./types.js\";\n\ntype GenerateSignedUrlStatus =\n | {\n fileLocation?: string;\n playgroundFileLocation?: string;\n success: true;\n uploadUrl?: string;\n }\n | {\n abortReason: GenerateSignedUrlAbortReason;\n httpStatus?: number;\n success: false;\n };\n\nexport type GenerateSignedUrlAbortReason =\n | \"client-network-error\"\n | \"sdk-argument-validation-failed\"\n | \"400-invalid-request\"\n | \"401-invalid-credentials\"\n | \"403-forbidden\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport async function generateSignedUrlForTempTeamStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`š« destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState = await callGenerateSignedUrlForTempTeamStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`ā
Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport type CiGreenlightBugDetails = {\n /**\n * The URL of this BR in the QAWolf application.\n */\n applicationUrl: string;\n /**\n * If this bug report is linked to an external issue, it will\n * show up here.\n */\n externalIssue:\n | {\n /**\n * The URL of the external issue in the external platform\n * application.\n */\n applicationUrl: string;\n /**\n * The ID of this issue in the external platform.\n */\n externalIssueId: string;\n /**\n * Lowercase platform name (e.g. \"jira\").\n */\n platform: string;\n }\n | undefined;\n /**\n * True if the bug is blocking.\n */\n isBlocking: boolean;\n /**\n * True if the bug has been found in this run.\n */\n isNew: boolean;\n /**\n * The name of this bug.\n */\n name: string;\n /**\n * The bug number.\n */\n number: number;\n /**\n * The priority of this bug.\n */\n priority: \"medium\" | \"unprioritized\" | \"low\" | \"high\" | \"urgent\";\n};\n\nexport type CiGreenlightBugData = {\n /**\n * The count of blocking bugs reproduced in the run.\n */\n blockingBugsCount: number;\n /**\n * The URLs of the blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: true`, reading\n * the `applicationUrl` field.\n */\n blockingBugUrls: string[];\n /**\n * The count of non-blocking bugs reproduced in the run.\n */\n nonBlockingBugsCount: number;\n /**\n * The URLs of the non-blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: false`, reading\n * the `applicationUrl` field.\n */\n nonBlockingBugUrls: string[];\n /**\n * Blocking bugs that were not reproduced in this run, but are still\n * opened in the run environment. This may happen when the run only covers a\n * subset of the workflows in environment.\n */\n otherBlockingBugsInEnvironment: CiGreenlightBugDetails[];\n /**\n * Bugs that were reproduced in this run. This includes newly found bugs.\n */\n reproducedBugs: CiGreenlightBugDetails[];\n};\n\n/**\n * @deprecated This type will be removed in the next major version. Use `CiGreenlightBugData` instead.\n */\nexport type CiGreenlightCompletedSuiteDetails = CiGreenlightBugData;\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n relevantRunWithBugsUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n workflowsDisabledAfterRunCount: number;\n workflowsInRunCount: number;\n workflowsUnderInvestigationCount: number;\n};\n\n/**\n * The status of a CI greenlight run. See the API documentation here for\n * more details: https://qawolf.notion.site/1b170576efea411fa785842a71e7c99e\n */\nexport type CiGreenlightStatus = CiGreenlightStatusBase &\n (\n | ({\n greenlight: boolean;\n runStage: \"completed\";\n } & CiGreenlightBugData)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData)\n | {\n greenlight: false;\n runStage: \"initializing\" | \"underReview\" | \"canceled\";\n }\n );\n\nexport async function fetchCiGreenlightStatus(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n {\n runId,\n }: {\n runId: string;\n },\n { fetch: localFetch, log }: SdkDependencies,\n) {\n try {\n const resp = await localFetch(\n new URL(\n `/api/v0/ci-greenlight/${encodeURIComponent(runId)}`,\n serviceBase,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"User-Agent\": userAgent,\n },\n },\n );\n\n if (resp.ok) {\n const greenlightStatus = (await resp.json()) as CiGreenlightStatus;\n return {\n greenlightStatus,\n httpStatus: resp.status,\n ok: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"fetchCiGreenlightStatus\",\n response: resp,\n });\n if (resp.status === 404) {\n return {\n canRetry: true,\n errorType: \"not-found\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n if (resp.status >= 500) {\n return {\n canRetry: true,\n errorType: \"server\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n return {\n canRetry: false,\n errorType: \"client\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n } catch (e) {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","/* eslint-disable @qawolf/max-lines -- Old technical debt */\n\nimport type { ApiConfig } from \"../../api-types.js\";\nimport {\n type CiGreenlightStatus,\n fetchCiGreenlightStatus,\n} from \"../../api/ci-greenlight.js\";\nimport { pluralize, sleep } from \"../../other.js\";\nimport type { SdkDependencies } from \"../dependencies.js\";\n\nexport type PollCiGreenlightPollConfig = {\n /**\n * If true, the job will be aborted when a superseding run is detected.\n *\n * @default false\n */\n abortOnSuperseded: boolean;\n /**\n * Maximum number of network operations retries before aborting the job.\n *\n * @default 10\n */\n maxRetries: number;\n /**\n * Timeout in milliseconds before aborting this polling operation.\n *\n * @default 120 minutes\n */\n pollTimeout: number;\n /**\n * Interval in milliseconds between network operations retries.\n *\n * @default 10 seconds\n */\n retryInterval: number;\n /**\n * Interval in milliseconds between polling for a run in progress.\n *\n * @default 30 seconds\n */\n runInProgressInterval: number;\n /**\n * Interval in milliseconds between polling for a run under review.\n *\n * @default 60 minutes\n */\n runUnderReviewInterval: number;\n};\n\nexport type PollCiGreenlightHttpAbortReason =\n | \"4XX-client-error\"\n | \"404-run-not-found\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport type PollCiGreenlightNonHttpAbortReason =\n | \"poll-timed-out\"\n | \"run-canceled\"\n | \"network-error\"\n | \"superseded-run\";\n\nexport type PollCiGreenlightAbortReason =\n | PollCiGreenlightNonHttpAbortReason\n | PollCiGreenlightHttpAbortReason;\n\nexport type PollCiGreenlightStatus =\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * No blocking bugs were found in the run.\n */\n outcome: \"success\";\n }\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * Blocking bugs were found in the run.\n */\n outcome: \"failed\";\n }\n | {\n abortReason: PollCiGreenlightHttpAbortReason;\n httpStatus: number;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n }\n | {\n abortReason: PollCiGreenlightNonHttpAbortReason;\n httpStatus: undefined;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n };\n\nexport type PollCiGreenlightParams = {\n /**\n * Callback to be called when the lifecycle stage of the run changes.\n */\n onRunStageChanged?: (\n current: CiGreenlightStatus,\n previous: CiGreenlightStatus | undefined,\n ) => unknown | Promise<unknown>;\n runId: string;\n} & Partial<PollCiGreenlightPollConfig>;\n\n// If you change these values, make sure you update the JSDoc\n// comments in the PollConfig type.\nconst safeDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000,\n retryInterval: 10 * 1000,\n runInProgressInterval: 30 * 1000,\n runUnderReviewInterval: 60 * 1000,\n};\n\nexport async function pollCiGreenlightStatus(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n onRunStageChanged: onRunStageChanged = () => undefined,\n runId,\n ...pollConfig\n }: PollCiGreenlightParams,\n): Promise<PollCiGreenlightStatus> {\n let retries = 0;\n const { log } = deps;\n const {\n abortOnSuperseded = safeDefaults.abortOnSuperseded,\n maxRetries = safeDefaults.maxRetries,\n pollTimeout = safeDefaults.pollTimeout,\n retryInterval = safeDefaults.retryInterval,\n runInProgressInterval = safeDefaults.runInProgressInterval,\n runUnderReviewInterval = safeDefaults.runUnderReviewInterval,\n } = pollConfig;\n let currentStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n let hasTimedOut = false;\n while (!(hasTimedOut = Date.now() - startedAt > pollTimeout)) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n {\n runId,\n },\n deps,\n );\n if (!responseState.ok && !responseState.canRetry) {\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason: \"4XX-client-error\",\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n if (!responseState.ok) {\n // This is a non-OK retryable status.\n retries += 1;\n if (retries > maxRetries) {\n log.error(\n `š« Unrecoverable error${\n responseState.httpStatus\n ? ` (status ${responseState.httpStatus})`\n : \"\"\n } from CI greenlight, aborting after ${maxRetries} attempts.`,\n );\n if (responseState.errorType === \"network\") {\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n let abortReason: PollCiGreenlightAbortReason = \"XXX-other-http-code\";\n\n if (responseState.errorType === \"not-found\")\n abortReason = \"404-run-not-found\";\n else if (responseState.errorType === \"server\")\n abortReason = \"5XX-server-error\";\n else responseState satisfies never;\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n const { errorType, httpStatus } = responseState;\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n if (errorType === \"network\") log.warn(`ā Network error${retryLabel}`);\n else if (errorType === \"not-found\")\n log.info(`ā³ Run not found${retryLabel}`);\n else if (errorType === \"server\") log.warn(`ā Server error${retryLabel}`);\n\n await sleep(retryInterval);\n continue;\n }\n // responseState.ok === true\n retries = 0;\n const { greenlightStatus } = responseState;\n const previousStatus = currentStatus;\n currentStatus = greenlightStatus;\n if (\n !previousStatus ||\n previousStatus.runStage !== greenlightStatus.runStage\n ) {\n try {\n await onRunStageChanged(greenlightStatus, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n const urlInfo = `See ${greenlightStatus.relevantRunUrl}`;\n const {\n greenlight,\n relevantRunId,\n relevantRunUrl,\n relevantRunWithBugsUrl,\n rootRunId,\n rootRunUrl,\n runStage,\n } = greenlightStatus;\n if (rootRunId !== relevantRunId) {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n if (abortOnSuperseded) {\n log.warn(\n `ā Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`,\n );\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n log.info(`Root run was superseded:${supersedingDetails}`);\n }\n if (runStage === \"completed\") {\n const {\n blockingBugsCount,\n blockingBugUrls = [],\n nonBlockingBugsCount,\n nonBlockingBugUrls = [],\n } = greenlightStatus;\n const blockingBugList = blockingBugUrls\n .map((url) => `\\n⢠${url}`)\n .join(\"\");\n const nonBlockingBugList = nonBlockingBugUrls\n .map((url) => `\\n⢠${url}`)\n .join(\"\");\n const bugsListInText = `${\n blockingBugUrls.length > 0 ? `\\nBLOCKING BUGS:${blockingBugList}` : \"\"\n }${\n nonBlockingBugUrls.length > 0\n ? `\\nNON BLOCKING BUGS:${nonBlockingBugList}`\n : \"\"\n }`;\n if (greenlight) {\n log.info(\n `ā
Run passed and no blocking bugs found${\n nonBlockingBugsCount > 0\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )} found`\n : \"\"\n }.\\n${urlInfo}`,\n );\n return { greenlightStatus, outcome: \"success\" };\n } else {\n log.warn(\n `ā Run failed and ${blockingBugsCount} blocking bug${pluralize(\n blockingBugsCount,\n )} found${\n nonBlockingBugsCount\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )}`\n : \"\"\n }.\\nSee ${relevantRunWithBugsUrl}\\n` +\n \"You may review the priority of certain bugs to mark these non-blocking and retry the job.\\n\" +\n bugsListInText,\n );\n return { greenlightStatus, outcome: \"failed\" };\n }\n }\n if (runStage === \"canceled\") {\n log.info(\n `š« Run was canceled. Aborting... Please contact support.\\n${urlInfo}`,\n );\n return {\n abortReason: \"run-canceled\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n // Non-terminal run stages\n if (hasTimedOut) {\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (runStage === \"initializing\") {\n log.info(`ā³ Run is in progress... ${urlInfo}`);\n await sleep(runInProgressInterval);\n } else if (runStage === \"underReview\") {\n log.info(`šµļø Run is under review... ${urlInfo}`);\n await sleep(runUnderReviewInterval);\n } else throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport { buildFetchWithTimeout } from \"../other.js\";\n\nimport { defaultFetch } from \"./defaults/fetch.js\";\nimport { defaultLogDriver } from \"./defaults/log.js\";\nimport { defaultServiceBase } from \"./defaults/serviceBase.js\";\nimport { defaultUserAgent } from \"./defaults/userAgent.js\";\nimport type { SdkDependencies } from \"./dependencies.js\";\nimport { attemptNotifyDeploy } from \"./domain/attemptDeploy/index.js\";\nimport { generateSignedUrlForRunInputsExecutablesStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.js\";\nimport { generateSignedUrlForTempTeamStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-team-storage.js\";\nimport { pollCiGreenlightStatus } from \"./domain/poll-ci-greenlight.js\";\n\nexport function makeQaWolfSdk(\n {\n apiKey,\n serviceBase = defaultServiceBase,\n userAgent = defaultUserAgent,\n }: {\n apiKey: string;\n serviceBase?: string;\n userAgent?: string;\n },\n {\n fetch = defaultFetch,\n log = defaultLogDriver,\n }: Partial<SdkDependencies> = {},\n) {\n if (typeof fetch !== \"function\") {\n throw Error(\n `QA Wolf CI-SDK requires fetch to be defined. Make sure you are using NodeJS 18+, OR pass a fetch polyfill to the makeQaWolfSdk function.\nWe recommend 'undici' package for that purpose. See the Requirement section of our README for more guidance.`,\n );\n }\n\n const deps: SdkDependencies = {\n // Versions of fetch may have different default timeouts. For consistency, we explicitly set it to 2 minutes here.\n // The increased timeout helps avoid edge cases where we need to search for a commit against multiple\n // code hosting service repositories as a fallback when not finding the repository based on organization/name.\n fetch: buildFetchWithTimeout(fetch, 120000),\n log,\n };\n const apiConfig: ApiConfig = { apiKey, serviceBase, userAgent };\n return {\n attemptNotifyDeploy: attemptNotifyDeploy.bind(null, deps, apiConfig),\n generateSignedUrlForRunInputsExecutablesStorage:\n generateSignedUrlForRunInputsExecutablesStorage.bind(\n null,\n deps,\n apiConfig,\n ),\n generateSignedUrlForTempTeamStorage:\n generateSignedUrlForTempTeamStorage.bind(null, deps, apiConfig),\n pollCiGreenlightStatus: pollCiGreenlightStatus.bind(null, deps, apiConfig),\n };\n}\n\nexport type * from \"./domain/attemptDeploy/index.js\";\nexport type * from \"./domain/generateSignedUrls/types.js\";\nexport type * from \"./domain/poll-ci-greenlight.js\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/other.ts","../src/lib/sdk/defaults/fetch.ts","../src/lib/sdk/defaults/log.ts","../src/lib/sdk/defaults/serviceBase.ts","../package.json","../src/lib/sdk/defaults/userAgent.ts","../src/lib/api/log.ts","../src/lib/sdk/domain/attemptDeploy/index.ts","../src/lib/api/generate-signed-url-for-run-inputs-executables.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.ts","../src/lib/api/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-team-storage.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/poll-ci-greenlight.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","timeout","args","signal","AbortSignal","defaultFetch","globalThis","defaultLogDriver","error","message","console","info","log","warn","defaultServiceBase","defaultUserAgent","packageJson","version","logFetchError","methodName","response","ok","eventId","failureMessage","body","json","catch","text","undefined","eventIdSuffix","messageSuffix","statusText","status","attemptNotifyDeploy","deps","apiConfig","config","localFetch","URL","serviceBase","JSON","stringify","branch","commit_url","commitUrl","deduplication_key","deduplicationKey","deployment_type","deploymentType","deployment_url","deploymentUrl","ephemeral_environment","ephemeralEnvironment","hosting_service","hostingService","merge_request_number","mergeRequestNumber","pull_request_number","pullRequestNumber","repository","sha","variables","headers","Authorization","apiKey","userAgent","method","handleErrorResponse","data","handleSuccessResponse","abortReason","httpStatus","outcome","environment","results","isPreviewDeployment","isStatic","logPrefix","alias","id","length","environmentId","runId","failReason","failedTrigger","find","t","failure_reason","duplicateSuite","duplicate_suite_id","successfulTrigger","created_suite_id","callGenerateSignedUrlForRunInputsExecutablesStorage","destinationFilePath","encodeURIComponent","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","e","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","fetchCiGreenlightStatus","resp","greenlightStatus","canRetry","errorType","safeDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","pollCiGreenlightStatus","onRunStageChanged","pollConfig","retries","currentStatus","startedAt","Date","now","hasTimedOut","retryLabel","previousStatus","runStage","urlInfo","relevantRunUrl","greenlight","relevantRunId","relevantRunWithBugsUrl","rootRunId","rootRunUrl","supersedingDetails","blockingBugsCount","blockingBugUrls","nonBlockingBugsCount","nonBlockingBugUrls","blockingBugList","map","url","join","nonBlockingBugList","bugsListInText","Error","makeQaWolfSdk","bind"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { FetchDriver } from \"./sdk/dependencies.js\";\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function pluralize(count: number) {\n return count === 1 ? \"\" : \"s\";\n}\n\nexport function getBackoffMs(\n attemptNumber: number,\n minWaitMs = 1000,\n maxWaitMs = 10000,\n): number {\n return Math.min(maxWaitMs, minWaitMs * 1.2 ** attemptNumber);\n}\n\nexport const buildFetchWithTimeout =\n (fetch: FetchDriver, timeout: number) =>\n async (...args: Parameters<FetchDriver>) =>\n fetch(args[0], { ...args[1], signal: AbortSignal.timeout(timeout) });\n","export const defaultFetch = globalThis.fetch;\n","import type { LogDriver } from \"../dependencies.js\";\n\nexport const defaultLogDriver: LogDriver = {\n error(message, error) {\n console.error(message, error);\n },\n info(message) {\n console.log(message);\n },\n warn(message) {\n console.warn(message);\n },\n};\n","export const defaultServiceBase = \"https://app.qawolf.com/\";\n","{\n \"name\": \"@qawolf/ci-sdk\",\n \"version\": \"1.1.1\",\n \"private\": false,\n \"description\": \"A simple SDK for interacting with QAWolf in CI scripts.\",\n \"keywords\": [],\n \"license\": \"MIT\",\n \"author\": \"Jules Sam. Randolph<jules@qawolf.com>\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"/dist\",\n \"/README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022\",\n \"lint\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .\",\n \"lint:fix\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:warnings\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx\",\n \"prepublishOnly\": \"nx run ci-sdk:build\",\n \"test\": \"NODE_OPTIONS=\\\"--experimental-vm-modules\\\" NODE_NO_WARNINGS=1 jest\",\n \"tsc:check\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@qawolf/ci-utils\": \"^1.0.0\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.3.5\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n","import packageJson from \"../../../../package.json\" with { type: \"json\" };\n\nexport const defaultUserAgent = `ci-sdk/${packageJson.version}`;\n","import type { LogDriver } from \"@qawolf/ci-utils\";\n\nexport async function logFetchError({\n log,\n methodName,\n response,\n}: {\n log: LogDriver;\n methodName: string;\n response: Response;\n}) {\n if (response.ok) return;\n\n const { eventId, failureMessage } = await (async () => {\n try {\n const body = (await response.json().catch(() => response.text())) as\n | Record<string, unknown>\n | string;\n if (typeof body === \"object\" && body !== null) {\n return {\n eventId: body.eventId,\n failureMessage: body.failureMessage,\n };\n }\n // If body is not an object (i.e., it's the text from catch)\n return {\n eventId: undefined,\n failureMessage: body,\n };\n } catch {\n // If both parsing attempts somehow fail\n return {\n eventId: undefined,\n failureMessage: undefined,\n };\n }\n })();\n\n const eventIdSuffix = eventId ? ` (Event ID: ${eventId})` : \"\";\n const messageSuffix = failureMessage ? `: ${failureMessage}` : \"\";\n\n const statusText =\n response.status >= 500\n ? \"Server Error\"\n : response.statusText || \"Unknown Error\";\n\n log.error(\n `ā [${methodName}] ${response.status} ${statusText}${eventIdSuffix}${messageSuffix}`,\n );\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\n DeployStatus,\n NotifyDeployStatus,\n} from \"./types.js\";\n\nexport async function attemptNotifyDeploy(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: Partial<DeployConfig>,\n): Promise<NotifyDeployStatus> {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/deploy_success\", apiConfig.serviceBase),\n {\n body: JSON.stringify({\n branch: config.branch,\n commit_url: config.commitUrl,\n deduplication_key: config.deduplicationKey,\n deployment_type: config.deploymentType,\n deployment_url: config.deploymentUrl,\n ...(\"ephemeralEnvironment\" in config\n ? {\n ephemeral_environment: config.ephemeralEnvironment,\n }\n : \"hostingService\" in config && {\n hosting_service: config.hostingService,\n merge_request_number:\n config.hostingService === \"GitLab\"\n ? config.mergeRequestNumber\n : undefined,\n pull_request_number:\n config.hostingService === \"GitHub\"\n ? config.pullRequestNumber\n : undefined,\n repository: config.repository,\n }),\n sha: config.sha,\n variables: config.variables,\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n const data = (await response.json()) as DeployStatus;\n return handleSuccessResponse(data, log);\n } catch (error) {\n log.error(`š« Network error from deploy_success, aborting.`);\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n}\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const status = response.status;\n let abortReason: AttemptDeployHttpAbortReason;\n if (status === undefined) abortReason = \"network-error\";\n else if (status === 401) abortReason = \"401-unauthorized\";\n else if (status === 403) abortReason = \"403-forbidden\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"attemptNotifyDeploy\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n\nasync function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const isPreviewDeployment = environment && !environment.isStatic;\n\n if (environment) {\n const logPrefix = environment.isStatic\n ? \"Static environment\"\n : \"Preview environment\";\n log.info(`${logPrefix}: ${environment.alias} (id: ${environment.id})`);\n }\n\n // No triggers were matched\n if (results.length === 0) {\n if (isPreviewDeployment) {\n log.info(\n `ā
Deployment notification was successful. No run was created for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n log.error(\n `š« No trigger matched the request. Please make sure there is at least one active test in the QA Wolf environment, or contact support.`,\n );\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n\n // If there are results, environment must be defined\n if (!environment) {\n log.error(`š« No environment matched the request. Please contact support.`);\n return { failReason: \"no-environment\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((t) => \"failure_reason\" in t);\n if (failedTrigger) {\n log.error(\n `š« Run could not be created. Reason: \"${failedTrigger.failure_reason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((t) => \"duplicate_suite_id\" in t);\n if (duplicateSuite) {\n log.info(\n `ā
Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicate_suite_id} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicate_suite_id,\n };\n }\n\n const successfulTrigger = results.find((t) => \"created_suite_id\" in t);\n if (!successfulTrigger) {\n log.error(`š« No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n log.info(\n `ā
Deployment notification was successful. Run created with ID: ${successfulTrigger.created_suite_id}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.created_suite_id,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForRunInputsExecutablesStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: GenerateSignedUrlConfig,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/run-inputs-executables-signed-urls?file=${encodeURIComponent(destinationFilePath)}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForRunInputsExecutablesStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForRunInputsExecutablesStorage } from \"../../../api/generate-signed-url-for-run-inputs-executables.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n GenerateSignedUrlAbortReason,\n GenerateSignedUrlConfig,\n GenerateSignedUrlStatus,\n} from \"./types.js\";\n\nexport async function generateSignedUrlForRunInputsExecutablesStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`š« destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState =\n await callGenerateSignedUrlForRunInputsExecutablesStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`ā
Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForTempTeamStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: Partial<GenerateSignedUrlConfig>,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/team-storage-signed-url?file=${destinationFilePath}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForTempTeamStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForTempTeamStorage } from \"../../../api/generate-signed-url-for-team-storage.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type { GenerateSignedUrlConfig } from \"./types.js\";\n\ntype GenerateSignedUrlStatus =\n | {\n fileLocation?: string;\n playgroundFileLocation?: string;\n success: true;\n uploadUrl?: string;\n }\n | {\n abortReason: GenerateSignedUrlAbortReason;\n httpStatus?: number;\n success: false;\n };\n\nexport type GenerateSignedUrlAbortReason =\n | \"client-network-error\"\n | \"sdk-argument-validation-failed\"\n | \"400-invalid-request\"\n | \"401-invalid-credentials\"\n | \"403-forbidden\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport async function generateSignedUrlForTempTeamStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`š« destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState = await callGenerateSignedUrlForTempTeamStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`ā
Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport type CiGreenlightBugDetails = {\n /**\n * The URL of this BR in the QAWolf application.\n */\n applicationUrl: string;\n /**\n * If this bug report is linked to an external issue, it will\n * show up here.\n */\n externalIssue:\n | {\n /**\n * The URL of the external issue in the external platform\n * application.\n */\n applicationUrl: string;\n /**\n * The ID of this issue in the external platform.\n */\n externalIssueId: string;\n /**\n * Lowercase platform name (e.g. \"jira\").\n */\n platform: string;\n }\n | undefined;\n /**\n * True if the bug is blocking.\n */\n isBlocking: boolean;\n /**\n * True if the bug has been found in this run.\n */\n isNew: boolean;\n /**\n * The name of this bug.\n */\n name: string;\n /**\n * The bug number.\n */\n number: number;\n /**\n * The priority of this bug.\n */\n priority: \"medium\" | \"unprioritized\" | \"low\" | \"high\" | \"urgent\";\n};\n\nexport type CiGreenlightBugData = {\n /**\n * The count of blocking bugs reproduced in the run.\n */\n blockingBugsCount: number;\n /**\n * The URLs of the blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: true`, reading\n * the `applicationUrl` field.\n */\n blockingBugUrls: string[];\n /**\n * The count of non-blocking bugs reproduced in the run.\n */\n nonBlockingBugsCount: number;\n /**\n * The URLs of the non-blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: false`, reading\n * the `applicationUrl` field.\n */\n nonBlockingBugUrls: string[];\n /**\n * Blocking bugs that were not reproduced in this run, but are still\n * opened in the run environment. This may happen when the run only covers a\n * subset of the workflows in environment.\n */\n otherBlockingBugsInEnvironment: CiGreenlightBugDetails[];\n /**\n * Bugs that were reproduced in this run. This includes newly found bugs.\n */\n reproducedBugs: CiGreenlightBugDetails[];\n};\n\n/**\n * @deprecated This type will be removed in the next major version. Use `CiGreenlightBugData` instead.\n */\nexport type CiGreenlightCompletedSuiteDetails = CiGreenlightBugData;\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n relevantRunWithBugsUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n workflowsDisabledAfterRunCount: number;\n workflowsInRunCount: number;\n workflowsUnderInvestigationCount: number;\n};\n\n/**\n * The status of a CI greenlight run. See the API documentation here for\n * more details: https://qawolf.notion.site/1b170576efea411fa785842a71e7c99e\n */\nexport type CiGreenlightStatus = CiGreenlightStatusBase &\n (\n | ({\n greenlight: boolean;\n runStage: \"completed\";\n } & CiGreenlightBugData)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData)\n | {\n greenlight: false;\n runStage: \"initializing\" | \"underReview\" | \"canceled\";\n }\n );\n\nexport async function fetchCiGreenlightStatus(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n {\n runId,\n }: {\n runId: string;\n },\n { fetch: localFetch, log }: SdkDependencies,\n) {\n try {\n const resp = await localFetch(\n new URL(\n `/api/v0/ci-greenlight/${encodeURIComponent(runId)}`,\n serviceBase,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"User-Agent\": userAgent,\n },\n },\n );\n\n if (resp.ok) {\n const greenlightStatus = (await resp.json()) as CiGreenlightStatus;\n return {\n greenlightStatus,\n httpStatus: resp.status,\n ok: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"fetchCiGreenlightStatus\",\n response: resp,\n });\n if (resp.status === 404) {\n return {\n canRetry: true,\n errorType: \"not-found\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n if (resp.status >= 500) {\n return {\n canRetry: true,\n errorType: \"server\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n return {\n canRetry: false,\n errorType: \"client\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n } catch (e) {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","/* eslint-disable @qawolf/max-lines -- Old technical debt */\n\nimport type { ApiConfig } from \"../../api-types.js\";\nimport {\n type CiGreenlightStatus,\n fetchCiGreenlightStatus,\n} from \"../../api/ci-greenlight.js\";\nimport { pluralize, sleep } from \"../../other.js\";\nimport type { SdkDependencies } from \"../dependencies.js\";\n\nexport type PollCiGreenlightPollConfig = {\n /**\n * If true, the job will be aborted when a superseding run is detected.\n *\n * @default false\n */\n abortOnSuperseded: boolean;\n /**\n * Maximum number of network operations retries before aborting the job.\n *\n * @default 10\n */\n maxRetries: number;\n /**\n * Timeout in milliseconds before aborting this polling operation.\n *\n * @default 120 minutes\n */\n pollTimeout: number;\n /**\n * Interval in milliseconds between network operations retries.\n *\n * @default 10 seconds\n */\n retryInterval: number;\n /**\n * Interval in milliseconds between polling for a run in progress.\n *\n * @default 30 seconds\n */\n runInProgressInterval: number;\n /**\n * Interval in milliseconds between polling for a run under review.\n *\n * @default 60 minutes\n */\n runUnderReviewInterval: number;\n};\n\nexport type PollCiGreenlightHttpAbortReason =\n | \"4XX-client-error\"\n | \"404-run-not-found\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport type PollCiGreenlightNonHttpAbortReason =\n | \"poll-timed-out\"\n | \"run-canceled\"\n | \"network-error\"\n | \"superseded-run\";\n\nexport type PollCiGreenlightAbortReason =\n | PollCiGreenlightNonHttpAbortReason\n | PollCiGreenlightHttpAbortReason;\n\nexport type PollCiGreenlightStatus =\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * No blocking bugs were found in the run.\n */\n outcome: \"success\";\n }\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * Blocking bugs were found in the run.\n */\n outcome: \"failed\";\n }\n | {\n abortReason: PollCiGreenlightHttpAbortReason;\n httpStatus: number;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n }\n | {\n abortReason: PollCiGreenlightNonHttpAbortReason;\n httpStatus: undefined;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n };\n\nexport type PollCiGreenlightParams = {\n /**\n * Callback to be called when the lifecycle stage of the run changes.\n */\n onRunStageChanged?: (\n current: CiGreenlightStatus,\n previous: CiGreenlightStatus | undefined,\n ) => unknown | Promise<unknown>;\n runId: string;\n} & Partial<PollCiGreenlightPollConfig>;\n\n// If you change these values, make sure you update the JSDoc\n// comments in the PollConfig type.\nconst safeDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000,\n retryInterval: 10 * 1000,\n runInProgressInterval: 30 * 1000,\n runUnderReviewInterval: 60 * 1000,\n};\n\nexport async function pollCiGreenlightStatus(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n onRunStageChanged: onRunStageChanged = () => undefined,\n runId,\n ...pollConfig\n }: PollCiGreenlightParams,\n): Promise<PollCiGreenlightStatus> {\n let retries = 0;\n const { log } = deps;\n const {\n abortOnSuperseded = safeDefaults.abortOnSuperseded,\n maxRetries = safeDefaults.maxRetries,\n pollTimeout = safeDefaults.pollTimeout,\n retryInterval = safeDefaults.retryInterval,\n runInProgressInterval = safeDefaults.runInProgressInterval,\n runUnderReviewInterval = safeDefaults.runUnderReviewInterval,\n } = pollConfig;\n let currentStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n let hasTimedOut = false;\n while (!(hasTimedOut = Date.now() - startedAt > pollTimeout)) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n {\n runId,\n },\n deps,\n );\n if (!responseState.ok && !responseState.canRetry) {\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason: \"4XX-client-error\",\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n if (!responseState.ok) {\n // This is a non-OK retryable status.\n retries += 1;\n if (retries > maxRetries) {\n log.error(\n `š« Unrecoverable error${\n responseState.httpStatus\n ? ` (status ${responseState.httpStatus})`\n : \"\"\n } from CI greenlight, aborting after ${maxRetries} attempts.`,\n );\n if (responseState.errorType === \"network\") {\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n let abortReason: PollCiGreenlightAbortReason = \"XXX-other-http-code\";\n\n if (responseState.errorType === \"not-found\")\n abortReason = \"404-run-not-found\";\n else if (responseState.errorType === \"server\")\n abortReason = \"5XX-server-error\";\n else responseState satisfies never;\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n const { errorType, httpStatus } = responseState;\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n if (errorType === \"network\") log.warn(`ā Network error${retryLabel}`);\n else if (errorType === \"not-found\")\n log.info(`ā³ Run not found${retryLabel}`);\n else if (errorType === \"server\") log.warn(`ā Server error${retryLabel}`);\n\n await sleep(retryInterval);\n continue;\n }\n // responseState.ok === true\n retries = 0;\n const { greenlightStatus } = responseState;\n const previousStatus = currentStatus;\n currentStatus = greenlightStatus;\n if (\n !previousStatus ||\n previousStatus.runStage !== greenlightStatus.runStage\n ) {\n try {\n await onRunStageChanged(greenlightStatus, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n const urlInfo = `See ${greenlightStatus.relevantRunUrl}`;\n const {\n greenlight,\n relevantRunId,\n relevantRunUrl,\n relevantRunWithBugsUrl,\n rootRunId,\n rootRunUrl,\n runStage,\n } = greenlightStatus;\n if (rootRunId !== relevantRunId) {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n if (abortOnSuperseded) {\n log.warn(\n `ā Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`,\n );\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n log.info(`Root run was superseded:${supersedingDetails}`);\n }\n if (runStage === \"completed\") {\n const {\n blockingBugsCount,\n blockingBugUrls = [],\n nonBlockingBugsCount,\n nonBlockingBugUrls = [],\n } = greenlightStatus;\n const blockingBugList = blockingBugUrls\n .map((url) => `\\n⢠${url}`)\n .join(\"\");\n const nonBlockingBugList = nonBlockingBugUrls\n .map((url) => `\\n⢠${url}`)\n .join(\"\");\n const bugsListInText = `${\n blockingBugUrls.length > 0 ? `\\nBLOCKING BUGS:${blockingBugList}` : \"\"\n }${\n nonBlockingBugUrls.length > 0\n ? `\\nNON BLOCKING BUGS:${nonBlockingBugList}`\n : \"\"\n }`;\n if (greenlight) {\n log.info(\n `ā
Run passed and no blocking bugs found${\n nonBlockingBugsCount > 0\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )} found`\n : \"\"\n }.\\n${urlInfo}`,\n );\n return { greenlightStatus, outcome: \"success\" };\n } else {\n log.warn(\n `ā Run failed and ${blockingBugsCount} blocking bug${pluralize(\n blockingBugsCount,\n )} found${\n nonBlockingBugsCount\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )}`\n : \"\"\n }.\\nSee ${relevantRunWithBugsUrl}\\n` +\n \"You may review the priority of certain bugs to mark these non-blocking and retry the job.\\n\" +\n bugsListInText,\n );\n return { greenlightStatus, outcome: \"failed\" };\n }\n }\n if (runStage === \"canceled\") {\n log.info(\n `š« Run was canceled. Aborting... Please contact support.\\n${urlInfo}`,\n );\n return {\n abortReason: \"run-canceled\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n // Non-terminal run stages\n if (hasTimedOut) {\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (runStage === \"initializing\") {\n log.info(`ā³ Run is in progress... ${urlInfo}`);\n await sleep(runInProgressInterval);\n } else if (runStage === \"underReview\") {\n log.info(`šµļø Run is under review... ${urlInfo}`);\n await sleep(runUnderReviewInterval);\n } else throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport { buildFetchWithTimeout } from \"../other.js\";\n\nimport { defaultFetch } from \"./defaults/fetch.js\";\nimport { defaultLogDriver } from \"./defaults/log.js\";\nimport { defaultServiceBase } from \"./defaults/serviceBase.js\";\nimport { defaultUserAgent } from \"./defaults/userAgent.js\";\nimport type { SdkDependencies } from \"./dependencies.js\";\nimport { attemptNotifyDeploy } from \"./domain/attemptDeploy/index.js\";\nimport { generateSignedUrlForRunInputsExecutablesStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.js\";\nimport { generateSignedUrlForTempTeamStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-team-storage.js\";\nimport { pollCiGreenlightStatus } from \"./domain/poll-ci-greenlight.js\";\n\nexport function makeQaWolfSdk(\n {\n apiKey,\n serviceBase = defaultServiceBase,\n userAgent = defaultUserAgent,\n }: {\n apiKey: string;\n serviceBase?: string;\n userAgent?: string;\n },\n {\n fetch = defaultFetch,\n log = defaultLogDriver,\n }: Partial<SdkDependencies> = {},\n) {\n if (typeof fetch !== \"function\") {\n throw Error(\n `QA Wolf CI-SDK requires fetch to be defined. Make sure you are using NodeJS 18+, OR pass a fetch polyfill to the makeQaWolfSdk function.\nWe recommend 'undici' package for that purpose. See the Requirement section of our README for more guidance.`,\n );\n }\n\n const deps: SdkDependencies = {\n // Versions of fetch may have different default timeouts. For consistency, we explicitly set it to 2 minutes here.\n // The increased timeout helps avoid edge cases where we need to search for a commit against multiple\n // code hosting service repositories as a fallback when not finding the repository based on organization/name.\n fetch: buildFetchWithTimeout(fetch, 120000),\n log,\n };\n const apiConfig: ApiConfig = { apiKey, serviceBase, userAgent };\n return {\n attemptNotifyDeploy: attemptNotifyDeploy.bind(null, deps, apiConfig),\n generateSignedUrlForRunInputsExecutablesStorage:\n generateSignedUrlForRunInputsExecutablesStorage.bind(\n null,\n deps,\n apiConfig,\n ),\n generateSignedUrlForTempTeamStorage:\n generateSignedUrlForTempTeamStorage.bind(null, deps, apiConfig),\n pollCiGreenlightStatus: pollCiGreenlightStatus.bind(null, deps, apiConfig),\n };\n}\n\nexport type * from \"./domain/attemptDeploy/index.js\";\nexport type * from \"./domain/generateSignedUrls/types.js\";\nexport type * from \"./domain/poll-ci-greenlight.js\";\n"]}
|
package/dist/index.js
CHANGED
|
@@ -36,49 +36,7 @@ var defaultServiceBase = "https://app.qawolf.com/";
|
|
|
36
36
|
|
|
37
37
|
// package.json
|
|
38
38
|
var package_default = {
|
|
39
|
-
|
|
40
|
-
version: "1.1.0",
|
|
41
|
-
private: false,
|
|
42
|
-
description: "A simple SDK for interacting with QAWolf in CI scripts.",
|
|
43
|
-
keywords: [],
|
|
44
|
-
license: "MIT",
|
|
45
|
-
author: "Jules Sam. Randolph<jules@qawolf.com>",
|
|
46
|
-
sideEffects: false,
|
|
47
|
-
type: "module",
|
|
48
|
-
exports: {
|
|
49
|
-
".": {
|
|
50
|
-
types: "./dist/index.d.ts",
|
|
51
|
-
require: "./dist/index.cjs",
|
|
52
|
-
import: "./dist/index.js",
|
|
53
|
-
default: "./dist/index.js"
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
files: [
|
|
57
|
-
"/dist",
|
|
58
|
-
"/README.md"
|
|
59
|
-
],
|
|
60
|
-
scripts: {
|
|
61
|
-
build: "tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022",
|
|
62
|
-
lint: "dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .",
|
|
63
|
-
"lint:fix": "eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .",
|
|
64
|
-
"lint:warnings": "eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx",
|
|
65
|
-
prepublishOnly: "nx run ci-sdk:build",
|
|
66
|
-
test: 'NODE_OPTIONS="--experimental-vm-modules" NODE_NO_WARNINGS=1 jest',
|
|
67
|
-
"tsc:check": "tsc --noEmit"
|
|
68
|
-
},
|
|
69
|
-
dependencies: {
|
|
70
|
-
"@qawolf/ci-utils": "^1.0.0",
|
|
71
|
-
"@sinonjs/fake-timers": "^10.3.0",
|
|
72
|
-
slugify: "^1.6.6",
|
|
73
|
-
tslib: "^2.6.2"
|
|
74
|
-
},
|
|
75
|
-
devDependencies: {
|
|
76
|
-
tsup: "8.3.5"
|
|
77
|
-
},
|
|
78
|
-
engines: {
|
|
79
|
-
node: ">=20"
|
|
80
|
-
}
|
|
81
|
-
};
|
|
39
|
+
version: "1.1.1"};
|
|
82
40
|
|
|
83
41
|
// src/lib/sdk/defaults/userAgent.ts
|
|
84
42
|
var defaultUserAgent = `ci-sdk/${package_default.version}`;
|
|
@@ -101,8 +59,8 @@ async function logFetchError({ log, methodName, response }) {
|
|
|
101
59
|
};
|
|
102
60
|
} catch {
|
|
103
61
|
return {
|
|
104
|
-
eventId:
|
|
105
|
-
failureMessage:
|
|
62
|
+
eventId: void 0,
|
|
63
|
+
failureMessage: void 0
|
|
106
64
|
};
|
|
107
65
|
}
|
|
108
66
|
})();
|
|
@@ -149,7 +107,7 @@ async function attemptNotifyDeploy(deps, apiConfig, config) {
|
|
|
149
107
|
log.error(`\u{1F6AB} Network error from deploy_success, aborting.`);
|
|
150
108
|
return {
|
|
151
109
|
abortReason: "network-error",
|
|
152
|
-
httpStatus:
|
|
110
|
+
httpStatus: void 0,
|
|
153
111
|
outcome: "aborted"
|
|
154
112
|
};
|
|
155
113
|
}
|
|
@@ -158,7 +116,7 @@ __name(attemptNotifyDeploy, "attemptNotifyDeploy");
|
|
|
158
116
|
async function handleErrorResponse(response, log) {
|
|
159
117
|
const status = response.status;
|
|
160
118
|
let abortReason;
|
|
161
|
-
if (status ===
|
|
119
|
+
if (status === void 0) abortReason = "network-error";
|
|
162
120
|
else if (status === 401) abortReason = "401-unauthorized";
|
|
163
121
|
else if (status === 403) abortReason = "403-forbidden";
|
|
164
122
|
else if (status >= 500) abortReason = "5XX-server-error";
|
|
@@ -188,10 +146,10 @@ async function handleSuccessResponse(data, log) {
|
|
|
188
146
|
return {
|
|
189
147
|
environmentId: environment.id,
|
|
190
148
|
outcome: "success",
|
|
191
|
-
runId:
|
|
149
|
+
runId: void 0
|
|
192
150
|
};
|
|
193
151
|
}
|
|
194
|
-
log.error(`\u{1F6AB} No trigger matched the request. Please contact support.`);
|
|
152
|
+
log.error(`\u{1F6AB} No trigger matched the request. Please make sure there is at least one active test in the QA Wolf environment, or contact support.`);
|
|
195
153
|
return {
|
|
196
154
|
failReason: "no-matched-trigger",
|
|
197
155
|
outcome: "failed"
|
|
@@ -462,11 +420,11 @@ var safeDefaults = {
|
|
|
462
420
|
runInProgressInterval: 30 * 1e3,
|
|
463
421
|
runUnderReviewInterval: 60 * 1e3
|
|
464
422
|
};
|
|
465
|
-
async function pollCiGreenlightStatus(deps, apiConfig, { onRunStageChanged = /* @__PURE__ */ __name(() =>
|
|
423
|
+
async function pollCiGreenlightStatus(deps, apiConfig, { onRunStageChanged = /* @__PURE__ */ __name(() => void 0, "onRunStageChanged"), runId, ...pollConfig }) {
|
|
466
424
|
let retries = 0;
|
|
467
425
|
const { log } = deps;
|
|
468
426
|
const { abortOnSuperseded = safeDefaults.abortOnSuperseded, maxRetries = safeDefaults.maxRetries, pollTimeout = safeDefaults.pollTimeout, retryInterval = safeDefaults.retryInterval, runInProgressInterval = safeDefaults.runInProgressInterval, runUnderReviewInterval = safeDefaults.runUnderReviewInterval } = pollConfig;
|
|
469
|
-
let currentStatus =
|
|
427
|
+
let currentStatus = void 0;
|
|
470
428
|
const startedAt = Date.now();
|
|
471
429
|
let hasTimedOut = false;
|
|
472
430
|
while (!(hasTimedOut = Date.now() - startedAt > pollTimeout)) {
|
|
@@ -488,7 +446,7 @@ async function pollCiGreenlightStatus(deps, apiConfig, { onRunStageChanged = /*
|
|
|
488
446
|
if (responseState.errorType === "network") {
|
|
489
447
|
return {
|
|
490
448
|
abortReason: "network-error",
|
|
491
|
-
httpStatus:
|
|
449
|
+
httpStatus: void 0,
|
|
492
450
|
outcome: "aborted"
|
|
493
451
|
};
|
|
494
452
|
}
|
|
@@ -531,7 +489,7 @@ async function pollCiGreenlightStatus(deps, apiConfig, { onRunStageChanged = /*
|
|
|
531
489
|
log.warn(`\u274C Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`);
|
|
532
490
|
return {
|
|
533
491
|
abortReason: "superseded-run",
|
|
534
|
-
httpStatus:
|
|
492
|
+
httpStatus: void 0,
|
|
535
493
|
outcome: "aborted"
|
|
536
494
|
};
|
|
537
495
|
}
|
|
@@ -569,7 +527,7 @@ You may review the priority of certain bugs to mark these non-blocking and retry
|
|
|
569
527
|
${urlInfo}`);
|
|
570
528
|
return {
|
|
571
529
|
abortReason: "run-canceled",
|
|
572
|
-
httpStatus:
|
|
530
|
+
httpStatus: void 0,
|
|
573
531
|
outcome: "aborted"
|
|
574
532
|
};
|
|
575
533
|
}
|
|
@@ -577,7 +535,7 @@ ${urlInfo}`);
|
|
|
577
535
|
log.warn(`\u274C Poll timed out after ${pollTimeout / 1e3}s. Aborting...`);
|
|
578
536
|
return {
|
|
579
537
|
abortReason: "poll-timed-out",
|
|
580
|
-
httpStatus:
|
|
538
|
+
httpStatus: void 0,
|
|
581
539
|
outcome: "aborted"
|
|
582
540
|
};
|
|
583
541
|
}
|
|
@@ -592,7 +550,7 @@ ${urlInfo}`);
|
|
|
592
550
|
log.warn(`\u274C Poll timed out after ${pollTimeout / 1e3}s. Aborting...`);
|
|
593
551
|
return {
|
|
594
552
|
abortReason: "poll-timed-out",
|
|
595
|
-
httpStatus:
|
|
553
|
+
httpStatus: void 0,
|
|
596
554
|
outcome: "aborted"
|
|
597
555
|
};
|
|
598
556
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/other.ts","../src/lib/sdk/defaults/fetch.ts","../src/lib/sdk/defaults/log.ts","../src/lib/sdk/defaults/serviceBase.ts","../package.json","../src/lib/sdk/defaults/userAgent.ts","../src/lib/api/log.ts","../src/lib/sdk/domain/attemptDeploy/index.ts","../src/lib/api/generate-signed-url-for-run-inputs-executables.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.ts","../src/lib/api/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-team-storage.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/poll-ci-greenlight.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","timeout","args","signal","AbortSignal","defaultFetch","globalThis","defaultLogDriver","error","message","console","info","log","warn","defaultServiceBase","defaultUserAgent","packageJson","version","logFetchError","methodName","response","ok","eventId","failureMessage","body","json","catch","text","undefined","eventIdSuffix","messageSuffix","statusText","status","attemptNotifyDeploy","deps","apiConfig","config","localFetch","URL","serviceBase","JSON","stringify","branch","commit_url","commitUrl","deduplication_key","deduplicationKey","deployment_type","deploymentType","deployment_url","deploymentUrl","ephemeral_environment","ephemeralEnvironment","hosting_service","hostingService","merge_request_number","mergeRequestNumber","pull_request_number","pullRequestNumber","repository","sha","variables","headers","Authorization","apiKey","userAgent","method","handleErrorResponse","data","handleSuccessResponse","abortReason","httpStatus","outcome","environment","results","isPreviewDeployment","isStatic","logPrefix","alias","id","length","environmentId","runId","failReason","failedTrigger","find","t","failure_reason","duplicateSuite","duplicate_suite_id","successfulTrigger","created_suite_id","callGenerateSignedUrlForRunInputsExecutablesStorage","destinationFilePath","encodeURIComponent","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","e","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","fetchCiGreenlightStatus","resp","greenlightStatus","canRetry","errorType","safeDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","pollCiGreenlightStatus","onRunStageChanged","pollConfig","retries","currentStatus","startedAt","Date","now","hasTimedOut","retryLabel","previousStatus","runStage","urlInfo","relevantRunUrl","greenlight","relevantRunId","relevantRunWithBugsUrl","rootRunId","rootRunUrl","supersedingDetails","blockingBugsCount","blockingBugUrls","nonBlockingBugsCount","nonBlockingBugUrls","blockingBugList","map","url","join","nonBlockingBugList","bugsListInText","Error","makeQaWolfSdk","bind"],"mappings":"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","file":"index.js","sourcesContent":["import type { FetchDriver } from \"./sdk/dependencies.js\";\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function pluralize(count: number) {\n return count === 1 ? \"\" : \"s\";\n}\n\nexport function getBackoffMs(\n attemptNumber: number,\n minWaitMs = 1000,\n maxWaitMs = 10000,\n): number {\n return Math.min(maxWaitMs, minWaitMs * 1.2 ** attemptNumber);\n}\n\nexport const buildFetchWithTimeout =\n (fetch: FetchDriver, timeout: number) =>\n async (...args: Parameters<FetchDriver>) =>\n fetch(args[0], { ...args[1], signal: AbortSignal.timeout(timeout) });\n","export const defaultFetch = globalThis.fetch;\n","import type { LogDriver } from \"../dependencies.js\";\n\nexport const defaultLogDriver: LogDriver = {\n error(message, error) {\n console.error(message, error);\n },\n info(message) {\n console.log(message);\n },\n warn(message) {\n console.warn(message);\n },\n};\n","export const defaultServiceBase = \"https://app.qawolf.com/\";\n","{\n \"name\": \"@qawolf/ci-sdk\",\n \"version\": \"1.1.0\",\n \"private\": false,\n \"description\": \"A simple SDK for interacting with QAWolf in CI scripts.\",\n \"keywords\": [],\n \"license\": \"MIT\",\n \"author\": \"Jules Sam. Randolph<jules@qawolf.com>\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"/dist\",\n \"/README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022\",\n \"lint\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .\",\n \"lint:fix\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:warnings\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx\",\n \"prepublishOnly\": \"nx run ci-sdk:build\",\n \"test\": \"NODE_OPTIONS=\\\"--experimental-vm-modules\\\" NODE_NO_WARNINGS=1 jest\",\n \"tsc:check\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@qawolf/ci-utils\": \"^1.0.0\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"8.3.5\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n","import packageJson from \"../../../../package.json\" with { type: \"json\" };\n\nexport const defaultUserAgent = `ci-sdk/${packageJson.version}`;\n","import type { LogDriver } from \"@qawolf/ci-utils\";\n\nexport async function logFetchError({\n log,\n methodName,\n response,\n}: {\n log: LogDriver;\n methodName: string;\n response: Response;\n}) {\n if (response.ok) return;\n\n const { eventId, failureMessage } = await (async () => {\n try {\n const body = (await response.json().catch(() => response.text())) as\n | Record<string, unknown>\n | string;\n if (typeof body === \"object\" && body !== null) {\n return {\n eventId: body.eventId,\n failureMessage: body.failureMessage,\n };\n }\n // If body is not an object (i.e., it's the text from catch)\n return {\n eventId: undefined,\n failureMessage: body,\n };\n } catch {\n // If both parsing attempts somehow fail\n return {\n eventId: undefined,\n failureMessage: undefined,\n };\n }\n })();\n\n const eventIdSuffix = eventId ? ` (Event ID: ${eventId})` : \"\";\n const messageSuffix = failureMessage ? `: ${failureMessage}` : \"\";\n\n const statusText =\n response.status >= 500\n ? \"Server Error\"\n : response.statusText || \"Unknown Error\";\n\n log.error(\n `ā [${methodName}] ${response.status} ${statusText}${eventIdSuffix}${messageSuffix}`,\n );\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\n DeployStatus,\n NotifyDeployStatus,\n} from \"./types.js\";\n\nexport async function attemptNotifyDeploy(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: Partial<DeployConfig>,\n): Promise<NotifyDeployStatus> {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/deploy_success\", apiConfig.serviceBase),\n {\n body: JSON.stringify({\n branch: config.branch,\n commit_url: config.commitUrl,\n deduplication_key: config.deduplicationKey,\n deployment_type: config.deploymentType,\n deployment_url: config.deploymentUrl,\n ...(\"ephemeralEnvironment\" in config\n ? {\n ephemeral_environment: config.ephemeralEnvironment,\n }\n : \"hostingService\" in config && {\n hosting_service: config.hostingService,\n merge_request_number:\n config.hostingService === \"GitLab\"\n ? config.mergeRequestNumber\n : undefined,\n pull_request_number:\n config.hostingService === \"GitHub\"\n ? config.pullRequestNumber\n : undefined,\n repository: config.repository,\n }),\n sha: config.sha,\n variables: config.variables,\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n const data = (await response.json()) as DeployStatus;\n return handleSuccessResponse(data, log);\n } catch (error) {\n log.error(`š« Network error from deploy_success, aborting.`);\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n}\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const status = response.status;\n let abortReason: AttemptDeployHttpAbortReason;\n if (status === undefined) abortReason = \"network-error\";\n else if (status === 401) abortReason = \"401-unauthorized\";\n else if (status === 403) abortReason = \"403-forbidden\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"attemptNotifyDeploy\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n\nasync function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const isPreviewDeployment = environment && !environment.isStatic;\n\n if (environment) {\n const logPrefix = environment.isStatic\n ? \"Static environment\"\n : \"Preview environment\";\n log.info(`${logPrefix}: ${environment.alias} (id: ${environment.id})`);\n }\n\n // No triggers were matched\n if (results.length === 0) {\n if (isPreviewDeployment) {\n log.info(\n `ā
Deployment notification was successful. No run was created for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n log.error(`š« No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n\n // If there are results, environment must be defined\n if (!environment) {\n log.error(`š« No environment matched the request. Please contact support.`);\n return { failReason: \"no-environment\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((t) => \"failure_reason\" in t);\n if (failedTrigger) {\n log.error(\n `š« Run could not be created. Reason: \"${failedTrigger.failure_reason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((t) => \"duplicate_suite_id\" in t);\n if (duplicateSuite) {\n log.info(\n `ā
Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicate_suite_id} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicate_suite_id,\n };\n }\n\n const successfulTrigger = results.find((t) => \"created_suite_id\" in t);\n if (!successfulTrigger) {\n log.error(`š« No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n log.info(\n `ā
Deployment notification was successful. Run created with ID: ${successfulTrigger.created_suite_id}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.created_suite_id,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForRunInputsExecutablesStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: GenerateSignedUrlConfig,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/run-inputs-executables-signed-urls?file=${encodeURIComponent(destinationFilePath)}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForRunInputsExecutablesStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForRunInputsExecutablesStorage } from \"../../../api/generate-signed-url-for-run-inputs-executables.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n GenerateSignedUrlAbortReason,\n GenerateSignedUrlConfig,\n GenerateSignedUrlStatus,\n} from \"./types.js\";\n\nexport async function generateSignedUrlForRunInputsExecutablesStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`š« destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState =\n await callGenerateSignedUrlForRunInputsExecutablesStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`ā
Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForTempTeamStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: Partial<GenerateSignedUrlConfig>,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/team-storage-signed-url?file=${destinationFilePath}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForTempTeamStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForTempTeamStorage } from \"../../../api/generate-signed-url-for-team-storage.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type { GenerateSignedUrlConfig } from \"./types.js\";\n\ntype GenerateSignedUrlStatus =\n | {\n fileLocation?: string;\n playgroundFileLocation?: string;\n success: true;\n uploadUrl?: string;\n }\n | {\n abortReason: GenerateSignedUrlAbortReason;\n httpStatus?: number;\n success: false;\n };\n\nexport type GenerateSignedUrlAbortReason =\n | \"client-network-error\"\n | \"sdk-argument-validation-failed\"\n | \"400-invalid-request\"\n | \"401-invalid-credentials\"\n | \"403-forbidden\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport async function generateSignedUrlForTempTeamStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`š« destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState = await callGenerateSignedUrlForTempTeamStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`ā
Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport type CiGreenlightBugDetails = {\n /**\n * The URL of this BR in the QAWolf application.\n */\n applicationUrl: string;\n /**\n * If this bug report is linked to an external issue, it will\n * show up here.\n */\n externalIssue:\n | {\n /**\n * The URL of the external issue in the external platform\n * application.\n */\n applicationUrl: string;\n /**\n * The ID of this issue in the external platform.\n */\n externalIssueId: string;\n /**\n * Lowercase platform name (e.g. \"jira\").\n */\n platform: string;\n }\n | undefined;\n /**\n * True if the bug is blocking.\n */\n isBlocking: boolean;\n /**\n * True if the bug has been found in this run.\n */\n isNew: boolean;\n /**\n * The name of this bug.\n */\n name: string;\n /**\n * The bug number.\n */\n number: number;\n /**\n * The priority of this bug.\n */\n priority: \"medium\" | \"unprioritized\" | \"low\" | \"high\" | \"urgent\";\n};\n\nexport type CiGreenlightBugData = {\n /**\n * The count of blocking bugs reproduced in the run.\n */\n blockingBugsCount: number;\n /**\n * The URLs of the blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: true`, reading\n * the `applicationUrl` field.\n */\n blockingBugUrls: string[];\n /**\n * The count of non-blocking bugs reproduced in the run.\n */\n nonBlockingBugsCount: number;\n /**\n * The URLs of the non-blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: false`, reading\n * the `applicationUrl` field.\n */\n nonBlockingBugUrls: string[];\n /**\n * Blocking bugs that were not reproduced in this run, but are still\n * opened in the run environment. This may happen when the run only covers a\n * subset of the workflows in environment.\n */\n otherBlockingBugsInEnvironment: CiGreenlightBugDetails[];\n /**\n * Bugs that were reproduced in this run. This includes newly found bugs.\n */\n reproducedBugs: CiGreenlightBugDetails[];\n};\n\n/**\n * @deprecated This type will be removed in the next major version. Use `CiGreenlightBugData` instead.\n */\nexport type CiGreenlightCompletedSuiteDetails = CiGreenlightBugData;\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n relevantRunWithBugsUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n workflowsDisabledAfterRunCount: number;\n workflowsInRunCount: number;\n workflowsUnderInvestigationCount: number;\n};\n\n/**\n * The status of a CI greenlight run. See the API documentation here for\n * more details: https://qawolf.notion.site/1b170576efea411fa785842a71e7c99e\n */\nexport type CiGreenlightStatus = CiGreenlightStatusBase &\n (\n | ({\n greenlight: boolean;\n runStage: \"completed\";\n } & CiGreenlightBugData)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData)\n | {\n greenlight: false;\n runStage: \"initializing\" | \"underReview\" | \"canceled\";\n }\n );\n\nexport async function fetchCiGreenlightStatus(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n {\n runId,\n }: {\n runId: string;\n },\n { fetch: localFetch, log }: SdkDependencies,\n) {\n try {\n const resp = await localFetch(\n new URL(\n `/api/v0/ci-greenlight/${encodeURIComponent(runId)}`,\n serviceBase,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"User-Agent\": userAgent,\n },\n },\n );\n\n if (resp.ok) {\n const greenlightStatus = (await resp.json()) as CiGreenlightStatus;\n return {\n greenlightStatus,\n httpStatus: resp.status,\n ok: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"fetchCiGreenlightStatus\",\n response: resp,\n });\n if (resp.status === 404) {\n return {\n canRetry: true,\n errorType: \"not-found\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n if (resp.status >= 500) {\n return {\n canRetry: true,\n errorType: \"server\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n return {\n canRetry: false,\n errorType: \"client\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n } catch (e) {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","/* eslint-disable @qawolf/max-lines -- Old technical debt */\n\nimport type { ApiConfig } from \"../../api-types.js\";\nimport {\n type CiGreenlightStatus,\n fetchCiGreenlightStatus,\n} from \"../../api/ci-greenlight.js\";\nimport { pluralize, sleep } from \"../../other.js\";\nimport type { SdkDependencies } from \"../dependencies.js\";\n\nexport type PollCiGreenlightPollConfig = {\n /**\n * If true, the job will be aborted when a superseding run is detected.\n *\n * @default false\n */\n abortOnSuperseded: boolean;\n /**\n * Maximum number of network operations retries before aborting the job.\n *\n * @default 10\n */\n maxRetries: number;\n /**\n * Timeout in milliseconds before aborting this polling operation.\n *\n * @default 120 minutes\n */\n pollTimeout: number;\n /**\n * Interval in milliseconds between network operations retries.\n *\n * @default 10 seconds\n */\n retryInterval: number;\n /**\n * Interval in milliseconds between polling for a run in progress.\n *\n * @default 30 seconds\n */\n runInProgressInterval: number;\n /**\n * Interval in milliseconds between polling for a run under review.\n *\n * @default 60 minutes\n */\n runUnderReviewInterval: number;\n};\n\nexport type PollCiGreenlightHttpAbortReason =\n | \"4XX-client-error\"\n | \"404-run-not-found\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport type PollCiGreenlightNonHttpAbortReason =\n | \"poll-timed-out\"\n | \"run-canceled\"\n | \"network-error\"\n | \"superseded-run\";\n\nexport type PollCiGreenlightAbortReason =\n | PollCiGreenlightNonHttpAbortReason\n | PollCiGreenlightHttpAbortReason;\n\nexport type PollCiGreenlightStatus =\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * No blocking bugs were found in the run.\n */\n outcome: \"success\";\n }\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * Blocking bugs were found in the run.\n */\n outcome: \"failed\";\n }\n | {\n abortReason: PollCiGreenlightHttpAbortReason;\n httpStatus: number;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n }\n | {\n abortReason: PollCiGreenlightNonHttpAbortReason;\n httpStatus: undefined;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n };\n\nexport type PollCiGreenlightParams = {\n /**\n * Callback to be called when the lifecycle stage of the run changes.\n */\n onRunStageChanged?: (\n current: CiGreenlightStatus,\n previous: CiGreenlightStatus | undefined,\n ) => unknown | Promise<unknown>;\n runId: string;\n} & Partial<PollCiGreenlightPollConfig>;\n\n// If you change these values, make sure you update the JSDoc\n// comments in the PollConfig type.\nconst safeDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000,\n retryInterval: 10 * 1000,\n runInProgressInterval: 30 * 1000,\n runUnderReviewInterval: 60 * 1000,\n};\n\nexport async function pollCiGreenlightStatus(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n onRunStageChanged: onRunStageChanged = () => undefined,\n runId,\n ...pollConfig\n }: PollCiGreenlightParams,\n): Promise<PollCiGreenlightStatus> {\n let retries = 0;\n const { log } = deps;\n const {\n abortOnSuperseded = safeDefaults.abortOnSuperseded,\n maxRetries = safeDefaults.maxRetries,\n pollTimeout = safeDefaults.pollTimeout,\n retryInterval = safeDefaults.retryInterval,\n runInProgressInterval = safeDefaults.runInProgressInterval,\n runUnderReviewInterval = safeDefaults.runUnderReviewInterval,\n } = pollConfig;\n let currentStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n let hasTimedOut = false;\n while (!(hasTimedOut = Date.now() - startedAt > pollTimeout)) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n {\n runId,\n },\n deps,\n );\n if (!responseState.ok && !responseState.canRetry) {\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason: \"4XX-client-error\",\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n if (!responseState.ok) {\n // This is a non-OK retryable status.\n retries += 1;\n if (retries > maxRetries) {\n log.error(\n `š« Unrecoverable error${\n responseState.httpStatus\n ? ` (status ${responseState.httpStatus})`\n : \"\"\n } from CI greenlight, aborting after ${maxRetries} attempts.`,\n );\n if (responseState.errorType === \"network\") {\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n let abortReason: PollCiGreenlightAbortReason = \"XXX-other-http-code\";\n\n if (responseState.errorType === \"not-found\")\n abortReason = \"404-run-not-found\";\n else if (responseState.errorType === \"server\")\n abortReason = \"5XX-server-error\";\n else responseState satisfies never;\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n const { errorType, httpStatus } = responseState;\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n if (errorType === \"network\") log.warn(`ā Network error${retryLabel}`);\n else if (errorType === \"not-found\")\n log.info(`ā³ Run not found${retryLabel}`);\n else if (errorType === \"server\") log.warn(`ā Server error${retryLabel}`);\n\n await sleep(retryInterval);\n continue;\n }\n // responseState.ok === true\n retries = 0;\n const { greenlightStatus } = responseState;\n const previousStatus = currentStatus;\n currentStatus = greenlightStatus;\n if (\n !previousStatus ||\n previousStatus.runStage !== greenlightStatus.runStage\n ) {\n try {\n await onRunStageChanged(greenlightStatus, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n const urlInfo = `See ${greenlightStatus.relevantRunUrl}`;\n const {\n greenlight,\n relevantRunId,\n relevantRunUrl,\n relevantRunWithBugsUrl,\n rootRunId,\n rootRunUrl,\n runStage,\n } = greenlightStatus;\n if (rootRunId !== relevantRunId) {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n if (abortOnSuperseded) {\n log.warn(\n `ā Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`,\n );\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n log.info(`Root run was superseded:${supersedingDetails}`);\n }\n if (runStage === \"completed\") {\n const {\n blockingBugsCount,\n blockingBugUrls = [],\n nonBlockingBugsCount,\n nonBlockingBugUrls = [],\n } = greenlightStatus;\n const blockingBugList = blockingBugUrls\n .map((url) => `\\n⢠${url}`)\n .join(\"\");\n const nonBlockingBugList = nonBlockingBugUrls\n .map((url) => `\\n⢠${url}`)\n .join(\"\");\n const bugsListInText = `${\n blockingBugUrls.length > 0 ? `\\nBLOCKING BUGS:${blockingBugList}` : \"\"\n }${\n nonBlockingBugUrls.length > 0\n ? `\\nNON BLOCKING BUGS:${nonBlockingBugList}`\n : \"\"\n }`;\n if (greenlight) {\n log.info(\n `ā
Run passed and no blocking bugs found${\n nonBlockingBugsCount > 0\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )} found`\n : \"\"\n }.\\n${urlInfo}`,\n );\n return { greenlightStatus, outcome: \"success\" };\n } else {\n log.warn(\n `ā Run failed and ${blockingBugsCount} blocking bug${pluralize(\n blockingBugsCount,\n )} found${\n nonBlockingBugsCount\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )}`\n : \"\"\n }.\\nSee ${relevantRunWithBugsUrl}\\n` +\n \"You may review the priority of certain bugs to mark these non-blocking and retry the job.\\n\" +\n bugsListInText,\n );\n return { greenlightStatus, outcome: \"failed\" };\n }\n }\n if (runStage === \"canceled\") {\n log.info(\n `š« Run was canceled. Aborting... Please contact support.\\n${urlInfo}`,\n );\n return {\n abortReason: \"run-canceled\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n // Non-terminal run stages\n if (hasTimedOut) {\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (runStage === \"initializing\") {\n log.info(`ā³ Run is in progress... ${urlInfo}`);\n await sleep(runInProgressInterval);\n } else if (runStage === \"underReview\") {\n log.info(`šµļø Run is under review... ${urlInfo}`);\n await sleep(runUnderReviewInterval);\n } else throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport { buildFetchWithTimeout } from \"../other.js\";\n\nimport { defaultFetch } from \"./defaults/fetch.js\";\nimport { defaultLogDriver } from \"./defaults/log.js\";\nimport { defaultServiceBase } from \"./defaults/serviceBase.js\";\nimport { defaultUserAgent } from \"./defaults/userAgent.js\";\nimport type { SdkDependencies } from \"./dependencies.js\";\nimport { attemptNotifyDeploy } from \"./domain/attemptDeploy/index.js\";\nimport { generateSignedUrlForRunInputsExecutablesStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.js\";\nimport { generateSignedUrlForTempTeamStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-team-storage.js\";\nimport { pollCiGreenlightStatus } from \"./domain/poll-ci-greenlight.js\";\n\nexport function makeQaWolfSdk(\n {\n apiKey,\n serviceBase = defaultServiceBase,\n userAgent = defaultUserAgent,\n }: {\n apiKey: string;\n serviceBase?: string;\n userAgent?: string;\n },\n {\n fetch = defaultFetch,\n log = defaultLogDriver,\n }: Partial<SdkDependencies> = {},\n) {\n if (typeof fetch !== \"function\") {\n throw Error(\n `QA Wolf CI-SDK requires fetch to be defined. Make sure you are using NodeJS 18+, OR pass a fetch polyfill to the makeQaWolfSdk function.\nWe recommend 'undici' package for that purpose. See the Requirement section of our README for more guidance.`,\n );\n }\n\n const deps: SdkDependencies = {\n // Versions of fetch may have different default timeouts. For consistency, we explicitly set it to 2 minutes here.\n // The increased timeout helps avoid edge cases where we need to search for a commit against multiple\n // code hosting service repositories as a fallback when not finding the repository based on organization/name.\n fetch: buildFetchWithTimeout(fetch, 120000),\n log,\n };\n const apiConfig: ApiConfig = { apiKey, serviceBase, userAgent };\n return {\n attemptNotifyDeploy: attemptNotifyDeploy.bind(null, deps, apiConfig),\n generateSignedUrlForRunInputsExecutablesStorage:\n generateSignedUrlForRunInputsExecutablesStorage.bind(\n null,\n deps,\n apiConfig,\n ),\n generateSignedUrlForTempTeamStorage:\n generateSignedUrlForTempTeamStorage.bind(null, deps, apiConfig),\n pollCiGreenlightStatus: pollCiGreenlightStatus.bind(null, deps, apiConfig),\n };\n}\n\nexport type * from \"./domain/attemptDeploy/index.js\";\nexport type * from \"./domain/generateSignedUrls/types.js\";\nexport type * from \"./domain/poll-ci-greenlight.js\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/other.ts","../src/lib/sdk/defaults/fetch.ts","../src/lib/sdk/defaults/log.ts","../src/lib/sdk/defaults/serviceBase.ts","../package.json","../src/lib/sdk/defaults/userAgent.ts","../src/lib/api/log.ts","../src/lib/sdk/domain/attemptDeploy/index.ts","../src/lib/api/generate-signed-url-for-run-inputs-executables.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.ts","../src/lib/api/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-team-storage.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/poll-ci-greenlight.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","timeout","args","signal","AbortSignal","defaultFetch","globalThis","defaultLogDriver","error","message","console","info","log","warn","defaultServiceBase","defaultUserAgent","packageJson","version","logFetchError","methodName","response","ok","eventId","failureMessage","body","json","catch","text","undefined","eventIdSuffix","messageSuffix","statusText","status","attemptNotifyDeploy","deps","apiConfig","config","localFetch","URL","serviceBase","JSON","stringify","branch","commit_url","commitUrl","deduplication_key","deduplicationKey","deployment_type","deploymentType","deployment_url","deploymentUrl","ephemeral_environment","ephemeralEnvironment","hosting_service","hostingService","merge_request_number","mergeRequestNumber","pull_request_number","pullRequestNumber","repository","sha","variables","headers","Authorization","apiKey","userAgent","method","handleErrorResponse","data","handleSuccessResponse","abortReason","httpStatus","outcome","environment","results","isPreviewDeployment","isStatic","logPrefix","alias","id","length","environmentId","runId","failReason","failedTrigger","find","t","failure_reason","duplicateSuite","duplicate_suite_id","successfulTrigger","created_suite_id","callGenerateSignedUrlForRunInputsExecutablesStorage","destinationFilePath","encodeURIComponent","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","e","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","fetchCiGreenlightStatus","resp","greenlightStatus","canRetry","errorType","safeDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","pollCiGreenlightStatus","onRunStageChanged","pollConfig","retries","currentStatus","startedAt","Date","now","hasTimedOut","retryLabel","previousStatus","runStage","urlInfo","relevantRunUrl","greenlight","relevantRunId","relevantRunWithBugsUrl","rootRunId","rootRunUrl","supersedingDetails","blockingBugsCount","blockingBugUrls","nonBlockingBugsCount","nonBlockingBugUrls","blockingBugList","map","url","join","nonBlockingBugList","bugsListInText","Error","makeQaWolfSdk","bind"],"mappings":"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","file":"index.js","sourcesContent":["import type { FetchDriver } from \"./sdk/dependencies.js\";\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function pluralize(count: number) {\n return count === 1 ? \"\" : \"s\";\n}\n\nexport function getBackoffMs(\n attemptNumber: number,\n minWaitMs = 1000,\n maxWaitMs = 10000,\n): number {\n return Math.min(maxWaitMs, minWaitMs * 1.2 ** attemptNumber);\n}\n\nexport const buildFetchWithTimeout =\n (fetch: FetchDriver, timeout: number) =>\n async (...args: Parameters<FetchDriver>) =>\n fetch(args[0], { ...args[1], signal: AbortSignal.timeout(timeout) });\n","export const defaultFetch = globalThis.fetch;\n","import type { LogDriver } from \"../dependencies.js\";\n\nexport const defaultLogDriver: LogDriver = {\n error(message, error) {\n console.error(message, error);\n },\n info(message) {\n console.log(message);\n },\n warn(message) {\n console.warn(message);\n },\n};\n","export const defaultServiceBase = \"https://app.qawolf.com/\";\n","{\n \"name\": \"@qawolf/ci-sdk\",\n \"version\": \"1.1.1\",\n \"private\": false,\n \"description\": \"A simple SDK for interacting with QAWolf in CI scripts.\",\n \"keywords\": [],\n \"license\": \"MIT\",\n \"author\": \"Jules Sam. Randolph<jules@qawolf.com>\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"/dist\",\n \"/README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022\",\n \"lint\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .\",\n \"lint:fix\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:warnings\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx\",\n \"prepublishOnly\": \"nx run ci-sdk:build\",\n \"test\": \"NODE_OPTIONS=\\\"--experimental-vm-modules\\\" NODE_NO_WARNINGS=1 jest\",\n \"tsc:check\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@qawolf/ci-utils\": \"^1.0.0\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.3.5\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n","import packageJson from \"../../../../package.json\" with { type: \"json\" };\n\nexport const defaultUserAgent = `ci-sdk/${packageJson.version}`;\n","import type { LogDriver } from \"@qawolf/ci-utils\";\n\nexport async function logFetchError({\n log,\n methodName,\n response,\n}: {\n log: LogDriver;\n methodName: string;\n response: Response;\n}) {\n if (response.ok) return;\n\n const { eventId, failureMessage } = await (async () => {\n try {\n const body = (await response.json().catch(() => response.text())) as\n | Record<string, unknown>\n | string;\n if (typeof body === \"object\" && body !== null) {\n return {\n eventId: body.eventId,\n failureMessage: body.failureMessage,\n };\n }\n // If body is not an object (i.e., it's the text from catch)\n return {\n eventId: undefined,\n failureMessage: body,\n };\n } catch {\n // If both parsing attempts somehow fail\n return {\n eventId: undefined,\n failureMessage: undefined,\n };\n }\n })();\n\n const eventIdSuffix = eventId ? ` (Event ID: ${eventId})` : \"\";\n const messageSuffix = failureMessage ? `: ${failureMessage}` : \"\";\n\n const statusText =\n response.status >= 500\n ? \"Server Error\"\n : response.statusText || \"Unknown Error\";\n\n log.error(\n `ā [${methodName}] ${response.status} ${statusText}${eventIdSuffix}${messageSuffix}`,\n );\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\n DeployStatus,\n NotifyDeployStatus,\n} from \"./types.js\";\n\nexport async function attemptNotifyDeploy(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: Partial<DeployConfig>,\n): Promise<NotifyDeployStatus> {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/deploy_success\", apiConfig.serviceBase),\n {\n body: JSON.stringify({\n branch: config.branch,\n commit_url: config.commitUrl,\n deduplication_key: config.deduplicationKey,\n deployment_type: config.deploymentType,\n deployment_url: config.deploymentUrl,\n ...(\"ephemeralEnvironment\" in config\n ? {\n ephemeral_environment: config.ephemeralEnvironment,\n }\n : \"hostingService\" in config && {\n hosting_service: config.hostingService,\n merge_request_number:\n config.hostingService === \"GitLab\"\n ? config.mergeRequestNumber\n : undefined,\n pull_request_number:\n config.hostingService === \"GitHub\"\n ? config.pullRequestNumber\n : undefined,\n repository: config.repository,\n }),\n sha: config.sha,\n variables: config.variables,\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n const data = (await response.json()) as DeployStatus;\n return handleSuccessResponse(data, log);\n } catch (error) {\n log.error(`š« Network error from deploy_success, aborting.`);\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n}\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const status = response.status;\n let abortReason: AttemptDeployHttpAbortReason;\n if (status === undefined) abortReason = \"network-error\";\n else if (status === 401) abortReason = \"401-unauthorized\";\n else if (status === 403) abortReason = \"403-forbidden\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"attemptNotifyDeploy\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n\nasync function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const isPreviewDeployment = environment && !environment.isStatic;\n\n if (environment) {\n const logPrefix = environment.isStatic\n ? \"Static environment\"\n : \"Preview environment\";\n log.info(`${logPrefix}: ${environment.alias} (id: ${environment.id})`);\n }\n\n // No triggers were matched\n if (results.length === 0) {\n if (isPreviewDeployment) {\n log.info(\n `ā
Deployment notification was successful. No run was created for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n log.error(\n `š« No trigger matched the request. Please make sure there is at least one active test in the QA Wolf environment, or contact support.`,\n );\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n\n // If there are results, environment must be defined\n if (!environment) {\n log.error(`š« No environment matched the request. Please contact support.`);\n return { failReason: \"no-environment\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((t) => \"failure_reason\" in t);\n if (failedTrigger) {\n log.error(\n `š« Run could not be created. Reason: \"${failedTrigger.failure_reason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((t) => \"duplicate_suite_id\" in t);\n if (duplicateSuite) {\n log.info(\n `ā
Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicate_suite_id} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicate_suite_id,\n };\n }\n\n const successfulTrigger = results.find((t) => \"created_suite_id\" in t);\n if (!successfulTrigger) {\n log.error(`š« No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n log.info(\n `ā
Deployment notification was successful. Run created with ID: ${successfulTrigger.created_suite_id}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.created_suite_id,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForRunInputsExecutablesStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: GenerateSignedUrlConfig,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/run-inputs-executables-signed-urls?file=${encodeURIComponent(destinationFilePath)}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForRunInputsExecutablesStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForRunInputsExecutablesStorage } from \"../../../api/generate-signed-url-for-run-inputs-executables.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n GenerateSignedUrlAbortReason,\n GenerateSignedUrlConfig,\n GenerateSignedUrlStatus,\n} from \"./types.js\";\n\nexport async function generateSignedUrlForRunInputsExecutablesStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`š« destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState =\n await callGenerateSignedUrlForRunInputsExecutablesStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`ā
Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForTempTeamStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: Partial<GenerateSignedUrlConfig>,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/team-storage-signed-url?file=${destinationFilePath}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForTempTeamStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForTempTeamStorage } from \"../../../api/generate-signed-url-for-team-storage.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type { GenerateSignedUrlConfig } from \"./types.js\";\n\ntype GenerateSignedUrlStatus =\n | {\n fileLocation?: string;\n playgroundFileLocation?: string;\n success: true;\n uploadUrl?: string;\n }\n | {\n abortReason: GenerateSignedUrlAbortReason;\n httpStatus?: number;\n success: false;\n };\n\nexport type GenerateSignedUrlAbortReason =\n | \"client-network-error\"\n | \"sdk-argument-validation-failed\"\n | \"400-invalid-request\"\n | \"401-invalid-credentials\"\n | \"403-forbidden\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport async function generateSignedUrlForTempTeamStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`š« destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState = await callGenerateSignedUrlForTempTeamStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`ā
Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport type CiGreenlightBugDetails = {\n /**\n * The URL of this BR in the QAWolf application.\n */\n applicationUrl: string;\n /**\n * If this bug report is linked to an external issue, it will\n * show up here.\n */\n externalIssue:\n | {\n /**\n * The URL of the external issue in the external platform\n * application.\n */\n applicationUrl: string;\n /**\n * The ID of this issue in the external platform.\n */\n externalIssueId: string;\n /**\n * Lowercase platform name (e.g. \"jira\").\n */\n platform: string;\n }\n | undefined;\n /**\n * True if the bug is blocking.\n */\n isBlocking: boolean;\n /**\n * True if the bug has been found in this run.\n */\n isNew: boolean;\n /**\n * The name of this bug.\n */\n name: string;\n /**\n * The bug number.\n */\n number: number;\n /**\n * The priority of this bug.\n */\n priority: \"medium\" | \"unprioritized\" | \"low\" | \"high\" | \"urgent\";\n};\n\nexport type CiGreenlightBugData = {\n /**\n * The count of blocking bugs reproduced in the run.\n */\n blockingBugsCount: number;\n /**\n * The URLs of the blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: true`, reading\n * the `applicationUrl` field.\n */\n blockingBugUrls: string[];\n /**\n * The count of non-blocking bugs reproduced in the run.\n */\n nonBlockingBugsCount: number;\n /**\n * The URLs of the non-blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: false`, reading\n * the `applicationUrl` field.\n */\n nonBlockingBugUrls: string[];\n /**\n * Blocking bugs that were not reproduced in this run, but are still\n * opened in the run environment. This may happen when the run only covers a\n * subset of the workflows in environment.\n */\n otherBlockingBugsInEnvironment: CiGreenlightBugDetails[];\n /**\n * Bugs that were reproduced in this run. This includes newly found bugs.\n */\n reproducedBugs: CiGreenlightBugDetails[];\n};\n\n/**\n * @deprecated This type will be removed in the next major version. Use `CiGreenlightBugData` instead.\n */\nexport type CiGreenlightCompletedSuiteDetails = CiGreenlightBugData;\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n relevantRunWithBugsUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n workflowsDisabledAfterRunCount: number;\n workflowsInRunCount: number;\n workflowsUnderInvestigationCount: number;\n};\n\n/**\n * The status of a CI greenlight run. See the API documentation here for\n * more details: https://qawolf.notion.site/1b170576efea411fa785842a71e7c99e\n */\nexport type CiGreenlightStatus = CiGreenlightStatusBase &\n (\n | ({\n greenlight: boolean;\n runStage: \"completed\";\n } & CiGreenlightBugData)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData)\n | {\n greenlight: false;\n runStage: \"initializing\" | \"underReview\" | \"canceled\";\n }\n );\n\nexport async function fetchCiGreenlightStatus(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n {\n runId,\n }: {\n runId: string;\n },\n { fetch: localFetch, log }: SdkDependencies,\n) {\n try {\n const resp = await localFetch(\n new URL(\n `/api/v0/ci-greenlight/${encodeURIComponent(runId)}`,\n serviceBase,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"User-Agent\": userAgent,\n },\n },\n );\n\n if (resp.ok) {\n const greenlightStatus = (await resp.json()) as CiGreenlightStatus;\n return {\n greenlightStatus,\n httpStatus: resp.status,\n ok: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"fetchCiGreenlightStatus\",\n response: resp,\n });\n if (resp.status === 404) {\n return {\n canRetry: true,\n errorType: \"not-found\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n if (resp.status >= 500) {\n return {\n canRetry: true,\n errorType: \"server\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n return {\n canRetry: false,\n errorType: \"client\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n } catch (e) {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","/* eslint-disable @qawolf/max-lines -- Old technical debt */\n\nimport type { ApiConfig } from \"../../api-types.js\";\nimport {\n type CiGreenlightStatus,\n fetchCiGreenlightStatus,\n} from \"../../api/ci-greenlight.js\";\nimport { pluralize, sleep } from \"../../other.js\";\nimport type { SdkDependencies } from \"../dependencies.js\";\n\nexport type PollCiGreenlightPollConfig = {\n /**\n * If true, the job will be aborted when a superseding run is detected.\n *\n * @default false\n */\n abortOnSuperseded: boolean;\n /**\n * Maximum number of network operations retries before aborting the job.\n *\n * @default 10\n */\n maxRetries: number;\n /**\n * Timeout in milliseconds before aborting this polling operation.\n *\n * @default 120 minutes\n */\n pollTimeout: number;\n /**\n * Interval in milliseconds between network operations retries.\n *\n * @default 10 seconds\n */\n retryInterval: number;\n /**\n * Interval in milliseconds between polling for a run in progress.\n *\n * @default 30 seconds\n */\n runInProgressInterval: number;\n /**\n * Interval in milliseconds between polling for a run under review.\n *\n * @default 60 minutes\n */\n runUnderReviewInterval: number;\n};\n\nexport type PollCiGreenlightHttpAbortReason =\n | \"4XX-client-error\"\n | \"404-run-not-found\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport type PollCiGreenlightNonHttpAbortReason =\n | \"poll-timed-out\"\n | \"run-canceled\"\n | \"network-error\"\n | \"superseded-run\";\n\nexport type PollCiGreenlightAbortReason =\n | PollCiGreenlightNonHttpAbortReason\n | PollCiGreenlightHttpAbortReason;\n\nexport type PollCiGreenlightStatus =\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * No blocking bugs were found in the run.\n */\n outcome: \"success\";\n }\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * Blocking bugs were found in the run.\n */\n outcome: \"failed\";\n }\n | {\n abortReason: PollCiGreenlightHttpAbortReason;\n httpStatus: number;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n }\n | {\n abortReason: PollCiGreenlightNonHttpAbortReason;\n httpStatus: undefined;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n };\n\nexport type PollCiGreenlightParams = {\n /**\n * Callback to be called when the lifecycle stage of the run changes.\n */\n onRunStageChanged?: (\n current: CiGreenlightStatus,\n previous: CiGreenlightStatus | undefined,\n ) => unknown | Promise<unknown>;\n runId: string;\n} & Partial<PollCiGreenlightPollConfig>;\n\n// If you change these values, make sure you update the JSDoc\n// comments in the PollConfig type.\nconst safeDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000,\n retryInterval: 10 * 1000,\n runInProgressInterval: 30 * 1000,\n runUnderReviewInterval: 60 * 1000,\n};\n\nexport async function pollCiGreenlightStatus(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n onRunStageChanged: onRunStageChanged = () => undefined,\n runId,\n ...pollConfig\n }: PollCiGreenlightParams,\n): Promise<PollCiGreenlightStatus> {\n let retries = 0;\n const { log } = deps;\n const {\n abortOnSuperseded = safeDefaults.abortOnSuperseded,\n maxRetries = safeDefaults.maxRetries,\n pollTimeout = safeDefaults.pollTimeout,\n retryInterval = safeDefaults.retryInterval,\n runInProgressInterval = safeDefaults.runInProgressInterval,\n runUnderReviewInterval = safeDefaults.runUnderReviewInterval,\n } = pollConfig;\n let currentStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n let hasTimedOut = false;\n while (!(hasTimedOut = Date.now() - startedAt > pollTimeout)) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n {\n runId,\n },\n deps,\n );\n if (!responseState.ok && !responseState.canRetry) {\n log.error(\n `š« Unrecoverable error (status ${responseState.httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason: \"4XX-client-error\",\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n if (!responseState.ok) {\n // This is a non-OK retryable status.\n retries += 1;\n if (retries > maxRetries) {\n log.error(\n `š« Unrecoverable error${\n responseState.httpStatus\n ? ` (status ${responseState.httpStatus})`\n : \"\"\n } from CI greenlight, aborting after ${maxRetries} attempts.`,\n );\n if (responseState.errorType === \"network\") {\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n let abortReason: PollCiGreenlightAbortReason = \"XXX-other-http-code\";\n\n if (responseState.errorType === \"not-found\")\n abortReason = \"404-run-not-found\";\n else if (responseState.errorType === \"server\")\n abortReason = \"5XX-server-error\";\n else responseState satisfies never;\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n const { errorType, httpStatus } = responseState;\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n if (errorType === \"network\") log.warn(`ā Network error${retryLabel}`);\n else if (errorType === \"not-found\")\n log.info(`ā³ Run not found${retryLabel}`);\n else if (errorType === \"server\") log.warn(`ā Server error${retryLabel}`);\n\n await sleep(retryInterval);\n continue;\n }\n // responseState.ok === true\n retries = 0;\n const { greenlightStatus } = responseState;\n const previousStatus = currentStatus;\n currentStatus = greenlightStatus;\n if (\n !previousStatus ||\n previousStatus.runStage !== greenlightStatus.runStage\n ) {\n try {\n await onRunStageChanged(greenlightStatus, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n const urlInfo = `See ${greenlightStatus.relevantRunUrl}`;\n const {\n greenlight,\n relevantRunId,\n relevantRunUrl,\n relevantRunWithBugsUrl,\n rootRunId,\n rootRunUrl,\n runStage,\n } = greenlightStatus;\n if (rootRunId !== relevantRunId) {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n if (abortOnSuperseded) {\n log.warn(\n `ā Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`,\n );\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n log.info(`Root run was superseded:${supersedingDetails}`);\n }\n if (runStage === \"completed\") {\n const {\n blockingBugsCount,\n blockingBugUrls = [],\n nonBlockingBugsCount,\n nonBlockingBugUrls = [],\n } = greenlightStatus;\n const blockingBugList = blockingBugUrls\n .map((url) => `\\n⢠${url}`)\n .join(\"\");\n const nonBlockingBugList = nonBlockingBugUrls\n .map((url) => `\\n⢠${url}`)\n .join(\"\");\n const bugsListInText = `${\n blockingBugUrls.length > 0 ? `\\nBLOCKING BUGS:${blockingBugList}` : \"\"\n }${\n nonBlockingBugUrls.length > 0\n ? `\\nNON BLOCKING BUGS:${nonBlockingBugList}`\n : \"\"\n }`;\n if (greenlight) {\n log.info(\n `ā
Run passed and no blocking bugs found${\n nonBlockingBugsCount > 0\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )} found`\n : \"\"\n }.\\n${urlInfo}`,\n );\n return { greenlightStatus, outcome: \"success\" };\n } else {\n log.warn(\n `ā Run failed and ${blockingBugsCount} blocking bug${pluralize(\n blockingBugsCount,\n )} found${\n nonBlockingBugsCount\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )}`\n : \"\"\n }.\\nSee ${relevantRunWithBugsUrl}\\n` +\n \"You may review the priority of certain bugs to mark these non-blocking and retry the job.\\n\" +\n bugsListInText,\n );\n return { greenlightStatus, outcome: \"failed\" };\n }\n }\n if (runStage === \"canceled\") {\n log.info(\n `š« Run was canceled. Aborting... Please contact support.\\n${urlInfo}`,\n );\n return {\n abortReason: \"run-canceled\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n // Non-terminal run stages\n if (hasTimedOut) {\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (runStage === \"initializing\") {\n log.info(`ā³ Run is in progress... ${urlInfo}`);\n await sleep(runInProgressInterval);\n } else if (runStage === \"underReview\") {\n log.info(`šµļø Run is under review... ${urlInfo}`);\n await sleep(runUnderReviewInterval);\n } else throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport { buildFetchWithTimeout } from \"../other.js\";\n\nimport { defaultFetch } from \"./defaults/fetch.js\";\nimport { defaultLogDriver } from \"./defaults/log.js\";\nimport { defaultServiceBase } from \"./defaults/serviceBase.js\";\nimport { defaultUserAgent } from \"./defaults/userAgent.js\";\nimport type { SdkDependencies } from \"./dependencies.js\";\nimport { attemptNotifyDeploy } from \"./domain/attemptDeploy/index.js\";\nimport { generateSignedUrlForRunInputsExecutablesStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.js\";\nimport { generateSignedUrlForTempTeamStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-team-storage.js\";\nimport { pollCiGreenlightStatus } from \"./domain/poll-ci-greenlight.js\";\n\nexport function makeQaWolfSdk(\n {\n apiKey,\n serviceBase = defaultServiceBase,\n userAgent = defaultUserAgent,\n }: {\n apiKey: string;\n serviceBase?: string;\n userAgent?: string;\n },\n {\n fetch = defaultFetch,\n log = defaultLogDriver,\n }: Partial<SdkDependencies> = {},\n) {\n if (typeof fetch !== \"function\") {\n throw Error(\n `QA Wolf CI-SDK requires fetch to be defined. Make sure you are using NodeJS 18+, OR pass a fetch polyfill to the makeQaWolfSdk function.\nWe recommend 'undici' package for that purpose. See the Requirement section of our README for more guidance.`,\n );\n }\n\n const deps: SdkDependencies = {\n // Versions of fetch may have different default timeouts. For consistency, we explicitly set it to 2 minutes here.\n // The increased timeout helps avoid edge cases where we need to search for a commit against multiple\n // code hosting service repositories as a fallback when not finding the repository based on organization/name.\n fetch: buildFetchWithTimeout(fetch, 120000),\n log,\n };\n const apiConfig: ApiConfig = { apiKey, serviceBase, userAgent };\n return {\n attemptNotifyDeploy: attemptNotifyDeploy.bind(null, deps, apiConfig),\n generateSignedUrlForRunInputsExecutablesStorage:\n generateSignedUrlForRunInputsExecutablesStorage.bind(\n null,\n deps,\n apiConfig,\n ),\n generateSignedUrlForTempTeamStorage:\n generateSignedUrlForTempTeamStorage.bind(null, deps, apiConfig),\n pollCiGreenlightStatus: pollCiGreenlightStatus.bind(null, deps, apiConfig),\n };\n}\n\nexport type * from \"./domain/attemptDeploy/index.js\";\nexport type * from \"./domain/generateSignedUrls/types.js\";\nexport type * from \"./domain/poll-ci-greenlight.js\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qawolf/ci-sdk",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A simple SDK for interacting with QAWolf in CI scripts.",
|
|
6
6
|
"keywords": [],
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"tslib": "^2.6.2"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"tsup": "8.3.5"
|
|
39
|
+
"tsup": "^8.3.5"
|
|
40
40
|
},
|
|
41
41
|
"engines": {
|
|
42
42
|
"node": ">=20"
|