File size: 1,733 Bytes
7a1ad33 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | /**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { getPackageJson } from './package.js';
export enum ReleaseChannel {
NIGHTLY = 'nightly',
PREVIEW = 'preview',
STABLE = 'stable',
}
/**
* Stability ranking for release channels. Higher number means more stable.
*/
export const RELEASE_CHANNEL_STABILITY: Record<ReleaseChannel, number> = {
[ReleaseChannel.NIGHTLY]: 0,
[ReleaseChannel.PREVIEW]: 1,
[ReleaseChannel.STABLE]: 2,
};
const cache = new Map<string, ReleaseChannel>();
/**
* Clears the cache for testing purposes.
* @private
*/
export function _clearCache() {
cache.clear();
}
/**
* Determines the release channel for a given version string.
*/
export function getChannelFromVersion(version: string): ReleaseChannel {
if (!version || version.includes('nightly')) {
return ReleaseChannel.NIGHTLY;
}
if (version.includes('preview')) {
return ReleaseChannel.PREVIEW;
}
return ReleaseChannel.STABLE;
}
export async function getReleaseChannel(cwd: string): Promise<ReleaseChannel> {
if (cache.has(cwd)) {
return cache.get(cwd)!;
}
const packageJson = await getPackageJson(cwd);
const version = packageJson?.version ?? '';
const channel = getChannelFromVersion(version);
cache.set(cwd, channel);
return channel;
}
export async function isNightly(cwd: string): Promise<boolean> {
return (await getReleaseChannel(cwd)) === ReleaseChannel.NIGHTLY;
}
export async function isPreview(cwd: string): Promise<boolean> {
return (await getReleaseChannel(cwd)) === ReleaseChannel.PREVIEW;
}
export async function isStable(cwd: string): Promise<boolean> {
return (await getReleaseChannel(cwd)) === ReleaseChannel.STABLE;
}
|