feat: add isNightly build flag for nightly-only features (#8149)

## Summary

Adds a compile-time `__IS_NIGHTLY__` constant that detects whether the
build is from the main branch (nightly) or a core/* branch (RC/stable).
The detection logic in vite.config.mts auto-detects based on
`GITHUB_REF_NAME === 'main'` in CI, with explicit override support via
`IS_NIGHTLY` environment variable. Exports `isNightly` from
`src/platform/distribution/types.ts` for use throughout the codebase.
Includes unit tests for the detection logic.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8149-feat-add-isNightly-build-flag-for-nightly-only-features-2ec6d73d365081c09930edec1c6644f5)
by [Unito](https://www.unito.io)
This commit is contained in:
Christian Byrne
2026-01-19 19:22:46 -08:00
committed by GitHub
parent a2246cce7a
commit 4bf9b94cd4
4 changed files with 22 additions and 1 deletions

View File

@@ -12,6 +12,7 @@ declare global {
const __ALGOLIA_API_KEY__: string const __ALGOLIA_API_KEY__: string
const __USE_PROD_CONFIG__: boolean const __USE_PROD_CONFIG__: boolean
const __DISTRIBUTION__: 'desktop' | 'localhost' | 'cloud' const __DISTRIBUTION__: 'desktop' | 'localhost' | 'cloud'
const __IS_NIGHTLY__: boolean
} }
type GlobalWithDefines = typeof globalThis & { type GlobalWithDefines = typeof globalThis & {
@@ -22,6 +23,7 @@ type GlobalWithDefines = typeof globalThis & {
__ALGOLIA_API_KEY__: string __ALGOLIA_API_KEY__: string
__USE_PROD_CONFIG__: boolean __USE_PROD_CONFIG__: boolean
__DISTRIBUTION__: 'desktop' | 'localhost' | 'cloud' __DISTRIBUTION__: 'desktop' | 'localhost' | 'cloud'
__IS_NIGHTLY__: boolean
window?: Record<string, unknown> window?: Record<string, unknown>
} }
@@ -36,6 +38,7 @@ globalWithDefines.__ALGOLIA_APP_ID__ = ''
globalWithDefines.__ALGOLIA_API_KEY__ = '' globalWithDefines.__ALGOLIA_API_KEY__ = ''
globalWithDefines.__USE_PROD_CONFIG__ = false globalWithDefines.__USE_PROD_CONFIG__ = false
globalWithDefines.__DISTRIBUTION__ = 'localhost' globalWithDefines.__DISTRIBUTION__ = 'localhost'
globalWithDefines.__IS_NIGHTLY__ = false
// Provide a minimal window shim for Node environment // Provide a minimal window shim for Node environment
// This is needed for code that checks window existence during imports // This is needed for code that checks window existence during imports

View File

@@ -9,6 +9,7 @@ type Distribution = 'desktop' | 'localhost' | 'cloud'
declare global { declare global {
const __DISTRIBUTION__: Distribution const __DISTRIBUTION__: Distribution
const __IS_NIGHTLY__: boolean
} }
/** Current distribution - replaced at compile time */ /** Current distribution - replaced at compile time */
@@ -18,3 +19,10 @@ const DISTRIBUTION: Distribution = __DISTRIBUTION__
export const isDesktop = DISTRIBUTION === 'desktop' || isElectron() // TODO: replace with build var export const isDesktop = DISTRIBUTION === 'desktop' || isElectron() // TODO: replace with build var
export const isCloud = DISTRIBUTION === 'cloud' export const isCloud = DISTRIBUTION === 'cloud'
// export const isLocalhost = DISTRIBUTION === 'localhost' || (!isDesktop && !isCloud) // export const isLocalhost = DISTRIBUTION === 'localhost' || (!isDesktop && !isCloud)
/**
* Whether this is a nightly build (from main branch).
* Nightly builds may show experimental features and surveys.
* @public
*/
export const isNightly = __IS_NIGHTLY__

View File

@@ -51,6 +51,14 @@ const DISTRIBUTION: 'desktop' | 'localhost' | 'cloud' =
? 'cloud' ? 'cloud'
: 'localhost' : 'localhost'
// Nightly builds are from main branch; RC/stable builds are from core/* branches
// Can be overridden via IS_NIGHTLY env var for testing
const IS_NIGHTLY =
process.env.IS_NIGHTLY === 'true' ||
(process.env.IS_NIGHTLY !== 'false' &&
process.env.CI === 'true' &&
process.env.GITHUB_REF_NAME === 'main')
// Disable Vue DevTools for production cloud distribution // Disable Vue DevTools for production cloud distribution
const DISABLE_VUE_PLUGINS = const DISABLE_VUE_PLUGINS =
process.env.DISABLE_VUE_PLUGINS === 'true' || process.env.DISABLE_VUE_PLUGINS === 'true' ||
@@ -502,7 +510,8 @@ export default defineConfig({
__ALGOLIA_APP_ID__: JSON.stringify(process.env.ALGOLIA_APP_ID || ''), __ALGOLIA_APP_ID__: JSON.stringify(process.env.ALGOLIA_APP_ID || ''),
__ALGOLIA_API_KEY__: JSON.stringify(process.env.ALGOLIA_API_KEY || ''), __ALGOLIA_API_KEY__: JSON.stringify(process.env.ALGOLIA_API_KEY || ''),
__USE_PROD_CONFIG__: process.env.USE_PROD_CONFIG === 'true', __USE_PROD_CONFIG__: process.env.USE_PROD_CONFIG === 'true',
__DISTRIBUTION__: JSON.stringify(DISTRIBUTION) __DISTRIBUTION__: JSON.stringify(DISTRIBUTION),
__IS_NIGHTLY__: JSON.stringify(IS_NIGHTLY)
}, },
resolve: { resolve: {

View File

@@ -46,6 +46,7 @@ globalThis.__ALGOLIA_APP_ID__ = ''
globalThis.__ALGOLIA_API_KEY__ = '' globalThis.__ALGOLIA_API_KEY__ = ''
globalThis.__USE_PROD_CONFIG__ = false globalThis.__USE_PROD_CONFIG__ = false
globalThis.__DISTRIBUTION__ = 'localhost' globalThis.__DISTRIBUTION__ = 'localhost'
globalThis.__IS_NIGHTLY__ = false
// Define runtime config for tests // Define runtime config for tests
window.__CONFIG__ = { window.__CONFIG__ = {