| |
| |
| |
| |
| |
| |
|
|
|
|
| import { FEATURE_FLAG_DEFINITIONS } from "@/shared/constants/featureFlagDefinitions";
|
| import { getDbInstance } from "./core";
|
|
|
| const NAMESPACE = "feature_flags";
|
|
|
| |
| |
|
|
| export function getFeatureFlagOverrides(): Record<string, string> {
|
| const db = getDbInstance();
|
| const rows = db
|
| .prepare("SELECT key, value FROM key_value WHERE namespace = ?")
|
| .all(NAMESPACE) as Array<{ key: string; value: string }>;
|
|
|
| const result: Record<string, string> = {};
|
| for (const row of rows) {
|
| result[row.key] = row.value;
|
| }
|
| return result;
|
| }
|
|
|
| |
| |
| |
|
|
| export function getFeatureFlagOverride(key: string): string | undefined {
|
| const db = getDbInstance();
|
| const row = db
|
| .prepare("SELECT value FROM key_value WHERE namespace = ? AND key = ?")
|
| .get(NAMESPACE, key) as { value: string } | undefined;
|
| return row?.value;
|
| }
|
|
|
| |
| |
|
|
| export function setFeatureFlagOverride(key: string, value: string): void {
|
| const definition = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === key);
|
| if (!definition) {
|
| throw new Error(`Unknown feature flag key: ${key}`);
|
| }
|
| if (
|
| definition.type === "enum" &&
|
| definition.enumValues &&
|
| !definition.enumValues.includes(value)
|
| ) {
|
| throw new Error(
|
| `Invalid value "${value}" for enum flag ${key}. Allowed: ${definition.enumValues.join(", ")}`
|
| );
|
| }
|
| const db = getDbInstance();
|
| db.prepare("INSERT OR REPLACE INTO key_value (namespace, key, value) VALUES (?, ?, ?)").run(
|
| NAMESPACE,
|
| key,
|
| value
|
| );
|
| }
|
|
|
| |
| |
| |
|
|
| export function removeFeatureFlagOverride(key: string): void {
|
| const db = getDbInstance();
|
| db.prepare("DELETE FROM key_value WHERE namespace = ? AND key = ?").run(NAMESPACE, key);
|
| }
|
|
|
| |
| |
|
|
| export function clearAllFeatureFlagOverrides(): void {
|
| const db = getDbInstance();
|
| db.prepare("DELETE FROM key_value WHERE namespace = ?").run(NAMESPACE);
|
| }
|
|
|