npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@qawolf/ci-sdk

v3.0.0

Published

A simple SDK for interacting with QAWolf in CI scripts.

Readme

QAWolf CI SDK

This package provides a TypeScript, ESM-only SDK to interact with the QA Wolf Customer-facing API.

It exposes several functions associated with different endpoints, which are detailed in the table of contents below.

Note that these functions do not throw. They yield a result object that contains the outcome of the operation. This outcome should be scrutinized to determine the status of your CI/CD step/job/action.

Table of Contents

Notify Deployment

Notify us of a successful deployment to trigger a run.

ℹ️ See the API documentation page for this endpoint.

💡 For GitHub Actions Users: If you're using GitHub Actions, we strongly recommend using our GitHub Action. The GitHub Action provides simpler configuration and automatic information extraction.

⚠️ Important: A run is only created if there is a matching trigger in your QA Wolf configuration. The deployment notification alone doesn't guarantee a run will be created.

Example

import { type DeployConfig, makeQaWolfSdk } from "@qawolf/ci-sdk";

// Example for GitHub repositories
const deployConfig: GitHubDeployConfig = {
  branch: undefined,
  commitUrl: undefined,
  deduplicationKey: undefined,
  // Required only if the target trigger requires matching a deployment type
  deploymentType: "staging", // e.g., "production", "staging", "qa"
  deploymentUrl: undefined,
  // Specify GitHub as hosting service
  hostingService: "GitHub",
  // Optional: Include pull request number for PR testing
  // See Notify Preview Deployment (Pull Request / Merge Request Testing) section
  pullRequestNumber: 123,
  // Recommended: Include repository information
  repository: {
    name: "your-repo",
    owner: "your-org",
  },
  sha: undefined,
  variables: undefined,
};

// Example for GitLab repositories
const deployConfig: GitLabDeployConfig = {
  branch: undefined,
  commitUrl: undefined,
  deduplicationKey: undefined,
  // Required only if the target trigger requires matching a deployment type
  deploymentType: "staging", // e.g., "production", "staging", "qa"
  deploymentUrl: undefined,
  // Specify GitLab as hosting service
  hostingService: "GitLab",
  // Optional: Include merge request number for MR testing
  // See Notify Preview Deployment (Pull Request / Merge Request Testing) section
  mergeRequestNumber: 123,
  // Recommended: Include repository information
  repository: {
    name: "your-repo",
    namespace: "your-group",
  },
};

// Example for Ephemeral deployments
const deployConfig: EphemeralDeployConfig = {
  branch: undefined,
  commitUrl: undefined,
  deduplicationKey: undefined,
  // Required only if the target trigger requires matching a deployment type
  deploymentType: "staging", // e.g., "production", "staging", "qa"
  deploymentUrl: "https://preview.environment.com",
  ephemeralEnvironment: true,
  sha: undefined,
  variables: undefined,
};

// General Example
// Edit this to your needs.
const deployConfig: DeployConfig = {
  branch: undefined,
  commitUrl: undefined,
  deduplicationKey: undefined,
  // Required only if the target trigger requires matching a deployment type
  deploymentType: "staging", // e.g., "production", "staging", "qa"
  deploymentUrl: undefined,
  hostingService: undefined,
  sha: undefined,
  variables: undefined,
};

const { attemptNotifyDeploy } = makeQaWolfSdk({
  apiKey: "qawolf_xxxxx",
});

(async () => {
  const result = await attemptNotifyDeploy(deployConfig);
  if (result.outcome === "skipped") {
    // No trigger matched this deployment, a deterministic no-op rather than a
    // failure. Let the job pass (or fail here instead if you would rather
    // catch a trigger misconfiguration).
    return;
  }
  if (result.outcome !== "success") {
    // "failed" or "aborted": fail the job.
    process.exit(1);
  }
  const runId = result.runId;
  // Store the runId as an output of the job to be used in a CI-greenlight job.
  // This will depend on the CI platform you are using.
})();

Notify Preview Deployment (Pull Request / Merge Request Testing)

⚠️ Important: PR/MR testing functionality must be activated by QA Wolf. Please reach out to your QA Wolf representative to enable this feature and help with the setup.

Once enabled, to use PR/MR testing functionality:

  1. For GitHub repositories:

    • Preferably, use our GitHub Action
    • Pass hostingService: "GitHub", repository information, and pullRequestNumber while notifying a deployment as described in the Notify Deployment section
  2. For GitLab repositories:

    • Pass hostingService: "GitLab", repository information, and mergeRequestNumber while notifying a deployment as described in the Notify Deployment section
  3. For Ephemeral deployments (no code hosting integration):

    • Pass ephemeralEnvironment: true and deploymentUrl while notifying a deployment as described in the Notify Deployment section

Poll for CI Greenlight Status

ℹ️ See the API documentation page for this endpoint.

import { makeQaWolfSdk } from "@qawolf/ci-sdk";

const { pollCiGreenlightStatus } = makeQaWolfSdk({
  apiKey: "qawolf_xxxxx",
});

(async () => {
  // Retrieve runId from the previous job.
  const { outcome } = await pollCiGreenlightStatus({
    runId,
    // Optional: Callback to be called when the run stage changes.
    // See https://qawolf.notion.site/1b170576efea411fa785842a71e7c99e for
    // documentation on these run stages.
    onRunStageChanged: (current, previous) => {
      console.log(current, previous);
    },
    // Optional: Defaults to false. When set to true, the polling operation
    // will abort when the run is superseded.
    abortOnSuperseded: false,
  });
  if (outcome !== "success") {
    // Fail the job.
    // This will depend on the CI platform you are using.
    // You can also distinguish between "failed" and "aborted" outcomes.
    // Only "failed" outcome indicates bugs were found.
    process.exit(1);
  }
  // Continue CI.
})();

ℹ️ A completed status can report that no flows ran. QA Wolf assesses each change, and a change it judges low risk gets a green light without a test run. workflowsInRunCount is 0 whenever nothing ran, and reason is low-risk-change, which identifies this case specifically. The default log prints QA Wolf's own explanation for it.

Advanced: Poll with Custom Control (Iterator)

For advanced use cases where you need fine-grained control over the polling lifecycle, use makePollCiGreenlightStatusIterator. This async generator gives you full control to implement custom logic such as:

  • Stop polling early based on time limits (e.g., "wait max 10 minutes in review then proceed")
  • Stop polling based on bug counts (e.g., "proceed if only 3 or fewer blocking bugs")
  • Implement custom logging or monitoring at each poll iteration
  • Access detailed bug data during the "under review" stage

ℹ️ See the API documentation page for this endpoint.

Example: Early Exit with Custom Logic

⚠️ Important: When using the iterator, ensure you handle all run stages in your switch statement. The default case with satisfies never provides compile-time safety - if a new stage is added, TypeScript will error. This prevents silently passing your CI job while ignoring error conditions.

import { makeQaWolfSdk } from "@qawolf/ci-sdk";

const { makePollCiGreenlightStatusIterator } = makeQaWolfSdk({
  apiKey: "qawolf_xxxxx",
});

(async () => {
  let underReviewStartTime: number | null = null;

  const iterator = makePollCiGreenlightStatusIterator({
    runId: "your-run-id",
  });

  for await (const iteration of iterator) {
    // Check if the iterator yielded an abort result
    if (iteration.isAborted) {
      console.error(`Poll aborted: ${iteration.abortReason}`);
      process.exit(1);
    }

    // Handle status iterations
    const { status, stageChanged } = iteration;

    switch (status.runStage) {
      case "initializing":
        console.log(`Run stage: ${status.runStage}`);
        break;

      case "underReview": {
        // Track when we first enter underReview
        if (stageChanged) {
          underReviewStartTime = Date.now();
          console.log(`Run stage: ${status.runStage}`);
        }

        const timeInUnderReview = underReviewStartTime
          ? Date.now() - underReviewStartTime
          : 0;

        // Option 1: Stop after 10 minutes in review
        if (timeInUnderReview > 10 * 60 * 1000) {
          console.log("10 minutes in review, proceeding with deployment");
          // Decide whether to fail CI based on your criteria
          if (status.blockingBugsCount > 5) {
            console.log("Too many blocking bugs, failing CI");
            process.exit(1);
          }
          break;
        }

        // Option 2: Stop if bug count is acceptable
        if (status.blockingBugsCount <= 3) {
          console.log(
            `Only ${status.blockingBugsCount} blocking bugs, acceptable to proceed`,
          );
          break;
        }
        break;
      }

      case "completed":
        console.log(`Completed with greenlight: ${status.greenlight}`);
        if (!status.greenlight) {
          console.log("Run failed, blocking bugs found");
          process.exit(1);
        }
        console.log("Run passed successfully");
        return; // Exit the loop

      case "canceled":
        console.log("Run was canceled");
        process.exit(1);

      default:
        // Exhaustive check - TypeScript will error if a case is missing
        status.runStage satisfies never;
        throw new Error(`Unexpected run stage: ${status.runStage}`);
    }
  }
})();

Yielded Iteration Object

The iterator yields a discriminated union that can be either a status update or an abort notification:

Status Iteration (isAborted: false):

  • isAborted: false - Indicates a normal status update
  • status: The current CiGreenlightStatus from the API
  • previousStatus: The status from the previous iteration (undefined on first iteration)
  • stageChanged: Boolean indicating if the run stage changed from the previous iteration
  • elapsedMs: Milliseconds elapsed since polling started

Aborted Iteration (isAborted: true):

  • isAborted: true - Indicates the polling was aborted
  • abortReason: String indicating why polling was aborted (e.g., "poll-timed-out", "run-canceled", "network-error", "4XX-client-error", "5XX-server-error")
  • httpStatus: HTTP status code if applicable, otherwise undefined
  • elapsedMs: Milliseconds elapsed since polling started

When abortReason is "run-canceled", the iteration also carries:

  • message: Human-readable copy explaining the cancellation, or undefined when QA Wolf sent none
  • reason: A stable code for the cancellation, or undefined when QA Wolf sent none. Treat this as an open set of strings, since new codes appear without an SDK release

Important: Always check iteration.isAborted to determine which type of result you received. When isAborted === true, you should handle the abort reason and exit appropriately.

Notify a Terminated Ephemeral Environment

ℹ️ See the API documentation page for this endpoint.

After you terminate an ephemeral environment or release it for something else to be installed in it, you should notify QA Wolf of that fact. When you notify us, we will stop all runs targeting that environment and check whether there are any changes to flows that need to be promoted to the static base environment. This eventually results in the environment showing as "closed" in QA Wolf.

⚠️ Note: If you have the QA Wolf GitHub integration enabled for your preview testing, GitHub will notify us of PRs being merged or closed, and we use that notification to stop runs and trigger flow promotion. In this case, it is typically redundant and unnecessary to call this..

⚠️ Important: PR/MR testing functionality must be activated by QA Wolf. Please reach out to your QA Wolf representative to enable this feature and help with the setup.

import {
  type NotifyTerminatedEphemeralEnvironmentInput,
  makeQaWolfSdk,
} from "@qawolf/ci-sdk";

// Example for environmentId
const terminateConfig: NotifyTerminatedEphemeralEnvironmentInput = {
  environmentId: "test-environment-id",
};

// Example for environmentAlias
const terminateConfig: NotifyTerminatedEphemeralEnvironmentInput = {
  environmentAlias: "test-environment",
};

// Example for deploymentUrl
const terminateConfig: NotifyTerminatedEphemeralEnvironmentInput = {
  deploymentUrl: "https://test-environment",
};

const { notifyTerminatedEphemeralEnvironment } = makeQaWolfSdk({
  apiKey: "qawolf_xxxxx",
});

(async () => {
  const result = await notifyTerminatedEphemeralEnvironment(terminateConfig);
  if (result.outcome !== "success") {
    // Fail the job.
    process.exit(1);
  }
  const environmentId = result.environmentId;
})();

Upload Run Input Artifacts

import { type DeployConfig, makeQaWolfSdk } from "@qawolf/ci-sdk";
import fs from "fs/promises";
import path from "path";

const { generateSignedUrlForTempTeamStorage, attemptNotifyDeploy } =
  makeQaWolfSdk({
    apiKey: "qawolf_xxxxx",
  });

(async () => {
  const interactiveRunFileLocation = await uploadRunArtifact("");

  if (interactiveRunFileLocation) {
    const deployConfig: DeployConfig = {
      branch: undefined,
      commitUrl: undefined,
      deduplicationKey: undefined,
      deploymentType: undefined,
      deploymentUrl: undefined,
      hostingService: undefined,
      sha: undefined,
      variables: {
        RUN_INPUT_PATH: interactiveRunFileLocation,
      },
    };

    const result = await attemptNotifyDeploy(deployConfig);
    if (result.outcome !== "success") {
      // Fail the job.
      process.exit(1);
    }
    const runId = result.runId;
  }
})();

async function uploadRunArtifact(filePath: string): Promise<string> {
  const fileName = path.basename(filePath);

  const signedUrlResponse = await generateSignedUrlForTempTeamStorage({
    destinationFilePath: fileName,
  });

  if (
    signedUrlResponse?.success &&
    signedUrlResponse.interactiveRunFileLocation &&
    signedUrlResponse.uploadUrl
  ) {
    const fileBuffer = await fs.readFile(filePath);
    const url = signedUrlResponse.uploadUrl;

    try {
      const response = await fetch(url, {
        method: "PUT",
        body: fileBuffer,
        headers: {
          "Content-Type": "application/octet-stream",
        },
      });

      if (!response.ok) {
        return "";
      }
    } catch (error) {
      return "";
    }
    return signedUrlResponse.interactiveRunFileLocation;
  }
  return "";
}

generateSignedUrlForTempTeamStorage and generateSignedUrlForRunInputsExecutablesStorage also return a playgroundFileLocation field with the same value as interactiveRunFileLocation. It is deprecated and will be removed in a future major version — use interactiveRunFileLocation instead.

Requirements

This package requires NodeJS ≥ 24.14.1 and < 25 and is published as ESM only. Import it with import; require("@qawolf/ci-sdk") is not supported.

You can still pass your own fetch implementation to makeQaWolfSdk if you want to route requests through a custom client, for example undici:

import { fetch } from "undici";

const sdk = makeQaWolfSdk(
  {
    apiKey: "qawolf_xxxxx",
  },
  { fetch },
);

Versioning

This package follows the SemVer versioning scheme. Additional notes:

  • We recommend depending on the ^ range operator for this package, as it will not introduce breaking changes and guarantee an up-to-date API usage version.
  • We will provide a changelog for each release, which will be available in the Changelog section below.
  • This package major version will be bumped when an API breaking change is introduced. This won't happen too often, and we will reach out to you and give advance notice when it does.
  • Only top-level exports are considered part of the public API and covered by SemVer.
  • Addition of new fields in the API response types are not considered breaking changes.
  • Logs and debug messages are not considered part of the public API and can change at any time.

Changelog

v3.0.0

  • Breaking: this package is now published as ESM only. The CommonJS build (dist/index.cjs) and the require entry in exports are gone, so require("@qawolf/ci-sdk") no longer resolves. Import the package with import from an ESM module, or load it from CommonJS with a dynamic await import("@qawolf/ci-sdk").
  • Breaking: the supported NodeJS range is now >=24.14.1 <25, up from >=20. Older NodeJS versions are no longer tested or supported.
  • Breaking: requires @qawolf/ci-utils v2, which carries the same two changes.

v2.8.0

  • pollCiGreenlightStatus: a completed status now carries optional message and reason, holding QA Wolf's explanation of the outcome. QA Wolf sends them when it assessed a change as low risk and ran no flows, where reason is low-risk-change. Both were previously typed only on a canceled status, so this explanation was unreadable without a cast. reason is an open set of string codes; new ones appear without an SDK release, and both fields are absent against a backend that predates them.
  • pollCiGreenlightStatus: when a green completed status reports that no flows ran and carries an explanation, the SDK now prints that explanation instead of "Run passed and no blocking bugs found". The previous copy claimed a test run that never happened. A completed status whose flows did run keeps the existing copy, as does one that reports no flows without an explanation.

v2.7.0

  • generateSignedUrlForTempTeamStorage and generateSignedUrlForRunInputsExecutablesStorage: the response now also includes interactiveRunFileLocation, carrying the same value as playgroundFileLocation. playgroundFileLocation is deprecated and will be removed in a future major version; switch to interactiveRunFileLocation now, since both fields are populated identically until then.

v2.6.0

  • pollCiGreenlightStatus: when QA Wolf explains why a run was canceled, the SDK now prints that explanation instead of asking you to contact support. Previously the message on a canceled status was readable only through onRunStageChanged or the iterator, so a default caller saw the run stop with no cause. A backend that sends no message, and cancellations that carry none, keep the previous copy. makePollCiGreenlightStatusIterator now carries message and reason on the run-canceled abort as well. reason is an open set of string codes; new ones appear without an SDK release.
  • makePollCiGreenlightStatusIterator: a run-canceled abort now carries optional message and reason fields, holding whatever QA Wolf sent on the canceled status. Both are added to the existing PollCiGreenlightIteratorNonHttpAborted, so no existing type or declaration changes. Both are undefined on a poll-timed-out or network-error abort, which never carry an explanation, and against a backend that predates the fields.
  • pollCiGreenlightStatus: QA Wolf now gives up on a run it never managed to create, so a poll that used to continue until your own timeout ends within about five minutes. The run reaches the canceled stage with reason: "run-not-created" and an explanation, which the SDK now prints for you as described above, and the top-level result is outcome: "aborted" with abortReason: "run-canceled", exactly as for any other cancellation. Treat reason as an open set, as before. Nothing changes for a run that is created normally, and a backend that predates this keeps reporting the run as initializing.

v2.5.0

  • attemptNotifyDeploy: QA Wolf no longer sends skipped_triggers on the deploy_success response, so against a current backend skippedTriggers is absent and failReason: "trigger-skipped" does not occur. A trigger that matched the deployment but could not run now reaches you as outcome: "skipped" rather than outcome: "failed", so a deploy step that used to fail in that case passes instead. This most often happens when the environment has no enabled tests, where there is nothing to run and nothing to retry. Both skippedTriggers and the trigger-skipped reason stay in the types and are still parsed, so no caller has to change and a self-hosted backend that predates the change keeps working. Note that this response no longer distinguishes a matched-but-unrunnable trigger from a deployment that matched nothing, and its log line reads as though nothing matched.

v2.4.0

  • attemptNotifyDeploy and notifyTerminatedEphemeralEnvironment: the response may now carry a warning about the request itself rather than its outcome, and the SDK logs it through log.warn. Today it is sent when an organization or user API key omits workspaceId, in which case QA Wolf uses your organization's first-created workspace and the warning names it. The warning never changes the outcome, and it is absent against a backend that predates it. attemptNotifyDeploy also exposes it as warning on DeployStatus.

v2.3.0

  • attemptNotifyDeploy: a failed suite result now carries failureCode and failureMessage alongside the existing failureReason. failureCode is a stable code to branch on, such as billing-prevented, environment-terminated, environment-not-ready, test-configuration-error, or internal-error; treat it as an open set, since new codes are added over time. Note that environment-terminated is permanent while environment-not-ready clears on its own, so retrying is worthwhile only for the second. failureMessage is human-readable copy for logs, and the SDK's own failure log line now prints it instead of the internal reason.
  • attemptNotifyDeploy: failureReason is deprecated. It still ships unchanged and is safe to keep reading, but it carries an internal diagnostic whose values change without notice. Branch on failureCode and display failureMessage instead. Both are undefined when the SDK talks to a backend that predates them.

v2.1.0

  • attemptNotifyDeploy: the deploy_success response is now validated at runtime instead of being trusted. A response with a non-JSON body, or a body that does not match the expected shape, returns outcome: "aborted" with the new abortReason: "invalid-response-body". This is distinct from "network-error", which now covers only transport and body-stream failures rather than also masking unparseable responses. A result the SDK does not recognize (for example a new result kind sent by a newer backend) returns outcome: "failed" with the new failReason: "unknown-result" instead of being reported as a success. Recognized results are unchanged, and older backends that omit newer fields remain fully supported.

v2.0.0

  • attemptNotifyDeploy: the DeployStatus response now carries skippedTriggers (triggers that matched the deployment but produced no run, each with a reason code and human-readable message) and skippedDeployment (set when no trigger matched at all). The result now distinguishes these cases. A trigger that matched but could not run (e.g. the environment was still syncing) returns outcome: "failed" with failReason: "trigger-skipped" and a skippedTriggers array, since a precondition was not met and retrying may succeed. A deployment that matched no trigger returns outcome: "skipped" with skippedDeployment (the server's reason, when it provides one). That result is deterministic given the current configuration, so it is reported as a skip rather than a failure and is logged as a warning, not an error. Preview deployments keep outcome: "success" but now log the skip reason. outcome: "success" results are unchanged.
  • pollCiGreenlightStatus: the canceled CiGreenlightStatus object may now include a reason code and a human-readable message explaining why the run was canceled. These are read off the status directly (via the onRunStageChanged callback or makePollCiGreenlightStatusIterator); the top-level pollCiGreenlightStatus result and logs are unchanged.

BREAKING CHANGES:

  • attemptNotifyDeploy: a deployment that matched no trigger now returns outcome: "skipped" instead of outcome: "failed" / failReason: "no-matched-trigger". Callers that switch on outcome must handle the new "skipped" case; code that treated a no-trigger-match as a failure should decide whether a deterministic no-op should still fail the deploy step. AttemptDeployFailedReason no longer includes "no-matched-trigger".
  • pollCiGreenlightStatus: on the initializing and canceled run stages, the fields relevantRunWithBugsUrl, workflowsDisabledAfterRunCount, workflowsInRunCount, and workflowsUnderInvestigationCount are now optional, aligning the types with the greenlight API. Code that reads these fields on those stages must handle undefined.
  • Removed the deprecated blockingBugUrls and nonBlockingBugUrls fields and the CiGreenlightCompletedSuiteDetails type. Use reproducedBugs filtered by isBlocking, reading each bug's applicationUrl.

v1.3.2

  • Bump dependencies to address security alerts.

v1.3.1

  • Address attemptNotifyDeploy timing-out for some teams

v1.3.0

  • New notifyTerminatedEphemeralEnvironment method

v1.2.0

  • New makePollCiGreenlightStatusIterator async generator function for advanced polling control with custom early-exit logic

v1.1.0

  • New ephemeralEnvironment parameter for attemptNotifyDeploy

v1.0.1

  • Internal ESM-related refactoring

v1.0.0

v0.23.1

  • Fix ESM build

v0.23.0

  • Expose an eventId on errors
  • Output the environmentId on attemptNotifyDeploy

v0.22.0

  • Support passing code hosting service repository information and PR/MR number to deployConfig in attemptNotifyDeploy.
  • Handle duplicate_suite_id in attemptNotifyDeploy response.

v0.21.0

  • Make baseEnvironmentsMapping optional in notifyVCSBranchBuildDeployed and notifyVCSBranchMergeCompleted.
  • Send baseVcsBranch when requesting VCS branch testing and VCS branch merge completion.

v0.20.0

  • pollCiGreenlightStatus: bug data fields are now available in the "underReview" run stage.
  • pollCiGreenlightStatus: new otherBlockingBugsInEnvironment response field. Some runs with a subset of workflows in environment will not reproduce blocking bugs in this environment. You can now see these other blocking bugs with this field.

v0.19.0

  • Add abortOnSuperseded option to pollCiGreenlightStatus to allow for aborting the polling operation when the run is superseded.

v0.18.0

  • Add generateSignedUrlForRunInputsExecutablesStorage function to generate a signed url used to upload files to the Run Inputs Executables bucket.

v0.17.1

  • Add detailed feedback when generateSignedUrlForTempTeamStorage fails.

v0.17.0

  • Add generateSignedUrlForTempTeamStorage function to be used in customer's CI pipeline.

v0.16.0

  • Document experimental VCS Branch/PR Testing features.
  • Deprecate experimental_testPreview and experimental_removeEnvironment. These methods will be removed in an upcoming release.

v0.15.8

  • Fix vcsBranchTesting error handling.

v0.15.7

  • Set the default timeout for fetch calls to 60 seconds.

v0.15.6

  • Add a new dependency, @qawolf/ci-utils, and move the LogDriver interface to it.
  • Add new experimental features to the SDK in experimental_vcsBranchTesting. These features are not available to customers nor documented yet, but will be advertised in a near future.

v0.15.5

  • Throw a runtime error when fetch is not defined. This would be the case for setups with a NodeJS version < 18.

v0.15.4

  • Fix broken ESM build due to lacking .js extension in some built files.

v0.15.0

  • New experimental_testPreview and experimental_deleteEnvironment methods.

v0.14.0

  • New failReason, abortReason and httpStatus fields added to the attemptNotifyDeploy function result object to provide more context on why the operation failed or was aborted.
  • Exported missing TypeScript typings describing result objects and fields for both functions.

v0.13.0

  • New pollTimeout parameter for pollCiGreenlightStatus to allow for a custom timeout in milliseconds for the polling operation. It now defaults to two hours.
  • New abortReason and httpStatus fields added to the PollCiGreenlightStatus type with "aborted" outcome to provide more context on why the poll was aborted.

v0.12.1

  • Export dependencies types from root module.
  • Refine DeployConfig.hostingService type to match API requirements.
  • Fix inaccessible changelog file from NPM.

v0.12.0

  • Define a more restrictive LogDriver interface for easy integration with GHA core interface.

v0.11.0

  • Support reproducedBugs field from CI-greenlight API.

:warning: These are the last breaking changes brought to the 0.x major version. These are being introduced while the SDK hasn't been advertised to the public yet. Future changes will follow the SemVer versioning scheme.

BREAKING CHANGES:

  • pollCiGreenlightStatus and attemptNotifyDeploy now return a "result" object with an outcome field that can be either "success", "failed" or "aborted", instead of exiting the process with a non-zero code. This will provide more flexibility to the user to decide how to handle the outcome.

v0.10.3

BREAKING CHANGES:

  • Renamed attemptDeploy to attemptNotifyDeploy .

v0.10.2

  • Avoid logging dots after URL names in the logs. Dots can confuse terminal URL detection.

v0.10.1

  • Fix TypeScript types visibility.

v0.10.0

Initial release.

Supported Endpoints

  • /api/deploy_success
  • /api/v0/ci-greenlight/[root-run-id]