// Runtime string literals - prone to typosconst isEnabled = featureFlags.get('new_checkout'); // Typo: should be 'newCheckout'// No type safetyconst value: any = featureFlags.get('theme'); // Could be anything!// No autocompletefeatureFlags.get('...') // What flags exist?
Flags are defined in flags.config.ts using the FlagKit schema:
flags.config.ts
Copy
import { defineFlags, flag } from "@flagkit-io/core";export const flags = defineFlags({ // Boolean flag newCheckout: flag .boolean() .description("Enable new checkout flow") .default(false) .tags(["payments", "ui"]), // String flag with validation apiEndpoint: flag .string() .description("API base URL") .default("https://api.production.com") .pattern(/^https:\/\//), // Must be HTTPS // Number flag with constraints maxRetries: flag .number() .description("Maximum retry attempts") .min(0) .max(10) .default(3), // Enum flag theme: flag .enum(["light", "dark", "auto"]) .description("UI theme") .default("auto"),});
FlagKit validates your flag definitions at generation time:
flags.config.ts
Copy
export const flags = defineFlags({ // ❌ Error: Invalid default value theme: flag.enum(["light", "dark"]).default("auto"), // 'auto' not in enum! // ❌ Error: Invalid number range pageSize: flag .number() .min(10) .max(5) // Max can't be less than min! .default(20), // ❌ Error: Default doesn't match pattern email: flag .string() .pattern(/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/) .default("not-an-email"),});