@qawolf/ci-sdk 2.1.0 ā 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/index.cjs +30 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -3
- package/dist/index.d.ts +26 -3
- package/dist/index.js +30 -6
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -454,8 +454,10 @@ const sdk = makeQaWolfSdk(
|
|
|
454
454
|
This package follows the [SemVer](https://semver.org/) versioning scheme. Additional notes:
|
|
455
455
|
|
|
456
456
|
- We recommend depending on the `^` range operator for this package, as it will not introduce breaking changes and guarantee an up-to-date API usage version.
|
|
457
|
+
|
|
457
458
|
<!-- There is a limitation in NPM preventing us from using relative links and hosting other MD files when the repository hosting code is not
|
|
458
459
|
public, hence we inline the changelog in the README. See https://github.com/npm/feedback/discussions/666 -->
|
|
460
|
+
|
|
459
461
|
- We will provide a changelog for each release, which will be available in the Changelog section below.
|
|
460
462
|
- This package major version will be bumped when an API breaking change is introduced. This won't
|
|
461
463
|
happen too often, and we will reach out to you and give advance notice when it does.
|
package/dist/index.cjs
CHANGED
|
@@ -41,7 +41,7 @@ var defaultServiceBase = "https://app.qawolf.com/";
|
|
|
41
41
|
|
|
42
42
|
// package.json
|
|
43
43
|
var package_default = {
|
|
44
|
-
version: "2.
|
|
44
|
+
version: "2.2.0"};
|
|
45
45
|
|
|
46
46
|
// src/lib/sdk/defaults/userAgent.ts
|
|
47
47
|
var defaultUserAgent = `ci-sdk/${package_default.version}`;
|
|
@@ -280,7 +280,8 @@ async function attemptNotifyDeploy(deps, apiConfig, config) {
|
|
|
280
280
|
repository: config.repository
|
|
281
281
|
},
|
|
282
282
|
sha: config.sha,
|
|
283
|
-
variables: config.variables
|
|
283
|
+
variables: config.variables,
|
|
284
|
+
workspaceId: config.workspaceId
|
|
284
285
|
}),
|
|
285
286
|
headers: {
|
|
286
287
|
Authorization: `Bearer ${apiConfig.apiKey}`,
|
|
@@ -346,10 +347,28 @@ async function handleErrorResponse(response, log) {
|
|
|
346
347
|
}
|
|
347
348
|
__name(handleErrorResponse, "handleErrorResponse");
|
|
348
349
|
|
|
350
|
+
// src/lib/api/signed-url.ts
|
|
351
|
+
var signedUrlPaths = {
|
|
352
|
+
runInputsExecutables: "/api/v0/run-inputs-executables-signed-urls",
|
|
353
|
+
teamStorage: "/api/v0/team-storage-signed-url"
|
|
354
|
+
};
|
|
355
|
+
function buildSignedUrl({ destinationFilePath, endpoint, serviceBase, workspaceId }) {
|
|
356
|
+
const url = new URL(signedUrlPaths[endpoint], serviceBase);
|
|
357
|
+
if (destinationFilePath !== void 0) url.searchParams.set("file", destinationFilePath);
|
|
358
|
+
if (workspaceId !== void 0) url.searchParams.set("workspaceId", workspaceId);
|
|
359
|
+
return url;
|
|
360
|
+
}
|
|
361
|
+
__name(buildSignedUrl, "buildSignedUrl");
|
|
362
|
+
|
|
349
363
|
// src/lib/api/generate-signed-url-for-run-inputs-executables.ts
|
|
350
|
-
async function callGenerateSignedUrlForRunInputsExecutablesStorage({ apiKey, serviceBase, userAgent }, { destinationFilePath }, { fetch: localFetch, log }) {
|
|
364
|
+
async function callGenerateSignedUrlForRunInputsExecutablesStorage({ apiKey, serviceBase, userAgent }, { destinationFilePath, workspaceId }, { fetch: localFetch, log }) {
|
|
351
365
|
try {
|
|
352
|
-
const response = await localFetch(
|
|
366
|
+
const response = await localFetch(buildSignedUrl({
|
|
367
|
+
destinationFilePath,
|
|
368
|
+
endpoint: "runInputsExecutables",
|
|
369
|
+
serviceBase,
|
|
370
|
+
workspaceId
|
|
371
|
+
}), {
|
|
353
372
|
headers: {
|
|
354
373
|
Authorization: `Bearer ${apiKey}`,
|
|
355
374
|
"Content-Type": "application/json",
|
|
@@ -427,9 +446,14 @@ async function generateSignedUrlForRunInputsExecutablesStorage(deps, apiConfig,
|
|
|
427
446
|
__name(generateSignedUrlForRunInputsExecutablesStorage, "generateSignedUrlForRunInputsExecutablesStorage");
|
|
428
447
|
|
|
429
448
|
// src/lib/api/generate-signed-url-for-team-storage.ts
|
|
430
|
-
async function callGenerateSignedUrlForTempTeamStorage({ apiKey, serviceBase, userAgent }, { destinationFilePath }, { fetch: localFetch, log }) {
|
|
449
|
+
async function callGenerateSignedUrlForTempTeamStorage({ apiKey, serviceBase, userAgent }, { destinationFilePath, workspaceId }, { fetch: localFetch, log }) {
|
|
431
450
|
try {
|
|
432
|
-
const response = await localFetch(
|
|
451
|
+
const response = await localFetch(buildSignedUrl({
|
|
452
|
+
destinationFilePath,
|
|
453
|
+
endpoint: "teamStorage",
|
|
454
|
+
serviceBase,
|
|
455
|
+
workspaceId
|
|
456
|
+
}), {
|
|
433
457
|
headers: {
|
|
434
458
|
Authorization: `Bearer ${apiKey}`,
|
|
435
459
|
"Content-Type": "application/json",
|
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/handleSuccessResponse.ts","../src/lib/sdk/domain/attemptDeploy/mapDeploySuccessResponse.ts","../src/lib/sdk/domain/attemptDeploy/parseDeploySuccessWireResponse.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/sdk/domain/notifyTerminatedEphemeralEnvironment/index.ts","../src/lib/sdk/domain/pollCiGreenlight/buildCompletedRunResult.ts","../src/lib/sdk/domain/pollCiGreenlight/consts.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/pollCiGreenlight/iterator.ts","../src/lib/sdk/domain/pollCiGreenlight/logging.ts","../src/lib/sdk/domain/pollCiGreenlight/mapIteratorAbortToGreenlightStatus.ts","../src/lib/sdk/domain/pollCiGreenlight/index.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","defaultTimeoutMs","args","signal","AbortSignal","timeout","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","handleSuccessResponse","data","environment","results","skippedTriggers","skippedDeployment","isPreviewDeployment","isStatic","logPrefix","alias","id","length","skipMessages","map","trigger","skipDetail","join","environmentId","outcome","runId","failReason","unrecognizedResult","find","result","failedTrigger","failureReason","duplicateSuite","duplicateSuiteId","successfulTrigger","createdSuiteId","mapSuiteResult","created_suite_id","triggerId","trigger_id","failure_reason","duplicate_suite_id","skipReason","skip_reason","unrecognized","mapDeploySuccessResponse","wire","skipped_deployment","reason","skipped_triggers","environment_id","isRecord","value","Array","isArray","isWireSuiteResult","isEnvironment","isSkippedDeployment","isSkippedTrigger","isDeploySuccessWireResponse","every","parseDeploySuccessWireResponse","attemptNotifyDeploy","deps","apiConfig","config","localFetch","bodyText","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","abortReason","httpStatus","rawBody","parse","abortInvalidResponseBody","detail","callGenerateSignedUrlForRunInputsExecutablesStorage","destinationFilePath","encodeURIComponent","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","notifyTerminatedEphemeralEnvironment","buildCompletedRunResult","greenlight","greenlightStatus","pollCiGreenlightDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","fetchCiGreenlightStatus","resp","canRetry","errorType","makePollCiGreenlightStatusIterator","pollConfig","retries","previousStatus","startedAt","Date","now","elapsedMs","isAborted","Error","retryLabel","stageChanged","runStage","isFailedTerminalStage","buildSuccessLogMessage","nonBlockingBugsCount","relevantRunUrl","urlInfo","buildFailedLogMessage","blockingBugsCount","relevantRunWithBugsUrl","reproducedBugs","blockingBugUrls","filter","bug","isBlocking","applicationUrl","nonBlockingBugUrls","blockingBugList","url","nonBlockingBugList","bugsListInText","buildSupersededAbortLogMessage","rootRunUrl","supersedingDetails","buildSupersededContinueLogMessage","buildRunStageLogMessage","mapIteratorAbortToGreenlightStatus","iteration","pollCiGreenlightStatus","onRunStageChanged","iterator","lastPoll","e","relevantRunId","rootRunId","isSuperseded","shouldAbortOnSuperseded","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, defaultTimeoutMs: number) =>\n async (...args: Parameters<FetchDriver>) => {\n // Allow signal to be overridden by the caller\n const signal = args[1]?.signal ?? AbortSignal.timeout(defaultTimeoutMs);\n\n return fetch(args[0], { ...args[1], signal });\n };\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\": \"2.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:ci\": \"npm run lint:non-fixable; NON_FIXABLE_EXIT=$?; npm run lint:fixable && exit $NON_FIXABLE_EXIT\",\n \"lint:dev\": \"npm run lint:fixable\",\n \"lint:fixable\": \"eslint . --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:non-fixable\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*'\",\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.1.2\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\"\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 { LogDriver } from \"../../dependencies.js\";\n\nimport type { DeployStatus, NotifyDeployStatus } from \"./types.js\";\n\nexport async function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const skippedTriggers = data.skippedTriggers ?? [];\n const skippedDeployment = data.skippedDeployment;\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 suites were created for this deployment.\n if (results.length === 0) {\n const skipMessages = [\n ...skippedTriggers.map((trigger) => trigger.message),\n ...(skippedDeployment ? [skippedDeployment.message] : []),\n ];\n const skipDetail =\n skipMessages.length > 0 ? ` ${skipMessages.join(\" \")}` : \"\";\n\n // Preview deployments legitimately often produce no run; keep the success\n // outcome but surface any skip reason so it is not silently dropped.\n if (isPreviewDeployment) {\n log.info(\n `ā
Deployment notification was successful. No run was created for this deployment.${skipDetail}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n\n // A trigger matched but could not run (e.g. environment still syncing).\n // Distinct from \"no trigger matched\": the generic text would mislabel it,\n // and the skip reason is what tells the caller whether to retry.\n if (skippedTriggers.length > 0) {\n log.error(`š« No run was created for this deployment.${skipDetail}`);\n return {\n failReason: \"trigger-skipped\",\n outcome: \"failed\",\n skippedTriggers,\n };\n }\n\n log.warn(\n skippedDeployment\n ? `ā ļø No run was created for this deployment.${skipDetail}`\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 {\n outcome: \"skipped\",\n skippedDeployment,\n };\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 // A result arm this SDK version does not recognize (newer backend). We cannot\n // classify the outcome, so surface it as a failure rather than guessing.\n const unrecognizedResult = results.find((result) => \"unrecognized\" in result);\n if (unrecognizedResult) {\n log.error(\n `š« The deployment response contained an unrecognized result. Please upgrade @qawolf/ci-sdk.`,\n );\n return { failReason: \"unknown-result\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((result) => \"failureReason\" in result);\n if (failedTrigger) {\n log.error(\n `š« Run could not be created. Reason: \"${failedTrigger.failureReason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((result) => \"duplicateSuiteId\" in result);\n if (duplicateSuite) {\n log.info(\n `ā
Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicateSuiteId} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicateSuiteId,\n };\n }\n\n const successfulTrigger = results.find(\n (result) => \"createdSuiteId\" in result,\n );\n if (!successfulTrigger) {\n // results is non-empty here, so triggers did match ā this is not the\n // deterministic no-trigger-match skip. Reaching this point means the\n // response carried results we could not turn into a run, so it is an\n // unexpected failure rather than a skip.\n log.error(`š« Run could not be created. Please contact support.`);\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n log.info(\n `ā
Deployment notification was successful. Run created with ID: ${successfulTrigger.createdSuiteId}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.createdSuiteId,\n };\n}\n","import type { DeploySuccessWireResponse } from \"./deploySuccessWireResponse.js\";\nimport type { DeployStatus, DeploySuccessSuiteResult } from \"./types.js\";\n\nfunction mapSuiteResult(\n result: DeploySuccessWireResponse[\"results\"][number],\n): DeploySuccessSuiteResult {\n if (\"created_suite_id\" in result) {\n return {\n createdSuiteId: result.created_suite_id,\n triggerId: result.trigger_id,\n };\n }\n if (\"failure_reason\" in result) {\n return {\n failureReason: result.failure_reason,\n triggerId: result.trigger_id,\n };\n }\n if (\"duplicate_suite_id\" in result) {\n return {\n duplicateSuiteId: result.duplicate_suite_id,\n skipReason: result.skip_reason,\n triggerId: result.trigger_id,\n };\n }\n // A result arm added by a newer backend: surface it explicitly rather than\n // forcing it into one of the known shapes.\n return { triggerId: result.trigger_id, unrecognized: true };\n}\n\n// The deploy_success success body is the SDK's only snake_case wire shape; this\n// is the single place that renames it to the camelCase `DeployStatus` used\n// everywhere downstream.\nexport function mapDeploySuccessResponse(\n wire: DeploySuccessWireResponse,\n): DeployStatus {\n return {\n environment: wire.environment,\n results: wire.results.map(mapSuiteResult),\n skippedDeployment: wire.skipped_deployment && {\n message: wire.skipped_deployment.message,\n reason: wire.skipped_deployment.reason,\n },\n skippedTriggers: wire.skipped_triggers?.map((trigger) => ({\n environmentId: trigger.environment_id,\n message: trigger.message,\n reason: trigger.reason,\n triggerId: trigger.trigger_id,\n })),\n };\n}\n","import type { DeploySuccessWireResponse } from \"./deploySuccessWireResponse.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n // Arrays are objects too; a deploy_success body or any of its parts must be a\n // plain object, never an array. (JSON cannot produce other non-plain objects\n // such as Date or Map, so excluding arrays is sufficient here.)\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isWireSuiteResult(value: unknown): boolean {\n if (!isRecord(value)) return false;\n if (typeof value.trigger_id !== \"string\") return false;\n if (\"created_suite_id\" in value)\n return typeof value.created_suite_id === \"string\";\n\n if (\"failure_reason\" in value)\n return typeof value.failure_reason === \"string\";\n\n if (\"duplicate_suite_id\" in value) {\n return (\n typeof value.duplicate_suite_id === \"string\" &&\n typeof value.skip_reason === \"string\"\n );\n }\n // A structurally-valid result (object with a string trigger_id) carrying no\n // known discriminator is a result arm added by a newer backend. Accept it so\n // an older SDK does not reject the whole response; mapSuiteResult maps it to\n // an explicit unrecognized outcome.\n return true;\n}\n\nfunction isEnvironment(value: unknown): boolean {\n if (!isRecord(value)) return false;\n if (typeof value.id !== \"string\") return false;\n if (typeof value.isStatic !== \"boolean\") return false;\n if (value.alias !== undefined && typeof value.alias !== \"string\")\n return false;\n return true;\n}\n\nfunction isSkippedDeployment(value: unknown): boolean {\n if (!isRecord(value)) return false;\n return typeof value.message === \"string\" && typeof value.reason === \"string\";\n}\n\nfunction isSkippedTrigger(value: unknown): boolean {\n if (!isRecord(value)) return false;\n return (\n typeof value.environment_id === \"string\" &&\n typeof value.message === \"string\" &&\n typeof value.reason === \"string\" &&\n typeof value.trigger_id === \"string\"\n );\n}\n\nfunction isDeploySuccessWireResponse(\n value: unknown,\n): value is DeploySuccessWireResponse {\n if (!isRecord(value)) return false;\n if (value.environment !== undefined && !isEnvironment(value.environment))\n return false;\n\n if (!Array.isArray(value.results) || !value.results.every(isWireSuiteResult))\n return false;\n\n if (\n value.skipped_deployment !== undefined &&\n !isSkippedDeployment(value.skipped_deployment)\n )\n return false;\n\n if (\n value.skipped_triggers !== undefined &&\n (!Array.isArray(value.skipped_triggers) ||\n !value.skipped_triggers.every(isSkippedTrigger))\n )\n return false;\n\n return true;\n}\n\n// Validate the deploy_success success body at runtime instead of trusting a\n// cast. `environment` is required to be present-or-explicitly-undefined; the\n// two skip fields are optional (older servers omit them).\nexport function parseDeploySuccessWireResponse(\n value: unknown,\n): DeploySuccessWireResponse | \"invalid\" {\n return isDeploySuccessWireResponse(value) ? value : \"invalid\";\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport { handleSuccessResponse } from \"./handleSuccessResponse.js\";\nimport { mapDeploySuccessResponse } from \"./mapDeploySuccessResponse.js\";\nimport { parseDeploySuccessWireResponse } from \"./parseDeploySuccessWireResponse.js\";\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\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\n let response: Response;\n let bodyText: string;\n try {\n 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 // Override default timeout to 5 minutes. This gives extra room\n // for both (1) waiting for reconciliation (2) creating the run.\n signal: AbortSignal.timeout(5 * 60 * 1000),\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n\n // Reading the body stream is still a network operation; a failure here is\n // a network error, not a bad payload.\n bodyText = await response.text();\n } catch {\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 let rawBody: unknown;\n try {\n rawBody = JSON.parse(bodyText);\n } catch {\n return abortInvalidResponseBody(log, \"the response body was not JSON\");\n }\n\n const wire = parseDeploySuccessWireResponse(rawBody);\n if (wire === \"invalid\") {\n return abortInvalidResponseBody(\n log,\n \"the response body did not match the expected shape\",\n );\n }\n\n const data = mapDeploySuccessResponse(wire);\n return handleSuccessResponse(data, log);\n}\n\nfunction abortInvalidResponseBody(\n log: LogDriver,\n detail: string,\n): NotifyDeployStatus {\n log.error(`š« Invalid response from deploy_success (${detail}), aborting.`);\n return {\n abortReason: \"invalid-response-body\",\n httpStatus: undefined,\n outcome: \"aborted\",\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","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 {\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 {\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 { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n NotifyTerminatedEphemeralEnvironmentAbortReason,\n NotifyTerminatedEphemeralEnvironmentInput,\n NotifyTerminatedEphemeralEnvironmentResult,\n TerminatedEphemeralEnvironmentSuccessResult,\n} from \"./types.js\";\n\nexport const notifyTerminatedEphemeralEnvironment = async (\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: NotifyTerminatedEphemeralEnvironmentInput,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> => {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/environment_terminated\", apiConfig.serviceBase),\n {\n body: JSON.stringify(config),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n if (!response.ok) return handleErrorResponse(response, log);\n const { environmentId } =\n (await response.json()) as TerminatedEphemeralEnvironmentSuccessResult;\n return { environmentId, outcome: \"success\" };\n } catch {\n log.error(`š« Network error from terminate_preview_environment, aborting.`);\n return {\n abortReason: \"network-error\",\n outcome: \"aborted\",\n };\n }\n};\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> {\n const status = response.status;\n let abortReason: NotifyTerminatedEphemeralEnvironmentAbortReason;\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 === 409) abortReason = \"409-conflict\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"notifyTerminatedEphemeralEnvironment\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\n\nimport type { PollCiGreenlightStatus } from \"./types.js\";\n\n/**\n * Build the result for a completed run\n */\nexport function buildCompletedRunResult(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): PollCiGreenlightStatus {\n if (status.greenlight)\n return { greenlightStatus: status, outcome: \"success\" };\n else return { greenlightStatus: status, outcome: \"failed\" };\n}\n","import type { PollCiGreenlightPollConfig } from \"./types.js\";\n\n/**\n * Safe default values for polling configuration.\n * If you change these values, make sure you update the JSDoc\n * comments in the PollCiGreenlightPollConfig type.\n */\nexport const pollCiGreenlightDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000, // 2 hours\n retryInterval: 10 * 1000, // 10 seconds\n runInProgressInterval: 30 * 1000, // 30 seconds\n runUnderReviewInterval: 60 * 1000, // 60 seconds\n};\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport type { CiGreenlightBugData } from \"./ci-greenlight-bug-data.js\";\nimport { logFetchError } from \"./log.js\";\n\nexport type {\n CiGreenlightBugData,\n CiGreenlightBugDetails,\n} from \"./ci-greenlight-bug-data.js\";\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n};\n\nexport type CiGreenlightStatusExtended = {\n relevantRunWithBugsUrl: 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 CiGreenlightStatusExtended)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData &\n CiGreenlightStatusExtended)\n | ({\n greenlight: false;\n runStage: \"initializing\";\n } & Partial<CiGreenlightStatusExtended>)\n | ({\n greenlight: false;\n /**\n * Human-readable copy explaining why the run was canceled, when the\n * server provides it.\n */\n message?: string;\n /**\n * Stable, machine-readable code for why the run was canceled, when the\n * server provides it. Treat as an open set of values.\n */\n reason?: string;\n runStage: \"canceled\";\n } & Partial<CiGreenlightStatusExtended>)\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 {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { fetchCiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { sleep } from \"../../../other.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport type {\n MakePollCiGreenlightStatusIteratorParams,\n PollCiGreenlightIteration,\n} from \"./types.js\";\n\n/**\n * Creates an async generator that yields CI greenlight status updates or abort notifications.\n *\n * This low-level API gives you full control over the polling loop, allowing you to:\n * - Inspect status after each fetch\n * - Break out of the loop based on custom criteria\n * - Add custom logging or side effects\n * - Handle abort conditions without exceptions\n *\n * The iterator yields a discriminated union with `isAborted` property:\n * - `isAborted: false` - Normal status update with run information\n * - `isAborted: true` - Terminal condition (timeout, error, canceled, etc.)\n *\n * Note: This function does not throw errors. All error conditions are yielded as\n * abort results that you must check and handle.\n *\n * @example\n * ```typescript\n * const greenlightIterator = makePollCiGreenlightStatusIterator({ runId: \"my-run-id\" });\n *\n * for await (const lastPoll of greenlightIterator) {\n * // Check for abort conditions first\n * if (lastPoll.isAborted) {\n * console.error(`Aborted: ${lastPoll.abortReason}`);\n * process.exit(1);\n * }\n *\n * // Handle normal status updates\n * const { status } = lastPoll;\n * console.log(`Current stage: ${status.runStage}`);\n *\n * // Exit with error if run reached a terminal stage without greenlight\n * if (lastPoll.isFailedTerminalStage) {\n * process.exit(1);\n * }\n * }\n * ```\n *\n */\nexport async function* makePollCiGreenlightStatusIterator(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n { runId, ...pollConfig }: MakePollCiGreenlightStatusIteratorParams,\n): AsyncGenerator<PollCiGreenlightIteration, void, unknown> {\n const { log } = deps;\n\n const {\n maxRetries = pollCiGreenlightDefaults.maxRetries,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n retryInterval = pollCiGreenlightDefaults.retryInterval,\n runInProgressInterval = pollCiGreenlightDefaults.runInProgressInterval,\n runUnderReviewInterval = pollCiGreenlightDefaults.runUnderReviewInterval,\n } = pollConfig;\n\n let retries = 0;\n let previousStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= pollTimeout) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n { runId },\n deps,\n );\n\n const elapsedMs = Date.now() - startedAt;\n\n if (!responseState.ok && !responseState.canRetry) {\n yield {\n abortReason: \"4XX-client-error\",\n elapsedMs,\n httpStatus: responseState.httpStatus,\n isAborted: true,\n };\n return;\n }\n\n if (!responseState.ok) {\n retries += 1;\n const { errorType, httpStatus } = responseState;\n if (retries > maxRetries) {\n switch (errorType) {\n case \"network\":\n yield {\n abortReason: \"network-error\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n break;\n case \"not-found\":\n yield {\n abortReason: \"404-run-not-found\",\n elapsedMs,\n httpStatus: httpStatus ?? 404,\n isAborted: true,\n };\n break;\n case \"server\":\n yield {\n abortReason: \"5XX-server-error\",\n elapsedMs,\n httpStatus: httpStatus ?? 500,\n isAborted: true,\n };\n break;\n default:\n throw Error(`Unexpected error type: ${errorType satisfies never}`);\n }\n return;\n }\n\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n\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\n // Success - reset retry counter\n retries = 0;\n const { greenlightStatus } = responseState;\n const stageChanged =\n !previousStatus || previousStatus.runStage !== greenlightStatus.runStage;\n\n // Determine if this is a failed terminal stage\n const isFailedTerminalStage =\n greenlightStatus.runStage === \"canceled\" ||\n (greenlightStatus.runStage === \"completed\" &&\n greenlightStatus.greenlight === false);\n\n yield {\n elapsedMs,\n isAborted: false,\n isFailedTerminalStage,\n previousStatus,\n stageChanged,\n status: greenlightStatus,\n };\n\n // Update previous status for next iteration\n previousStatus = greenlightStatus;\n\n switch (greenlightStatus.runStage) {\n case \"canceled\": {\n yield {\n abortReason: \"run-canceled\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n }\n case \"completed\":\n return;\n case \"initializing\":\n await sleep(runInProgressInterval);\n break;\n case \"underReview\":\n await sleep(runUnderReviewInterval);\n break;\n default:\n throw Error(\n `Unexpected run stage: ${greenlightStatus satisfies never}`,\n );\n }\n }\n\n // Timeout\n yield {\n abortReason: \"poll-timed-out\",\n elapsedMs: Date.now() - startedAt,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { pluralize } from \"../../../other.js\";\n\n/**\n * Build log message for successful completed run\n */\nexport function buildSuccessLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const { nonBlockingBugsCount, relevantRunUrl } = status;\n const urlInfo = `See ${relevantRunUrl}`;\n\n return `ā
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\n/**\n * Build log message for failed completed run\n */\nexport function buildFailedLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const {\n blockingBugsCount,\n nonBlockingBugsCount,\n relevantRunWithBugsUrl,\n reproducedBugs,\n } = status;\n\n const blockingBugUrls = reproducedBugs\n .filter((bug) => bug.isBlocking)\n .map((bug) => bug.applicationUrl);\n const nonBlockingBugUrls = reproducedBugs\n .filter((bug) => !bug.isBlocking)\n .map((bug) => bug.applicationUrl);\n\n const blockingBugList = blockingBugUrls.map((url) => `\\n⢠${url}`).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\n return (\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}\n\n/**\n * Build log message for superseded run (aborting)\n */\nexport function buildSupersededAbortLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `ā Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`;\n}\n\n/**\n * Build log message for superseded run (continuing)\n */\nexport function buildSupersededContinueLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `Root run was superseded:${supersedingDetails}`;\n}\n\n/**\n * Build log messages for different run stages\n */\nexport function buildRunStageLogMessage(\n runStage: CiGreenlightStatus[\"runStage\"],\n relevantRunUrl: string,\n): string {\n const urlInfo = `See ${relevantRunUrl}`;\n\n switch (runStage) {\n case \"canceled\":\n return `š« Run was canceled. Aborting... Please contact support.\\n${urlInfo}`;\n case \"initializing\":\n return `ā³ Run is in progress... ${urlInfo}`;\n case \"underReview\":\n return `šµļø Run is under review... ${urlInfo}`;\n case \"completed\":\n // Completed is handled separately by buildSuccessLogMessage/buildFailedLogMessage\n throw Error(\n \"buildRunStageLogMessage should not be called for completed stage\",\n );\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n}\n","import type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n PollCiGreenlightIteratorHttpAborted,\n PollCiGreenlightIteratorNonHttpAborted,\n PollCiGreenlightStatus,\n} from \"./types.js\";\n\n/**\n * Handles aborted iterations from the CI greenlight poll iterator\n * and converts them to appropriate result objects with logging\n */\nexport function mapIteratorAbortToGreenlightStatus(\n iteration:\n | PollCiGreenlightIteratorHttpAborted\n | PollCiGreenlightIteratorNonHttpAborted,\n pollTimeout: number,\n deps: SdkDependencies,\n): PollCiGreenlightStatus {\n const { log } = deps;\n const { abortReason, httpStatus } = iteration;\n\n switch (abortReason) {\n case \"4XX-client-error\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"5XX-server-error\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"404-run-not-found\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"network-error\":\n log.error(`š« Unrecoverable network error from CI greenlight, aborting.`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"poll-timed-out\":\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"run-canceled\":\n log.info(`Run was canceled`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"XXX-other-http-code\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n default:\n throw Error(`Unexpected abort reason: ${abortReason satisfies never}`);\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { buildCompletedRunResult } from \"./buildCompletedRunResult.js\";\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./iterator.js\";\nimport {\n buildFailedLogMessage,\n buildRunStageLogMessage,\n buildSuccessLogMessage,\n buildSupersededAbortLogMessage,\n buildSupersededContinueLogMessage,\n} from \"./logging.js\";\nimport { mapIteratorAbortToGreenlightStatus } from \"./mapIteratorAbortToGreenlightStatus.js\";\nimport type {\n PollCiGreenlightParams,\n PollCiGreenlightStatus,\n} from \"./types.js\";\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 const { log } = deps;\n const {\n abortOnSuperseded = pollCiGreenlightDefaults.abortOnSuperseded,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n } = pollConfig;\n\n const iterator = makePollCiGreenlightStatusIterator(deps, apiConfig, {\n runId,\n ...pollConfig,\n });\n\n for await (const lastPoll of iterator) {\n if (lastPoll.isAborted)\n return mapIteratorAbortToGreenlightStatus(lastPoll, pollTimeout, deps);\n\n // Handle status iterations\n const { previousStatus, stageChanged, status } = lastPoll;\n\n // Call onRunStageChanged callback when stage changes\n if (stageChanged) {\n try {\n await onRunStageChanged(status, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n\n const { relevantRunId, relevantRunUrl, rootRunId, rootRunUrl, runStage } =\n status;\n\n // Superseded run handling\n const isSuperseded = rootRunId !== relevantRunId;\n const shouldAbortOnSuperseded = isSuperseded && abortOnSuperseded;\n if (shouldAbortOnSuperseded) {\n const message = buildSupersededAbortLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.warn(message);\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (isSuperseded) {\n const message = buildSupersededContinueLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.info(message);\n }\n\n switch (runStage) {\n case \"canceled\":\n case \"initializing\":\n case \"underReview\": {\n log.info(buildRunStageLogMessage(runStage, relevantRunUrl));\n break;\n }\n case \"completed\": {\n const result = buildCompletedRunResult(status);\n switch (result.outcome) {\n case \"aborted\": {\n break;\n }\n case \"failed\": {\n const message = buildFailedLogMessage(status);\n log.warn(message);\n break;\n }\n case \"success\": {\n const message = buildSuccessLogMessage(status);\n log.info(message);\n break;\n }\n default:\n throw Error(`Unexpected outcome: ${result satisfies never}`);\n }\n return result;\n }\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n }\n\n // This should never be reached as the iterator handles timeout\n throw Error(\"Iterator ended unexpectedly\");\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 { notifyTerminatedEphemeralEnvironment } from \"./domain/notifyTerminatedEphemeralEnvironment/index.js\";\nimport { pollCiGreenlightStatus } from \"./domain/pollCiGreenlight/index.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./domain/pollCiGreenlight/iterator.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 makePollCiGreenlightStatusIterator: makePollCiGreenlightStatusIterator.bind(\n null,\n deps,\n apiConfig,\n ),\n notifyTerminatedEphemeralEnvironment:\n notifyTerminatedEphemeralEnvironment.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/notifyTerminatedEphemeralEnvironment/types.js\";\nexport type * from \"./domain/pollCiGreenlight/types.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/handleSuccessResponse.ts","../src/lib/sdk/domain/attemptDeploy/mapDeploySuccessResponse.ts","../src/lib/sdk/domain/attemptDeploy/parseDeploySuccessWireResponse.ts","../src/lib/sdk/domain/attemptDeploy/index.ts","../src/lib/api/signed-url.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/sdk/domain/notifyTerminatedEphemeralEnvironment/index.ts","../src/lib/sdk/domain/pollCiGreenlight/buildCompletedRunResult.ts","../src/lib/sdk/domain/pollCiGreenlight/consts.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/pollCiGreenlight/iterator.ts","../src/lib/sdk/domain/pollCiGreenlight/logging.ts","../src/lib/sdk/domain/pollCiGreenlight/mapIteratorAbortToGreenlightStatus.ts","../src/lib/sdk/domain/pollCiGreenlight/index.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","defaultTimeoutMs","args","signal","AbortSignal","timeout","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","handleSuccessResponse","data","environment","results","skippedTriggers","skippedDeployment","isPreviewDeployment","isStatic","logPrefix","alias","id","length","skipMessages","map","trigger","skipDetail","join","environmentId","outcome","runId","failReason","unrecognizedResult","find","result","failedTrigger","failureReason","duplicateSuite","duplicateSuiteId","successfulTrigger","createdSuiteId","mapSuiteResult","created_suite_id","triggerId","trigger_id","failure_reason","duplicate_suite_id","skipReason","skip_reason","unrecognized","mapDeploySuccessResponse","wire","skipped_deployment","reason","skipped_triggers","environment_id","isRecord","value","Array","isArray","isWireSuiteResult","isEnvironment","isSkippedDeployment","isSkippedTrigger","isDeploySuccessWireResponse","every","parseDeploySuccessWireResponse","attemptNotifyDeploy","deps","apiConfig","config","localFetch","bodyText","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","workspaceId","headers","Authorization","apiKey","userAgent","method","handleErrorResponse","abortReason","httpStatus","rawBody","parse","abortInvalidResponseBody","detail","signedUrlPaths","runInputsExecutables","teamStorage","buildSignedUrl","destinationFilePath","endpoint","url","searchParams","set","callGenerateSignedUrlForRunInputsExecutablesStorage","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","notifyTerminatedEphemeralEnvironment","buildCompletedRunResult","greenlight","greenlightStatus","pollCiGreenlightDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","fetchCiGreenlightStatus","resp","encodeURIComponent","canRetry","errorType","makePollCiGreenlightStatusIterator","pollConfig","retries","previousStatus","startedAt","Date","now","elapsedMs","isAborted","Error","retryLabel","stageChanged","runStage","isFailedTerminalStage","buildSuccessLogMessage","nonBlockingBugsCount","relevantRunUrl","urlInfo","buildFailedLogMessage","blockingBugsCount","relevantRunWithBugsUrl","reproducedBugs","blockingBugUrls","filter","bug","isBlocking","applicationUrl","nonBlockingBugUrls","blockingBugList","nonBlockingBugList","bugsListInText","buildSupersededAbortLogMessage","rootRunUrl","supersedingDetails","buildSupersededContinueLogMessage","buildRunStageLogMessage","mapIteratorAbortToGreenlightStatus","iteration","pollCiGreenlightStatus","onRunStageChanged","iterator","lastPoll","e","relevantRunId","rootRunId","isSuperseded","shouldAbortOnSuperseded","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, defaultTimeoutMs: number) =>\n async (...args: Parameters<FetchDriver>) => {\n // Allow signal to be overridden by the caller\n const signal = args[1]?.signal ?? AbortSignal.timeout(defaultTimeoutMs);\n\n return fetch(args[0], { ...args[1], signal });\n };\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\": \"2.2.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 \"files\": [\n \"/dist\",\n \"/README.md\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\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 \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022\",\n \"lint:ci\": \"npm run lint:non-fixable; NON_FIXABLE_EXIT=$?; npm run lint:fixable && exit $NON_FIXABLE_EXIT\",\n \"lint:dev\": \"npm run lint:fixable\",\n \"lint:fixable\": \"eslint . --fix --quiet && oxfmt --write .\",\n \"lint:non-fixable\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*'\",\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.1.2\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\"\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 { LogDriver } from \"../../dependencies.js\";\n\nimport type { DeployStatus, NotifyDeployStatus } from \"./types.js\";\n\nexport async function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const skippedTriggers = data.skippedTriggers ?? [];\n const skippedDeployment = data.skippedDeployment;\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 suites were created for this deployment.\n if (results.length === 0) {\n const skipMessages = [\n ...skippedTriggers.map((trigger) => trigger.message),\n ...(skippedDeployment ? [skippedDeployment.message] : []),\n ];\n const skipDetail =\n skipMessages.length > 0 ? ` ${skipMessages.join(\" \")}` : \"\";\n\n // Preview deployments legitimately often produce no run; keep the success\n // outcome but surface any skip reason so it is not silently dropped.\n if (isPreviewDeployment) {\n log.info(\n `ā
Deployment notification was successful. No run was created for this deployment.${skipDetail}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n\n // A trigger matched but could not run (e.g. environment still syncing).\n // Distinct from \"no trigger matched\": the generic text would mislabel it,\n // and the skip reason is what tells the caller whether to retry.\n if (skippedTriggers.length > 0) {\n log.error(`š« No run was created for this deployment.${skipDetail}`);\n return {\n failReason: \"trigger-skipped\",\n outcome: \"failed\",\n skippedTriggers,\n };\n }\n\n log.warn(\n skippedDeployment\n ? `ā ļø No run was created for this deployment.${skipDetail}`\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 {\n outcome: \"skipped\",\n skippedDeployment,\n };\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 // A result arm this SDK version does not recognize (newer backend). We cannot\n // classify the outcome, so surface it as a failure rather than guessing.\n const unrecognizedResult = results.find((result) => \"unrecognized\" in result);\n if (unrecognizedResult) {\n log.error(\n `š« The deployment response contained an unrecognized result. Please upgrade @qawolf/ci-sdk.`,\n );\n return { failReason: \"unknown-result\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((result) => \"failureReason\" in result);\n if (failedTrigger) {\n log.error(\n `š« Run could not be created. Reason: \"${failedTrigger.failureReason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((result) => \"duplicateSuiteId\" in result);\n if (duplicateSuite) {\n log.info(\n `ā
Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicateSuiteId} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicateSuiteId,\n };\n }\n\n const successfulTrigger = results.find(\n (result) => \"createdSuiteId\" in result,\n );\n if (!successfulTrigger) {\n // results is non-empty here, so triggers did match ā this is not the\n // deterministic no-trigger-match skip. Reaching this point means the\n // response carried results we could not turn into a run, so it is an\n // unexpected failure rather than a skip.\n log.error(`š« Run could not be created. Please contact support.`);\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n log.info(\n `ā
Deployment notification was successful. Run created with ID: ${successfulTrigger.createdSuiteId}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.createdSuiteId,\n };\n}\n","import type { DeploySuccessWireResponse } from \"./deploySuccessWireResponse.js\";\nimport type { DeployStatus, DeploySuccessSuiteResult } from \"./types.js\";\n\nfunction mapSuiteResult(\n result: DeploySuccessWireResponse[\"results\"][number],\n): DeploySuccessSuiteResult {\n if (\"created_suite_id\" in result) {\n return {\n createdSuiteId: result.created_suite_id,\n triggerId: result.trigger_id,\n };\n }\n if (\"failure_reason\" in result) {\n return {\n failureReason: result.failure_reason,\n triggerId: result.trigger_id,\n };\n }\n if (\"duplicate_suite_id\" in result) {\n return {\n duplicateSuiteId: result.duplicate_suite_id,\n skipReason: result.skip_reason,\n triggerId: result.trigger_id,\n };\n }\n // A result arm added by a newer backend: surface it explicitly rather than\n // forcing it into one of the known shapes.\n return { triggerId: result.trigger_id, unrecognized: true };\n}\n\n// The deploy_success success body is the SDK's only snake_case wire shape; this\n// is the single place that renames it to the camelCase `DeployStatus` used\n// everywhere downstream.\nexport function mapDeploySuccessResponse(\n wire: DeploySuccessWireResponse,\n): DeployStatus {\n return {\n environment: wire.environment,\n results: wire.results.map(mapSuiteResult),\n skippedDeployment: wire.skipped_deployment && {\n message: wire.skipped_deployment.message,\n reason: wire.skipped_deployment.reason,\n },\n skippedTriggers: wire.skipped_triggers?.map((trigger) => ({\n environmentId: trigger.environment_id,\n message: trigger.message,\n reason: trigger.reason,\n triggerId: trigger.trigger_id,\n })),\n };\n}\n","import type { DeploySuccessWireResponse } from \"./deploySuccessWireResponse.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n // Arrays are objects too; a deploy_success body or any of its parts must be a\n // plain object, never an array. (JSON cannot produce other non-plain objects\n // such as Date or Map, so excluding arrays is sufficient here.)\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isWireSuiteResult(value: unknown): boolean {\n if (!isRecord(value)) return false;\n if (typeof value.trigger_id !== \"string\") return false;\n if (\"created_suite_id\" in value)\n return typeof value.created_suite_id === \"string\";\n\n if (\"failure_reason\" in value)\n return typeof value.failure_reason === \"string\";\n\n if (\"duplicate_suite_id\" in value) {\n return (\n typeof value.duplicate_suite_id === \"string\" &&\n typeof value.skip_reason === \"string\"\n );\n }\n // A structurally-valid result (object with a string trigger_id) carrying no\n // known discriminator is a result arm added by a newer backend. Accept it so\n // an older SDK does not reject the whole response; mapSuiteResult maps it to\n // an explicit unrecognized outcome.\n return true;\n}\n\nfunction isEnvironment(value: unknown): boolean {\n if (!isRecord(value)) return false;\n if (typeof value.id !== \"string\") return false;\n if (typeof value.isStatic !== \"boolean\") return false;\n if (value.alias !== undefined && typeof value.alias !== \"string\")\n return false;\n return true;\n}\n\nfunction isSkippedDeployment(value: unknown): boolean {\n if (!isRecord(value)) return false;\n return typeof value.message === \"string\" && typeof value.reason === \"string\";\n}\n\nfunction isSkippedTrigger(value: unknown): boolean {\n if (!isRecord(value)) return false;\n return (\n typeof value.environment_id === \"string\" &&\n typeof value.message === \"string\" &&\n typeof value.reason === \"string\" &&\n typeof value.trigger_id === \"string\"\n );\n}\n\nfunction isDeploySuccessWireResponse(\n value: unknown,\n): value is DeploySuccessWireResponse {\n if (!isRecord(value)) return false;\n if (value.environment !== undefined && !isEnvironment(value.environment))\n return false;\n\n if (!Array.isArray(value.results) || !value.results.every(isWireSuiteResult))\n return false;\n\n if (\n value.skipped_deployment !== undefined &&\n !isSkippedDeployment(value.skipped_deployment)\n )\n return false;\n\n if (\n value.skipped_triggers !== undefined &&\n (!Array.isArray(value.skipped_triggers) ||\n !value.skipped_triggers.every(isSkippedTrigger))\n )\n return false;\n\n return true;\n}\n\n// Validate the deploy_success success body at runtime instead of trusting a\n// cast. `environment` is required to be present-or-explicitly-undefined; the\n// two skip fields are optional (older servers omit them).\nexport function parseDeploySuccessWireResponse(\n value: unknown,\n): DeploySuccessWireResponse | \"invalid\" {\n return isDeploySuccessWireResponse(value) ? value : \"invalid\";\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport { handleSuccessResponse } from \"./handleSuccessResponse.js\";\nimport { mapDeploySuccessResponse } from \"./mapDeploySuccessResponse.js\";\nimport { parseDeploySuccessWireResponse } from \"./parseDeploySuccessWireResponse.js\";\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\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\n let response: Response;\n let bodyText: string;\n try {\n 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 workspaceId: config.workspaceId,\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n // Override default timeout to 5 minutes. This gives extra room\n // for both (1) waiting for reconciliation (2) creating the run.\n signal: AbortSignal.timeout(5 * 60 * 1000),\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n\n // Reading the body stream is still a network operation; a failure here is\n // a network error, not a bad payload.\n bodyText = await response.text();\n } catch {\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 let rawBody: unknown;\n try {\n rawBody = JSON.parse(bodyText);\n } catch {\n return abortInvalidResponseBody(log, \"the response body was not JSON\");\n }\n\n const wire = parseDeploySuccessWireResponse(rawBody);\n if (wire === \"invalid\") {\n return abortInvalidResponseBody(\n log,\n \"the response body did not match the expected shape\",\n );\n }\n\n const data = mapDeploySuccessResponse(wire);\n return handleSuccessResponse(data, log);\n}\n\nfunction abortInvalidResponseBody(\n log: LogDriver,\n detail: string,\n): NotifyDeployStatus {\n log.error(`š« Invalid response from deploy_success (${detail}), aborting.`);\n return {\n abortReason: \"invalid-response-body\",\n httpStatus: undefined,\n outcome: \"aborted\",\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","const signedUrlPaths = {\n runInputsExecutables: \"/api/v0/run-inputs-executables-signed-urls\",\n teamStorage: \"/api/v0/team-storage-signed-url\",\n} as const;\n\nexport function buildSignedUrl({\n destinationFilePath,\n endpoint,\n serviceBase,\n workspaceId,\n}: {\n destinationFilePath: string | undefined;\n endpoint: keyof typeof signedUrlPaths;\n serviceBase: string;\n workspaceId: string | undefined;\n}): URL {\n const url = new URL(signedUrlPaths[endpoint], serviceBase);\n if (destinationFilePath !== undefined)\n url.searchParams.set(\"file\", destinationFilePath);\n if (workspaceId !== undefined)\n url.searchParams.set(\"workspaceId\", workspaceId);\n return url;\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\";\nimport { buildSignedUrl } from \"./signed-url.js\";\n\nexport async function callGenerateSignedUrlForRunInputsExecutablesStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath, workspaceId }: GenerateSignedUrlConfig,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n buildSignedUrl({\n destinationFilePath,\n endpoint: \"runInputsExecutables\",\n serviceBase,\n workspaceId,\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 {\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\";\nimport { buildSignedUrl } from \"./signed-url.js\";\n\nexport async function callGenerateSignedUrlForTempTeamStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath, workspaceId }: Partial<GenerateSignedUrlConfig>,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n buildSignedUrl({\n destinationFilePath,\n endpoint: \"teamStorage\",\n serviceBase,\n workspaceId,\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 {\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 { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n NotifyTerminatedEphemeralEnvironmentAbortReason,\n NotifyTerminatedEphemeralEnvironmentInput,\n NotifyTerminatedEphemeralEnvironmentResult,\n TerminatedEphemeralEnvironmentSuccessResult,\n} from \"./types.js\";\n\nexport const notifyTerminatedEphemeralEnvironment = async (\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: NotifyTerminatedEphemeralEnvironmentInput,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> => {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/environment_terminated\", apiConfig.serviceBase),\n {\n body: JSON.stringify(config),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n if (!response.ok) return handleErrorResponse(response, log);\n const { environmentId } =\n (await response.json()) as TerminatedEphemeralEnvironmentSuccessResult;\n return { environmentId, outcome: \"success\" };\n } catch {\n log.error(`š« Network error from terminate_preview_environment, aborting.`);\n return {\n abortReason: \"network-error\",\n outcome: \"aborted\",\n };\n }\n};\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> {\n const status = response.status;\n let abortReason: NotifyTerminatedEphemeralEnvironmentAbortReason;\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 === 409) abortReason = \"409-conflict\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"notifyTerminatedEphemeralEnvironment\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\n\nimport type { PollCiGreenlightStatus } from \"./types.js\";\n\n/**\n * Build the result for a completed run\n */\nexport function buildCompletedRunResult(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): PollCiGreenlightStatus {\n if (status.greenlight)\n return { greenlightStatus: status, outcome: \"success\" };\n else return { greenlightStatus: status, outcome: \"failed\" };\n}\n","import type { PollCiGreenlightPollConfig } from \"./types.js\";\n\n/**\n * Safe default values for polling configuration.\n * If you change these values, make sure you update the JSDoc\n * comments in the PollCiGreenlightPollConfig type.\n */\nexport const pollCiGreenlightDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000, // 2 hours\n retryInterval: 10 * 1000, // 10 seconds\n runInProgressInterval: 30 * 1000, // 30 seconds\n runUnderReviewInterval: 60 * 1000, // 60 seconds\n};\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport type { CiGreenlightBugData } from \"./ci-greenlight-bug-data.js\";\nimport { logFetchError } from \"./log.js\";\n\nexport type {\n CiGreenlightBugData,\n CiGreenlightBugDetails,\n} from \"./ci-greenlight-bug-data.js\";\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n};\n\nexport type CiGreenlightStatusExtended = {\n relevantRunWithBugsUrl: 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 CiGreenlightStatusExtended)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData &\n CiGreenlightStatusExtended)\n | ({\n greenlight: false;\n runStage: \"initializing\";\n } & Partial<CiGreenlightStatusExtended>)\n | ({\n greenlight: false;\n /**\n * Human-readable copy explaining why the run was canceled, when the\n * server provides it.\n */\n message?: string;\n /**\n * Stable, machine-readable code for why the run was canceled, when the\n * server provides it. Treat as an open set of values.\n */\n reason?: string;\n runStage: \"canceled\";\n } & Partial<CiGreenlightStatusExtended>)\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 {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { fetchCiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { sleep } from \"../../../other.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport type {\n MakePollCiGreenlightStatusIteratorParams,\n PollCiGreenlightIteration,\n} from \"./types.js\";\n\n/**\n * Creates an async generator that yields CI greenlight status updates or abort notifications.\n *\n * This low-level API gives you full control over the polling loop, allowing you to:\n * - Inspect status after each fetch\n * - Break out of the loop based on custom criteria\n * - Add custom logging or side effects\n * - Handle abort conditions without exceptions\n *\n * The iterator yields a discriminated union with `isAborted` property:\n * - `isAborted: false` - Normal status update with run information\n * - `isAborted: true` - Terminal condition (timeout, error, canceled, etc.)\n *\n * Note: This function does not throw errors. All error conditions are yielded as\n * abort results that you must check and handle.\n *\n * @example\n * ```typescript\n * const greenlightIterator = makePollCiGreenlightStatusIterator({ runId: \"my-run-id\" });\n *\n * for await (const lastPoll of greenlightIterator) {\n * // Check for abort conditions first\n * if (lastPoll.isAborted) {\n * console.error(`Aborted: ${lastPoll.abortReason}`);\n * process.exit(1);\n * }\n *\n * // Handle normal status updates\n * const { status } = lastPoll;\n * console.log(`Current stage: ${status.runStage}`);\n *\n * // Exit with error if run reached a terminal stage without greenlight\n * if (lastPoll.isFailedTerminalStage) {\n * process.exit(1);\n * }\n * }\n * ```\n *\n */\nexport async function* makePollCiGreenlightStatusIterator(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n { runId, ...pollConfig }: MakePollCiGreenlightStatusIteratorParams,\n): AsyncGenerator<PollCiGreenlightIteration, void, unknown> {\n const { log } = deps;\n\n const {\n maxRetries = pollCiGreenlightDefaults.maxRetries,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n retryInterval = pollCiGreenlightDefaults.retryInterval,\n runInProgressInterval = pollCiGreenlightDefaults.runInProgressInterval,\n runUnderReviewInterval = pollCiGreenlightDefaults.runUnderReviewInterval,\n } = pollConfig;\n\n let retries = 0;\n let previousStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= pollTimeout) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n { runId },\n deps,\n );\n\n const elapsedMs = Date.now() - startedAt;\n\n if (!responseState.ok && !responseState.canRetry) {\n yield {\n abortReason: \"4XX-client-error\",\n elapsedMs,\n httpStatus: responseState.httpStatus,\n isAborted: true,\n };\n return;\n }\n\n if (!responseState.ok) {\n retries += 1;\n const { errorType, httpStatus } = responseState;\n if (retries > maxRetries) {\n switch (errorType) {\n case \"network\":\n yield {\n abortReason: \"network-error\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n break;\n case \"not-found\":\n yield {\n abortReason: \"404-run-not-found\",\n elapsedMs,\n httpStatus: httpStatus ?? 404,\n isAborted: true,\n };\n break;\n case \"server\":\n yield {\n abortReason: \"5XX-server-error\",\n elapsedMs,\n httpStatus: httpStatus ?? 500,\n isAborted: true,\n };\n break;\n default:\n throw Error(`Unexpected error type: ${errorType satisfies never}`);\n }\n return;\n }\n\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n\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\n // Success - reset retry counter\n retries = 0;\n const { greenlightStatus } = responseState;\n const stageChanged =\n !previousStatus || previousStatus.runStage !== greenlightStatus.runStage;\n\n // Determine if this is a failed terminal stage\n const isFailedTerminalStage =\n greenlightStatus.runStage === \"canceled\" ||\n (greenlightStatus.runStage === \"completed\" &&\n greenlightStatus.greenlight === false);\n\n yield {\n elapsedMs,\n isAborted: false,\n isFailedTerminalStage,\n previousStatus,\n stageChanged,\n status: greenlightStatus,\n };\n\n // Update previous status for next iteration\n previousStatus = greenlightStatus;\n\n switch (greenlightStatus.runStage) {\n case \"canceled\": {\n yield {\n abortReason: \"run-canceled\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n }\n case \"completed\":\n return;\n case \"initializing\":\n await sleep(runInProgressInterval);\n break;\n case \"underReview\":\n await sleep(runUnderReviewInterval);\n break;\n default:\n throw Error(\n `Unexpected run stage: ${greenlightStatus satisfies never}`,\n );\n }\n }\n\n // Timeout\n yield {\n abortReason: \"poll-timed-out\",\n elapsedMs: Date.now() - startedAt,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { pluralize } from \"../../../other.js\";\n\n/**\n * Build log message for successful completed run\n */\nexport function buildSuccessLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const { nonBlockingBugsCount, relevantRunUrl } = status;\n const urlInfo = `See ${relevantRunUrl}`;\n\n return `ā
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\n/**\n * Build log message for failed completed run\n */\nexport function buildFailedLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const {\n blockingBugsCount,\n nonBlockingBugsCount,\n relevantRunWithBugsUrl,\n reproducedBugs,\n } = status;\n\n const blockingBugUrls = reproducedBugs\n .filter((bug) => bug.isBlocking)\n .map((bug) => bug.applicationUrl);\n const nonBlockingBugUrls = reproducedBugs\n .filter((bug) => !bug.isBlocking)\n .map((bug) => bug.applicationUrl);\n\n const blockingBugList = blockingBugUrls.map((url) => `\\n⢠${url}`).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\n return (\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}\n\n/**\n * Build log message for superseded run (aborting)\n */\nexport function buildSupersededAbortLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `ā Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`;\n}\n\n/**\n * Build log message for superseded run (continuing)\n */\nexport function buildSupersededContinueLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `Root run was superseded:${supersedingDetails}`;\n}\n\n/**\n * Build log messages for different run stages\n */\nexport function buildRunStageLogMessage(\n runStage: CiGreenlightStatus[\"runStage\"],\n relevantRunUrl: string,\n): string {\n const urlInfo = `See ${relevantRunUrl}`;\n\n switch (runStage) {\n case \"canceled\":\n return `š« Run was canceled. Aborting... Please contact support.\\n${urlInfo}`;\n case \"initializing\":\n return `ā³ Run is in progress... ${urlInfo}`;\n case \"underReview\":\n return `šµļø Run is under review... ${urlInfo}`;\n case \"completed\":\n // Completed is handled separately by buildSuccessLogMessage/buildFailedLogMessage\n throw Error(\n \"buildRunStageLogMessage should not be called for completed stage\",\n );\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n}\n","import type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n PollCiGreenlightIteratorHttpAborted,\n PollCiGreenlightIteratorNonHttpAborted,\n PollCiGreenlightStatus,\n} from \"./types.js\";\n\n/**\n * Handles aborted iterations from the CI greenlight poll iterator\n * and converts them to appropriate result objects with logging\n */\nexport function mapIteratorAbortToGreenlightStatus(\n iteration:\n | PollCiGreenlightIteratorHttpAborted\n | PollCiGreenlightIteratorNonHttpAborted,\n pollTimeout: number,\n deps: SdkDependencies,\n): PollCiGreenlightStatus {\n const { log } = deps;\n const { abortReason, httpStatus } = iteration;\n\n switch (abortReason) {\n case \"4XX-client-error\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"5XX-server-error\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"404-run-not-found\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"network-error\":\n log.error(`š« Unrecoverable network error from CI greenlight, aborting.`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"poll-timed-out\":\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"run-canceled\":\n log.info(`Run was canceled`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"XXX-other-http-code\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n default:\n throw Error(`Unexpected abort reason: ${abortReason satisfies never}`);\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { buildCompletedRunResult } from \"./buildCompletedRunResult.js\";\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./iterator.js\";\nimport {\n buildFailedLogMessage,\n buildRunStageLogMessage,\n buildSuccessLogMessage,\n buildSupersededAbortLogMessage,\n buildSupersededContinueLogMessage,\n} from \"./logging.js\";\nimport { mapIteratorAbortToGreenlightStatus } from \"./mapIteratorAbortToGreenlightStatus.js\";\nimport type {\n PollCiGreenlightParams,\n PollCiGreenlightStatus,\n} from \"./types.js\";\n\nexport async function pollCiGreenlightStatus(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n onRunStageChanged = () => undefined,\n runId,\n ...pollConfig\n }: PollCiGreenlightParams,\n): Promise<PollCiGreenlightStatus> {\n const { log } = deps;\n const {\n abortOnSuperseded = pollCiGreenlightDefaults.abortOnSuperseded,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n } = pollConfig;\n\n const iterator = makePollCiGreenlightStatusIterator(deps, apiConfig, {\n runId,\n ...pollConfig,\n });\n\n for await (const lastPoll of iterator) {\n if (lastPoll.isAborted)\n return mapIteratorAbortToGreenlightStatus(lastPoll, pollTimeout, deps);\n\n // Handle status iterations\n const { previousStatus, stageChanged, status } = lastPoll;\n\n // Call onRunStageChanged callback when stage changes\n if (stageChanged) {\n try {\n await onRunStageChanged(status, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n\n const { relevantRunId, relevantRunUrl, rootRunId, rootRunUrl, runStage } =\n status;\n\n // Superseded run handling\n const isSuperseded = rootRunId !== relevantRunId;\n const shouldAbortOnSuperseded = isSuperseded && abortOnSuperseded;\n if (shouldAbortOnSuperseded) {\n const message = buildSupersededAbortLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.warn(message);\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (isSuperseded) {\n const message = buildSupersededContinueLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.info(message);\n }\n\n switch (runStage) {\n case \"canceled\":\n case \"initializing\":\n case \"underReview\": {\n log.info(buildRunStageLogMessage(runStage, relevantRunUrl));\n break;\n }\n case \"completed\": {\n const result = buildCompletedRunResult(status);\n switch (result.outcome) {\n case \"aborted\": {\n break;\n }\n case \"failed\": {\n const message = buildFailedLogMessage(status);\n log.warn(message);\n break;\n }\n case \"success\": {\n const message = buildSuccessLogMessage(status);\n log.info(message);\n break;\n }\n default:\n throw Error(`Unexpected outcome: ${result satisfies never}`);\n }\n return result;\n }\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n }\n\n // This should never be reached as the iterator handles timeout\n throw Error(\"Iterator ended unexpectedly\");\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 { notifyTerminatedEphemeralEnvironment } from \"./domain/notifyTerminatedEphemeralEnvironment/index.js\";\nimport { pollCiGreenlightStatus } from \"./domain/pollCiGreenlight/index.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./domain/pollCiGreenlight/iterator.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 makePollCiGreenlightStatusIterator: makePollCiGreenlightStatusIterator.bind(\n null,\n deps,\n apiConfig,\n ),\n notifyTerminatedEphemeralEnvironment:\n notifyTerminatedEphemeralEnvironment.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/notifyTerminatedEphemeralEnvironment/types.js\";\nexport type * from \"./domain/pollCiGreenlight/types.js\";\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -134,6 +134,12 @@ type GenerateSignedUrlStatus = {
|
|
|
134
134
|
type GenerateSignedUrlAbortReason$1 = "client-network-error" | "sdk-argument-validation-failed" | "400-invalid-request" | "401-invalid-credentials" | "403-forbidden" | "5XX-server-error" | "XXX-other-http-code";
|
|
135
135
|
type GenerateSignedUrlConfig = {
|
|
136
136
|
destinationFilePath: string;
|
|
137
|
+
/**
|
|
138
|
+
* The workspace to generate the URL for. Required when authenticating with an
|
|
139
|
+
* organization API key, which is not tied to a single workspace. Omit it when
|
|
140
|
+
* authenticating with a workspace API key, which already implies one.
|
|
141
|
+
*/
|
|
142
|
+
workspaceId?: string;
|
|
137
143
|
};
|
|
138
144
|
type GenerateSignedUrlResponse = {
|
|
139
145
|
errorMessage?: string;
|
|
@@ -152,6 +158,12 @@ type BaseDeployConfig = {
|
|
|
152
158
|
deploymentUrl: string | undefined;
|
|
153
159
|
sha: string | undefined;
|
|
154
160
|
variables: Record<string, string> | undefined;
|
|
161
|
+
/**
|
|
162
|
+
* The workspace this deployment belongs to. Required when authenticating with
|
|
163
|
+
* an organization API key, which is not tied to a single workspace. Omit it
|
|
164
|
+
* when authenticating with a workspace API key, which already implies one.
|
|
165
|
+
*/
|
|
166
|
+
workspaceId?: string;
|
|
155
167
|
};
|
|
156
168
|
type GitHubDeployConfig = BaseDeployConfig & {
|
|
157
169
|
hostingService: "GitHub" | undefined;
|
|
@@ -324,13 +336,24 @@ type AttemptDeployFailedReason = Extract<NotifyDeployStatus, {
|
|
|
324
336
|
outcome: "failed";
|
|
325
337
|
}>["failReason"];
|
|
326
338
|
|
|
339
|
+
/**
|
|
340
|
+
* The workspace that owns the environment. Required when authenticating with an
|
|
341
|
+
* organization API key, which is not tied to a single workspace. Omit it when
|
|
342
|
+
* authenticating with a workspace API key, which already implies one.
|
|
343
|
+
*
|
|
344
|
+
* Absent from the `environmentId` lookup, where the environment identifies its
|
|
345
|
+
* own workspace.
|
|
346
|
+
*/
|
|
347
|
+
type WorkspaceLookup = {
|
|
348
|
+
workspaceId?: string;
|
|
349
|
+
};
|
|
327
350
|
type NotifyTerminatedEphemeralEnvironmentInput = {
|
|
328
351
|
environmentId: string;
|
|
329
|
-
} | {
|
|
352
|
+
} | ({
|
|
330
353
|
deploymentUrl: string;
|
|
331
|
-
} | {
|
|
354
|
+
} & WorkspaceLookup) | ({
|
|
332
355
|
environmentAlias: string;
|
|
333
|
-
};
|
|
356
|
+
} & WorkspaceLookup);
|
|
334
357
|
type NotifyTerminatedEphemeralEnvironmentFailedReason = "environmentNotFound" | "missingLookup" | "alreadyTerminated";
|
|
335
358
|
type NotifyTerminatedEphemeralEnvironmentHttpAbortReason = "4XX-client-error" | "401-unauthorized" | "403-forbidden" | "409-conflict" | "5XX-server-error" | "network-error";
|
|
336
359
|
type NotifyTerminatedEphemeralEnvironmentNonHttpAbortReason = "network-error";
|
package/dist/index.d.ts
CHANGED
|
@@ -134,6 +134,12 @@ type GenerateSignedUrlStatus = {
|
|
|
134
134
|
type GenerateSignedUrlAbortReason$1 = "client-network-error" | "sdk-argument-validation-failed" | "400-invalid-request" | "401-invalid-credentials" | "403-forbidden" | "5XX-server-error" | "XXX-other-http-code";
|
|
135
135
|
type GenerateSignedUrlConfig = {
|
|
136
136
|
destinationFilePath: string;
|
|
137
|
+
/**
|
|
138
|
+
* The workspace to generate the URL for. Required when authenticating with an
|
|
139
|
+
* organization API key, which is not tied to a single workspace. Omit it when
|
|
140
|
+
* authenticating with a workspace API key, which already implies one.
|
|
141
|
+
*/
|
|
142
|
+
workspaceId?: string;
|
|
137
143
|
};
|
|
138
144
|
type GenerateSignedUrlResponse = {
|
|
139
145
|
errorMessage?: string;
|
|
@@ -152,6 +158,12 @@ type BaseDeployConfig = {
|
|
|
152
158
|
deploymentUrl: string | undefined;
|
|
153
159
|
sha: string | undefined;
|
|
154
160
|
variables: Record<string, string> | undefined;
|
|
161
|
+
/**
|
|
162
|
+
* The workspace this deployment belongs to. Required when authenticating with
|
|
163
|
+
* an organization API key, which is not tied to a single workspace. Omit it
|
|
164
|
+
* when authenticating with a workspace API key, which already implies one.
|
|
165
|
+
*/
|
|
166
|
+
workspaceId?: string;
|
|
155
167
|
};
|
|
156
168
|
type GitHubDeployConfig = BaseDeployConfig & {
|
|
157
169
|
hostingService: "GitHub" | undefined;
|
|
@@ -324,13 +336,24 @@ type AttemptDeployFailedReason = Extract<NotifyDeployStatus, {
|
|
|
324
336
|
outcome: "failed";
|
|
325
337
|
}>["failReason"];
|
|
326
338
|
|
|
339
|
+
/**
|
|
340
|
+
* The workspace that owns the environment. Required when authenticating with an
|
|
341
|
+
* organization API key, which is not tied to a single workspace. Omit it when
|
|
342
|
+
* authenticating with a workspace API key, which already implies one.
|
|
343
|
+
*
|
|
344
|
+
* Absent from the `environmentId` lookup, where the environment identifies its
|
|
345
|
+
* own workspace.
|
|
346
|
+
*/
|
|
347
|
+
type WorkspaceLookup = {
|
|
348
|
+
workspaceId?: string;
|
|
349
|
+
};
|
|
327
350
|
type NotifyTerminatedEphemeralEnvironmentInput = {
|
|
328
351
|
environmentId: string;
|
|
329
|
-
} | {
|
|
352
|
+
} | ({
|
|
330
353
|
deploymentUrl: string;
|
|
331
|
-
} | {
|
|
354
|
+
} & WorkspaceLookup) | ({
|
|
332
355
|
environmentAlias: string;
|
|
333
|
-
};
|
|
356
|
+
} & WorkspaceLookup);
|
|
334
357
|
type NotifyTerminatedEphemeralEnvironmentFailedReason = "environmentNotFound" | "missingLookup" | "alreadyTerminated";
|
|
335
358
|
type NotifyTerminatedEphemeralEnvironmentHttpAbortReason = "4XX-client-error" | "401-unauthorized" | "403-forbidden" | "409-conflict" | "5XX-server-error" | "network-error";
|
|
336
359
|
type NotifyTerminatedEphemeralEnvironmentNonHttpAbortReason = "network-error";
|
package/dist/index.js
CHANGED
|
@@ -39,7 +39,7 @@ var defaultServiceBase = "https://app.qawolf.com/";
|
|
|
39
39
|
|
|
40
40
|
// package.json
|
|
41
41
|
var package_default = {
|
|
42
|
-
version: "2.
|
|
42
|
+
version: "2.2.0"};
|
|
43
43
|
|
|
44
44
|
// src/lib/sdk/defaults/userAgent.ts
|
|
45
45
|
var defaultUserAgent = `ci-sdk/${package_default.version}`;
|
|
@@ -278,7 +278,8 @@ async function attemptNotifyDeploy(deps, apiConfig, config) {
|
|
|
278
278
|
repository: config.repository
|
|
279
279
|
},
|
|
280
280
|
sha: config.sha,
|
|
281
|
-
variables: config.variables
|
|
281
|
+
variables: config.variables,
|
|
282
|
+
workspaceId: config.workspaceId
|
|
282
283
|
}),
|
|
283
284
|
headers: {
|
|
284
285
|
Authorization: `Bearer ${apiConfig.apiKey}`,
|
|
@@ -344,10 +345,28 @@ async function handleErrorResponse(response, log) {
|
|
|
344
345
|
}
|
|
345
346
|
__name(handleErrorResponse, "handleErrorResponse");
|
|
346
347
|
|
|
348
|
+
// src/lib/api/signed-url.ts
|
|
349
|
+
var signedUrlPaths = {
|
|
350
|
+
runInputsExecutables: "/api/v0/run-inputs-executables-signed-urls",
|
|
351
|
+
teamStorage: "/api/v0/team-storage-signed-url"
|
|
352
|
+
};
|
|
353
|
+
function buildSignedUrl({ destinationFilePath, endpoint, serviceBase, workspaceId }) {
|
|
354
|
+
const url = new URL(signedUrlPaths[endpoint], serviceBase);
|
|
355
|
+
if (destinationFilePath !== void 0) url.searchParams.set("file", destinationFilePath);
|
|
356
|
+
if (workspaceId !== void 0) url.searchParams.set("workspaceId", workspaceId);
|
|
357
|
+
return url;
|
|
358
|
+
}
|
|
359
|
+
__name(buildSignedUrl, "buildSignedUrl");
|
|
360
|
+
|
|
347
361
|
// src/lib/api/generate-signed-url-for-run-inputs-executables.ts
|
|
348
|
-
async function callGenerateSignedUrlForRunInputsExecutablesStorage({ apiKey, serviceBase, userAgent }, { destinationFilePath }, { fetch: localFetch, log }) {
|
|
362
|
+
async function callGenerateSignedUrlForRunInputsExecutablesStorage({ apiKey, serviceBase, userAgent }, { destinationFilePath, workspaceId }, { fetch: localFetch, log }) {
|
|
349
363
|
try {
|
|
350
|
-
const response = await localFetch(
|
|
364
|
+
const response = await localFetch(buildSignedUrl({
|
|
365
|
+
destinationFilePath,
|
|
366
|
+
endpoint: "runInputsExecutables",
|
|
367
|
+
serviceBase,
|
|
368
|
+
workspaceId
|
|
369
|
+
}), {
|
|
351
370
|
headers: {
|
|
352
371
|
Authorization: `Bearer ${apiKey}`,
|
|
353
372
|
"Content-Type": "application/json",
|
|
@@ -425,9 +444,14 @@ async function generateSignedUrlForRunInputsExecutablesStorage(deps, apiConfig,
|
|
|
425
444
|
__name(generateSignedUrlForRunInputsExecutablesStorage, "generateSignedUrlForRunInputsExecutablesStorage");
|
|
426
445
|
|
|
427
446
|
// src/lib/api/generate-signed-url-for-team-storage.ts
|
|
428
|
-
async function callGenerateSignedUrlForTempTeamStorage({ apiKey, serviceBase, userAgent }, { destinationFilePath }, { fetch: localFetch, log }) {
|
|
447
|
+
async function callGenerateSignedUrlForTempTeamStorage({ apiKey, serviceBase, userAgent }, { destinationFilePath, workspaceId }, { fetch: localFetch, log }) {
|
|
429
448
|
try {
|
|
430
|
-
const response = await localFetch(
|
|
449
|
+
const response = await localFetch(buildSignedUrl({
|
|
450
|
+
destinationFilePath,
|
|
451
|
+
endpoint: "teamStorage",
|
|
452
|
+
serviceBase,
|
|
453
|
+
workspaceId
|
|
454
|
+
}), {
|
|
431
455
|
headers: {
|
|
432
456
|
Authorization: `Bearer ${apiKey}`,
|
|
433
457
|
"Content-Type": "application/json",
|
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/handleSuccessResponse.ts","../src/lib/sdk/domain/attemptDeploy/mapDeploySuccessResponse.ts","../src/lib/sdk/domain/attemptDeploy/parseDeploySuccessWireResponse.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/sdk/domain/notifyTerminatedEphemeralEnvironment/index.ts","../src/lib/sdk/domain/pollCiGreenlight/buildCompletedRunResult.ts","../src/lib/sdk/domain/pollCiGreenlight/consts.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/pollCiGreenlight/iterator.ts","../src/lib/sdk/domain/pollCiGreenlight/logging.ts","../src/lib/sdk/domain/pollCiGreenlight/mapIteratorAbortToGreenlightStatus.ts","../src/lib/sdk/domain/pollCiGreenlight/index.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","defaultTimeoutMs","args","signal","AbortSignal","timeout","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","handleSuccessResponse","data","environment","results","skippedTriggers","skippedDeployment","isPreviewDeployment","isStatic","logPrefix","alias","id","length","skipMessages","map","trigger","skipDetail","join","environmentId","outcome","runId","failReason","unrecognizedResult","find","result","failedTrigger","failureReason","duplicateSuite","duplicateSuiteId","successfulTrigger","createdSuiteId","mapSuiteResult","created_suite_id","triggerId","trigger_id","failure_reason","duplicate_suite_id","skipReason","skip_reason","unrecognized","mapDeploySuccessResponse","wire","skipped_deployment","reason","skipped_triggers","environment_id","isRecord","value","Array","isArray","isWireSuiteResult","isEnvironment","isSkippedDeployment","isSkippedTrigger","isDeploySuccessWireResponse","every","parseDeploySuccessWireResponse","attemptNotifyDeploy","deps","apiConfig","config","localFetch","bodyText","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","abortReason","httpStatus","rawBody","parse","abortInvalidResponseBody","detail","callGenerateSignedUrlForRunInputsExecutablesStorage","destinationFilePath","encodeURIComponent","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","notifyTerminatedEphemeralEnvironment","buildCompletedRunResult","greenlight","greenlightStatus","pollCiGreenlightDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","fetchCiGreenlightStatus","resp","canRetry","errorType","makePollCiGreenlightStatusIterator","pollConfig","retries","previousStatus","startedAt","Date","now","elapsedMs","isAborted","Error","retryLabel","stageChanged","runStage","isFailedTerminalStage","buildSuccessLogMessage","nonBlockingBugsCount","relevantRunUrl","urlInfo","buildFailedLogMessage","blockingBugsCount","relevantRunWithBugsUrl","reproducedBugs","blockingBugUrls","filter","bug","isBlocking","applicationUrl","nonBlockingBugUrls","blockingBugList","url","nonBlockingBugList","bugsListInText","buildSupersededAbortLogMessage","rootRunUrl","supersedingDetails","buildSupersededContinueLogMessage","buildRunStageLogMessage","mapIteratorAbortToGreenlightStatus","iteration","pollCiGreenlightStatus","onRunStageChanged","iterator","lastPoll","e","relevantRunId","rootRunId","isSuperseded","shouldAbortOnSuperseded","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, defaultTimeoutMs: number) =>\n async (...args: Parameters<FetchDriver>) => {\n // Allow signal to be overridden by the caller\n const signal = args[1]?.signal ?? AbortSignal.timeout(defaultTimeoutMs);\n\n return fetch(args[0], { ...args[1], signal });\n };\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\": \"2.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:ci\": \"npm run lint:non-fixable; NON_FIXABLE_EXIT=$?; npm run lint:fixable && exit $NON_FIXABLE_EXIT\",\n \"lint:dev\": \"npm run lint:fixable\",\n \"lint:fixable\": \"eslint . --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:non-fixable\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*'\",\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.1.2\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\"\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 { LogDriver } from \"../../dependencies.js\";\n\nimport type { DeployStatus, NotifyDeployStatus } from \"./types.js\";\n\nexport async function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const skippedTriggers = data.skippedTriggers ?? [];\n const skippedDeployment = data.skippedDeployment;\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 suites were created for this deployment.\n if (results.length === 0) {\n const skipMessages = [\n ...skippedTriggers.map((trigger) => trigger.message),\n ...(skippedDeployment ? [skippedDeployment.message] : []),\n ];\n const skipDetail =\n skipMessages.length > 0 ? ` ${skipMessages.join(\" \")}` : \"\";\n\n // Preview deployments legitimately often produce no run; keep the success\n // outcome but surface any skip reason so it is not silently dropped.\n if (isPreviewDeployment) {\n log.info(\n `ā
Deployment notification was successful. No run was created for this deployment.${skipDetail}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n\n // A trigger matched but could not run (e.g. environment still syncing).\n // Distinct from \"no trigger matched\": the generic text would mislabel it,\n // and the skip reason is what tells the caller whether to retry.\n if (skippedTriggers.length > 0) {\n log.error(`š« No run was created for this deployment.${skipDetail}`);\n return {\n failReason: \"trigger-skipped\",\n outcome: \"failed\",\n skippedTriggers,\n };\n }\n\n log.warn(\n skippedDeployment\n ? `ā ļø No run was created for this deployment.${skipDetail}`\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 {\n outcome: \"skipped\",\n skippedDeployment,\n };\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 // A result arm this SDK version does not recognize (newer backend). We cannot\n // classify the outcome, so surface it as a failure rather than guessing.\n const unrecognizedResult = results.find((result) => \"unrecognized\" in result);\n if (unrecognizedResult) {\n log.error(\n `š« The deployment response contained an unrecognized result. Please upgrade @qawolf/ci-sdk.`,\n );\n return { failReason: \"unknown-result\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((result) => \"failureReason\" in result);\n if (failedTrigger) {\n log.error(\n `š« Run could not be created. Reason: \"${failedTrigger.failureReason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((result) => \"duplicateSuiteId\" in result);\n if (duplicateSuite) {\n log.info(\n `ā
Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicateSuiteId} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicateSuiteId,\n };\n }\n\n const successfulTrigger = results.find(\n (result) => \"createdSuiteId\" in result,\n );\n if (!successfulTrigger) {\n // results is non-empty here, so triggers did match ā this is not the\n // deterministic no-trigger-match skip. Reaching this point means the\n // response carried results we could not turn into a run, so it is an\n // unexpected failure rather than a skip.\n log.error(`š« Run could not be created. Please contact support.`);\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n log.info(\n `ā
Deployment notification was successful. Run created with ID: ${successfulTrigger.createdSuiteId}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.createdSuiteId,\n };\n}\n","import type { DeploySuccessWireResponse } from \"./deploySuccessWireResponse.js\";\nimport type { DeployStatus, DeploySuccessSuiteResult } from \"./types.js\";\n\nfunction mapSuiteResult(\n result: DeploySuccessWireResponse[\"results\"][number],\n): DeploySuccessSuiteResult {\n if (\"created_suite_id\" in result) {\n return {\n createdSuiteId: result.created_suite_id,\n triggerId: result.trigger_id,\n };\n }\n if (\"failure_reason\" in result) {\n return {\n failureReason: result.failure_reason,\n triggerId: result.trigger_id,\n };\n }\n if (\"duplicate_suite_id\" in result) {\n return {\n duplicateSuiteId: result.duplicate_suite_id,\n skipReason: result.skip_reason,\n triggerId: result.trigger_id,\n };\n }\n // A result arm added by a newer backend: surface it explicitly rather than\n // forcing it into one of the known shapes.\n return { triggerId: result.trigger_id, unrecognized: true };\n}\n\n// The deploy_success success body is the SDK's only snake_case wire shape; this\n// is the single place that renames it to the camelCase `DeployStatus` used\n// everywhere downstream.\nexport function mapDeploySuccessResponse(\n wire: DeploySuccessWireResponse,\n): DeployStatus {\n return {\n environment: wire.environment,\n results: wire.results.map(mapSuiteResult),\n skippedDeployment: wire.skipped_deployment && {\n message: wire.skipped_deployment.message,\n reason: wire.skipped_deployment.reason,\n },\n skippedTriggers: wire.skipped_triggers?.map((trigger) => ({\n environmentId: trigger.environment_id,\n message: trigger.message,\n reason: trigger.reason,\n triggerId: trigger.trigger_id,\n })),\n };\n}\n","import type { DeploySuccessWireResponse } from \"./deploySuccessWireResponse.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n // Arrays are objects too; a deploy_success body or any of its parts must be a\n // plain object, never an array. (JSON cannot produce other non-plain objects\n // such as Date or Map, so excluding arrays is sufficient here.)\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isWireSuiteResult(value: unknown): boolean {\n if (!isRecord(value)) return false;\n if (typeof value.trigger_id !== \"string\") return false;\n if (\"created_suite_id\" in value)\n return typeof value.created_suite_id === \"string\";\n\n if (\"failure_reason\" in value)\n return typeof value.failure_reason === \"string\";\n\n if (\"duplicate_suite_id\" in value) {\n return (\n typeof value.duplicate_suite_id === \"string\" &&\n typeof value.skip_reason === \"string\"\n );\n }\n // A structurally-valid result (object with a string trigger_id) carrying no\n // known discriminator is a result arm added by a newer backend. Accept it so\n // an older SDK does not reject the whole response; mapSuiteResult maps it to\n // an explicit unrecognized outcome.\n return true;\n}\n\nfunction isEnvironment(value: unknown): boolean {\n if (!isRecord(value)) return false;\n if (typeof value.id !== \"string\") return false;\n if (typeof value.isStatic !== \"boolean\") return false;\n if (value.alias !== undefined && typeof value.alias !== \"string\")\n return false;\n return true;\n}\n\nfunction isSkippedDeployment(value: unknown): boolean {\n if (!isRecord(value)) return false;\n return typeof value.message === \"string\" && typeof value.reason === \"string\";\n}\n\nfunction isSkippedTrigger(value: unknown): boolean {\n if (!isRecord(value)) return false;\n return (\n typeof value.environment_id === \"string\" &&\n typeof value.message === \"string\" &&\n typeof value.reason === \"string\" &&\n typeof value.trigger_id === \"string\"\n );\n}\n\nfunction isDeploySuccessWireResponse(\n value: unknown,\n): value is DeploySuccessWireResponse {\n if (!isRecord(value)) return false;\n if (value.environment !== undefined && !isEnvironment(value.environment))\n return false;\n\n if (!Array.isArray(value.results) || !value.results.every(isWireSuiteResult))\n return false;\n\n if (\n value.skipped_deployment !== undefined &&\n !isSkippedDeployment(value.skipped_deployment)\n )\n return false;\n\n if (\n value.skipped_triggers !== undefined &&\n (!Array.isArray(value.skipped_triggers) ||\n !value.skipped_triggers.every(isSkippedTrigger))\n )\n return false;\n\n return true;\n}\n\n// Validate the deploy_success success body at runtime instead of trusting a\n// cast. `environment` is required to be present-or-explicitly-undefined; the\n// two skip fields are optional (older servers omit them).\nexport function parseDeploySuccessWireResponse(\n value: unknown,\n): DeploySuccessWireResponse | \"invalid\" {\n return isDeploySuccessWireResponse(value) ? value : \"invalid\";\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport { handleSuccessResponse } from \"./handleSuccessResponse.js\";\nimport { mapDeploySuccessResponse } from \"./mapDeploySuccessResponse.js\";\nimport { parseDeploySuccessWireResponse } from \"./parseDeploySuccessWireResponse.js\";\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\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\n let response: Response;\n let bodyText: string;\n try {\n 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 // Override default timeout to 5 minutes. This gives extra room\n // for both (1) waiting for reconciliation (2) creating the run.\n signal: AbortSignal.timeout(5 * 60 * 1000),\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n\n // Reading the body stream is still a network operation; a failure here is\n // a network error, not a bad payload.\n bodyText = await response.text();\n } catch {\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 let rawBody: unknown;\n try {\n rawBody = JSON.parse(bodyText);\n } catch {\n return abortInvalidResponseBody(log, \"the response body was not JSON\");\n }\n\n const wire = parseDeploySuccessWireResponse(rawBody);\n if (wire === \"invalid\") {\n return abortInvalidResponseBody(\n log,\n \"the response body did not match the expected shape\",\n );\n }\n\n const data = mapDeploySuccessResponse(wire);\n return handleSuccessResponse(data, log);\n}\n\nfunction abortInvalidResponseBody(\n log: LogDriver,\n detail: string,\n): NotifyDeployStatus {\n log.error(`š« Invalid response from deploy_success (${detail}), aborting.`);\n return {\n abortReason: \"invalid-response-body\",\n httpStatus: undefined,\n outcome: \"aborted\",\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","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 {\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 {\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 { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n NotifyTerminatedEphemeralEnvironmentAbortReason,\n NotifyTerminatedEphemeralEnvironmentInput,\n NotifyTerminatedEphemeralEnvironmentResult,\n TerminatedEphemeralEnvironmentSuccessResult,\n} from \"./types.js\";\n\nexport const notifyTerminatedEphemeralEnvironment = async (\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: NotifyTerminatedEphemeralEnvironmentInput,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> => {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/environment_terminated\", apiConfig.serviceBase),\n {\n body: JSON.stringify(config),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n if (!response.ok) return handleErrorResponse(response, log);\n const { environmentId } =\n (await response.json()) as TerminatedEphemeralEnvironmentSuccessResult;\n return { environmentId, outcome: \"success\" };\n } catch {\n log.error(`š« Network error from terminate_preview_environment, aborting.`);\n return {\n abortReason: \"network-error\",\n outcome: \"aborted\",\n };\n }\n};\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> {\n const status = response.status;\n let abortReason: NotifyTerminatedEphemeralEnvironmentAbortReason;\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 === 409) abortReason = \"409-conflict\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"notifyTerminatedEphemeralEnvironment\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\n\nimport type { PollCiGreenlightStatus } from \"./types.js\";\n\n/**\n * Build the result for a completed run\n */\nexport function buildCompletedRunResult(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): PollCiGreenlightStatus {\n if (status.greenlight)\n return { greenlightStatus: status, outcome: \"success\" };\n else return { greenlightStatus: status, outcome: \"failed\" };\n}\n","import type { PollCiGreenlightPollConfig } from \"./types.js\";\n\n/**\n * Safe default values for polling configuration.\n * If you change these values, make sure you update the JSDoc\n * comments in the PollCiGreenlightPollConfig type.\n */\nexport const pollCiGreenlightDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000, // 2 hours\n retryInterval: 10 * 1000, // 10 seconds\n runInProgressInterval: 30 * 1000, // 30 seconds\n runUnderReviewInterval: 60 * 1000, // 60 seconds\n};\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport type { CiGreenlightBugData } from \"./ci-greenlight-bug-data.js\";\nimport { logFetchError } from \"./log.js\";\n\nexport type {\n CiGreenlightBugData,\n CiGreenlightBugDetails,\n} from \"./ci-greenlight-bug-data.js\";\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n};\n\nexport type CiGreenlightStatusExtended = {\n relevantRunWithBugsUrl: 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 CiGreenlightStatusExtended)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData &\n CiGreenlightStatusExtended)\n | ({\n greenlight: false;\n runStage: \"initializing\";\n } & Partial<CiGreenlightStatusExtended>)\n | ({\n greenlight: false;\n /**\n * Human-readable copy explaining why the run was canceled, when the\n * server provides it.\n */\n message?: string;\n /**\n * Stable, machine-readable code for why the run was canceled, when the\n * server provides it. Treat as an open set of values.\n */\n reason?: string;\n runStage: \"canceled\";\n } & Partial<CiGreenlightStatusExtended>)\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 {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { fetchCiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { sleep } from \"../../../other.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport type {\n MakePollCiGreenlightStatusIteratorParams,\n PollCiGreenlightIteration,\n} from \"./types.js\";\n\n/**\n * Creates an async generator that yields CI greenlight status updates or abort notifications.\n *\n * This low-level API gives you full control over the polling loop, allowing you to:\n * - Inspect status after each fetch\n * - Break out of the loop based on custom criteria\n * - Add custom logging or side effects\n * - Handle abort conditions without exceptions\n *\n * The iterator yields a discriminated union with `isAborted` property:\n * - `isAborted: false` - Normal status update with run information\n * - `isAborted: true` - Terminal condition (timeout, error, canceled, etc.)\n *\n * Note: This function does not throw errors. All error conditions are yielded as\n * abort results that you must check and handle.\n *\n * @example\n * ```typescript\n * const greenlightIterator = makePollCiGreenlightStatusIterator({ runId: \"my-run-id\" });\n *\n * for await (const lastPoll of greenlightIterator) {\n * // Check for abort conditions first\n * if (lastPoll.isAborted) {\n * console.error(`Aborted: ${lastPoll.abortReason}`);\n * process.exit(1);\n * }\n *\n * // Handle normal status updates\n * const { status } = lastPoll;\n * console.log(`Current stage: ${status.runStage}`);\n *\n * // Exit with error if run reached a terminal stage without greenlight\n * if (lastPoll.isFailedTerminalStage) {\n * process.exit(1);\n * }\n * }\n * ```\n *\n */\nexport async function* makePollCiGreenlightStatusIterator(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n { runId, ...pollConfig }: MakePollCiGreenlightStatusIteratorParams,\n): AsyncGenerator<PollCiGreenlightIteration, void, unknown> {\n const { log } = deps;\n\n const {\n maxRetries = pollCiGreenlightDefaults.maxRetries,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n retryInterval = pollCiGreenlightDefaults.retryInterval,\n runInProgressInterval = pollCiGreenlightDefaults.runInProgressInterval,\n runUnderReviewInterval = pollCiGreenlightDefaults.runUnderReviewInterval,\n } = pollConfig;\n\n let retries = 0;\n let previousStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= pollTimeout) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n { runId },\n deps,\n );\n\n const elapsedMs = Date.now() - startedAt;\n\n if (!responseState.ok && !responseState.canRetry) {\n yield {\n abortReason: \"4XX-client-error\",\n elapsedMs,\n httpStatus: responseState.httpStatus,\n isAborted: true,\n };\n return;\n }\n\n if (!responseState.ok) {\n retries += 1;\n const { errorType, httpStatus } = responseState;\n if (retries > maxRetries) {\n switch (errorType) {\n case \"network\":\n yield {\n abortReason: \"network-error\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n break;\n case \"not-found\":\n yield {\n abortReason: \"404-run-not-found\",\n elapsedMs,\n httpStatus: httpStatus ?? 404,\n isAborted: true,\n };\n break;\n case \"server\":\n yield {\n abortReason: \"5XX-server-error\",\n elapsedMs,\n httpStatus: httpStatus ?? 500,\n isAborted: true,\n };\n break;\n default:\n throw Error(`Unexpected error type: ${errorType satisfies never}`);\n }\n return;\n }\n\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n\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\n // Success - reset retry counter\n retries = 0;\n const { greenlightStatus } = responseState;\n const stageChanged =\n !previousStatus || previousStatus.runStage !== greenlightStatus.runStage;\n\n // Determine if this is a failed terminal stage\n const isFailedTerminalStage =\n greenlightStatus.runStage === \"canceled\" ||\n (greenlightStatus.runStage === \"completed\" &&\n greenlightStatus.greenlight === false);\n\n yield {\n elapsedMs,\n isAborted: false,\n isFailedTerminalStage,\n previousStatus,\n stageChanged,\n status: greenlightStatus,\n };\n\n // Update previous status for next iteration\n previousStatus = greenlightStatus;\n\n switch (greenlightStatus.runStage) {\n case \"canceled\": {\n yield {\n abortReason: \"run-canceled\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n }\n case \"completed\":\n return;\n case \"initializing\":\n await sleep(runInProgressInterval);\n break;\n case \"underReview\":\n await sleep(runUnderReviewInterval);\n break;\n default:\n throw Error(\n `Unexpected run stage: ${greenlightStatus satisfies never}`,\n );\n }\n }\n\n // Timeout\n yield {\n abortReason: \"poll-timed-out\",\n elapsedMs: Date.now() - startedAt,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { pluralize } from \"../../../other.js\";\n\n/**\n * Build log message for successful completed run\n */\nexport function buildSuccessLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const { nonBlockingBugsCount, relevantRunUrl } = status;\n const urlInfo = `See ${relevantRunUrl}`;\n\n return `ā
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\n/**\n * Build log message for failed completed run\n */\nexport function buildFailedLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const {\n blockingBugsCount,\n nonBlockingBugsCount,\n relevantRunWithBugsUrl,\n reproducedBugs,\n } = status;\n\n const blockingBugUrls = reproducedBugs\n .filter((bug) => bug.isBlocking)\n .map((bug) => bug.applicationUrl);\n const nonBlockingBugUrls = reproducedBugs\n .filter((bug) => !bug.isBlocking)\n .map((bug) => bug.applicationUrl);\n\n const blockingBugList = blockingBugUrls.map((url) => `\\n⢠${url}`).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\n return (\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}\n\n/**\n * Build log message for superseded run (aborting)\n */\nexport function buildSupersededAbortLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `ā Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`;\n}\n\n/**\n * Build log message for superseded run (continuing)\n */\nexport function buildSupersededContinueLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `Root run was superseded:${supersedingDetails}`;\n}\n\n/**\n * Build log messages for different run stages\n */\nexport function buildRunStageLogMessage(\n runStage: CiGreenlightStatus[\"runStage\"],\n relevantRunUrl: string,\n): string {\n const urlInfo = `See ${relevantRunUrl}`;\n\n switch (runStage) {\n case \"canceled\":\n return `š« Run was canceled. Aborting... Please contact support.\\n${urlInfo}`;\n case \"initializing\":\n return `ā³ Run is in progress... ${urlInfo}`;\n case \"underReview\":\n return `šµļø Run is under review... ${urlInfo}`;\n case \"completed\":\n // Completed is handled separately by buildSuccessLogMessage/buildFailedLogMessage\n throw Error(\n \"buildRunStageLogMessage should not be called for completed stage\",\n );\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n}\n","import type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n PollCiGreenlightIteratorHttpAborted,\n PollCiGreenlightIteratorNonHttpAborted,\n PollCiGreenlightStatus,\n} from \"./types.js\";\n\n/**\n * Handles aborted iterations from the CI greenlight poll iterator\n * and converts them to appropriate result objects with logging\n */\nexport function mapIteratorAbortToGreenlightStatus(\n iteration:\n | PollCiGreenlightIteratorHttpAborted\n | PollCiGreenlightIteratorNonHttpAborted,\n pollTimeout: number,\n deps: SdkDependencies,\n): PollCiGreenlightStatus {\n const { log } = deps;\n const { abortReason, httpStatus } = iteration;\n\n switch (abortReason) {\n case \"4XX-client-error\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"5XX-server-error\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"404-run-not-found\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"network-error\":\n log.error(`š« Unrecoverable network error from CI greenlight, aborting.`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"poll-timed-out\":\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"run-canceled\":\n log.info(`Run was canceled`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"XXX-other-http-code\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n default:\n throw Error(`Unexpected abort reason: ${abortReason satisfies never}`);\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { buildCompletedRunResult } from \"./buildCompletedRunResult.js\";\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./iterator.js\";\nimport {\n buildFailedLogMessage,\n buildRunStageLogMessage,\n buildSuccessLogMessage,\n buildSupersededAbortLogMessage,\n buildSupersededContinueLogMessage,\n} from \"./logging.js\";\nimport { mapIteratorAbortToGreenlightStatus } from \"./mapIteratorAbortToGreenlightStatus.js\";\nimport type {\n PollCiGreenlightParams,\n PollCiGreenlightStatus,\n} from \"./types.js\";\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 const { log } = deps;\n const {\n abortOnSuperseded = pollCiGreenlightDefaults.abortOnSuperseded,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n } = pollConfig;\n\n const iterator = makePollCiGreenlightStatusIterator(deps, apiConfig, {\n runId,\n ...pollConfig,\n });\n\n for await (const lastPoll of iterator) {\n if (lastPoll.isAborted)\n return mapIteratorAbortToGreenlightStatus(lastPoll, pollTimeout, deps);\n\n // Handle status iterations\n const { previousStatus, stageChanged, status } = lastPoll;\n\n // Call onRunStageChanged callback when stage changes\n if (stageChanged) {\n try {\n await onRunStageChanged(status, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n\n const { relevantRunId, relevantRunUrl, rootRunId, rootRunUrl, runStage } =\n status;\n\n // Superseded run handling\n const isSuperseded = rootRunId !== relevantRunId;\n const shouldAbortOnSuperseded = isSuperseded && abortOnSuperseded;\n if (shouldAbortOnSuperseded) {\n const message = buildSupersededAbortLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.warn(message);\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (isSuperseded) {\n const message = buildSupersededContinueLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.info(message);\n }\n\n switch (runStage) {\n case \"canceled\":\n case \"initializing\":\n case \"underReview\": {\n log.info(buildRunStageLogMessage(runStage, relevantRunUrl));\n break;\n }\n case \"completed\": {\n const result = buildCompletedRunResult(status);\n switch (result.outcome) {\n case \"aborted\": {\n break;\n }\n case \"failed\": {\n const message = buildFailedLogMessage(status);\n log.warn(message);\n break;\n }\n case \"success\": {\n const message = buildSuccessLogMessage(status);\n log.info(message);\n break;\n }\n default:\n throw Error(`Unexpected outcome: ${result satisfies never}`);\n }\n return result;\n }\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n }\n\n // This should never be reached as the iterator handles timeout\n throw Error(\"Iterator ended unexpectedly\");\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 { notifyTerminatedEphemeralEnvironment } from \"./domain/notifyTerminatedEphemeralEnvironment/index.js\";\nimport { pollCiGreenlightStatus } from \"./domain/pollCiGreenlight/index.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./domain/pollCiGreenlight/iterator.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 makePollCiGreenlightStatusIterator: makePollCiGreenlightStatusIterator.bind(\n null,\n deps,\n apiConfig,\n ),\n notifyTerminatedEphemeralEnvironment:\n notifyTerminatedEphemeralEnvironment.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/notifyTerminatedEphemeralEnvironment/types.js\";\nexport type * from \"./domain/pollCiGreenlight/types.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/handleSuccessResponse.ts","../src/lib/sdk/domain/attemptDeploy/mapDeploySuccessResponse.ts","../src/lib/sdk/domain/attemptDeploy/parseDeploySuccessWireResponse.ts","../src/lib/sdk/domain/attemptDeploy/index.ts","../src/lib/api/signed-url.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/sdk/domain/notifyTerminatedEphemeralEnvironment/index.ts","../src/lib/sdk/domain/pollCiGreenlight/buildCompletedRunResult.ts","../src/lib/sdk/domain/pollCiGreenlight/consts.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/pollCiGreenlight/iterator.ts","../src/lib/sdk/domain/pollCiGreenlight/logging.ts","../src/lib/sdk/domain/pollCiGreenlight/mapIteratorAbortToGreenlightStatus.ts","../src/lib/sdk/domain/pollCiGreenlight/index.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","defaultTimeoutMs","args","signal","AbortSignal","timeout","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","handleSuccessResponse","data","environment","results","skippedTriggers","skippedDeployment","isPreviewDeployment","isStatic","logPrefix","alias","id","length","skipMessages","map","trigger","skipDetail","join","environmentId","outcome","runId","failReason","unrecognizedResult","find","result","failedTrigger","failureReason","duplicateSuite","duplicateSuiteId","successfulTrigger","createdSuiteId","mapSuiteResult","created_suite_id","triggerId","trigger_id","failure_reason","duplicate_suite_id","skipReason","skip_reason","unrecognized","mapDeploySuccessResponse","wire","skipped_deployment","reason","skipped_triggers","environment_id","isRecord","value","Array","isArray","isWireSuiteResult","isEnvironment","isSkippedDeployment","isSkippedTrigger","isDeploySuccessWireResponse","every","parseDeploySuccessWireResponse","attemptNotifyDeploy","deps","apiConfig","config","localFetch","bodyText","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","workspaceId","headers","Authorization","apiKey","userAgent","method","handleErrorResponse","abortReason","httpStatus","rawBody","parse","abortInvalidResponseBody","detail","signedUrlPaths","runInputsExecutables","teamStorage","buildSignedUrl","destinationFilePath","endpoint","url","searchParams","set","callGenerateSignedUrlForRunInputsExecutablesStorage","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","notifyTerminatedEphemeralEnvironment","buildCompletedRunResult","greenlight","greenlightStatus","pollCiGreenlightDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","fetchCiGreenlightStatus","resp","encodeURIComponent","canRetry","errorType","makePollCiGreenlightStatusIterator","pollConfig","retries","previousStatus","startedAt","Date","now","elapsedMs","isAborted","Error","retryLabel","stageChanged","runStage","isFailedTerminalStage","buildSuccessLogMessage","nonBlockingBugsCount","relevantRunUrl","urlInfo","buildFailedLogMessage","blockingBugsCount","relevantRunWithBugsUrl","reproducedBugs","blockingBugUrls","filter","bug","isBlocking","applicationUrl","nonBlockingBugUrls","blockingBugList","nonBlockingBugList","bugsListInText","buildSupersededAbortLogMessage","rootRunUrl","supersedingDetails","buildSupersededContinueLogMessage","buildRunStageLogMessage","mapIteratorAbortToGreenlightStatus","iteration","pollCiGreenlightStatus","onRunStageChanged","iterator","lastPoll","e","relevantRunId","rootRunId","isSuperseded","shouldAbortOnSuperseded","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, defaultTimeoutMs: number) =>\n async (...args: Parameters<FetchDriver>) => {\n // Allow signal to be overridden by the caller\n const signal = args[1]?.signal ?? AbortSignal.timeout(defaultTimeoutMs);\n\n return fetch(args[0], { ...args[1], signal });\n };\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\": \"2.2.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 \"files\": [\n \"/dist\",\n \"/README.md\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\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 \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022\",\n \"lint:ci\": \"npm run lint:non-fixable; NON_FIXABLE_EXIT=$?; npm run lint:fixable && exit $NON_FIXABLE_EXIT\",\n \"lint:dev\": \"npm run lint:fixable\",\n \"lint:fixable\": \"eslint . --fix --quiet && oxfmt --write .\",\n \"lint:non-fixable\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*'\",\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.1.2\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\"\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 { LogDriver } from \"../../dependencies.js\";\n\nimport type { DeployStatus, NotifyDeployStatus } from \"./types.js\";\n\nexport async function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const skippedTriggers = data.skippedTriggers ?? [];\n const skippedDeployment = data.skippedDeployment;\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 suites were created for this deployment.\n if (results.length === 0) {\n const skipMessages = [\n ...skippedTriggers.map((trigger) => trigger.message),\n ...(skippedDeployment ? [skippedDeployment.message] : []),\n ];\n const skipDetail =\n skipMessages.length > 0 ? ` ${skipMessages.join(\" \")}` : \"\";\n\n // Preview deployments legitimately often produce no run; keep the success\n // outcome but surface any skip reason so it is not silently dropped.\n if (isPreviewDeployment) {\n log.info(\n `ā
Deployment notification was successful. No run was created for this deployment.${skipDetail}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n\n // A trigger matched but could not run (e.g. environment still syncing).\n // Distinct from \"no trigger matched\": the generic text would mislabel it,\n // and the skip reason is what tells the caller whether to retry.\n if (skippedTriggers.length > 0) {\n log.error(`š« No run was created for this deployment.${skipDetail}`);\n return {\n failReason: \"trigger-skipped\",\n outcome: \"failed\",\n skippedTriggers,\n };\n }\n\n log.warn(\n skippedDeployment\n ? `ā ļø No run was created for this deployment.${skipDetail}`\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 {\n outcome: \"skipped\",\n skippedDeployment,\n };\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 // A result arm this SDK version does not recognize (newer backend). We cannot\n // classify the outcome, so surface it as a failure rather than guessing.\n const unrecognizedResult = results.find((result) => \"unrecognized\" in result);\n if (unrecognizedResult) {\n log.error(\n `š« The deployment response contained an unrecognized result. Please upgrade @qawolf/ci-sdk.`,\n );\n return { failReason: \"unknown-result\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((result) => \"failureReason\" in result);\n if (failedTrigger) {\n log.error(\n `š« Run could not be created. Reason: \"${failedTrigger.failureReason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((result) => \"duplicateSuiteId\" in result);\n if (duplicateSuite) {\n log.info(\n `ā
Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicateSuiteId} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicateSuiteId,\n };\n }\n\n const successfulTrigger = results.find(\n (result) => \"createdSuiteId\" in result,\n );\n if (!successfulTrigger) {\n // results is non-empty here, so triggers did match ā this is not the\n // deterministic no-trigger-match skip. Reaching this point means the\n // response carried results we could not turn into a run, so it is an\n // unexpected failure rather than a skip.\n log.error(`š« Run could not be created. Please contact support.`);\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n log.info(\n `ā
Deployment notification was successful. Run created with ID: ${successfulTrigger.createdSuiteId}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.createdSuiteId,\n };\n}\n","import type { DeploySuccessWireResponse } from \"./deploySuccessWireResponse.js\";\nimport type { DeployStatus, DeploySuccessSuiteResult } from \"./types.js\";\n\nfunction mapSuiteResult(\n result: DeploySuccessWireResponse[\"results\"][number],\n): DeploySuccessSuiteResult {\n if (\"created_suite_id\" in result) {\n return {\n createdSuiteId: result.created_suite_id,\n triggerId: result.trigger_id,\n };\n }\n if (\"failure_reason\" in result) {\n return {\n failureReason: result.failure_reason,\n triggerId: result.trigger_id,\n };\n }\n if (\"duplicate_suite_id\" in result) {\n return {\n duplicateSuiteId: result.duplicate_suite_id,\n skipReason: result.skip_reason,\n triggerId: result.trigger_id,\n };\n }\n // A result arm added by a newer backend: surface it explicitly rather than\n // forcing it into one of the known shapes.\n return { triggerId: result.trigger_id, unrecognized: true };\n}\n\n// The deploy_success success body is the SDK's only snake_case wire shape; this\n// is the single place that renames it to the camelCase `DeployStatus` used\n// everywhere downstream.\nexport function mapDeploySuccessResponse(\n wire: DeploySuccessWireResponse,\n): DeployStatus {\n return {\n environment: wire.environment,\n results: wire.results.map(mapSuiteResult),\n skippedDeployment: wire.skipped_deployment && {\n message: wire.skipped_deployment.message,\n reason: wire.skipped_deployment.reason,\n },\n skippedTriggers: wire.skipped_triggers?.map((trigger) => ({\n environmentId: trigger.environment_id,\n message: trigger.message,\n reason: trigger.reason,\n triggerId: trigger.trigger_id,\n })),\n };\n}\n","import type { DeploySuccessWireResponse } from \"./deploySuccessWireResponse.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n // Arrays are objects too; a deploy_success body or any of its parts must be a\n // plain object, never an array. (JSON cannot produce other non-plain objects\n // such as Date or Map, so excluding arrays is sufficient here.)\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isWireSuiteResult(value: unknown): boolean {\n if (!isRecord(value)) return false;\n if (typeof value.trigger_id !== \"string\") return false;\n if (\"created_suite_id\" in value)\n return typeof value.created_suite_id === \"string\";\n\n if (\"failure_reason\" in value)\n return typeof value.failure_reason === \"string\";\n\n if (\"duplicate_suite_id\" in value) {\n return (\n typeof value.duplicate_suite_id === \"string\" &&\n typeof value.skip_reason === \"string\"\n );\n }\n // A structurally-valid result (object with a string trigger_id) carrying no\n // known discriminator is a result arm added by a newer backend. Accept it so\n // an older SDK does not reject the whole response; mapSuiteResult maps it to\n // an explicit unrecognized outcome.\n return true;\n}\n\nfunction isEnvironment(value: unknown): boolean {\n if (!isRecord(value)) return false;\n if (typeof value.id !== \"string\") return false;\n if (typeof value.isStatic !== \"boolean\") return false;\n if (value.alias !== undefined && typeof value.alias !== \"string\")\n return false;\n return true;\n}\n\nfunction isSkippedDeployment(value: unknown): boolean {\n if (!isRecord(value)) return false;\n return typeof value.message === \"string\" && typeof value.reason === \"string\";\n}\n\nfunction isSkippedTrigger(value: unknown): boolean {\n if (!isRecord(value)) return false;\n return (\n typeof value.environment_id === \"string\" &&\n typeof value.message === \"string\" &&\n typeof value.reason === \"string\" &&\n typeof value.trigger_id === \"string\"\n );\n}\n\nfunction isDeploySuccessWireResponse(\n value: unknown,\n): value is DeploySuccessWireResponse {\n if (!isRecord(value)) return false;\n if (value.environment !== undefined && !isEnvironment(value.environment))\n return false;\n\n if (!Array.isArray(value.results) || !value.results.every(isWireSuiteResult))\n return false;\n\n if (\n value.skipped_deployment !== undefined &&\n !isSkippedDeployment(value.skipped_deployment)\n )\n return false;\n\n if (\n value.skipped_triggers !== undefined &&\n (!Array.isArray(value.skipped_triggers) ||\n !value.skipped_triggers.every(isSkippedTrigger))\n )\n return false;\n\n return true;\n}\n\n// Validate the deploy_success success body at runtime instead of trusting a\n// cast. `environment` is required to be present-or-explicitly-undefined; the\n// two skip fields are optional (older servers omit them).\nexport function parseDeploySuccessWireResponse(\n value: unknown,\n): DeploySuccessWireResponse | \"invalid\" {\n return isDeploySuccessWireResponse(value) ? value : \"invalid\";\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport { handleSuccessResponse } from \"./handleSuccessResponse.js\";\nimport { mapDeploySuccessResponse } from \"./mapDeploySuccessResponse.js\";\nimport { parseDeploySuccessWireResponse } from \"./parseDeploySuccessWireResponse.js\";\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\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\n let response: Response;\n let bodyText: string;\n try {\n 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 workspaceId: config.workspaceId,\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n // Override default timeout to 5 minutes. This gives extra room\n // for both (1) waiting for reconciliation (2) creating the run.\n signal: AbortSignal.timeout(5 * 60 * 1000),\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n\n // Reading the body stream is still a network operation; a failure here is\n // a network error, not a bad payload.\n bodyText = await response.text();\n } catch {\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 let rawBody: unknown;\n try {\n rawBody = JSON.parse(bodyText);\n } catch {\n return abortInvalidResponseBody(log, \"the response body was not JSON\");\n }\n\n const wire = parseDeploySuccessWireResponse(rawBody);\n if (wire === \"invalid\") {\n return abortInvalidResponseBody(\n log,\n \"the response body did not match the expected shape\",\n );\n }\n\n const data = mapDeploySuccessResponse(wire);\n return handleSuccessResponse(data, log);\n}\n\nfunction abortInvalidResponseBody(\n log: LogDriver,\n detail: string,\n): NotifyDeployStatus {\n log.error(`š« Invalid response from deploy_success (${detail}), aborting.`);\n return {\n abortReason: \"invalid-response-body\",\n httpStatus: undefined,\n outcome: \"aborted\",\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","const signedUrlPaths = {\n runInputsExecutables: \"/api/v0/run-inputs-executables-signed-urls\",\n teamStorage: \"/api/v0/team-storage-signed-url\",\n} as const;\n\nexport function buildSignedUrl({\n destinationFilePath,\n endpoint,\n serviceBase,\n workspaceId,\n}: {\n destinationFilePath: string | undefined;\n endpoint: keyof typeof signedUrlPaths;\n serviceBase: string;\n workspaceId: string | undefined;\n}): URL {\n const url = new URL(signedUrlPaths[endpoint], serviceBase);\n if (destinationFilePath !== undefined)\n url.searchParams.set(\"file\", destinationFilePath);\n if (workspaceId !== undefined)\n url.searchParams.set(\"workspaceId\", workspaceId);\n return url;\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\";\nimport { buildSignedUrl } from \"./signed-url.js\";\n\nexport async function callGenerateSignedUrlForRunInputsExecutablesStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath, workspaceId }: GenerateSignedUrlConfig,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n buildSignedUrl({\n destinationFilePath,\n endpoint: \"runInputsExecutables\",\n serviceBase,\n workspaceId,\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 {\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\";\nimport { buildSignedUrl } from \"./signed-url.js\";\n\nexport async function callGenerateSignedUrlForTempTeamStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath, workspaceId }: Partial<GenerateSignedUrlConfig>,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n buildSignedUrl({\n destinationFilePath,\n endpoint: \"teamStorage\",\n serviceBase,\n workspaceId,\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 {\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 { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n NotifyTerminatedEphemeralEnvironmentAbortReason,\n NotifyTerminatedEphemeralEnvironmentInput,\n NotifyTerminatedEphemeralEnvironmentResult,\n TerminatedEphemeralEnvironmentSuccessResult,\n} from \"./types.js\";\n\nexport const notifyTerminatedEphemeralEnvironment = async (\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: NotifyTerminatedEphemeralEnvironmentInput,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> => {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/environment_terminated\", apiConfig.serviceBase),\n {\n body: JSON.stringify(config),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n if (!response.ok) return handleErrorResponse(response, log);\n const { environmentId } =\n (await response.json()) as TerminatedEphemeralEnvironmentSuccessResult;\n return { environmentId, outcome: \"success\" };\n } catch {\n log.error(`š« Network error from terminate_preview_environment, aborting.`);\n return {\n abortReason: \"network-error\",\n outcome: \"aborted\",\n };\n }\n};\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> {\n const status = response.status;\n let abortReason: NotifyTerminatedEphemeralEnvironmentAbortReason;\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 === 409) abortReason = \"409-conflict\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"notifyTerminatedEphemeralEnvironment\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\n\nimport type { PollCiGreenlightStatus } from \"./types.js\";\n\n/**\n * Build the result for a completed run\n */\nexport function buildCompletedRunResult(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): PollCiGreenlightStatus {\n if (status.greenlight)\n return { greenlightStatus: status, outcome: \"success\" };\n else return { greenlightStatus: status, outcome: \"failed\" };\n}\n","import type { PollCiGreenlightPollConfig } from \"./types.js\";\n\n/**\n * Safe default values for polling configuration.\n * If you change these values, make sure you update the JSDoc\n * comments in the PollCiGreenlightPollConfig type.\n */\nexport const pollCiGreenlightDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000, // 2 hours\n retryInterval: 10 * 1000, // 10 seconds\n runInProgressInterval: 30 * 1000, // 30 seconds\n runUnderReviewInterval: 60 * 1000, // 60 seconds\n};\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport type { CiGreenlightBugData } from \"./ci-greenlight-bug-data.js\";\nimport { logFetchError } from \"./log.js\";\n\nexport type {\n CiGreenlightBugData,\n CiGreenlightBugDetails,\n} from \"./ci-greenlight-bug-data.js\";\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n};\n\nexport type CiGreenlightStatusExtended = {\n relevantRunWithBugsUrl: 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 CiGreenlightStatusExtended)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData &\n CiGreenlightStatusExtended)\n | ({\n greenlight: false;\n runStage: \"initializing\";\n } & Partial<CiGreenlightStatusExtended>)\n | ({\n greenlight: false;\n /**\n * Human-readable copy explaining why the run was canceled, when the\n * server provides it.\n */\n message?: string;\n /**\n * Stable, machine-readable code for why the run was canceled, when the\n * server provides it. Treat as an open set of values.\n */\n reason?: string;\n runStage: \"canceled\";\n } & Partial<CiGreenlightStatusExtended>)\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 {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { fetchCiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { sleep } from \"../../../other.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport type {\n MakePollCiGreenlightStatusIteratorParams,\n PollCiGreenlightIteration,\n} from \"./types.js\";\n\n/**\n * Creates an async generator that yields CI greenlight status updates or abort notifications.\n *\n * This low-level API gives you full control over the polling loop, allowing you to:\n * - Inspect status after each fetch\n * - Break out of the loop based on custom criteria\n * - Add custom logging or side effects\n * - Handle abort conditions without exceptions\n *\n * The iterator yields a discriminated union with `isAborted` property:\n * - `isAborted: false` - Normal status update with run information\n * - `isAborted: true` - Terminal condition (timeout, error, canceled, etc.)\n *\n * Note: This function does not throw errors. All error conditions are yielded as\n * abort results that you must check and handle.\n *\n * @example\n * ```typescript\n * const greenlightIterator = makePollCiGreenlightStatusIterator({ runId: \"my-run-id\" });\n *\n * for await (const lastPoll of greenlightIterator) {\n * // Check for abort conditions first\n * if (lastPoll.isAborted) {\n * console.error(`Aborted: ${lastPoll.abortReason}`);\n * process.exit(1);\n * }\n *\n * // Handle normal status updates\n * const { status } = lastPoll;\n * console.log(`Current stage: ${status.runStage}`);\n *\n * // Exit with error if run reached a terminal stage without greenlight\n * if (lastPoll.isFailedTerminalStage) {\n * process.exit(1);\n * }\n * }\n * ```\n *\n */\nexport async function* makePollCiGreenlightStatusIterator(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n { runId, ...pollConfig }: MakePollCiGreenlightStatusIteratorParams,\n): AsyncGenerator<PollCiGreenlightIteration, void, unknown> {\n const { log } = deps;\n\n const {\n maxRetries = pollCiGreenlightDefaults.maxRetries,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n retryInterval = pollCiGreenlightDefaults.retryInterval,\n runInProgressInterval = pollCiGreenlightDefaults.runInProgressInterval,\n runUnderReviewInterval = pollCiGreenlightDefaults.runUnderReviewInterval,\n } = pollConfig;\n\n let retries = 0;\n let previousStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= pollTimeout) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n { runId },\n deps,\n );\n\n const elapsedMs = Date.now() - startedAt;\n\n if (!responseState.ok && !responseState.canRetry) {\n yield {\n abortReason: \"4XX-client-error\",\n elapsedMs,\n httpStatus: responseState.httpStatus,\n isAborted: true,\n };\n return;\n }\n\n if (!responseState.ok) {\n retries += 1;\n const { errorType, httpStatus } = responseState;\n if (retries > maxRetries) {\n switch (errorType) {\n case \"network\":\n yield {\n abortReason: \"network-error\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n break;\n case \"not-found\":\n yield {\n abortReason: \"404-run-not-found\",\n elapsedMs,\n httpStatus: httpStatus ?? 404,\n isAborted: true,\n };\n break;\n case \"server\":\n yield {\n abortReason: \"5XX-server-error\",\n elapsedMs,\n httpStatus: httpStatus ?? 500,\n isAborted: true,\n };\n break;\n default:\n throw Error(`Unexpected error type: ${errorType satisfies never}`);\n }\n return;\n }\n\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n\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\n // Success - reset retry counter\n retries = 0;\n const { greenlightStatus } = responseState;\n const stageChanged =\n !previousStatus || previousStatus.runStage !== greenlightStatus.runStage;\n\n // Determine if this is a failed terminal stage\n const isFailedTerminalStage =\n greenlightStatus.runStage === \"canceled\" ||\n (greenlightStatus.runStage === \"completed\" &&\n greenlightStatus.greenlight === false);\n\n yield {\n elapsedMs,\n isAborted: false,\n isFailedTerminalStage,\n previousStatus,\n stageChanged,\n status: greenlightStatus,\n };\n\n // Update previous status for next iteration\n previousStatus = greenlightStatus;\n\n switch (greenlightStatus.runStage) {\n case \"canceled\": {\n yield {\n abortReason: \"run-canceled\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n }\n case \"completed\":\n return;\n case \"initializing\":\n await sleep(runInProgressInterval);\n break;\n case \"underReview\":\n await sleep(runUnderReviewInterval);\n break;\n default:\n throw Error(\n `Unexpected run stage: ${greenlightStatus satisfies never}`,\n );\n }\n }\n\n // Timeout\n yield {\n abortReason: \"poll-timed-out\",\n elapsedMs: Date.now() - startedAt,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { pluralize } from \"../../../other.js\";\n\n/**\n * Build log message for successful completed run\n */\nexport function buildSuccessLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const { nonBlockingBugsCount, relevantRunUrl } = status;\n const urlInfo = `See ${relevantRunUrl}`;\n\n return `ā
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\n/**\n * Build log message for failed completed run\n */\nexport function buildFailedLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const {\n blockingBugsCount,\n nonBlockingBugsCount,\n relevantRunWithBugsUrl,\n reproducedBugs,\n } = status;\n\n const blockingBugUrls = reproducedBugs\n .filter((bug) => bug.isBlocking)\n .map((bug) => bug.applicationUrl);\n const nonBlockingBugUrls = reproducedBugs\n .filter((bug) => !bug.isBlocking)\n .map((bug) => bug.applicationUrl);\n\n const blockingBugList = blockingBugUrls.map((url) => `\\n⢠${url}`).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\n return (\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}\n\n/**\n * Build log message for superseded run (aborting)\n */\nexport function buildSupersededAbortLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `ā Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`;\n}\n\n/**\n * Build log message for superseded run (continuing)\n */\nexport function buildSupersededContinueLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `Root run was superseded:${supersedingDetails}`;\n}\n\n/**\n * Build log messages for different run stages\n */\nexport function buildRunStageLogMessage(\n runStage: CiGreenlightStatus[\"runStage\"],\n relevantRunUrl: string,\n): string {\n const urlInfo = `See ${relevantRunUrl}`;\n\n switch (runStage) {\n case \"canceled\":\n return `š« Run was canceled. Aborting... Please contact support.\\n${urlInfo}`;\n case \"initializing\":\n return `ā³ Run is in progress... ${urlInfo}`;\n case \"underReview\":\n return `šµļø Run is under review... ${urlInfo}`;\n case \"completed\":\n // Completed is handled separately by buildSuccessLogMessage/buildFailedLogMessage\n throw Error(\n \"buildRunStageLogMessage should not be called for completed stage\",\n );\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n}\n","import type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n PollCiGreenlightIteratorHttpAborted,\n PollCiGreenlightIteratorNonHttpAborted,\n PollCiGreenlightStatus,\n} from \"./types.js\";\n\n/**\n * Handles aborted iterations from the CI greenlight poll iterator\n * and converts them to appropriate result objects with logging\n */\nexport function mapIteratorAbortToGreenlightStatus(\n iteration:\n | PollCiGreenlightIteratorHttpAborted\n | PollCiGreenlightIteratorNonHttpAborted,\n pollTimeout: number,\n deps: SdkDependencies,\n): PollCiGreenlightStatus {\n const { log } = deps;\n const { abortReason, httpStatus } = iteration;\n\n switch (abortReason) {\n case \"4XX-client-error\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"5XX-server-error\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"404-run-not-found\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"network-error\":\n log.error(`š« Unrecoverable network error from CI greenlight, aborting.`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"poll-timed-out\":\n log.warn(`ā Poll timed out after ${pollTimeout / 1000}s`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"run-canceled\":\n log.info(`Run was canceled`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"XXX-other-http-code\":\n log.error(\n `š« Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n default:\n throw Error(`Unexpected abort reason: ${abortReason satisfies never}`);\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { buildCompletedRunResult } from \"./buildCompletedRunResult.js\";\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./iterator.js\";\nimport {\n buildFailedLogMessage,\n buildRunStageLogMessage,\n buildSuccessLogMessage,\n buildSupersededAbortLogMessage,\n buildSupersededContinueLogMessage,\n} from \"./logging.js\";\nimport { mapIteratorAbortToGreenlightStatus } from \"./mapIteratorAbortToGreenlightStatus.js\";\nimport type {\n PollCiGreenlightParams,\n PollCiGreenlightStatus,\n} from \"./types.js\";\n\nexport async function pollCiGreenlightStatus(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n onRunStageChanged = () => undefined,\n runId,\n ...pollConfig\n }: PollCiGreenlightParams,\n): Promise<PollCiGreenlightStatus> {\n const { log } = deps;\n const {\n abortOnSuperseded = pollCiGreenlightDefaults.abortOnSuperseded,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n } = pollConfig;\n\n const iterator = makePollCiGreenlightStatusIterator(deps, apiConfig, {\n runId,\n ...pollConfig,\n });\n\n for await (const lastPoll of iterator) {\n if (lastPoll.isAborted)\n return mapIteratorAbortToGreenlightStatus(lastPoll, pollTimeout, deps);\n\n // Handle status iterations\n const { previousStatus, stageChanged, status } = lastPoll;\n\n // Call onRunStageChanged callback when stage changes\n if (stageChanged) {\n try {\n await onRunStageChanged(status, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n\n const { relevantRunId, relevantRunUrl, rootRunId, rootRunUrl, runStage } =\n status;\n\n // Superseded run handling\n const isSuperseded = rootRunId !== relevantRunId;\n const shouldAbortOnSuperseded = isSuperseded && abortOnSuperseded;\n if (shouldAbortOnSuperseded) {\n const message = buildSupersededAbortLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.warn(message);\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (isSuperseded) {\n const message = buildSupersededContinueLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.info(message);\n }\n\n switch (runStage) {\n case \"canceled\":\n case \"initializing\":\n case \"underReview\": {\n log.info(buildRunStageLogMessage(runStage, relevantRunUrl));\n break;\n }\n case \"completed\": {\n const result = buildCompletedRunResult(status);\n switch (result.outcome) {\n case \"aborted\": {\n break;\n }\n case \"failed\": {\n const message = buildFailedLogMessage(status);\n log.warn(message);\n break;\n }\n case \"success\": {\n const message = buildSuccessLogMessage(status);\n log.info(message);\n break;\n }\n default:\n throw Error(`Unexpected outcome: ${result satisfies never}`);\n }\n return result;\n }\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n }\n\n // This should never be reached as the iterator handles timeout\n throw Error(\"Iterator ended unexpectedly\");\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 { notifyTerminatedEphemeralEnvironment } from \"./domain/notifyTerminatedEphemeralEnvironment/index.js\";\nimport { pollCiGreenlightStatus } from \"./domain/pollCiGreenlight/index.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./domain/pollCiGreenlight/iterator.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 makePollCiGreenlightStatusIterator: makePollCiGreenlightStatusIterator.bind(\n null,\n deps,\n apiConfig,\n ),\n notifyTerminatedEphemeralEnvironment:\n notifyTerminatedEphemeralEnvironment.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/notifyTerminatedEphemeralEnvironment/types.js\";\nexport type * from \"./domain/pollCiGreenlight/types.js\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qawolf/ci-sdk",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A simple SDK for interacting with QAWolf in CI scripts.",
|
|
6
6
|
"keywords": [],
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"author": "Jules Sam. Randolph<jules@qawolf.com>",
|
|
9
|
-
"
|
|
9
|
+
"files": [
|
|
10
|
+
"/dist",
|
|
11
|
+
"/README.md"
|
|
12
|
+
],
|
|
10
13
|
"type": "module",
|
|
14
|
+
"sideEffects": false,
|
|
11
15
|
"exports": {
|
|
12
16
|
".": {
|
|
13
17
|
"types": "./dist/index.d.ts",
|
|
@@ -16,15 +20,11 @@
|
|
|
16
20
|
"default": "./dist/index.js"
|
|
17
21
|
}
|
|
18
22
|
},
|
|
19
|
-
"files": [
|
|
20
|
-
"/dist",
|
|
21
|
-
"/README.md"
|
|
22
|
-
],
|
|
23
23
|
"scripts": {
|
|
24
24
|
"build": "tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022",
|
|
25
25
|
"lint:ci": "npm run lint:non-fixable; NON_FIXABLE_EXIT=$?; npm run lint:fixable && exit $NON_FIXABLE_EXIT",
|
|
26
26
|
"lint:dev": "npm run lint:fixable",
|
|
27
|
-
"lint:fixable": "eslint . --fix --quiet &&
|
|
27
|
+
"lint:fixable": "eslint . --fix --quiet && oxfmt --write .",
|
|
28
28
|
"lint:non-fixable": "dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*'",
|
|
29
29
|
"prepublishOnly": "nx run ci-sdk:build",
|
|
30
30
|
"test": "NODE_OPTIONS=\"--experimental-vm-modules\" NODE_NO_WARNINGS=1 jest",
|