import type { ServiceContext } from "./context"; import { ForbiddenError } from "./errors"; import type { Workspace } from "./types"; const featureWorkspaces = { "incident-management": [1, 6850], } satisfies Record>; export type Feature = keyof typeof featureWorkspaces; export const FEATURES = Object.keys(featureWorkspaces) as Feature[]; // `OPENSTATUS_FEATURES` (comma list) turns a feature on for every workspace: // local dev, self-hosting and test runs. function featuresFromEnv(): Set { const processEnv: Record = process.env; const raw = processEnv.OPENSTATUS_FEATURES ?? ""; return new Set( raw .split(",") .map((f) => f.trim()) .filter(Boolean), ); } export function isFeatureEnabled( workspace: Pick, feature: Feature, envFeatures: Set = featuresFromEnv(), ): boolean { const ids: ReadonlyArray = featureWorkspaces[feature]; return ids.includes(workspace.id) || envFeatures.has(feature); } export function enabledFeatures(workspace: Pick): Feature[] { const envFeatures = featuresFromEnv(); return FEATURES.filter((f) => isFeatureEnabled(workspace, f, envFeatures)); } export function requireFeature(ctx: ServiceContext, feature: Feature): void { if (!isFeatureEnabled(ctx.workspace, feature)) { throw new ForbiddenError(`Feature not enabled: ${feature}`); } }