diff --git a/src/client/preview.test.ts b/src/client/preview.test.ts index 66e6377..73076f2 100644 --- a/src/client/preview.test.ts +++ b/src/client/preview.test.ts @@ -20,8 +20,11 @@ describe("Preview environment detection", () => { delete process.env.GITHUB_REF_NAME; delete process.env.CI_COMMIT_BRANCH; delete process.env.CIRCLE_BRANCH; + delete process.env.CIRCLE_PULL_REQUEST; delete process.env.BUILD_SOURCEBRANCHNAME; + delete process.env.SYSTEM_PULLREQUEST_PULLREQUESTID; delete process.env.BITBUCKET_BRANCH; + delete process.env.BITBUCKET_PR_ID; delete process.env.TINYBIRD_BRANCH_NAME; delete process.env.TINYBIRD_BRANCH_TOKEN; delete process.env.TINYBIRD_TOKEN; @@ -70,6 +73,36 @@ describe("Preview environment detection", () => { process.env.CI = "true"; expect(isPreviewEnvironment()).toBe(false); }); + + it("returns true for CircleCI pull requests", () => { + process.env.CIRCLE_PULL_REQUEST = "https://github.com/org/repo/pull/1"; + expect(isPreviewEnvironment()).toBe(true); + }); + + it("returns false for CircleCI builds without a pull request", () => { + process.env.CIRCLE_BRANCH = "feature-branch"; + expect(isPreviewEnvironment()).toBe(false); + }); + + it("returns true for Azure DevOps pull requests", () => { + process.env.SYSTEM_PULLREQUEST_PULLREQUESTID = "42"; + expect(isPreviewEnvironment()).toBe(true); + }); + + it("returns false for Azure DevOps builds without a pull request", () => { + process.env.BUILD_SOURCEBRANCHNAME = "feature-branch"; + expect(isPreviewEnvironment()).toBe(false); + }); + + it("returns true for Bitbucket Pipelines pull requests", () => { + process.env.BITBUCKET_PR_ID = "7"; + expect(isPreviewEnvironment()).toBe(true); + }); + + it("returns false for Bitbucket Pipelines builds without a pull request", () => { + process.env.BITBUCKET_BRANCH = "feature-branch"; + expect(isPreviewEnvironment()).toBe(false); + }); }); describe("getPreviewBranchName", () => { diff --git a/src/client/preview.ts b/src/client/preview.ts index 048956e..330b58c 100644 --- a/src/client/preview.ts +++ b/src/client/preview.ts @@ -25,6 +25,9 @@ let cachedBranchName: string | null = null; /** * Detect if we're running in a preview/CI environment + * + * Recognizes Vercel, GitHub Actions, GitLab, CircleCI, Azure DevOps, + * Bitbucket Pipelines, and generic CI (with an explicit preview flag). */ export function isPreviewEnvironment(): boolean { return !!( @@ -34,6 +37,12 @@ export function isPreviewEnvironment(): boolean { process.env.GITHUB_HEAD_REF || // GitLab CI (merge requests) process.env.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME || + // CircleCI (PRs) + process.env.CIRCLE_PULL_REQUEST || + // Azure Pipelines (PRs) + process.env.SYSTEM_PULLREQUEST_PULLREQUESTID || + // Bitbucket Pipelines (PRs) + process.env.BITBUCKET_PR_ID || // Generic CI with preview indicator (process.env.CI && process.env.TINYBIRD_PREVIEW_MODE === "true") );