@better-fullstack/types 1.4.11 → 1.4.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +105 -4
- package/dist/index.mjs.map +1 -1
- package/dist/json-schema.d.mts +68 -0
- package/dist/json-schema.d.mts.map +1 -1
- package/dist/json-schema.mjs +1 -1
- package/dist/{schemas-BvKM2MFE.d.mts → schemas-BRuvXx35.d.mts} +59 -4
- package/dist/schemas-BRuvXx35.d.mts.map +1 -0
- package/dist/{schemas-C7jVbcHC.mjs → schemas-CaXcn795.mjs} +9 -2
- package/dist/schemas-CaXcn795.mjs.map +1 -0
- package/dist/schemas.d.mts +1 -1
- package/dist/schemas.mjs +1 -1
- package/package.json +1 -1
- package/dist/schemas-BvKM2MFE.d.mts.map +0 -1
- package/dist/schemas-C7jVbcHC.mjs.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["CAPABILITY_DEFINITIONS: {\n [K in CapabilityName]: readonly CapabilityDefinitionMap[K][];\n}","_exhaustive: never","CATEGORY_ORDER: CompatibilityCategory[]","rustCategoryNames: Record<string, string>","pythonCategoryNames: Record<string, string>","goCategoryNames: Record<string, string>","notes: CompatibilityAnalysisResult[\"notes\"]","changes: CompatibilityAdjustment[]","noneOverrides: Partial<CompatibilityInput>","WEB_FRAMEWORKS: readonly Frontend[]","UI_LIBRARY_COMPATIBILITY: Record<\n UILibrary,\n {\n frontends: readonly Frontend[];\n cssFrameworks: readonly CSSFramework[];\n }\n>","ADDON_COMPATIBILITY: Record<Addons, readonly Frontend[]>","base: API[]","all: Forms[]","issues: CompatibilityIssue[]","scalarChecks: Array<[CompatibilityCategory, string]>","CATEGORY_VALUE_IDS: Record<OptionCategory, readonly string[]>","EXACT_LABEL_OVERRIDES: Partial<Record<OptionCategory, Partial<Record<string, string>>>>","OPTION_ALIASES: Partial<Record<OptionCategory, Partial<Record<string, readonly string[]>>>>","CLI_VALUE_OVERRIDES: Partial<Record<OptionCategory, Partial<Record<string, string>>>>","TOKEN_LABELS: Record<string, string>","OPTION_CATEGORY_METADATA: Record<OptionCategory, OptionCategoryMetadata>"],"sources":["../src/capabilities.ts","../src/compatibility.ts","../src/option-metadata.ts","../src/local-dev.ts"],"sourcesContent":["import type { Auth, Ecosystem } from \"./types\";\n\nexport type CapabilityName = \"auth\";\n\nexport type CapabilityStackContext = {\n ecosystem?: Ecosystem;\n backend?: string;\n frontend?: readonly string[];\n webFrontend?: readonly string[];\n nativeFrontend?: readonly string[];\n};\n\nexport type CapabilityDefinitionBase = {\n id: string;\n label: string;\n description: string;\n promptHint: string;\n icon: string;\n color: string;\n default?: boolean;\n};\n\nexport type AuthCapabilityDefinition = CapabilityDefinitionBase & {\n id: Auth;\n};\n\ntype CapabilityDefinitionMap = {\n auth: AuthCapabilityDefinition;\n};\n\nexport type CapabilityDefinition<K extends CapabilityName = CapabilityName> =\n CapabilityDefinitionMap[K];\n\nexport type CapabilityNormalizationResult<K extends CapabilityName = CapabilityName> = {\n value: CapabilityDefinitionMap[K][\"id\"];\n normalized: boolean;\n reason: string | null;\n message: string | null;\n};\n\nconst AUTH_CAPABILITIES = [\n {\n id: \"better-auth\",\n label: \"Better-Auth\",\n description: \"The most comprehensive authentication framework for TypeScript\",\n promptHint: \"comprehensive auth framework for TypeScript\",\n icon: \"/icon/better-auth.svg\",\n color: \"from-green-400 to-green-600\",\n default: true,\n },\n {\n id: \"go-better-auth\",\n label: \"GoBetterAuth\",\n description: \"Embedded auth routes for Go applications\",\n promptHint: \"embedded auth routes for Go applications\",\n icon: \"https://cdn.simpleicons.org/go/00ADD8\",\n color: \"from-cyan-400 to-sky-600\",\n },\n {\n id: \"clerk\",\n label: \"Clerk\",\n description: \"More than authentication, Complete User Management\",\n promptHint: \"More than auth, Complete User Management\",\n icon: \"https://cdn.simpleicons.org/clerk/6C47FF\",\n color: \"from-blue-400 to-blue-600\",\n },\n {\n id: \"nextauth\",\n label: \"Auth.js (NextAuth)\",\n description: \"Open source authentication for Next.js\",\n promptHint: \"Authentication for Next.js (formerly NextAuth.js)\",\n icon: \"/icon/nextauth.png\",\n color: \"from-orange-400 to-orange-600\",\n },\n {\n id: \"stack-auth\",\n label: \"Stack Auth\",\n description: \"Open-source Auth0/Clerk alternative with user management\",\n promptHint: \"Open-source Auth0/Clerk alternative\",\n icon: \"/icon/stack-auth.svg\",\n color: \"from-purple-400 to-purple-600\",\n },\n {\n id: \"supabase-auth\",\n label: \"Supabase Auth\",\n description: \"Open-source Auth with Supabase platform integration\",\n promptHint: \"Auth with Supabase platform integration\",\n icon: \"https://cdn.simpleicons.org/supabase/3FCF8E\",\n color: \"from-emerald-400 to-emerald-600\",\n },\n {\n id: \"auth0\",\n label: \"Auth0\",\n description: \"Flexible identity platform for authentication and authorization\",\n promptHint: \"Flexible identity platform for authentication\",\n icon: \"https://cdn.simpleicons.org/auth0/EB5424\",\n color: \"from-orange-400 to-orange-600\",\n },\n {\n id: \"none\",\n label: \"No Auth\",\n description: \"Skip authentication\",\n promptHint: \"No authentication\",\n icon: \"\",\n color: \"from-red-400 to-red-600\",\n },\n] as const satisfies readonly AuthCapabilityDefinition[];\n\nconst CAPABILITY_DEFINITIONS: {\n [K in CapabilityName]: readonly CapabilityDefinitionMap[K][];\n} = {\n auth: AUTH_CAPABILITIES,\n};\n\nconst NATIVE_FRONTENDS = new Set([\"native-bare\", \"native-uniwind\", \"native-unistyles\"]);\nconst CONVEX_BETTER_AUTH_WEB = new Set([\"react-vite\", \"tanstack-router\", \"tanstack-start\", \"next\"]);\nconst CONVEX_CLERK_WEB = new Set([\n \"react-router\",\n \"react-vite\",\n \"tanstack-router\",\n \"tanstack-start\",\n \"next\",\n]);\n\nfunction capitalizeFirst(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction dedupe(values: readonly string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction getFrontendSets(context: CapabilityStackContext): {\n webFrontend: string[];\n nativeFrontend: string[];\n} {\n if (context.frontend) {\n const webFrontend = context.frontend.filter((frontend) => !NATIVE_FRONTENDS.has(frontend));\n const nativeFrontend = context.frontend.filter((frontend) => NATIVE_FRONTENDS.has(frontend));\n return {\n webFrontend: dedupe(webFrontend),\n nativeFrontend: dedupe(nativeFrontend),\n };\n }\n\n return {\n webFrontend: dedupe(context.webFrontend ?? []),\n nativeFrontend: dedupe(context.nativeFrontend ?? []),\n };\n}\n\nfunction isSelfBackend(backend?: string): boolean {\n return backend === \"self\" || backend?.startsWith(\"self-\") === true;\n}\n\nfunction getNextOnlyAuthLabel(optionId: Exclude<Auth, \"none\" | \"better-auth\" | \"go-better-auth\" | \"clerk\">): string {\n switch (optionId) {\n case \"nextauth\":\n return \"Auth.js (NextAuth)\";\n case \"stack-auth\":\n return \"Stack Auth\";\n case \"supabase-auth\":\n return \"Supabase Auth\";\n case \"auth0\":\n return \"Auth0\";\n default: {\n const _exhaustive: never = optionId;\n return String(_exhaustive);\n }\n }\n}\n\nfunction getAuthDisabledReason(context: CapabilityStackContext, optionId: Auth): string | null {\n if (optionId === \"none\") return null;\n\n const ecosystem = context.ecosystem ?? \"typescript\";\n const backend = context.backend;\n const { webFrontend, nativeFrontend } = getFrontendSets(context);\n const hasNextJs = webFrontend.includes(\"next\");\n const hasTanStackStart = webFrontend.includes(\"tanstack-start\");\n const hasNativeFrontend = nativeFrontend.some((frontend) => frontend !== \"none\");\n\n if (optionId === \"go-better-auth\") {\n return ecosystem === \"go\" ? null : \"GoBetterAuth is available only for Go stacks\";\n }\n\n if (ecosystem === \"go\") {\n return \"Go stacks currently support GoBetterAuth only\";\n }\n\n if (ecosystem !== \"typescript\") {\n return `${capitalizeFirst(ecosystem)} stacks do not support auth integrations yet`;\n }\n\n if (backend === \"none\") {\n return \"No backend selected\";\n }\n\n if (optionId === \"better-auth\") {\n if (backend === \"convex\") {\n const hasCompatibleFrontend =\n webFrontend.some((frontend) => CONVEX_BETTER_AUTH_WEB.has(frontend)) ||\n nativeFrontend.some((frontend) => NATIVE_FRONTENDS.has(frontend));\n\n if (!hasCompatibleFrontend) {\n return \"Better-Auth with Convex requires React + Vite, TanStack Router, TanStack Start, Next.js, or React Native\";\n }\n }\n\n return null;\n }\n\n if (optionId === \"clerk\") {\n if (backend === \"convex\") {\n const hasCompatibleFrontend =\n webFrontend.some((frontend) => CONVEX_CLERK_WEB.has(frontend)) ||\n nativeFrontend.some((frontend) => NATIVE_FRONTENDS.has(frontend));\n\n if (!hasCompatibleFrontend) {\n return \"Clerk with Convex requires React Router, React + Vite, TanStack Router, TanStack Start, Next.js, or React Native\";\n }\n\n return null;\n }\n\n if (isSelfBackend(backend)) {\n if ((hasNextJs || hasTanStackStart) && hasNativeFrontend) {\n return \"In Better-Fullstack, Clerk with self backend is currently supported only for web-only Next.js or TanStack Start projects (no native companion app)\";\n }\n\n if (hasNextJs || hasTanStackStart) {\n return null;\n }\n\n if (backend === \"self-astro\" || webFrontend.includes(\"astro\")) {\n return \"In Better-Fullstack, Clerk is not yet supported for Astro fullstack projects\";\n }\n if (backend === \"self-nuxt\" || webFrontend.includes(\"nuxt\")) {\n return \"In Better-Fullstack, Clerk is not yet supported for Nuxt fullstack projects\";\n }\n if (backend === \"self-svelte\" || webFrontend.includes(\"svelte\")) {\n return \"In Better-Fullstack, Clerk is not yet supported for SvelteKit fullstack projects\";\n }\n if (backend === \"self-solid-start\" || webFrontend.includes(\"solid-start\")) {\n return \"In Better-Fullstack, Clerk is not yet supported for SolidStart fullstack projects\";\n }\n\n return \"In Better-Fullstack, Clerk is currently supported with Convex, Next.js fullstack, or TanStack Start fullstack\";\n }\n\n return \"In Better-Fullstack, Clerk is currently supported with Convex, Next.js fullstack, or TanStack Start fullstack\";\n }\n\n const nextOnlyLabel = getNextOnlyAuthLabel(optionId);\n if (backend !== \"self\" && backend !== \"self-next\") {\n return `In Better-Fullstack, ${nextOnlyLabel} is currently supported only with the 'self' backend (fullstack Next.js)`;\n }\n\n if (!hasNextJs) {\n return `In Better-Fullstack, ${nextOnlyLabel} currently requires the Next.js frontend`;\n }\n\n return null;\n}\n\nexport function getCapabilityDefinitions<K extends CapabilityName>(\n capability: K,\n): readonly CapabilityDefinitionMap[K][] {\n return CAPABILITY_DEFINITIONS[capability];\n}\n\nexport function getCapabilityDisabledReason<K extends CapabilityName>(\n capability: K,\n context: CapabilityStackContext,\n optionId: CapabilityDefinitionMap[K][\"id\"],\n): string | null {\n if (capability === \"auth\") {\n return getAuthDisabledReason(context, optionId as Auth) as string | null;\n }\n\n return null;\n}\n\nexport function getSupportedCapabilityOptions<K extends CapabilityName>(\n capability: K,\n context: CapabilityStackContext,\n): readonly CapabilityDefinitionMap[K][] {\n return getCapabilityDefinitions(capability).filter(\n (definition) => getCapabilityDisabledReason(capability, context, definition.id) === null,\n );\n}\n\nexport function normalizeCapabilitySelection<K extends CapabilityName>(\n capability: K,\n context: CapabilityStackContext,\n optionId: CapabilityDefinitionMap[K][\"id\"] | undefined,\n): CapabilityNormalizationResult<K> {\n const fallbackValue = \"none\" as CapabilityDefinitionMap[K][\"id\"];\n\n if (!optionId || optionId === fallbackValue) {\n return {\n value: (optionId ?? fallbackValue) as CapabilityDefinitionMap[K][\"id\"],\n normalized: false,\n reason: null,\n message: null,\n };\n }\n\n const reason = getCapabilityDisabledReason(capability, context, optionId);\n if (!reason) {\n return {\n value: optionId,\n normalized: false,\n reason: null,\n message: null,\n };\n }\n\n return {\n value: fallbackValue,\n normalized: true,\n reason,\n message: `${capitalizeFirst(capability)} set to 'None' (${reason})`,\n };\n}\n","import type {\n Addons,\n API,\n AstroIntegration,\n Auth,\n Backend,\n CSSFramework,\n Forms,\n Frontend,\n Runtime,\n UILibrary,\n} from \"./types\";\nimport {\n getCapabilityDisabledReason,\n normalizeCapabilitySelection,\n} from \"./capabilities\";\n\nexport type CompatibilityCategory =\n | \"api\"\n | \"webFrontend\"\n | \"nativeFrontend\"\n | \"astroIntegration\"\n | \"runtime\"\n | \"backend\"\n | \"database\"\n | \"orm\"\n | \"dbSetup\"\n | \"webDeploy\"\n | \"serverDeploy\"\n | \"auth\"\n | \"payments\"\n | \"email\"\n | \"fileUpload\"\n | \"logging\"\n | \"observability\"\n | \"backendLibraries\"\n | \"stateManagement\"\n | \"forms\"\n | \"validation\"\n | \"testing\"\n | \"realtime\"\n | \"jobQueue\"\n | \"caching\"\n | \"search\"\n | \"fileStorage\"\n | \"animation\"\n | \"cssFramework\"\n | \"uiLibrary\"\n | \"cms\"\n | \"featureFlags\"\n | \"analytics\"\n | \"codeQuality\"\n | \"documentation\"\n | \"appPlatforms\"\n | \"packageManager\"\n | \"examples\"\n | \"ai\"\n | \"aiDocs\"\n | \"git\"\n | \"install\"\n | \"effect\"\n | \"rustWebFramework\"\n | \"rustFrontend\"\n | \"rustOrm\"\n | \"rustApi\"\n | \"rustCli\"\n | \"rustLibraries\"\n | \"pythonWebFramework\"\n | \"pythonOrm\"\n | \"pythonValidation\"\n | \"pythonAi\"\n | \"pythonTaskQueue\"\n | \"pythonQuality\"\n | \"goWebFramework\"\n | \"goOrm\"\n | \"goApi\"\n | \"goCli\"\n | \"goLogging\";\n\nexport type CompatibilityIssue = {\n code: string;\n message: string;\n category?: CompatibilityCategory;\n optionId?: string;\n};\n\nexport type CompatibilityEvaluation = {\n issues: CompatibilityIssue[];\n};\n\nexport type CompatibilityAdjustment = {\n category: string;\n message: string;\n};\n\nexport type CompatibilityInput = {\n ecosystem: \"typescript\" | \"rust\" | \"python\" | \"go\";\n projectName: string | null;\n webFrontend: string[];\n nativeFrontend: string[];\n astroIntegration: string;\n runtime: string;\n backend: string;\n database: string;\n orm: string;\n dbSetup: string;\n auth: string;\n payments: string;\n email: string;\n fileUpload: string;\n logging: string;\n observability: string;\n featureFlags: string;\n analytics: string;\n backendLibraries: string;\n stateManagement: string;\n forms: string;\n validation: string;\n testing: string;\n realtime: string;\n jobQueue: string;\n caching: string;\n animation: string;\n cssFramework: string;\n uiLibrary: string;\n cms: string;\n search: string;\n fileStorage: string;\n codeQuality: string[];\n documentation: string[];\n appPlatforms: string[];\n packageManager: string;\n examples: string[];\n aiSdk: string;\n aiDocs: string[];\n git: string;\n install: string;\n api: string;\n webDeploy: string;\n serverDeploy: string;\n yolo: string;\n rustWebFramework: string;\n rustFrontend: string;\n rustOrm: string;\n rustApi: string;\n rustCli: string;\n rustLibraries: string;\n pythonWebFramework: string;\n pythonOrm: string;\n pythonValidation: string;\n pythonAi: string;\n pythonTaskQueue: string;\n pythonQuality: string;\n goWebFramework: string;\n goOrm: string;\n goApi: string;\n goCli: string;\n goLogging: string;\n};\n\nconst TYPESCRIPT_CATEGORY_ORDER: CompatibilityCategory[] = [\n \"webFrontend\",\n \"nativeFrontend\",\n \"astroIntegration\",\n \"cssFramework\",\n \"uiLibrary\",\n \"backend\",\n \"backendLibraries\",\n \"runtime\",\n \"api\",\n \"database\",\n \"orm\",\n \"dbSetup\",\n \"webDeploy\",\n \"serverDeploy\",\n \"auth\",\n \"payments\",\n \"email\",\n \"fileUpload\",\n \"logging\",\n \"observability\",\n \"featureFlags\",\n \"analytics\",\n \"ai\",\n \"stateManagement\",\n \"forms\",\n \"validation\",\n \"testing\",\n \"realtime\",\n \"jobQueue\",\n \"caching\",\n \"search\",\n \"fileStorage\",\n \"animation\",\n \"cms\",\n \"codeQuality\",\n \"documentation\",\n \"appPlatforms\",\n \"packageManager\",\n \"examples\",\n \"aiDocs\",\n \"git\",\n \"install\",\n];\n\nconst CATEGORY_ORDER: CompatibilityCategory[] = [\n ...TYPESCRIPT_CATEGORY_ORDER,\n \"rustWebFramework\",\n \"rustFrontend\",\n \"rustOrm\",\n \"rustApi\",\n \"rustCli\",\n \"rustLibraries\",\n \"pythonWebFramework\",\n \"pythonOrm\",\n \"pythonValidation\",\n \"pythonAi\",\n \"pythonTaskQueue\",\n \"pythonQuality\",\n \"goWebFramework\",\n \"goOrm\",\n \"goApi\",\n \"goCli\",\n \"goLogging\",\n];\n\nconst DEFAULT_RUNTIME = \"bun\";\n\nexport function validateProjectName(name: string): string | undefined {\n const INVALID_CHARS = [\"<\", \">\", \":\", '\"', \"|\", \"?\", \"*\"];\n const MAX_LENGTH = 255;\n\n if (name === \".\") return undefined;\n\n if (!name) return \"Project name cannot be empty\";\n if (name.length > MAX_LENGTH) {\n return `Project name must be less than ${MAX_LENGTH} characters`;\n }\n if (INVALID_CHARS.some((char) => name.includes(char))) {\n return \"Project name contains invalid characters\";\n }\n if (name.startsWith(\".\") || name.startsWith(\"-\")) {\n return \"Project name cannot start with a dot or dash\";\n }\n if (name.toLowerCase() === \"node_modules\" || name.toLowerCase() === \"favicon.ico\") {\n return \"Project name is reserved\";\n }\n return undefined;\n}\n\nexport const hasPWACompatibleFrontend = (webFrontend: string[]) =>\n webFrontend.some((f) =>\n [\"tanstack-router\", \"react-router\", \"react-vite\", \"solid\", \"next\", \"astro\"].includes(f),\n );\n\nexport const hasTauriCompatibleFrontend = (webFrontend: string[]) =>\n webFrontend.some((f) =>\n [\"tanstack-router\", \"react-router\", \"react-vite\", \"nuxt\", \"svelte\", \"solid\", \"next\", \"astro\"].includes(f),\n );\n\nconst isChatSdkExampleSupported = (stack: CompatibilityInput): boolean => {\n if (stack.ecosystem !== \"typescript\") return false;\n\n if (stack.backend === \"self-next\" || stack.backend === \"self-tanstack-start\") {\n return true;\n }\n\n if (stack.backend === \"self-nuxt\") {\n return true;\n }\n\n if (stack.backend === \"hono\") {\n return stack.runtime === \"node\";\n }\n\n return false;\n};\n\nexport const requiresChatSdkVercelAI = (stack: CompatibilityInput): boolean => {\n return (\n stack.examples.includes(\"chat-sdk\") &&\n (stack.backend === \"self-nuxt\" || (stack.backend === \"hono\" && stack.runtime === \"node\"))\n );\n};\n\nexport const getCategoryDisplayName = (categoryKey: string): string => {\n // Custom display names for Rust categories\n const rustCategoryNames: Record<string, string> = {\n rustWebFramework: \"Rust Web Framework\",\n rustFrontend: \"Rust Frontend (WASM)\",\n rustOrm: \"Rust ORM / Database\",\n rustApi: \"Rust API Layer\",\n rustCli: \"Rust CLI Tools\",\n rustLibraries: \"Rust Core Libraries\",\n };\n\n // Custom display names for Python categories\n const pythonCategoryNames: Record<string, string> = {\n pythonWebFramework: \"Python Web Framework\",\n pythonOrm: \"Python ORM / Database\",\n pythonValidation: \"Python Validation\",\n pythonAi: \"Python AI / ML\",\n pythonTaskQueue: \"Python Task Queue\",\n pythonQuality: \"Python Code Quality\",\n };\n\n // Custom display names for Go categories\n const goCategoryNames: Record<string, string> = {\n goWebFramework: \"Go Web Framework\",\n goOrm: \"Go ORM / Database\",\n goApi: \"Go API Layer\",\n goCli: \"Go CLI Tools\",\n goLogging: \"Go Logging\",\n };\n\n if (rustCategoryNames[categoryKey]) {\n return rustCategoryNames[categoryKey];\n }\n\n if (pythonCategoryNames[categoryKey]) {\n return pythonCategoryNames[categoryKey];\n }\n\n if (goCategoryNames[categoryKey]) {\n return goCategoryNames[categoryKey];\n }\n\n const result = categoryKey.replace(/([A-Z])/g, \" $1\");\n return result.charAt(0).toUpperCase() + result.slice(1);\n};\n\nexport type CompatibilityAnalysisResult = {\n adjustedStack: CompatibilityInput | null;\n notes: Record<string, { notes: string[]; hasIssue: boolean }>;\n changes: CompatibilityAdjustment[];\n};\n\n/**\n * Analyzes the stack and auto-adjusts incompatible selections.\n * This follows the CLI approach: when you make a selection, dependent items adjust automatically.\n * The flow is: frontend -> backend -> runtime -> database -> orm -> api -> auth -> etc.\n */\nexport const analyzeStackCompatibility = (\n stack: CompatibilityInput,\n): CompatibilityAnalysisResult => {\n // Skip all validation if YOLO mode is enabled\n if (stack.yolo === \"true\") {\n return {\n adjustedStack: null,\n notes: {},\n changes: [],\n };\n }\n\n const nextStack = { ...stack };\n let changed = false;\n const notes: CompatibilityAnalysisResult[\"notes\"] = {};\n const changes: CompatibilityAdjustment[] = [];\n\n for (const cat of CATEGORY_ORDER) {\n notes[cat] = { notes: [], hasIssue: false };\n }\n\n // ============================================\n // BACKEND CONSTRAINTS\n // ============================================\n\n if (nextStack.backend === \"convex\") {\n // Convex handles its own runtime, database, orm, api, dbSetup\n const convexOverrides: Partial<CompatibilityInput> = {\n runtime: \"none\",\n database: \"none\",\n orm: \"none\",\n api: \"none\",\n dbSetup: \"none\",\n serverDeploy: \"none\",\n search: \"none\",\n fileStorage: \"none\",\n };\n\n for (const [key, value] of Object.entries(convexOverrides)) {\n const catKey = key as keyof CompatibilityInput;\n if (nextStack[catKey] !== value) {\n nextStack[catKey] = value as never;\n changed = true;\n changes.push({\n category: \"backend\",\n message: `${getCategoryDisplayName(catKey)} set to '${value}' (Convex provides this)`,\n });\n }\n }\n\n // Remove incompatible frontends\n if (nextStack.webFrontend.includes(\"solid\")) {\n nextStack.webFrontend = nextStack.webFrontend.filter((f) => f !== \"solid\");\n if (nextStack.webFrontend.length === 0) nextStack.webFrontend = [\"none\"];\n changed = true;\n changes.push({ category: \"backend\", message: \"Removed Solid (incompatible with Convex)\" });\n }\n if (nextStack.webFrontend.includes(\"solid-start\")) {\n nextStack.webFrontend = nextStack.webFrontend.filter((f) => f !== \"solid-start\");\n if (nextStack.webFrontend.length === 0) nextStack.webFrontend = [\"none\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Removed SolidStart (incompatible with Convex)\",\n });\n }\n if (nextStack.webFrontend.includes(\"astro\")) {\n nextStack.webFrontend = nextStack.webFrontend.filter((f) => f !== \"astro\");\n if (nextStack.webFrontend.length === 0) nextStack.webFrontend = [\"none\"];\n nextStack.astroIntegration = \"none\";\n changed = true;\n changes.push({ category: \"backend\", message: \"Removed Astro (incompatible with Convex)\" });\n }\n\n // Remove AI example if incompatible frontends are selected (Convex AI supports React-based frontends, including React + Vite)\n if (nextStack.examples.includes(\"ai\")) {\n const hasIncompatibleFrontend = nextStack.webFrontend.some((f) =>\n [\"solid\", \"svelte\", \"nuxt\"].includes(f),\n );\n if (hasIncompatibleFrontend) {\n nextStack.examples = nextStack.examples.filter((e) => e !== \"ai\");\n if (nextStack.examples.length === 0) nextStack.examples = [\"none\"];\n changed = true;\n changes.push({\n category: \"examples\",\n message:\n \"AI example removed (Convex AI only supports React-based frontends including React + Vite)\",\n });\n }\n }\n\n }\n\n if (nextStack.backend === \"none\") {\n // No backend means no runtime, database, orm, api, auth, dbSetup, serverDeploy\n const noneOverrides: Partial<CompatibilityInput> = {\n runtime: \"none\",\n database: \"none\",\n orm: \"none\",\n api: \"none\",\n dbSetup: \"none\",\n serverDeploy: \"none\",\n payments: \"none\",\n search: \"none\",\n fileStorage: \"none\",\n };\n\n if (nextStack.ecosystem !== \"go\") {\n noneOverrides.auth = \"none\";\n }\n\n for (const [key, value] of Object.entries(noneOverrides)) {\n const catKey = key as keyof CompatibilityInput;\n if (nextStack[catKey] !== value) {\n nextStack[catKey] = value as never;\n changed = true;\n changes.push({\n category: \"backend\",\n message: `${getCategoryDisplayName(catKey)} set to '${value}' (no backend)`,\n });\n }\n }\n\n // Clear examples\n if (\n nextStack.examples.length > 0 &&\n !(nextStack.examples.length === 1 && nextStack.examples[0] === \"none\")\n ) {\n nextStack.examples = [\"none\"];\n changed = true;\n changes.push({ category: \"backend\", message: \"Examples cleared (no backend)\" });\n }\n }\n\n // Self (fullstack) backend constraints\n if (\n nextStack.backend === \"self-next\" ||\n nextStack.backend === \"self-tanstack-start\" ||\n nextStack.backend === \"self-astro\" ||\n nextStack.backend === \"self-nuxt\" ||\n nextStack.backend === \"self-svelte\" ||\n nextStack.backend === \"self-solid-start\"\n ) {\n // Fullstack uses frontend's API routes, no separate runtime needed\n if (nextStack.runtime !== \"none\") {\n nextStack.runtime = \"none\";\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Runtime set to 'None' (fullstack uses frontend's API routes)\",\n });\n }\n if (nextStack.serverDeploy !== \"none\") {\n nextStack.serverDeploy = \"none\";\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Server deploy set to 'None' (fullstack uses frontend deployment)\",\n });\n }\n\n // Ensure correct frontend is selected\n if (nextStack.backend === \"self-next\" && !nextStack.webFrontend.includes(\"next\")) {\n nextStack.webFrontend = [\"next\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'Next.js' (required for Next.js fullstack)\",\n });\n }\n if (\n nextStack.backend === \"self-tanstack-start\" &&\n !nextStack.webFrontend.includes(\"tanstack-start\")\n ) {\n nextStack.webFrontend = [\"tanstack-start\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'TanStack Start' (required for TanStack Start fullstack)\",\n });\n }\n if (nextStack.backend === \"self-astro\" && !nextStack.webFrontend.includes(\"astro\")) {\n nextStack.webFrontend = [\"astro\"];\n if (nextStack.astroIntegration === \"none\") {\n nextStack.astroIntegration = \"react\";\n }\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'Astro' (required for Astro fullstack)\",\n });\n }\n if (nextStack.backend === \"self-nuxt\" && !nextStack.webFrontend.includes(\"nuxt\")) {\n nextStack.webFrontend = [\"nuxt\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'Nuxt' (required for Nuxt fullstack)\",\n });\n }\n if (nextStack.backend === \"self-svelte\" && !nextStack.webFrontend.includes(\"svelte\")) {\n nextStack.webFrontend = [\"svelte\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'SvelteKit' (required for SvelteKit fullstack)\",\n });\n }\n if (\n nextStack.backend === \"self-solid-start\" &&\n !nextStack.webFrontend.includes(\"solid-start\")\n ) {\n nextStack.webFrontend = [\"solid-start\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'SolidStart' (required for SolidStart fullstack)\",\n });\n }\n }\n\n // ============================================\n // RUNTIME CONSTRAINTS\n // ============================================\n\n // Workers runtime requires Hono backend\n if (nextStack.runtime === \"workers\" && nextStack.backend !== \"hono\") {\n nextStack.backend = \"hono\";\n changed = true;\n changes.push({ category: \"runtime\", message: \"Backend set to 'Hono' (required for Workers)\" });\n }\n\n // Workers runtime requires server deployment\n if (nextStack.runtime === \"workers\" && nextStack.serverDeploy === \"none\") {\n nextStack.serverDeploy = \"cloudflare\";\n changed = true;\n changes.push({\n category: \"runtime\",\n message: \"Server deploy set to 'Cloudflare' (required for Workers)\",\n });\n }\n\n // Workers runtime is incompatible with MongoDB\n if (nextStack.runtime === \"workers\" && nextStack.database === \"mongodb\") {\n nextStack.database = \"sqlite\";\n nextStack.orm = \"drizzle\";\n nextStack.dbSetup = \"d1\";\n changed = true;\n changes.push({\n category: \"runtime\",\n message:\n \"Database changed to SQLite with D1 (Better-Fullstack doesn't support MongoDB with Workers)\",\n });\n }\n\n // Runtime \"none\" only for convex and fullstack backends\n if (\n nextStack.runtime === \"none\" &&\n nextStack.backend !== \"convex\" &&\n nextStack.backend !== \"none\" &&\n nextStack.backend !== \"self-next\" &&\n nextStack.backend !== \"self-tanstack-start\" &&\n nextStack.backend !== \"self-astro\" &&\n nextStack.backend !== \"self-nuxt\" &&\n nextStack.backend !== \"self-svelte\" &&\n nextStack.backend !== \"self-solid-start\"\n ) {\n nextStack.runtime = DEFAULT_RUNTIME;\n changed = true;\n changes.push({\n category: \"runtime\",\n message: `Runtime set to '${DEFAULT_RUNTIME}' (required for this backend)`,\n });\n }\n\n // ============================================\n // DATABASE & ORM CONSTRAINTS (CLI-like flow)\n // ============================================\n\n // Skip if backend doesn't use database\n if (nextStack.backend !== \"convex\" && nextStack.backend !== \"none\") {\n // If database is none, ORM and dbSetup must be none\n if (nextStack.database === \"none\") {\n if (nextStack.orm !== \"none\") {\n nextStack.orm = \"none\";\n changed = true;\n changes.push({ category: \"database\", message: \"ORM set to 'None' (no database selected)\" });\n }\n if (nextStack.dbSetup !== \"none\") {\n nextStack.dbSetup = \"none\";\n changed = true;\n changes.push({\n category: \"database\",\n message: \"DB Setup set to 'None' (no database selected)\",\n });\n }\n }\n\n // MongoDB requires Prisma or Mongoose\n if (nextStack.database === \"mongodb\") {\n if (nextStack.orm !== \"prisma\" && nextStack.orm !== \"mongoose\") {\n nextStack.orm = \"prisma\";\n changed = true;\n changes.push({\n category: \"database\",\n message: \"ORM set to 'Prisma' (required for MongoDB)\",\n });\n }\n // MongoDB only works with mongodb-atlas or none for dbSetup\n if (\n nextStack.dbSetup !== \"mongodb-atlas\" &&\n nextStack.dbSetup !== \"none\" &&\n nextStack.dbSetup !== \"docker\"\n ) {\n nextStack.dbSetup = \"none\";\n changed = true;\n changes.push({\n category: \"database\",\n message: \"DB Setup set to 'None' (incompatible with MongoDB)\",\n });\n }\n }\n\n // Relational databases (sqlite, postgres, mysql) need Drizzle or Prisma\n if ([\"sqlite\", \"postgres\", \"mysql\"].includes(nextStack.database)) {\n if (nextStack.orm === \"none\") {\n nextStack.orm = \"drizzle\";\n changed = true;\n changes.push({\n category: \"database\",\n message: \"ORM set to 'Drizzle' (required for database)\",\n });\n }\n if (nextStack.orm === \"mongoose\") {\n nextStack.orm = \"drizzle\";\n changed = true;\n changes.push({\n category: \"database\",\n message: \"ORM set to 'Drizzle' (Mongoose only works with MongoDB)\",\n });\n }\n }\n\n // ORM selected but no database - select appropriate database\n if (nextStack.orm !== \"none\" && nextStack.database === \"none\") {\n if (nextStack.orm === \"mongoose\") {\n nextStack.database = \"mongodb\";\n changed = true;\n changes.push({\n category: \"orm\",\n message: \"Database set to 'MongoDB' (required for Mongoose)\",\n });\n } else {\n nextStack.database = \"sqlite\";\n changed = true;\n changes.push({ category: \"orm\", message: \"Database set to 'SQLite' (required for ORM)\" });\n }\n }\n\n // DB Setup constraints\n if (nextStack.dbSetup === \"turso\" && nextStack.database !== \"sqlite\") {\n nextStack.database = \"sqlite\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'SQLite' (required for Turso)\",\n });\n }\n if (nextStack.dbSetup === \"d1\") {\n if (nextStack.database !== \"sqlite\") {\n nextStack.database = \"sqlite\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'SQLite' (required for D1)\",\n });\n }\n if (nextStack.runtime !== \"workers\") {\n nextStack.runtime = \"workers\";\n nextStack.backend = \"hono\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Runtime set to 'Workers' with 'Hono' (required for D1)\",\n });\n }\n }\n if (nextStack.dbSetup === \"neon\" && nextStack.database !== \"postgres\") {\n nextStack.database = \"postgres\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'PostgreSQL' (required for Neon)\",\n });\n }\n if (nextStack.dbSetup === \"supabase\" && nextStack.database !== \"postgres\") {\n nextStack.database = \"postgres\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'PostgreSQL' (required for Supabase)\",\n });\n }\n if (nextStack.dbSetup === \"prisma-postgres\" && nextStack.database !== \"postgres\") {\n nextStack.database = \"postgres\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'PostgreSQL' (required for Prisma Postgres)\",\n });\n }\n if (nextStack.dbSetup === \"mongodb-atlas\" && nextStack.database !== \"mongodb\") {\n nextStack.database = \"mongodb\";\n if (nextStack.orm !== \"prisma\" && nextStack.orm !== \"mongoose\") {\n nextStack.orm = \"prisma\";\n }\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'MongoDB' (required for MongoDB Atlas)\",\n });\n }\n if (\n nextStack.dbSetup === \"planetscale\" &&\n nextStack.database !== \"postgres\" &&\n nextStack.database !== \"mysql\"\n ) {\n nextStack.database = \"postgres\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'PostgreSQL' (required for PlanetScale)\",\n });\n }\n if (nextStack.dbSetup === \"docker\") {\n if (nextStack.database === \"sqlite\") {\n nextStack.dbSetup = \"none\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"DB Setup set to 'None' (SQLite doesn't need Docker)\",\n });\n }\n if (nextStack.runtime === \"workers\") {\n nextStack.dbSetup = \"d1\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message:\n \"DB Setup set to 'D1' (Better-Fullstack doesn't support Docker setup with Workers)\",\n });\n }\n }\n }\n\n // ============================================\n // API CONSTRAINTS\n // ============================================\n\n if (nextStack.backend !== \"convex\" && nextStack.backend !== \"none\") {\n // Nuxt, Svelte, Solid, SolidStart require oRPC (not tRPC)\n const needsOrpc = nextStack.webFrontend.some((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"solid-start\"].includes(f),\n );\n if (needsOrpc && nextStack.api === \"trpc\") {\n nextStack.api = \"orpc\";\n changed = true;\n changes.push({ category: \"api\", message: \"API set to 'oRPC' (required for this frontend)\" });\n }\n\n // Astro with non-React integration requires oRPC\n if (\n nextStack.webFrontend.includes(\"astro\") &&\n nextStack.astroIntegration !== \"react\" &&\n nextStack.api === \"trpc\"\n ) {\n nextStack.api = \"orpc\";\n changed = true;\n changes.push({\n category: \"api\",\n message: \"API set to 'oRPC' (tRPC requires React integration with Astro)\",\n });\n }\n }\n\n // ============================================\n // ASTRO INTEGRATION CONSTRAINTS\n // ============================================\n\n // If Astro is not selected, reset astroIntegration\n if (!nextStack.webFrontend.includes(\"astro\") && nextStack.astroIntegration !== \"none\") {\n nextStack.astroIntegration = \"none\";\n changed = true;\n changes.push({\n category: \"astroIntegration\",\n message: \"Astro integration reset (Astro not selected)\",\n });\n }\n\n // If Astro is selected but no integration is set, default to react\n if (nextStack.webFrontend.includes(\"astro\") && nextStack.astroIntegration === \"none\") {\n // Only set default if api is trpc (which requires react)\n if (nextStack.api === \"trpc\") {\n nextStack.astroIntegration = \"react\";\n changed = true;\n changes.push({\n category: \"astroIntegration\",\n message: \"Astro integration set to 'React' (required for tRPC)\",\n });\n }\n }\n\n // ============================================\n // AUTH CONSTRAINTS\n // ============================================\n\n const normalizedAuth = normalizeCapabilitySelection(\n \"auth\",\n {\n ecosystem: nextStack.ecosystem,\n backend: nextStack.backend,\n webFrontend: nextStack.webFrontend,\n nativeFrontend: nextStack.nativeFrontend,\n },\n nextStack.auth as Auth,\n );\n\n if (normalizedAuth.normalized && nextStack.auth !== normalizedAuth.value) {\n nextStack.auth = normalizedAuth.value;\n changed = true;\n changes.push({\n category: \"auth\",\n message: normalizedAuth.message ?? \"Auth set to 'None'\",\n });\n }\n\n // ============================================\n // PAYMENTS CONSTRAINTS\n // ============================================\n\n if (nextStack.payments === \"dodo\" && nextStack.webFrontend.includes(\"react-vite\")) {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message:\n \"Payments set to 'None' (Dodo Payments support is not available for React + Vite yet)\",\n });\n }\n\n if (nextStack.payments === \"polar\") {\n if (nextStack.auth !== \"better-auth\") {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message: \"Payments set to 'None' (Polar requires Better Auth)\",\n });\n }\n if (nextStack.backend === \"convex\") {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message: \"Payments set to 'None' (Polar incompatible with Convex)\",\n });\n }\n const hasWebFrontend = nextStack.webFrontend.some((f) => f !== \"none\");\n if (!hasWebFrontend) {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message: \"Payments set to 'None' (Polar requires web frontend)\",\n });\n }\n }\n\n // ============================================\n // EMAIL CONSTRAINTS\n // ============================================\n\n if (nextStack.email !== \"none\") {\n if (nextStack.backend === \"convex\") {\n nextStack.email = \"none\";\n changed = true;\n changes.push({\n category: \"email\",\n message: \"Email set to 'None' (incompatible with Convex)\",\n });\n }\n if (nextStack.backend === \"none\") {\n nextStack.email = \"none\";\n changed = true;\n changes.push({\n category: \"email\",\n message: \"Email set to 'None' (requires backend)\",\n });\n }\n }\n\n // ============================================\n // CSS FRAMEWORK & UI LIBRARY CONSTRAINTS\n // ============================================\n\n // If no web frontend, reset CSS framework and UI library to none\n if (!nextStack.webFrontend.some((f) => f !== \"none\")) {\n if (nextStack.cssFramework !== \"none\") {\n nextStack.cssFramework = \"none\";\n changed = true;\n changes.push({\n category: \"cssFramework\",\n message: \"CSS framework set to 'None' (no web frontend)\",\n });\n }\n if (nextStack.uiLibrary !== \"none\") {\n nextStack.uiLibrary = \"none\";\n changed = true;\n changes.push({\n category: \"uiLibrary\",\n message: \"UI library set to 'None' (no web frontend)\",\n });\n }\n }\n\n // UI libraries requiring Tailwind - auto-adjust CSS framework or clear UI library\n const requiresTailwind = [\"shadcn-ui\", \"daisyui\", \"nextui\"].includes(nextStack.uiLibrary);\n if (requiresTailwind && nextStack.cssFramework !== \"tailwind\") {\n // Auto-set Tailwind when selecting a Tailwind-dependent UI library\n nextStack.cssFramework = \"tailwind\";\n changed = true;\n changes.push({\n category: \"cssFramework\",\n message: `CSS framework set to 'Tailwind' (required by ${nextStack.uiLibrary})`,\n });\n }\n\n // React-only UI libraries - check frontend compatibility\n const reactOnlyLibraries = [\"shadcn-ui\", \"radix-ui\", \"chakra-ui\", \"nextui\"];\n const reactFrontends = [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\"];\n if (reactOnlyLibraries.includes(nextStack.uiLibrary)) {\n const hasReactFrontend = nextStack.webFrontend.some((f) => reactFrontends.includes(f));\n const hasAstroReact =\n nextStack.webFrontend.includes(\"astro\") && nextStack.astroIntegration === \"react\";\n if (!hasReactFrontend && !hasAstroReact && nextStack.webFrontend.some((f) => f !== \"none\")) {\n // Reset to a compatible UI library (daisyui works with all frontends)\n nextStack.uiLibrary = \"daisyui\";\n changed = true;\n changes.push({\n category: \"uiLibrary\",\n message:\n \"UI library changed to 'daisyUI' (React-only library incompatible with this frontend)\",\n });\n }\n }\n\n // Headless UI requires React or Vue\n if (nextStack.uiLibrary === \"headless-ui\") {\n const hasReactFrontend = nextStack.webFrontend.some((f) => reactFrontends.includes(f));\n const hasVueFrontend = nextStack.webFrontend.includes(\"nuxt\");\n const hasAstroReactOrVue =\n nextStack.webFrontend.includes(\"astro\") &&\n [\"react\", \"vue\"].includes(nextStack.astroIntegration);\n if (!hasReactFrontend && !hasVueFrontend && !hasAstroReactOrVue) {\n nextStack.uiLibrary = \"daisyui\";\n changed = true;\n changes.push({\n category: \"uiLibrary\",\n message: \"UI library changed to 'daisyUI' (Headless UI requires React or Vue)\",\n });\n }\n }\n\n // Park UI requires React, Vue, or Solid\n if (nextStack.uiLibrary === \"park-ui\") {\n const hasReactFrontend = nextStack.webFrontend.some((f) => reactFrontends.includes(f));\n const hasVueFrontend = nextStack.webFrontend.includes(\"nuxt\");\n const hasSolidFrontend = nextStack.webFrontend.includes(\"solid\");\n const hasAstroCompatible =\n nextStack.webFrontend.includes(\"astro\") &&\n [\"react\", \"vue\", \"solid\"].includes(nextStack.astroIntegration);\n if (\n !hasReactFrontend &&\n !hasVueFrontend &&\n !hasSolidFrontend &&\n !hasAstroCompatible &&\n nextStack.webFrontend.some((f) => f !== \"none\")\n ) {\n nextStack.uiLibrary = \"daisyui\";\n changed = true;\n changes.push({\n category: \"uiLibrary\",\n message: \"UI library changed to 'daisyUI' (Park UI requires React, Vue, or Solid)\",\n });\n }\n }\n\n // ============================================\n // APP PLATFORMS CONSTRAINTS\n // ============================================\n\n const pwaCompat = hasPWACompatibleFrontend(nextStack.webFrontend);\n const tauriCompat = hasTauriCompatibleFrontend(nextStack.webFrontend);\n\n if (!pwaCompat && nextStack.appPlatforms.includes(\"pwa\")) {\n nextStack.appPlatforms = nextStack.appPlatforms.filter((a) => a !== \"pwa\");\n changed = true;\n changes.push({\n category: \"appPlatforms\",\n message: \"PWA removed (requires compatible frontend)\",\n });\n }\n if (!tauriCompat && nextStack.appPlatforms.includes(\"tauri\")) {\n nextStack.appPlatforms = nextStack.appPlatforms.filter((a) => a !== \"tauri\");\n changed = true;\n changes.push({\n category: \"appPlatforms\",\n message: \"Tauri removed (requires compatible frontend)\",\n });\n }\n\n // ============================================\n // EXAMPLES CONSTRAINTS\n // ============================================\n\n // AI example constraints\n if (nextStack.examples.includes(\"ai\")) {\n // Solid/SolidStart frontend is incompatible with AI example\n if (nextStack.webFrontend.includes(\"solid\") || nextStack.webFrontend.includes(\"solid-start\")) {\n nextStack.examples = nextStack.examples.filter((e) => e !== \"ai\");\n if (nextStack.examples.length === 0) nextStack.examples = [\"none\"];\n changed = true;\n changes.push({\n category: \"examples\",\n message: \"AI removed (not compatible with Solid frontend)\",\n });\n }\n // Convex AI only supports React-based frontends (not Svelte/Nuxt)\n if (nextStack.backend === \"convex\") {\n const hasIncompatibleFrontend = nextStack.webFrontend.some((f) =>\n [\"svelte\", \"nuxt\"].includes(f),\n );\n if (hasIncompatibleFrontend) {\n nextStack.examples = nextStack.examples.filter((e) => e !== \"ai\");\n if (nextStack.examples.length === 0) nextStack.examples = [\"none\"];\n changed = true;\n changes.push({\n category: \"examples\",\n message:\n \"AI removed (Convex AI only supports React-based frontends including React + Vite)\",\n });\n }\n }\n }\n\n // Chat SDK example constraints (framework-specific profiles in v1)\n if (nextStack.examples.includes(\"chat-sdk\")) {\n const hasReactVite = nextStack.webFrontend.includes(\"react-vite\");\n\n if (hasReactVite || !isChatSdkExampleSupported(nextStack)) {\n nextStack.examples = nextStack.examples.filter((e) => e !== \"chat-sdk\");\n if (nextStack.examples.length === 0) nextStack.examples = [\"none\"];\n changed = true;\n\n let reason = \"unsupported stack\";\n if (hasReactVite) {\n reason = \"React + Vite support is not available yet\";\n } else if (nextStack.ecosystem !== \"typescript\") {\n reason = \"TypeScript ecosystem only\";\n } else if (nextStack.backend === \"convex\") {\n reason = \"Convex backend not supported in v1\";\n } else if (nextStack.backend === \"none\") {\n reason = \"requires a backend\";\n } else if (nextStack.backend === \"hono\" && nextStack.runtime !== \"node\") {\n reason = \"Hono profile requires Node runtime\";\n } else if (nextStack.backend.startsWith(\"self-\")) {\n reason = \"self backend only supports Next.js, TanStack Start, or Nuxt in v1\";\n }\n\n changes.push({\n category: \"examples\",\n message: `Chat SDK removed (${reason})`,\n });\n } else if (requiresChatSdkVercelAI(nextStack) && nextStack.aiSdk !== \"vercel-ai\") {\n nextStack.aiSdk = \"vercel-ai\";\n changed = true;\n changes.push({\n category: \"ai\",\n message: \"AI SDK set to 'Vercel AI SDK' (required by Chat SDK Nuxt/Hono profile in v1)\",\n });\n }\n }\n\n // ============================================\n // FRESH FRONTEND CONSTRAINTS\n // Fresh is Preact-based and incompatible with React-specific packages\n // ============================================\n\n const isFresh = nextStack.webFrontend.includes(\"fresh\");\n\n if (isFresh) {\n // TanStack Form has no Preact adapter\n if (nextStack.forms === \"tanstack-form\") {\n nextStack.forms = \"none\";\n changed = true;\n changes.push({\n category: \"forms\",\n message: \"Forms set to 'None' (TanStack Form has no Preact adapter)\",\n });\n }\n\n // State management libraries that require React bindings\n const reactOnlyStateManagement = [\"nanostores\", \"xstate\", \"tanstack-store\"];\n if (reactOnlyStateManagement.includes(nextStack.stateManagement)) {\n const oldValue = nextStack.stateManagement;\n nextStack.stateManagement = \"none\";\n changed = true;\n changes.push({\n category: \"stateManagement\",\n message: `State management set to 'None' (${oldValue} requires React bindings)`,\n });\n }\n\n // Lottie uses lottie-react which requires React\n if (nextStack.animation === \"lottie\") {\n nextStack.animation = \"none\";\n changed = true;\n changes.push({\n category: \"animation\",\n message: \"Animation set to 'None' (Lottie requires lottie-react)\",\n });\n }\n }\n\n // ============================================\n // DEPLOYMENT CONSTRAINTS\n // ============================================\n\n // Web deploy requires web frontend\n if (nextStack.webDeploy !== \"none\" && !nextStack.webFrontend.some((f) => f !== \"none\")) {\n nextStack.webDeploy = \"none\";\n changed = true;\n changes.push({ category: \"webDeploy\", message: \"Web deploy set to 'None' (no web frontend)\" });\n }\n\n // Server deploy constraints\n if (nextStack.serverDeploy === \"cloudflare\") {\n if (nextStack.runtime !== \"workers\" || nextStack.backend !== \"hono\") {\n nextStack.serverDeploy = \"none\";\n changed = true;\n changes.push({\n category: \"serverDeploy\",\n message: \"Server deploy set to 'None' (Cloudflare requires Workers + Hono)\",\n });\n }\n }\n\n if (\n nextStack.serverDeploy !== \"none\" &&\n [\n \"none\",\n \"convex\",\n \"self-next\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n ].includes(nextStack.backend)\n ) {\n nextStack.serverDeploy = \"none\";\n changed = true;\n changes.push({\n category: \"serverDeploy\",\n message: \"Server deploy set to 'None' (not needed for this backend)\",\n });\n }\n\n return {\n adjustedStack: changed ? nextStack : null,\n notes,\n changes,\n };\n};\n\n/**\n * Returns a reason why an option is disabled, or null if it's enabled.\n *\n * PHILOSOPHY: Only disable options that are TRULY incompatible.\n * - Don't create circular dependencies\n * - Allow users to select options that will trigger auto-adjustments\n * - Follow CLI behavior: filter options based on UPSTREAM selections only\n */\nexport const getDisabledReason = (\n currentStack: CompatibilityInput,\n category: CompatibilityCategory,\n optionId: string,\n): string | null => {\n // ============================================\n // CONVEX BACKEND - locks down many options\n // ============================================\n if (currentStack.backend === \"convex\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"Convex provides its own runtime\";\n }\n if (category === \"database\" && optionId !== \"none\") {\n return \"Convex provides its own database\";\n }\n if (category === \"orm\" && optionId !== \"none\") {\n return \"Convex has built-in data access\";\n }\n if (category === \"api\" && optionId !== \"none\") {\n return \"Convex provides its own API layer\";\n }\n if (category === \"dbSetup\" && optionId !== \"none\") {\n return \"Convex handles database setup\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Convex has its own deployment\";\n }\n if (category === \"search\" && optionId !== \"none\") {\n return \"Search requires a standalone backend\";\n }\n if (category === \"fileStorage\" && optionId !== \"none\") {\n return \"File storage requires a standalone backend\";\n }\n if (category === \"webFrontend\" && optionId === \"solid\") {\n return \"In Better-Fullstack, the Convex backend is currently not available with Solid\";\n }\n if (category === \"webFrontend\" && optionId === \"astro\") {\n return \"In Better-Fullstack, the Convex backend is currently not available with Astro\";\n }\n if (category === \"examples\" && optionId === \"ai\") {\n const hasIncompatibleFrontend = currentStack.webFrontend.some((f) =>\n [\"solid\", \"svelte\", \"nuxt\"].includes(f),\n );\n if (hasIncompatibleFrontend) {\n const frontendName = currentStack.webFrontend.find((f) =>\n [\"solid\", \"svelte\", \"nuxt\"].includes(f),\n );\n return `Convex AI example only supports React-based frontends including React + Vite (not ${frontendName})`;\n }\n }\n if (category === \"payments\" && optionId === \"polar\") {\n return \"In Better-Fullstack, Polar is currently not available with the Convex backend\";\n }\n }\n\n // ============================================\n // NO BACKEND - locks down backend-dependent options\n // ============================================\n if (currentStack.backend === \"none\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"database\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"orm\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"api\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"dbSetup\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"payments\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"search\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"fileStorage\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"examples\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n }\n\n // ============================================\n // FULLSTACK BACKEND CONSTRAINTS\n // ============================================\n if (currentStack.backend === \"self-next\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"Next.js fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"next\" && optionId !== \"none\") {\n return \"Next.js fullstack requires Next.js frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n if (currentStack.backend === \"self-tanstack-start\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"TanStack Start fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"tanstack-start\" && optionId !== \"none\") {\n return \"TanStack Start fullstack requires TanStack Start frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n if (currentStack.backend === \"self-astro\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"Astro fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"astro\" && optionId !== \"none\") {\n return \"Astro fullstack requires Astro frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n if (currentStack.backend === \"self-nuxt\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"Nuxt fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"nuxt\" && optionId !== \"none\") {\n return \"Nuxt fullstack requires Nuxt frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n if (currentStack.backend === \"self-svelte\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"SvelteKit fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"svelte\" && optionId !== \"none\") {\n return \"SvelteKit fullstack requires SvelteKit frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n if (currentStack.backend === \"self-solid-start\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"SolidStart fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"solid-start\" && optionId !== \"none\") {\n return \"SolidStart fullstack requires SolidStart frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n // ============================================\n // BACKEND SELECTION CONSTRAINTS\n // ============================================\n if (category === \"backend\") {\n if (optionId === \"self-next\" && !currentStack.webFrontend.includes(\"next\")) {\n return \"Requires Next.js frontend\";\n }\n if (\n optionId === \"self-tanstack-start\" &&\n !currentStack.webFrontend.includes(\"tanstack-start\")\n ) {\n return \"Requires TanStack Start frontend\";\n }\n if (optionId === \"self-astro\" && !currentStack.webFrontend.includes(\"astro\")) {\n return \"Requires Astro frontend\";\n }\n if (optionId === \"self-nuxt\" && !currentStack.webFrontend.includes(\"nuxt\")) {\n return \"Requires Nuxt frontend\";\n }\n if (optionId === \"self-svelte\" && !currentStack.webFrontend.includes(\"svelte\")) {\n return \"Requires SvelteKit frontend\";\n }\n if (optionId === \"self-solid-start\" && !currentStack.webFrontend.includes(\"solid-start\")) {\n return \"Requires SolidStart frontend\";\n }\n if (optionId === \"convex\" && currentStack.webFrontend.includes(\"solid\")) {\n return \"In Better-Fullstack, Convex is currently not available with Solid\";\n }\n if (optionId === \"convex\" && currentStack.webFrontend.includes(\"solid-start\")) {\n return \"In Better-Fullstack, Convex is currently not available with SolidStart\";\n }\n if (optionId === \"convex\" && currentStack.webFrontend.includes(\"astro\")) {\n return \"In Better-Fullstack, Convex is currently not available with Astro\";\n }\n // Workers runtime only works with Hono backend\n if (currentStack.runtime === \"workers\" && optionId !== \"hono\" && optionId !== \"none\") {\n return \"In Better-Fullstack, Workers runtime is currently supported only with Hono\";\n }\n }\n\n // ============================================\n // RUNTIME CONSTRAINTS\n // ============================================\n if (category === \"runtime\") {\n if (optionId === \"workers\" && currentStack.backend !== \"hono\") {\n return \"In Better-Fullstack, Workers runtime currently requires the Hono backend\";\n }\n if (optionId === \"none\") {\n const allowedBackends = [\n \"convex\",\n \"none\",\n \"self-next\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n ];\n if (!allowedBackends.includes(currentStack.backend)) {\n return \"Runtime 'None' only for Convex or fullstack backends\";\n }\n }\n }\n\n // ============================================\n // DATABASE CONSTRAINTS\n // ============================================\n if (category === \"database\") {\n if (optionId === \"mongodb\" && currentStack.runtime === \"workers\") {\n return \"In Better-Fullstack, MongoDB is currently not available with Workers runtime\";\n }\n // Allow all databases when ORM is none - system will auto-select ORM\n }\n\n // ============================================\n // ORM CONSTRAINTS\n // ============================================\n if (category === \"orm\") {\n if (optionId === \"mongoose\") {\n if (currentStack.runtime === \"workers\") {\n return \"Mongoose requires MongoDB, and Better-Fullstack currently doesn't support MongoDB with Workers runtime\";\n }\n // Only block if a non-MongoDB database is EXPLICITLY selected\n if (currentStack.database !== \"none\" && currentStack.database !== \"mongodb\") {\n return \"Mongoose only works with MongoDB\";\n }\n // Allow when database is \"none\" - system will auto-select MongoDB\n }\n if (optionId === \"drizzle\" && currentStack.database === \"mongodb\") {\n return \"Drizzle does not support MongoDB\";\n }\n if (optionId === \"none\" && currentStack.database !== \"none\") {\n return \"Database requires an ORM\";\n }\n }\n\n // ============================================\n // DB SETUP CONSTRAINTS\n // ============================================\n if (category === \"dbSetup\" && optionId !== \"none\") {\n if (currentStack.database === \"none\") {\n return \"Select a database first\";\n }\n\n // Database-specific setups\n if (optionId === \"turso\" && currentStack.database !== \"sqlite\") {\n return \"Turso requires SQLite\";\n }\n if (optionId === \"d1\") {\n if (currentStack.database !== \"sqlite\") return \"D1 requires SQLite\";\n if (currentStack.runtime !== \"workers\") return \"D1 requires Workers runtime\";\n }\n if (optionId === \"neon\" && currentStack.database !== \"postgres\") {\n return \"Neon requires PostgreSQL\";\n }\n if (optionId === \"supabase\" && currentStack.database !== \"postgres\") {\n return \"Supabase requires PostgreSQL\";\n }\n if (optionId === \"prisma-postgres\" && currentStack.database !== \"postgres\") {\n return \"Prisma Postgres requires PostgreSQL\";\n }\n if (optionId === \"mongodb-atlas\" && currentStack.database !== \"mongodb\") {\n return \"MongoDB Atlas requires MongoDB\";\n }\n if (\n optionId === \"planetscale\" &&\n currentStack.database !== \"postgres\" &&\n currentStack.database !== \"mysql\"\n ) {\n return \"PlanetScale requires PostgreSQL or MySQL\";\n }\n if (optionId === \"docker\") {\n if (currentStack.database === \"sqlite\") return \"SQLite doesn't need Docker\";\n if (currentStack.runtime === \"workers\") return \"Docker is incompatible with Workers\";\n }\n }\n\n // ============================================\n // API CONSTRAINTS\n // ============================================\n if (category === \"api\" && optionId === \"trpc\") {\n const needsOrpc = currentStack.webFrontend.some((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"solid-start\"].includes(f),\n );\n if (needsOrpc) {\n const frontendName = currentStack.webFrontend.find((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"solid-start\"].includes(f),\n );\n return `${frontendName} requires oRPC, not tRPC`;\n }\n // Astro with non-React integration requires oRPC\n if (\n currentStack.webFrontend.includes(\"astro\") &&\n currentStack.astroIntegration !== \"react\" &&\n currentStack.astroIntegration !== \"none\"\n ) {\n return `Astro with ${currentStack.astroIntegration} integration requires oRPC, not tRPC`;\n }\n }\n\n // ============================================\n // ASTRO INTEGRATION CONSTRAINTS\n // ============================================\n if (category === \"astroIntegration\") {\n if (!currentStack.webFrontend.includes(\"astro\") && optionId !== \"none\") {\n return \"Astro integration requires Astro frontend\";\n }\n // tRPC requires React integration\n if (currentStack.api === \"trpc\" && optionId !== \"react\" && optionId !== \"none\") {\n return \"tRPC requires React integration with Astro\";\n }\n }\n\n // ============================================\n // AUTH CONSTRAINTS\n // ============================================\n if (category === \"auth\") {\n return getCapabilityDisabledReason(\n \"auth\",\n {\n ecosystem: currentStack.ecosystem,\n backend: currentStack.backend,\n webFrontend: currentStack.webFrontend,\n nativeFrontend: currentStack.nativeFrontend,\n },\n optionId as Auth,\n );\n }\n\n // ============================================\n // PAYMENTS CONSTRAINTS\n // ============================================\n if (category === \"payments\" && optionId === \"polar\") {\n if (currentStack.auth !== \"better-auth\") {\n return \"Polar requires Better Auth\";\n }\n if (!currentStack.webFrontend.some((f) => f !== \"none\")) {\n return \"Polar requires a web frontend\";\n }\n }\n\n if (\n category === \"payments\" &&\n optionId !== \"none\" &&\n currentStack.webFrontend.includes(\"react-vite\") &&\n optionId === \"dodo\"\n ) {\n return \"Dodo Payments are not yet supported for React + Vite projects\";\n }\n\n // ============================================\n // EMAIL CONSTRAINTS\n // ============================================\n if (category === \"email\" && optionId !== \"none\") {\n if (currentStack.backend === \"convex\") {\n return \"Email integration is not available with Convex backend\";\n }\n if (currentStack.backend === \"none\") {\n return \"Email integration requires a backend\";\n }\n }\n\n // ============================================\n // AI CONSTRAINTS\n // ============================================\n if (category === \"ai\" && requiresChatSdkVercelAI(currentStack) && optionId !== \"vercel-ai\") {\n return \"Chat SDK example (Nuxt/Hono profile) requires Vercel AI SDK in v1\";\n }\n\n // ============================================\n // APP PLATFORMS CONSTRAINTS\n // ============================================\n if (category === \"appPlatforms\") {\n if (optionId === \"pwa\" && !hasPWACompatibleFrontend(currentStack.webFrontend)) {\n return \"PWA requires TanStack Router, React Router, Solid, Next.js, or Astro\";\n }\n if (optionId === \"tauri\" && !hasTauriCompatibleFrontend(currentStack.webFrontend)) {\n return \"Tauri requires TanStack Router, React Router, Nuxt, Svelte, Solid, Next.js, or Astro\";\n }\n }\n\n // ============================================\n // EXAMPLES CONSTRAINTS\n // ============================================\n if (category === \"examples\") {\n if (optionId === \"ai\") {\n if (\n currentStack.webFrontend.includes(\"solid\") ||\n currentStack.webFrontend.includes(\"solid-start\")\n ) {\n return \"AI example not compatible with Solid frontend\";\n }\n if (currentStack.backend === \"convex\") {\n const hasIncompatibleFrontend = currentStack.webFrontend.some((f) =>\n [\"svelte\", \"nuxt\"].includes(f),\n );\n if (hasIncompatibleFrontend) {\n const frontendName = currentStack.webFrontend.find((f) => [\"svelte\", \"nuxt\"].includes(f));\n return `Convex AI example only supports React-based frontends including React + Vite (not ${frontendName})`;\n }\n }\n }\n\n if (optionId === \"chat-sdk\") {\n if (currentStack.webFrontend.includes(\"react-vite\")) {\n return \"Chat SDK example is not yet supported for React + Vite projects\";\n }\n if (currentStack.ecosystem !== \"typescript\") {\n return \"Chat SDK example is currently available only for TypeScript stacks\";\n }\n if (currentStack.backend === \"convex\") {\n return \"Chat SDK example is not supported with Convex backend in v1\";\n }\n if (\n currentStack.backend === \"self-astro\" ||\n currentStack.backend === \"self-svelte\" ||\n currentStack.backend === \"self-solid-start\"\n ) {\n return \"Chat SDK self backend profile supports Next.js, TanStack Start, or Nuxt in v1\";\n }\n if (currentStack.backend === \"self-next\" || currentStack.backend === \"self-tanstack-start\") {\n return null;\n }\n if (currentStack.backend === \"self-nuxt\") {\n return null;\n }\n if (currentStack.backend === \"hono\") {\n if (currentStack.runtime !== \"node\") {\n return \"Chat SDK Hono profile requires Node runtime in v1\";\n }\n return null;\n }\n if (currentStack.backend.startsWith(\"self-\")) {\n return \"Chat SDK self backend profile supports Next.js, TanStack Start, or Nuxt in v1\";\n }\n if (currentStack.backend !== \"none\") {\n return \"Chat SDK example is only supported for self (Next/TanStack Start/Nuxt) or Hono+Node in v1\";\n }\n }\n }\n\n // ============================================\n // FRESH FRONTEND CONSTRAINTS\n // Fresh is Preact-based and incompatible with React-specific packages\n // ============================================\n const isFresh = currentStack.webFrontend.includes(\"fresh\");\n\n // Forms: TanStack Form has no Preact adapter\n if (category === \"forms\" && optionId === \"tanstack-form\" && isFresh) {\n return \"TanStack Form has no Preact adapter (Fresh uses Preact)\";\n }\n\n // State Management: These all require React bindings\n if (category === \"stateManagement\" && isFresh) {\n if (optionId === \"nanostores\") {\n return \"Nanostores requires @nanostores/react (no Preact support)\";\n }\n if (optionId === \"xstate\") {\n return \"XState requires @xstate/react (no Preact support)\";\n }\n if (optionId === \"tanstack-store\") {\n return \"TanStack Store requires @tanstack/react-store (no Preact support)\";\n }\n }\n\n // Animation: Lottie uses lottie-react which requires React\n if (category === \"animation\" && optionId === \"lottie\" && isFresh) {\n return \"Lottie uses lottie-react which requires React (not Preact)\";\n }\n\n // ============================================\n // CSS FRAMEWORK CONSTRAINTS\n // ============================================\n if (category === \"cssFramework\") {\n // CSS frameworks only apply to web frontends\n if (!currentStack.webFrontend.some((f) => f !== \"none\")) {\n if (optionId !== \"none\") {\n return \"CSS framework requires a web frontend\";\n }\n }\n // Some UI libraries require Tailwind\n const requiresTailwind = [\"shadcn-ui\", \"daisyui\", \"nextui\"].includes(currentStack.uiLibrary);\n if (requiresTailwind && optionId !== \"tailwind\") {\n return `${currentStack.uiLibrary === \"shadcn-ui\" ? \"shadcn/ui\" : currentStack.uiLibrary === \"daisyui\" ? \"daisyUI\" : \"NextUI\"} requires Tailwind CSS`;\n }\n }\n\n // ============================================\n // UI LIBRARY CONSTRAINTS\n // ============================================\n if (category === \"uiLibrary\") {\n // UI libraries only apply to web frontends\n if (!currentStack.webFrontend.some((f) => f !== \"none\")) {\n if (optionId !== \"none\") {\n return \"UI library requires a web frontend\";\n }\n }\n\n // React-only UI libraries\n const reactOnlyLibraries = [\"shadcn-ui\", \"radix-ui\", \"chakra-ui\", \"nextui\"];\n const reactFrontends = [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\"];\n\n if (reactOnlyLibraries.includes(optionId)) {\n const hasReactFrontend = currentStack.webFrontend.some((f) => reactFrontends.includes(f));\n // Astro with React integration also works\n const hasAstroReact =\n currentStack.webFrontend.includes(\"astro\") && currentStack.astroIntegration === \"react\";\n if (!hasReactFrontend && !hasAstroReact) {\n const libraryName =\n optionId === \"shadcn-ui\"\n ? \"shadcn/ui\"\n : optionId === \"radix-ui\"\n ? \"Radix UI\"\n : optionId === \"chakra-ui\"\n ? \"Chakra UI\"\n : \"NextUI\";\n return `${libraryName} requires a React-based frontend`;\n }\n }\n\n // Headless UI works with React and Vue\n if (optionId === \"headless-ui\") {\n const hasReactFrontend = currentStack.webFrontend.some((f) => reactFrontends.includes(f));\n const hasVueFrontend = currentStack.webFrontend.includes(\"nuxt\");\n const hasAstroReactOrVue =\n currentStack.webFrontend.includes(\"astro\") &&\n [\"react\", \"vue\"].includes(currentStack.astroIntegration);\n if (!hasReactFrontend && !hasVueFrontend && !hasAstroReactOrVue) {\n return \"Headless UI requires React or Vue frontend\";\n }\n }\n\n // Park UI works with React, Vue, and Solid\n if (optionId === \"park-ui\") {\n const hasReactFrontend = currentStack.webFrontend.some((f) => reactFrontends.includes(f));\n const hasVueFrontend = currentStack.webFrontend.includes(\"nuxt\");\n const hasSolidFrontend =\n currentStack.webFrontend.includes(\"solid\") ||\n currentStack.webFrontend.includes(\"solid-start\");\n const hasAstroCompatible =\n currentStack.webFrontend.includes(\"astro\") &&\n [\"react\", \"vue\", \"solid\"].includes(currentStack.astroIntegration);\n if (!hasReactFrontend && !hasVueFrontend && !hasSolidFrontend && !hasAstroCompatible) {\n return \"Park UI requires React, Vue, or Solid frontend\";\n }\n // Park UI requires a CSS framework (not \"none\")\n if (currentStack.cssFramework === \"none\") {\n return \"Park UI requires a CSS framework\";\n }\n }\n\n // UI libraries requiring Tailwind\n if ([\"shadcn-ui\", \"daisyui\", \"nextui\"].includes(optionId)) {\n if (currentStack.cssFramework !== \"tailwind\") {\n const libraryName =\n optionId === \"shadcn-ui\" ? \"shadcn/ui\" : optionId === \"daisyui\" ? \"daisyUI\" : \"NextUI\";\n return `${libraryName} requires Tailwind CSS`;\n }\n }\n }\n\n // ============================================\n // DEPLOYMENT CONSTRAINTS\n // ============================================\n if (category === \"webDeploy\" && optionId !== \"none\") {\n if (!currentStack.webFrontend.some((f) => f !== \"none\")) {\n return \"Web deployment requires a web frontend\";\n }\n }\n\n if (category === \"serverDeploy\") {\n if (optionId === \"cloudflare\") {\n if (currentStack.runtime !== \"workers\") {\n return \"In Better-Fullstack, Cloudflare server deploy currently requires Workers runtime\";\n }\n if (currentStack.backend !== \"hono\") {\n return \"In Better-Fullstack, Cloudflare server deploy is currently supported only with Hono\";\n }\n }\n if (optionId !== \"none\") {\n const noServerDeploy = [\n \"none\",\n \"convex\",\n \"self-next\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n ];\n if (noServerDeploy.includes(currentStack.backend)) {\n return \"Server deployment not needed for this backend\";\n }\n }\n if (optionId === \"none\" && currentStack.runtime === \"workers\") {\n return \"Workers requires server deployment\";\n }\n }\n\n return null;\n};\n\nexport const isOptionCompatible = (\n currentStack: CompatibilityInput,\n category: CompatibilityCategory,\n optionId: string,\n): boolean => {\n if (currentStack.yolo === \"true\") {\n return true;\n }\n return getDisabledReason(currentStack, category, optionId) === null;\n};\n\nconst WEB_FRAMEWORKS: readonly Frontend[] = [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n \"none\",\n] as const;\n\nconst UI_LIBRARY_COMPATIBILITY: Record<\n UILibrary,\n {\n frontends: readonly Frontend[];\n cssFrameworks: readonly CSSFramework[];\n }\n> = {\n \"shadcn-ui\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\"],\n },\n daisyui: {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n ],\n cssFrameworks: [\"tailwind\"],\n },\n \"radix-ui\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"headless-ui\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"nuxt\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"park-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\"],\n },\n \"chakra-ui\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n nextui: {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\"],\n },\n mantine: {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"base-ui\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"ark-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"react-aria\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n none: {\n frontends: WEB_FRAMEWORKS,\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n};\n\nconst ADDON_COMPATIBILITY: Record<Addons, readonly Frontend[]> = {\n pwa: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"solid\",\n \"next\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n ],\n tauri: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"next\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n ],\n biome: [],\n husky: [],\n lefthook: [],\n turborepo: [],\n starlight: [],\n ultracite: [],\n ruler: [],\n mcp: [],\n skills: [],\n oxlint: [],\n fumadocs: [],\n opentui: [],\n wxt: [],\n msw: [],\n storybook: [\"tanstack-router\", \"react-router\", \"react-vite\", \"next\", \"nuxt\", \"svelte\", \"solid\"],\n none: [],\n};\n\nexport function isWebFrontend(value: Frontend) {\n return WEB_FRAMEWORKS.includes(value);\n}\n\nexport function splitFrontends(values: Frontend[] = []): {\n web: Frontend[];\n native: Frontend[];\n} {\n const web = values.filter((f) => isWebFrontend(f));\n const native = values.filter(\n (f) => f === \"native-bare\" || f === \"native-uniwind\" || f === \"native-unistyles\",\n );\n return { web, native };\n}\n\nexport function allowedApisForFrontends(\n frontends: Frontend[] = [],\n astroIntegration?: AstroIntegration,\n) {\n const includesNuxt = frontends.includes(\"nuxt\");\n const includesSvelte = frontends.includes(\"svelte\");\n const includesSolid = frontends.includes(\"solid\");\n const includesAstro = frontends.includes(\"astro\");\n const includesQwik = frontends.includes(\"qwik\");\n const includesAngular = frontends.includes(\"angular\");\n const includesRedwood = frontends.includes(\"redwood\");\n const includesFresh = frontends.includes(\"fresh\");\n const base: API[] = [\"trpc\", \"orpc\", \"ts-rest\", \"garph\", \"none\"];\n\n if (includesQwik || includesAngular || includesRedwood || includesFresh) {\n return [\"none\"] as API[];\n }\n\n const includesSolidStartApi = frontends.includes(\"solid-start\");\n if (includesNuxt || includesSvelte || includesSolid || includesSolidStartApi) {\n return [\"orpc\", \"none\"] as API[];\n }\n\n if (includesAstro && astroIntegration && astroIntegration !== \"react\") {\n return [\"orpc\", \"none\"] as API[];\n }\n\n return base;\n}\n\nexport function isFrontendAllowedWithBackend(frontend: Frontend, backend?: Backend, auth?: string) {\n if (backend === \"convex\" && frontend === \"solid\") return false;\n if (backend === \"convex\" && frontend === \"solid-start\") return false;\n if (backend === \"convex\" && frontend === \"astro\") return false;\n if (backend === \"convex\" && frontend === \"qwik\") return false;\n if (backend === \"convex\" && frontend === \"angular\") return false;\n if (backend === \"convex\" && frontend === \"redwood\") return false;\n if (backend === \"convex\" && frontend === \"fresh\") return false;\n\n if (frontend === \"qwik\" && backend && backend !== \"none\") return false;\n if (frontend === \"angular\" && backend && backend !== \"none\") return false;\n if (frontend === \"redwood\" && backend && backend !== \"none\") return false;\n if (frontend === \"fresh\" && backend && backend !== \"none\") return false;\n\n if (auth && auth !== \"none\") {\n return (\n getCapabilityDisabledReason(\n \"auth\",\n {\n ecosystem: \"typescript\",\n backend,\n frontend: [frontend],\n },\n auth as Auth,\n ) === null\n );\n }\n\n return true;\n}\n\nexport function isExampleAIAllowed(backend?: Backend, frontends: Frontend[] = []) {\n const includesSolid = frontends.includes(\"solid\");\n const includesSolidStart = frontends.includes(\"solid-start\");\n if (includesSolid || includesSolidStart) return false;\n\n if (backend === \"convex\") {\n const includesNuxt = frontends.includes(\"nuxt\");\n const includesSvelte = frontends.includes(\"svelte\");\n if (includesNuxt || includesSvelte) return false;\n }\n\n return true;\n}\n\nfunction hasExampleChatSdkSelfFrontend(frontends: Frontend[] = []) {\n return frontends.some((f) => [\"next\", \"tanstack-start\", \"nuxt\"].includes(f));\n}\n\nexport function isExampleChatSdkAllowed(\n backend?: Backend | string,\n frontends: Frontend[] = [],\n runtime?: Runtime | string,\n) {\n if (frontends.includes(\"react-vite\")) return false;\n if (!backend || backend === \"none\" || backend === \"convex\") return false;\n\n if (backend === \"self\") {\n return hasExampleChatSdkSelfFrontend(frontends);\n }\n\n if (backend === \"self-next\" || backend === \"self-tanstack-start\" || backend === \"self-nuxt\") {\n return true;\n }\n\n if (backend === \"self-astro\" || backend === \"self-svelte\" || backend === \"self-solid-start\") {\n return false;\n }\n\n if (backend === \"hono\") {\n return runtime === \"node\";\n }\n\n return false;\n}\n\nexport function requiresChatSdkVercelAIForSelection(\n backend?: Backend | string,\n frontends: Frontend[] = [],\n runtime?: Runtime | string,\n) {\n if (backend === \"self\" && frontends.includes(\"nuxt\")) return true;\n if (backend === \"self-nuxt\") return true;\n if (backend === \"hono\" && runtime === \"node\") return true;\n return false;\n}\n\nexport function validateAddonCompatibility(\n addon: Addons,\n frontend: Frontend[],\n _auth?: Auth,\n): { isCompatible: boolean; reason?: string } {\n const compatibleFrontends = ADDON_COMPATIBILITY[addon];\n\n if (compatibleFrontends.length > 0) {\n const hasCompatibleFrontend = frontend.some((f) =>\n (compatibleFrontends as readonly string[]).includes(f),\n );\n\n if (!hasCompatibleFrontend) {\n const frontendList = compatibleFrontends.join(\", \");\n return {\n isCompatible: false,\n reason: `${addon} addon requires one of these frontends: ${frontendList}`,\n };\n }\n }\n\n return { isCompatible: true };\n}\n\nexport function getCompatibleAddons(\n allAddons: Addons[],\n frontend: Frontend[],\n existingAddons: Addons[] = [],\n auth?: Auth,\n) {\n return allAddons.filter((addon) => {\n if (existingAddons.includes(addon)) return false;\n if (addon === \"none\") return false;\n const { isCompatible } = validateAddonCompatibility(addon, frontend, auth);\n return isCompatible;\n });\n}\n\nexport function getCompatibleUILibraries(\n frontends: Frontend[] = [],\n astroIntegration?: AstroIntegration,\n): UILibrary[] {\n const { web } = splitFrontends(frontends);\n if (web.length === 0) return [\"none\"];\n\n const webFrontend = web[0];\n const allUILibraries = Object.keys(UI_LIBRARY_COMPATIBILITY) as UILibrary[];\n\n return allUILibraries.filter((lib) => {\n if (lib === \"none\") return true;\n\n const compatibility = UI_LIBRARY_COMPATIBILITY[lib];\n if (webFrontend === \"astro\") {\n if (astroIntegration === \"react\") {\n return compatibility.frontends.some((f) =>\n [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"].includes(f),\n );\n }\n return compatibility.frontends.some((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"qwik\", \"angular\"].includes(f),\n );\n }\n\n return compatibility.frontends.includes(webFrontend);\n });\n}\n\nexport function getCompatibleCSSFrameworks(uiLibrary: UILibrary | undefined): CSSFramework[] {\n if (!uiLibrary || uiLibrary === \"none\") {\n return [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"];\n }\n\n const compatibility = UI_LIBRARY_COMPATIBILITY[uiLibrary];\n return compatibility.cssFrameworks as CSSFramework[];\n}\n\nexport function hasWebStyling(frontends: Frontend[] = []): boolean {\n const { web } = splitFrontends(frontends);\n return web.length > 0;\n}\n\nexport function getCompatibleFormLibraries(frontends: Frontend[] = []): Forms[] {\n const hasSolid = frontends.includes(\"solid\");\n const hasSolidStart = frontends.includes(\"solid-start\");\n const hasQwik = frontends.includes(\"qwik\");\n const hasFresh = frontends.includes(\"fresh\");\n\n const all: Forms[] = [\n \"tanstack-form\",\n \"react-hook-form\",\n \"formik\",\n \"final-form\",\n \"conform\",\n \"modular-forms\",\n \"none\",\n ];\n\n if (hasFresh) {\n return all.filter((f) => f !== \"tanstack-form\" && f !== \"react-hook-form\" && f !== \"formik\");\n }\n\n if (hasSolid || hasSolidStart || hasQwik) {\n return all.filter((f) => f !== \"react-hook-form\" && f !== \"formik\" && f !== \"final-form\");\n }\n\n return all;\n}\n\nexport function evaluateCompatibility(input: CompatibilityInput): CompatibilityEvaluation {\n const issues: CompatibilityIssue[] = [];\n\n const scalarChecks: Array<[CompatibilityCategory, string]> = [\n [\"runtime\", input.runtime],\n [\"backend\", input.backend],\n [\"database\", input.database],\n [\"orm\", input.orm],\n [\"dbSetup\", input.dbSetup],\n [\"api\", input.api],\n [\"auth\", input.auth],\n [\"payments\", input.payments],\n [\"email\", input.email],\n [\"cssFramework\", input.cssFramework],\n [\"uiLibrary\", input.uiLibrary],\n [\"webDeploy\", input.webDeploy],\n [\"serverDeploy\", input.serverDeploy],\n [\"forms\", input.forms],\n [\"stateManagement\", input.stateManagement],\n [\"animation\", input.animation],\n [\"ai\", input.aiSdk],\n ];\n\n for (const [category, optionId] of scalarChecks) {\n const reason = getDisabledReason(input, category, optionId);\n if (reason) {\n issues.push({\n code: `INCOMPATIBLE_${category.toUpperCase()}`,\n message: reason,\n category,\n optionId,\n });\n }\n }\n\n for (const frontend of input.webFrontend) {\n const reason = getDisabledReason(input, \"webFrontend\", frontend);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_FRONTEND\",\n message: reason,\n category: \"webFrontend\",\n optionId: frontend,\n });\n }\n }\n\n for (const addon of [...input.codeQuality, ...input.documentation, ...input.appPlatforms]) {\n const reason = getDisabledReason(input, \"appPlatforms\", addon);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_ADDON\",\n message: reason,\n category: \"appPlatforms\",\n optionId: addon,\n });\n }\n }\n\n return { issues };\n}\n","import {\n AI_DOCS_VALUES,\n AI_VALUES,\n ANALYTICS_VALUES,\n ANIMATION_VALUES,\n API_VALUES,\n ASTRO_INTEGRATION_VALUES,\n AUTH_VALUES,\n CACHING_VALUES,\n CMS_VALUES,\n CSS_FRAMEWORK_VALUES,\n DATABASE_SETUP_VALUES,\n DATABASE_VALUES,\n EFFECT_VALUES,\n EMAIL_VALUES,\n FEATURE_FLAGS_VALUES,\n FILE_STORAGE_VALUES,\n FILE_UPLOAD_VALUES,\n FORMS_VALUES,\n GO_API_VALUES,\n GO_CLI_VALUES,\n GO_LOGGING_VALUES,\n GO_ORM_VALUES,\n GO_WEB_FRAMEWORK_VALUES,\n JOB_QUEUE_VALUES,\n LOGGING_VALUES,\n OBSERVABILITY_VALUES,\n ORM_VALUES,\n PACKAGE_MANAGER_VALUES,\n PAYMENTS_VALUES,\n PYTHON_AI_VALUES,\n PYTHON_ORM_VALUES,\n PYTHON_QUALITY_VALUES,\n PYTHON_TASK_QUEUE_VALUES,\n PYTHON_VALIDATION_VALUES,\n PYTHON_WEB_FRAMEWORK_VALUES,\n REALTIME_VALUES,\n RUNTIME_VALUES,\n RUST_API_VALUES,\n RUST_CLI_VALUES,\n RUST_FRONTEND_VALUES,\n RUST_LIBRARIES_VALUES,\n RUST_ORM_VALUES,\n RUST_WEB_FRAMEWORK_VALUES,\n SEARCH_VALUES,\n SHADCN_BASE_COLOR_VALUES,\n SHADCN_BASE_VALUES,\n SHADCN_COLOR_THEME_VALUES,\n SHADCN_FONT_VALUES,\n SHADCN_ICON_LIBRARY_VALUES,\n SHADCN_RADIUS_VALUES,\n SHADCN_STYLE_VALUES,\n SERVER_DEPLOY_VALUES,\n STATE_MANAGEMENT_VALUES,\n TESTING_VALUES,\n UI_LIBRARY_VALUES,\n VALIDATION_VALUES,\n WEB_DEPLOY_VALUES,\n} from \"./schemas\";\nimport { getCapabilityDefinitions } from \"./capabilities\";\n\nexport type OptionCategory =\n | \"api\"\n | \"webFrontend\"\n | \"nativeFrontend\"\n | \"astroIntegration\"\n | \"runtime\"\n | \"backend\"\n | \"database\"\n | \"orm\"\n | \"dbSetup\"\n | \"webDeploy\"\n | \"serverDeploy\"\n | \"auth\"\n | \"payments\"\n | \"email\"\n | \"fileUpload\"\n | \"logging\"\n | \"observability\"\n | \"backendLibraries\"\n | \"stateManagement\"\n | \"forms\"\n | \"validation\"\n | \"testing\"\n | \"realtime\"\n | \"jobQueue\"\n | \"caching\"\n | \"search\"\n | \"fileStorage\"\n | \"animation\"\n | \"cssFramework\"\n | \"uiLibrary\"\n | \"cms\"\n | \"featureFlags\"\n | \"analytics\"\n | \"codeQuality\"\n | \"documentation\"\n | \"appPlatforms\"\n | \"packageManager\"\n | \"examples\"\n | \"ai\"\n | \"aiDocs\"\n | \"git\"\n | \"install\"\n | \"effect\"\n | \"shadcnBase\"\n | \"shadcnStyle\"\n | \"shadcnIconLibrary\"\n | \"shadcnColorTheme\"\n | \"shadcnBaseColor\"\n | \"shadcnFont\"\n | \"shadcnRadius\"\n | \"rustWebFramework\"\n | \"rustFrontend\"\n | \"rustOrm\"\n | \"rustApi\"\n | \"rustCli\"\n | \"rustLibraries\"\n | \"pythonWebFramework\"\n | \"pythonOrm\"\n | \"pythonValidation\"\n | \"pythonAi\"\n | \"pythonTaskQueue\"\n | \"pythonQuality\"\n | \"goWebFramework\"\n | \"goOrm\"\n | \"goApi\"\n | \"goCli\"\n | \"goLogging\";\n\nexport type OptionSelectionMode = \"single\" | \"multiple\";\n\nexport type OptionMetadata = {\n id: string;\n label: string;\n aliases: readonly string[];\n cliValue: string;\n};\n\nexport type OptionCategoryMetadata = {\n selectionMode: OptionSelectionMode;\n options: readonly OptionMetadata[];\n};\n\nconst WEB_FRONTEND_VALUES = [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n \"none\",\n] as const satisfies readonly string[];\n\nconst NATIVE_FRONTEND_VALUES = [\n \"native-bare\",\n \"native-uniwind\",\n \"native-unistyles\",\n \"none\",\n] as const satisfies readonly string[];\n\nconst BACKEND_BUILDER_VALUES = [\n \"hono\",\n \"express\",\n \"fastify\",\n \"elysia\",\n \"fets\",\n \"nestjs\",\n \"adonisjs\",\n \"nitro\",\n \"encore\",\n \"convex\",\n \"self-next\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n \"none\",\n] as const satisfies readonly string[];\n\nconst CODE_QUALITY_VALUES = [\n \"biome\",\n \"oxlint\",\n \"ultracite\",\n \"lefthook\",\n \"husky\",\n \"ruler\",\n] as const satisfies readonly string[];\n\nconst DOCUMENTATION_VALUES = [\"starlight\", \"fumadocs\"] as const satisfies readonly string[];\n\nconst APP_PLATFORM_VALUES = [\n \"turborepo\",\n \"pwa\",\n \"tauri\",\n \"wxt\",\n \"opentui\",\n \"mcp\",\n \"skills\",\n \"msw\",\n \"storybook\",\n] as const satisfies readonly string[];\n\nconst EXAMPLE_VALUES = [\"ai\", \"chat-sdk\"] as const satisfies readonly string[];\nconst BOOLEAN_OPTION_VALUES = [\"true\", \"false\"] as const satisfies readonly string[];\n\nconst MULTI_SELECT_CATEGORIES = new Set<OptionCategory>([\n \"webFrontend\",\n \"nativeFrontend\",\n \"codeQuality\",\n \"documentation\",\n \"appPlatforms\",\n \"examples\",\n \"aiDocs\",\n]);\n\nconst CATEGORY_VALUE_IDS: Record<OptionCategory, readonly string[]> = {\n api: API_VALUES,\n webFrontend: WEB_FRONTEND_VALUES,\n nativeFrontend: NATIVE_FRONTEND_VALUES,\n astroIntegration: ASTRO_INTEGRATION_VALUES,\n runtime: RUNTIME_VALUES,\n backend: BACKEND_BUILDER_VALUES,\n database: DATABASE_VALUES,\n orm: ORM_VALUES,\n dbSetup: DATABASE_SETUP_VALUES,\n webDeploy: WEB_DEPLOY_VALUES,\n serverDeploy: SERVER_DEPLOY_VALUES,\n auth: AUTH_VALUES,\n payments: PAYMENTS_VALUES,\n email: EMAIL_VALUES,\n fileUpload: FILE_UPLOAD_VALUES,\n logging: LOGGING_VALUES,\n observability: OBSERVABILITY_VALUES,\n backendLibraries: EFFECT_VALUES,\n stateManagement: STATE_MANAGEMENT_VALUES,\n forms: FORMS_VALUES,\n validation: VALIDATION_VALUES,\n testing: TESTING_VALUES,\n realtime: REALTIME_VALUES,\n jobQueue: JOB_QUEUE_VALUES,\n caching: CACHING_VALUES,\n search: SEARCH_VALUES,\n fileStorage: FILE_STORAGE_VALUES,\n animation: ANIMATION_VALUES,\n cssFramework: CSS_FRAMEWORK_VALUES,\n uiLibrary: UI_LIBRARY_VALUES,\n cms: CMS_VALUES,\n featureFlags: FEATURE_FLAGS_VALUES,\n analytics: ANALYTICS_VALUES,\n codeQuality: CODE_QUALITY_VALUES,\n documentation: DOCUMENTATION_VALUES,\n appPlatforms: APP_PLATFORM_VALUES,\n packageManager: PACKAGE_MANAGER_VALUES,\n examples: EXAMPLE_VALUES,\n ai: AI_VALUES,\n aiDocs: AI_DOCS_VALUES,\n git: BOOLEAN_OPTION_VALUES,\n install: BOOLEAN_OPTION_VALUES,\n effect: EFFECT_VALUES,\n shadcnBase: SHADCN_BASE_VALUES,\n shadcnStyle: SHADCN_STYLE_VALUES,\n shadcnIconLibrary: SHADCN_ICON_LIBRARY_VALUES,\n shadcnColorTheme: SHADCN_COLOR_THEME_VALUES,\n shadcnBaseColor: SHADCN_BASE_COLOR_VALUES,\n shadcnFont: SHADCN_FONT_VALUES,\n shadcnRadius: SHADCN_RADIUS_VALUES,\n rustWebFramework: RUST_WEB_FRAMEWORK_VALUES,\n rustFrontend: RUST_FRONTEND_VALUES,\n rustOrm: RUST_ORM_VALUES,\n rustApi: RUST_API_VALUES,\n rustCli: RUST_CLI_VALUES,\n rustLibraries: RUST_LIBRARIES_VALUES,\n pythonWebFramework: PYTHON_WEB_FRAMEWORK_VALUES,\n pythonOrm: PYTHON_ORM_VALUES,\n pythonValidation: PYTHON_VALIDATION_VALUES,\n pythonAi: PYTHON_AI_VALUES,\n pythonTaskQueue: PYTHON_TASK_QUEUE_VALUES,\n pythonQuality: PYTHON_QUALITY_VALUES,\n goWebFramework: GO_WEB_FRAMEWORK_VALUES,\n goOrm: GO_ORM_VALUES,\n goApi: GO_API_VALUES,\n goCli: GO_CLI_VALUES,\n goLogging: GO_LOGGING_VALUES,\n};\n\nconst EXACT_LABEL_OVERRIDES: Partial<Record<OptionCategory, Partial<Record<string, string>>>> = {\n api: { trpc: \"tRPC\", orpc: \"oRPC\" },\n webFrontend: {\n next: \"Next.js\",\n \"react-vite\": \"React + Vite\",\n svelte: \"SvelteKit\",\n redwood: \"RedwoodJS\",\n },\n nativeFrontend: {\n \"native-bare\": \"Expo + Bare\",\n \"native-uniwind\": \"Expo + Uniwind\",\n \"native-unistyles\": \"Expo + Unistyles\",\n },\n runtime: { node: \"Node.js\", workers: \"Cloudflare Workers\" },\n backend: {\n fets: \"feTS\",\n nestjs: \"NestJS\",\n encore: \"Encore.ts\",\n \"self-next\": \"Fullstack Next.js\",\n \"self-tanstack-start\": \"Fullstack TanStack Start\",\n \"self-astro\": \"Fullstack Astro\",\n \"self-nuxt\": \"Fullstack Nuxt\",\n \"self-svelte\": \"Fullstack SvelteKit\",\n \"self-solid-start\": \"Fullstack SolidStart\",\n },\n database: { sqlite: \"SQLite\", postgres: \"PostgreSQL\", mongodb: \"MongoDB\", edgedb: \"EdgeDB\" },\n orm: {\n typeorm: \"TypeORM\",\n mikroorm: \"MikroORM\",\n },\n dbSetup: {\n d1: \"Cloudflare D1\",\n neon: \"Neon Postgres\",\n \"prisma-postgres\": \"Prisma PostgreSQL\",\n \"mongodb-atlas\": \"MongoDB Atlas\",\n planetscale: \"PlanetScale\",\n },\n webDeploy: { cloudflare: \"Cloudflare\", fly: \"Fly.io\", sst: \"SST\" },\n serverDeploy: { cloudflare: \"Cloudflare\", fly: \"Fly.io\", sst: \"SST\" },\n auth: {},\n payments: {\n \"lemon-squeezy\": \"Lemon Squeezy\",\n dodo: \"Dodo Payments\",\n },\n email: {\n \"react-email\": \"React Email\",\n sendgrid: \"SendGrid\",\n \"aws-ses\": \"AWS SES\",\n },\n fileUpload: {\n uploadthing: \"UploadThing\",\n filepond: \"FilePond\",\n uppy: \"Uppy\",\n },\n observability: {\n opentelemetry: \"OpenTelemetry\",\n },\n backendLibraries: {\n effect: \"Effect (Core)\",\n \"effect-full\": \"Effect Full\",\n },\n stateManagement: {\n \"redux-toolkit\": \"Redux Toolkit\",\n xstate: \"XState\",\n },\n forms: {\n \"react-hook-form\": \"React Hook Form\",\n \"tanstack-form\": \"TanStack Form\",\n \"final-form\": \"Final Form\",\n \"modular-forms\": \"Modular Forms\",\n },\n validation: {\n zod: \"Zod\",\n arktype: \"ArkType\",\n typebox: \"TypeBox\",\n \"effect-schema\": \"@effect/schema\",\n },\n testing: {\n \"vitest-playwright\": \"Vitest + Playwright\",\n },\n realtime: {\n \"socket-io\": \"Socket.IO\",\n yjs: \"Y.js\",\n },\n jobQueue: {\n bullmq: \"BullMQ\",\n \"trigger-dev\": \"Trigger.dev\",\n },\n cssFramework: { tailwind: \"Tailwind CSS\", scss: \"SCSS\", \"postcss-only\": \"PostCSS Only\" },\n uiLibrary: {\n \"shadcn-ui\": \"shadcn/ui\",\n daisyui: \"daisyUI\",\n \"radix-ui\": \"Radix UI\",\n \"headless-ui\": \"Headless UI\",\n \"park-ui\": \"Park UI\",\n \"chakra-ui\": \"Chakra UI\",\n nextui: \"NextUI\",\n \"base-ui\": \"Base UI\",\n \"ark-ui\": \"Ark UI\",\n \"react-aria\": \"React Aria\",\n },\n featureFlags: {\n growthbook: \"GrowthBook\",\n posthog: \"PostHog\",\n },\n analytics: {\n plausible: \"Plausible\",\n umami: \"Umami\",\n },\n codeQuality: {\n biome: \"Biome\",\n oxlint: \"Oxlint\",\n ultracite: \"Ultracite\",\n lefthook: \"Lefthook\",\n husky: \"Husky\",\n ruler: \"Ruler\",\n },\n documentation: {\n starlight: \"Starlight\",\n fumadocs: \"Fumadocs\",\n },\n appPlatforms: {\n pwa: \"PWA\",\n wxt: \"WXT\",\n opentui: \"OpenTUI\",\n mcp: \"MCP\",\n msw: \"MSW\",\n },\n examples: {\n ai: \"AI Example\",\n \"chat-sdk\": \"Chat SDK Bots\",\n },\n ai: {\n \"vercel-ai\": \"Vercel AI SDK\",\n voltagent: \"VoltAgent\",\n langgraph: \"LangGraph.js\",\n \"openai-agents\": \"OpenAI Agents SDK\",\n \"google-adk\": \"Google ADK\",\n modelfusion: \"ModelFusion\",\n langchain: \"LangChain\",\n llamaindex: \"LlamaIndex\",\n },\n aiDocs: {\n \"claude-md\": \"CLAUDE.md\",\n \"agents-md\": \"Agents.md\",\n cursorrules: \".cursorrules\",\n },\n git: { true: \"Git\", false: \"No Git\" },\n install: { true: \"Install Dependencies\", false: \"Skip Install\" },\n effect: {\n effect: \"Effect (Core)\",\n \"effect-full\": \"Effect Full\",\n },\n shadcnBase: {\n radix: \"Radix UI\",\n base: \"Base UI\",\n },\n shadcnStyle: {\n vega: \"Vega\",\n nova: \"Nova\",\n maia: \"Maia\",\n lyra: \"Lyra\",\n mira: \"Mira\",\n },\n shadcnIconLibrary: {\n lucide: \"Lucide\",\n tabler: \"Tabler Icons\",\n hugeicons: \"HugeIcons\",\n phosphor: \"Phosphor Icons\",\n remixicon: \"Remix Icon\",\n },\n shadcnColorTheme: {\n neutral: \"Neutral\",\n },\n shadcnBaseColor: {\n neutral: \"Neutral\",\n },\n shadcnFont: {\n inter: \"Inter\",\n geist: \"Geist\",\n figtree: \"Figtree\",\n \"noto-sans\": \"Noto Sans\",\n \"nunito-sans\": \"Nunito Sans\",\n roboto: \"Roboto\",\n raleway: \"Raleway\",\n \"dm-sans\": \"DM Sans\",\n \"public-sans\": \"Public Sans\",\n outfit: \"Outfit\",\n \"jetbrains-mono\": \"JetBrains Mono\",\n \"geist-mono\": \"Geist Mono\",\n },\n shadcnRadius: {\n default: \"Default\",\n },\n rustWebFramework: {\n axum: \"Axum\",\n \"actix-web\": \"Actix-web\",\n },\n rustFrontend: {\n leptos: \"Leptos\",\n dioxus: \"Dioxus\",\n },\n rustOrm: {\n \"sea-orm\": \"SeaORM\",\n sqlx: \"SQLx\",\n },\n rustApi: {\n \"async-graphql\": \"async-graphql\",\n tonic: \"Tonic\",\n },\n rustCli: {\n clap: \"Clap\",\n ratatui: \"Ratatui\",\n },\n rustLibraries: {\n serde: \"Serde\",\n validator: \"Validator\",\n jsonwebtoken: \"jsonwebtoken\",\n argon2: \"Argon2\",\n \"tokio-test\": \"Tokio Test\",\n mockall: \"Mockall\",\n },\n pythonWebFramework: {\n fastapi: \"FastAPI\",\n django: \"Django\",\n },\n pythonOrm: {\n sqlalchemy: \"SQLAlchemy\",\n sqlmodel: \"SQLModel\",\n },\n pythonValidation: {\n pydantic: \"Pydantic\",\n },\n pythonAi: {\n langchain: \"LangChain\",\n llamaindex: \"LlamaIndex\",\n \"openai-sdk\": \"OpenAI SDK\",\n \"anthropic-sdk\": \"Anthropic SDK\",\n langgraph: \"LangGraph\",\n crewai: \"CrewAI\",\n },\n pythonTaskQueue: {\n celery: \"Celery\",\n },\n pythonQuality: {\n ruff: \"Ruff\",\n },\n goWebFramework: {\n gin: \"Gin\",\n echo: \"Echo\",\n },\n goOrm: {\n gorm: \"GORM\",\n sqlc: \"sqlc\",\n },\n goApi: {\n \"grpc-go\": \"gRPC-Go\",\n },\n goCli: {\n cobra: \"Cobra\",\n bubbletea: \"Bubble Tea\",\n },\n goLogging: {\n zap: \"Zap\",\n },\n};\n\nconst OPTION_ALIASES: Partial<Record<OptionCategory, Partial<Record<string, readonly string[]>>>> = {\n webFrontend: {\n svelte: [\"sveltekit\"],\n },\n backend: {\n \"self-svelte\": [\"self-sveltekit\"],\n },\n};\n\nconst CLI_VALUE_OVERRIDES: Partial<Record<OptionCategory, Partial<Record<string, string>>>> = {\n backend: {\n \"self-next\": \"self\",\n \"self-tanstack-start\": \"self\",\n \"self-astro\": \"self\",\n \"self-nuxt\": \"self\",\n \"self-svelte\": \"self\",\n \"self-solid-start\": \"self\",\n },\n};\n\nconst TOKEN_LABELS: Record<string, string> = {\n ai: \"AI\",\n api: \"API\",\n auth: \"Auth\",\n css: \"CSS\",\n db: \"DB\",\n graphql: \"GraphQL\",\n grpc: \"gRPC\",\n js: \"JS\",\n md: \"MD\",\n orm: \"ORM\",\n sdk: \"SDK\",\n ses: \"SES\",\n sql: \"SQL\",\n ui: \"UI\",\n};\n\nfunction toStartCaseToken(token: string): string {\n const lower = token.toLowerCase();\n if (TOKEN_LABELS[lower]) return TOKEN_LABELS[lower];\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n}\n\nfunction humanizeOptionId(id: string): string {\n return id\n .split(\"-\")\n .filter(Boolean)\n .map(toStartCaseToken)\n .join(\" \");\n}\n\nfunction getOptionLabel(category: OptionCategory, id: string): string {\n if (category === \"auth\") {\n return getCapabilityDefinitions(\"auth\").find((option) => option.id === id)?.label ?? humanizeOptionId(id);\n }\n return EXACT_LABEL_OVERRIDES[category]?.[id] ?? humanizeOptionId(id);\n}\n\nfunction getOptionAliases(category: OptionCategory, id: string): readonly string[] {\n return OPTION_ALIASES[category]?.[id] ?? [];\n}\n\nfunction getCliValue(category: OptionCategory, id: string): string {\n return CLI_VALUE_OVERRIDES[category]?.[id] ?? id;\n}\n\nfunction buildCategoryMetadata(category: OptionCategory): OptionCategoryMetadata {\n return {\n selectionMode: MULTI_SELECT_CATEGORIES.has(category) ? \"multiple\" : \"single\",\n options: CATEGORY_VALUE_IDS[category].map((id) => ({\n id,\n label: getOptionLabel(category, id),\n aliases: getOptionAliases(category, id),\n cliValue: getCliValue(category, id),\n })),\n };\n}\n\nexport const OPTION_CATEGORY_METADATA: Record<OptionCategory, OptionCategoryMetadata> = {\n api: buildCategoryMetadata(\"api\"),\n webFrontend: buildCategoryMetadata(\"webFrontend\"),\n nativeFrontend: buildCategoryMetadata(\"nativeFrontend\"),\n astroIntegration: buildCategoryMetadata(\"astroIntegration\"),\n runtime: buildCategoryMetadata(\"runtime\"),\n backend: buildCategoryMetadata(\"backend\"),\n database: buildCategoryMetadata(\"database\"),\n orm: buildCategoryMetadata(\"orm\"),\n dbSetup: buildCategoryMetadata(\"dbSetup\"),\n webDeploy: buildCategoryMetadata(\"webDeploy\"),\n serverDeploy: buildCategoryMetadata(\"serverDeploy\"),\n auth: buildCategoryMetadata(\"auth\"),\n payments: buildCategoryMetadata(\"payments\"),\n email: buildCategoryMetadata(\"email\"),\n fileUpload: buildCategoryMetadata(\"fileUpload\"),\n logging: buildCategoryMetadata(\"logging\"),\n observability: buildCategoryMetadata(\"observability\"),\n backendLibraries: buildCategoryMetadata(\"backendLibraries\"),\n stateManagement: buildCategoryMetadata(\"stateManagement\"),\n forms: buildCategoryMetadata(\"forms\"),\n validation: buildCategoryMetadata(\"validation\"),\n testing: buildCategoryMetadata(\"testing\"),\n realtime: buildCategoryMetadata(\"realtime\"),\n jobQueue: buildCategoryMetadata(\"jobQueue\"),\n caching: buildCategoryMetadata(\"caching\"),\n search: buildCategoryMetadata(\"search\"),\n fileStorage: buildCategoryMetadata(\"fileStorage\"),\n animation: buildCategoryMetadata(\"animation\"),\n cssFramework: buildCategoryMetadata(\"cssFramework\"),\n uiLibrary: buildCategoryMetadata(\"uiLibrary\"),\n cms: buildCategoryMetadata(\"cms\"),\n featureFlags: buildCategoryMetadata(\"featureFlags\"),\n analytics: buildCategoryMetadata(\"analytics\"),\n codeQuality: buildCategoryMetadata(\"codeQuality\"),\n documentation: buildCategoryMetadata(\"documentation\"),\n appPlatforms: buildCategoryMetadata(\"appPlatforms\"),\n packageManager: buildCategoryMetadata(\"packageManager\"),\n examples: buildCategoryMetadata(\"examples\"),\n ai: buildCategoryMetadata(\"ai\"),\n aiDocs: buildCategoryMetadata(\"aiDocs\"),\n git: buildCategoryMetadata(\"git\"),\n install: buildCategoryMetadata(\"install\"),\n effect: buildCategoryMetadata(\"effect\"),\n shadcnBase: buildCategoryMetadata(\"shadcnBase\"),\n shadcnStyle: buildCategoryMetadata(\"shadcnStyle\"),\n shadcnIconLibrary: buildCategoryMetadata(\"shadcnIconLibrary\"),\n shadcnColorTheme: buildCategoryMetadata(\"shadcnColorTheme\"),\n shadcnBaseColor: buildCategoryMetadata(\"shadcnBaseColor\"),\n shadcnFont: buildCategoryMetadata(\"shadcnFont\"),\n shadcnRadius: buildCategoryMetadata(\"shadcnRadius\"),\n rustWebFramework: buildCategoryMetadata(\"rustWebFramework\"),\n rustFrontend: buildCategoryMetadata(\"rustFrontend\"),\n rustOrm: buildCategoryMetadata(\"rustOrm\"),\n rustApi: buildCategoryMetadata(\"rustApi\"),\n rustCli: buildCategoryMetadata(\"rustCli\"),\n rustLibraries: buildCategoryMetadata(\"rustLibraries\"),\n pythonWebFramework: buildCategoryMetadata(\"pythonWebFramework\"),\n pythonOrm: buildCategoryMetadata(\"pythonOrm\"),\n pythonValidation: buildCategoryMetadata(\"pythonValidation\"),\n pythonAi: buildCategoryMetadata(\"pythonAi\"),\n pythonTaskQueue: buildCategoryMetadata(\"pythonTaskQueue\"),\n pythonQuality: buildCategoryMetadata(\"pythonQuality\"),\n goWebFramework: buildCategoryMetadata(\"goWebFramework\"),\n goOrm: buildCategoryMetadata(\"goOrm\"),\n goApi: buildCategoryMetadata(\"goApi\"),\n goCli: buildCategoryMetadata(\"goCli\"),\n goLogging: buildCategoryMetadata(\"goLogging\"),\n};\n\nconst OPTION_LOOKUP = Object.fromEntries(\n (Object.entries(OPTION_CATEGORY_METADATA) as Array<[OptionCategory, OptionCategoryMetadata]>).map(\n ([category, metadata]) => [\n category,\n new Map(\n metadata.options.flatMap((option) => [\n [option.id.toLowerCase(), option.id],\n ...option.aliases.map((alias) => [alias.toLowerCase(), option.id] as const),\n ]),\n ),\n ],\n ),\n) as Record<OptionCategory, Map<string, string>>;\n\nexport function isMultiSelectCategory(category: OptionCategory): boolean {\n return OPTION_CATEGORY_METADATA[category].selectionMode === \"multiple\";\n}\n\nexport function getOptionMetadata(category: OptionCategory, optionId: string): OptionMetadata | undefined {\n return OPTION_CATEGORY_METADATA[category].options.find((option) => option.id === optionId);\n}\n\nexport function getCategoryOptionIds(category: OptionCategory): string[] {\n return OPTION_CATEGORY_METADATA[category].options.map((option) => option.id);\n}\n\nexport function getCategoryCliValues(category: OptionCategory): string[] {\n return [...new Set(OPTION_CATEGORY_METADATA[category].options.map((option) => option.cliValue))];\n}\n\nexport function normalizeOptionId(category: OptionCategory, value: string): string {\n const normalized = OPTION_LOOKUP[category].get(value.toLowerCase());\n return normalized ?? value;\n}\n","const VITE_WEB_FRONTENDS = new Set([\"react-router\", \"react-vite\", \"svelte\", \"fresh\"]);\n\nexport function getLocalWebDevPort(frontend: readonly string[]): 3001 | 5173 {\n return frontend.some((entry) => VITE_WEB_FRONTENDS.has(entry)) ? 5173 : 3001;\n}\n"],"mappings":"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GACX,CAAC;;AAIN,QAAO,EAAE,QAAQ;;;;;ACxoEnB,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACD;AAED,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,uBAAuB,CAAC,aAAa,WAAW;AAEtD,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,iBAAiB,CAAC,MAAM,WAAW;AACzC,MAAM,wBAAwB,CAAC,QAAQ,QAAQ;AAE/C,MAAM,0BAA0B,IAAI,IAAoB;CACtD;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAMC,qBAAgE;CACpE,KAAK;CACL,aAAa;CACb,gBAAgB;CAChB,kBAAkB;CAClB,SAAS;CACT,SAAS;CACT,UAAU;CACV,KAAK;CACL,SAAS;CACT,WAAW;CACX,cAAc;CACd,MAAM;CACN,UAAU;CACV,OAAO;CACP,YAAY;CACZ,SAAS;CACT,eAAe;CACf,kBAAkB;CAClB,iBAAiB;CACjB,OAAO;CACP,YAAY;CACZ,SAAS;CACT,UAAU;CACV,UAAU;CACV,SAAS;CACT,QAAQ;CACR,aAAa;CACb,WAAW;CACX,cAAc;CACd,WAAW;CACX,KAAK;CACL,cAAc;CACd,WAAW;CACX,aAAa;CACb,eAAe;CACf,cAAc;CACd,gBAAgB;CAChB,UAAU;CACV,IAAI;CACJ,QAAQ;CACR,KAAK;CACL,SAAS;CACT,QAAQ;CACR,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB,YAAY;CACZ,cAAc;CACd,kBAAkB;CAClB,cAAc;CACd,SAAS;CACT,SAAS;CACT,SAAS;CACT,eAAe;CACf,oBAAoB;C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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["CAPABILITY_DEFINITIONS: {\n [K in CapabilityName]: readonly CapabilityDefinitionMap[K][];\n}","_exhaustive: never","CATEGORY_ORDER: CompatibilityCategory[]","rustCategoryNames: Record<string, string>","pythonCategoryNames: Record<string, string>","goCategoryNames: Record<string, string>","notes: CompatibilityAnalysisResult[\"notes\"]","changes: CompatibilityAdjustment[]","noneOverrides: Partial<CompatibilityInput>","WEB_FRAMEWORKS: readonly Frontend[]","UI_LIBRARY_COMPATIBILITY: Record<\n UILibrary,\n {\n frontends: readonly Frontend[];\n cssFrameworks: readonly CSSFramework[];\n }\n>","ADDON_COMPATIBILITY: Record<Addons, readonly Frontend[]>","base: API[]","all: Forms[]","issues: CompatibilityIssue[]","scalarChecks: Array<[CompatibilityCategory, string]>","CATEGORY_VALUE_IDS: Record<OptionCategory, readonly string[]>","EXACT_LABEL_OVERRIDES: Partial<Record<OptionCategory, Partial<Record<string, string>>>>","OPTION_ALIASES: Partial<Record<OptionCategory, Partial<Record<string, readonly string[]>>>>","CLI_VALUE_OVERRIDES: Partial<Record<OptionCategory, Partial<Record<string, string>>>>","TOKEN_LABELS: Record<string, string>","OPTION_CATEGORY_METADATA: Record<OptionCategory, OptionCategoryMetadata>"],"sources":["../src/capabilities.ts","../src/compatibility.ts","../src/option-metadata.ts","../src/local-dev.ts"],"sourcesContent":["import type { Auth, Ecosystem } from \"./types\";\n\nexport type CapabilityName = \"auth\";\n\nexport type CapabilityStackContext = {\n ecosystem?: Ecosystem;\n backend?: string;\n frontend?: readonly string[];\n webFrontend?: readonly string[];\n nativeFrontend?: readonly string[];\n};\n\nexport type CapabilityDefinitionBase = {\n id: string;\n label: string;\n description: string;\n promptHint: string;\n icon: string;\n color: string;\n default?: boolean;\n};\n\nexport type AuthCapabilityDefinition = CapabilityDefinitionBase & {\n id: Auth;\n};\n\ntype CapabilityDefinitionMap = {\n auth: AuthCapabilityDefinition;\n};\n\nexport type CapabilityDefinition<K extends CapabilityName = CapabilityName> =\n CapabilityDefinitionMap[K];\n\nexport type CapabilityNormalizationResult<K extends CapabilityName = CapabilityName> = {\n value: CapabilityDefinitionMap[K][\"id\"];\n normalized: boolean;\n reason: string | null;\n message: string | null;\n};\n\nconst AUTH_CAPABILITIES = [\n {\n id: \"better-auth\",\n label: \"Better-Auth\",\n description: \"The most comprehensive authentication framework for TypeScript\",\n promptHint: \"comprehensive auth framework for TypeScript\",\n icon: \"/icon/better-auth.svg\",\n color: \"from-green-400 to-green-600\",\n default: true,\n },\n {\n id: \"go-better-auth\",\n label: \"GoBetterAuth\",\n description: \"Embedded auth routes for Go applications\",\n promptHint: \"embedded auth routes for Go applications\",\n icon: \"https://cdn.simpleicons.org/go/00ADD8\",\n color: \"from-cyan-400 to-sky-600\",\n },\n {\n id: \"clerk\",\n label: \"Clerk\",\n description: \"More than authentication, Complete User Management\",\n promptHint: \"More than auth, Complete User Management\",\n icon: \"https://cdn.simpleicons.org/clerk/6C47FF\",\n color: \"from-blue-400 to-blue-600\",\n },\n {\n id: \"nextauth\",\n label: \"Auth.js (NextAuth)\",\n description: \"Open source authentication for Next.js\",\n promptHint: \"Authentication for Next.js (formerly NextAuth.js)\",\n icon: \"/icon/nextauth.png\",\n color: \"from-orange-400 to-orange-600\",\n },\n {\n id: \"stack-auth\",\n label: \"Stack Auth\",\n description: \"Open-source Auth0/Clerk alternative with user management\",\n promptHint: \"Open-source Auth0/Clerk alternative\",\n icon: \"/icon/stack-auth.svg\",\n color: \"from-purple-400 to-purple-600\",\n },\n {\n id: \"supabase-auth\",\n label: \"Supabase Auth\",\n description: \"Open-source Auth with Supabase platform integration\",\n promptHint: \"Auth with Supabase platform integration\",\n icon: \"https://cdn.simpleicons.org/supabase/3FCF8E\",\n color: \"from-emerald-400 to-emerald-600\",\n },\n {\n id: \"auth0\",\n label: \"Auth0\",\n description: \"Flexible identity platform for authentication and authorization\",\n promptHint: \"Flexible identity platform for authentication\",\n icon: \"https://cdn.simpleicons.org/auth0/EB5424\",\n color: \"from-orange-400 to-orange-600\",\n },\n {\n id: \"none\",\n label: \"No Auth\",\n description: \"Skip authentication\",\n promptHint: \"No authentication\",\n icon: \"\",\n color: \"from-red-400 to-red-600\",\n },\n] as const satisfies readonly AuthCapabilityDefinition[];\n\nconst CAPABILITY_DEFINITIONS: {\n [K in CapabilityName]: readonly CapabilityDefinitionMap[K][];\n} = {\n auth: AUTH_CAPABILITIES,\n};\n\nconst NATIVE_FRONTENDS = new Set([\"native-bare\", \"native-uniwind\", \"native-unistyles\"]);\nconst CONVEX_BETTER_AUTH_WEB = new Set([\"react-vite\", \"tanstack-router\", \"tanstack-start\", \"next\"]);\nconst CONVEX_CLERK_WEB = new Set([\n \"react-router\",\n \"react-vite\",\n \"tanstack-router\",\n \"tanstack-start\",\n \"next\",\n]);\n\nfunction capitalizeFirst(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction dedupe(values: readonly string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction getFrontendSets(context: CapabilityStackContext): {\n webFrontend: string[];\n nativeFrontend: string[];\n} {\n if (context.frontend) {\n const webFrontend = context.frontend.filter((frontend) => !NATIVE_FRONTENDS.has(frontend));\n const nativeFrontend = context.frontend.filter((frontend) => NATIVE_FRONTENDS.has(frontend));\n return {\n webFrontend: dedupe(webFrontend),\n nativeFrontend: dedupe(nativeFrontend),\n };\n }\n\n return {\n webFrontend: dedupe(context.webFrontend ?? []),\n nativeFrontend: dedupe(context.nativeFrontend ?? []),\n };\n}\n\nfunction isSelfBackend(backend?: string): boolean {\n return backend === \"self\" || backend?.startsWith(\"self-\") === true;\n}\n\nfunction getNextOnlyAuthLabel(optionId: Exclude<Auth, \"none\" | \"better-auth\" | \"go-better-auth\" | \"clerk\">): string {\n switch (optionId) {\n case \"nextauth\":\n return \"Auth.js (NextAuth)\";\n case \"stack-auth\":\n return \"Stack Auth\";\n case \"supabase-auth\":\n return \"Supabase Auth\";\n case \"auth0\":\n return \"Auth0\";\n default: {\n const _exhaustive: never = optionId;\n return String(_exhaustive);\n }\n }\n}\n\nfunction getAuthDisabledReason(context: CapabilityStackContext, optionId: Auth): string | null {\n if (optionId === \"none\") return null;\n\n const ecosystem = context.ecosystem ?? \"typescript\";\n const backend = context.backend;\n const { webFrontend, nativeFrontend } = getFrontendSets(context);\n const hasNextJs = webFrontend.includes(\"next\");\n const hasTanStackStart = webFrontend.includes(\"tanstack-start\");\n const hasNativeFrontend = nativeFrontend.some((frontend) => frontend !== \"none\");\n\n if (optionId === \"go-better-auth\") {\n return ecosystem === \"go\" ? null : \"GoBetterAuth is available only for Go stacks\";\n }\n\n if (ecosystem === \"go\") {\n return \"Go stacks currently support GoBetterAuth only\";\n }\n\n if (ecosystem !== \"typescript\") {\n return `${capitalizeFirst(ecosystem)} stacks do not support auth integrations yet`;\n }\n\n if (backend === \"none\") {\n return \"No backend selected\";\n }\n\n if (optionId === \"better-auth\") {\n if (backend === \"convex\") {\n const hasCompatibleFrontend =\n webFrontend.some((frontend) => CONVEX_BETTER_AUTH_WEB.has(frontend)) ||\n nativeFrontend.some((frontend) => NATIVE_FRONTENDS.has(frontend));\n\n if (!hasCompatibleFrontend) {\n return \"Better-Auth with Convex requires React + Vite, TanStack Router, TanStack Start, Next.js, or React Native\";\n }\n }\n\n return null;\n }\n\n if (optionId === \"clerk\") {\n if (backend === \"convex\") {\n const hasCompatibleFrontend =\n webFrontend.some((frontend) => CONVEX_CLERK_WEB.has(frontend)) ||\n nativeFrontend.some((frontend) => NATIVE_FRONTENDS.has(frontend));\n\n if (!hasCompatibleFrontend) {\n return \"Clerk with Convex requires React Router, React + Vite, TanStack Router, TanStack Start, Next.js, or React Native\";\n }\n\n return null;\n }\n\n if (isSelfBackend(backend)) {\n if ((hasNextJs || hasTanStackStart) && hasNativeFrontend) {\n return \"In Better-Fullstack, Clerk with self backend is currently supported only for web-only Next.js or TanStack Start projects (no native companion app)\";\n }\n\n if (hasNextJs || hasTanStackStart) {\n return null;\n }\n\n if (backend === \"self-astro\" || webFrontend.includes(\"astro\")) {\n return \"In Better-Fullstack, Clerk is not yet supported for Astro fullstack projects\";\n }\n if (backend === \"self-nuxt\" || webFrontend.includes(\"nuxt\")) {\n return \"In Better-Fullstack, Clerk is not yet supported for Nuxt fullstack projects\";\n }\n if (backend === \"self-svelte\" || webFrontend.includes(\"svelte\")) {\n return \"In Better-Fullstack, Clerk is not yet supported for SvelteKit fullstack projects\";\n }\n if (backend === \"self-solid-start\" || webFrontend.includes(\"solid-start\")) {\n return \"In Better-Fullstack, Clerk is not yet supported for SolidStart fullstack projects\";\n }\n\n return \"In Better-Fullstack, Clerk is currently supported with Convex, Next.js fullstack, or TanStack Start fullstack\";\n }\n\n return \"In Better-Fullstack, Clerk is currently supported with Convex, Next.js fullstack, or TanStack Start fullstack\";\n }\n\n const nextOnlyLabel = getNextOnlyAuthLabel(optionId);\n if (backend !== \"self\" && backend !== \"self-next\") {\n return `In Better-Fullstack, ${nextOnlyLabel} is currently supported only with the 'self' backend (fullstack Next.js)`;\n }\n\n if (!hasNextJs) {\n return `In Better-Fullstack, ${nextOnlyLabel} currently requires the Next.js frontend`;\n }\n\n return null;\n}\n\nexport function getCapabilityDefinitions<K extends CapabilityName>(\n capability: K,\n): readonly CapabilityDefinitionMap[K][] {\n return CAPABILITY_DEFINITIONS[capability];\n}\n\nexport function getCapabilityDisabledReason<K extends CapabilityName>(\n capability: K,\n context: CapabilityStackContext,\n optionId: CapabilityDefinitionMap[K][\"id\"],\n): string | null {\n if (capability === \"auth\") {\n return getAuthDisabledReason(context, optionId as Auth) as string | null;\n }\n\n return null;\n}\n\nexport function getSupportedCapabilityOptions<K extends CapabilityName>(\n capability: K,\n context: CapabilityStackContext,\n): readonly CapabilityDefinitionMap[K][] {\n return getCapabilityDefinitions(capability).filter(\n (definition) => getCapabilityDisabledReason(capability, context, definition.id) === null,\n );\n}\n\nexport function normalizeCapabilitySelection<K extends CapabilityName>(\n capability: K,\n context: CapabilityStackContext,\n optionId: CapabilityDefinitionMap[K][\"id\"] | undefined,\n): CapabilityNormalizationResult<K> {\n const fallbackValue = \"none\" as CapabilityDefinitionMap[K][\"id\"];\n\n if (!optionId || optionId === fallbackValue) {\n return {\n value: (optionId ?? fallbackValue) as CapabilityDefinitionMap[K][\"id\"],\n normalized: false,\n reason: null,\n message: null,\n };\n }\n\n const reason = getCapabilityDisabledReason(capability, context, optionId);\n if (!reason) {\n return {\n value: optionId,\n normalized: false,\n reason: null,\n message: null,\n };\n }\n\n return {\n value: fallbackValue,\n normalized: true,\n reason,\n message: `${capitalizeFirst(capability)} set to 'None' (${reason})`,\n };\n}\n","import type {\n Addons,\n API,\n AstroIntegration,\n Auth,\n Backend,\n CSSFramework,\n Forms,\n Frontend,\n Runtime,\n UILibrary,\n} from \"./types\";\nimport {\n getCapabilityDisabledReason,\n normalizeCapabilitySelection,\n} from \"./capabilities\";\n\nexport type CompatibilityCategory =\n | \"api\"\n | \"webFrontend\"\n | \"nativeFrontend\"\n | \"astroIntegration\"\n | \"runtime\"\n | \"backend\"\n | \"database\"\n | \"orm\"\n | \"dbSetup\"\n | \"webDeploy\"\n | \"serverDeploy\"\n | \"auth\"\n | \"payments\"\n | \"email\"\n | \"fileUpload\"\n | \"logging\"\n | \"observability\"\n | \"backendLibraries\"\n | \"stateManagement\"\n | \"forms\"\n | \"validation\"\n | \"testing\"\n | \"realtime\"\n | \"jobQueue\"\n | \"caching\"\n | \"search\"\n | \"fileStorage\"\n | \"animation\"\n | \"cssFramework\"\n | \"uiLibrary\"\n | \"cms\"\n | \"featureFlags\"\n | \"analytics\"\n | \"codeQuality\"\n | \"documentation\"\n | \"appPlatforms\"\n | \"packageManager\"\n | \"examples\"\n | \"ai\"\n | \"aiDocs\"\n | \"git\"\n | \"install\"\n | \"effect\"\n | \"rustWebFramework\"\n | \"rustFrontend\"\n | \"rustOrm\"\n | \"rustApi\"\n | \"rustCli\"\n | \"rustLibraries\"\n | \"pythonWebFramework\"\n | \"pythonOrm\"\n | \"pythonValidation\"\n | \"pythonAi\"\n | \"pythonTaskQueue\"\n | \"pythonQuality\"\n | \"goWebFramework\"\n | \"goOrm\"\n | \"goApi\"\n | \"goCli\"\n | \"goLogging\";\n\nexport type CompatibilityIssue = {\n code: string;\n message: string;\n category?: CompatibilityCategory;\n optionId?: string;\n};\n\nexport type CompatibilityEvaluation = {\n issues: CompatibilityIssue[];\n};\n\nexport type CompatibilityAdjustment = {\n category: string;\n message: string;\n};\n\nexport type CompatibilityInput = {\n ecosystem: \"typescript\" | \"rust\" | \"python\" | \"go\";\n projectName: string | null;\n webFrontend: string[];\n nativeFrontend: string[];\n astroIntegration: string;\n runtime: string;\n backend: string;\n database: string;\n orm: string;\n dbSetup: string;\n auth: string;\n payments: string;\n email: string;\n fileUpload: string;\n logging: string;\n observability: string;\n featureFlags: string;\n analytics: string;\n backendLibraries: string;\n stateManagement: string;\n forms: string;\n validation: string;\n testing: string;\n realtime: string;\n jobQueue: string;\n caching: string;\n animation: string;\n cssFramework: string;\n uiLibrary: string;\n cms: string;\n search: string;\n fileStorage: string;\n codeQuality: string[];\n documentation: string[];\n appPlatforms: string[];\n packageManager: string;\n examples: string[];\n aiSdk: string;\n aiDocs: string[];\n git: string;\n install: string;\n api: string;\n webDeploy: string;\n serverDeploy: string;\n yolo: string;\n rustWebFramework: string;\n rustFrontend: string;\n rustOrm: string;\n rustApi: string;\n rustCli: string;\n rustLibraries: string;\n pythonWebFramework: string;\n pythonOrm: string;\n pythonValidation: string;\n pythonAi: string;\n pythonTaskQueue: string;\n pythonQuality: string;\n goWebFramework: string;\n goOrm: string;\n goApi: string;\n goCli: string;\n goLogging: string;\n};\n\nconst TYPESCRIPT_CATEGORY_ORDER: CompatibilityCategory[] = [\n \"webFrontend\",\n \"nativeFrontend\",\n \"astroIntegration\",\n \"cssFramework\",\n \"uiLibrary\",\n \"backend\",\n \"backendLibraries\",\n \"runtime\",\n \"api\",\n \"database\",\n \"orm\",\n \"dbSetup\",\n \"webDeploy\",\n \"serverDeploy\",\n \"auth\",\n \"payments\",\n \"email\",\n \"fileUpload\",\n \"logging\",\n \"observability\",\n \"featureFlags\",\n \"analytics\",\n \"ai\",\n \"stateManagement\",\n \"forms\",\n \"validation\",\n \"testing\",\n \"realtime\",\n \"jobQueue\",\n \"caching\",\n \"search\",\n \"fileStorage\",\n \"animation\",\n \"cms\",\n \"codeQuality\",\n \"documentation\",\n \"appPlatforms\",\n \"packageManager\",\n \"examples\",\n \"aiDocs\",\n \"git\",\n \"install\",\n];\n\nconst CATEGORY_ORDER: CompatibilityCategory[] = [\n ...TYPESCRIPT_CATEGORY_ORDER,\n \"rustWebFramework\",\n \"rustFrontend\",\n \"rustOrm\",\n \"rustApi\",\n \"rustCli\",\n \"rustLibraries\",\n \"pythonWebFramework\",\n \"pythonOrm\",\n \"pythonValidation\",\n \"pythonAi\",\n \"pythonTaskQueue\",\n \"pythonQuality\",\n \"goWebFramework\",\n \"goOrm\",\n \"goApi\",\n \"goCli\",\n \"goLogging\",\n];\n\nconst DEFAULT_RUNTIME = \"bun\";\n\nexport function validateProjectName(name: string): string | undefined {\n const INVALID_CHARS = [\"<\", \">\", \":\", '\"', \"|\", \"?\", \"*\"];\n const MAX_LENGTH = 255;\n\n if (name === \".\") return undefined;\n\n if (!name) return \"Project name cannot be empty\";\n if (name.length > MAX_LENGTH) {\n return `Project name must be less than ${MAX_LENGTH} characters`;\n }\n if (INVALID_CHARS.some((char) => name.includes(char))) {\n return \"Project name contains invalid characters\";\n }\n if (name.startsWith(\".\") || name.startsWith(\"-\")) {\n return \"Project name cannot start with a dot or dash\";\n }\n if (name.toLowerCase() === \"node_modules\" || name.toLowerCase() === \"favicon.ico\") {\n return \"Project name is reserved\";\n }\n return undefined;\n}\n\nexport const hasPWACompatibleFrontend = (webFrontend: string[]) =>\n webFrontend.some((f) =>\n [\"tanstack-router\", \"react-router\", \"react-vite\", \"solid\", \"next\", \"astro\"].includes(f),\n );\n\nexport const hasTauriCompatibleFrontend = (webFrontend: string[]) =>\n webFrontend.some((f) =>\n [\"tanstack-router\", \"react-router\", \"react-vite\", \"nuxt\", \"svelte\", \"solid\", \"next\", \"astro\"].includes(f),\n );\n\nconst isChatSdkExampleSupported = (stack: CompatibilityInput): boolean => {\n if (stack.ecosystem !== \"typescript\") return false;\n\n if (stack.backend === \"self-next\" || stack.backend === \"self-tanstack-start\") {\n return true;\n }\n\n if (stack.backend === \"self-nuxt\") {\n return true;\n }\n\n if (stack.backend === \"hono\") {\n return stack.runtime === \"node\";\n }\n\n return false;\n};\n\nexport const requiresChatSdkVercelAI = (stack: CompatibilityInput): boolean => {\n return (\n stack.examples.includes(\"chat-sdk\") &&\n (stack.backend === \"self-nuxt\" || (stack.backend === \"hono\" && stack.runtime === \"node\"))\n );\n};\n\nexport const getCategoryDisplayName = (categoryKey: string): string => {\n // Custom display names for Rust categories\n const rustCategoryNames: Record<string, string> = {\n rustWebFramework: \"Rust Web Framework\",\n rustFrontend: \"Rust Frontend (WASM)\",\n rustOrm: \"Rust ORM / Database\",\n rustApi: \"Rust API Layer\",\n rustCli: \"Rust CLI Tools\",\n rustLibraries: \"Rust Core Libraries\",\n };\n\n // Custom display names for Python categories\n const pythonCategoryNames: Record<string, string> = {\n pythonWebFramework: \"Python Web Framework\",\n pythonOrm: \"Python ORM / Database\",\n pythonValidation: \"Python Validation\",\n pythonAi: \"Python AI / ML\",\n pythonTaskQueue: \"Python Task Queue\",\n pythonQuality: \"Python Code Quality\",\n };\n\n // Custom display names for Go categories\n const goCategoryNames: Record<string, string> = {\n goWebFramework: \"Go Web Framework\",\n goOrm: \"Go ORM / Database\",\n goApi: \"Go API Layer\",\n goCli: \"Go CLI Tools\",\n goLogging: \"Go Logging\",\n };\n\n if (rustCategoryNames[categoryKey]) {\n return rustCategoryNames[categoryKey];\n }\n\n if (pythonCategoryNames[categoryKey]) {\n return pythonCategoryNames[categoryKey];\n }\n\n if (goCategoryNames[categoryKey]) {\n return goCategoryNames[categoryKey];\n }\n\n const result = categoryKey.replace(/([A-Z])/g, \" $1\");\n return result.charAt(0).toUpperCase() + result.slice(1);\n};\n\nexport type CompatibilityAnalysisResult = {\n adjustedStack: CompatibilityInput | null;\n notes: Record<string, { notes: string[]; hasIssue: boolean }>;\n changes: CompatibilityAdjustment[];\n};\n\n/**\n * Analyzes the stack and auto-adjusts incompatible selections.\n * This follows the CLI approach: when you make a selection, dependent items adjust automatically.\n * The flow is: frontend -> backend -> runtime -> database -> orm -> api -> auth -> etc.\n */\nexport const analyzeStackCompatibility = (\n stack: CompatibilityInput,\n): CompatibilityAnalysisResult => {\n // Skip all validation if YOLO mode is enabled\n if (stack.yolo === \"true\") {\n return {\n adjustedStack: null,\n notes: {},\n changes: [],\n };\n }\n\n const nextStack = { ...stack };\n let changed = false;\n const notes: CompatibilityAnalysisResult[\"notes\"] = {};\n const changes: CompatibilityAdjustment[] = [];\n\n for (const cat of CATEGORY_ORDER) {\n notes[cat] = { notes: [], hasIssue: false };\n }\n\n // ============================================\n // BACKEND CONSTRAINTS\n // ============================================\n\n if (nextStack.backend === \"convex\") {\n // Convex handles its own runtime, database, orm, api, dbSetup\n const convexOverrides: Partial<CompatibilityInput> = {\n runtime: \"none\",\n database: \"none\",\n orm: \"none\",\n api: \"none\",\n dbSetup: \"none\",\n serverDeploy: \"none\",\n search: \"none\",\n fileStorage: \"none\",\n };\n\n for (const [key, value] of Object.entries(convexOverrides)) {\n const catKey = key as keyof CompatibilityInput;\n if (nextStack[catKey] !== value) {\n nextStack[catKey] = value as never;\n changed = true;\n changes.push({\n category: \"backend\",\n message: `${getCategoryDisplayName(catKey)} set to '${value}' (Convex provides this)`,\n });\n }\n }\n\n // Remove incompatible frontends\n if (nextStack.webFrontend.includes(\"solid\")) {\n nextStack.webFrontend = nextStack.webFrontend.filter((f) => f !== \"solid\");\n if (nextStack.webFrontend.length === 0) nextStack.webFrontend = [\"none\"];\n changed = true;\n changes.push({ category: \"backend\", message: \"Removed Solid (incompatible with Convex)\" });\n }\n if (nextStack.webFrontend.includes(\"solid-start\")) {\n nextStack.webFrontend = nextStack.webFrontend.filter((f) => f !== \"solid-start\");\n if (nextStack.webFrontend.length === 0) nextStack.webFrontend = [\"none\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Removed SolidStart (incompatible with Convex)\",\n });\n }\n if (nextStack.webFrontend.includes(\"astro\")) {\n nextStack.webFrontend = nextStack.webFrontend.filter((f) => f !== \"astro\");\n if (nextStack.webFrontend.length === 0) nextStack.webFrontend = [\"none\"];\n nextStack.astroIntegration = \"none\";\n changed = true;\n changes.push({ category: \"backend\", message: \"Removed Astro (incompatible with Convex)\" });\n }\n\n // Remove AI example if incompatible frontends are selected (Convex AI supports React-based frontends, including React + Vite)\n if (nextStack.examples.includes(\"ai\")) {\n const hasIncompatibleFrontend = nextStack.webFrontend.some((f) =>\n [\"solid\", \"svelte\", \"nuxt\"].includes(f),\n );\n if (hasIncompatibleFrontend) {\n nextStack.examples = nextStack.examples.filter((e) => e !== \"ai\");\n if (nextStack.examples.length === 0) nextStack.examples = [\"none\"];\n changed = true;\n changes.push({\n category: \"examples\",\n message:\n \"AI example removed (Convex AI only supports React-based frontends including React + Vite)\",\n });\n }\n }\n\n }\n\n if (nextStack.backend === \"none\") {\n // No backend means no runtime, database, orm, api, auth, dbSetup, serverDeploy\n const noneOverrides: Partial<CompatibilityInput> = {\n runtime: \"none\",\n database: \"none\",\n orm: \"none\",\n api: \"none\",\n dbSetup: \"none\",\n serverDeploy: \"none\",\n payments: \"none\",\n search: \"none\",\n fileStorage: \"none\",\n };\n\n if (nextStack.ecosystem !== \"go\") {\n noneOverrides.auth = \"none\";\n }\n\n for (const [key, value] of Object.entries(noneOverrides)) {\n const catKey = key as keyof CompatibilityInput;\n if (nextStack[catKey] !== value) {\n nextStack[catKey] = value as never;\n changed = true;\n changes.push({\n category: \"backend\",\n message: `${getCategoryDisplayName(catKey)} set to '${value}' (no backend)`,\n });\n }\n }\n\n // Clear examples\n if (\n nextStack.examples.length > 0 &&\n !(nextStack.examples.length === 1 && nextStack.examples[0] === \"none\")\n ) {\n nextStack.examples = [\"none\"];\n changed = true;\n changes.push({ category: \"backend\", message: \"Examples cleared (no backend)\" });\n }\n }\n\n // Self (fullstack) backend constraints\n if (\n nextStack.backend === \"self-next\" ||\n nextStack.backend === \"self-tanstack-start\" ||\n nextStack.backend === \"self-astro\" ||\n nextStack.backend === \"self-nuxt\" ||\n nextStack.backend === \"self-svelte\" ||\n nextStack.backend === \"self-solid-start\"\n ) {\n // Fullstack uses frontend's API routes, no separate runtime needed\n if (nextStack.runtime !== \"none\") {\n nextStack.runtime = \"none\";\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Runtime set to 'None' (fullstack uses frontend's API routes)\",\n });\n }\n if (nextStack.serverDeploy !== \"none\") {\n nextStack.serverDeploy = \"none\";\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Server deploy set to 'None' (fullstack uses frontend deployment)\",\n });\n }\n\n // Ensure correct frontend is selected\n if (nextStack.backend === \"self-next\" && !nextStack.webFrontend.includes(\"next\")) {\n nextStack.webFrontend = [\"next\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'Next.js' (required for Next.js fullstack)\",\n });\n }\n if (\n nextStack.backend === \"self-tanstack-start\" &&\n !nextStack.webFrontend.includes(\"tanstack-start\")\n ) {\n nextStack.webFrontend = [\"tanstack-start\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'TanStack Start' (required for TanStack Start fullstack)\",\n });\n }\n if (nextStack.backend === \"self-astro\" && !nextStack.webFrontend.includes(\"astro\")) {\n nextStack.webFrontend = [\"astro\"];\n if (nextStack.astroIntegration === \"none\") {\n nextStack.astroIntegration = \"react\";\n }\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'Astro' (required for Astro fullstack)\",\n });\n }\n if (nextStack.backend === \"self-nuxt\" && !nextStack.webFrontend.includes(\"nuxt\")) {\n nextStack.webFrontend = [\"nuxt\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'Nuxt' (required for Nuxt fullstack)\",\n });\n }\n if (nextStack.backend === \"self-svelte\" && !nextStack.webFrontend.includes(\"svelte\")) {\n nextStack.webFrontend = [\"svelte\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'SvelteKit' (required for SvelteKit fullstack)\",\n });\n }\n if (\n nextStack.backend === \"self-solid-start\" &&\n !nextStack.webFrontend.includes(\"solid-start\")\n ) {\n nextStack.webFrontend = [\"solid-start\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'SolidStart' (required for SolidStart fullstack)\",\n });\n }\n }\n\n // ============================================\n // RUNTIME CONSTRAINTS\n // ============================================\n\n // Workers runtime requires Hono backend\n if (nextStack.runtime === \"workers\" && nextStack.backend !== \"hono\") {\n nextStack.backend = \"hono\";\n changed = true;\n changes.push({ category: \"runtime\", message: \"Backend set to 'Hono' (required for Workers)\" });\n }\n\n // Workers runtime requires server deployment\n if (nextStack.runtime === \"workers\" && nextStack.serverDeploy === \"none\") {\n nextStack.serverDeploy = \"cloudflare\";\n changed = true;\n changes.push({\n category: \"runtime\",\n message: \"Server deploy set to 'Cloudflare' (required for Workers)\",\n });\n }\n\n // Workers runtime is incompatible with MongoDB\n if (nextStack.runtime === \"workers\" && nextStack.database === \"mongodb\") {\n nextStack.database = \"sqlite\";\n nextStack.orm = \"drizzle\";\n nextStack.dbSetup = \"d1\";\n changed = true;\n changes.push({\n category: \"runtime\",\n message:\n \"Database changed to SQLite with D1 (Better-Fullstack doesn't support MongoDB with Workers)\",\n });\n }\n\n // Runtime \"none\" only for convex and fullstack backends\n if (\n nextStack.runtime === \"none\" &&\n nextStack.backend !== \"convex\" &&\n nextStack.backend !== \"none\" &&\n nextStack.backend !== \"self-next\" &&\n nextStack.backend !== \"self-tanstack-start\" &&\n nextStack.backend !== \"self-astro\" &&\n nextStack.backend !== \"self-nuxt\" &&\n nextStack.backend !== \"self-svelte\" &&\n nextStack.backend !== \"self-solid-start\"\n ) {\n nextStack.runtime = DEFAULT_RUNTIME;\n changed = true;\n changes.push({\n category: \"runtime\",\n message: `Runtime set to '${DEFAULT_RUNTIME}' (required for this backend)`,\n });\n }\n\n // ============================================\n // DATABASE & ORM CONSTRAINTS (CLI-like flow)\n // ============================================\n\n // Skip if backend doesn't use database\n if (nextStack.backend !== \"convex\" && nextStack.backend !== \"none\") {\n // If database is none, ORM and dbSetup must be none\n if (nextStack.database === \"none\") {\n if (nextStack.orm !== \"none\") {\n nextStack.orm = \"none\";\n changed = true;\n changes.push({ category: \"database\", message: \"ORM set to 'None' (no database selected)\" });\n }\n if (nextStack.dbSetup !== \"none\") {\n nextStack.dbSetup = \"none\";\n changed = true;\n changes.push({\n category: \"database\",\n message: \"DB Setup set to 'None' (no database selected)\",\n });\n }\n }\n\n // MongoDB requires Prisma or Mongoose\n if (nextStack.database === \"mongodb\") {\n if (nextStack.orm !== \"prisma\" && nextStack.orm !== \"mongoose\") {\n nextStack.orm = \"prisma\";\n changed = true;\n changes.push({\n category: \"database\",\n message: \"ORM set to 'Prisma' (required for MongoDB)\",\n });\n }\n // MongoDB only works with mongodb-atlas or none for dbSetup\n if (\n nextStack.dbSetup !== \"mongodb-atlas\" &&\n nextStack.dbSetup !== \"none\" &&\n nextStack.dbSetup !== \"docker\"\n ) {\n nextStack.dbSetup = \"none\";\n changed = true;\n changes.push({\n category: \"database\",\n message: \"DB Setup set to 'None' (incompatible with MongoDB)\",\n });\n }\n }\n\n // Relational databases (sqlite, postgres, mysql) need Drizzle or Prisma\n if ([\"sqlite\", \"postgres\", \"mysql\"].includes(nextStack.database)) {\n if (nextStack.orm === \"none\") {\n nextStack.orm = \"drizzle\";\n changed = true;\n changes.push({\n category: \"database\",\n message: \"ORM set to 'Drizzle' (required for database)\",\n });\n }\n if (nextStack.orm === \"mongoose\") {\n nextStack.orm = \"drizzle\";\n changed = true;\n changes.push({\n category: \"database\",\n message: \"ORM set to 'Drizzle' (Mongoose only works with MongoDB)\",\n });\n }\n }\n\n // ORM selected but no database - select appropriate database\n if (nextStack.orm !== \"none\" && nextStack.database === \"none\") {\n if (nextStack.orm === \"mongoose\") {\n nextStack.database = \"mongodb\";\n changed = true;\n changes.push({\n category: \"orm\",\n message: \"Database set to 'MongoDB' (required for Mongoose)\",\n });\n } else {\n nextStack.database = \"sqlite\";\n changed = true;\n changes.push({ category: \"orm\", message: \"Database set to 'SQLite' (required for ORM)\" });\n }\n }\n\n // DB Setup constraints\n if (nextStack.dbSetup === \"turso\" && nextStack.database !== \"sqlite\") {\n nextStack.database = \"sqlite\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'SQLite' (required for Turso)\",\n });\n }\n if (nextStack.dbSetup === \"d1\") {\n if (nextStack.database !== \"sqlite\") {\n nextStack.database = \"sqlite\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'SQLite' (required for D1)\",\n });\n }\n if (nextStack.runtime !== \"workers\") {\n nextStack.runtime = \"workers\";\n nextStack.backend = \"hono\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Runtime set to 'Workers' with 'Hono' (required for D1)\",\n });\n }\n }\n if (nextStack.dbSetup === \"neon\" && nextStack.database !== \"postgres\") {\n nextStack.database = \"postgres\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'PostgreSQL' (required for Neon)\",\n });\n }\n if (nextStack.dbSetup === \"supabase\" && nextStack.database !== \"postgres\") {\n nextStack.database = \"postgres\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'PostgreSQL' (required for Supabase)\",\n });\n }\n if (nextStack.dbSetup === \"prisma-postgres\" && nextStack.database !== \"postgres\") {\n nextStack.database = \"postgres\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'PostgreSQL' (required for Prisma Postgres)\",\n });\n }\n if (nextStack.dbSetup === \"mongodb-atlas\" && nextStack.database !== \"mongodb\") {\n nextStack.database = \"mongodb\";\n if (nextStack.orm !== \"prisma\" && nextStack.orm !== \"mongoose\") {\n nextStack.orm = \"prisma\";\n }\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'MongoDB' (required for MongoDB Atlas)\",\n });\n }\n if (\n nextStack.dbSetup === \"planetscale\" &&\n nextStack.database !== \"postgres\" &&\n nextStack.database !== \"mysql\"\n ) {\n nextStack.database = \"postgres\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"Database set to 'PostgreSQL' (required for PlanetScale)\",\n });\n }\n if (nextStack.dbSetup === \"docker\") {\n if (nextStack.database === \"sqlite\") {\n nextStack.dbSetup = \"none\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message: \"DB Setup set to 'None' (SQLite doesn't need Docker)\",\n });\n }\n if (nextStack.runtime === \"workers\") {\n nextStack.dbSetup = \"d1\";\n changed = true;\n changes.push({\n category: \"dbSetup\",\n message:\n \"DB Setup set to 'D1' (Better-Fullstack doesn't support Docker setup with Workers)\",\n });\n }\n }\n }\n\n // ============================================\n // API CONSTRAINTS\n // ============================================\n\n if (nextStack.backend !== \"convex\" && nextStack.backend !== \"none\") {\n // Nuxt, Svelte, Solid, SolidStart require oRPC (not tRPC)\n const needsOrpc = nextStack.webFrontend.some((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"solid-start\"].includes(f),\n );\n if (needsOrpc && nextStack.api === \"trpc\") {\n nextStack.api = \"orpc\";\n changed = true;\n changes.push({ category: \"api\", message: \"API set to 'oRPC' (required for this frontend)\" });\n }\n\n // Astro with non-React integration requires oRPC\n if (\n nextStack.webFrontend.includes(\"astro\") &&\n nextStack.astroIntegration !== \"react\" &&\n nextStack.api === \"trpc\"\n ) {\n nextStack.api = \"orpc\";\n changed = true;\n changes.push({\n category: \"api\",\n message: \"API set to 'oRPC' (tRPC requires React integration with Astro)\",\n });\n }\n }\n\n // ============================================\n // ASTRO INTEGRATION CONSTRAINTS\n // ============================================\n\n // If Astro is not selected, reset astroIntegration\n if (!nextStack.webFrontend.includes(\"astro\") && nextStack.astroIntegration !== \"none\") {\n nextStack.astroIntegration = \"none\";\n changed = true;\n changes.push({\n category: \"astroIntegration\",\n message: \"Astro integration reset (Astro not selected)\",\n });\n }\n\n // If Astro is selected but no integration is set, default to react\n if (nextStack.webFrontend.includes(\"astro\") && nextStack.astroIntegration === \"none\") {\n // Only set default if api is trpc (which requires react)\n if (nextStack.api === \"trpc\") {\n nextStack.astroIntegration = \"react\";\n changed = true;\n changes.push({\n category: \"astroIntegration\",\n message: \"Astro integration set to 'React' (required for tRPC)\",\n });\n }\n }\n\n // ============================================\n // AUTH CONSTRAINTS\n // ============================================\n\n const normalizedAuth = normalizeCapabilitySelection(\n \"auth\",\n {\n ecosystem: nextStack.ecosystem,\n backend: nextStack.backend,\n webFrontend: nextStack.webFrontend,\n nativeFrontend: nextStack.nativeFrontend,\n },\n nextStack.auth as Auth,\n );\n\n if (normalizedAuth.normalized && nextStack.auth !== normalizedAuth.value) {\n nextStack.auth = normalizedAuth.value;\n changed = true;\n changes.push({\n category: \"auth\",\n message: normalizedAuth.message ?? \"Auth set to 'None'\",\n });\n }\n\n // ============================================\n // PAYMENTS CONSTRAINTS\n // ============================================\n\n if (nextStack.payments === \"dodo\" && nextStack.webFrontend.includes(\"react-vite\")) {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message:\n \"Payments set to 'None' (Dodo Payments support is not available for React + Vite yet)\",\n });\n }\n\n if (nextStack.payments === \"polar\") {\n if (nextStack.auth !== \"better-auth\") {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message: \"Payments set to 'None' (Polar requires Better Auth)\",\n });\n }\n if (nextStack.backend === \"convex\") {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message: \"Payments set to 'None' (Polar incompatible with Convex)\",\n });\n }\n const hasWebFrontend = nextStack.webFrontend.some((f) => f !== \"none\");\n if (!hasWebFrontend) {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message: \"Payments set to 'None' (Polar requires web frontend)\",\n });\n }\n }\n\n // ============================================\n // EMAIL CONSTRAINTS\n // ============================================\n\n if (nextStack.email !== \"none\") {\n if (nextStack.backend === \"convex\") {\n nextStack.email = \"none\";\n changed = true;\n changes.push({\n category: \"email\",\n message: \"Email set to 'None' (incompatible with Convex)\",\n });\n }\n if (nextStack.backend === \"none\") {\n nextStack.email = \"none\";\n changed = true;\n changes.push({\n category: \"email\",\n message: \"Email set to 'None' (requires backend)\",\n });\n }\n }\n\n // ============================================\n // CSS FRAMEWORK & UI LIBRARY CONSTRAINTS\n // ============================================\n\n // If no web frontend, reset CSS framework and UI library to none\n if (!nextStack.webFrontend.some((f) => f !== \"none\")) {\n if (nextStack.cssFramework !== \"none\") {\n nextStack.cssFramework = \"none\";\n changed = true;\n changes.push({\n category: \"cssFramework\",\n message: \"CSS framework set to 'None' (no web frontend)\",\n });\n }\n if (nextStack.uiLibrary !== \"none\") {\n nextStack.uiLibrary = \"none\";\n changed = true;\n changes.push({\n category: \"uiLibrary\",\n message: \"UI library set to 'None' (no web frontend)\",\n });\n }\n }\n\n // UI libraries requiring Tailwind - auto-adjust CSS framework or clear UI library\n const requiresTailwind = [\"shadcn-ui\", \"daisyui\", \"nextui\"].includes(nextStack.uiLibrary);\n if (requiresTailwind && nextStack.cssFramework !== \"tailwind\") {\n // Auto-set Tailwind when selecting a Tailwind-dependent UI library\n nextStack.cssFramework = \"tailwind\";\n changed = true;\n changes.push({\n category: \"cssFramework\",\n message: `CSS framework set to 'Tailwind' (required by ${nextStack.uiLibrary})`,\n });\n }\n\n // React-only UI libraries - check frontend compatibility\n const reactOnlyLibraries = [\"shadcn-ui\", \"radix-ui\", \"chakra-ui\", \"nextui\"];\n const reactFrontends = [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\"];\n if (reactOnlyLibraries.includes(nextStack.uiLibrary)) {\n const hasReactFrontend = nextStack.webFrontend.some((f) => reactFrontends.includes(f));\n const hasAstroReact =\n nextStack.webFrontend.includes(\"astro\") && nextStack.astroIntegration === \"react\";\n if (!hasReactFrontend && !hasAstroReact && nextStack.webFrontend.some((f) => f !== \"none\")) {\n // Reset to a compatible UI library (daisyui works with all frontends)\n nextStack.uiLibrary = \"daisyui\";\n changed = true;\n changes.push({\n category: \"uiLibrary\",\n message:\n \"UI library changed to 'daisyUI' (React-only library incompatible with this frontend)\",\n });\n }\n }\n\n // Headless UI requires React or Vue\n if (nextStack.uiLibrary === \"headless-ui\") {\n const hasReactFrontend = nextStack.webFrontend.some((f) => reactFrontends.includes(f));\n const hasVueFrontend = nextStack.webFrontend.includes(\"nuxt\");\n const hasAstroReactOrVue =\n nextStack.webFrontend.includes(\"astro\") &&\n [\"react\", \"vue\"].includes(nextStack.astroIntegration);\n if (!hasReactFrontend && !hasVueFrontend && !hasAstroReactOrVue) {\n nextStack.uiLibrary = \"daisyui\";\n changed = true;\n changes.push({\n category: \"uiLibrary\",\n message: \"UI library changed to 'daisyUI' (Headless UI requires React or Vue)\",\n });\n }\n }\n\n // Park UI requires React, Vue, or Solid\n if (nextStack.uiLibrary === \"park-ui\") {\n const hasReactFrontend = nextStack.webFrontend.some((f) => reactFrontends.includes(f));\n const hasVueFrontend = nextStack.webFrontend.includes(\"nuxt\");\n const hasSolidFrontend = nextStack.webFrontend.includes(\"solid\");\n const hasAstroCompatible =\n nextStack.webFrontend.includes(\"astro\") &&\n [\"react\", \"vue\", \"solid\"].includes(nextStack.astroIntegration);\n if (\n !hasReactFrontend &&\n !hasVueFrontend &&\n !hasSolidFrontend &&\n !hasAstroCompatible &&\n nextStack.webFrontend.some((f) => f !== \"none\")\n ) {\n nextStack.uiLibrary = \"daisyui\";\n changed = true;\n changes.push({\n category: \"uiLibrary\",\n message: \"UI library changed to 'daisyUI' (Park UI requires React, Vue, or Solid)\",\n });\n }\n }\n\n // ============================================\n // APP PLATFORMS CONSTRAINTS\n // ============================================\n\n const pwaCompat = hasPWACompatibleFrontend(nextStack.webFrontend);\n const tauriCompat = hasTauriCompatibleFrontend(nextStack.webFrontend);\n\n if (!pwaCompat && nextStack.appPlatforms.includes(\"pwa\")) {\n nextStack.appPlatforms = nextStack.appPlatforms.filter((a) => a !== \"pwa\");\n changed = true;\n changes.push({\n category: \"appPlatforms\",\n message: \"PWA removed (requires compatible frontend)\",\n });\n }\n if (!tauriCompat && nextStack.appPlatforms.includes(\"tauri\")) {\n nextStack.appPlatforms = nextStack.appPlatforms.filter((a) => a !== \"tauri\");\n changed = true;\n changes.push({\n category: \"appPlatforms\",\n message: \"Tauri removed (requires compatible frontend)\",\n });\n }\n\n // ============================================\n // EXAMPLES CONSTRAINTS\n // ============================================\n\n // AI example constraints\n if (nextStack.examples.includes(\"ai\")) {\n // Solid/SolidStart frontend is incompatible with AI example\n if (nextStack.webFrontend.includes(\"solid\") || nextStack.webFrontend.includes(\"solid-start\")) {\n nextStack.examples = nextStack.examples.filter((e) => e !== \"ai\");\n if (nextStack.examples.length === 0) nextStack.examples = [\"none\"];\n changed = true;\n changes.push({\n category: \"examples\",\n message: \"AI removed (not compatible with Solid frontend)\",\n });\n }\n // Convex AI only supports React-based frontends (not Svelte/Nuxt)\n if (nextStack.backend === \"convex\") {\n const hasIncompatibleFrontend = nextStack.webFrontend.some((f) =>\n [\"svelte\", \"nuxt\"].includes(f),\n );\n if (hasIncompatibleFrontend) {\n nextStack.examples = nextStack.examples.filter((e) => e !== \"ai\");\n if (nextStack.examples.length === 0) nextStack.examples = [\"none\"];\n changed = true;\n changes.push({\n category: \"examples\",\n message:\n \"AI removed (Convex AI only supports React-based frontends including React + Vite)\",\n });\n }\n }\n }\n\n // Chat SDK example constraints (framework-specific profiles in v1)\n if (nextStack.examples.includes(\"chat-sdk\")) {\n const hasReactVite = nextStack.webFrontend.includes(\"react-vite\");\n\n if (hasReactVite || !isChatSdkExampleSupported(nextStack)) {\n nextStack.examples = nextStack.examples.filter((e) => e !== \"chat-sdk\");\n if (nextStack.examples.length === 0) nextStack.examples = [\"none\"];\n changed = true;\n\n let reason = \"unsupported stack\";\n if (hasReactVite) {\n reason = \"React + Vite support is not available yet\";\n } else if (nextStack.ecosystem !== \"typescript\") {\n reason = \"TypeScript ecosystem only\";\n } else if (nextStack.backend === \"convex\") {\n reason = \"Convex backend not supported in v1\";\n } else if (nextStack.backend === \"none\") {\n reason = \"requires a backend\";\n } else if (nextStack.backend === \"hono\" && nextStack.runtime !== \"node\") {\n reason = \"Hono profile requires Node runtime\";\n } else if (nextStack.backend.startsWith(\"self-\")) {\n reason = \"self backend only supports Next.js, TanStack Start, or Nuxt in v1\";\n }\n\n changes.push({\n category: \"examples\",\n message: `Chat SDK removed (${reason})`,\n });\n } else if (requiresChatSdkVercelAI(nextStack) && nextStack.aiSdk !== \"vercel-ai\") {\n nextStack.aiSdk = \"vercel-ai\";\n changed = true;\n changes.push({\n category: \"ai\",\n message: \"AI SDK set to 'Vercel AI SDK' (required by Chat SDK Nuxt/Hono profile in v1)\",\n });\n }\n }\n\n // ============================================\n // FRESH FRONTEND CONSTRAINTS\n // Fresh is Preact-based and incompatible with React-specific packages\n // ============================================\n\n const isFresh = nextStack.webFrontend.includes(\"fresh\");\n\n if (isFresh) {\n // TanStack Form has no Preact adapter\n if (nextStack.forms === \"tanstack-form\") {\n nextStack.forms = \"none\";\n changed = true;\n changes.push({\n category: \"forms\",\n message: \"Forms set to 'None' (TanStack Form has no Preact adapter)\",\n });\n }\n\n // State management libraries that require React bindings\n const reactOnlyStateManagement = [\"nanostores\", \"xstate\", \"tanstack-store\"];\n if (reactOnlyStateManagement.includes(nextStack.stateManagement)) {\n const oldValue = nextStack.stateManagement;\n nextStack.stateManagement = \"none\";\n changed = true;\n changes.push({\n category: \"stateManagement\",\n message: `State management set to 'None' (${oldValue} requires React bindings)`,\n });\n }\n\n // Lottie uses lottie-react which requires React\n if (nextStack.animation === \"lottie\") {\n nextStack.animation = \"none\";\n changed = true;\n changes.push({\n category: \"animation\",\n message: \"Animation set to 'None' (Lottie requires lottie-react)\",\n });\n }\n }\n\n // ============================================\n // DEPLOYMENT CONSTRAINTS\n // ============================================\n\n // Web deploy requires web frontend\n if (nextStack.webDeploy !== \"none\" && !nextStack.webFrontend.some((f) => f !== \"none\")) {\n nextStack.webDeploy = \"none\";\n changed = true;\n changes.push({ category: \"webDeploy\", message: \"Web deploy set to 'None' (no web frontend)\" });\n }\n\n // Server deploy constraints\n if (nextStack.serverDeploy === \"cloudflare\") {\n if (nextStack.runtime !== \"workers\" || nextStack.backend !== \"hono\") {\n nextStack.serverDeploy = \"none\";\n changed = true;\n changes.push({\n category: \"serverDeploy\",\n message: \"Server deploy set to 'None' (Cloudflare requires Workers + Hono)\",\n });\n }\n }\n\n if (\n nextStack.serverDeploy !== \"none\" &&\n [\n \"none\",\n \"convex\",\n \"self-next\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n ].includes(nextStack.backend)\n ) {\n nextStack.serverDeploy = \"none\";\n changed = true;\n changes.push({\n category: \"serverDeploy\",\n message: \"Server deploy set to 'None' (not needed for this backend)\",\n });\n }\n\n return {\n adjustedStack: changed ? nextStack : null,\n notes,\n changes,\n };\n};\n\n/**\n * Returns a reason why an option is disabled, or null if it's enabled.\n *\n * PHILOSOPHY: Only disable options that are TRULY incompatible.\n * - Don't create circular dependencies\n * - Allow users to select options that will trigger auto-adjustments\n * - Follow CLI behavior: filter options based on UPSTREAM selections only\n */\nexport const getDisabledReason = (\n currentStack: CompatibilityInput,\n category: CompatibilityCategory,\n optionId: string,\n): string | null => {\n // ============================================\n // CONVEX BACKEND - locks down many options\n // ============================================\n if (currentStack.backend === \"convex\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"Convex provides its own runtime\";\n }\n if (category === \"database\" && optionId !== \"none\") {\n return \"Convex provides its own database\";\n }\n if (category === \"orm\" && optionId !== \"none\") {\n return \"Convex has built-in data access\";\n }\n if (category === \"api\" && optionId !== \"none\") {\n return \"Convex provides its own API layer\";\n }\n if (category === \"dbSetup\" && optionId !== \"none\") {\n return \"Convex handles database setup\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Convex has its own deployment\";\n }\n if (category === \"search\" && optionId !== \"none\") {\n return \"Search requires a standalone backend\";\n }\n if (category === \"fileStorage\" && optionId !== \"none\") {\n return \"File storage requires a standalone backend\";\n }\n if (category === \"webFrontend\" && optionId === \"solid\") {\n return \"In Better-Fullstack, the Convex backend is currently not available with Solid\";\n }\n if (category === \"webFrontend\" && optionId === \"astro\") {\n return \"In Better-Fullstack, the Convex backend is currently not available with Astro\";\n }\n if (category === \"examples\" && optionId === \"ai\") {\n const hasIncompatibleFrontend = currentStack.webFrontend.some((f) =>\n [\"solid\", \"svelte\", \"nuxt\"].includes(f),\n );\n if (hasIncompatibleFrontend) {\n const frontendName = currentStack.webFrontend.find((f) =>\n [\"solid\", \"svelte\", \"nuxt\"].includes(f),\n );\n return `Convex AI example only supports React-based frontends including React + Vite (not ${frontendName})`;\n }\n }\n if (category === \"payments\" && optionId === \"polar\") {\n return \"In Better-Fullstack, Polar is currently not available with the Convex backend\";\n }\n }\n\n // ============================================\n // NO BACKEND - locks down backend-dependent options\n // ============================================\n if (currentStack.backend === \"none\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"database\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"orm\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"api\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"dbSetup\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"payments\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"search\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"fileStorage\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"examples\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n }\n\n // ============================================\n // FULLSTACK BACKEND CONSTRAINTS\n // ============================================\n if (currentStack.backend === \"self-next\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"Next.js fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"next\" && optionId !== \"none\") {\n return \"Next.js fullstack requires Next.js frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n if (currentStack.backend === \"self-tanstack-start\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"TanStack Start fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"tanstack-start\" && optionId !== \"none\") {\n return \"TanStack Start fullstack requires TanStack Start frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n if (currentStack.backend === \"self-astro\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"Astro fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"astro\" && optionId !== \"none\") {\n return \"Astro fullstack requires Astro frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n if (currentStack.backend === \"self-nuxt\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"Nuxt fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"nuxt\" && optionId !== \"none\") {\n return \"Nuxt fullstack requires Nuxt frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n if (currentStack.backend === \"self-svelte\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"SvelteKit fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"svelte\" && optionId !== \"none\") {\n return \"SvelteKit fullstack requires SvelteKit frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n if (currentStack.backend === \"self-solid-start\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"SolidStart fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"solid-start\" && optionId !== \"none\") {\n return \"SolidStart fullstack requires SolidStart frontend\";\n }\n if (category === \"serverDeploy\" && optionId !== \"none\") {\n return \"Fullstack uses frontend deployment\";\n }\n }\n\n // ============================================\n // BACKEND SELECTION CONSTRAINTS\n // ============================================\n if (category === \"backend\") {\n if (optionId === \"self-next\" && !currentStack.webFrontend.includes(\"next\")) {\n return \"Requires Next.js frontend\";\n }\n if (\n optionId === \"self-tanstack-start\" &&\n !currentStack.webFrontend.includes(\"tanstack-start\")\n ) {\n return \"Requires TanStack Start frontend\";\n }\n if (optionId === \"self-astro\" && !currentStack.webFrontend.includes(\"astro\")) {\n return \"Requires Astro frontend\";\n }\n if (optionId === \"self-nuxt\" && !currentStack.webFrontend.includes(\"nuxt\")) {\n return \"Requires Nuxt frontend\";\n }\n if (optionId === \"self-svelte\" && !currentStack.webFrontend.includes(\"svelte\")) {\n return \"Requires SvelteKit frontend\";\n }\n if (optionId === \"self-solid-start\" && !currentStack.webFrontend.includes(\"solid-start\")) {\n return \"Requires SolidStart frontend\";\n }\n if (optionId === \"convex\" && currentStack.webFrontend.includes(\"solid\")) {\n return \"In Better-Fullstack, Convex is currently not available with Solid\";\n }\n if (optionId === \"convex\" && currentStack.webFrontend.includes(\"solid-start\")) {\n return \"In Better-Fullstack, Convex is currently not available with SolidStart\";\n }\n if (optionId === \"convex\" && currentStack.webFrontend.includes(\"astro\")) {\n return \"In Better-Fullstack, Convex is currently not available with Astro\";\n }\n // Workers runtime only works with Hono backend\n if (currentStack.runtime === \"workers\" && optionId !== \"hono\" && optionId !== \"none\") {\n return \"In Better-Fullstack, Workers runtime is currently supported only with Hono\";\n }\n }\n\n // ============================================\n // RUNTIME CONSTRAINTS\n // ============================================\n if (category === \"runtime\") {\n if (optionId === \"workers\" && currentStack.backend !== \"hono\") {\n return \"In Better-Fullstack, Workers runtime currently requires the Hono backend\";\n }\n if (optionId === \"none\") {\n const allowedBackends = [\n \"convex\",\n \"none\",\n \"self-next\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n ];\n if (!allowedBackends.includes(currentStack.backend)) {\n return \"Runtime 'None' only for Convex or fullstack backends\";\n }\n }\n }\n\n // ============================================\n // DATABASE CONSTRAINTS\n // ============================================\n if (category === \"database\") {\n if (optionId === \"mongodb\" && currentStack.runtime === \"workers\") {\n return \"In Better-Fullstack, MongoDB is currently not available with Workers runtime\";\n }\n // Allow all databases when ORM is none - system will auto-select ORM\n }\n\n // ============================================\n // ORM CONSTRAINTS\n // ============================================\n if (category === \"orm\") {\n if (optionId === \"mongoose\") {\n if (currentStack.runtime === \"workers\") {\n return \"Mongoose requires MongoDB, and Better-Fullstack currently doesn't support MongoDB with Workers runtime\";\n }\n // Only block if a non-MongoDB database is EXPLICITLY selected\n if (currentStack.database !== \"none\" && currentStack.database !== \"mongodb\") {\n return \"Mongoose only works with MongoDB\";\n }\n // Allow when database is \"none\" - system will auto-select MongoDB\n }\n if (optionId === \"drizzle\" && currentStack.database === \"mongodb\") {\n return \"Drizzle does not support MongoDB\";\n }\n if (optionId === \"none\" && currentStack.database !== \"none\") {\n return \"Database requires an ORM\";\n }\n }\n\n // ============================================\n // DB SETUP CONSTRAINTS\n // ============================================\n if (category === \"dbSetup\" && optionId !== \"none\") {\n if (currentStack.database === \"none\") {\n return \"Select a database first\";\n }\n\n // Database-specific setups\n if (optionId === \"turso\" && currentStack.database !== \"sqlite\") {\n return \"Turso requires SQLite\";\n }\n if (optionId === \"d1\") {\n if (currentStack.database !== \"sqlite\") return \"D1 requires SQLite\";\n if (currentStack.runtime !== \"workers\") return \"D1 requires Workers runtime\";\n }\n if (optionId === \"neon\" && currentStack.database !== \"postgres\") {\n return \"Neon requires PostgreSQL\";\n }\n if (optionId === \"supabase\" && currentStack.database !== \"postgres\") {\n return \"Supabase requires PostgreSQL\";\n }\n if (optionId === \"prisma-postgres\" && currentStack.database !== \"postgres\") {\n return \"Prisma Postgres requires PostgreSQL\";\n }\n if (optionId === \"mongodb-atlas\" && currentStack.database !== \"mongodb\") {\n return \"MongoDB Atlas requires MongoDB\";\n }\n if (\n optionId === \"planetscale\" &&\n currentStack.database !== \"postgres\" &&\n currentStack.database !== \"mysql\"\n ) {\n return \"PlanetScale requires PostgreSQL or MySQL\";\n }\n if (optionId === \"docker\") {\n if (currentStack.database === \"sqlite\") return \"SQLite doesn't need Docker\";\n if (currentStack.runtime === \"workers\") return \"Docker is incompatible with Workers\";\n }\n }\n\n // ============================================\n // API CONSTRAINTS\n // ============================================\n if (category === \"api\" && optionId === \"trpc\") {\n const needsOrpc = currentStack.webFrontend.some((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"solid-start\"].includes(f),\n );\n if (needsOrpc) {\n const frontendName = currentStack.webFrontend.find((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"solid-start\"].includes(f),\n );\n return `${frontendName} requires oRPC, not tRPC`;\n }\n // Astro with non-React integration requires oRPC\n if (\n currentStack.webFrontend.includes(\"astro\") &&\n currentStack.astroIntegration !== \"react\" &&\n currentStack.astroIntegration !== \"none\"\n ) {\n return `Astro with ${currentStack.astroIntegration} integration requires oRPC, not tRPC`;\n }\n }\n\n // ============================================\n // ASTRO INTEGRATION CONSTRAINTS\n // ============================================\n if (category === \"astroIntegration\") {\n if (!currentStack.webFrontend.includes(\"astro\") && optionId !== \"none\") {\n return \"Astro integration requires Astro frontend\";\n }\n // tRPC requires React integration\n if (currentStack.api === \"trpc\" && optionId !== \"react\" && optionId !== \"none\") {\n return \"tRPC requires React integration with Astro\";\n }\n }\n\n // ============================================\n // AUTH CONSTRAINTS\n // ============================================\n if (category === \"auth\") {\n return getCapabilityDisabledReason(\n \"auth\",\n {\n ecosystem: currentStack.ecosystem,\n backend: currentStack.backend,\n webFrontend: currentStack.webFrontend,\n nativeFrontend: currentStack.nativeFrontend,\n },\n optionId as Auth,\n );\n }\n\n // ============================================\n // PAYMENTS CONSTRAINTS\n // ============================================\n if (category === \"payments\" && optionId === \"polar\") {\n if (currentStack.auth !== \"better-auth\") {\n return \"Polar requires Better Auth\";\n }\n if (!currentStack.webFrontend.some((f) => f !== \"none\")) {\n return \"Polar requires a web frontend\";\n }\n }\n\n if (\n category === \"payments\" &&\n optionId !== \"none\" &&\n currentStack.webFrontend.includes(\"react-vite\") &&\n optionId === \"dodo\"\n ) {\n return \"Dodo Payments are not yet supported for React + Vite projects\";\n }\n\n // ============================================\n // EMAIL CONSTRAINTS\n // ============================================\n if (category === \"email\" && optionId !== \"none\") {\n if (currentStack.backend === \"convex\") {\n return \"Email integration is not available with Convex backend\";\n }\n if (currentStack.backend === \"none\") {\n return \"Email integration requires a backend\";\n }\n }\n\n // ============================================\n // AI CONSTRAINTS\n // ============================================\n if (category === \"ai\" && requiresChatSdkVercelAI(currentStack) && optionId !== \"vercel-ai\") {\n return \"Chat SDK example (Nuxt/Hono profile) requires Vercel AI SDK in v1\";\n }\n\n // TanStack AI: React and Solid only (client adapter). Server-side core works anywhere.\n if (category === \"ai\" && optionId === \"tanstack-ai\") {\n const compatibleFrontends = [\n \"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"redwood\",\n \"solid\", \"solid-start\",\n ];\n const hasCompatible = currentStack.webFrontend.some((f) => compatibleFrontends.includes(f));\n\n if (!hasCompatible) {\n return \"TanStack AI requires React or Solid frontend (no Vue/Svelte/Angular adapter yet)\";\n }\n }\n\n // ============================================\n // APP PLATFORMS CONSTRAINTS\n // ============================================\n if (category === \"appPlatforms\") {\n if (optionId === \"pwa\" && !hasPWACompatibleFrontend(currentStack.webFrontend)) {\n return \"PWA requires TanStack Router, React Router, Solid, Next.js, or Astro\";\n }\n if (optionId === \"tauri\" && !hasTauriCompatibleFrontend(currentStack.webFrontend)) {\n return \"Tauri requires TanStack Router, React Router, Nuxt, Svelte, Solid, Next.js, or Astro\";\n }\n if (optionId === \"tanstack-query\" && currentStack.api !== \"none\") {\n return \"TanStack Query is already included via your API layer\";\n }\n // TanStack addons with Astro require a UI framework integration\n const tanstackAddons = [\"tanstack-query\", \"tanstack-table\", \"tanstack-virtual\", \"tanstack-db\", \"tanstack-pacer\"];\n if (\n tanstackAddons.includes(optionId) &&\n currentStack.webFrontend.length === 1 &&\n currentStack.webFrontend[0] === \"astro\" &&\n (!currentStack.astroIntegration || currentStack.astroIntegration === \"none\")\n ) {\n return \"TanStack libraries with Astro require a UI framework integration (React, Vue, Svelte, or Solid)\";\n }\n }\n\n // ============================================\n // EXAMPLES CONSTRAINTS\n // ============================================\n if (category === \"examples\") {\n if (optionId === \"ai\") {\n if (\n currentStack.webFrontend.includes(\"solid\") ||\n currentStack.webFrontend.includes(\"solid-start\")\n ) {\n return \"AI example not compatible with Solid frontend\";\n }\n if (currentStack.backend === \"convex\") {\n const hasIncompatibleFrontend = currentStack.webFrontend.some((f) =>\n [\"svelte\", \"nuxt\"].includes(f),\n );\n if (hasIncompatibleFrontend) {\n const frontendName = currentStack.webFrontend.find((f) => [\"svelte\", \"nuxt\"].includes(f));\n return `Convex AI example only supports React-based frontends including React + Vite (not ${frontendName})`;\n }\n }\n }\n\n if (optionId === \"chat-sdk\") {\n if (currentStack.webFrontend.includes(\"react-vite\")) {\n return \"Chat SDK example is not yet supported for React + Vite projects\";\n }\n if (currentStack.ecosystem !== \"typescript\") {\n return \"Chat SDK example is currently available only for TypeScript stacks\";\n }\n if (currentStack.backend === \"convex\") {\n return \"Chat SDK example is not supported with Convex backend in v1\";\n }\n if (\n currentStack.backend === \"self-astro\" ||\n currentStack.backend === \"self-svelte\" ||\n currentStack.backend === \"self-solid-start\"\n ) {\n return \"Chat SDK self backend profile supports Next.js, TanStack Start, or Nuxt in v1\";\n }\n if (currentStack.backend === \"self-next\" || currentStack.backend === \"self-tanstack-start\") {\n return null;\n }\n if (currentStack.backend === \"self-nuxt\") {\n return null;\n }\n if (currentStack.backend === \"hono\") {\n if (currentStack.runtime !== \"node\") {\n return \"Chat SDK Hono profile requires Node runtime in v1\";\n }\n return null;\n }\n if (currentStack.backend.startsWith(\"self-\")) {\n return \"Chat SDK self backend profile supports Next.js, TanStack Start, or Nuxt in v1\";\n }\n if (currentStack.backend !== \"none\") {\n return \"Chat SDK example is only supported for self (Next/TanStack Start/Nuxt) or Hono+Node in v1\";\n }\n }\n }\n\n // ============================================\n // FRESH FRONTEND CONSTRAINTS\n // Fresh is Preact-based and incompatible with React-specific packages\n // ============================================\n const isFresh = currentStack.webFrontend.includes(\"fresh\");\n\n // Forms: TanStack Form has no Preact adapter\n if (category === \"forms\" && optionId === \"tanstack-form\" && isFresh) {\n return \"TanStack Form has no Preact adapter (Fresh uses Preact)\";\n }\n\n // State Management: These all require React bindings\n if (category === \"stateManagement\" && isFresh) {\n if (optionId === \"nanostores\") {\n return \"Nanostores requires @nanostores/react (no Preact support)\";\n }\n if (optionId === \"xstate\") {\n return \"XState requires @xstate/react (no Preact support)\";\n }\n if (optionId === \"tanstack-store\") {\n return \"TanStack Store requires @tanstack/react-store (no Preact support)\";\n }\n }\n\n // Animation: Lottie uses lottie-react which requires React\n if (category === \"animation\" && optionId === \"lottie\" && isFresh) {\n return \"Lottie uses lottie-react which requires React (not Preact)\";\n }\n\n // ============================================\n // CSS FRAMEWORK CONSTRAINTS\n // ============================================\n if (category === \"cssFramework\") {\n // CSS frameworks only apply to web frontends\n if (!currentStack.webFrontend.some((f) => f !== \"none\")) {\n if (optionId !== \"none\") {\n return \"CSS framework requires a web frontend\";\n }\n }\n // Some UI libraries require Tailwind\n const requiresTailwind = [\"shadcn-ui\", \"daisyui\", \"nextui\"].includes(currentStack.uiLibrary);\n if (requiresTailwind && optionId !== \"tailwind\") {\n return `${currentStack.uiLibrary === \"shadcn-ui\" ? \"shadcn/ui\" : currentStack.uiLibrary === \"daisyui\" ? \"daisyUI\" : \"NextUI\"} requires Tailwind CSS`;\n }\n }\n\n // ============================================\n // UI LIBRARY CONSTRAINTS\n // ============================================\n if (category === \"uiLibrary\") {\n // UI libraries only apply to web frontends\n if (!currentStack.webFrontend.some((f) => f !== \"none\")) {\n if (optionId !== \"none\") {\n return \"UI library requires a web frontend\";\n }\n }\n\n // React-only UI libraries\n const reactOnlyLibraries = [\"shadcn-ui\", \"radix-ui\", \"chakra-ui\", \"nextui\"];\n const reactFrontends = [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\"];\n\n if (reactOnlyLibraries.includes(optionId)) {\n const hasReactFrontend = currentStack.webFrontend.some((f) => reactFrontends.includes(f));\n // Astro with React integration also works\n const hasAstroReact =\n currentStack.webFrontend.includes(\"astro\") && currentStack.astroIntegration === \"react\";\n if (!hasReactFrontend && !hasAstroReact) {\n const libraryName =\n optionId === \"shadcn-ui\"\n ? \"shadcn/ui\"\n : optionId === \"radix-ui\"\n ? \"Radix UI\"\n : optionId === \"chakra-ui\"\n ? \"Chakra UI\"\n : \"NextUI\";\n return `${libraryName} requires a React-based frontend`;\n }\n }\n\n // Headless UI works with React and Vue\n if (optionId === \"headless-ui\") {\n const hasReactFrontend = currentStack.webFrontend.some((f) => reactFrontends.includes(f));\n const hasVueFrontend = currentStack.webFrontend.includes(\"nuxt\");\n const hasAstroReactOrVue =\n currentStack.webFrontend.includes(\"astro\") &&\n [\"react\", \"vue\"].includes(currentStack.astroIntegration);\n if (!hasReactFrontend && !hasVueFrontend && !hasAstroReactOrVue) {\n return \"Headless UI requires React or Vue frontend\";\n }\n }\n\n // Park UI works with React, Vue, and Solid\n if (optionId === \"park-ui\") {\n const hasReactFrontend = currentStack.webFrontend.some((f) => reactFrontends.includes(f));\n const hasVueFrontend = currentStack.webFrontend.includes(\"nuxt\");\n const hasSolidFrontend =\n currentStack.webFrontend.includes(\"solid\") ||\n currentStack.webFrontend.includes(\"solid-start\");\n const hasAstroCompatible =\n currentStack.webFrontend.includes(\"astro\") &&\n [\"react\", \"vue\", \"solid\"].includes(currentStack.astroIntegration);\n if (!hasReactFrontend && !hasVueFrontend && !hasSolidFrontend && !hasAstroCompatible) {\n return \"Park UI requires React, Vue, or Solid frontend\";\n }\n // Park UI requires a CSS framework (not \"none\")\n if (currentStack.cssFramework === \"none\") {\n return \"Park UI requires a CSS framework\";\n }\n }\n\n // UI libraries requiring Tailwind\n if ([\"shadcn-ui\", \"daisyui\", \"nextui\"].includes(optionId)) {\n if (currentStack.cssFramework !== \"tailwind\") {\n const libraryName =\n optionId === \"shadcn-ui\" ? \"shadcn/ui\" : optionId === \"daisyui\" ? \"daisyUI\" : \"NextUI\";\n return `${libraryName} requires Tailwind CSS`;\n }\n }\n }\n\n // ============================================\n // DEPLOYMENT CONSTRAINTS\n // ============================================\n if (category === \"webDeploy\" && optionId !== \"none\") {\n if (!currentStack.webFrontend.some((f) => f !== \"none\")) {\n return \"Web deployment requires a web frontend\";\n }\n }\n\n if (category === \"serverDeploy\") {\n if (optionId === \"cloudflare\") {\n if (currentStack.runtime !== \"workers\") {\n return \"In Better-Fullstack, Cloudflare server deploy currently requires Workers runtime\";\n }\n if (currentStack.backend !== \"hono\") {\n return \"In Better-Fullstack, Cloudflare server deploy is currently supported only with Hono\";\n }\n }\n if (optionId !== \"none\") {\n const noServerDeploy = [\n \"none\",\n \"convex\",\n \"self-next\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n ];\n if (noServerDeploy.includes(currentStack.backend)) {\n return \"Server deployment not needed for this backend\";\n }\n }\n if (optionId === \"none\" && currentStack.runtime === \"workers\") {\n return \"Workers requires server deployment\";\n }\n }\n\n return null;\n};\n\nexport const isOptionCompatible = (\n currentStack: CompatibilityInput,\n category: CompatibilityCategory,\n optionId: string,\n): boolean => {\n if (currentStack.yolo === \"true\") {\n return true;\n }\n return getDisabledReason(currentStack, category, optionId) === null;\n};\n\nconst WEB_FRAMEWORKS: readonly Frontend[] = [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n \"none\",\n] as const;\n\nconst UI_LIBRARY_COMPATIBILITY: Record<\n UILibrary,\n {\n frontends: readonly Frontend[];\n cssFrameworks: readonly CSSFramework[];\n }\n> = {\n \"shadcn-ui\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\"],\n },\n daisyui: {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n ],\n cssFrameworks: [\"tailwind\"],\n },\n \"radix-ui\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"headless-ui\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"nuxt\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"park-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\"],\n },\n \"chakra-ui\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n nextui: {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\"],\n },\n mantine: {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"base-ui\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"ark-ui\": {\n frontends: [\n \"tanstack-router\",\n \"react-router\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n ],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n \"react-aria\": {\n frontends: [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"],\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n none: {\n frontends: WEB_FRAMEWORKS,\n cssFrameworks: [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"],\n },\n};\n\nconst ADDON_COMPATIBILITY: Record<Addons, readonly Frontend[]> = {\n pwa: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"solid\",\n \"next\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n ],\n tauri: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"next\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n ],\n biome: [],\n husky: [],\n lefthook: [],\n turborepo: [],\n starlight: [],\n ultracite: [],\n ruler: [],\n mcp: [],\n skills: [],\n oxlint: [],\n fumadocs: [],\n opentui: [],\n wxt: [],\n msw: [],\n storybook: [\"tanstack-router\", \"react-router\", \"react-vite\", \"next\", \"nuxt\", \"svelte\", \"solid\"],\n \"tanstack-query\": [\n \"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\",\n \"nuxt\", \"svelte\", \"solid\", \"solid-start\", \"angular\", \"astro\", \"redwood\",\n ],\n \"tanstack-table\": [\n \"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\",\n \"nuxt\", \"svelte\", \"solid\", \"solid-start\", \"angular\", \"astro\", \"redwood\",\n ],\n \"tanstack-virtual\": [\n \"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\",\n \"nuxt\", \"svelte\", \"solid\", \"solid-start\", \"angular\", \"astro\", \"redwood\",\n ],\n \"tanstack-db\": [\n \"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\",\n \"nuxt\", \"svelte\", \"solid\", \"solid-start\", \"astro\", \"redwood\",\n ],\n \"tanstack-pacer\": [\n \"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\",\n \"nuxt\", \"svelte\", \"solid\", \"solid-start\", \"angular\", \"astro\", \"redwood\",\n ],\n none: [],\n};\n\nexport function isWebFrontend(value: Frontend) {\n return WEB_FRAMEWORKS.includes(value);\n}\n\nexport function splitFrontends(values: Frontend[] = []): {\n web: Frontend[];\n native: Frontend[];\n} {\n const web = values.filter((f) => isWebFrontend(f));\n const native = values.filter(\n (f) => f === \"native-bare\" || f === \"native-uniwind\" || f === \"native-unistyles\",\n );\n return { web, native };\n}\n\nexport function allowedApisForFrontends(\n frontends: Frontend[] = [],\n astroIntegration?: AstroIntegration,\n) {\n const includesNuxt = frontends.includes(\"nuxt\");\n const includesSvelte = frontends.includes(\"svelte\");\n const includesSolid = frontends.includes(\"solid\");\n const includesAstro = frontends.includes(\"astro\");\n const includesQwik = frontends.includes(\"qwik\");\n const includesAngular = frontends.includes(\"angular\");\n const includesRedwood = frontends.includes(\"redwood\");\n const includesFresh = frontends.includes(\"fresh\");\n const base: API[] = [\"trpc\", \"orpc\", \"ts-rest\", \"garph\", \"none\"];\n\n if (includesQwik || includesAngular || includesRedwood || includesFresh) {\n return [\"none\"] as API[];\n }\n\n const includesSolidStartApi = frontends.includes(\"solid-start\");\n if (includesNuxt || includesSvelte || includesSolid || includesSolidStartApi) {\n return [\"orpc\", \"none\"] as API[];\n }\n\n if (includesAstro && astroIntegration && astroIntegration !== \"react\") {\n return [\"orpc\", \"none\"] as API[];\n }\n\n return base;\n}\n\nexport function isFrontendAllowedWithBackend(frontend: Frontend, backend?: Backend, auth?: string) {\n if (backend === \"convex\" && frontend === \"solid\") return false;\n if (backend === \"convex\" && frontend === \"solid-start\") return false;\n if (backend === \"convex\" && frontend === \"astro\") return false;\n if (backend === \"convex\" && frontend === \"qwik\") return false;\n if (backend === \"convex\" && frontend === \"angular\") return false;\n if (backend === \"convex\" && frontend === \"redwood\") return false;\n if (backend === \"convex\" && frontend === \"fresh\") return false;\n\n if (frontend === \"qwik\" && backend && backend !== \"none\") return false;\n if (frontend === \"angular\" && backend && backend !== \"none\") return false;\n if (frontend === \"redwood\" && backend && backend !== \"none\") return false;\n if (frontend === \"fresh\" && backend && backend !== \"none\") return false;\n\n if (auth && auth !== \"none\") {\n return (\n getCapabilityDisabledReason(\n \"auth\",\n {\n ecosystem: \"typescript\",\n backend,\n frontend: [frontend],\n },\n auth as Auth,\n ) === null\n );\n }\n\n return true;\n}\n\nexport function isExampleAIAllowed(backend?: Backend, frontends: Frontend[] = []) {\n const includesSolid = frontends.includes(\"solid\");\n const includesSolidStart = frontends.includes(\"solid-start\");\n if (includesSolid || includesSolidStart) return false;\n\n if (backend === \"convex\") {\n const includesNuxt = frontends.includes(\"nuxt\");\n const includesSvelte = frontends.includes(\"svelte\");\n if (includesNuxt || includesSvelte) return false;\n }\n\n return true;\n}\n\nfunction hasExampleChatSdkSelfFrontend(frontends: Frontend[] = []) {\n return frontends.some((f) => [\"next\", \"tanstack-start\", \"nuxt\"].includes(f));\n}\n\nexport function isExampleChatSdkAllowed(\n backend?: Backend | string,\n frontends: Frontend[] = [],\n runtime?: Runtime | string,\n) {\n if (frontends.includes(\"react-vite\")) return false;\n if (!backend || backend === \"none\" || backend === \"convex\") return false;\n\n if (backend === \"self\") {\n return hasExampleChatSdkSelfFrontend(frontends);\n }\n\n if (backend === \"self-next\" || backend === \"self-tanstack-start\" || backend === \"self-nuxt\") {\n return true;\n }\n\n if (backend === \"self-astro\" || backend === \"self-svelte\" || backend === \"self-solid-start\") {\n return false;\n }\n\n if (backend === \"hono\") {\n return runtime === \"node\";\n }\n\n return false;\n}\n\nexport function requiresChatSdkVercelAIForSelection(\n backend?: Backend | string,\n frontends: Frontend[] = [],\n runtime?: Runtime | string,\n) {\n if (backend === \"self\" && frontends.includes(\"nuxt\")) return true;\n if (backend === \"self-nuxt\") return true;\n if (backend === \"hono\" && runtime === \"node\") return true;\n return false;\n}\n\nexport function validateAddonCompatibility(\n addon: Addons,\n frontend: Frontend[],\n _auth?: Auth,\n): { isCompatible: boolean; reason?: string } {\n const compatibleFrontends = ADDON_COMPATIBILITY[addon];\n\n if (compatibleFrontends.length > 0) {\n const hasCompatibleFrontend = frontend.some((f) =>\n (compatibleFrontends as readonly string[]).includes(f),\n );\n\n if (!hasCompatibleFrontend) {\n const frontendList = compatibleFrontends.join(\", \");\n return {\n isCompatible: false,\n reason: `${addon} addon requires one of these frontends: ${frontendList}`,\n };\n }\n }\n\n return { isCompatible: true };\n}\n\nexport function getCompatibleAddons(\n allAddons: Addons[],\n frontend: Frontend[],\n existingAddons: Addons[] = [],\n auth?: Auth,\n) {\n return allAddons.filter((addon) => {\n if (existingAddons.includes(addon)) return false;\n if (addon === \"none\") return false;\n const { isCompatible } = validateAddonCompatibility(addon, frontend, auth);\n return isCompatible;\n });\n}\n\nexport function getCompatibleUILibraries(\n frontends: Frontend[] = [],\n astroIntegration?: AstroIntegration,\n): UILibrary[] {\n const { web } = splitFrontends(frontends);\n if (web.length === 0) return [\"none\"];\n\n const webFrontend = web[0];\n const allUILibraries = Object.keys(UI_LIBRARY_COMPATIBILITY) as UILibrary[];\n\n return allUILibraries.filter((lib) => {\n if (lib === \"none\") return true;\n\n const compatibility = UI_LIBRARY_COMPATIBILITY[lib];\n if (webFrontend === \"astro\") {\n if (astroIntegration === \"react\") {\n return compatibility.frontends.some((f) =>\n [\"tanstack-router\", \"react-router\", \"react-vite\", \"tanstack-start\", \"next\", \"astro\"].includes(f),\n );\n }\n return compatibility.frontends.some((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"qwik\", \"angular\"].includes(f),\n );\n }\n\n return compatibility.frontends.includes(webFrontend);\n });\n}\n\nexport function getCompatibleCSSFrameworks(uiLibrary: UILibrary | undefined): CSSFramework[] {\n if (!uiLibrary || uiLibrary === \"none\") {\n return [\"tailwind\", \"scss\", \"less\", \"postcss-only\", \"none\"];\n }\n\n const compatibility = UI_LIBRARY_COMPATIBILITY[uiLibrary];\n return compatibility.cssFrameworks as CSSFramework[];\n}\n\nexport function hasWebStyling(frontends: Frontend[] = []): boolean {\n const { web } = splitFrontends(frontends);\n return web.length > 0;\n}\n\nexport function getCompatibleFormLibraries(frontends: Frontend[] = []): Forms[] {\n const hasSolid = frontends.includes(\"solid\");\n const hasSolidStart = frontends.includes(\"solid-start\");\n const hasQwik = frontends.includes(\"qwik\");\n const hasFresh = frontends.includes(\"fresh\");\n\n const all: Forms[] = [\n \"tanstack-form\",\n \"react-hook-form\",\n \"formik\",\n \"final-form\",\n \"conform\",\n \"modular-forms\",\n \"none\",\n ];\n\n if (hasFresh) {\n return all.filter((f) => f !== \"tanstack-form\" && f !== \"react-hook-form\" && f !== \"formik\");\n }\n\n if (hasSolid || hasSolidStart || hasQwik) {\n return all.filter((f) => f !== \"react-hook-form\" && f !== \"formik\" && f !== \"final-form\");\n }\n\n return all;\n}\n\nexport function evaluateCompatibility(input: CompatibilityInput): CompatibilityEvaluation {\n const issues: CompatibilityIssue[] = [];\n\n const scalarChecks: Array<[CompatibilityCategory, string]> = [\n [\"runtime\", input.runtime],\n [\"backend\", input.backend],\n [\"database\", input.database],\n [\"orm\", input.orm],\n [\"dbSetup\", input.dbSetup],\n [\"api\", input.api],\n [\"auth\", input.auth],\n [\"payments\", input.payments],\n [\"email\", input.email],\n [\"cssFramework\", input.cssFramework],\n [\"uiLibrary\", input.uiLibrary],\n [\"webDeploy\", input.webDeploy],\n [\"serverDeploy\", input.serverDeploy],\n [\"forms\", input.forms],\n [\"stateManagement\", input.stateManagement],\n [\"animation\", input.animation],\n [\"ai\", input.aiSdk],\n ];\n\n for (const [category, optionId] of scalarChecks) {\n const reason = getDisabledReason(input, category, optionId);\n if (reason) {\n issues.push({\n code: `INCOMPATIBLE_${category.toUpperCase()}`,\n message: reason,\n category,\n optionId,\n });\n }\n }\n\n for (const frontend of input.webFrontend) {\n const reason = getDisabledReason(input, \"webFrontend\", frontend);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_FRONTEND\",\n message: reason,\n category: \"webFrontend\",\n optionId: frontend,\n });\n }\n }\n\n for (const addon of [...input.codeQuality, ...input.documentation, ...input.appPlatforms]) {\n const reason = getDisabledReason(input, \"appPlatforms\", addon);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_ADDON\",\n message: reason,\n category: \"appPlatforms\",\n optionId: addon,\n });\n }\n }\n\n return { issues };\n}\n","import {\n AI_DOCS_VALUES,\n AI_VALUES,\n ANALYTICS_VALUES,\n ANIMATION_VALUES,\n API_VALUES,\n ASTRO_INTEGRATION_VALUES,\n AUTH_VALUES,\n CACHING_VALUES,\n CMS_VALUES,\n CSS_FRAMEWORK_VALUES,\n DATABASE_SETUP_VALUES,\n DATABASE_VALUES,\n EFFECT_VALUES,\n EMAIL_VALUES,\n FEATURE_FLAGS_VALUES,\n FILE_STORAGE_VALUES,\n FILE_UPLOAD_VALUES,\n FORMS_VALUES,\n GO_API_VALUES,\n GO_CLI_VALUES,\n GO_LOGGING_VALUES,\n GO_ORM_VALUES,\n GO_WEB_FRAMEWORK_VALUES,\n JOB_QUEUE_VALUES,\n LOGGING_VALUES,\n OBSERVABILITY_VALUES,\n ORM_VALUES,\n PACKAGE_MANAGER_VALUES,\n PAYMENTS_VALUES,\n PYTHON_AI_VALUES,\n PYTHON_ORM_VALUES,\n PYTHON_QUALITY_VALUES,\n PYTHON_TASK_QUEUE_VALUES,\n PYTHON_VALIDATION_VALUES,\n PYTHON_WEB_FRAMEWORK_VALUES,\n REALTIME_VALUES,\n RUNTIME_VALUES,\n RUST_API_VALUES,\n RUST_CLI_VALUES,\n RUST_FRONTEND_VALUES,\n RUST_LIBRARIES_VALUES,\n RUST_ORM_VALUES,\n RUST_WEB_FRAMEWORK_VALUES,\n SEARCH_VALUES,\n SHADCN_BASE_COLOR_VALUES,\n SHADCN_BASE_VALUES,\n SHADCN_COLOR_THEME_VALUES,\n SHADCN_FONT_VALUES,\n SHADCN_ICON_LIBRARY_VALUES,\n SHADCN_RADIUS_VALUES,\n SHADCN_STYLE_VALUES,\n SERVER_DEPLOY_VALUES,\n STATE_MANAGEMENT_VALUES,\n TESTING_VALUES,\n UI_LIBRARY_VALUES,\n VALIDATION_VALUES,\n WEB_DEPLOY_VALUES,\n} from \"./schemas\";\nimport { getCapabilityDefinitions } from \"./capabilities\";\n\nexport type OptionCategory =\n | \"api\"\n | \"webFrontend\"\n | \"nativeFrontend\"\n | \"astroIntegration\"\n | \"runtime\"\n | \"backend\"\n | \"database\"\n | \"orm\"\n | \"dbSetup\"\n | \"webDeploy\"\n | \"serverDeploy\"\n | \"auth\"\n | \"payments\"\n | \"email\"\n | \"fileUpload\"\n | \"logging\"\n | \"observability\"\n | \"backendLibraries\"\n | \"stateManagement\"\n | \"forms\"\n | \"validation\"\n | \"testing\"\n | \"realtime\"\n | \"jobQueue\"\n | \"caching\"\n | \"search\"\n | \"fileStorage\"\n | \"animation\"\n | \"cssFramework\"\n | \"uiLibrary\"\n | \"cms\"\n | \"featureFlags\"\n | \"analytics\"\n | \"codeQuality\"\n | \"documentation\"\n | \"appPlatforms\"\n | \"packageManager\"\n | \"examples\"\n | \"ai\"\n | \"aiDocs\"\n | \"git\"\n | \"install\"\n | \"effect\"\n | \"shadcnBase\"\n | \"shadcnStyle\"\n | \"shadcnIconLibrary\"\n | \"shadcnColorTheme\"\n | \"shadcnBaseColor\"\n | \"shadcnFont\"\n | \"shadcnRadius\"\n | \"rustWebFramework\"\n | \"rustFrontend\"\n | \"rustOrm\"\n | \"rustApi\"\n | \"rustCli\"\n | \"rustLibraries\"\n | \"pythonWebFramework\"\n | \"pythonOrm\"\n | \"pythonValidation\"\n | \"pythonAi\"\n | \"pythonTaskQueue\"\n | \"pythonQuality\"\n | \"goWebFramework\"\n | \"goOrm\"\n | \"goApi\"\n | \"goCli\"\n | \"goLogging\";\n\nexport type OptionSelectionMode = \"single\" | \"multiple\";\n\nexport type OptionMetadata = {\n id: string;\n label: string;\n aliases: readonly string[];\n cliValue: string;\n};\n\nexport type OptionCategoryMetadata = {\n selectionMode: OptionSelectionMode;\n options: readonly OptionMetadata[];\n};\n\nconst WEB_FRONTEND_VALUES = [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n \"none\",\n] as const satisfies readonly string[];\n\nconst NATIVE_FRONTEND_VALUES = [\n \"native-bare\",\n \"native-uniwind\",\n \"native-unistyles\",\n \"none\",\n] as const satisfies readonly string[];\n\nconst BACKEND_BUILDER_VALUES = [\n \"hono\",\n \"express\",\n \"fastify\",\n \"elysia\",\n \"fets\",\n \"nestjs\",\n \"adonisjs\",\n \"nitro\",\n \"encore\",\n \"convex\",\n \"self-next\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n \"none\",\n] as const satisfies readonly string[];\n\nconst CODE_QUALITY_VALUES = [\n \"biome\",\n \"oxlint\",\n \"ultracite\",\n \"lefthook\",\n \"husky\",\n \"ruler\",\n] as const satisfies readonly string[];\n\nconst DOCUMENTATION_VALUES = [\"starlight\", \"fumadocs\"] as const satisfies readonly string[];\n\nconst APP_PLATFORM_VALUES = [\n \"turborepo\",\n \"pwa\",\n \"tauri\",\n \"wxt\",\n \"opentui\",\n \"mcp\",\n \"skills\",\n \"msw\",\n \"storybook\",\n \"tanstack-query\",\n \"tanstack-table\",\n \"tanstack-virtual\",\n \"tanstack-db\",\n \"tanstack-pacer\",\n] as const satisfies readonly string[];\n\nconst EXAMPLE_VALUES = [\"ai\", \"chat-sdk\"] as const satisfies readonly string[];\nconst BOOLEAN_OPTION_VALUES = [\"true\", \"false\"] as const satisfies readonly string[];\n\nconst MULTI_SELECT_CATEGORIES = new Set<OptionCategory>([\n \"webFrontend\",\n \"nativeFrontend\",\n \"codeQuality\",\n \"documentation\",\n \"appPlatforms\",\n \"examples\",\n \"aiDocs\",\n]);\n\nconst CATEGORY_VALUE_IDS: Record<OptionCategory, readonly string[]> = {\n api: API_VALUES,\n webFrontend: WEB_FRONTEND_VALUES,\n nativeFrontend: NATIVE_FRONTEND_VALUES,\n astroIntegration: ASTRO_INTEGRATION_VALUES,\n runtime: RUNTIME_VALUES,\n backend: BACKEND_BUILDER_VALUES,\n database: DATABASE_VALUES,\n orm: ORM_VALUES,\n dbSetup: DATABASE_SETUP_VALUES,\n webDeploy: WEB_DEPLOY_VALUES,\n serverDeploy: SERVER_DEPLOY_VALUES,\n auth: AUTH_VALUES,\n payments: PAYMENTS_VALUES,\n email: EMAIL_VALUES,\n fileUpload: FILE_UPLOAD_VALUES,\n logging: LOGGING_VALUES,\n observability: OBSERVABILITY_VALUES,\n backendLibraries: EFFECT_VALUES,\n stateManagement: STATE_MANAGEMENT_VALUES,\n forms: FORMS_VALUES,\n validation: VALIDATION_VALUES,\n testing: TESTING_VALUES,\n realtime: REALTIME_VALUES,\n jobQueue: JOB_QUEUE_VALUES,\n caching: CACHING_VALUES,\n search: SEARCH_VALUES,\n fileStorage: FILE_STORAGE_VALUES,\n animation: ANIMATION_VALUES,\n cssFramework: CSS_FRAMEWORK_VALUES,\n uiLibrary: UI_LIBRARY_VALUES,\n cms: CMS_VALUES,\n featureFlags: FEATURE_FLAGS_VALUES,\n analytics: ANALYTICS_VALUES,\n codeQuality: CODE_QUALITY_VALUES,\n documentation: DOCUMENTATION_VALUES,\n appPlatforms: APP_PLATFORM_VALUES,\n packageManager: PACKAGE_MANAGER_VALUES,\n examples: EXAMPLE_VALUES,\n ai: AI_VALUES,\n aiDocs: AI_DOCS_VALUES,\n git: BOOLEAN_OPTION_VALUES,\n install: BOOLEAN_OPTION_VALUES,\n effect: EFFECT_VALUES,\n shadcnBase: SHADCN_BASE_VALUES,\n shadcnStyle: SHADCN_STYLE_VALUES,\n shadcnIconLibrary: SHADCN_ICON_LIBRARY_VALUES,\n shadcnColorTheme: SHADCN_COLOR_THEME_VALUES,\n shadcnBaseColor: SHADCN_BASE_COLOR_VALUES,\n shadcnFont: SHADCN_FONT_VALUES,\n shadcnRadius: SHADCN_RADIUS_VALUES,\n rustWebFramework: RUST_WEB_FRAMEWORK_VALUES,\n rustFrontend: RUST_FRONTEND_VALUES,\n rustOrm: RUST_ORM_VALUES,\n rustApi: RUST_API_VALUES,\n rustCli: RUST_CLI_VALUES,\n rustLibraries: RUST_LIBRARIES_VALUES,\n pythonWebFramework: PYTHON_WEB_FRAMEWORK_VALUES,\n pythonOrm: PYTHON_ORM_VALUES,\n pythonValidation: PYTHON_VALIDATION_VALUES,\n pythonAi: PYTHON_AI_VALUES,\n pythonTaskQueue: PYTHON_TASK_QUEUE_VALUES,\n pythonQuality: PYTHON_QUALITY_VALUES,\n goWebFramework: GO_WEB_FRAMEWORK_VALUES,\n goOrm: GO_ORM_VALUES,\n goApi: GO_API_VALUES,\n goCli: GO_CLI_VALUES,\n goLogging: GO_LOGGING_VALUES,\n};\n\nconst EXACT_LABEL_OVERRIDES: Partial<Record<OptionCategory, Partial<Record<string, string>>>> = {\n api: { trpc: \"tRPC\", orpc: \"oRPC\" },\n webFrontend: {\n next: \"Next.js\",\n \"react-vite\": \"React + Vite\",\n svelte: \"SvelteKit\",\n redwood: \"RedwoodJS\",\n },\n nativeFrontend: {\n \"native-bare\": \"Expo + Bare\",\n \"native-uniwind\": \"Expo + Uniwind\",\n \"native-unistyles\": \"Expo + Unistyles\",\n },\n runtime: { node: \"Node.js\", workers: \"Cloudflare Workers\" },\n backend: {\n fets: \"feTS\",\n nestjs: \"NestJS\",\n encore: \"Encore.ts\",\n \"self-next\": \"Fullstack Next.js\",\n \"self-tanstack-start\": \"Fullstack TanStack Start\",\n \"self-astro\": \"Fullstack Astro\",\n \"self-nuxt\": \"Fullstack Nuxt\",\n \"self-svelte\": \"Fullstack SvelteKit\",\n \"self-solid-start\": \"Fullstack SolidStart\",\n },\n database: { sqlite: \"SQLite\", postgres: \"PostgreSQL\", mongodb: \"MongoDB\", edgedb: \"EdgeDB\" },\n orm: {\n typeorm: \"TypeORM\",\n mikroorm: \"MikroORM\",\n },\n dbSetup: {\n d1: \"Cloudflare D1\",\n neon: \"Neon Postgres\",\n \"prisma-postgres\": \"Prisma PostgreSQL\",\n \"mongodb-atlas\": \"MongoDB Atlas\",\n planetscale: \"PlanetScale\",\n },\n webDeploy: { cloudflare: \"Cloudflare\", fly: \"Fly.io\", sst: \"SST\" },\n serverDeploy: { cloudflare: \"Cloudflare\", fly: \"Fly.io\", sst: \"SST\" },\n auth: {},\n payments: {\n \"lemon-squeezy\": \"Lemon Squeezy\",\n dodo: \"Dodo Payments\",\n },\n email: {\n \"react-email\": \"React Email\",\n sendgrid: \"SendGrid\",\n \"aws-ses\": \"AWS SES\",\n },\n fileUpload: {\n uploadthing: \"UploadThing\",\n filepond: \"FilePond\",\n uppy: \"Uppy\",\n },\n observability: {\n opentelemetry: \"OpenTelemetry\",\n },\n backendLibraries: {\n effect: \"Effect (Core)\",\n \"effect-full\": \"Effect Full\",\n },\n stateManagement: {\n \"redux-toolkit\": \"Redux Toolkit\",\n xstate: \"XState\",\n },\n forms: {\n \"react-hook-form\": \"React Hook Form\",\n \"tanstack-form\": \"TanStack Form\",\n \"final-form\": \"Final Form\",\n \"modular-forms\": \"Modular Forms\",\n },\n validation: {\n zod: \"Zod\",\n arktype: \"ArkType\",\n typebox: \"TypeBox\",\n \"effect-schema\": \"@effect/schema\",\n },\n testing: {\n \"vitest-playwright\": \"Vitest + Playwright\",\n },\n realtime: {\n \"socket-io\": \"Socket.IO\",\n yjs: \"Y.js\",\n },\n jobQueue: {\n bullmq: \"BullMQ\",\n \"trigger-dev\": \"Trigger.dev\",\n },\n cssFramework: { tailwind: \"Tailwind CSS\", scss: \"SCSS\", \"postcss-only\": \"PostCSS Only\" },\n uiLibrary: {\n \"shadcn-ui\": \"shadcn/ui\",\n daisyui: \"daisyUI\",\n \"radix-ui\": \"Radix UI\",\n \"headless-ui\": \"Headless UI\",\n \"park-ui\": \"Park UI\",\n \"chakra-ui\": \"Chakra UI\",\n nextui: \"NextUI\",\n \"base-ui\": \"Base UI\",\n \"ark-ui\": \"Ark UI\",\n \"react-aria\": \"React Aria\",\n },\n featureFlags: {\n growthbook: \"GrowthBook\",\n posthog: \"PostHog\",\n },\n analytics: {\n plausible: \"Plausible\",\n umami: \"Umami\",\n },\n codeQuality: {\n biome: \"Biome\",\n oxlint: \"Oxlint\",\n ultracite: \"Ultracite\",\n lefthook: \"Lefthook\",\n husky: \"Husky\",\n ruler: \"Ruler\",\n },\n documentation: {\n starlight: \"Starlight\",\n fumadocs: \"Fumadocs\",\n },\n appPlatforms: {\n pwa: \"PWA\",\n wxt: \"WXT\",\n opentui: \"OpenTUI\",\n mcp: \"MCP\",\n msw: \"MSW\",\n \"tanstack-query\": \"TanStack Query\",\n \"tanstack-table\": \"TanStack Table\",\n \"tanstack-virtual\": \"TanStack Virtual\",\n \"tanstack-db\": \"TanStack DB\",\n \"tanstack-pacer\": \"TanStack Pacer\",\n },\n examples: {\n ai: \"AI Example\",\n \"chat-sdk\": \"Chat SDK Bots\",\n },\n ai: {\n \"vercel-ai\": \"Vercel AI SDK\",\n voltagent: \"VoltAgent\",\n langgraph: \"LangGraph.js\",\n \"openai-agents\": \"OpenAI Agents SDK\",\n \"google-adk\": \"Google ADK\",\n modelfusion: \"ModelFusion\",\n langchain: \"LangChain\",\n llamaindex: \"LlamaIndex\",\n \"tanstack-ai\": \"TanStack AI\",\n },\n aiDocs: {\n \"claude-md\": \"CLAUDE.md\",\n \"agents-md\": \"Agents.md\",\n cursorrules: \".cursorrules\",\n },\n git: { true: \"Git\", false: \"No Git\" },\n install: { true: \"Install Dependencies\", false: \"Skip Install\" },\n effect: {\n effect: \"Effect (Core)\",\n \"effect-full\": \"Effect Full\",\n },\n shadcnBase: {\n radix: \"Radix UI\",\n base: \"Base UI\",\n },\n shadcnStyle: {\n vega: \"Vega\",\n nova: \"Nova\",\n maia: \"Maia\",\n lyra: \"Lyra\",\n mira: \"Mira\",\n },\n shadcnIconLibrary: {\n lucide: \"Lucide\",\n tabler: \"Tabler Icons\",\n hugeicons: \"HugeIcons\",\n phosphor: \"Phosphor Icons\",\n remixicon: \"Remix Icon\",\n },\n shadcnColorTheme: {\n neutral: \"Neutral\",\n },\n shadcnBaseColor: {\n neutral: \"Neutral\",\n },\n shadcnFont: {\n inter: \"Inter\",\n geist: \"Geist\",\n figtree: \"Figtree\",\n \"noto-sans\": \"Noto Sans\",\n \"nunito-sans\": \"Nunito Sans\",\n roboto: \"Roboto\",\n raleway: \"Raleway\",\n \"dm-sans\": \"DM Sans\",\n \"public-sans\": \"Public Sans\",\n outfit: \"Outfit\",\n \"jetbrains-mono\": \"JetBrains Mono\",\n \"geist-mono\": \"Geist Mono\",\n },\n shadcnRadius: {\n default: \"Default\",\n },\n rustWebFramework: {\n axum: \"Axum\",\n \"actix-web\": \"Actix-web\",\n },\n rustFrontend: {\n leptos: \"Leptos\",\n dioxus: \"Dioxus\",\n },\n rustOrm: {\n \"sea-orm\": \"SeaORM\",\n sqlx: \"SQLx\",\n },\n rustApi: {\n \"async-graphql\": \"async-graphql\",\n tonic: \"Tonic\",\n },\n rustCli: {\n clap: \"Clap\",\n ratatui: \"Ratatui\",\n },\n rustLibraries: {\n serde: \"Serde\",\n validator: \"Validator\",\n jsonwebtoken: \"jsonwebtoken\",\n argon2: \"Argon2\",\n \"tokio-test\": \"Tokio Test\",\n mockall: \"Mockall\",\n },\n pythonWebFramework: {\n fastapi: \"FastAPI\",\n django: \"Django\",\n },\n pythonOrm: {\n sqlalchemy: \"SQLAlchemy\",\n sqlmodel: \"SQLModel\",\n },\n pythonValidation: {\n pydantic: \"Pydantic\",\n },\n pythonAi: {\n langchain: \"LangChain\",\n llamaindex: \"LlamaIndex\",\n \"openai-sdk\": \"OpenAI SDK\",\n \"anthropic-sdk\": \"Anthropic SDK\",\n langgraph: \"LangGraph\",\n crewai: \"CrewAI\",\n },\n pythonTaskQueue: {\n celery: \"Celery\",\n },\n pythonQuality: {\n ruff: \"Ruff\",\n },\n goWebFramework: {\n gin: \"Gin\",\n echo: \"Echo\",\n },\n goOrm: {\n gorm: \"GORM\",\n sqlc: \"sqlc\",\n },\n goApi: {\n \"grpc-go\": \"gRPC-Go\",\n },\n goCli: {\n cobra: \"Cobra\",\n bubbletea: \"Bubble Tea\",\n },\n goLogging: {\n zap: \"Zap\",\n },\n};\n\nconst OPTION_ALIASES: Partial<Record<OptionCategory, Partial<Record<string, readonly string[]>>>> = {\n webFrontend: {\n svelte: [\"sveltekit\"],\n },\n backend: {\n \"self-svelte\": [\"self-sveltekit\"],\n },\n};\n\nconst CLI_VALUE_OVERRIDES: Partial<Record<OptionCategory, Partial<Record<string, string>>>> = {\n backend: {\n \"self-next\": \"self\",\n \"self-tanstack-start\": \"self\",\n \"self-astro\": \"self\",\n \"self-nuxt\": \"self\",\n \"self-svelte\": \"self\",\n \"self-solid-start\": \"self\",\n },\n};\n\nconst TOKEN_LABELS: Record<string, string> = {\n ai: \"AI\",\n api: \"API\",\n auth: \"Auth\",\n css: \"CSS\",\n db: \"DB\",\n graphql: \"GraphQL\",\n grpc: \"gRPC\",\n js: \"JS\",\n md: \"MD\",\n orm: \"ORM\",\n sdk: \"SDK\",\n ses: \"SES\",\n sql: \"SQL\",\n ui: \"UI\",\n};\n\nfunction toStartCaseToken(token: string): string {\n const lower = token.toLowerCase();\n if (TOKEN_LABELS[lower]) return TOKEN_LABELS[lower];\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n}\n\nfunction humanizeOptionId(id: string): string {\n return id\n .split(\"-\")\n .filter(Boolean)\n .map(toStartCaseToken)\n .join(\" \");\n}\n\nfunction getOptionLabel(category: OptionCategory, id: string): string {\n if (category === \"auth\") {\n return getCapabilityDefinitions(\"auth\").find((option) => option.id === id)?.label ?? humanizeOptionId(id);\n }\n return EXACT_LABEL_OVERRIDES[category]?.[id] ?? humanizeOptionId(id);\n}\n\nfunction getOptionAliases(category: OptionCategory, id: string): readonly string[] {\n return OPTION_ALIASES[category]?.[id] ?? [];\n}\n\nfunction getCliValue(category: OptionCategory, id: string): string {\n return CLI_VALUE_OVERRIDES[category]?.[id] ?? id;\n}\n\nfunction buildCategoryMetadata(category: OptionCategory): OptionCategoryMetadata {\n return {\n selectionMode: MULTI_SELECT_CATEGORIES.has(category) ? \"multiple\" : \"single\",\n options: CATEGORY_VALUE_IDS[category].map((id) => ({\n id,\n label: getOptionLabel(category, id),\n aliases: getOptionAliases(category, id),\n cliValue: getCliValue(category, id),\n })),\n };\n}\n\nexport const OPTION_CATEGORY_METADATA: Record<OptionCategory, OptionCategoryMetadata> = {\n api: buildCategoryMetadata(\"api\"),\n webFrontend: buildCategoryMetadata(\"webFrontend\"),\n nativeFrontend: buildCategoryMetadata(\"nativeFrontend\"),\n astroIntegration: buildCategoryMetadata(\"astroIntegration\"),\n runtime: buildCategoryMetadata(\"runtime\"),\n backend: buildCategoryMetadata(\"backend\"),\n database: buildCategoryMetadata(\"database\"),\n orm: buildCategoryMetadata(\"orm\"),\n dbSetup: buildCategoryMetadata(\"dbSetup\"),\n webDeploy: buildCategoryMetadata(\"webDeploy\"),\n serverDeploy: buildCategoryMetadata(\"serverDeploy\"),\n auth: buildCategoryMetadata(\"auth\"),\n payments: buildCategoryMetadata(\"payments\"),\n email: buildCategoryMetadata(\"email\"),\n fileUpload: buildCategoryMetadata(\"fileUpload\"),\n logging: buildCategoryMetadata(\"logging\"),\n observability: buildCategoryMetadata(\"observability\"),\n backendLibraries: buildCategoryMetadata(\"backendLibraries\"),\n stateManagement: buildCategoryMetadata(\"stateManagement\"),\n forms: buildCategoryMetadata(\"forms\"),\n validation: buildCategoryMetadata(\"validation\"),\n testing: buildCategoryMetadata(\"testing\"),\n realtime: buildCategoryMetadata(\"realtime\"),\n jobQueue: buildCategoryMetadata(\"jobQueue\"),\n caching: buildCategoryMetadata(\"caching\"),\n search: buildCategoryMetadata(\"search\"),\n fileStorage: buildCategoryMetadata(\"fileStorage\"),\n animation: buildCategoryMetadata(\"animation\"),\n cssFramework: buildCategoryMetadata(\"cssFramework\"),\n uiLibrary: buildCategoryMetadata(\"uiLibrary\"),\n cms: buildCategoryMetadata(\"cms\"),\n featureFlags: buildCategoryMetadata(\"featureFlags\"),\n analytics: buildCategoryMetadata(\"analytics\"),\n codeQuality: buildCategoryMetadata(\"codeQuality\"),\n documentation: buildCategoryMetadata(\"documentation\"),\n appPlatforms: buildCategoryMetadata(\"appPlatforms\"),\n packageManager: buildCategoryMetadata(\"packageManager\"),\n examples: buildCategoryMetadata(\"examples\"),\n ai: buildCategoryMetadata(\"ai\"),\n aiDocs: buildCategoryMetadata(\"aiDocs\"),\n git: buildCategoryMetadata(\"git\"),\n install: buildCategoryMetadata(\"install\"),\n effect: buildCategoryMetadata(\"effect\"),\n shadcnBase: buildCategoryMetadata(\"shadcnBase\"),\n shadcnStyle: buildCategoryMetadata(\"shadcnStyle\"),\n shadcnIconLibrary: buildCategoryMetadata(\"shadcnIconLibrary\"),\n shadcnColorTheme: buildCategoryMetadata(\"shadcnColorTheme\"),\n shadcnBaseColor: buildCategoryMetadata(\"shadcnBaseColor\"),\n shadcnFont: buildCategoryMetadata(\"shadcnFont\"),\n shadcnRadius: buildCategoryMetadata(\"shadcnRadius\"),\n rustWebFramework: buildCategoryMetadata(\"rustWebFramework\"),\n rustFrontend: buildCategoryMetadata(\"rustFrontend\"),\n rustOrm: buildCategoryMetadata(\"rustOrm\"),\n rustApi: buildCategoryMetadata(\"rustApi\"),\n rustCli: buildCategoryMetadata(\"rustCli\"),\n rustLibraries: buildCategoryMetadata(\"rustLibraries\"),\n pythonWebFramework: buildCategoryMetadata(\"pythonWebFramework\"),\n pythonOrm: buildCategoryMetadata(\"pythonOrm\"),\n pythonValidation: buildCategoryMetadata(\"pythonValidation\"),\n pythonAi: buildCategoryMetadata(\"pythonAi\"),\n pythonTaskQueue: buildCategoryMetadata(\"pythonTaskQueue\"),\n pythonQuality: buildCategoryMetadata(\"pythonQuality\"),\n goWebFramework: buildCategoryMetadata(\"goWebFramework\"),\n goOrm: buildCategoryMetadata(\"goOrm\"),\n goApi: buildCategoryMetadata(\"goApi\"),\n goCli: buildCategoryMetadata(\"goCli\"),\n goLogging: buildCategoryMetadata(\"goLogging\"),\n};\n\nconst OPTION_LOOKUP = Object.fromEntries(\n (Object.entries(OPTION_CATEGORY_METADATA) as Array<[OptionCategory, OptionCategoryMetadata]>).map(\n ([category, metadata]) => [\n category,\n new Map(\n metadata.options.flatMap((option) => [\n [option.id.toLowerCase(), option.id],\n ...option.aliases.map((alias) => [alias.toLowerCase(), option.id] as const),\n ]),\n ),\n ],\n ),\n) as Record<OptionCategory, Map<string, string>>;\n\nexport function isMultiSelectCategory(category: OptionCategory): boolean {\n return OPTION_CATEGORY_METADATA[category].selectionMode === \"multiple\";\n}\n\nexport function getOptionMetadata(category: OptionCategory, optionId: string): OptionMetadata | undefined {\n return OPTION_CATEGORY_METADATA[category].options.find((option) => option.id === optionId);\n}\n\nexport function getCategoryOptionIds(category: OptionCategory): string[] {\n return OPTION_CATEGORY_METADATA[category].options.map((option) => option.id);\n}\n\nexport function getCategoryCliValues(category: OptionCategory): string[] {\n return [...new Set(OPTION_CATEGORY_METADATA[category].options.map((option) => option.cliValue))];\n}\n\nexport function normalizeOptionId(category: OptionCategory, value: string): string {\n const normalized = OPTION_LOOKUP[category].get(value.toLowerCase());\n return normalized ?? value;\n}\n","const VITE_WEB_FRONTENDS = new Set([\"react-router\", \"react-vite\", \"svelte\", \"fresh\"]);\n\nexport function getLocalWebDevPort(frontend: readonly string[]): 3001 | 5173 {\n return frontend.some((entry) => VITE_WEB_FRONTENDS.has(entry)) ? 5173 : 3001;\n}\n"],"mappings":"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"}
|