@qawolf/ci-sdk 0.23.1 → 1.1.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 +30 -198
- package/dist/index.cjs +632 -0
- package/dist/index.cjs.map +1 -0
- package/dist/{index.d.mts → index.d.cts} +6 -211
- package/dist/index.d.ts +6 -211
- package/dist/index.js +58 -1047
- package/dist/index.js.map +1 -1
- package/package.json +23 -25
- package/dist/index.mjs +0 -1610
- package/dist/index.mjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/other.ts","../src/lib/sdk/defaults/fetch.ts","../src/lib/sdk/defaults/log.ts","../src/lib/sdk/defaults/serviceBase.ts","../package.json","../src/lib/sdk/defaults/userAgent.ts","../src/lib/api/log.ts","../src/lib/sdk/domain/attemptDeploy/index.ts","../src/lib/api/generate-signed-url-for-run-inputs-executables.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.ts","../src/lib/api/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/legacy_previewTesting/constants.ts","../src/lib/sdk/domain/legacy_previewTesting/createEnvironmentVariables.ts","../src/lib/sdk/domain/legacy_previewTesting/findOrCreateEnvironment.ts","../src/lib/sdk/domain/legacy_previewTesting/findOrCreateTrigger.ts","../src/lib/sdk/domain/legacy_previewTesting/findRepositoryIdByName.ts","../src/lib/sdk/domain/legacy_previewTesting/getEnvironmentVariablesFromEnvironment.ts","../src/lib/sdk/domain/legacy_previewTesting/getTagsFromEnvironment.ts","../src/lib/sdk/domain/legacy_previewTesting/createEnvironmentAction.ts","../src/lib/sdk/domain/legacy_previewTesting/deleteEnvironment.ts","../src/lib/sdk/domain/legacy_previewTesting/getEnvironmentIdForBranch.ts","../src/lib/sdk/domain/legacy_previewTesting/deleteEnvironmentAction.ts","../src/lib/sdk/domain/legacy_previewTesting/index.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/poll-ci-greenlight.ts","../src/lib/api/graphql.ts","../src/lib/api/notify-vcs-branch-merge-canceled-mutation.ts","../src/lib/sdk/domain/vcsBranchTesting/lib/domain-failure.ts","../src/lib/sdk/domain/vcsBranchTesting/lib/retry.ts","../src/lib/sdk/domain/vcsBranchTesting/notify-vcs-branch-merge-canceled.ts","../src/lib/api/notify-vcs-branch-merge-completed-mutation.ts","../src/lib/sdk/domain/vcsBranchTesting/notify-vcs-branch-merge-completed.ts","../src/lib/api/notify-vcs-branch-build-deployed-mutation.ts","../src/lib/sdk/domain/vcsBranchTesting/notifyVCSBranchBuildDeployed/index.ts","../src/lib/sdk/domain/vcsBranchTesting/lib/aliases.ts","../src/lib/sdk/domain/vcsBranchTesting/index.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","getBackoffMs","attemptNumber","minWaitMs","maxWaitMs","Math","min","buildFetchWithTimeout","fetch","timeout","args","signal","AbortSignal","defaultFetch","globalThis","defaultLogDriver","error","message","console","info","log","warn","defaultServiceBase","defaultUserAgent","version","logFetchError","methodName","response","ok","eventId","failureMessage","body","json","catch","text","undefined","eventIdSuffix","messageSuffix","statusText","status","attemptNotifyDeploy","deps","apiConfig","config","localFetch","URL","serviceBase","JSON","stringify","branch","commit_url","commitUrl","deduplication_key","deduplicationKey","deployment_type","deploymentType","deployment_url","deploymentUrl","hosting_service","hostingService","merge_request_number","mergeRequestNumber","pull_request_number","pullRequestNumber","repository","sha","variables","headers","Authorization","apiKey","userAgent","method","handleErrorResponse","data","handleSuccessResponse","abortReason","httpStatus","outcome","environment","results","isPreviewDeployment","isStatic","logPrefix","alias","id","length","environmentId","runId","failReason","failedTrigger","find","t","failure_reason","duplicateSuite","duplicate_suite_id","successfulTrigger","created_suite_id","callGenerateSignedUrlForRunInputsExecutablesStorage","destinationFilePath","encodeURIComponent","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","e","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","qawolfBaseUrl","qawolfGraphQLEndpoint","previewDeploymentType","createEnvironmentVariables","environmentVariableRequests","Object","keys","map","key","value","query","name","all","findOrCreateEnvironment","baseEnvironmentId","pr","qaWolfTeamId","retrievalResponse","where","deletedAt","equals","number","title","jsonResponse","environments","creationResponse","operationName","teamId","createionResponseJson","createEnvironment","Error","multiBranchResponse","multiBranchResponseJson","hasMultipleBranches","teamBranches","sourceEnvironmentResponse","sourceEnvironmentJson","baseBranchId","branchId","targetBranchId","promotionResponse","sourceTeamBranchId","targetTeamBranchId","promotionResponseJson","findOrCreateTrigger","repositoryId","tags","triggerName","environment_id","retrievalResponseJson","triggers","triggerId","codeHostingServiceRepositoryId","deploymentBranches","deploymentEnvironment","deploymentProvider","tag_ids","tag","creationResponseJson","createTrigger","findRepositoryIdByName","headRepoFullName","externalFullName","responseJson","repositories","codeHostingServiceRepositories","getEnvironmentVariablesFromEnvironment","parse","variablesJSON","getTagsFromGenericTriggerInEnvironment","createEnvironmentAction","baseEnvironmentVariablesJSON","combinedEnvironmentVariables","join","deleteEnvironment","getEnvironmentIdForBranch","deployment_branches","contains","deleteEnvironmentAction","testPreview","repoFullName","removeEnvironment","fetchCiGreenlightStatus","resp","greenlightStatus","canRetry","errorType","safeDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","pollCiGreenlightStatus","onRunStageChanged","pollConfig","retries","currentStatus","startedAt","Date","now","hasTimedOut","retryLabel","previousStatus","runStage","urlInfo","relevantRunUrl","greenlight","relevantRunId","relevantRunWithBugsUrl","rootRunId","rootRunUrl","supersedingDetails","blockingBugsCount","blockingBugUrls","nonBlockingBugsCount","nonBlockingBugUrls","blockingBugList","url","nonBlockingBugList","bugsListInText","GraphQLBadResponseError","constructor","mapErrorCodeToAbortReason","errorCode","qawolfGraphql","queryGql","rawBody","errors","firstError","extensions","code","isGqlError","responseBody","logGraphQLError","payload","mutationName","mutationGql","callNotifyVCSBranchMergeCanceledMutation","headEnvironmentAlias","domainFailureToAbortResult","result","failureCode","failureDetails","retryWithExponentialBackoff","retriableAbortReasons","runOnce","includes","backoffMs","secondsApproximation","toFixed","runNotifyVCSMergeCanceledOnce","input","notifyVCSBranchMergeCanceled","callNotifyVCSBranchMergeCompletedMutation","baseEnvironmentAlias","runNotifyVCSBranchMergeCompletedOnce","baseEnvironmentsMapping","baseVcsBranch","vcsBaseBranch","mapping","vcsBranch","environmentAlias","notifyVCSBranchMergeCompleted","callNotifyVCSBranchBuildDeployedMutation","concurrencyLimit","headEnvironmentName","headEnvironmentVariables","headVcsBranch","headVcsCommitId","headVcsCommitUrl","pullOrMergeRequestNumber","headEnvironmentVariablesJson","runNotifyVCSBranchBuildDeployedOnce","finalConcurrencyLimit","Infinity","Number","isNaN","isInteger","codeHostingInfo","codeHostingServiceInstallationPlatform","codeHostingServiceInstallationType","notifyVCSBranchBuildDeployed","pullRequestDetailsToEnvironmentAlias","codeHostingServiceOrganization","codeHostingServiceRepositoryName","pullRequestIdentifier","arbitraryStringToEnvironmentAlias","arbitraryString","slugify","lower","makeVCSBranchTestingSDK","bind","makeQaWolfSdk","experimental_removeEnvironment","experimental_testPreview","experimental_vcsBranchTesting"],"mappings":"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","file":"index.js","sourcesContent":["import { type FetchDriver } from \"./sdk/dependencies\";\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function pluralize(count: number) {\n return count === 1 ? \"\" : \"s\";\n}\n\nexport function getBackoffMs(\n attemptNumber: number,\n minWaitMs = 1000,\n maxWaitMs = 10000,\n): number {\n return Math.min(maxWaitMs, minWaitMs * 1.2 ** attemptNumber);\n}\n\nexport const buildFetchWithTimeout =\n (fetch: FetchDriver, timeout: number) =>\n async (...args: Parameters<FetchDriver>) =>\n fetch(args[0], { ...args[1], signal: AbortSignal.timeout(timeout) });\n","export const defaultFetch = globalThis.fetch;\n","import { type LogDriver } from \"../dependencies\";\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\": \"0.23.1\",\n \"description\": \"A simple SDK for interacting with QAWolf in CI scripts.\",\n \"type\": \"commonjs\",\n \"private\": false,\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.js\",\n \"import\": \"./dist/index.mjs\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022\",\n \"lint\": \"cycle-import-scan . && eslint . --ext js,jsx,mjs,ts,tsx --quiet && prettier --check .\",\n \"lint:fix\": \"eslint . --ext js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:warnings\": \"eslint . --ext js,jsx,mjs,ts,tsx\",\n \"test\": \"jest\",\n \"prepublishOnly\": \"nx run ci-sdk:build\",\n \"tsc:check\": \"tsc --noEmit\"\n },\n \"keywords\": [],\n \"author\": \"Jules Sam. Randolph<jules@qawolf.com>\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=16\"\n },\n \"devDependencies\": {\n \"tsup\": \"8.3.5\"\n },\n \"dependencies\": {\n \"@qawolf/ci-utils\": \"^1.0.0\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"files\": [\n \"/dist\",\n \"/README.md\"\n ]\n}\n","import { version } from \"../../../../package.json\";\n\nexport const defaultUserAgent = `ci-sdk/${version}`;\n","import { type LogDriver } from \"@qawolf/ci-utils\";\n\nexport async function logFetchError({\n log,\n methodName,\n response,\n}: {\n log: LogDriver;\n methodName: string;\n response: Response;\n}) {\n if (response.ok) return;\n\n const { eventId, failureMessage } = await (async () => {\n try {\n const body = (await response.json().catch(() => response.text())) as\n | Record<string, unknown>\n | string;\n if (typeof body === \"object\" && body !== null) {\n return {\n eventId: body.eventId,\n failureMessage: body.failureMessage,\n };\n }\n // If body is not an object (i.e., it's the text from catch)\n return {\n eventId: undefined,\n failureMessage: body,\n };\n } catch {\n // If both parsing attempts somehow fail\n return {\n eventId: undefined,\n failureMessage: undefined,\n };\n }\n })();\n\n const eventIdSuffix = eventId ? ` (Event ID: ${eventId})` : \"\";\n const messageSuffix = failureMessage ? `: ${failureMessage}` : \"\";\n\n const statusText =\n response.status >= 500\n ? \"Server Error\"\n : response.statusText || \"Unknown Error\";\n\n log.error(\n `❌ [${methodName}] ${response.status} ${statusText}${eventIdSuffix}${messageSuffix}`,\n );\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { logFetchError } from \"../../../api/log\";\nimport { type LogDriver, type SdkDependencies } from \"../../dependencies\";\n\nimport {\n type AttemptDeployHttpAbortReason,\n type DeployConfig,\n type DeployStatus,\n type NotifyDeployStatus,\n} from \"./types\";\n\nexport async function attemptNotifyDeploy(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: Partial<DeployConfig>,\n): Promise<NotifyDeployStatus> {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/deploy_success\", apiConfig.serviceBase),\n {\n body: JSON.stringify({\n branch: config.branch,\n commit_url: config.commitUrl,\n deduplication_key: config.deduplicationKey,\n deployment_type: config.deploymentType,\n deployment_url: config.deploymentUrl,\n 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 sha: config.sha,\n variables: config.variables,\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n const data = (await response.json()) as DeployStatus;\n return handleSuccessResponse(data, log);\n } catch (error) {\n log.error(`🚫 Network error from deploy_success, aborting.`);\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n}\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const status = response.status;\n let abortReason: AttemptDeployHttpAbortReason;\n if (status === undefined) abortReason = \"network-error\";\n else if (status === 401) abortReason = \"401-unauthorized\";\n else if (status === 403) abortReason = \"403-forbidden\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"attemptNotifyDeploy\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n\nasync function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const isPreviewDeployment = environment && !environment.isStatic;\n\n if (environment) {\n const logPrefix = environment.isStatic\n ? \"Static environment\"\n : \"Preview environment\";\n log.info(`${logPrefix}: ${environment.alias} (id: ${environment.id})`);\n }\n\n // No triggers were matched\n if (results.length === 0) {\n if (isPreviewDeployment) {\n log.info(\n `✅ Deployment notification was successful. No run was created for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n log.error(`🚫 No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n\n // If there are results, environment must be defined\n if (!environment) {\n log.error(`🚫 No environment matched the request. Please contact support.`);\n return { failReason: \"no-environment\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((t) => \"failure_reason\" in t);\n if (failedTrigger) {\n log.error(\n `🚫 Run could not be created. Reason: \"${failedTrigger.failure_reason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((t) => \"duplicate_suite_id\" in t);\n if (duplicateSuite) {\n log.info(\n `✅ Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicate_suite_id} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicate_suite_id,\n };\n }\n\n const successfulTrigger = results.find((t) => \"created_suite_id\" in t);\n if (!successfulTrigger) {\n log.error(`🚫 No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n log.info(\n `✅ Deployment notification was successful. Run created with ID: ${successfulTrigger.created_suite_id}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.created_suite_id,\n };\n}\n","import { type ApiConfig } from \"../api-types\";\nimport { type SdkDependencies } from \"../sdk/dependencies\";\nimport {\n type GenerateSignedUrlConfig,\n type GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types\";\n\nimport { logFetchError } from \"./log\";\n\nexport async function callGenerateSignedUrlForRunInputsExecutablesStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: GenerateSignedUrlConfig,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/run-inputs-executables-signed-urls?file=${encodeURIComponent(destinationFilePath)}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForRunInputsExecutablesStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { callGenerateSignedUrlForRunInputsExecutablesStorage } from \"../../../api/generate-signed-url-for-run-inputs-executables\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport {\n type GenerateSignedUrlAbortReason,\n type GenerateSignedUrlConfig,\n type GenerateSignedUrlStatus,\n} from \"./types\";\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\";\nimport { type SdkDependencies } from \"../sdk/dependencies\";\nimport {\n type GenerateSignedUrlConfig,\n type GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types\";\n\nimport { logFetchError } from \"./log\";\n\nexport async function callGenerateSignedUrlForTempTeamStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: Partial<GenerateSignedUrlConfig>,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/team-storage-signed-url?file=${destinationFilePath}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForTempTeamStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { callGenerateSignedUrlForTempTeamStorage } from \"../../../api/generate-signed-url-for-team-storage\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { type GenerateSignedUrlConfig } from \"./types\";\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","export const qawolfBaseUrl = \"https://app.qawolf.com\";\nexport const qawolfGraphQLEndpoint = `${qawolfBaseUrl}/api/graphql`;\nexport const qawolfDeploySuccessEndpoint = `${qawolfBaseUrl}/api/webhooks/deploy_success`;\nexport const previewDeploymentType = \"qawolf-preview\";\n","import { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { qawolfGraphQLEndpoint } from \"./constants\";\n\nexport async function createEnvironmentVariables(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n environmentId,\n variables,\n }: {\n environmentId: string;\n variables: { [key: string]: string };\n },\n): Promise<void> {\n const environmentVariableRequests = Object.keys(variables).map(\n async (key) => {\n const value = variables[key];\n return deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `\n mutation UpsertEnvironmentVariable($environmentId: ID!, $value: String!, $name: String) {\n upsertEnvironmentVariable(environmentId: $environmentId, value: $value, name: $name) {\n id\n }\n }\n `,\n variables: {\n environmentId,\n name: key,\n value,\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n },\n );\n\n await Promise.all(environmentVariableRequests);\n}\n","/* eslint-disable @qawolf/max-lines -- Technical debt */\n\nimport { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { qawolfGraphQLEndpoint } from \"./constants\";\n\nexport interface EnvironmentCreationResponse {\n data: {\n createEnvironment: {\n branchId: string;\n id: string;\n };\n };\n}\n\nexport interface EnvironmentRetrievalResponse {\n data: {\n environments: Array<{\n id: string;\n }>;\n };\n}\n\ntype FindOrCreateEnvironmentParams = {\n baseEnvironmentId?: string;\n branch: string;\n pr?: {\n number: number;\n title: string;\n };\n qaWolfTeamId: string;\n};\n\ninterface TeamBranchesResponse {\n data: {\n teamBranches: {\n environments: {\n id: string;\n }[];\n id: string;\n }[];\n };\n}\n\ninterface SourceEnvironmentResponse {\n data: {\n environment: {\n branchId: string;\n id: string;\n };\n };\n}\n\n// eslint-disable-next-line @qawolf/restrict-names -- Migration debt, clean up when convenient\nexport async function findOrCreateEnvironment(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n baseEnvironmentId,\n branch,\n pr,\n qaWolfTeamId,\n }: FindOrCreateEnvironmentParams,\n): Promise<string> {\n const retrievalResponse = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `\n query Environments($where: EnvironmentWhereInput) {\n environments(where: $where) {\n id\n }\n }\n `,\n variables: {\n where: {\n deletedAt: {\n equals: null,\n },\n name: {\n equals: pr\n ? `[PR] #${pr.number} - ${pr.title}`\n : `[Preview] ${branch}`,\n },\n },\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const jsonResponse =\n (await retrievalResponse.json()) as EnvironmentRetrievalResponse;\n\n if (jsonResponse.data.environments[0]) {\n const environmentId = jsonResponse.data.environments[0].id;\n deps.log.info(`Environment already exists with ID: ${environmentId}`);\n return environmentId;\n }\n\n const creationResponse = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n operationName: \"createEnvironment\",\n query: `\n mutation createEnvironment($name: String!, $teamId: String!) {\n createEnvironment(name: $name, teamId: $teamId) {\n id\n branchId\n }\n }\n `,\n variables: {\n name: pr ? `[PR] #${pr.number} - ${pr.title}` : `[Preview] ${branch}`,\n teamId: qaWolfTeamId,\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const createionResponseJson =\n (await creationResponse.json()) as EnvironmentCreationResponse;\n\n deps.log.info(\n `Environment response: ${JSON.stringify(createionResponseJson)}`,\n );\n\n if (!createionResponseJson.data.createEnvironment.id)\n throw Error(\"Environment ID not found in response\");\n\n const multiBranchResponse = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `\n query teamBranches($teamId: String!) {\n teamBranches: activeTeamBranches(teamId: $teamId) {\n id\n environments{\n id\n }\n }\n }\n `,\n variables: {\n teamId: qaWolfTeamId,\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const multiBranchResponseJson =\n (await multiBranchResponse.json()) as TeamBranchesResponse;\n\n const hasMultipleBranches =\n multiBranchResponseJson.data.teamBranches.length > 1;\n\n if (!hasMultipleBranches)\n return createionResponseJson.data.createEnvironment.id;\n\n const sourceEnvironmentResponse = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `\n query EnvironmentWithBranch($where: EnvironmentWhereUniqueInput!) {\n environment(where: $where) {\n id\n branchId\n }\n }\n `,\n variables: {\n where: {\n id: baseEnvironmentId,\n },\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const sourceEnvironmentJson =\n (await sourceEnvironmentResponse.json()) as SourceEnvironmentResponse;\n const baseBranchId = sourceEnvironmentJson.data.environment.branchId;\n const targetBranchId = createionResponseJson.data.createEnvironment.branchId;\n\n if (!baseBranchId) throw Error(\"Base branch ID not found in response\");\n\n deps.log.info(\n `Promoting workflows from branch ${baseBranchId} to ${targetBranchId}`,\n );\n\n const promotionResponse = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `\n mutation PromoteWorkflowsToBranch(\n $sourceTeamBranchId: String!\n $targetTeamBranchId: String!\n ) {\n promoteWorkflowsToBranch(\n mergeStrategy: overwrite\n sourceTeamBranchId: $sourceTeamBranchId\n targetTeamBranchId: $targetTeamBranchId\n )\n }\n `,\n variables: {\n sourceTeamBranchId: baseBranchId,\n targetTeamBranchId: targetBranchId,\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const promotionResponseJson = await promotionResponse.json();\n\n if (!promotionResponseJson) throw Error(\"Promotion failed\");\n\n return createionResponseJson.data.createEnvironment.id;\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { previewDeploymentType, qawolfGraphQLEndpoint } from \"./constants\";\n\ninterface TriggerCreationResponse {\n data: {\n createTrigger: {\n id: string;\n };\n };\n}\n\ninterface TriggerRetrievalResponse {\n data: {\n triggers: Array<{\n environment_id: string;\n id: string;\n }>;\n };\n}\n\ninterface FindOrCreateTriggerParams {\n branch: string;\n environmentId: string;\n pr: { number: number; title: string } | undefined;\n qaWolfTeamId: string;\n repositoryId: string | undefined;\n tags: { id: string }[] | undefined;\n}\n\n// eslint-disable-next-line @qawolf/restrict-names -- Migration debt, clean up when convenient\nexport async function findOrCreateTrigger(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n args: FindOrCreateTriggerParams,\n): Promise<string> {\n const { branch, environmentId, pr, qaWolfTeamId, repositoryId, tags } = args;\n const triggerName = `Deployments of ${\n pr ? `PR #${pr.number} - ${pr.title}` : `branch ${branch}`\n }`;\n const retrievalResponse = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `query getTriggersForBranch($where: TriggerWhereInput) {\n triggers(where: $where) {\n environment_id\n id\n }\n }\n `,\n variables: {\n where: {\n environment_id: {\n equals: environmentId,\n },\n name: {\n equals: triggerName,\n },\n },\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const retrievalResponseJson =\n (await retrievalResponse.json()) as TriggerRetrievalResponse;\n\n if (retrievalResponseJson.data.triggers[0]) {\n const triggerId = retrievalResponseJson.data.triggers[0].id;\n const environmentId = retrievalResponseJson.data.triggers[0].environment_id;\n deps.log.info(\n `Trigger with name ${triggerName} already exists with id ${triggerId} in environment ${environmentId}`,\n );\n return triggerId;\n }\n\n const creationResponse = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n operationName: \"createTrigger\",\n query: `\n mutation createTrigger(\n $codeHostingServiceRepositoryId: ID!,\n $deploymentBranches: String!,\n $deploymentEnvironment: String!,\n $deploymentProvider: String!,\n $environmentId: ID!,\n $name: String!,\n $teamId: ID!,\n $tag_ids: [ID!]\n ) {\n createTrigger(\n codeHostingServiceRepositoryId: $codeHostingServiceRepositoryId,\n deployment_branches: $deploymentBranches,\n deployment_environment: $deploymentEnvironment,\n deployment_provider: $deploymentProvider,\n environment_id: $environmentId,\n name: $name,\n team_id: $teamId,\n tag_ids: $tag_ids\n ) {\n id\n __typename\n }\n }\n `,\n variables: {\n codeHostingServiceRepositoryId: repositoryId,\n deploymentBranches: branch,\n deploymentEnvironment: previewDeploymentType,\n deploymentProvider: \"generic\",\n environmentId,\n name: triggerName,\n tag_ids: tags?.map((tag) => tag.id),\n teamId: qaWolfTeamId,\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const creationResponseJson =\n (await creationResponse.json()) as TriggerCreationResponse;\n\n deps.log.info(`Trigger response: ${JSON.stringify(creationResponseJson)}`);\n\n const triggerId = creationResponseJson.data?.createTrigger?.id;\n if (!triggerId) throw Error(\"Trigger ID not found in response\");\n\n deps.log.info(`Trigger created with ID: ${triggerId}`);\n return triggerId;\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { qawolfGraphQLEndpoint } from \"./constants\";\n\ninterface RepositoryResponse {\n data: {\n codeHostingServiceRepositories: Array<{\n id: string;\n }>;\n };\n}\n\nexport async function findRepositoryIdByName(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n headRepoFullName,\n }: {\n headRepoFullName: string;\n },\n): Promise<string | undefined> {\n const response = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `\n query codeHostingServiceRepositories($where: CodeHostingServiceRepositoryWhereInput) {\n codeHostingServiceRepositories(where: $where) {\n id\n }\n }\n `,\n variables: {\n where: {\n externalFullName: {\n equals: headRepoFullName,\n },\n },\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const responseJson = (await response.json()) as RepositoryResponse;\n deps.log.info(`Repository response: ${JSON.stringify(responseJson)}`);\n\n const repositories = responseJson.data.codeHostingServiceRepositories;\n if (!repositories[0]) return;\n\n return repositories[0].id;\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { qawolfGraphQLEndpoint } from \"./constants\";\n\ninterface EnvironmentVariablesRetrievalResponse {\n data: {\n environment: {\n id: string;\n variablesJSON: string;\n };\n };\n}\n\nexport async function getEnvironmentVariablesFromEnvironment(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n environmentId,\n }: {\n environmentId: string;\n },\n) {\n const retrievalResponse = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `\n query EnvironmentVariables($where: EnvironmentWhereUniqueInput!) {\n environment(where: $where) {\n id\n variablesJSON\n }\n }\n `,\n variables: {\n where: {\n id: environmentId,\n },\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const retrievalResponseJson =\n (await retrievalResponse.json()) as EnvironmentVariablesRetrievalResponse;\n\n if (!retrievalResponseJson.data.environment) {\n throw Error(\n `Environment not found with ID: ${environmentId}. Please check the environment ID is correct.`,\n );\n }\n\n return JSON.parse(retrievalResponseJson.data.environment.variablesJSON);\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { qawolfGraphQLEndpoint } from \"./constants\";\n\ninterface GenericTriggerTagsFromEnvironmentResponse {\n data: {\n environment: {\n id: string;\n triggers: {\n id: string;\n tags: {\n id: string;\n name: string;\n }[];\n }[];\n };\n };\n}\n\nexport async function getTagsFromGenericTriggerInEnvironment(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n environmentId,\n }: {\n environmentId: string;\n },\n): Promise<{ id: string; name: string }[] | undefined> {\n const retrievalResponse = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `\n query GenericTriggerTagsFromEnvironment($where: EnvironmentWhereUniqueInput!) {\n environment(where: $where) {\n id\n triggers(where: {deployment_provider: {equals: \"generic\"}}) {\n id\n tags {\n id\n name\n }\n }\n }\n }\n `,\n variables: {\n where: {\n id: environmentId,\n },\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const retrievalResponseJson =\n (await retrievalResponse.json()) as GenericTriggerTagsFromEnvironmentResponse;\n\n if (!retrievalResponseJson.data.environment) {\n throw Error(\n `Environment not found with ID: ${environmentId}. Please check the environment ID is correct.`,\n );\n }\n\n return retrievalResponseJson.data.environment.triggers[0]?.tags?.map(\n (tag) => tag,\n );\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { createEnvironmentVariables } from \"./createEnvironmentVariables\";\nimport { findOrCreateEnvironment } from \"./findOrCreateEnvironment\";\nimport { findOrCreateTrigger } from \"./findOrCreateTrigger\";\nimport { findRepositoryIdByName } from \"./findRepositoryIdByName\";\nimport { getEnvironmentVariablesFromEnvironment } from \"./getEnvironmentVariablesFromEnvironment\";\nimport { getTagsFromGenericTriggerInEnvironment } from \"./getTagsFromEnvironment\";\n\ntype CreateEnvironmentActionArgs = {\n baseEnvironmentId?: string;\n branch: string;\n deploymentUrl?: string;\n headRepoFullName: string;\n pr?: {\n number: number;\n title: string;\n };\n qaWolfTeamId: string;\n variables: { [key: string]: string };\n};\n\nexport const createEnvironmentAction = async (\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n baseEnvironmentId,\n branch,\n deploymentUrl,\n headRepoFullName,\n pr,\n qaWolfTeamId,\n variables,\n }: CreateEnvironmentActionArgs,\n) => {\n deps.log.info(\"Creating environment for pull request...\");\n const environmentId = await findOrCreateEnvironment(deps, apiConfig, {\n baseEnvironmentId,\n branch,\n pr,\n qaWolfTeamId,\n });\n deps.log.info(`Environment created with ID: ${environmentId}`);\n\n const baseEnvironmentVariablesJSON = baseEnvironmentId\n ? await getEnvironmentVariablesFromEnvironment(deps, apiConfig, {\n environmentId: baseEnvironmentId,\n })\n : {};\n\n if (typeof baseEnvironmentVariablesJSON !== \"object\") {\n deps.log.error(\"baseEnvironmentVariablesJSON is not an object\");\n throw Error(\"baseEnvironmentVariablesJSON is not an object\");\n }\n\n const combinedEnvironmentVariables = {\n ...baseEnvironmentVariablesJSON,\n ...variables,\n ...(deploymentUrl ? { URL: deploymentUrl } : {}),\n };\n\n deps.log.info(\"Creating environment variables...\");\n await createEnvironmentVariables(deps, apiConfig, {\n environmentId,\n variables: combinedEnvironmentVariables,\n });\n deps.log.info(\n `Environment variables created for environment ID: ${environmentId}`,\n );\n\n deps.log.info(\"Retrieving repository ID...\");\n const repositoryId = await findRepositoryIdByName(deps, apiConfig, {\n headRepoFullName,\n });\n\n deps.log.info(\n repositoryId\n ? `Repository ID retrieved: ${repositoryId}`\n : \"Repository not integrated with QA Wolf, enable it in the settings page to get PR comments and checks.\",\n );\n\n const tags = baseEnvironmentId\n ? await getTagsFromGenericTriggerInEnvironment(deps, apiConfig, {\n environmentId: baseEnvironmentId,\n })\n : undefined;\n\n deps.log.info(`Tags retrieved: ${tags?.map((tag) => tag.name).join(\", \")}`);\n\n deps.log.info(\"Creating trigger for deployment...\");\n await findOrCreateTrigger(deps, apiConfig, {\n branch,\n environmentId,\n pr,\n qaWolfTeamId,\n repositoryId,\n tags,\n });\n};\n","import { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { qawolfGraphQLEndpoint } from \"./constants\";\n\nexport async function deleteEnvironment(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n environmentId,\n }: {\n environmentId: string;\n },\n): Promise<void> {\n await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `\n mutation deleteEnvironment($environmentId: ID!) {\n deleteEnvironment(environment_id: $environmentId) {\n id\n }\n }\n `,\n variables: {\n environmentId,\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n deps.log.info(`Environment deleted with ID: ${environmentId}`);\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { qawolfGraphQLEndpoint } from \"./constants\";\n\ninterface GetTriggersForBranchResponse {\n data: {\n triggers: Array<{\n environment_id: string;\n id: string;\n }>;\n };\n}\n\nexport async function getEnvironmentIdForBranch(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n branch: string,\n): Promise<string> {\n const response = await deps.fetch(qawolfGraphQLEndpoint, {\n body: JSON.stringify({\n query: `\n query getTriggersForBranch($where: TriggerWhereInput) {\n triggers(where: $where) {\n id\n environment_id\n }\n }\n `,\n variables: {\n where: {\n deployment_branches: {\n contains: branch,\n },\n },\n },\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n\n const responseJson = (await response.json()) as GetTriggersForBranchResponse;\n\n deps.log.info(`Trigger response: ${JSON.stringify(responseJson)}`);\n\n const triggers = responseJson.data.triggers;\n\n if (!triggers || !triggers[0])\n throw Error(`No environment found for branch: ${branch}`);\n\n return triggers[0].environment_id;\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { deleteEnvironment } from \"./deleteEnvironment\";\nimport { getEnvironmentIdForBranch } from \"./getEnvironmentIdForBranch\";\n\nexport const deleteEnvironmentAction = async (\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n branch,\n }: {\n branch: string;\n },\n) => {\n deps.log.info(\"Retrieving environment ID for deletion...\");\n const environmentId = await getEnvironmentIdForBranch(\n deps,\n apiConfig,\n branch,\n );\n\n deps.log.info(`Deleting environment with ID: ${environmentId}`);\n await deleteEnvironment(deps, apiConfig, { environmentId });\n};\n","import { type ApiConfig } from \"../../../api-types\";\nimport { type SdkDependencies } from \"../../dependencies\";\nimport { attemptNotifyDeploy } from \"../attemptDeploy\";\n\nimport { previewDeploymentType } from \"./constants\";\nimport { createEnvironmentAction as createEnvironment } from \"./createEnvironmentAction\";\nimport { deleteEnvironmentAction } from \"./deleteEnvironmentAction\";\n\nexport interface TestPreviewParams {\n baseEnvironmentId: string | undefined;\n branch: string;\n commitUrl: string;\n deploymentUrl: string | undefined;\n pr: { number: number; title: string } | undefined;\n qaWolfTeamId: string;\n repoFullName: string;\n sha: string;\n variables: { [key: string]: string };\n}\n\nexport async function testPreview(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: TestPreviewParams,\n) {\n await createEnvironment(deps, apiConfig, {\n baseEnvironmentId: config.baseEnvironmentId,\n branch: config.branch,\n deploymentUrl: config.deploymentUrl,\n headRepoFullName: config.repoFullName,\n pr: config.pr,\n qaWolfTeamId: config.qaWolfTeamId,\n variables: config.variables,\n });\n\n return attemptNotifyDeploy(deps, apiConfig, {\n branch: config.branch,\n commitUrl: config.commitUrl,\n deploymentType: previewDeploymentType,\n deploymentUrl: config.deploymentUrl,\n sha: config.sha,\n variables: config.variables,\n });\n}\n\nexport async function removeEnvironment(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: { branch: string },\n) {\n await deleteEnvironmentAction(deps, apiConfig, config);\n}\n","import { type ApiConfig } from \"../api-types\";\nimport { type SdkDependencies } from \"../sdk/dependencies\";\n\nimport { logFetchError } from \"./log\";\n\nexport type CiGreenlightBugDetails = {\n /**\n * The URL of this BR in the QAWolf application.\n */\n applicationUrl: string;\n /**\n * If this bug report is linked to an external issue, it will\n * show up here.\n */\n externalIssue:\n | {\n /**\n * The URL of the external issue in the external platform\n * application.\n */\n applicationUrl: string;\n /**\n * The ID of this issue in the external platform.\n */\n externalIssueId: string;\n /**\n * Lowercase platform name (e.g. \"jira\").\n */\n platform: string;\n }\n | undefined;\n /**\n * True if the bug is blocking.\n */\n isBlocking: boolean;\n /**\n * True if the bug has been found in this run.\n */\n isNew: boolean;\n /**\n * The name of this bug.\n */\n name: string;\n /**\n * The bug number.\n */\n number: number;\n /**\n * The priority of this bug.\n */\n priority: \"medium\" | \"unprioritized\" | \"low\" | \"high\" | \"urgent\";\n};\n\nexport type CiGreenlightBugData = {\n /**\n * The count of blocking bugs reproduced in the run.\n */\n blockingBugsCount: number;\n /**\n * The URLs of the blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: true`, reading\n * the `applicationUrl` field.\n */\n blockingBugUrls: string[];\n /**\n * The count of non-blocking bugs reproduced in the run.\n */\n nonBlockingBugsCount: number;\n /**\n * The URLs of the non-blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: false`, reading\n * the `applicationUrl` field.\n */\n nonBlockingBugUrls: string[];\n /**\n * Blocking bugs that were not reproduced in this run, but are still\n * opened in the run environment. This may happen when the run only covers a\n * subset of the workflows in environment.\n */\n otherBlockingBugsInEnvironment: CiGreenlightBugDetails[];\n /**\n * Bugs that were reproduced in this run. This includes newly found bugs.\n */\n reproducedBugs: CiGreenlightBugDetails[];\n};\n\n/**\n * @deprecated This type will be removed in the next major version. Use `CiGreenlightBugData` instead.\n */\nexport type CiGreenlightCompletedSuiteDetails = CiGreenlightBugData;\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n relevantRunWithBugsUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n workflowsDisabledAfterRunCount: number;\n workflowsInRunCount: number;\n workflowsUnderInvestigationCount: number;\n};\n\n/**\n * The status of a CI greenlight run. See the API documentation here for\n * more details: https://qawolf.notion.site/1b170576efea411fa785842a71e7c99e\n */\nexport type CiGreenlightStatus = CiGreenlightStatusBase &\n (\n | ({\n greenlight: boolean;\n runStage: \"completed\";\n } & CiGreenlightBugData)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData)\n | {\n greenlight: false;\n runStage: \"initializing\" | \"underReview\" | \"canceled\";\n }\n );\n\nexport async function fetchCiGreenlightStatus(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n {\n runId,\n }: {\n runId: string;\n },\n { fetch: localFetch, log }: SdkDependencies,\n) {\n try {\n const resp = await localFetch(\n new URL(\n `/api/v0/ci-greenlight/${encodeURIComponent(runId)}`,\n serviceBase,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"User-Agent\": userAgent,\n },\n },\n );\n\n if (resp.ok) {\n const greenlightStatus = (await resp.json()) as CiGreenlightStatus;\n return {\n greenlightStatus,\n httpStatus: resp.status,\n ok: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"fetchCiGreenlightStatus\",\n response: resp,\n });\n if (resp.status === 404) {\n return {\n canRetry: true,\n errorType: \"not-found\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n if (resp.status >= 500) {\n return {\n canRetry: true,\n errorType: \"server\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n return {\n canRetry: false,\n errorType: \"client\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n } catch (e) {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","/* eslint-disable @qawolf/max-lines -- Technical debt */\n\nimport { type ApiConfig } from \"../../api-types\";\nimport {\n type CiGreenlightStatus,\n fetchCiGreenlightStatus,\n} from \"../../api/ci-greenlight\";\nimport { pluralize, sleep } from \"../../other\";\nimport { type SdkDependencies } from \"../dependencies\";\n\nexport type PollCiGreenlightPollConfig = {\n /**\n * If true, the job will be aborted when a superseding run is detected.\n *\n * @default false\n */\n abortOnSuperseded: boolean;\n /**\n * Maximum number of network operations retries before aborting the job.\n *\n * @default 10\n */\n maxRetries: number;\n /**\n * Timeout in milliseconds before aborting this polling operation.\n *\n * @default 120 minutes\n */\n pollTimeout: number;\n /**\n * Interval in milliseconds between network operations retries.\n *\n * @default 10 seconds\n */\n retryInterval: number;\n /**\n * Interval in milliseconds between polling for a run in progress.\n *\n * @default 30 seconds\n */\n runInProgressInterval: number;\n /**\n * Interval in milliseconds between polling for a run under review.\n *\n * @default 60 minutes\n */\n runUnderReviewInterval: number;\n};\n\nexport type PollCiGreenlightHttpAbortReason =\n | \"4XX-client-error\"\n | \"404-run-not-found\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport type PollCiGreenlightNonHttpAbortReason =\n | \"poll-timed-out\"\n | \"run-canceled\"\n | \"network-error\"\n | \"superseded-run\";\n\nexport type PollCiGreenlightAbortReason =\n | PollCiGreenlightNonHttpAbortReason\n | PollCiGreenlightHttpAbortReason;\n\nexport type PollCiGreenlightStatus =\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * No blocking bugs were found in the run.\n */\n outcome: \"success\";\n }\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * Blocking bugs were found in the run.\n */\n outcome: \"failed\";\n }\n | {\n abortReason: PollCiGreenlightHttpAbortReason;\n httpStatus: number;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n }\n | {\n abortReason: PollCiGreenlightNonHttpAbortReason;\n httpStatus: undefined;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n };\n\nexport type PollCiGreenlightParams = {\n /**\n * Callback to be called when the lifecycle stage of the run changes.\n */\n onRunStageChanged?: (\n current: CiGreenlightStatus,\n previous: CiGreenlightStatus | undefined,\n ) => unknown | Promise<unknown>;\n runId: string;\n} & Partial<PollCiGreenlightPollConfig>;\n\n// If you change these values, make sure you update the JSDoc\n// comments in the PollConfig type.\nconst safeDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000,\n retryInterval: 10 * 1000,\n runInProgressInterval: 30 * 1000,\n runUnderReviewInterval: 60 * 1000,\n};\n\nexport async function pollCiGreenlightStatus(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n onRunStageChanged: onRunStageChanged = () => undefined,\n runId,\n ...pollConfig\n }: PollCiGreenlightParams,\n): Promise<PollCiGreenlightStatus> {\n let retries = 0;\n const { log } = deps;\n const {\n abortOnSuperseded = safeDefaults.abortOnSuperseded,\n maxRetries = safeDefaults.maxRetries,\n pollTimeout = safeDefaults.pollTimeout,\n retryInterval = safeDefaults.retryInterval,\n runInProgressInterval = safeDefaults.runInProgressInterval,\n runUnderReviewInterval = safeDefaults.runUnderReviewInterval,\n } = pollConfig;\n let currentStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n let hasTimedOut = false;\n while (!(hasTimedOut = Date.now() - startedAt > pollTimeout)) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n {\n runId,\n },\n deps,\n );\n if (!responseState.ok && !responseState.canRetry) {\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason: \"4XX-client-error\",\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n if (!responseState.ok) {\n // This is a non-OK retryable status.\n retries += 1;\n if (retries > maxRetries) {\n log.error(\n `🚫 Unrecoverable error${\n responseState.httpStatus\n ? ` (status ${responseState.httpStatus})`\n : \"\"\n } from CI greenlight, aborting after ${maxRetries} attempts.`,\n );\n if (responseState.errorType === \"network\") {\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n let abortReason: PollCiGreenlightAbortReason = \"XXX-other-http-code\";\n\n if (responseState.errorType === \"not-found\")\n abortReason = \"404-run-not-found\";\n else if (responseState.errorType === \"server\")\n abortReason = \"5XX-server-error\";\n else responseState satisfies never;\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n const { errorType, httpStatus } = responseState;\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n if (errorType === \"network\") log.warn(`❌ Network error${retryLabel}`);\n else if (errorType === \"not-found\")\n log.info(`⏳ Run not found${retryLabel}`);\n else if (errorType === \"server\") log.warn(`❌ Server error${retryLabel}`);\n\n await sleep(retryInterval);\n continue;\n }\n // responseState.ok === true\n retries = 0;\n const { greenlightStatus } = responseState;\n const previousStatus = currentStatus;\n currentStatus = greenlightStatus;\n if (\n !previousStatus ||\n previousStatus.runStage !== greenlightStatus.runStage\n ) {\n try {\n await onRunStageChanged(greenlightStatus, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n const urlInfo = `See ${greenlightStatus.relevantRunUrl}`;\n const {\n greenlight,\n relevantRunId,\n relevantRunUrl,\n relevantRunWithBugsUrl,\n rootRunId,\n rootRunUrl,\n runStage,\n } = greenlightStatus;\n if (rootRunId !== relevantRunId) {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n if (abortOnSuperseded) {\n log.warn(\n `❌ Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`,\n );\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n log.info(`Root run was superseded:${supersedingDetails}`);\n }\n if (runStage === \"completed\") {\n const {\n blockingBugsCount,\n blockingBugUrls = [],\n nonBlockingBugsCount,\n nonBlockingBugUrls = [],\n } = greenlightStatus;\n const blockingBugList = blockingBugUrls\n .map((url) => `\\n• ${url}`)\n .join(\"\");\n const nonBlockingBugList = nonBlockingBugUrls\n .map((url) => `\\n• ${url}`)\n .join(\"\");\n const bugsListInText = `${\n blockingBugUrls.length > 0 ? `\\nBLOCKING BUGS:${blockingBugList}` : \"\"\n }${\n nonBlockingBugUrls.length > 0\n ? `\\nNON BLOCKING BUGS:${nonBlockingBugList}`\n : \"\"\n }`;\n if (greenlight) {\n log.info(\n `✅ Run passed and no blocking bugs found${\n nonBlockingBugsCount > 0\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )} found`\n : \"\"\n }.\\n${urlInfo}`,\n );\n return { greenlightStatus, outcome: \"success\" };\n } else {\n log.warn(\n `❌ Run failed and ${blockingBugsCount} blocking bug${pluralize(\n blockingBugsCount,\n )} found${\n nonBlockingBugsCount\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )}`\n : \"\"\n }.\\nSee ${relevantRunWithBugsUrl}\\n` +\n \"You may review the priority of certain bugs to mark these non-blocking and retry the job.\\n\" +\n bugsListInText,\n );\n return { greenlightStatus, outcome: \"failed\" };\n }\n }\n if (runStage === \"canceled\") {\n log.info(\n `🚫 Run was canceled. Aborting... Please contact support.\\n${urlInfo}`,\n );\n return {\n abortReason: \"run-canceled\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n // Non-terminal run stages\n if (hasTimedOut) {\n log.warn(`❌ Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (runStage === \"initializing\") {\n log.info(`⏳ Run is in progress... ${urlInfo}`);\n await sleep(runInProgressInterval);\n } else if (runStage === \"underReview\") {\n log.info(`🕵️ Run is under review... ${urlInfo}`);\n await sleep(runUnderReviewInterval);\n } else throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n\n log.warn(`❌ Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n}\n","import { type ApiConfig } from \"../api-types\";\nimport { type LogDriver, type SdkDependencies } from \"../sdk/dependencies\";\n\nexport type GraphQLErrorAbortReason =\n | \"invalid-input\"\n | \"forbidden\"\n | \"server-error\"\n | \"network-error\"\n | \"unauthenticated\";\nexport type GraphQLErrorPayload = {\n abortReason: GraphQLErrorAbortReason;\n eventId?: string;\n isGqlError: true;\n};\n\nexport type GraphQLResponse<ResponseBody> =\n | { isGqlError: false; responseBody: ResponseBody }\n | GraphQLErrorPayload;\n\ntype RawErrorCode =\n | \"UNAUTHENTICATED\"\n | \"FORBIDDEN\"\n | \"INTERNAL\"\n | \"BAD_USER_INPUT\";\nexport type RawGraphqlResponse<QueryName extends string, ResponseBody> =\n | {\n data: {\n [_key in QueryName]: ResponseBody;\n };\n }\n | {\n errors: Array<{\n extensions?: {\n code?: RawErrorCode;\n eventId?: string;\n };\n message: string;\n }>;\n };\n\nclass GraphQLBadResponseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GraphQLBadResponseError\";\n }\n}\n\nfunction mapErrorCodeToAbortReason({\n errorCode,\n log,\n}: {\n errorCode?: RawErrorCode;\n log: LogDriver;\n}): GraphQLErrorAbortReason {\n switch (errorCode) {\n case \"BAD_USER_INPUT\":\n return \"invalid-input\";\n case \"FORBIDDEN\":\n return \"forbidden\";\n case \"INTERNAL\":\n return \"server-error\";\n case \"UNAUTHENTICATED\":\n return \"unauthenticated\";\n default:\n log.error(`Unknown error code. ${errorCode}`);\n return \"server-error\";\n }\n}\n\nexport async function qawolfGraphql<\n Variables extends Record<never, unknown>,\n QueryName extends string,\n>({\n apiConfig: { apiKey, serviceBase, userAgent },\n deps: { fetch: localFetch, log },\n name,\n query: queryGql,\n variables,\n}: {\n apiConfig: ApiConfig;\n deps: SdkDependencies;\n /**\n * `name` MUST match the name of the query/mutation in the passed `query`.\n */\n name: QueryName;\n query: string;\n variables: Variables;\n}): Promise<GraphQLResponse<unknown>> {\n try {\n const response = await localFetch(new URL(`/api/graphql`, serviceBase), {\n body: JSON.stringify({\n query: queryGql,\n variables,\n }),\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"post\",\n });\n let rawBody: RawGraphqlResponse<QueryName, unknown>;\n try {\n rawBody = (await response.json()) as RawGraphqlResponse<\n QueryName,\n unknown\n >;\n } catch (e) {\n throw new GraphQLBadResponseError(\n `[GraphQL] Unexpected response schema. Not valid JSON body.`,\n );\n }\n if (\"errors\" in rawBody) {\n // Log all errors\n for (const error of rawBody.errors)\n log.warn(`❌ [GraphQL] error: ${error.message}`);\n\n // Get the first error\n const firstError = rawBody.errors[0];\n const eventId = firstError?.extensions?.eventId;\n const errorCode = firstError?.extensions?.code;\n\n return {\n abortReason: mapErrorCodeToAbortReason({ errorCode, log }),\n eventId,\n isGqlError: true,\n };\n }\n\n if (!(\"data\" in rawBody)) {\n throw new GraphQLBadResponseError(\n `[GraphQL] Unexpected response schema. Missing 'data' in response body. This is a bug.`,\n );\n }\n if (!(name in rawBody.data)) {\n throw new GraphQLBadResponseError(\n `[GraphQL] Unexpected response schema. Missing 'data.${name}' in response body. This is a bug.`,\n );\n }\n return {\n isGqlError: false,\n responseBody: rawBody.data[name],\n };\n } catch (e) {\n if (e instanceof GraphQLBadResponseError) throw e;\n\n log.error(\n `❌ [GraphQL] network error: ${e instanceof Error ? e.message : e}`,\n );\n return {\n abortReason: \"network-error\",\n isGqlError: true,\n };\n }\n}\n\nexport function logGraphQLError({\n log,\n methodName,\n payload,\n}: {\n log: LogDriver;\n methodName: string;\n payload: GraphQLErrorPayload;\n}) {\n const eventIdSuffix = payload.eventId\n ? ` (Event ID: ${payload.eventId})`\n : \"\";\n\n switch (payload.abortReason) {\n case \"forbidden\":\n log.error(`❌ [${methodName}] Forbidden. Aborting${eventIdSuffix}`);\n break;\n case \"invalid-input\":\n log.error(\n `❌ [${methodName}] Bad GraphQL input. This is a bug. Aborting${eventIdSuffix}`,\n );\n break;\n case \"network-error\":\n log.error(`❌ [${methodName}] Network error. Aborting${eventIdSuffix}`);\n break;\n case \"server-error\":\n log.error(`❌ [${methodName}] Server error. Aborting${eventIdSuffix}`);\n break;\n case \"unauthenticated\":\n log.error(`❌ [${methodName}] Unauthenticated. Aborting${eventIdSuffix}`);\n break;\n default:\n payload.abortReason satisfies never;\n log.error(\n `❌ [${methodName}] Unknown error. ${payload.abortReason} This is a bug${eventIdSuffix}`,\n );\n }\n}\n","import { type ApiConfig } from \"../api-types\";\nimport { type SdkDependencies } from \"../sdk/dependencies\";\n\nimport { type GraphQLResponse, qawolfGraphql } from \"./graphql\";\n\nexport interface NotifyVCSBranchMergeCanceledMutationInput {\n headEnvironmentAlias: string;\n}\nconst mutationName = \"notifyVCSBranchMergeCanceled\" as const;\nconst mutationGql = `\nmutation NotifyVCSBranchMergeCanceled($headEnvironmentAlias: String!) {\n ${mutationName}(headEnvironmentAlias: $headEnvironmentAlias) {\n outcome\n failureCode\n failureDetails\n }\n}`;\n\nexport type NotifyVCSBranchMergeCanceledFailureCode =\n | \"invalid-input\"\n | \"head-environment-not-found\"\n | \"non-ephemeral-head-environment-violation\";\n\nexport type NotifyVCSBranchMergeCanceledResponseSchema =\n | {\n outcome: \"success\";\n }\n | {\n failureCode: NotifyVCSBranchMergeCanceledFailureCode;\n failureDetails: string;\n outcome: \"failed\";\n };\n\nexport async function callNotifyVCSBranchMergeCanceledMutation(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n { headEnvironmentAlias }: NotifyVCSBranchMergeCanceledMutationInput,\n) {\n return qawolfGraphql<{ headEnvironmentAlias: string }, typeof mutationName>({\n apiConfig,\n deps,\n name: mutationName,\n query: mutationGql,\n variables: {\n headEnvironmentAlias,\n },\n // The type coercion highlights that we don't have runtime schema validation\n }) as Promise<GraphQLResponse<NotifyVCSBranchMergeCanceledResponseSchema>>;\n}\n","import { type NotifyVCSBranchBuildDeployedFailureCode } from \"../../../../api/notify-vcs-branch-build-deployed-mutation\";\nimport { type NotifyVCSBranchMergeCanceledFailureCode } from \"../../../../api/notify-vcs-branch-merge-canceled-mutation\";\nimport { type NotifyVCSBranchMergeCompletedFailureCode } from \"../../../../api/notify-vcs-branch-merge-completed-mutation\";\nimport { type LogDriver } from \"../../../dependencies\";\n\ntype NotifyVCSBranchTestingFailureCodes =\n | NotifyVCSBranchBuildDeployedFailureCode\n | NotifyVCSBranchMergeCanceledFailureCode\n | NotifyVCSBranchMergeCompletedFailureCode;\n\nexport function domainFailureToAbortResult<\n FailureCodes extends NotifyVCSBranchTestingFailureCodes,\n>({\n log,\n methodName,\n result,\n}: {\n log: LogDriver;\n methodName: string;\n result: {\n failureCode: FailureCodes;\n failureDetails: string;\n };\n}): {\n abortReason: FailureCodes;\n outcome: \"aborted\";\n} {\n switch (result.failureCode) {\n case \"base-environment-not-found\":\n log.error(`❌ [${methodName}] Base environment not found. Aborting.`);\n return {\n abortReason: result.failureCode,\n outcome: \"aborted\",\n };\n case \"base-trigger-not-found\":\n log.error(\n `❌ [${methodName}] Base trigger not found. A QA Wolf representative should set this up for you. Aborting.`,\n );\n return {\n abortReason: result.failureCode,\n outcome: \"aborted\",\n };\n case \"head-environment-not-found\":\n log.error(`❌ [${methodName}] Head environment not found. Aborting.`);\n return {\n abortReason: result.failureCode,\n outcome: \"aborted\",\n };\n case \"head-trigger-not-found\":\n log.error(`❌ [${methodName}] Head trigger not found. Aborting.`);\n return {\n abortReason: result.failureCode,\n outcome: \"aborted\",\n };\n case \"invalid-input\":\n log.error(\n `❌ [${methodName}] Invalid input: ${result.failureDetails} Aborting.`,\n );\n return {\n abortReason: result.failureCode,\n outcome: \"aborted\",\n };\n case \"non-ephemeral-head-environment-violation\":\n log.error(\n `❌ [${methodName}] Non-ephemeral head environment violation. Aborting.`,\n );\n return {\n abortReason: result.failureCode,\n outcome: \"aborted\",\n };\n case \"repository-not-found\":\n log.error(\n `❌ [${methodName}] Repository not found: ${result.failureDetails} Aborting.`,\n );\n return {\n abortReason: result.failureCode,\n outcome: \"aborted\",\n };\n case \"run-creation-failed\":\n log.error(\n `❌ [${methodName}] Run creation failed: ${result.failureDetails}. Aborting.`,\n );\n return {\n abortReason: result.failureCode,\n outcome: \"aborted\",\n };\n default:\n result.failureCode satisfies never;\n throw Error(\n `[${methodName}] Unreachable code detected. This is a bug. ${result.failureCode}`,\n );\n }\n}\n","import { getBackoffMs, sleep } from \"../../../../other\";\nimport { type LogDriver } from \"../../../dependencies\";\n\ntype MinimalResult =\n | { outcome: \"success\" }\n | {\n abortReason: string;\n outcome: \"aborted\";\n };\n\nexport async function retryWithExponentialBackoff<\n Result extends MinimalResult,\n RetriableAbortReasons extends string[],\n>({\n log,\n maxRetries,\n methodName,\n retriableAbortReasons,\n runOnce,\n}: {\n log: LogDriver;\n maxRetries: number;\n methodName: string;\n retriableAbortReasons: RetriableAbortReasons;\n runOnce: () => Promise<Result>;\n}) {\n let attemptNumber = 0;\n let result: Result;\n do {\n attemptNumber++;\n log.info(`🔁 [${methodName}] Attempt ${attemptNumber}/${maxRetries + 1}.`);\n result = await runOnce();\n // If success or non-recoverable error, return immediately\n if (\n result.outcome === \"success\" ||\n !retriableAbortReasons.includes(result.abortReason)\n )\n return result;\n\n // Exit if max retries reached\n if (attemptNumber >= maxRetries + 1) return result;\n // Else, backoff and retry\n const backoffMs = getBackoffMs(attemptNumber);\n const secondsApproximation = (backoffMs / 1000).toFixed(1);\n log.warn(`⏳ [${methodName}] Retrying in ${secondsApproximation} seconds.`);\n await sleep(backoffMs);\n } while (true);\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { logGraphQLError } from \"../../../api/graphql\";\nimport { callNotifyVCSBranchMergeCanceledMutation } from \"../../../api/notify-vcs-branch-merge-canceled-mutation\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { domainFailureToAbortResult } from \"./lib/domain-failure\";\nimport { retryWithExponentialBackoff } from \"./lib/retry\";\nimport { type BaseVCSBranchConfig } from \"./types\";\n\nasync function runNotifyVCSMergeCanceledOnce(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n input: NotifyVCSBranchMergeCanceledInput,\n): Promise<NotifyMergeCanceledResult> {\n const log = deps.log;\n const { headEnvironmentAlias } = input;\n const resp = await callNotifyVCSBranchMergeCanceledMutation(deps, apiConfig, {\n headEnvironmentAlias,\n });\n if (resp.isGqlError) {\n logGraphQLError({\n log,\n methodName: \"notifyVCSBranchMergeCanceled\",\n payload: resp,\n });\n return {\n abortReason: resp.abortReason,\n eventId: resp.eventId,\n outcome: \"aborted\",\n };\n }\n const result = resp.responseBody;\n if (result.outcome === \"success\") {\n log.info(\n `✅ [notifyVCSBranchMergeCanceled] Successfully notified the CI system that the merge was canceled.`,\n );\n return {\n outcome: \"success\",\n };\n }\n\n result.outcome satisfies \"failed\";\n\n return domainFailureToAbortResult({\n log,\n methodName: \"notifyVCSBranchMergeCanceled\",\n result,\n });\n}\n\nexport async function notifyVCSBranchMergeCanceled(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n input: NotifyVCSBranchMergeCanceledInput,\n): Promise<NotifyMergeCanceledResult> {\n const { maxRetries = 10 } = input;\n return retryWithExponentialBackoff({\n log: deps.log,\n maxRetries,\n methodName: \"notifyVCSBranchMergeCanceled\",\n retriableAbortReasons: [\n \"network-error\",\n \"server-error\",\n ] as const satisfies NotifyMergeCanceledAbortReason[],\n runOnce: () => runNotifyVCSMergeCanceledOnce(deps, apiConfig, input),\n });\n}\n\nexport type NotifyVCSBranchMergeCanceledInput = {\n /**\n * A unique alias for the environment being tested. We recommend using either\n * `pullRequestDetailsToEnvironmentAlias` or the more generic\n * `arbitraryStringToEnvironmentAlias` to generate this value.\n */\n headEnvironmentAlias: string;\n} & BaseVCSBranchConfig;\n\nexport type NotifyMergeCanceledAbortReason =\n | \"forbidden\"\n | \"unauthenticated\"\n | \"network-error\"\n | \"server-error\"\n | \"invalid-input\"\n | \"head-environment-not-found\"\n | \"non-ephemeral-head-environment-violation\"\n | \"missing-vcs-branch-to-environment-alias-mapping\";\n\nexport type NotifyMergeCanceledResult =\n | {\n outcome: \"success\";\n }\n | {\n abortReason: NotifyMergeCanceledAbortReason;\n eventId?: string;\n outcome: \"aborted\";\n };\n","import { type ApiConfig } from \"../api-types\";\nimport { type SdkDependencies } from \"../sdk/dependencies\";\n\nimport { type GraphQLResponse, qawolfGraphql } from \"./graphql\";\n\nexport interface NotifyVCSBranchMergeCompletedMutationInput {\n baseEnvironmentAlias: string | undefined;\n headEnvironmentAlias: string;\n}\n\nconst mutationName = \"notifyVCSBranchMergeCompleted\" as const;\nconst mutationGql = `\nmutation NotifyVCSBranchMergeCompleted($baseEnvironmentAlias: String, $headEnvironmentAlias: String!) {\n${mutationName}(baseEnvironmentAlias: $baseEnvironmentAlias, headEnvironmentAlias: $headEnvironmentAlias) {\n outcome\n failureCode\n failureDetails\n }\n}`;\n\nexport type NotifyVCSBranchMergeCompletedFailureCode =\n | \"invalid-input\"\n | \"head-environment-not-found\"\n | \"base-environment-not-found\"\n | \"non-ephemeral-head-environment-violation\";\n\nexport type NotifyVCSBranchMergeCompletedResponseSchema =\n | {\n outcome: \"success\";\n }\n | {\n failureCode: NotifyVCSBranchMergeCompletedFailureCode;\n failureDetails: string;\n outcome: \"failed\";\n };\n\nexport async function callNotifyVCSBranchMergeCompletedMutation(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n baseEnvironmentAlias,\n headEnvironmentAlias,\n }: NotifyVCSBranchMergeCompletedMutationInput,\n) {\n return qawolfGraphql<\n {\n baseEnvironmentAlias: string | null;\n headEnvironmentAlias: string;\n },\n typeof mutationName\n >({\n apiConfig,\n deps,\n name: mutationName,\n query: mutationGql,\n variables: {\n baseEnvironmentAlias: baseEnvironmentAlias ?? null,\n headEnvironmentAlias,\n },\n // The type coercion highlights that we don't have runtime schema validation\n }) as Promise<GraphQLResponse<NotifyVCSBranchMergeCompletedResponseSchema>>;\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { logGraphQLError } from \"../../../api/graphql\";\nimport { callNotifyVCSBranchMergeCompletedMutation } from \"../../../api/notify-vcs-branch-merge-completed-mutation\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport { domainFailureToAbortResult } from \"./lib/domain-failure\";\nimport { retryWithExponentialBackoff } from \"./lib/retry\";\nimport {\n type BaseVCSBranchConfig,\n type PullRequestTestingLayout,\n} from \"./types\";\n\nasync function runNotifyVCSBranchMergeCompletedOnce(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n input: NotifyVCSBranchMergeCompletedInput,\n): Promise<NotifyMergeCompletedResult> {\n const log = deps.log;\n const { baseEnvironmentsMapping, baseVcsBranch: vcsBaseBranch } = input;\n const baseEnvironmentAlias = baseEnvironmentsMapping?.find(\n (mapping) => mapping.vcsBranch === vcsBaseBranch,\n )?.environmentAlias;\n\n if (baseEnvironmentAlias === undefined) {\n log.info(\n `ℹ️ [notifyVCSBranchMergeCompleted] Could not find a base environment for VCS branch '${vcsBaseBranch}'. Fall back to use the default base environment`,\n );\n }\n\n const resp = await callNotifyVCSBranchMergeCompletedMutation(\n deps,\n apiConfig,\n {\n baseEnvironmentAlias,\n headEnvironmentAlias: input.headEnvironmentAlias,\n },\n );\n if (resp.isGqlError) {\n logGraphQLError({\n log,\n methodName: \"notifyVCSBranchMergeCompleted\",\n payload: resp,\n });\n return {\n abortReason: resp.abortReason,\n eventId: resp.eventId,\n outcome: \"aborted\",\n };\n }\n const result = resp.responseBody;\n if (result.outcome === \"success\") {\n log.info(\n `✅ [notifyVCSBranchMergeCompleted] Successfully notified the CI system that the merge was completed.`,\n );\n return {\n outcome: \"success\",\n };\n }\n\n result.outcome satisfies \"failed\";\n\n return domainFailureToAbortResult({\n log,\n methodName: \"notifyVCSBranchMergeCompleted\",\n result,\n });\n}\n\nexport async function notifyVCSBranchMergeCompleted(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n input: NotifyVCSBranchMergeCompletedInput,\n): Promise<NotifyMergeCompletedResult> {\n const { maxRetries = 10 } = input;\n return retryWithExponentialBackoff({\n log: deps.log,\n maxRetries,\n methodName: \"notifyVCSBranchMergeCompleted\",\n retriableAbortReasons: [\n \"network-error\",\n \"server-error\",\n ] as const satisfies NotifyMergeCompletedResultAbortReason[],\n runOnce: () => runNotifyVCSBranchMergeCompletedOnce(deps, apiConfig, input),\n });\n}\n\nexport type NotifyVCSBranchMergeCompletedInput = PullRequestTestingLayout &\n BaseVCSBranchConfig;\n\nexport type NotifyMergeCompletedResultAbortReason =\n | \"forbidden\"\n | \"unauthenticated\"\n | \"network-error\"\n | \"server-error\"\n | \"invalid-input\"\n | \"head-environment-not-found\"\n | \"base-environment-not-found\"\n | \"non-ephemeral-head-environment-violation\"\n | \"missing-vcs-branch-to-environment-alias-mapping\";\n\nexport type NotifyMergeCompletedResult =\n | {\n outcome: \"success\";\n }\n | {\n abortReason: NotifyMergeCompletedResultAbortReason;\n eventId?: string;\n outcome: \"aborted\";\n };\n","import { type ApiConfig } from \"../api-types\";\nimport { type SdkDependencies } from \"../sdk/dependencies\";\n\nimport { type GraphQLResponse, qawolfGraphql } from \"./graphql\";\n\nexport interface NotifyVCSBranchBuildDeployedMutationInput {\n baseEnvironmentAlias: string | undefined;\n baseVcsBranch: string | undefined;\n concurrencyLimit: number | undefined;\n headEnvironmentAlias: string;\n headEnvironmentName: string;\n headEnvironmentVariables: Record<string, string>;\n headVcsBranch: string | undefined;\n headVcsCommitId: string;\n headVcsCommitUrl: string | undefined;\n pullOrMergeRequestNumber: number | undefined;\n}\n\nconst mutationName = \"notifyVCSBranchBuildDeployed\" as const;\n\nconst mutationGql = `\nmutation NotifyVCSBranchBuildDeployed(\n $headVcsCommitId: String!,\n $baseVcsBranch: String,\n $headEnvironmentVariablesJson: String!,\n $baseEnvironmentAlias: String,\n $headEnvironmentAlias: String!,\n $concurrencyLimit: Int,\n $headEnvironmentName: String,\n $headVcsBranch: String,\n $headVcsCommitUrl: String,\n $pullOrMergeRequestNumber: Int\n) {\n ${mutationName}(\n headVcsCommitId: $headVcsCommitId,\n baseVcsBranch: $baseVcsBranch,\n headEnvironmentVariablesJson: $headEnvironmentVariablesJson,\n baseEnvironmentAlias: $baseEnvironmentAlias,\n headEnvironmentAlias: $headEnvironmentAlias,\n concurrencyLimit: $concurrencyLimit,\n headEnvironmentName: $headEnvironmentName,\n headVcsBranch: $headVcsBranch,\n headVcsCommitUrl: $headVcsCommitUrl,\n pullOrMergeRequestNumber: $pullOrMergeRequestNumber\n ) {\n outcome\n codeHostingServiceInstallationPlatform\n failureCode\n failureDetails\n runId\n }\n}`;\n\nexport type NotifyVCSBranchBuildDeployedFailureCode =\n | \"invalid-input\"\n | \"base-environment-not-found\"\n | \"base-trigger-not-found\"\n | \"head-trigger-not-found\"\n | \"non-ephemeral-head-environment-violation\"\n | \"repository-not-found\"\n | \"run-creation-failed\";\n\nexport type NotifyVCSBranchBuildDeployedResponseSchema =\n | {\n codeHostingServiceInstallationPlatform: \"GitHub\" | \"GitLab\" | null;\n outcome: \"success\";\n runId: string;\n }\n | {\n failureCode: NotifyVCSBranchBuildDeployedFailureCode;\n failureDetails: string;\n outcome: \"failed\";\n };\n\nexport async function callNotifyVCSBranchBuildDeployedMutation(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n baseEnvironmentAlias,\n baseVcsBranch,\n concurrencyLimit,\n headEnvironmentAlias,\n headEnvironmentName,\n headEnvironmentVariables,\n headVcsBranch,\n headVcsCommitId,\n headVcsCommitUrl,\n pullOrMergeRequestNumber,\n }: NotifyVCSBranchBuildDeployedMutationInput,\n) {\n return qawolfGraphql<\n {\n baseEnvironmentAlias: string | null;\n baseVcsBranch: string | null;\n concurrencyLimit: number | null;\n headEnvironmentAlias: string;\n headEnvironmentName: string;\n headEnvironmentVariablesJson: string;\n headVcsBranch: string | null;\n headVcsCommitId: string;\n headVcsCommitUrl: string | null;\n pullOrMergeRequestNumber: number | null;\n },\n typeof mutationName\n >({\n apiConfig,\n deps,\n name: mutationName,\n query: mutationGql,\n variables: {\n baseEnvironmentAlias: baseEnvironmentAlias ?? null,\n baseVcsBranch: baseVcsBranch ?? null,\n concurrencyLimit: concurrencyLimit ?? null,\n headEnvironmentAlias,\n headEnvironmentName,\n headEnvironmentVariablesJson: JSON.stringify(headEnvironmentVariables),\n headVcsBranch: headVcsBranch ?? null,\n headVcsCommitId,\n headVcsCommitUrl: headVcsCommitUrl ?? null,\n pullOrMergeRequestNumber: pullOrMergeRequestNumber ?? null,\n },\n // The type coercion highlights that we don't have runtime schema validation\n }) as Promise<GraphQLResponse<NotifyVCSBranchBuildDeployedResponseSchema>>;\n}\n","import { type ApiConfig } from \"../../../../api-types\";\nimport { logGraphQLError } from \"../../../../api/graphql\";\nimport { callNotifyVCSBranchBuildDeployedMutation } from \"../../../../api/notify-vcs-branch-build-deployed-mutation\";\nimport { type SdkDependencies } from \"../../../dependencies\";\nimport { domainFailureToAbortResult } from \"../lib/domain-failure\";\nimport { retryWithExponentialBackoff } from \"../lib/retry\";\n\nimport {\n type NotifyBuildDeployedAbortReason,\n type NotifyBuildDeployedInput,\n type NotifyBuildDeployedResult,\n} from \"./types\";\n\nasync function runNotifyVCSBranchBuildDeployedOnce(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n input: NotifyBuildDeployedInput,\n): Promise<NotifyBuildDeployedResult> {\n const {\n baseEnvironmentsMapping,\n baseVcsBranch,\n concurrencyLimit,\n headEnvironmentAlias,\n headEnvironmentName,\n headEnvironmentVariables,\n headVcsBranch,\n headVcsCommitId,\n headVcsCommitUrl,\n pullOrMergeRequestNumber,\n } = input;\n const log = deps.log;\n const baseEnvironmentAlias = baseEnvironmentsMapping?.find(\n (mapping) => mapping.vcsBranch === baseVcsBranch,\n )?.environmentAlias;\n\n let finalConcurrencyLimit: number | undefined = concurrencyLimit;\n if (typeof concurrencyLimit === \"number\") {\n if (concurrencyLimit === Infinity) finalConcurrencyLimit = 0;\n else if (\n Number.isNaN(concurrencyLimit) ||\n !Number.isInteger(concurrencyLimit)\n ) {\n log.error(\n `❌ [notifyVCSBranchBuildDeployed] Invalid concurrency limit '${concurrencyLimit}'. Must be a positive integer.`,\n );\n return {\n abortReason: \"invalid-input\",\n outcome: \"aborted\",\n };\n }\n if (concurrencyLimit < 0) {\n log.error(\n `❌ [notifyVCSBranchBuildDeployed] Invalid concurrency limit '${concurrencyLimit}'. Must be a positive integer.`,\n );\n return {\n abortReason: \"invalid-input\",\n outcome: \"aborted\",\n };\n }\n }\n const resp = await callNotifyVCSBranchBuildDeployedMutation(deps, apiConfig, {\n baseEnvironmentAlias,\n baseVcsBranch,\n concurrencyLimit: finalConcurrencyLimit,\n headEnvironmentAlias,\n headEnvironmentName,\n headEnvironmentVariables,\n headVcsBranch,\n headVcsCommitId,\n headVcsCommitUrl,\n pullOrMergeRequestNumber,\n });\n if (resp.isGqlError) {\n logGraphQLError({\n log,\n methodName: \"notifyVCSBranchBuildDeployed\",\n payload: resp,\n });\n return {\n abortReason: resp.abortReason,\n eventId: resp.eventId,\n outcome: \"aborted\",\n };\n }\n const result = resp.responseBody;\n if (result.outcome === \"success\") {\n const codeHostingInfo =\n result.codeHostingServiceInstallationPlatform == null\n ? \"\"\n : `, and code hosting service integration '${result.codeHostingServiceInstallationPlatform}'.`;\n log.info(\n `✅ [notifyVCSBranchBuildDeployed] Success. Run was deployed with ID: '${result.runId}'${codeHostingInfo}`,\n );\n return {\n codeHostingServiceInstallationType:\n result.codeHostingServiceInstallationPlatform ?? undefined,\n outcome: \"success\",\n runId: result.runId,\n };\n }\n\n result.outcome satisfies \"failed\";\n\n return domainFailureToAbortResult({\n log,\n methodName: \"notifyVCSBranchBuildDeployed\",\n result,\n });\n}\n\nexport async function notifyVCSBranchBuildDeployed(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n input: NotifyBuildDeployedInput,\n): Promise<NotifyBuildDeployedResult> {\n const { maxRetries = 10 } = input;\n return retryWithExponentialBackoff({\n log: deps.log,\n maxRetries,\n methodName: \"notifyVCSBranchBuildDeployed\",\n retriableAbortReasons: [\n \"network-error\",\n \"server-error\",\n \"run-creation-failed\",\n ] as const satisfies NotifyBuildDeployedAbortReason[],\n runOnce: () => runNotifyVCSBranchBuildDeployedOnce(deps, apiConfig, input),\n });\n}\n\nexport type {\n NotifyBuildDeployedAbortReason,\n NotifyBuildDeployedInput,\n NotifyBuildDeployedResult,\n};\n","import slugify from \"slugify\";\n\n/**\n * Creates a compliant environment alias from pull request details.\n */\nexport function pullRequestDetailsToEnvironmentAlias({\n codeHostingServiceOrganization,\n codeHostingServiceRepositoryName,\n pullRequestIdentifier,\n}: {\n /**\n * The name of the Organization owning the VCS repository the current VCS\n * branch belongs to.\n */\n codeHostingServiceOrganization: string;\n /**\n * The name of the VCS repository the current VCS branch belongs to.\n */\n codeHostingServiceRepositoryName: string;\n /**\n * A unique identifier for this PR/MR. It must be unique for the repository\n * defined in `codeHostingServiceRepositoryName`.\n */\n pullRequestIdentifier: string;\n}): string {\n return arbitraryStringToEnvironmentAlias(\n `${codeHostingServiceOrganization}-${codeHostingServiceRepositoryName}-pr-${pullRequestIdentifier}`,\n );\n}\n\n/**\n * Creates a compliant environment alias from an arbitrary string.\n */\nexport function arbitraryStringToEnvironmentAlias(\n arbitraryString: string,\n): string {\n return slugify(arbitraryString, { lower: true });\n}\n","import { type ApiConfig } from \"../../../api-types\";\nimport { defaultFetch } from \"../../defaults/fetch\";\nimport { defaultLogDriver } from \"../../defaults/log\";\nimport { defaultServiceBase } from \"../../defaults/serviceBase\";\nimport { defaultUserAgent } from \"../../defaults/userAgent\";\nimport { type SdkDependencies } from \"../../dependencies\";\n\nimport {\n type NotifyMergeCanceledResult,\n type NotifyVCSBranchMergeCanceledInput,\n notifyVCSBranchMergeCanceled,\n} from \"./notify-vcs-branch-merge-canceled\";\nimport {\n type NotifyMergeCompletedResult,\n type NotifyVCSBranchMergeCompletedInput,\n notifyVCSBranchMergeCompleted,\n} from \"./notify-vcs-branch-merge-completed\";\nimport {\n type NotifyBuildDeployedInput,\n type NotifyBuildDeployedResult,\n notifyVCSBranchBuildDeployed,\n} from \"./notifyVCSBranchBuildDeployed\";\n\nexport * from \"./lib/aliases\";\nexport type {\n NotifyMergeCanceledResult,\n NotifyVCSBranchMergeCanceledInput,\n} from \"./notify-vcs-branch-merge-canceled\";\nexport type {\n NotifyMergeCompletedResult,\n NotifyVCSBranchMergeCompletedInput,\n} from \"./notify-vcs-branch-merge-completed\";\nexport type {\n NotifyBuildDeployedInput,\n NotifyBuildDeployedResult,\n} from \"./notifyVCSBranchBuildDeployed\";\nexport * from \"./types\";\n\nexport function makeVCSBranchTestingSDK(\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): VCSBranchTestingSDK {\n const deps: SdkDependencies = { fetch, log };\n const apiConfig: ApiConfig = { apiKey, serviceBase, userAgent };\n return {\n notifyVCSBranchBuildDeployed: notifyVCSBranchBuildDeployed.bind(\n null,\n deps,\n apiConfig,\n ),\n notifyVCSBranchMergeCanceled: notifyVCSBranchMergeCanceled.bind(\n null,\n deps,\n apiConfig,\n ),\n notifyVCSBranchMergeCompleted: notifyVCSBranchMergeCompleted.bind(\n null,\n deps,\n apiConfig,\n ),\n };\n}\n\nexport type VCSBranchTestingSDK = {\n /**\n * Notify QA Wolf that the build has been deployed and is ready to be tested.\n * Any ongoing run will be aborted and a new one will be started.\n *\n * @remarks This method will create a new Environment if none exists matching\n * the provided environment alias.\n */\n notifyVCSBranchBuildDeployed(\n input: NotifyBuildDeployedInput,\n ): Promise<NotifyBuildDeployedResult>;\n /**\n * Notify QA Wolf that the VCS branch merge has been canceled, e.g. the PR/MR\n * has been closed without merging. This will abort any ongoing run, and\n * discard any investigation work by QA Wolf.\n */\n notifyVCSBranchMergeCanceled(\n input: NotifyVCSBranchMergeCanceledInput,\n ): Promise<NotifyMergeCanceledResult>;\n /**\n * Notify QA Wolf that the VCS branch merge has been completed. This will\n * inform QA Wolf that any Workflow code change should be promoted to the\n * base environment, as defined in the baseEnvironmentsMapping.\n */\n notifyVCSBranchMergeCompleted(\n input: NotifyVCSBranchMergeCompletedInput,\n ): Promise<NotifyMergeCompletedResult>;\n};\n","import { type ApiConfig } from \"../api-types\";\nimport { buildFetchWithTimeout } from \"../other\";\n\nimport { defaultFetch } from \"./defaults/fetch\";\nimport { defaultLogDriver } from \"./defaults/log\";\nimport { defaultServiceBase } from \"./defaults/serviceBase\";\nimport { defaultUserAgent } from \"./defaults/userAgent\";\nimport { type SdkDependencies } from \"./dependencies\";\nimport { attemptNotifyDeploy } from \"./domain/attemptDeploy\";\nimport { generateSignedUrlForRunInputsExecutablesStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables\";\nimport { generateSignedUrlForTempTeamStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-team-storage\";\nimport {\n removeEnvironment,\n testPreview,\n} from \"./domain/legacy_previewTesting/index\";\nimport { pollCiGreenlightStatus } from \"./domain/poll-ci-greenlight\";\nimport { makeVCSBranchTestingSDK } from \"./domain/vcsBranchTesting\";\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 60 seconds here.\n fetch: buildFetchWithTimeout(fetch, 60000),\n log,\n };\n const apiConfig: ApiConfig = { apiKey, serviceBase, userAgent };\n return {\n attemptNotifyDeploy: attemptNotifyDeploy.bind(null, deps, apiConfig),\n /**\n * @deprecated Use `experimental_vcsBranchTesting` instead.\n */\n experimental_removeEnvironment: removeEnvironment.bind(\n null,\n deps,\n apiConfig,\n ),\n /**\n * @deprecated Use `experimental_vcsBranchTesting` instead.\n */\n experimental_testPreview: testPreview.bind(null, deps, apiConfig),\n experimental_vcsBranchTesting: makeVCSBranchTestingSDK(apiConfig, deps),\n generateSignedUrlForRunInputsExecutablesStorage:\n generateSignedUrlForRunInputsExecutablesStorage.bind(\n null,\n deps,\n apiConfig,\n ),\n generateSignedUrlForTempTeamStorage:\n generateSignedUrlForTempTeamStorage.bind(null, deps, apiConfig),\n pollCiGreenlightStatus: pollCiGreenlightStatus.bind(null, deps, apiConfig),\n };\n}\n\nexport type * from \"./domain/attemptDeploy\";\nexport type * from \"./domain/generateSignedUrls/types\";\nexport type * from \"./domain/poll-ci-greenlight\";\nexport * from \"./domain/vcsBranchTesting/index\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/other.ts","../src/lib/sdk/defaults/fetch.ts","../src/lib/sdk/defaults/log.ts","../src/lib/sdk/defaults/serviceBase.ts","../package.json","../src/lib/sdk/defaults/userAgent.ts","../src/lib/api/log.ts","../src/lib/sdk/domain/attemptDeploy/index.ts","../src/lib/api/generate-signed-url-for-run-inputs-executables.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.ts","../src/lib/api/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-team-storage.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/poll-ci-greenlight.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","timeout","args","signal","AbortSignal","defaultFetch","globalThis","defaultLogDriver","error","message","console","info","log","warn","defaultServiceBase","defaultUserAgent","packageJson","version","logFetchError","methodName","response","ok","eventId","failureMessage","body","json","catch","text","undefined","eventIdSuffix","messageSuffix","statusText","status","attemptNotifyDeploy","deps","apiConfig","config","localFetch","URL","serviceBase","JSON","stringify","branch","commit_url","commitUrl","deduplication_key","deduplicationKey","deployment_type","deploymentType","deployment_url","deploymentUrl","ephemeral_environment","ephemeralEnvironment","hosting_service","hostingService","merge_request_number","mergeRequestNumber","pull_request_number","pullRequestNumber","repository","sha","variables","headers","Authorization","apiKey","userAgent","method","handleErrorResponse","data","handleSuccessResponse","abortReason","httpStatus","outcome","environment","results","isPreviewDeployment","isStatic","logPrefix","alias","id","length","environmentId","runId","failReason","failedTrigger","find","t","failure_reason","duplicateSuite","duplicate_suite_id","successfulTrigger","created_suite_id","callGenerateSignedUrlForRunInputsExecutablesStorage","destinationFilePath","encodeURIComponent","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","e","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","fetchCiGreenlightStatus","resp","greenlightStatus","canRetry","errorType","safeDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","pollCiGreenlightStatus","onRunStageChanged","pollConfig","retries","currentStatus","startedAt","Date","now","hasTimedOut","retryLabel","previousStatus","runStage","urlInfo","relevantRunUrl","greenlight","relevantRunId","relevantRunWithBugsUrl","rootRunId","rootRunUrl","supersedingDetails","blockingBugsCount","blockingBugUrls","nonBlockingBugsCount","nonBlockingBugUrls","blockingBugList","map","url","join","nonBlockingBugList","bugsListInText","Error","makeQaWolfSdk","bind"],"mappings":";;;;AAEO,SAASA,MAAMC,EAAU,EAAA;AAC9B,EAAA,OAAO,IAAIC,OAAQ,CAAA,CAACC,YAAYC,UAAWD,CAAAA,OAAAA,EAASF,EAAAA,CAAAA,CAAAA;AACtD;AAFgBD,MAAAA,CAAAA,KAAAA,EAAAA,OAAAA,CAAAA;AAIT,SAASK,UAAUC,KAAa,EAAA;AACrC,EAAOA,OAAAA,KAAAA,KAAU,IAAI,EAAK,GAAA,GAAA;AAC5B;AAFgBD,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;AAYT,IAAME,qBAAAA,2BACVC,KAAoBC,EAAAA,OAAAA,KACrB,UAAUC,IACRF,KAAAA,KAAAA,CAAME,IAAK,CAAA,CAAA,CAAI,EAAA;AAAE,EAAA,GAAGA,KAAK,CAAA,CAAA;EAAIC,MAAQC,EAAAA,WAAAA,CAAYH,QAAQA,OAAAA;AAAS,CAAA,CAFpE,EAAA,uBAAA,CAAA;;;ACnBK,IAAMI,eAAeC,UAAWN,CAAAA,KAAAA;;;ACEhC,IAAMO,gBAA8B,GAAA;AACzCC,EAAAA,KAAAA,CAAMC,SAASD,KAAK,EAAA;AAClBE,IAAQF,OAAAA,CAAAA,KAAAA,CAAMC,SAASD,KAAAA,CAAAA;AACzB,GAAA;AACAG,EAAAA,IAAAA,CAAKF,OAAO,EAAA;AACVC,IAAAA,OAAAA,CAAQE,IAAIH,OAAAA,CAAAA;AACd,GAAA;AACAI,EAAAA,IAAAA,CAAKJ,OAAO,EAAA;AACVC,IAAAA,OAAAA,CAAQG,KAAKJ,OAAAA,CAAAA;AACf;AACF,CAAA;;;ACZO,IAAMK,kBAAqB,GAAA,yBAAA;;;ACAlC,IAAA,eAAA,GAAA;AAAA,EACE,IAAQ,EAAA,gBAAA;AAAA,EACR,OAAW,EAAA,OAAA;AAAA,EACX,OAAW,EAAA,KAAA;AAAA,EACX,WAAe,EAAA,yDAAA;AAAA,EACf,UAAY,EAAC;AAAA,EACb,OAAW,EAAA,KAAA;AAAA,EACX,MAAU,EAAA,uCAAA;AAAA,EACV,WAAe,EAAA,KAAA;AAAA,EACf,IAAQ,EAAA,QAAA;AAAA,EACR,OAAW,EAAA;AAAA,IACT,GAAK,EAAA;AAAA,MACH,KAAS,EAAA,mBAAA;AAAA,MACT,OAAW,EAAA,kBAAA;AAAA,MACX,MAAU,EAAA,iBAAA;AAAA,MACV,OAAW,EAAA;AAAA;AACb,GACF;AAAA,EACA,KAAS,EAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAW,EAAA;AAAA,IACT,KAAS,EAAA,oHAAA;AAAA,IACT,IAAQ,EAAA,kMAAA;AAAA,IACR,UAAY,EAAA,+FAAA;AAAA,IACZ,eAAiB,EAAA,0CAAA;AAAA,IACjB,cAAkB,EAAA,qBAAA;AAAA,IAClB,IAAQ,EAAA,kEAAA;AAAA,IACR,WAAa,EAAA;AAAA,GACf;AAAA,EACA,YAAgB,EAAA;AAAA,IACd,kBAAoB,EAAA,QAAA;AAAA,IACpB,sBAAwB,EAAA,SAAA;AAAA,IACxB,OAAW,EAAA,QAAA;AAAA,IACX,KAAS,EAAA;AAAA,GACX;AAAA,EACA,eAAmB,EAAA;AAAA,IACjB,IAAQ,EAAA;AAAA,GACV;AAAA,EACA,OAAW,EAAA;AAAA,IACT,IAAQ,EAAA;AAAA;AAEZ,CAAA;;;ACzCO,IAAMC,gBAAAA,GAAmB,CAAUC,OAAAA,EAAAA,eAAAA,CAAYC,OAAO,CAAA,CAAA;;;ACA7D,eAAsBC,aAAc,CAAA,EAClCN,GACAO,EAAAA,UAAAA,EACAC,UAKD,EAAA;AACC,EAAA,IAAIA,SAASC,EAAI,EAAA;AAEjB,EAAA,MAAM,EAAEC,OAAAA,EAASC,cAAc,EAAA,GAAK,OAAO,YAAA;AACzC,IAAI,IAAA;AACF,MAAMC,MAAAA,IAAAA,GAAQ,MAAMJ,QAASK,CAAAA,IAAAA,GAAOC,KAAM,CAAA,MAAMN,QAASO,CAAAA,IAAAA,EAAI,CAAA;AAG7D,MAAA,IAAI,OAAOH,IAAAA,KAAS,QAAYA,IAAAA,IAAAA,KAAS,IAAM,EAAA;AAC7C,QAAO,OAAA;AACLF,UAAAA,OAAAA,EAASE,IAAKF,CAAAA,OAAAA;AACdC,UAAAA,cAAAA,EAAgBC,IAAKD,CAAAA;AACvB,SAAA;AACF;AAEA,MAAO,OAAA;QACLD,OAASM,EAAAA,KAAAA,CAAAA;QACTL,cAAgBC,EAAAA;AAClB,OAAA;KACM,CAAA,MAAA;AAEN,MAAO,OAAA;QACLF,OAASM,EAAAA,SAAAA;QACTL,cAAgBK,EAAAA;AAClB,OAAA;AACF;GACF,GAAA;AAEA,EAAA,MAAMC,aAAgBP,GAAAA,OAAAA,GAAU,CAAeA,YAAAA,EAAAA,OAAAA,CAAa,CAAA,CAAA,GAAA,EAAA;AAC5D,EAAA,MAAMQ,aAAgBP,GAAAA,cAAAA,GAAiB,CAAKA,EAAAA,EAAAA,cAAAA,CAAmB,CAAA,GAAA,EAAA;AAE/D,EAAA,MAAMQ,aACJX,QAASY,CAAAA,MAAAA,IAAU,GACf,GAAA,cAAA,GACAZ,SAASW,UAAc,IAAA,eAAA;AAE7BnB,EAAAA,GAAAA,CAAIJ,KACF,CAAA,CAAA,QAAA,EAAMW,UAAAA,CAAAA,EAAAA,EAAeC,QAASY,CAAAA,MAAM,CAAID,CAAAA,EAAAA,UAAAA,CAAaF,EAAAA,aAAAA,CAAgBC,EAAAA,aAAAA,CAAe,CAAA,CAAA;AAExF;AA/CsBZ,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;;;ACStB,eAAsBe,mBAAAA,CACpBC,IACAC,EAAAA,SAAAA,EACAC,MAA6B,EAAA;AAE7B,EAAA,MAAM,EAAEpC,KAAAA,EAAOqC,UAAYzB,EAAAA,GAAAA,EAAQsB,GAAAA,IAAAA;AACnC,EAAI,IAAA;AACF,IAAMd,MAAAA,QAAAA,GAAW,MAAMiB,UACrB,CAAA,IAAIC,IAAI,8BAAgCH,EAAAA,SAAAA,CAAUI,WAAW,CAC7D,EAAA;AACEf,MAAAA,IAAAA,EAAMgB,KAAKC,SAAU,CAAA;AACnBC,QAAAA,MAAAA,EAAQN,MAAOM,CAAAA,MAAAA;AACfC,QAAAA,UAAAA,EAAYP,MAAOQ,CAAAA,SAAAA;AACnBC,QAAAA,iBAAAA,EAAmBT,MAAOU,CAAAA,gBAAAA;AAC1BC,QAAAA,eAAAA,EAAiBX,MAAOY,CAAAA,cAAAA;AACxBC,QAAAA,cAAAA,EAAgBb,MAAOc,CAAAA,aAAAA;AACvB,QAAA,GAAI,0BAA0Bd,MAC1B,GAAA;AACEe,UAAAA,qBAAAA,EAAuBf,MAAOgB,CAAAA;AAChC,SAAA,GACA,oBAAoBhB,MAAU,IAAA;AAC5BiB,UAAAA,eAAAA,EAAiBjB,MAAOkB,CAAAA,cAAAA;AACxBC,UAAAA,oBAAAA,EACEnB,MAAOkB,CAAAA,cAAAA,KAAmB,QACtBlB,GAAAA,MAAAA,CAAOoB,kBACP5B,GAAAA,KAAAA,CAAAA;AACN6B,UAAAA,mBAAAA,EACErB,MAAOkB,CAAAA,cAAAA,KAAmB,QACtBlB,GAAAA,MAAAA,CAAOsB,iBACP9B,GAAAA,KAAAA,CAAAA;AACN+B,UAAAA,UAAAA,EAAYvB,MAAOuB,CAAAA;AACrB,SAAA;AACJC,QAAAA,GAAAA,EAAKxB,MAAOwB,CAAAA,GAAAA;AACZC,QAAAA,SAAAA,EAAWzB,MAAOyB,CAAAA;OACpB,CAAA;MACAC,OAAS,EAAA;QACPC,aAAe,EAAA,CAAA,OAAA,EAAU5B,UAAU6B,MAAM,CAAA,CAAA;QACzC,cAAgB,EAAA,kBAAA;AAChB,QAAA,YAAA,EAAc7B,SAAU8B,CAAAA;AAC1B,OAAA;MACAC,MAAQ,EAAA;KACV,CAAA;AAGF,IAAA,IAAI,CAAC9C,QAASC,CAAAA,EAAAA,EAAW8C,OAAAA,mBAAAA,CAAoB/C,UAAUR,GAAAA,CAAAA;AACvD,IAAMwD,MAAAA,IAAAA,GAAQ,MAAMhD,QAAAA,CAASK,IAAI,EAAA;AACjC,IAAO4C,OAAAA,qBAAAA,CAAsBD,MAAMxD,GAAAA,CAAAA;AACrC,GAAA,CAAA,OAASJ,KAAO,EAAA;AACdI,IAAAA,GAAAA,CAAIJ,MAAM,CAAiD,sDAAA,CAAA,CAAA;AAC3D,IAAO,OAAA;MACL8D,WAAa,EAAA,eAAA;MACbC,UAAY3C,EAAAA,SAAAA;MACZ4C,OAAS,EAAA;AACX,KAAA;AACF;AACF;AAvDsBvC,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAyDtB,eAAekC,mBAAAA,CACb/C,UACAR,GAAc,EAAA;AAEd,EAAA,MAAMoB,SAASZ,QAASY,CAAAA,MAAAA;AACxB,EAAIsC,IAAAA,WAAAA;AACJ,EAAItC,IAAAA,MAAAA,KAAWJ,WAAyB,WAAA,GAAA,eAAA;AAC/BI,OAAAA,IAAAA,MAAAA,KAAW,KAAmB,WAAA,GAAA,kBAAA;AAC9BA,OAAAA,IAAAA,MAAAA,KAAW,KAAmB,WAAA,GAAA,eAAA;AAC9BA,OAAAA,IAAAA,MAAAA,IAAU,KAAmB,WAAA,GAAA,kBAAA;OACnB,WAAA,GAAA,kBAAA;AACnB,EAAA,MAAMd,aAAc,CAAA;AAClBN,IAAAA,GAAAA;IACAO,UAAY,EAAA,qBAAA;AACZC,IAAAA;GACF,CAAA;AACA,EAAO,OAAA;AACLkD,IAAAA,WAAAA;IACAC,UAAYvC,EAAAA,MAAAA;IACZwC,OAAS,EAAA;AACX,GAAA;AACF;AArBeL,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAuBf,eAAeE,qBAAAA,CACbD,MACAxD,GAAc,EAAA;AAEd,EAAM,MAAA,EAAE6D,WAAaC,EAAAA,OAAAA,EAAYN,GAAAA,IAAAA;AACjC,EAAMO,MAAAA,mBAAAA,GAAsBF,WAAe,IAAA,CAACA,WAAYG,CAAAA,QAAAA;AAExD,EAAA,IAAIH,WAAa,EAAA;AACf,IAAMI,MAAAA,SAAAA,GAAYJ,WAAYG,CAAAA,QAAAA,GAC1B,oBACA,GAAA,qBAAA;AACJhE,IAAID,GAAAA,CAAAA,IAAAA,CAAK,GAAGkE,SAAAA,CAAAA,EAAAA,EAAcJ,YAAYK,KAAK,CAAA,MAAA,EAASL,WAAYM,CAAAA,EAAE,CAAG,CAAA,CAAA,CAAA;AACvE;AAGA,EAAIL,IAAAA,OAAAA,CAAQM,WAAW,CAAG,EAAA;AACxB,IAAA,IAAIL,mBAAqB,EAAA;AACvB/D,MAAAA,GAAAA,CAAID,KACF,CAAmF,sFAAA,CAAA,CAAA;AAErF,MAAO,OAAA;AACLsE,QAAAA,aAAAA,EAAeR,WAAYM,CAAAA,EAAAA;QAC3BP,OAAS,EAAA,SAAA;QACTU,KAAOtD,EAAAA;AACT,OAAA;AACF;AACAhB,IAAAA,GAAAA,CAAIJ,MAAM,CAA4D,iEAAA,CAAA,CAAA;AACtE,IAAO,OAAA;MAAE2E,UAAY,EAAA,oBAAA;MAAsBX,OAAS,EAAA;AAAS,KAAA;AAC/D;AAGA,EAAA,IAAI,CAACC,WAAa,EAAA;AAChB7D,IAAAA,GAAAA,CAAIJ,MAAM,CAAgE,qEAAA,CAAA,CAAA;AAC1E,IAAO,OAAA;MAAE2E,UAAY,EAAA,gBAAA;MAAkBX,OAAS,EAAA;AAAS,KAAA;AAC3D;AAEA,EAAA,MAAMY,gBAAgBV,OAAQW,CAAAA,IAAAA,CAAK,CAACC,CAAAA,KAAM,oBAAoBA,CAAAA,CAAAA;AAC9D,EAAA,IAAIF,aAAe,EAAA;AACjBxE,IAAAA,GAAAA,CAAIJ,KACF,CAAA,CAAA,6CAAA,EAAyC4E,aAAcG,CAAAA,cAAc,CAA4B,0BAAA,CAAA,CAAA;AAEnG,IAAO,OAAA;MAAEJ,UAAY,EAAA,0BAAA;MAA4BX,OAAS,EAAA;AAAS,KAAA;AACrE;AAEA,EAAA,MAAMgB,iBAAiBd,OAAQW,CAAAA,IAAAA,CAAK,CAACC,CAAAA,KAAM,wBAAwBA,CAAAA,CAAAA;AACnE,EAAA,IAAIE,cAAgB,EAAA;AAClB5E,IAAAA,GAAAA,CAAID,IACF,CAAA,CAAA,gEAAA,EAA8D6E,cAAeC,CAAAA,kBAAkB,CAAsC,oCAAA,CAAA,CAAA;AAEvI,IAAO,OAAA;AACLR,MAAAA,aAAAA,EAAeR,WAAYM,CAAAA,EAAAA;MAC3BP,OAAS,EAAA,SAAA;AACTU,MAAAA,KAAAA,EAAOM,cAAeC,CAAAA;AACxB,KAAA;AACF;AAEA,EAAA,MAAMC,oBAAoBhB,OAAQW,CAAAA,IAAAA,CAAK,CAACC,CAAAA,KAAM,sBAAsBA,CAAAA,CAAAA;AACpE,EAAA,IAAI,CAACI,iBAAmB,EAAA;AACtB9E,IAAAA,GAAAA,CAAIJ,MAAM,CAA4D,iEAAA,CAAA,CAAA;AACtE,IAAO,OAAA;MAAE2E,UAAY,EAAA,oBAAA;MAAsBX,OAAS,EAAA;AAAS,KAAA;AAC/D;AACA5D,EAAAA,GAAAA,CAAID,IACF,CAAA,CAAA,oEAAA,EAAkE+E,iBAAkBC,CAAAA,gBAAgB,CAAE,CAAA,CAAA;AAExG,EAAO,OAAA;AACLV,IAAAA,aAAAA,EAAeR,WAAYM,CAAAA,EAAAA;IAC3BP,OAAS,EAAA,SAAA;AACTU,IAAAA,KAAAA,EAAOQ,iBAAkBC,CAAAA;AAC3B,GAAA;AACF;AArEetB,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;;;AClFf,eAAsBuB,mDACpB,CAAA,EAAE5B,MAAQzB,EAAAA,WAAAA,EAAa0B,SAAS,EAAA,EAChC,EAAE4B,mBAAAA,EACF,EAAA,EAAE7F,KAAOqC,EAAAA,UAAAA,EAAYzB,KAAsB,EAAA;AAE3C,EAAI,IAAA;AACF,IAAA,MAAMQ,QAAW,GAAA,MAAMiB,UACrB,CAAA,IAAIC,GACF,CAAA,CAAA,EAAGC,WAAAA,CAAAA,gDAAAA,EAA8DuD,kBAAmBD,CAAAA,mBAAAA,CAAAA,CAAAA,CAAsB,CAE5G,EAAA;MACE/B,OAAS,EAAA;AACPC,QAAAA,aAAAA,EAAe,UAAUC,MAAAA,CAAAA,CAAAA;QACzB,cAAgB,EAAA,kBAAA;QAChB,YAAcC,EAAAA;AAChB,OAAA;MACAC,MAAQ,EAAA;KACV,CAAA;AAGF,IAAI9C,IAAAA,QAAAA,CAASY,WAAW,GAAK,EAAA;AAC3B,MAAMP,MAAAA,IAAAA,GACH,MAAML,QAAAA,CAASK,IAAI,EAAA;AACtB,MAAO,OAAA;AACLsE,QAAAA,YAAAA,EAActE,IAAKsE,CAAAA,YAAAA;AACnBxB,QAAAA,UAAAA,EAAYnD,QAASY,CAAAA,MAAAA;AACrBgE,QAAAA,sBAAAA,EAAwBvE,IAAKuE,CAAAA,sBAAAA;AAC7BC,QAAAA,SAAAA,EAAWxE,IAAKwE,CAAAA,SAAAA;QAChBC,OAAS,EAAA;AACX,OAAA;AACF;AACA,IAAA,MAAMhF,aAAc,CAAA;AAClBN,MAAAA,GAAAA;MACAO,UAAY,EAAA,qDAAA;AACZC,MAAAA;KACF,CAAA;AACA,IAAO,OAAA;MACL+E,YAAc,EAAA,MAAM/E,SAASO,IAAI,EAAA;AACjC4C,MAAAA,UAAAA,EAAYnD,QAASY,CAAAA,MAAAA;MACrBkE,OAAS,EAAA;AACX,KAAA;AACF,GAAA,CAAA,OAASE,CAAG,EAAA;AACV,IAAO,OAAA;MACLD,YAAc,EAAA,wDAAA;MACd5B,UAAY,EAAA,CAAA;MACZ2B,OAAS,EAAA;AACX,KAAA;AACF;AACF;AAhDsBN,MAAAA,CAAAA,mDAAAA,EAAAA,qDAAAA,CAAAA;;;ACCtB,eAAsBS,+CAAAA,CACpBnE,IACAC,EAAAA,SAAAA,EACAC,MAA+B,EAAA;AAE/B,EAAM,MAAA,EAAExB,KAAQsB,GAAAA,IAAAA;AAEhB,EAAI,IAAA,CAACE,OAAOyD,mBAAqB,EAAA;AAC/BjF,IAAAA,GAAAA,CAAIJ,MAAM,CAAuD,4DAAA,CAAA,CAAA;AACjE,IAAO,OAAA;MACL8D,WAAa,EAAA,gCAAA;MACb4B,OAAS,EAAA;AACX,KAAA;AACF;AAEA,EAAA,MAAMI,aACJ,GAAA,MAAMV,mDACJzD,CAAAA,SAAAA,EACAC,QACAF,IAAAA,CAAAA;AAEJ,EAAI,IAAA,CAACoE,cAAcJ,OAAS,EAAA;AAC1B,IAAA,IAAI5B,WAA4C,GAAA,qBAAA;AAEhD,IAAIgC,IAAAA,aAAAA,CAAc/B,cAAc,GAAK,EAAA;AACnCD,MAAc,WAAA,GAAA,kBAAA;AACd1D,MAAAA,GAAAA,CAAIJ,KACF,CAAA,CAAA,sCAAA,EAAkC8F,aAAc/B,CAAAA,UAAU,CAAgD,8CAAA,CAAA,CAAA;KAEvG,MAAA;AACL,MAAI+B,IAAAA,aAAAA,CAAc/B,UAAe,KAAA,GAAA,EAAmB,WAAA,GAAA,qBAAA;eAC3C+B,aAAc/B,CAAAA,UAAAA,KAAe,KACtB,WAAA,GAAA,yBAAA;eACP+B,aAAc/B,CAAAA,UAAAA,KAAe,KAAmB,WAAA,GAAA,eAAA;eAChD+B,aAAc/B,CAAAA,UAAAA,KAAe,GACtB,WAAA,GAAA,sBAAA;AAEhB3D,MAAAA,GAAAA,CAAIJ,KACF,CAAA,CAAA,sCAAA,EAAkC8F,aAAc/B,CAAAA,UAAU,CAAwC+B,qCAAAA,EAAAA,aAAAA,CAAcH,YAAe,GAAA,CAAA,EAAGG,aAAcH,CAAAA,YAAY,CAAM,CAAA,CAAA,GAAA,EAAA,CAAc,UAAA,CAAA,CAAA;AAEpL;AAEA,IAAO,OAAA;AACL7B,MAAAA,WAAAA;AACAC,MAAAA,UAAAA,EAAY+B,aAAc/B,CAAAA,UAAAA;MAC1B2B,OAAS,EAAA;AACX,KAAA;AACF;AAEAtF,EAAAA,GAAAA,CAAID,IAAK,CAAA,CAAA,oCAAA,EAAkC2F,aAAcL,CAAAA,SAAS,CAAG,CAAA,CAAA,CAAA;AACrE,EAAO,OAAA;AACLF,IAAAA,YAAAA,EAAcO,aAAcP,CAAAA,YAAAA;AAC5BC,IAAAA,sBAAAA,EAAwBM,aAAcN,CAAAA,sBAAAA;IACtCE,OAAS,EAAA,IAAA;AACTK,IAAAA,SAAAA,EAAWD,aAAcL,CAAAA;AAC3B,GAAA;AACF;AAxDsBI,MAAAA,CAAAA,+CAAAA,EAAAA,iDAAAA,CAAAA;;;ACDtB,eAAsBG,uCACpB,CAAA,EAAExC,MAAQzB,EAAAA,WAAAA,EAAa0B,SAAS,EAAA,EAChC,EAAE4B,mBAAAA,EACF,EAAA,EAAE7F,KAAOqC,EAAAA,UAAAA,EAAYzB,KAAsB,EAAA;AAE3C,EAAI,IAAA;AACF,IAAMQ,MAAAA,QAAAA,GAAW,MAAMiB,UAAAA,CACrB,IAAIC,GAAAA,CACF,GAAGC,WAAAA,CAAAA,qCAAAA,EAAmDsD,mBAAAA,CAAAA,CAAqB,CAE7E,EAAA;MACE/B,OAAS,EAAA;AACPC,QAAAA,aAAAA,EAAe,UAAUC,MAAAA,CAAAA,CAAAA;QACzB,cAAgB,EAAA,kBAAA;QAChB,YAAcC,EAAAA;AAChB,OAAA;MACAC,MAAQ,EAAA;KACV,CAAA;AAGF,IAAI9C,IAAAA,QAAAA,CAASY,WAAW,GAAK,EAAA;AAC3B,MAAMP,MAAAA,IAAAA,GACH,MAAML,QAAAA,CAASK,IAAI,EAAA;AACtB,MAAO,OAAA;AACLsE,QAAAA,YAAAA,EAActE,IAAKsE,CAAAA,YAAAA;AACnBxB,QAAAA,UAAAA,EAAYnD,QAASY,CAAAA,MAAAA;AACrBgE,QAAAA,sBAAAA,EAAwBvE,IAAKuE,CAAAA,sBAAAA;AAC7BC,QAAAA,SAAAA,EAAWxE,IAAKwE,CAAAA,SAAAA;QAChBC,OAAS,EAAA;AACX,OAAA;AACF;AACA,IAAA,MAAMhF,aAAc,CAAA;AAClBN,MAAAA,GAAAA;MACAO,UAAY,EAAA,yCAAA;AACZC,MAAAA;KACF,CAAA;AACA,IAAO,OAAA;MACL+E,YAAc,EAAA,MAAM/E,SAASO,IAAI,EAAA;AACjC4C,MAAAA,UAAAA,EAAYnD,QAASY,CAAAA,MAAAA;MACrBkE,OAAS,EAAA;AACX,KAAA;AACF,GAAA,CAAA,OAASE,CAAG,EAAA;AACV,IAAO,OAAA;MACLD,YAAc,EAAA,wDAAA;MACd5B,UAAY,EAAA,CAAA;MACZ2B,OAAS,EAAA;AACX,KAAA;AACF;AACF;AAhDsBM,MAAAA,CAAAA,uCAAAA,EAAAA,yCAAAA,CAAAA;;;ACmBtB,eAAsBC,mCAAAA,CACpBvE,IACAC,EAAAA,SAAAA,EACAC,MAA+B,EAAA;AAE/B,EAAM,MAAA,EAAExB,KAAQsB,GAAAA,IAAAA;AAEhB,EAAI,IAAA,CAACE,OAAOyD,mBAAqB,EAAA;AAC/BjF,IAAAA,GAAAA,CAAIJ,MAAM,CAAuD,4DAAA,CAAA,CAAA;AACjE,IAAO,OAAA;MACL8D,WAAa,EAAA,gCAAA;MACb4B,OAAS,EAAA;AACX,KAAA;AACF;AAEA,EAAA,MAAMI,aAAgB,GAAA,MAAME,uCAC1BrE,CAAAA,SAAAA,EACAC,QACAF,IAAAA,CAAAA;AAEF,EAAI,IAAA,CAACoE,cAAcJ,OAAS,EAAA;AAC1B,IAAA,IAAI5B,WAA4C,GAAA,qBAAA;AAEhD,IAAIgC,IAAAA,aAAAA,CAAc/B,cAAc,GAAK,EAAA;AACnCD,MAAc,WAAA,GAAA,kBAAA;AACd1D,MAAAA,GAAAA,CAAIJ,KACF,CAAA,CAAA,sCAAA,EAAkC8F,aAAc/B,CAAAA,UAAU,CAAgD,8CAAA,CAAA,CAAA;KAEvG,MAAA;AACL,MAAI+B,IAAAA,aAAAA,CAAc/B,UAAe,KAAA,GAAA,EAAmB,WAAA,GAAA,qBAAA;eAC3C+B,aAAc/B,CAAAA,UAAAA,KAAe,KACtB,WAAA,GAAA,yBAAA;eACP+B,aAAc/B,CAAAA,UAAAA,KAAe,KAAmB,WAAA,GAAA,eAAA;eAChD+B,aAAc/B,CAAAA,UAAAA,KAAe,GACtB,WAAA,GAAA,sBAAA;AAEhB3D,MAAAA,GAAAA,CAAIJ,KACF,CAAA,CAAA,sCAAA,EAAkC8F,aAAc/B,CAAAA,UAAU,CAAwC+B,qCAAAA,EAAAA,aAAAA,CAAcH,YAAe,GAAA,CAAA,EAAGG,aAAcH,CAAAA,YAAY,CAAM,CAAA,CAAA,GAAA,EAAA,CAAc,UAAA,CAAA,CAAA;AAEpL;AAEA,IAAO,OAAA;AACL7B,MAAAA,WAAAA;AACAC,MAAAA,UAAAA,EAAY+B,aAAc/B,CAAAA,UAAAA;MAC1B2B,OAAS,EAAA;AACX,KAAA;AACF;AAEAtF,EAAAA,GAAAA,CAAID,IAAK,CAAA,CAAA,oCAAA,EAAkC2F,aAAcL,CAAAA,SAAS,CAAG,CAAA,CAAA,CAAA;AACrE,EAAO,OAAA;AACLF,IAAAA,YAAAA,EAAcO,aAAcP,CAAAA,YAAAA;AAC5BC,IAAAA,sBAAAA,EAAwBM,aAAcN,CAAAA,sBAAAA;IACtCE,OAAS,EAAA,IAAA;AACTK,IAAAA,SAAAA,EAAWD,aAAcL,CAAAA;AAC3B,GAAA;AACF;AAvDsBQ,MAAAA,CAAAA,mCAAAA,EAAAA,qCAAAA,CAAAA;;;ACkGtB,eAAsBC,uBACpB,CAAA,EAAE1C,MAAQzB,EAAAA,WAAAA,EAAa0B,SAAS,EAAA,EAChC,EACEiB,KAAAA,EAIF,EAAA,EAAElF,KAAOqC,EAAAA,UAAAA,EAAYzB,KAAsB,EAAA;AAE3C,EAAI,IAAA;AACF,IAAM+F,MAAAA,IAAAA,GAAO,MAAMtE,UAAAA,CACjB,IAAIC,GAAAA,CACF,CAAyBwD,sBAAAA,EAAAA,kBAAAA,CAAmBZ,KAAAA,CAAAA,CAC5C3C,CAAAA,EAAAA,WAAAA,CAEF,EAAA;MACEuB,OAAS,EAAA;AACPC,QAAAA,aAAAA,EAAe,UAAUC,MAAAA,CAAAA,CAAAA;QACzB,YAAcC,EAAAA;AAChB;KACF,CAAA;AAGF,IAAA,IAAI0C,KAAKtF,EAAI,EAAA;AACX,MAAMuF,MAAAA,gBAAAA,GAAoB,MAAMD,IAAAA,CAAKlF,IAAI,EAAA;AACzC,MAAO,OAAA;AACLmF,QAAAA,gBAAAA;AACArC,QAAAA,UAAAA,EAAYoC,IAAK3E,CAAAA,MAAAA;QACjBX,EAAI,EAAA;AACN,OAAA;AACF;AACA,IAAA,MAAMH,aAAc,CAAA;AAClBN,MAAAA,GAAAA;MACAO,UAAY,EAAA,yBAAA;MACZC,QAAUuF,EAAAA;KACZ,CAAA;AACA,IAAIA,IAAAA,IAAAA,CAAK3E,WAAW,GAAK,EAAA;AACvB,MAAO,OAAA;QACL6E,QAAU,EAAA,IAAA;QACVC,SAAW,EAAA,WAAA;AACXvC,QAAAA,UAAAA,EAAYoC,IAAK3E,CAAAA,MAAAA;QACjBX,EAAI,EAAA;AACN,OAAA;AACF;AACA,IAAIsF,IAAAA,IAAAA,CAAK3E,UAAU,GAAK,EAAA;AACtB,MAAO,OAAA;QACL6E,QAAU,EAAA,IAAA;QACVC,SAAW,EAAA,QAAA;AACXvC,QAAAA,UAAAA,EAAYoC,IAAK3E,CAAAA,MAAAA;QACjBX,EAAI,EAAA;AACN,OAAA;AACF;AACA,IAAO,OAAA;MACLwF,QAAU,EAAA,KAAA;MACVC,SAAW,EAAA,QAAA;AACXvC,MAAAA,UAAAA,EAAYoC,IAAK3E,CAAAA,MAAAA;MACjBX,EAAI,EAAA;AACN,KAAA;AACF,GAAA,CAAA,OAAS+E,CAAG,EAAA;AACV,IAAO,OAAA;MACLS,QAAU,EAAA,IAAA;MACVC,SAAW,EAAA,SAAA;MACXvC,UAAY,EAAA,CAAA;MACZlD,EAAI,EAAA;AACN,KAAA;AACF;AACF;AAlEsBqF,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;;;AChBtB,IAAMK,YAA2C,GAAA;EAC/CC,iBAAmB,EAAA,KAAA;EACnBC,UAAY,EAAA,EAAA;AACZC,EAAAA,WAAAA,EAAa,MAAM,EAAK,GAAA,GAAA;AACxBC,EAAAA,aAAAA,EAAe,EAAK,GAAA,GAAA;AACpBC,EAAAA,qBAAAA,EAAuB,EAAK,GAAA,GAAA;AAC5BC,EAAAA,sBAAAA,EAAwB,EAAK,GAAA;AAC/B,CAAA;AAEA,eAAsBC,sBAAAA,CACpBpF,IACAC,EAAAA,SAAAA,EACA,EACEoF,iBAAAA,mBAA6C3F,MAAAA,CAAAA,MAAAA,SAAAA,EAAN,mBACvCsD,CAAAA,EAAAA,KAAAA,EACA,GAAGsC,UAAAA,EACoB,EAAA;AAEzB,EAAA,IAAIC,OAAU,GAAA,CAAA;AACd,EAAM,MAAA,EAAE7G,KAAQsB,GAAAA,IAAAA;AAChB,EAAA,MAAM,EACJ8E,iBAAoBD,GAAAA,YAAAA,CAAaC,mBACjCC,UAAaF,GAAAA,YAAAA,CAAaE,YAC1BC,WAAcH,GAAAA,YAAAA,CAAaG,aAC3BC,aAAgBJ,GAAAA,YAAAA,CAAaI,eAC7BC,qBAAwBL,GAAAA,YAAAA,CAAaK,uBACrCC,sBAAyBN,GAAAA,YAAAA,CAAaM,wBACpCG,GAAAA,UAAAA;AACJ,EAAA,IAAIE,aAAgD9F,GAAAA,SAAAA;AACpD,EAAM+F,MAAAA,SAAAA,GAAYC,KAAKC,GAAG,EAAA;AAC1B,EAAA,IAAIC,WAAc,GAAA,KAAA;AAClB,EAAA,OAAO,EAAEA,WAAcF,GAAAA,IAAAA,CAAKC,GAAG,EAAA,GAAKF,YAAYT,WAAc,CAAA,EAAA;AAC5D,IAAMZ,MAAAA,aAAAA,GAAgB,MAAMI,uBAAAA,CAC1BvE,SACA,EAAA;AACE+C,MAAAA;AACF,KAAA,EACAhD,IAAAA,CAAAA;AAEF,IAAA,IAAI,CAACoE,aAAAA,CAAcjF,EAAM,IAAA,CAACiF,cAAcO,QAAU,EAAA;AAChDjG,MAAAA,GAAAA,CAAIJ,KACF,CAAA,CAAA,sCAAA,EAAkC8F,aAAc/B,CAAAA,UAAU,CAAiC,+BAAA,CAAA,CAAA;AAE7F,MAAO,OAAA;QACLD,WAAa,EAAA,kBAAA;AACbC,QAAAA,UAAAA,EAAY+B,aAAc/B,CAAAA,UAAAA;QAC1BC,OAAS,EAAA;AACX,OAAA;AACF;AACA,IAAI,IAAA,CAAC8B,cAAcjF,EAAI,EAAA;AAErBoG,MAAW,OAAA,IAAA,CAAA;AACX,MAAA,IAAIA,UAAUR,UAAY,EAAA;AACxBrG,QAAIJ,GAAAA,CAAAA,KAAAA,CACF,CACE8F,6BAAAA,EAAAA,aAAAA,CAAc/B,UACV,GAAA,CAAA,SAAA,EAAY+B,aAAc/B,CAAAA,UAAU,CACpC,CAAA,CAAA,GAAA,EAAA,CACiC0C,oCAAAA,EAAAA,UAAAA,CAAsB,UAAA,CAAA,CAAA;AAE/D,QAAIX,IAAAA,aAAAA,CAAcQ,cAAc,SAAW,EAAA;AACzC,UAAO,OAAA;YACLxC,WAAa,EAAA,eAAA;YACbC,UAAY3C,EAAAA,SAAAA;YACZ4C,OAAS,EAAA;AACX,WAAA;AACF;AACA,QAAA,IAAIF,WAA2C,GAAA,qBAAA;AAE/C,QAAIgC,IAAAA,aAAAA,CAAcQ,SAAc,KAAA,WAAA,EAChB,WAAA,GAAA,mBAAA;iBACPR,aAAcQ,CAAAA,SAAAA,KAAc,UACrB,WAAA,GAAA,kBAAA;AACXR,aAAAA;AAEL,QAAO,OAAA;AACLhC,UAAAA,WAAAA;AACAC,UAAAA,UAAAA,EAAY+B,aAAc/B,CAAAA,UAAAA;UAC1BC,OAAS,EAAA;AACX,SAAA;AACF;AACA,MAAM,MAAA,EAAEsC,SAAWvC,EAAAA,UAAAA,EAAe+B,GAAAA,aAAAA;AAClC,MAAMyB,MAAAA,UAAAA,GAAa,CACjBxD,EAAAA,UAAAA,GAAa,CAAYA,SAAAA,EAAAA,UAAAA,MAAgB,EAAA,CAAA,qBAAA,EACnBkD,OAAAA,CAAAA,CAAAA,EAAWR,UAAAA,CAAAA,CAAAA,CAAAA;AACnC,MAAA,IAAIH,cAAc,SAAWlG,EAAAA,GAAAA,CAAIC,IAAK,CAAA,CAAA,oBAAA,EAAkBkH,UAAAA,CAAY,CAAA,CAAA;AAC3DjB,WAAAA,IAAAA,SAAAA,KAAc,WACrBlG,EAAAA,GAAAA,CAAID,IAAK,CAAA,CAAA,oBAAA,EAAkBoH,UAAAA,CAAY,CAAA,CAAA;AAChCjB,WAAAA,IAAAA,SAAAA,KAAc,QAAUlG,EAAAA,GAAAA,CAAIC,IAAK,CAAA,CAAA,mBAAA,EAAiBkH,UAAAA,CAAY,CAAA,CAAA;AAEvE,MAAA,MAAMvI,MAAM2H,aAAAA,CAAAA;AACZ,MAAA;AACF;AAEAM,IAAU,OAAA,GAAA,CAAA;AACV,IAAM,MAAA,EAAEb,kBAAqBN,GAAAA,aAAAA;AAC7B,IAAA,MAAM0B,cAAiBN,GAAAA,aAAAA;AACvBA,IAAgBd,aAAAA,GAAAA,gBAAAA;AAChB,IAAA,IACE,CAACoB,cAAAA,IACDA,cAAeC,CAAAA,QAAAA,KAAarB,iBAAiBqB,QAC7C,EAAA;AACA,MAAI,IAAA;AACF,QAAMV,MAAAA,iBAAAA,CAAkBX,kBAAkBoB,cAAAA,CAAAA;AAC5C,OAAA,CAAA,OAAS5B,CAAG,EAAA;AACVxF,QAAIJ,GAAAA,CAAAA,KAAAA,CAAM,uCAAuC4F,CAAAA,CAAAA;AACnD;AACF;AACA,IAAM8B,MAAAA,OAAAA,GAAU,CAAOtB,IAAAA,EAAAA,gBAAAA,CAAiBuB,cAAc,CAAA,CAAA;AACtD,IAAM,MAAA,EACJC,YACAC,aACAF,EAAAA,cAAAA,EACAG,wBACAC,SACAC,EAAAA,UAAAA,EACAP,UACErB,GAAAA,gBAAAA;AACJ,IAAA,IAAI2B,cAAcF,aAAe,EAAA;AAC/B,MAAA,MAAMI,kBAAqB,GAAA;YACrBD,UAAAA;mBACOL,cAAAA,CAAAA,CAAAA;AACb,MAAA,IAAInB,iBAAmB,EAAA;AACrBpG,QAAIC,GAAAA,CAAAA,IAAAA,CACF,CAA4E4H,8EAAAA,EAAAA,kBAAAA,CAAoB,CAAA,CAAA;AAElG,QAAO,OAAA;UACLnE,WAAa,EAAA,gBAAA;UACbC,UAAY3C,EAAAA,SAAAA;UACZ4C,OAAS,EAAA;AACX,SAAA;AACF;AACA5D,MAAID,GAAAA,CAAAA,IAAAA,CAAK,CAA2B8H,wBAAAA,EAAAA,kBAAAA,CAAoB,CAAA,CAAA;AAC1D;AACA,IAAA,IAAIR,aAAa,WAAa,EAAA;AAC5B,MAAM,MAAA,EACJS,mBACAC,eAAkB,GAAA,IAClBC,oBACAC,EAAAA,kBAAAA,GAAqB,EAAA,EACnBjC,GAAAA,gBAAAA;AACJ,MAAA,MAAMkC,eAAkBH,GAAAA,eAAAA,CACrBI,GAAI,CAAA,CAACC,GAAQ,KAAA;SAAOA,GAAAA,CAAAA,CAAK,CACzBC,CAAAA,IAAAA,CAAK,EAAA,CAAA;AACR,MAAA,MAAMC,kBAAqBL,GAAAA,kBAAAA,CACxBE,GAAI,CAAA,CAACC,GAAQ,KAAA;SAAOA,GAAAA,CAAAA,CAAK,CACzBC,CAAAA,IAAAA,CAAK,EAAA,CAAA;AACR,MAAA,MAAME,cAAiB,GAAA,CAAA,EACrBR,eAAgB3D,CAAAA,MAAAA,GAAS,CAAI,GAAA;AAAmB8D,cAAAA,EAAAA,eAAAA,CAAoB,CAAA,GAAA,EAAA,CAEpED,EAAAA,kBAAAA,CAAmB7D,SAAS,CACxB,GAAA;AAAuBkE,kBAAAA,EAAAA,kBAAAA,KACvB,EAAA,CAAA,CAAA;AAEN,MAAA,IAAId,UAAY,EAAA;AACdxH,QAAID,GAAAA,CAAAA,IAAAA,CACF,CACEiI,4CAAAA,EAAAA,oBAAAA,GAAuB,CACnB,GAAA,CAAA,KAAA,EAAQA,oBAAAA,CAAAA,iBAAAA,EAAwC/I,SAC9C+I,CAAAA,oBAAAA,CAAAA,CAAAA,MAAAA,CAAAA,GAEF,EAAA,CAAA;AACAV,EAAAA,OAAAA,CAAS,CAAA,CAAA;AAEjB,QAAO,OAAA;AAAEtB,UAAAA,gBAAAA;UAAkBpC,OAAS,EAAA;AAAU,SAAA;OACzC,MAAA;AACL5D,QAAAA,GAAAA,CAAIC,KACF,CAAoB6H,sBAAAA,EAAAA,iBAAAA,CAAiC7I,aAAAA,EAAAA,SAAAA,CACnD6I,iBAAAA,CAAAA,CAAAA,MAAAA,EAEAE,oBACI,GAAA,CAAA,KAAA,EAAQA,oBAAAA,CAAwC/I,iBAAAA,EAAAA,SAAAA,CAC9C+I,oBAAAA,CAAAA,KAEF,EAAA,CAAA;MACIN,sBAAAA;;IAERa,cAAAA,CAAAA;AAEJ,QAAO,OAAA;AAAEvC,UAAAA,gBAAAA;UAAkBpC,OAAS,EAAA;AAAS,SAAA;AAC/C;AACF;AACA,IAAA,IAAIyD,aAAa,UAAY,EAAA;AAC3BrH,MAAAA,GAAAA,CAAID,IACF,CAAA,CAAA;AAA6DuH,EAAAA,OAAAA,CAAS,CAAA,CAAA;AAExE,MAAO,OAAA;QACL5D,WAAa,EAAA,cAAA;QACbC,UAAY3C,EAAAA,SAAAA;QACZ4C,OAAS,EAAA;AACX,OAAA;AACF;AAEA,IAAA,IAAIsD,WAAa,EAAA;AACflH,MAAAA,GAAAA,CAAIC,IAAK,CAAA,CAAA,4BAAA,EAA0BqG,WAAc,GAAA,GAAA,CAAoB,cAAA,CAAA,CAAA;AACrE,MAAO,OAAA;QACL5C,WAAa,EAAA,gBAAA;QACbC,UAAY3C,EAAAA,SAAAA;QACZ4C,OAAS,EAAA;AACX,OAAA;AACF;AACA,IAAA,IAAIyD,aAAa,cAAgB,EAAA;AAC/BrH,MAAID,GAAAA,CAAAA,IAAAA,CAAK,CAA2BuH,6BAAAA,EAAAA,OAAAA,CAAS,CAAA,CAAA;AAC7C,MAAA,MAAM1I,MAAM4H,qBAAAA,CAAAA;AACd,KAAA,MAAA,IAAWa,aAAa,aAAe,EAAA;AACrCrH,MAAID,GAAAA,CAAAA,IAAAA,CAAK,CAA+BuH,wCAAAA,EAAAA,OAAAA,CAAS,CAAA,CAAA;AACjD,MAAA,MAAM1I,MAAM6H,sBAAAA,CAAAA;AACd,KAAA,MAAa+B,MAAAA,KAAAA,CAAM,CAAyBnB,sBAAAA,EAAAA,QAAAA,CAA0B,CAAA,CAAA;AACxE;AAEArH,EAAAA,GAAAA,CAAIC,IAAK,CAAA,CAAA,4BAAA,EAA0BqG,WAAc,GAAA,GAAA,CAAoB,cAAA,CAAA,CAAA;AACrE,EAAO,OAAA;IACL5C,WAAa,EAAA,gBAAA;IACbC,UAAY3C,EAAAA,SAAAA;IACZ4C,OAAS,EAAA;AACX,GAAA;AACF;AA/MsB8C,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;;;AC1Gf,SAAS+B,aACd,CAAA,EACErF,MACAzB,EAAAA,WAAAA,GAAczB,oBACdmD,SAAYlD,GAAAA,gBAAAA,EAMd,EAAA,EACEf,QAAQK,YACRO,EAAAA,GAAAA,GAAML,gBAAgB,EAAA,GACM,EAAE,EAAA;AAEhC,EAAI,IAAA,OAAOP,UAAU,UAAY,EAAA;AAC/B,IAAA,MAAMoJ,KACJ,CAAA,CAAA;AACuG,4GAAA,CAAA,CAAA;AAE3G;AAEA,EAAA,MAAMlH,IAAwB,GAAA;;;;IAI5BlC,KAAOD,EAAAA,qBAAAA,CAAsBC,OAAO,IAAA,CAAA;AACpCY,IAAAA;AACF,GAAA;AACA,EAAA,MAAMuB,SAAuB,GAAA;AAAE6B,IAAAA,MAAAA;AAAQzB,IAAAA,WAAAA;AAAa0B,IAAAA;AAAU,GAAA;AAC9D,EAAO,OAAA;AACLhC,IAAAA,mBAAAA,EAAqBA,mBAAoBqH,CAAAA,IAAAA,CAAK,IAAMpH,EAAAA,IAAAA,EAAMC,SAAAA,CAAAA;AAC1DkE,IAAAA,+CAAAA,EACEA,+CAAgDiD,CAAAA,IAAAA,CAC9C,IACApH,EAAAA,IAAAA,EACAC,SAAAA,CAAAA;AAEJsE,IAAAA,mCAAAA,EACEA,mCAAoC6C,CAAAA,IAAAA,CAAK,IAAMpH,EAAAA,IAAAA,EAAMC,SAAAA,CAAAA;AACvDmF,IAAAA,sBAAAA,EAAwBA,sBAAuBgC,CAAAA,IAAAA,CAAK,IAAMpH,EAAAA,IAAAA,EAAMC,SAAAA;AAClE,GAAA;AACF;AA1CgBkH,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA","file":"index.js","sourcesContent":["import type { FetchDriver } from \"./sdk/dependencies.js\";\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function pluralize(count: number) {\n return count === 1 ? \"\" : \"s\";\n}\n\nexport function getBackoffMs(\n attemptNumber: number,\n minWaitMs = 1000,\n maxWaitMs = 10000,\n): number {\n return Math.min(maxWaitMs, minWaitMs * 1.2 ** attemptNumber);\n}\n\nexport const buildFetchWithTimeout =\n (fetch: FetchDriver, timeout: number) =>\n async (...args: Parameters<FetchDriver>) =>\n fetch(args[0], { ...args[1], signal: AbortSignal.timeout(timeout) });\n","export const defaultFetch = globalThis.fetch;\n","import type { LogDriver } from \"../dependencies.js\";\n\nexport const defaultLogDriver: LogDriver = {\n error(message, error) {\n console.error(message, error);\n },\n info(message) {\n console.log(message);\n },\n warn(message) {\n console.warn(message);\n },\n};\n","export const defaultServiceBase = \"https://app.qawolf.com/\";\n","{\n \"name\": \"@qawolf/ci-sdk\",\n \"version\": \"1.1.0\",\n \"private\": false,\n \"description\": \"A simple SDK for interacting with QAWolf in CI scripts.\",\n \"keywords\": [],\n \"license\": \"MIT\",\n \"author\": \"Jules Sam. Randolph<jules@qawolf.com>\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"/dist\",\n \"/README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022\",\n \"lint\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .\",\n \"lint:fix\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:warnings\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx\",\n \"prepublishOnly\": \"nx run ci-sdk:build\",\n \"test\": \"NODE_OPTIONS=\\\"--experimental-vm-modules\\\" NODE_NO_WARNINGS=1 jest\",\n \"tsc:check\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@qawolf/ci-utils\": \"^1.0.0\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"8.3.5\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n","import packageJson from \"../../../../package.json\" with { type: \"json\" };\n\nexport const defaultUserAgent = `ci-sdk/${packageJson.version}`;\n","import type { LogDriver } from \"@qawolf/ci-utils\";\n\nexport async function logFetchError({\n log,\n methodName,\n response,\n}: {\n log: LogDriver;\n methodName: string;\n response: Response;\n}) {\n if (response.ok) return;\n\n const { eventId, failureMessage } = await (async () => {\n try {\n const body = (await response.json().catch(() => response.text())) as\n | Record<string, unknown>\n | string;\n if (typeof body === \"object\" && body !== null) {\n return {\n eventId: body.eventId,\n failureMessage: body.failureMessage,\n };\n }\n // If body is not an object (i.e., it's the text from catch)\n return {\n eventId: undefined,\n failureMessage: body,\n };\n } catch {\n // If both parsing attempts somehow fail\n return {\n eventId: undefined,\n failureMessage: undefined,\n };\n }\n })();\n\n const eventIdSuffix = eventId ? ` (Event ID: ${eventId})` : \"\";\n const messageSuffix = failureMessage ? `: ${failureMessage}` : \"\";\n\n const statusText =\n response.status >= 500\n ? \"Server Error\"\n : response.statusText || \"Unknown Error\";\n\n log.error(\n `❌ [${methodName}] ${response.status} ${statusText}${eventIdSuffix}${messageSuffix}`,\n );\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\n DeployStatus,\n NotifyDeployStatus,\n} from \"./types.js\";\n\nexport async function attemptNotifyDeploy(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: Partial<DeployConfig>,\n): Promise<NotifyDeployStatus> {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/deploy_success\", apiConfig.serviceBase),\n {\n body: JSON.stringify({\n branch: config.branch,\n commit_url: config.commitUrl,\n deduplication_key: config.deduplicationKey,\n deployment_type: config.deploymentType,\n deployment_url: config.deploymentUrl,\n ...(\"ephemeralEnvironment\" in config\n ? {\n ephemeral_environment: config.ephemeralEnvironment,\n }\n : \"hostingService\" in config && {\n hosting_service: config.hostingService,\n merge_request_number:\n config.hostingService === \"GitLab\"\n ? config.mergeRequestNumber\n : undefined,\n pull_request_number:\n config.hostingService === \"GitHub\"\n ? config.pullRequestNumber\n : undefined,\n repository: config.repository,\n }),\n sha: config.sha,\n variables: config.variables,\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n const data = (await response.json()) as DeployStatus;\n return handleSuccessResponse(data, log);\n } catch (error) {\n log.error(`🚫 Network error from deploy_success, aborting.`);\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n}\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const status = response.status;\n let abortReason: AttemptDeployHttpAbortReason;\n if (status === undefined) abortReason = \"network-error\";\n else if (status === 401) abortReason = \"401-unauthorized\";\n else if (status === 403) abortReason = \"403-forbidden\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"attemptNotifyDeploy\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n\nasync function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const isPreviewDeployment = environment && !environment.isStatic;\n\n if (environment) {\n const logPrefix = environment.isStatic\n ? \"Static environment\"\n : \"Preview environment\";\n log.info(`${logPrefix}: ${environment.alias} (id: ${environment.id})`);\n }\n\n // No triggers were matched\n if (results.length === 0) {\n if (isPreviewDeployment) {\n log.info(\n `✅ Deployment notification was successful. No run was created for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n log.error(`🚫 No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n\n // If there are results, environment must be defined\n if (!environment) {\n log.error(`🚫 No environment matched the request. Please contact support.`);\n return { failReason: \"no-environment\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((t) => \"failure_reason\" in t);\n if (failedTrigger) {\n log.error(\n `🚫 Run could not be created. Reason: \"${failedTrigger.failure_reason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((t) => \"duplicate_suite_id\" in t);\n if (duplicateSuite) {\n log.info(\n `✅ Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicate_suite_id} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicate_suite_id,\n };\n }\n\n const successfulTrigger = results.find((t) => \"created_suite_id\" in t);\n if (!successfulTrigger) {\n log.error(`🚫 No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n log.info(\n `✅ Deployment notification was successful. Run created with ID: ${successfulTrigger.created_suite_id}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.created_suite_id,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForRunInputsExecutablesStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: GenerateSignedUrlConfig,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/run-inputs-executables-signed-urls?file=${encodeURIComponent(destinationFilePath)}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForRunInputsExecutablesStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForRunInputsExecutablesStorage } from \"../../../api/generate-signed-url-for-run-inputs-executables.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n GenerateSignedUrlAbortReason,\n GenerateSignedUrlConfig,\n GenerateSignedUrlStatus,\n} from \"./types.js\";\n\nexport async function generateSignedUrlForRunInputsExecutablesStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`🚫 destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState =\n await callGenerateSignedUrlForRunInputsExecutablesStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`✅ Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForTempTeamStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: Partial<GenerateSignedUrlConfig>,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/team-storage-signed-url?file=${destinationFilePath}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForTempTeamStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch (e) {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForTempTeamStorage } from \"../../../api/generate-signed-url-for-team-storage.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type { GenerateSignedUrlConfig } from \"./types.js\";\n\ntype GenerateSignedUrlStatus =\n | {\n fileLocation?: string;\n playgroundFileLocation?: string;\n success: true;\n uploadUrl?: string;\n }\n | {\n abortReason: GenerateSignedUrlAbortReason;\n httpStatus?: number;\n success: false;\n };\n\nexport type GenerateSignedUrlAbortReason =\n | \"client-network-error\"\n | \"sdk-argument-validation-failed\"\n | \"400-invalid-request\"\n | \"401-invalid-credentials\"\n | \"403-forbidden\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport async function generateSignedUrlForTempTeamStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`🚫 destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState = await callGenerateSignedUrlForTempTeamStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`✅ Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport type CiGreenlightBugDetails = {\n /**\n * The URL of this BR in the QAWolf application.\n */\n applicationUrl: string;\n /**\n * If this bug report is linked to an external issue, it will\n * show up here.\n */\n externalIssue:\n | {\n /**\n * The URL of the external issue in the external platform\n * application.\n */\n applicationUrl: string;\n /**\n * The ID of this issue in the external platform.\n */\n externalIssueId: string;\n /**\n * Lowercase platform name (e.g. \"jira\").\n */\n platform: string;\n }\n | undefined;\n /**\n * True if the bug is blocking.\n */\n isBlocking: boolean;\n /**\n * True if the bug has been found in this run.\n */\n isNew: boolean;\n /**\n * The name of this bug.\n */\n name: string;\n /**\n * The bug number.\n */\n number: number;\n /**\n * The priority of this bug.\n */\n priority: \"medium\" | \"unprioritized\" | \"low\" | \"high\" | \"urgent\";\n};\n\nexport type CiGreenlightBugData = {\n /**\n * The count of blocking bugs reproduced in the run.\n */\n blockingBugsCount: number;\n /**\n * The URLs of the blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: true`, reading\n * the `applicationUrl` field.\n */\n blockingBugUrls: string[];\n /**\n * The count of non-blocking bugs reproduced in the run.\n */\n nonBlockingBugsCount: number;\n /**\n * The URLs of the non-blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: false`, reading\n * the `applicationUrl` field.\n */\n nonBlockingBugUrls: string[];\n /**\n * Blocking bugs that were not reproduced in this run, but are still\n * opened in the run environment. This may happen when the run only covers a\n * subset of the workflows in environment.\n */\n otherBlockingBugsInEnvironment: CiGreenlightBugDetails[];\n /**\n * Bugs that were reproduced in this run. This includes newly found bugs.\n */\n reproducedBugs: CiGreenlightBugDetails[];\n};\n\n/**\n * @deprecated This type will be removed in the next major version. Use `CiGreenlightBugData` instead.\n */\nexport type CiGreenlightCompletedSuiteDetails = CiGreenlightBugData;\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n relevantRunWithBugsUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n workflowsDisabledAfterRunCount: number;\n workflowsInRunCount: number;\n workflowsUnderInvestigationCount: number;\n};\n\n/**\n * The status of a CI greenlight run. See the API documentation here for\n * more details: https://qawolf.notion.site/1b170576efea411fa785842a71e7c99e\n */\nexport type CiGreenlightStatus = CiGreenlightStatusBase &\n (\n | ({\n greenlight: boolean;\n runStage: \"completed\";\n } & CiGreenlightBugData)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData)\n | {\n greenlight: false;\n runStage: \"initializing\" | \"underReview\" | \"canceled\";\n }\n );\n\nexport async function fetchCiGreenlightStatus(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n {\n runId,\n }: {\n runId: string;\n },\n { fetch: localFetch, log }: SdkDependencies,\n) {\n try {\n const resp = await localFetch(\n new URL(\n `/api/v0/ci-greenlight/${encodeURIComponent(runId)}`,\n serviceBase,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"User-Agent\": userAgent,\n },\n },\n );\n\n if (resp.ok) {\n const greenlightStatus = (await resp.json()) as CiGreenlightStatus;\n return {\n greenlightStatus,\n httpStatus: resp.status,\n ok: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"fetchCiGreenlightStatus\",\n response: resp,\n });\n if (resp.status === 404) {\n return {\n canRetry: true,\n errorType: \"not-found\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n if (resp.status >= 500) {\n return {\n canRetry: true,\n errorType: \"server\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n return {\n canRetry: false,\n errorType: \"client\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n } catch (e) {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","/* eslint-disable @qawolf/max-lines -- Old technical debt */\n\nimport type { ApiConfig } from \"../../api-types.js\";\nimport {\n type CiGreenlightStatus,\n fetchCiGreenlightStatus,\n} from \"../../api/ci-greenlight.js\";\nimport { pluralize, sleep } from \"../../other.js\";\nimport type { SdkDependencies } from \"../dependencies.js\";\n\nexport type PollCiGreenlightPollConfig = {\n /**\n * If true, the job will be aborted when a superseding run is detected.\n *\n * @default false\n */\n abortOnSuperseded: boolean;\n /**\n * Maximum number of network operations retries before aborting the job.\n *\n * @default 10\n */\n maxRetries: number;\n /**\n * Timeout in milliseconds before aborting this polling operation.\n *\n * @default 120 minutes\n */\n pollTimeout: number;\n /**\n * Interval in milliseconds between network operations retries.\n *\n * @default 10 seconds\n */\n retryInterval: number;\n /**\n * Interval in milliseconds between polling for a run in progress.\n *\n * @default 30 seconds\n */\n runInProgressInterval: number;\n /**\n * Interval in milliseconds between polling for a run under review.\n *\n * @default 60 minutes\n */\n runUnderReviewInterval: number;\n};\n\nexport type PollCiGreenlightHttpAbortReason =\n | \"4XX-client-error\"\n | \"404-run-not-found\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport type PollCiGreenlightNonHttpAbortReason =\n | \"poll-timed-out\"\n | \"run-canceled\"\n | \"network-error\"\n | \"superseded-run\";\n\nexport type PollCiGreenlightAbortReason =\n | PollCiGreenlightNonHttpAbortReason\n | PollCiGreenlightHttpAbortReason;\n\nexport type PollCiGreenlightStatus =\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * No blocking bugs were found in the run.\n */\n outcome: \"success\";\n }\n | {\n greenlightStatus: Extract<CiGreenlightStatus, { runStage: \"completed\" }>;\n /**\n * Blocking bugs were found in the run.\n */\n outcome: \"failed\";\n }\n | {\n abortReason: PollCiGreenlightHttpAbortReason;\n httpStatus: number;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n }\n | {\n abortReason: PollCiGreenlightNonHttpAbortReason;\n httpStatus: undefined;\n /**\n * The run was aborted due to an unrecoverable error.\n */\n outcome: \"aborted\";\n };\n\nexport type PollCiGreenlightParams = {\n /**\n * Callback to be called when the lifecycle stage of the run changes.\n */\n onRunStageChanged?: (\n current: CiGreenlightStatus,\n previous: CiGreenlightStatus | undefined,\n ) => unknown | Promise<unknown>;\n runId: string;\n} & Partial<PollCiGreenlightPollConfig>;\n\n// If you change these values, make sure you update the JSDoc\n// comments in the PollConfig type.\nconst safeDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000,\n retryInterval: 10 * 1000,\n runInProgressInterval: 30 * 1000,\n runUnderReviewInterval: 60 * 1000,\n};\n\nexport async function pollCiGreenlightStatus(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n onRunStageChanged: onRunStageChanged = () => undefined,\n runId,\n ...pollConfig\n }: PollCiGreenlightParams,\n): Promise<PollCiGreenlightStatus> {\n let retries = 0;\n const { log } = deps;\n const {\n abortOnSuperseded = safeDefaults.abortOnSuperseded,\n maxRetries = safeDefaults.maxRetries,\n pollTimeout = safeDefaults.pollTimeout,\n retryInterval = safeDefaults.retryInterval,\n runInProgressInterval = safeDefaults.runInProgressInterval,\n runUnderReviewInterval = safeDefaults.runUnderReviewInterval,\n } = pollConfig;\n let currentStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n let hasTimedOut = false;\n while (!(hasTimedOut = Date.now() - startedAt > pollTimeout)) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n {\n runId,\n },\n deps,\n );\n if (!responseState.ok && !responseState.canRetry) {\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason: \"4XX-client-error\",\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n if (!responseState.ok) {\n // This is a non-OK retryable status.\n retries += 1;\n if (retries > maxRetries) {\n log.error(\n `🚫 Unrecoverable error${\n responseState.httpStatus\n ? ` (status ${responseState.httpStatus})`\n : \"\"\n } from CI greenlight, aborting after ${maxRetries} attempts.`,\n );\n if (responseState.errorType === \"network\") {\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n let abortReason: PollCiGreenlightAbortReason = \"XXX-other-http-code\";\n\n if (responseState.errorType === \"not-found\")\n abortReason = \"404-run-not-found\";\n else if (responseState.errorType === \"server\")\n abortReason = \"5XX-server-error\";\n else responseState satisfies never;\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n outcome: \"aborted\",\n };\n }\n const { errorType, httpStatus } = responseState;\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n if (errorType === \"network\") log.warn(`❌ Network error${retryLabel}`);\n else if (errorType === \"not-found\")\n log.info(`⏳ Run not found${retryLabel}`);\n else if (errorType === \"server\") log.warn(`❌ Server error${retryLabel}`);\n\n await sleep(retryInterval);\n continue;\n }\n // responseState.ok === true\n retries = 0;\n const { greenlightStatus } = responseState;\n const previousStatus = currentStatus;\n currentStatus = greenlightStatus;\n if (\n !previousStatus ||\n previousStatus.runStage !== greenlightStatus.runStage\n ) {\n try {\n await onRunStageChanged(greenlightStatus, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n const urlInfo = `See ${greenlightStatus.relevantRunUrl}`;\n const {\n greenlight,\n relevantRunId,\n relevantRunUrl,\n relevantRunWithBugsUrl,\n rootRunId,\n rootRunUrl,\n runStage,\n } = greenlightStatus;\n if (rootRunId !== relevantRunId) {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n if (abortOnSuperseded) {\n log.warn(\n `❌ Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`,\n );\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n log.info(`Root run was superseded:${supersedingDetails}`);\n }\n if (runStage === \"completed\") {\n const {\n blockingBugsCount,\n blockingBugUrls = [],\n nonBlockingBugsCount,\n nonBlockingBugUrls = [],\n } = greenlightStatus;\n const blockingBugList = blockingBugUrls\n .map((url) => `\\n• ${url}`)\n .join(\"\");\n const nonBlockingBugList = nonBlockingBugUrls\n .map((url) => `\\n• ${url}`)\n .join(\"\");\n const bugsListInText = `${\n blockingBugUrls.length > 0 ? `\\nBLOCKING BUGS:${blockingBugList}` : \"\"\n }${\n nonBlockingBugUrls.length > 0\n ? `\\nNON BLOCKING BUGS:${nonBlockingBugList}`\n : \"\"\n }`;\n if (greenlight) {\n log.info(\n `✅ Run passed and no blocking bugs found${\n nonBlockingBugsCount > 0\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )} found`\n : \"\"\n }.\\n${urlInfo}`,\n );\n return { greenlightStatus, outcome: \"success\" };\n } else {\n log.warn(\n `❌ Run failed and ${blockingBugsCount} blocking bug${pluralize(\n blockingBugsCount,\n )} found${\n nonBlockingBugsCount\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )}`\n : \"\"\n }.\\nSee ${relevantRunWithBugsUrl}\\n` +\n \"You may review the priority of certain bugs to mark these non-blocking and retry the job.\\n\" +\n bugsListInText,\n );\n return { greenlightStatus, outcome: \"failed\" };\n }\n }\n if (runStage === \"canceled\") {\n log.info(\n `🚫 Run was canceled. Aborting... Please contact support.\\n${urlInfo}`,\n );\n return {\n abortReason: \"run-canceled\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n // Non-terminal run stages\n if (hasTimedOut) {\n log.warn(`❌ Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (runStage === \"initializing\") {\n log.info(`⏳ Run is in progress... ${urlInfo}`);\n await sleep(runInProgressInterval);\n } else if (runStage === \"underReview\") {\n log.info(`🕵️ Run is under review... ${urlInfo}`);\n await sleep(runUnderReviewInterval);\n } else throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n\n log.warn(`❌ Poll timed out after ${pollTimeout / 1000}s. Aborting...`);\n return {\n abortReason: \"poll-timed-out\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport { buildFetchWithTimeout } from \"../other.js\";\n\nimport { defaultFetch } from \"./defaults/fetch.js\";\nimport { defaultLogDriver } from \"./defaults/log.js\";\nimport { defaultServiceBase } from \"./defaults/serviceBase.js\";\nimport { defaultUserAgent } from \"./defaults/userAgent.js\";\nimport type { SdkDependencies } from \"./dependencies.js\";\nimport { attemptNotifyDeploy } from \"./domain/attemptDeploy/index.js\";\nimport { generateSignedUrlForRunInputsExecutablesStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.js\";\nimport { generateSignedUrlForTempTeamStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-team-storage.js\";\nimport { pollCiGreenlightStatus } from \"./domain/poll-ci-greenlight.js\";\n\nexport function makeQaWolfSdk(\n {\n apiKey,\n serviceBase = defaultServiceBase,\n userAgent = defaultUserAgent,\n }: {\n apiKey: string;\n serviceBase?: string;\n userAgent?: string;\n },\n {\n fetch = defaultFetch,\n log = defaultLogDriver,\n }: Partial<SdkDependencies> = {},\n) {\n if (typeof fetch !== \"function\") {\n throw Error(\n `QA Wolf CI-SDK requires fetch to be defined. Make sure you are using NodeJS 18+, OR pass a fetch polyfill to the makeQaWolfSdk function.\nWe recommend 'undici' package for that purpose. See the Requirement section of our README for more guidance.`,\n );\n }\n\n const deps: SdkDependencies = {\n // Versions of fetch may have different default timeouts. For consistency, we explicitly set it to 2 minutes here.\n // The increased timeout helps avoid edge cases where we need to search for a commit against multiple\n // code hosting service repositories as a fallback when not finding the repository based on organization/name.\n fetch: buildFetchWithTimeout(fetch, 120000),\n log,\n };\n const apiConfig: ApiConfig = { apiKey, serviceBase, userAgent };\n return {\n attemptNotifyDeploy: attemptNotifyDeploy.bind(null, deps, apiConfig),\n generateSignedUrlForRunInputsExecutablesStorage:\n generateSignedUrlForRunInputsExecutablesStorage.bind(\n null,\n deps,\n apiConfig,\n ),\n generateSignedUrlForTempTeamStorage:\n generateSignedUrlForTempTeamStorage.bind(null, deps, apiConfig),\n pollCiGreenlightStatus: pollCiGreenlightStatus.bind(null, deps, apiConfig),\n };\n}\n\nexport type * from \"./domain/attemptDeploy/index.js\";\nexport type * from \"./domain/generateSignedUrls/types.js\";\nexport type * from \"./domain/poll-ci-greenlight.js\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,46 +1,44 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qawolf/ci-sdk",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "A simple SDK for interacting with QAWolf in CI scripts.",
|
|
5
|
-
"type": "commonjs",
|
|
3
|
+
"version": "1.1.0",
|
|
6
4
|
"private": false,
|
|
5
|
+
"description": "A simple SDK for interacting with QAWolf in CI scripts.",
|
|
6
|
+
"keywords": [],
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"author": "Jules Sam. Randolph<jules@qawolf.com>",
|
|
9
|
+
"sideEffects": false,
|
|
10
|
+
"type": "module",
|
|
7
11
|
"exports": {
|
|
8
12
|
".": {
|
|
9
13
|
"types": "./dist/index.d.ts",
|
|
10
|
-
"require": "./dist/index.
|
|
11
|
-
"import": "./dist/index.
|
|
14
|
+
"require": "./dist/index.cjs",
|
|
15
|
+
"import": "./dist/index.js",
|
|
12
16
|
"default": "./dist/index.js"
|
|
13
17
|
}
|
|
14
18
|
},
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
"files": [
|
|
20
|
+
"/dist",
|
|
21
|
+
"/README.md"
|
|
22
|
+
],
|
|
18
23
|
"scripts": {
|
|
19
24
|
"build": "tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022",
|
|
20
|
-
"lint": "
|
|
21
|
-
"lint:fix": "eslint . --ext js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .",
|
|
22
|
-
"lint:warnings": "eslint . --ext js,jsx,mjs,ts,tsx",
|
|
23
|
-
"test": "jest",
|
|
25
|
+
"lint": "dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .",
|
|
26
|
+
"lint:fix": "eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .",
|
|
27
|
+
"lint:warnings": "eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx",
|
|
24
28
|
"prepublishOnly": "nx run ci-sdk:build",
|
|
29
|
+
"test": "NODE_OPTIONS=\"--experimental-vm-modules\" NODE_NO_WARNINGS=1 jest",
|
|
25
30
|
"tsc:check": "tsc --noEmit"
|
|
26
31
|
},
|
|
27
|
-
"keywords": [],
|
|
28
|
-
"author": "Jules Sam. Randolph<jules@qawolf.com>",
|
|
29
|
-
"license": "MIT",
|
|
30
|
-
"engines": {
|
|
31
|
-
"node": ">=16"
|
|
32
|
-
},
|
|
33
|
-
"devDependencies": {
|
|
34
|
-
"tsup": "8.3.5"
|
|
35
|
-
},
|
|
36
32
|
"dependencies": {
|
|
37
33
|
"@qawolf/ci-utils": "^1.0.0",
|
|
38
34
|
"@sinonjs/fake-timers": "^10.3.0",
|
|
39
35
|
"slugify": "^1.6.6",
|
|
40
36
|
"tslib": "^2.6.2"
|
|
41
37
|
},
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"tsup": "8.3.5"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20"
|
|
43
|
+
}
|
|
46
44
|
}
|