@better-fullstack/types 2.3.1 → 2.4.0
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/LICENSE +22 -0
- package/dist/{defaults-Cl16mM84.mjs → defaults-BzWJP6p0.mjs} +3 -1
- package/dist/defaults-BzWJP6p0.mjs.map +1 -0
- package/dist/{defaults-BCprHCB6.d.mts → defaults-DdEGPWbd.d.mts} +2 -2
- package/dist/defaults-DdEGPWbd.d.mts.map +1 -0
- package/dist/defaults.d.mts +3 -3
- package/dist/defaults.mjs +1 -1
- package/dist/index.d.mts +6 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +23 -5
- package/dist/index.mjs.map +1 -1
- package/dist/json-schema.d.mts +496 -320
- package/dist/json-schema.d.mts.map +1 -1
- package/dist/json-schema.mjs +1 -1
- package/dist/{schemas-B79HRN5e.d.mts → schemas-BMTIauzB.d.mts} +777 -609
- package/dist/schemas-BMTIauzB.d.mts.map +1 -0
- package/dist/{schemas-CprYz5Sh.mjs → schemas-CNrFm0ld.mjs} +21 -2
- package/dist/schemas-CNrFm0ld.mjs.map +1 -0
- package/dist/schemas.d.mts +2 -2
- package/dist/schemas.mjs +2 -2
- package/dist/{stack-graph-DiLi3WuL.mjs → stack-graph-BqmxkJKS.mjs} +110 -9
- package/dist/stack-graph-BqmxkJKS.mjs.map +1 -0
- package/dist/{stack-graph-BkHZlyKH.d.mts → stack-graph-DWpdF4s0.d.mts} +2 -2
- package/dist/{stack-graph-BkHZlyKH.d.mts.map → stack-graph-DWpdF4s0.d.mts.map} +1 -1
- package/dist/stack-graph.d.mts +3 -3
- package/dist/stack-graph.mjs +2 -2
- package/dist/{stack-translation-Ay-_1mNB.mjs → stack-translation-CIt0ziI4.mjs} +234 -9
- package/dist/stack-translation-CIt0ziI4.mjs.map +1 -0
- package/dist/{stack-translation-BmsX82IA.d.mts → stack-translation-DyfJJgeD.d.mts} +18 -7
- package/dist/stack-translation-DyfJJgeD.d.mts.map +1 -0
- package/dist/stack-translation.d.mts +4 -4
- package/dist/stack-translation.mjs +3 -3
- package/dist/{types-BuRzqsRV.d.mts → types-BUQyhJDc.d.mts} +5 -3
- package/dist/types-BUQyhJDc.d.mts.map +1 -0
- package/dist/types.d.mts +3 -3
- package/package.json +3 -2
- package/dist/defaults-BCprHCB6.d.mts.map +0 -1
- package/dist/defaults-Cl16mM84.mjs.map +0 -1
- package/dist/schemas-B79HRN5e.d.mts.map +0 -1
- package/dist/schemas-CprYz5Sh.mjs.map +0 -1
- package/dist/stack-graph-DiLi3WuL.mjs.map +0 -1
- package/dist/stack-translation-Ay-_1mNB.mjs.map +0 -1
- package/dist/stack-translation-BmsX82IA.d.mts.map +0 -1
- package/dist/types-BuRzqsRV.d.mts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-translation-CIt0ziI4.mjs","names":["CAPABILITY_DEFINITIONS: {\n [K in CapabilityName]: readonly CapabilityDefinitionMap[K][];\n}","_exhaustive: never","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>","KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES: ReadonlySet<string>","KOTLIN_DROPPED_JAVA_LIBRARIES: ReadonlySet<string>","SINGLE_APP_WEB_FRONTEND_BY_BACKEND: Record<string, string>","notes: CompatibilityAnalysisResult[\"notes\"]","changes: CompatibilityAdjustment[]","noneOverrides: Partial<CompatibilityInput>","SHARED_BACKEND_SERVICE_MISSING_OWNER_REASONS: Partial<Record<CompatibilityCategory, string>>","ELIXIR_GRAPH_DISABLED_REASON_ROLES: Partial<Record<CompatibilityCategory, StackPartRole>>","GRAPH_DISABLED_REASON_BINDINGS: Partial<\n Record<CompatibilityCategory, GraphDisabledReasonBinding>\n>","frontend","WEB_FRAMEWORKS: readonly Frontend[]","CODEGEN_COMPATIBLE_FRONTENDS: readonly Frontend[]","ADDON_COMPATIBILITY: Record<Addons, readonly Frontend[]>","base: API[]","reactFrontends: Frontend[]","all: Forms[]","issues: CompatibilityIssue[]","scalarChecks: Array<[CompatibilityCategory, string]>","DEFAULT_STACK_SELECTION: StackSelectionState","STACK_SELECTION_OPTION_CATEGORY_BY_KEY: Record<\n Exclude<StackSelectionKey, (typeof NON_OPTION_STACK_SELECTION_KEYS)[number]>,\n OptionCategory\n>","cloned: Partial<StackSelectionState>","normalized: Record<string, unknown>","normalized: StackSelectionUrlRecord","serialized","spec","config: Partial<ProjectConfig>","baseConfig: CliDefaultProjectConfigBase","currentArray: readonly unknown[]","defaultArray: readonly unknown[]","flags: string[]"],"sources":["../src/capabilities.ts","../src/option-metadata.ts","../src/compatibility.ts","../src/stack-translation.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: \"better-auth-organizations\",\n label: \"Better Auth + Organizations\",\n description: \"Better Auth with the Organizations plugin for teams and multi-tenant apps\",\n promptHint: \"Better Auth with organizations and team management\",\n icon: \"/icon/better-auth.svg\",\n color: \"from-emerald-400 to-teal-600\",\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: \"workos\",\n label: \"WorkOS AuthKit\",\n description: \"Enterprise auth with SSO, SCIM, organizations, and audit logs\",\n promptHint: \"Enterprise AuthKit with SSO and organizations\",\n icon: \"https://cdn.simpleicons.org/workos/6363F1\",\n color: \"from-indigo-400 to-violet-600\",\n },\n {\n id: \"kinde\",\n label: \"Kinde\",\n description: \"Authentication, organizations, roles, and permissions for SaaS apps\",\n promptHint: \"Auth with organizations, roles, and permissions\",\n icon: \"https://cdn.simpleicons.org/kinde/00A9FF\",\n color: \"from-sky-400 to-cyan-600\",\n },\n {\n id: \"passport\",\n label: \"Passport.js\",\n description: \"Strategy-based authentication middleware for Express applications\",\n promptHint: \"Passport.js with GitHub OAuth for Express\",\n icon: \"https://cdn.simpleicons.org/passport/34E27A\",\n color: \"from-emerald-400 to-green-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(\n optionId: Exclude<\n Auth,\n \"none\" | \"better-auth\" | \"better-auth-organizations\" | \"go-better-auth\" | \"clerk\" | \"passport\"\n >,\n): 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 case \"workos\":\n return \"WorkOS AuthKit\";\n case \"kinde\":\n return \"Kinde\";\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 (webFrontend.some((frontend) => [\"vanilla-vite\", \"vue\"].includes(frontend))) {\n return \"Auth client integrations are not yet wired for standalone Vue or Vanilla Vite frontends\";\n }\n\n if (backend === \"none\") {\n return \"No backend selected\";\n }\n\n if (optionId === \"better-auth\" || optionId === \"better-auth-organizations\") {\n if (optionId === \"better-auth-organizations\" && backend === \"convex\") {\n return \"Better Auth organizations is currently generated for non-Convex Better Auth stacks\";\n }\n\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 if (optionId === \"supabase-auth\") {\n if (isSelfBackend(backend)) {\n if ((hasNextJs || hasTanStackStart) && hasNativeFrontend) {\n return \"In Better-Fullstack, Supabase Auth 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, Supabase Auth is not yet supported for Astro fullstack projects\";\n }\n if (backend === \"self-nuxt\" || webFrontend.includes(\"nuxt\")) {\n return \"In Better-Fullstack, Supabase Auth is not yet supported for Nuxt fullstack projects\";\n }\n if (backend === \"self-svelte\" || webFrontend.includes(\"svelte\")) {\n return \"In Better-Fullstack, Supabase Auth is not yet supported for SvelteKit fullstack projects\";\n }\n if (backend === \"self-solid-start\" || webFrontend.includes(\"solid-start\")) {\n return \"In Better-Fullstack, Supabase Auth is not yet supported for SolidStart fullstack projects\";\n }\n\n return \"In Better-Fullstack, Supabase Auth is currently supported with Next.js fullstack or TanStack Start fullstack\";\n }\n\n return \"In Better-Fullstack, Supabase Auth is currently supported only with the 'self' backend (fullstack Next.js or TanStack Start)\";\n }\n\n if (optionId === \"passport\") {\n return backend === \"express\"\n ? null\n : \"Passport.js is currently scaffolded for the Express backend\";\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 { getCapabilityDefinitions } from \"./capabilities\";\nimport {\n AI_DOCS_VALUES,\n AI_VALUES,\n ANALYTICS_VALUES,\n ANIMATION_VALUES,\n API_VALUES,\n APP_PLATFORM_ADDON_VALUES,\n ASTRO_INTEGRATION_VALUES,\n AUTH_VALUES,\n CACHING_VALUES,\n DOTNET_API_VALUES,\n DOTNET_AUTH_VALUES,\n DOTNET_VALIDATION_VALUES,\n DOTNET_CACHING_VALUES,\n DOTNET_DEPLOY_VALUES,\n DOTNET_JOB_QUEUE_VALUES,\n DOTNET_LIBRARIES_VALUES,\n DOTNET_OBSERVABILITY_VALUES,\n DOTNET_ORM_VALUES,\n DOTNET_REALTIME_VALUES,\n DOTNET_TESTING_VALUES,\n DOTNET_WEB_FRAMEWORK_VALUES,\n ELIXIR_API_VALUES,\n ELIXIR_LIBRARIES_VALUES,\n ELIXIR_AUTH_VALUES,\n ELIXIR_CACHING_VALUES,\n ELIXIR_DEPLOY_VALUES,\n ELIXIR_EMAIL_VALUES,\n ELIXIR_HTTP_VALUES,\n ELIXIR_JOBS_VALUES,\n ELIXIR_JSON_VALUES,\n ELIXIR_OBSERVABILITY_VALUES,\n ELIXIR_ORM_VALUES,\n ELIXIR_QUALITY_VALUES,\n ELIXIR_I18N_VALUES,\n ELIXIR_HTTP_SERVER_VALUES,\n ELIXIR_APPLICATION_FRAMEWORK_VALUES,\n ELIXIR_DOCUMENTATION_VALUES,\n ELIXIR_CLUSTERING_VALUES,\n ELIXIR_REALTIME_VALUES,\n ELIXIR_TESTING_VALUES,\n ELIXIR_VALIDATION_VALUES,\n ELIXIR_WEB_FRAMEWORK_VALUES,\n I18N_VALUES,\n CMS_VALUES,\n CSS_FRAMEWORK_VALUES,\n DATABASE_SETUP_VALUES,\n DATABASE_VALUES,\n EFFECT_VALUES,\n EMAIL_VALUES,\n ECOMMERCE_VALUES,\n FEATURE_FLAGS_VALUES,\n INTEGRATIONS_VALUES,\n FILE_STORAGE_VALUES,\n FILE_UPLOAD_VALUES,\n FORMS_VALUES,\n MOBILE_DEEP_LINKING_VALUES,\n MOBILE_LIBRARIES_VALUES,\n MOBILE_NAVIGATION_VALUES,\n MOBILE_OTA_VALUES,\n MOBILE_PUSH_VALUES,\n MOBILE_STORAGE_VALUES,\n MOBILE_TESTING_VALUES,\n MOBILE_UI_VALUES,\n GO_API_VALUES,\n GO_CLI_VALUES,\n GO_AUTH_VALUES,\n GO_LOGGING_VALUES,\n GO_ORM_VALUES,\n GO_WEB_FRAMEWORK_VALUES,\n GO_TESTING_VALUES,\n GO_REALTIME_VALUES,\n GO_MESSAGE_QUEUE_VALUES,\n GO_CACHING_VALUES,\n GO_CONFIG_VALUES,\n GO_OBSERVABILITY_VALUES,\n GO_VALIDATION_VALUES,\n GO_QUALITY_VALUES,\n GO_MIGRATIONS_VALUES,\n GO_TEMPLATING_VALUES,\n GO_PROTO_TOOLING_VALUES,\n GO_DI_VALUES,\n JAVA_AUTH_VALUES,\n JAVA_API_VALUES,\n JAVA_LANGUAGE_VALUES,\n JAVA_LOGGING_VALUES,\n JAVA_BUILD_TOOL_VALUES,\n JAVA_LIBRARIES_VALUES,\n JAVA_ORM_VALUES,\n JAVA_TESTING_LIBRARIES_VALUES,\n JAVA_WEB_FRAMEWORK_VALUES,\n JOB_QUEUE_VALUES,\n LOGGING_VALUES,\n OBSERVABILITY_VALUES,\n ORM_VALUES,\n PACKAGE_MANAGER_VALUES,\n WORKSPACE_SHAPE_VALUES,\n PAYMENTS_VALUES,\n VERSION_CHANNEL_VALUES,\n PYTHON_AI_VALUES,\n PYTHON_API_VALUES,\n PYTHON_AUTH_VALUES,\n PYTHON_ORM_VALUES,\n PYTHON_GRAPHQL_VALUES,\n PYTHON_QUALITY_VALUES,\n PYTHON_TESTING_VALUES,\n PYTHON_CACHING_VALUES,\n PYTHON_REALTIME_VALUES,\n PYTHON_OBSERVABILITY_VALUES,\n PYTHON_CLI_VALUES,\n PYTHON_CLOUD_SDK_VALUES,\n PYTHON_DATA_VALUES,\n PYTHON_HTTP_CLIENT_VALUES,\n PYTHON_MEDIA_VALUES,\n PYTHON_MESSAGE_QUEUE_VALUES,\n PYTHON_PACKAGE_MANAGER_VALUES,\n PYTHON_SERVER_VALUES,\n PYTHON_TASK_QUEUE_VALUES,\n PYTHON_VALIDATION_VALUES,\n PYTHON_WEB_FRAMEWORK_VALUES,\n RATE_LIMIT_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_LOGGING_VALUES,\n RUST_ERROR_HANDLING_VALUES,\n RUST_CACHING_VALUES,\n RUST_AUTH_VALUES,\n RUST_REALTIME_VALUES,\n RUST_MESSAGE_QUEUE_VALUES,\n RUST_OBSERVABILITY_VALUES,\n RUST_TEMPLATING_VALUES,\n RUST_ORM_VALUES,\n RUST_WEB_FRAMEWORK_VALUES,\n SEARCH_VALUES,\n VECTOR_DB_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\";\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 | \"rateLimit\"\n | \"i18n\"\n | \"search\"\n | \"vectorDb\"\n | \"fileStorage\"\n | \"animation\"\n | \"cssFramework\"\n | \"uiLibrary\"\n | \"cms\"\n | \"featureFlags\"\n | \"integrations\"\n | \"ecommerce\"\n | \"analytics\"\n | \"mobileNavigation\"\n | \"mobileUI\"\n | \"mobileStorage\"\n | \"mobileTesting\"\n | \"mobilePush\"\n | \"mobileOTA\"\n | \"mobileDeepLinking\"\n | \"mobileLibraries\"\n | \"codeQuality\"\n | \"documentation\"\n | \"appShells\"\n | \"appPlatforms\"\n | \"packageManager\"\n | \"workspaceShape\"\n | \"versionChannel\"\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 | \"rustLogging\"\n | \"rustErrorHandling\"\n | \"rustCaching\"\n | \"rustAuth\"\n | \"rustRealtime\"\n | \"rustMessageQueue\"\n | \"rustObservability\"\n | \"rustTemplating\"\n | \"pythonWebFramework\"\n | \"pythonOrm\"\n | \"pythonValidation\"\n | \"pythonAi\"\n | \"pythonAuth\"\n | \"pythonApi\"\n | \"pythonTaskQueue\"\n | \"pythonGraphql\"\n | \"pythonQuality\"\n | \"pythonTesting\"\n | \"pythonCaching\"\n | \"pythonRealtime\"\n | \"pythonObservability\"\n | \"pythonCli\"\n | \"pythonCloudSdk\"\n | \"pythonHttpClient\"\n | \"pythonData\"\n | \"pythonMedia\"\n | \"pythonServer\"\n | \"pythonPackageManager\"\n | \"pythonMessageQueue\"\n | \"goWebFramework\"\n | \"goOrm\"\n | \"goApi\"\n | \"goCli\"\n | \"goLogging\"\n | \"goAuth\"\n | \"goTesting\"\n | \"goRealtime\"\n | \"goMessageQueue\"\n | \"goCaching\"\n | \"goConfig\"\n | \"goObservability\"\n | \"goValidation\"\n | \"goQuality\"\n | \"goMigrations\"\n | \"goTemplating\"\n | \"goProtoTooling\"\n | \"goDI\"\n | \"javaLanguage\"\n | \"javaWebFramework\"\n | \"javaBuildTool\"\n | \"javaOrm\"\n | \"javaAuth\"\n | \"javaApi\"\n | \"javaLogging\"\n | \"javaLibraries\"\n | \"javaTestingLibraries\"\n | \"dotnetWebFramework\"\n | \"dotnetOrm\"\n | \"dotnetAuth\"\n | \"dotnetApi\"\n | \"dotnetTesting\"\n | \"dotnetJobQueue\"\n | \"dotnetRealtime\"\n | \"dotnetObservability\"\n | \"dotnetValidation\"\n | \"dotnetCaching\"\n | \"dotnetDeploy\"\n | \"dotnetLibraries\"\n | \"elixirWebFramework\"\n | \"elixirOrm\"\n | \"elixirAuth\"\n | \"elixirApi\"\n | \"elixirRealtime\"\n | \"elixirJobs\"\n | \"elixirValidation\"\n | \"elixirHttp\"\n | \"elixirJson\"\n | \"elixirEmail\"\n | \"elixirCaching\"\n | \"elixirObservability\"\n | \"elixirTesting\"\n | \"elixirQuality\"\n | \"elixirI18n\"\n | \"elixirHttpServer\"\n | \"elixirApplicationFramework\"\n | \"elixirDocumentation\"\n | \"elixirClustering\"\n | \"elixirDeploy\"\n | \"elixirLibraries\";\n\nexport type OptionSelectionMode = \"single\" | \"multiple\";\n\nexport type OptionCategoryEcosystem =\n | \"typescript\"\n | \"react-native\"\n | \"rust\"\n | \"python\"\n | \"go\"\n | \"java\"\n | \"dotnet\"\n | \"elixir\";\n\nexport const TYPESCRIPT_CATEGORY_ORDER = [\n \"webFrontend\",\n \"astroIntegration\",\n \"appShells\",\n \"cssFramework\",\n \"uiLibrary\",\n \"shadcnBase\",\n \"shadcnStyle\",\n \"shadcnIconLibrary\",\n \"shadcnColorTheme\",\n \"shadcnBaseColor\",\n \"shadcnFont\",\n \"shadcnRadius\",\n \"backend\",\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 \"integrations\",\n \"ecommerce\",\n \"analytics\",\n \"ai\",\n \"stateManagement\",\n \"forms\",\n \"validation\",\n \"backendLibraries\",\n \"testing\",\n \"realtime\",\n \"jobQueue\",\n \"caching\",\n \"rateLimit\",\n \"i18n\",\n \"search\",\n \"vectorDb\",\n \"fileStorage\",\n \"animation\",\n \"cms\",\n \"codeQuality\",\n \"documentation\",\n \"appPlatforms\",\n \"workspaceShape\",\n \"packageManager\",\n \"examples\",\n \"aiDocs\",\n \"versionChannel\",\n \"git\",\n \"install\",\n] as const satisfies readonly OptionCategory[];\n\nexport const REACT_NATIVE_CATEGORY_ORDER = [\n \"nativeFrontend\",\n \"mobileNavigation\",\n \"mobileUI\",\n \"mobileStorage\",\n \"mobileTesting\",\n \"mobilePush\",\n \"mobileOTA\",\n \"mobileDeepLinking\",\n \"mobileLibraries\",\n \"auth\",\n \"payments\",\n \"packageManager\",\n \"aiDocs\",\n \"git\",\n \"install\",\n] as const satisfies readonly OptionCategory[];\n\nexport const RUST_CATEGORY_ORDER = [\n \"rustWebFramework\",\n \"rustFrontend\",\n \"rustOrm\",\n \"rustApi\",\n \"rustCli\",\n \"rustLibraries\",\n \"rustLogging\",\n \"rustErrorHandling\",\n \"rustCaching\",\n \"rustAuth\",\n \"rustRealtime\",\n \"rustMessageQueue\",\n \"rustObservability\",\n \"rustTemplating\",\n \"email\",\n \"observability\",\n \"caching\",\n \"search\",\n \"aiDocs\",\n \"git\",\n \"install\",\n] as const satisfies readonly OptionCategory[];\n\nexport const PYTHON_CATEGORY_ORDER = [\n \"pythonWebFramework\",\n \"pythonOrm\",\n \"pythonValidation\",\n \"pythonAi\",\n \"pythonAuth\",\n \"pythonApi\",\n \"pythonTaskQueue\",\n \"pythonGraphql\",\n \"pythonQuality\",\n \"pythonTesting\",\n \"pythonCaching\",\n \"pythonRealtime\",\n \"pythonObservability\",\n \"pythonCli\",\n \"pythonCloudSdk\",\n \"pythonHttpClient\",\n \"pythonData\",\n \"pythonMedia\",\n \"pythonServer\",\n \"pythonPackageManager\",\n \"pythonMessageQueue\",\n \"email\",\n \"observability\",\n \"caching\",\n \"search\",\n \"aiDocs\",\n \"git\",\n \"install\",\n] as const satisfies readonly OptionCategory[];\n\nexport const GO_CATEGORY_ORDER = [\n \"goWebFramework\",\n \"goOrm\",\n \"goApi\",\n \"goCli\",\n \"goLogging\",\n \"goAuth\",\n \"goTesting\",\n \"goRealtime\",\n \"goMessageQueue\",\n \"goCaching\",\n \"goConfig\",\n \"goObservability\",\n \"goValidation\",\n \"goQuality\",\n \"goMigrations\",\n \"goTemplating\",\n \"goProtoTooling\",\n \"goDI\",\n \"auth\",\n \"email\",\n \"observability\",\n \"caching\",\n \"search\",\n \"aiDocs\",\n \"git\",\n \"install\",\n] as const satisfies readonly OptionCategory[];\n\nexport const JAVA_CATEGORY_ORDER = [\n \"javaWebFramework\",\n \"javaLanguage\",\n \"javaBuildTool\",\n \"javaOrm\",\n \"javaAuth\",\n \"javaApi\",\n \"javaLogging\",\n \"javaLibraries\",\n \"javaTestingLibraries\",\n \"email\",\n \"observability\",\n \"caching\",\n \"search\",\n \"aiDocs\",\n \"git\",\n \"install\",\n] as const satisfies readonly OptionCategory[];\n\nexport const DOTNET_CATEGORY_ORDER = [\n \"dotnetWebFramework\",\n \"dotnetOrm\",\n \"dotnetAuth\",\n \"dotnetApi\",\n \"dotnetTesting\",\n \"dotnetJobQueue\",\n \"dotnetRealtime\",\n \"dotnetObservability\",\n \"dotnetValidation\",\n \"dotnetCaching\",\n \"dotnetDeploy\",\n \"dotnetLibraries\",\n \"aiDocs\",\n \"git\",\n \"install\",\n] as const satisfies readonly OptionCategory[];\n\nexport const ELIXIR_CATEGORY_ORDER = [\n \"elixirWebFramework\",\n \"elixirOrm\",\n \"elixirAuth\",\n \"elixirApi\",\n \"elixirRealtime\",\n \"elixirJobs\",\n \"elixirValidation\",\n \"elixirHttp\",\n \"elixirJson\",\n \"elixirEmail\",\n \"elixirCaching\",\n \"elixirObservability\",\n \"elixirTesting\",\n \"elixirQuality\",\n \"elixirI18n\",\n \"elixirHttpServer\",\n \"elixirApplicationFramework\",\n \"elixirDocumentation\",\n \"elixirClustering\",\n \"elixirDeploy\",\n \"elixirLibraries\",\n \"aiDocs\",\n \"git\",\n \"install\",\n] as const satisfies readonly OptionCategory[];\n\nexport const CATEGORY_ORDER = [\n ...new Set([\n ...TYPESCRIPT_CATEGORY_ORDER,\n ...REACT_NATIVE_CATEGORY_ORDER,\n ...RUST_CATEGORY_ORDER,\n ...PYTHON_CATEGORY_ORDER,\n ...GO_CATEGORY_ORDER,\n ...JAVA_CATEGORY_ORDER,\n ...DOTNET_CATEGORY_ORDER,\n ...ELIXIR_CATEGORY_ORDER,\n ]),\n] as OptionCategory[];\n\nexport function getCategoryOrderForEcosystem(\n ecosystem: OptionCategoryEcosystem,\n): readonly OptionCategory[] {\n switch (ecosystem) {\n case \"react-native\":\n return REACT_NATIVE_CATEGORY_ORDER;\n case \"rust\":\n return RUST_CATEGORY_ORDER;\n case \"python\":\n return PYTHON_CATEGORY_ORDER;\n case \"go\":\n return GO_CATEGORY_ORDER;\n case \"java\":\n return JAVA_CATEGORY_ORDER;\n case \"dotnet\":\n return DOTNET_CATEGORY_ORDER;\n case \"elixir\":\n return ELIXIR_CATEGORY_ORDER;\n case \"typescript\":\n return TYPESCRIPT_CATEGORY_ORDER;\n }\n}\n\nexport function getCategoryDisplayName(categoryKey: string): string {\n const categoryNames: Record<string, string> = {\n i18n: \"Internationalization (i18n)\",\n appShells: \"App Platforms\",\n appPlatforms: \"Addons\",\n mobileNavigation: \"Mobile Navigation\",\n mobileUI: \"Mobile UI\",\n mobileStorage: \"Mobile Storage\",\n mobileTesting: \"Mobile Testing\",\n mobilePush: \"Mobile Push\",\n mobileOTA: \"Mobile OTA\",\n mobileDeepLinking: \"Mobile Deep Linking\",\n mobileLibraries: \"Mobile Libraries\",\n backendLibraries: \"Effect Services\",\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 rustLogging: \"Rust Logging\",\n rustErrorHandling: \"Rust Error Handling\",\n rustCaching: \"Rust Caching\",\n rustAuth: \"Rust Auth\",\n rustRealtime: \"Rust Realtime\",\n rustMessageQueue: \"Rust Message Queue\",\n rustObservability: \"Rust Observability\",\n rustTemplating: \"Rust Templating\",\n pythonWebFramework: \"Python Web Framework\",\n pythonOrm: \"Python ORM / Database\",\n pythonValidation: \"Python Validation\",\n pythonAi: \"Python AI / ML\",\n pythonAuth: \"Python Auth\",\n pythonApi: \"Python API Framework\",\n pythonTaskQueue: \"Python Task Queue\",\n pythonGraphql: \"Python GraphQL\",\n pythonQuality: \"Python Code Quality\",\n pythonTesting: \"Python Testing\",\n pythonCaching: \"Python Caching\",\n pythonRealtime: \"Python Realtime\",\n pythonObservability: \"Python Observability\",\n pythonCli: \"Python CLI Tooling\",\n pythonCloudSdk: \"Python Cloud SDK\",\n pythonHttpClient: \"Python HTTP Client\",\n pythonData: \"Python Data & Scientific Computing\",\n pythonMedia: \"Python Media\",\n pythonServer: \"Python Production Server\",\n pythonPackageManager: \"Python Package Manager\",\n pythonMessageQueue: \"Python Message Queue\",\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 goAuth: \"Go Auth\",\n goTesting: \"Go Testing\",\n goRealtime: \"Go Realtime\",\n goMessageQueue: \"Go Message Queue\",\n goCaching: \"Go Caching\",\n goConfig: \"Go Config\",\n goObservability: \"Go Observability\",\n goValidation: \"Go Validation\",\n goQuality: \"Go Code Quality\",\n goMigrations: \"Go Database Migrations\",\n goTemplating: \"Go Templating\",\n goProtoTooling: \"Go Protobuf Tooling\",\n goDI: \"Go Dependency Injection\",\n javaLanguage: \"Java Language\",\n javaWebFramework: \"Java Web Framework\",\n javaBuildTool: \"Java Build Tool\",\n javaOrm: \"Java ORM / Database\",\n javaAuth: \"Java Auth\",\n javaApi: \"Java API Layer\",\n javaLogging: \"Java Logging\",\n javaLibraries: \"Java Libraries\",\n javaTestingLibraries: \"Java Testing Libraries\",\n dotnetWebFramework: \".NET Web Framework\",\n dotnetOrm: \".NET Data Access\",\n dotnetAuth: \".NET Auth\",\n dotnetApi: \".NET API Style\",\n dotnetTesting: \".NET Testing\",\n dotnetJobQueue: \".NET Background Jobs\",\n dotnetRealtime: \".NET Realtime\",\n dotnetObservability: \".NET Observability\",\n dotnetValidation: \".NET Validation\",\n dotnetCaching: \".NET Caching\",\n dotnetDeploy: \".NET Deploy\",\n dotnetLibraries: \".NET Libraries\",\n elixirWebFramework: \"Elixir Web Framework\",\n elixirOrm: \"Elixir ORM / Database\",\n elixirAuth: \"Elixir Auth\",\n elixirApi: \"Elixir API Layer\",\n elixirRealtime: \"Elixir Realtime\",\n elixirJobs: \"Elixir Jobs\",\n elixirValidation: \"Elixir Validation\",\n elixirHttp: \"Elixir HTTP Client\",\n elixirJson: \"Elixir JSON\",\n elixirEmail: \"Elixir Email\",\n elixirCaching: \"Elixir Caching\",\n elixirObservability: \"Elixir Observability\",\n elixirTesting: \"Elixir Testing\",\n elixirQuality: \"Elixir Code Quality\",\n elixirI18n: \"Elixir Localization\",\n elixirHttpServer: \"Elixir HTTP Server\",\n elixirApplicationFramework: \"Elixir Application Framework\",\n elixirDocumentation: \"Elixir Documentation\",\n elixirClustering: \"Elixir Clustering\",\n elixirDeploy: \"Elixir Deploy\",\n elixirLibraries: \"Elixir Libraries\",\n };\n\n const customName = categoryNames[categoryKey];\n if (customName) return customName;\n\n const result = categoryKey.replace(/([A-Z])/g, \" $1\");\n return result.charAt(0).toUpperCase() + result.slice(1);\n}\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 \"vanilla-vite\",\n \"vue\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\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 \"effect\",\n \"nestjs\",\n \"adonisjs\",\n \"nitro\",\n \"encore\",\n \"convex\",\n \"self-next\",\n \"self-vinext\",\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 \"eslint\",\n \"prettier\",\n \"oxlint\",\n \"ultracite\",\n \"lefthook\",\n \"husky\",\n \"knip\",\n \"gitleaks\",\n \"ruler\",\n] as const satisfies readonly string[];\n\nconst DOCUMENTATION_VALUES = [\"starlight\", \"fumadocs\"] as const satisfies readonly string[];\n\nconst APP_SHELL_VALUES = APP_PLATFORM_ADDON_VALUES;\n\nconst APP_PLATFORM_VALUES = [\n \"turborepo\",\n \"nx\",\n \"mcp\",\n \"skills\",\n \"msw\",\n \"storybook\",\n \"swr\",\n \"tanstack-query\",\n \"tanstack-table\",\n \"tanstack-virtual\",\n \"tanstack-db\",\n \"tanstack-pacer\",\n \"backend-utils\",\n \"devcontainer\",\n \"docker-compose\",\n \"kong\",\n \"github-actions\",\n \"axios\",\n \"firebase\",\n \"graphql-codegen\",\n \"openapi-typescript\",\n \"apollo-client\",\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 \"appShells\",\n \"appPlatforms\",\n \"examples\",\n \"aiDocs\",\n \"rustLibraries\",\n \"pythonAi\",\n \"javaLibraries\",\n \"javaTestingLibraries\",\n \"mobileLibraries\",\n \"dotnetLibraries\",\n \"dotnetTesting\",\n \"dotnetObservability\",\n \"goTesting\",\n \"pythonTesting\",\n \"pythonCli\",\n \"pythonData\",\n \"elixirLibraries\",\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 rateLimit: RATE_LIMIT_VALUES,\n i18n: I18N_VALUES,\n search: SEARCH_VALUES,\n vectorDb: VECTOR_DB_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 integrations: INTEGRATIONS_VALUES,\n ecommerce: ECOMMERCE_VALUES,\n analytics: ANALYTICS_VALUES,\n mobileNavigation: MOBILE_NAVIGATION_VALUES,\n mobileUI: MOBILE_UI_VALUES,\n mobileStorage: MOBILE_STORAGE_VALUES,\n mobileTesting: MOBILE_TESTING_VALUES,\n mobilePush: MOBILE_PUSH_VALUES,\n mobileOTA: MOBILE_OTA_VALUES,\n mobileDeepLinking: MOBILE_DEEP_LINKING_VALUES,\n mobileLibraries: MOBILE_LIBRARIES_VALUES,\n codeQuality: CODE_QUALITY_VALUES,\n documentation: DOCUMENTATION_VALUES,\n appShells: APP_SHELL_VALUES,\n appPlatforms: APP_PLATFORM_VALUES,\n packageManager: PACKAGE_MANAGER_VALUES,\n workspaceShape: WORKSPACE_SHAPE_VALUES,\n versionChannel: VERSION_CHANNEL_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 rustLogging: RUST_LOGGING_VALUES,\n rustErrorHandling: RUST_ERROR_HANDLING_VALUES,\n rustCaching: RUST_CACHING_VALUES,\n rustAuth: RUST_AUTH_VALUES,\n rustRealtime: RUST_REALTIME_VALUES,\n rustMessageQueue: RUST_MESSAGE_QUEUE_VALUES,\n rustObservability: RUST_OBSERVABILITY_VALUES,\n rustTemplating: RUST_TEMPLATING_VALUES,\n pythonWebFramework: PYTHON_WEB_FRAMEWORK_VALUES,\n pythonOrm: PYTHON_ORM_VALUES,\n pythonValidation: PYTHON_VALIDATION_VALUES,\n pythonAi: PYTHON_AI_VALUES,\n pythonAuth: PYTHON_AUTH_VALUES,\n pythonApi: PYTHON_API_VALUES,\n pythonTaskQueue: PYTHON_TASK_QUEUE_VALUES,\n pythonGraphql: PYTHON_GRAPHQL_VALUES,\n pythonQuality: PYTHON_QUALITY_VALUES,\n pythonTesting: PYTHON_TESTING_VALUES,\n pythonCaching: PYTHON_CACHING_VALUES,\n pythonRealtime: PYTHON_REALTIME_VALUES,\n pythonObservability: PYTHON_OBSERVABILITY_VALUES,\n pythonCli: PYTHON_CLI_VALUES,\n pythonCloudSdk: PYTHON_CLOUD_SDK_VALUES,\n pythonHttpClient: PYTHON_HTTP_CLIENT_VALUES,\n pythonData: PYTHON_DATA_VALUES,\n pythonMedia: PYTHON_MEDIA_VALUES,\n pythonServer: PYTHON_SERVER_VALUES,\n pythonPackageManager: PYTHON_PACKAGE_MANAGER_VALUES,\n pythonMessageQueue: PYTHON_MESSAGE_QUEUE_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 goAuth: GO_AUTH_VALUES,\n goTesting: GO_TESTING_VALUES,\n goRealtime: GO_REALTIME_VALUES,\n goMessageQueue: GO_MESSAGE_QUEUE_VALUES,\n goCaching: GO_CACHING_VALUES,\n goConfig: GO_CONFIG_VALUES,\n goObservability: GO_OBSERVABILITY_VALUES,\n goValidation: GO_VALIDATION_VALUES,\n goQuality: GO_QUALITY_VALUES,\n goMigrations: GO_MIGRATIONS_VALUES,\n goTemplating: GO_TEMPLATING_VALUES,\n goProtoTooling: GO_PROTO_TOOLING_VALUES,\n goDI: GO_DI_VALUES,\n javaLanguage: JAVA_LANGUAGE_VALUES,\n javaWebFramework: JAVA_WEB_FRAMEWORK_VALUES,\n javaBuildTool: JAVA_BUILD_TOOL_VALUES,\n javaOrm: JAVA_ORM_VALUES,\n javaAuth: JAVA_AUTH_VALUES,\n javaApi: JAVA_API_VALUES,\n javaLogging: JAVA_LOGGING_VALUES,\n javaLibraries: JAVA_LIBRARIES_VALUES,\n javaTestingLibraries: JAVA_TESTING_LIBRARIES_VALUES,\n dotnetWebFramework: DOTNET_WEB_FRAMEWORK_VALUES,\n dotnetOrm: DOTNET_ORM_VALUES,\n dotnetAuth: DOTNET_AUTH_VALUES,\n dotnetApi: DOTNET_API_VALUES,\n dotnetTesting: DOTNET_TESTING_VALUES,\n dotnetJobQueue: DOTNET_JOB_QUEUE_VALUES,\n dotnetRealtime: DOTNET_REALTIME_VALUES,\n dotnetObservability: DOTNET_OBSERVABILITY_VALUES,\n dotnetValidation: DOTNET_VALIDATION_VALUES,\n dotnetCaching: DOTNET_CACHING_VALUES,\n dotnetDeploy: DOTNET_DEPLOY_VALUES,\n dotnetLibraries: DOTNET_LIBRARIES_VALUES,\n elixirWebFramework: ELIXIR_WEB_FRAMEWORK_VALUES,\n elixirOrm: ELIXIR_ORM_VALUES,\n elixirAuth: ELIXIR_AUTH_VALUES,\n elixirApi: ELIXIR_API_VALUES,\n elixirRealtime: ELIXIR_REALTIME_VALUES,\n elixirJobs: ELIXIR_JOBS_VALUES,\n elixirValidation: ELIXIR_VALIDATION_VALUES,\n elixirHttp: ELIXIR_HTTP_VALUES,\n elixirJson: ELIXIR_JSON_VALUES,\n elixirEmail: ELIXIR_EMAIL_VALUES,\n elixirCaching: ELIXIR_CACHING_VALUES,\n elixirObservability: ELIXIR_OBSERVABILITY_VALUES,\n elixirTesting: ELIXIR_TESTING_VALUES,\n elixirQuality: ELIXIR_QUALITY_VALUES,\n elixirI18n: ELIXIR_I18N_VALUES,\n elixirHttpServer: ELIXIR_HTTP_SERVER_VALUES,\n elixirApplicationFramework: ELIXIR_APPLICATION_FRAMEWORK_VALUES,\n elixirDocumentation: ELIXIR_DOCUMENTATION_VALUES,\n elixirClustering: ELIXIR_CLUSTERING_VALUES,\n elixirDeploy: ELIXIR_DEPLOY_VALUES,\n elixirLibraries: ELIXIR_LIBRARIES_VALUES,\n};\n\nconst EXACT_LABEL_OVERRIDES: Partial<Record<OptionCategory, Partial<Record<string, string>>>> = {\n api: {\n trpc: \"tRPC\",\n orpc: \"oRPC\",\n \"graphql-yoga\": \"GraphQL Yoga\",\n \"apollo-server\": \"Apollo Server\",\n openapi: \"OpenAPI\",\n },\n webFrontend: {\n next: \"Next.js\",\n vinext: \"Vinext\",\n \"react-vite\": \"React + Vite\",\n \"vanilla-vite\": \"Vite (Vanilla TypeScript)\",\n vue: \"Vue 3 + Vite\",\n svelte: \"SvelteKit\",\n redwood: \"RedwoodJS\",\n },\n nativeFrontend: {\n \"native-bare\": \"Expo + StyleSheet\",\n \"native-uniwind\": \"Expo + Uniwind\",\n \"native-unistyles\": \"Expo + Unistyles\",\n },\n runtime: { node: \"Node.js\", workers: \"Cloudflare Workers\" },\n backend: {\n effect: \"Effect\",\n fets: \"feTS\",\n nestjs: \"NestJS\",\n encore: \"Encore.ts\",\n \"self-next\": \"Fullstack Next.js\",\n \"self-vinext\": \"Fullstack Vinext\",\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: {\n cloudflare: \"Cloudflare\",\n fly: \"Fly.io\",\n railway: \"Railway\",\n render: \"Render\",\n netlify: \"Netlify\",\n docker: \"Docker\",\n sst: \"SST\",\n vercel: \"Vercel\",\n },\n serverDeploy: {\n cloudflare: \"Cloudflare\",\n fly: \"Fly.io\",\n railway: \"Railway\",\n render: \"Render\",\n netlify: \"Netlify\",\n docker: \"Docker\",\n sst: \"SST\",\n vercel: \"Vercel\",\n },\n cms: {\n tinacms: \"TinaCMS\",\n directus: \"Directus\",\n keystatic: \"Keystatic\",\n contentful: \"Contentful\",\n },\n auth: {\n \"better-auth-organizations\": \"Better Auth + Organizations\",\n auth0: \"Auth0\",\n workos: \"WorkOS AuthKit\",\n kinde: \"Kinde\",\n passport: \"Passport.js\",\n },\n payments: {\n \"lemon-squeezy\": \"Lemon Squeezy\",\n dodo: \"Dodo Payments\",\n paypal: \"PayPal\",\n xendit: \"Xendit\",\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 signoz: \"SigNoz\",\n datadog: \"Datadog\",\n axiom: \"Axiom\",\n betterstack: \"Better Stack\",\n },\n rateLimit: {\n arcjet: \"Arcjet\",\n \"upstash-ratelimit\": \"Upstash Ratelimit\",\n },\n backendLibraries: {\n effect: \"Effect Core\",\n \"effect-full\": \"Effect Platform + SQL\",\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 mocha: \"Mocha\",\n },\n realtime: {\n \"socket-io\": \"Socket.IO\",\n ws: \"ws\",\n yjs: \"Y.js\",\n },\n jobQueue: {\n bullmq: \"BullMQ\",\n \"trigger-dev\": \"Trigger.dev\",\n },\n i18n: {\n paraglide: \"Paraglide\",\n i18next: \"i18next\",\n \"next-intl\": \"next-intl\",\n },\n search: {\n meilisearch: \"Meilisearch\",\n typesense: \"Typesense\",\n elasticsearch: \"Elasticsearch\",\n opensearch: \"OpenSearch\",\n algolia: \"Algolia\",\n bleve: \"Bleve\",\n },\n vectorDb: {\n pgvector: \"pgvector\",\n qdrant: \"Qdrant\",\n chroma: \"Chroma\",\n pinecone: \"Pinecone\",\n },\n fileStorage: {\n s3: \"AWS S3\",\n r2: \"Cloudflare R2\",\n cloudinary: \"Cloudinary\",\n },\n logging: {\n evlog: \"evlog\",\n },\n cssFramework: {\n tailwind: \"Tailwind CSS\",\n scss: \"SCSS\",\n \"postcss-only\": \"PostCSS Only\",\n \"styled-components\": \"styled-components\",\n },\n uiLibrary: {\n \"shadcn-ui\": \"shadcn/ui\",\n \"shadcn-svelte\": \"shadcn-svelte\",\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 mui: \"MUI\",\n antd: \"Ant Design\",\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 launchdarkly: \"LaunchDarkly\",\n flagsmith: \"Flagsmith\",\n unleash: \"Unleash\",\n },\n integrations: {\n nango: \"Nango\",\n },\n ecommerce: {\n medusa: \"MedusaJS\",\n },\n analytics: {\n plausible: \"Plausible\",\n umami: \"Umami\",\n ga4: \"Google Analytics 4\",\n },\n mobileNavigation: {\n \"expo-router\": \"Expo Router\",\n \"react-navigation\": \"React Navigation\",\n },\n mobileUI: {\n tamagui: \"Tamagui\",\n \"gluestack-ui\": \"Gluestack UI\",\n uniwind: \"Uniwind\",\n unistyles: \"Unistyles\",\n },\n mobileStorage: {\n mmkv: \"MMKV\",\n },\n mobileTesting: {\n maestro: \"Maestro\",\n \"react-native-testing-library\": \"React Native Testing Library\",\n \"maestro-react-native-testing-library\": \"Maestro + RN Testing Library\",\n },\n mobilePush: {\n \"expo-notifications\": \"Expo Notifications\",\n },\n mobileOTA: {\n \"expo-updates\": \"Expo Updates\",\n },\n mobileDeepLinking: {\n \"expo-linking\": \"Expo Linking\",\n },\n mobileLibraries: {\n \"expo-sqlite\": \"Expo SQLite\",\n \"expo-camera\": \"Expo Camera\",\n \"expo-image-picker\": \"Expo Image Picker\",\n \"expo-location\": \"Expo Location\",\n \"expo-sensors\": \"Expo Sensors\",\n \"expo-file-system\": \"Expo File System\",\n \"expo-image\": \"Expo Image\",\n \"expo-audio\": \"Expo Audio\",\n \"expo-video\": \"Expo Video\",\n \"expo-contacts\": \"Expo Contacts\",\n \"expo-calendar\": \"Expo Calendar\",\n \"expo-local-authentication\": \"Expo Local Authentication\",\n \"expo-sharing\": \"Expo Sharing\",\n \"expo-clipboard\": \"Expo Clipboard\",\n \"expo-task-manager\": \"Expo Task Manager\",\n \"expo-background-task\": \"Expo Background Task\",\n \"expo-maps\": \"Expo Maps\",\n \"expo-brightness\": \"Expo Brightness\",\n \"expo-battery\": \"Expo Battery\",\n \"expo-screen-capture\": \"Expo Screen Capture\",\n },\n codeQuality: {\n biome: \"Biome\",\n eslint: \"ESLint\",\n prettier: \"Prettier\",\n oxlint: \"Oxlint\",\n ultracite: \"Ultracite\",\n lefthook: \"Lefthook\",\n husky: \"Husky\",\n knip: \"Knip\",\n gitleaks: \"Gitleaks\",\n ruler: \"Ruler\",\n },\n documentation: {\n starlight: \"Starlight\",\n fumadocs: \"Fumadocs\",\n },\n appShells: {\n pwa: \"PWA\",\n tauri: \"Tauri\",\n electron: \"Electron\",\n capacitor: \"Capacitor\",\n wxt: \"WXT\",\n opentui: \"OpenTUI\",\n },\n appPlatforms: {\n mcp: \"MCP\",\n msw: \"MSW\",\n swr: \"SWR\",\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 devcontainer: \"DevContainer\",\n \"docker-compose\": \"Docker Compose\",\n kong: \"Kong Gateway\",\n \"github-actions\": \"GitHub Actions\",\n axios: \"Axios\",\n firebase: \"Firebase JS SDK\",\n \"graphql-codegen\": \"GraphQL Code Generator\",\n \"openapi-typescript\": \"openapi-typescript\",\n \"apollo-client\": \"Apollo Client\",\n },\n versionChannel: {\n stable: \"Stable\",\n latest: \"Latest\",\n beta: \"Beta\",\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 \"openai-sdk\": \"OpenAI SDK\",\n \"anthropic-sdk\": \"Anthropic SDK\",\n \"google-adk\": \"Google ADK\",\n modelfusion: \"ModelFusion\",\n langchain: \"LangChain\",\n llamaindex: \"LlamaIndex\",\n \"tanstack-ai\": \"TanStack AI\",\n \"ai-cli\": \"AI CLI\",\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 Platform + SQL\",\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 luma: \"Luma\",\n sera: \"Sera\",\n },\n shadcnIconLibrary: {\n lucide: \"Lucide\",\n tabler: \"Tabler Icons\",\n hugeicons: \"HugeIcons\",\n phosphor: \"Phosphor Icons\",\n remixicon: \"Remix Icon\",\n heroicons: \"Heroicons\",\n \"react-icons\": \"React Icons\",\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 rocket: \"Rocket\",\n poem: \"Poem\",\n loco: \"Loco\",\n warp: \"Warp\",\n salvo: \"Salvo\",\n },\n rustFrontend: {\n leptos: \"Leptos\",\n dioxus: \"Dioxus\",\n yew: \"Yew\",\n },\n rustOrm: {\n \"sea-orm\": \"SeaORM\",\n sqlx: \"SQLx\",\n diesel: \"Diesel\",\n mongodb: \"MongoDB Rust Driver\",\n rusqlite: \"rusqlite\",\n \"tokio-postgres\": \"tokio-postgres\",\n },\n rustApi: {\n \"async-graphql\": \"async-graphql\",\n tonic: \"Tonic\",\n jsonrpsee: \"jsonrpsee\",\n },\n rustCli: {\n clap: \"Clap\",\n ratatui: \"Ratatui\",\n },\n rustLibraries: {\n serde: \"Serde\",\n uuid: \"uuid\",\n chrono: \"Chrono\",\n reqwest: \"Reqwest\",\n config: \"config\",\n dashmap: \"DashMap\",\n \"parking-lot\": \"parking_lot\",\n secrecy: \"Secrecy\",\n \"tokio-util\": \"Tokio Util\",\n utoipa: \"utoipa\",\n validator: \"Validator\",\n jsonwebtoken: \"jsonwebtoken\",\n argon2: \"Argon2\",\n \"tokio-test\": \"Tokio Test\",\n mockall: \"Mockall\",\n proptest: \"Proptest\",\n insta: \"Insta\",\n rand: \"rand\",\n regex: \"regex\",\n rayon: \"Rayon\",\n itertools: \"Itertools\",\n rstest: \"rstest\",\n \"cargo-nextest\": \"cargo-nextest\",\n \"cargo-audit\": \"cargo-audit\",\n },\n rustLogging: {\n tracing: \"Tracing\",\n \"env-logger\": \"env_logger\",\n },\n rustErrorHandling: {\n \"anyhow-thiserror\": \"anyhow + thiserror\",\n eyre: \"eyre + color-eyre\",\n },\n rustCaching: {\n moka: \"Moka\",\n redis: \"Redis\",\n },\n rustAuth: {\n oauth2: \"OAuth2\",\n torii: \"Torii\",\n openidconnect: \"OpenID Connect\",\n \"tower-sessions\": \"tower-sessions\",\n },\n rustRealtime: {\n \"tokio-tungstenite\": \"tokio-tungstenite\",\n },\n rustMessageQueue: {\n lapin: \"Lapin (RabbitMQ)\",\n rdkafka: \"rdkafka (Kafka)\",\n \"async-nats\": \"async-nats\",\n },\n rustObservability: {\n opentelemetry: \"OpenTelemetry\",\n metrics: \"metrics\",\n },\n rustTemplating: {\n askama: \"Askama\",\n tera: \"Tera\",\n minijinja: \"MiniJinja\",\n },\n pythonWebFramework: {\n fastapi: \"FastAPI\",\n django: \"Django\",\n flask: \"Flask\",\n litestar: \"Litestar\",\n starlette: \"Starlette\",\n aiohttp: \"aiohttp\",\n streamlit: \"Streamlit\",\n },\n pythonOrm: {\n sqlalchemy: \"SQLAlchemy\",\n sqlmodel: \"SQLModel\",\n \"tortoise-orm\": \"Tortoise ORM\",\n peewee: \"Peewee\",\n pymongo: \"PyMongo\",\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 haystack: \"Haystack\",\n \"pydantic-ai\": \"Pydantic AI\",\n \"google-adk\": \"Google ADK\",\n smolagents: \"smolagents\",\n pytorch: \"PyTorch\",\n transformers: \"Transformers\",\n \"scikit-learn\": \"scikit-learn\",\n tensorflow: \"TensorFlow\",\n mcp: \"MCP Python SDK\",\n },\n pythonAuth: {\n authlib: \"Authlib\",\n jwt: \"JWT (python-jose)\",\n pyjwt: \"PyJWT\",\n \"fastapi-users\": \"FastAPI Users\",\n },\n pythonApi: {\n \"django-rest-framework\": \"Django REST Framework\",\n \"django-ninja\": \"Django Ninja\",\n },\n pythonTaskQueue: {\n celery: \"Celery\",\n rq: \"RQ\",\n dramatiq: \"Dramatiq\",\n huey: \"Huey\",\n taskiq: \"Taskiq\",\n },\n pythonGraphql: {\n strawberry: \"Strawberry\",\n ariadne: \"Ariadne\",\n },\n pythonQuality: {\n ruff: \"Ruff\",\n mypy: \"mypy\",\n pyright: \"Pyright\",\n },\n pythonTesting: {\n pytest: \"pytest\",\n hypothesis: \"Hypothesis\",\n \"pytest-cov\": \"pytest-cov\",\n },\n pythonCaching: {\n redis: \"redis-py\",\n aiocache: \"aiocache\",\n },\n pythonRealtime: {\n \"python-socketio\": \"python-socketio\",\n websockets: \"websockets\",\n },\n pythonObservability: {\n opentelemetry: \"OpenTelemetry\",\n signoz: \"SigNoz\",\n \"prometheus-client\": \"Prometheus Client\",\n },\n pythonCli: {\n typer: \"Typer\",\n click: \"Click\",\n rich: \"Rich\",\n },\n pythonCloudSdk: {\n boto3: \"Boto3\",\n },\n pythonHttpClient: {\n requests: \"Requests\",\n },\n pythonData: {\n numpy: \"NumPy\",\n pandas: \"pandas\",\n scipy: \"SciPy\",\n },\n pythonMedia: {\n pillow: \"Pillow\",\n },\n pythonServer: {\n gunicorn: \"Gunicorn\",\n },\n pythonPackageManager: {\n uv: \"uv\",\n poetry: \"Poetry\",\n },\n pythonMessageQueue: {\n \"confluent-kafka\": \"Confluent Kafka\",\n },\n goWebFramework: {\n gin: \"Gin\",\n echo: \"Echo\",\n fiber: \"Fiber\",\n chi: \"Chi\",\n stdlib: \"net/http\",\n \"go-zero\": \"go-zero\",\n kratos: \"Kratos\",\n httprouter: \"HttpRouter\",\n },\n goOrm: {\n gorm: \"GORM\",\n sqlc: \"sqlc\",\n ent: \"Ent\",\n bun: \"Bun\",\n sqlx: \"sqlx\",\n },\n goApi: {\n \"grpc-go\": \"gRPC-Go\",\n gqlgen: \"gqlgen\",\n \"grpc-gateway\": \"grpc-gateway\",\n \"connect-go\": \"Connect-Go\",\n \"oapi-codegen\": \"oapi-codegen\",\n },\n goCli: {\n cobra: \"Cobra\",\n bubbletea: \"Bubble Tea\",\n \"urfave-cli\": \"urfave/cli\",\n },\n goLogging: {\n zap: \"Zap\",\n zerolog: \"Zerolog\",\n slog: \"slog\",\n logrus: \"Logrus\",\n },\n goAuth: {\n casbin: \"Casbin\",\n jwt: \"golang-jwt\",\n goth: \"Goth\",\n oauth2: \"golang.org/x/oauth2\",\n },\n goTesting: {\n testify: \"Testify\",\n gomock: \"GoMock\",\n testcontainers: \"Testcontainers for Go\",\n \"ginkgo-gomega\": \"Ginkgo + Gomega\",\n mockery: \"mockery\",\n },\n goRealtime: {\n \"gorilla-websocket\": \"Gorilla WebSocket\",\n centrifuge: \"Centrifuge\",\n },\n goMessageQueue: {\n nats: \"NATS\",\n watermill: \"Watermill\",\n \"kafka-go\": \"kafka-go\",\n asynq: \"Asynq\",\n },\n goCaching: {\n redis: \"go-redis\",\n ristretto: \"Ristretto\",\n },\n goConfig: {\n viper: \"Viper\",\n koanf: \"Koanf\",\n },\n goObservability: {\n opentelemetry: \"OpenTelemetry\",\n signoz: \"SigNoz\",\n prometheus: \"Prometheus\",\n },\n goValidation: {\n validator: \"go-playground/validator\",\n },\n goQuality: {\n \"golangci-lint\": \"golangci-lint\",\n },\n goMigrations: {\n \"golang-migrate\": \"golang-migrate\",\n },\n goTemplating: {\n templ: \"templ\",\n },\n goProtoTooling: {\n buf: \"Buf\",\n },\n goDI: {\n fx: \"Uber Fx\",\n },\n javaLanguage: {\n java: \"Java\",\n kotlin: \"Kotlin\",\n },\n javaWebFramework: {\n \"spring-boot\": \"Spring Boot\",\n quarkus: \"Quarkus\",\n micronaut: \"Micronaut\",\n },\n javaBuildTool: {\n maven: \"Maven\",\n },\n javaOrm: {\n \"spring-data-jpa\": \"Spring Data JPA\",\n jooq: \"jOOQ\",\n mybatis: \"MyBatis\",\n },\n javaAuth: {\n \"spring-security\": \"Spring Security\",\n keycloak: \"Keycloak (OAuth2 Resource Server)\",\n },\n javaApi: {\n \"spring-graphql\": \"Spring for GraphQL\",\n \"openapi-generator\": \"OpenAPI Generator\",\n grpc: \"gRPC\",\n },\n javaLogging: {\n logback: \"Logback\",\n log4j2: \"Log4j2\",\n },\n javaLibraries: {\n \"spring-actuator\": \"Spring Boot Actuator\",\n \"spring-validation\": \"Spring Validation\",\n flyway: \"Flyway\",\n liquibase: \"Liquibase\",\n \"springdoc-openapi\": \"Springdoc OpenAPI\",\n lombok: \"Lombok\",\n mapstruct: \"MapStruct\",\n caffeine: \"Caffeine\",\n resilience4j: \"Resilience4j\",\n \"spring-webflux\": \"Spring WebFlux\",\n \"spring-batch\": \"Spring Batch\",\n \"spring-kafka\": \"Spring for Apache Kafka\",\n \"spring-mail\": \"Spring Mail\",\n \"spring-devtools\": \"Spring Boot DevTools\",\n \"micrometer-prometheus\": \"Micrometer Prometheus\",\n thymeleaf: \"Thymeleaf\",\n \"spring-amqp\": \"Spring AMQP (RabbitMQ)\",\n \"opentelemetry-java\": \"OpenTelemetry\",\n \"spring-data-redis\": \"Spring Data Redis\",\n \"spring-data-mongodb\": \"Spring Data MongoDB\",\n \"spring-data-elasticsearch\": \"Spring Data Elasticsearch\",\n \"spring-data-neo4j\": \"Spring Data Neo4j\",\n \"spring-data-cassandra\": \"Spring Data Cassandra\",\n \"spring-data-couchbase\": \"Spring Data Couchbase\",\n \"spring-data-jdbc\": \"Spring Data JDBC\",\n \"spring-data-rest\": \"Spring Data REST\",\n \"spring-quartz\": \"Quartz Scheduler\",\n \"spring-pulsar\": \"Spring for Apache Pulsar\",\n \"spring-integration\": \"Spring Integration\",\n \"spring-websocket\": \"Spring WebSocket\",\n \"spring-rsocket\": \"Spring RSocket\",\n \"spring-hateoas\": \"Spring HATEOAS\",\n \"spring-session-redis\": \"Spring Session Redis\",\n \"spring-session-jdbc\": \"Spring Session JDBC\",\n \"spring-ldap\": \"Spring LDAP\",\n \"spring-oauth2-client\": \"Spring Security OAuth2 Client\",\n \"spring-saml2\": \"Spring Security SAML2\",\n \"spring-restclient\": \"Spring REST Client\",\n },\n javaTestingLibraries: {\n junit5: \"JUnit 5\",\n mockito: \"Mockito\",\n testcontainers: \"Testcontainers\",\n assertj: \"AssertJ\",\n \"rest-assured\": \"REST Assured\",\n wiremock: \"WireMock\",\n awaitility: \"Awaitility\",\n archunit: \"ArchUnit\",\n jqwik: \"jqwik\",\n },\n dotnetWebFramework: {\n \"aspnet-minimal\": \"ASP.NET Core Minimal APIs\",\n \"aspnet-mvc\": \"ASP.NET Core MVC\",\n \"aspnet-blazor\": \"ASP.NET Core Blazor\",\n },\n dotnetOrm: {\n \"ef-core\": \"Entity Framework Core\",\n dapper: \"Dapper\",\n linq2db: \"linq2db\",\n },\n dotnetAuth: {\n \"aspnet-identity\": \"ASP.NET Core Identity\",\n \"duende-identityserver\": \"Duende IdentityServer\",\n \"auth0-aspnet\": \"Auth0 ASP.NET Core\",\n },\n dotnetApi: {\n \"minimal-api\": \"Minimal APIs\",\n \"graphql-hotchocolate\": \"Hot Chocolate GraphQL\",\n \"grpc-dotnet\": \"gRPC for .NET\",\n },\n dotnetTesting: {\n xunit: \"xUnit\",\n nunit: \"NUnit\",\n moq: \"Moq\",\n \"testcontainers-dotnet\": \"Testcontainers for .NET\",\n },\n dotnetJobQueue: {\n hangfire: \"Hangfire\",\n \"quartz-net\": \"Quartz.NET\",\n \"hosted-services\": \"Hosted Services\",\n },\n dotnetRealtime: {\n signalr: \"SignalR\",\n },\n dotnetObservability: {\n \"opentelemetry-dotnet\": \"OpenTelemetry .NET\",\n serilog: \"Serilog\",\n nlog: \"NLog\",\n \"health-checks\": \"Health Checks\",\n },\n dotnetValidation: {\n fluentvalidation: \"FluentValidation\",\n \"data-annotations\": \"Data Annotations\",\n },\n dotnetCaching: {\n redis: \"StackExchange.Redis\",\n \"memory-cache\": \"IMemoryCache\",\n },\n dotnetDeploy: {\n docker: \"Docker\",\n azure: \"Azure\",\n aws: \"AWS\",\n },\n dotnetLibraries: {\n automapper: \"AutoMapper\",\n mediatr: \"MediatR\",\n fastendpoints: \"FastEndpoints\",\n \"api-versioning\": \"ASP.NET API Versioning\",\n scalar: \"Scalar\",\n polly: \"Polly\",\n masstransit: \"MassTransit\",\n rebus: \"Rebus\",\n coravel: \"Coravel\",\n \"magic-onion\": \"MagicOnion\",\n \"prometheus-net\": \"prometheus-net\",\n seq: \"Seq\",\n \"application-insights\": \"Application Insights\",\n sentry: \"Sentry\",\n \"mongodb-driver\": \"MongoDB Driver\",\n nhibernate: \"NHibernate\",\n mapster: \"Mapster\",\n scrutor: \"Scrutor\",\n refit: \"Refit\",\n \"fluent-email\": \"FluentEmail\",\n },\n elixirWebFramework: {\n phoenix: \"Phoenix\",\n \"phoenix-live-view\": \"Phoenix LiveView\",\n },\n elixirOrm: {\n ecto: \"Ecto\",\n \"ecto-sql\": \"Ecto SQL\",\n myxql: \"MyXQL\",\n ecto_sqlite3: \"ecto_sqlite3\",\n },\n elixirAuth: {\n \"phx-gen-auth\": \"phx.gen.auth\",\n ueberauth: \"Ueberauth\",\n guardian: \"Guardian\",\n pow: \"Pow\",\n },\n elixirApi: {\n rest: \"Phoenix REST\",\n absinthe: \"Absinthe GraphQL\",\n grpc: \"gRPC (grpc-elixir)\",\n open_api_spex: \"OpenApiSpex\",\n },\n elixirLibraries: {\n broadway: \"Broadway\",\n nx: \"Nx (Numerical Elixir)\",\n ex_aws: \"ExAws\",\n floki: \"Floki\",\n rustler: \"Rustler\",\n },\n elixirRealtime: {\n channels: \"Phoenix Channels\",\n presence: \"Phoenix Presence\",\n pubsub: \"Phoenix PubSub\",\n \"live-view-streams\": \"LiveView Streams\",\n },\n elixirJobs: {\n oban: \"Oban\",\n quantum: \"Quantum\",\n },\n elixirValidation: {\n \"ecto-changesets\": \"Ecto Changesets\",\n \"nimble-options\": \"NimbleOptions\",\n },\n elixirHttp: {\n req: \"Req\",\n finch: \"Finch\",\n tesla: \"Tesla\",\n },\n elixirJson: {\n jason: \"Jason\",\n },\n elixirEmail: {\n swoosh: \"Swoosh\",\n bamboo: \"Bamboo\",\n },\n elixirCaching: {\n cachex: \"Cachex\",\n nebulex: \"Nebulex\",\n redix: \"Redix\",\n },\n elixirObservability: {\n telemetry: \"Telemetry\",\n opentelemetry: \"OpenTelemetry\",\n prom_ex: \"PromEx\",\n sentry: \"Sentry\",\n },\n elixirTesting: {\n ex_unit: \"ExUnit\",\n mox: \"Mox\",\n bypass: \"Bypass\",\n wallaby: \"Wallaby\",\n stream_data: \"StreamData\",\n ex_machina: \"ExMachina\",\n },\n elixirQuality: {\n credo: \"Credo\",\n dialyxir: \"Dialyxir\",\n sobelow: \"Sobelow\",\n excoveralls: \"ExCoveralls\",\n mix_audit: \"MixAudit\",\n },\n elixirI18n: {\n gettext: \"Gettext\",\n },\n elixirHttpServer: {\n bandit: \"Bandit\",\n cowboy: \"Cowboy\",\n },\n elixirApplicationFramework: {\n ash: \"Ash Framework\",\n },\n elixirDocumentation: {\n ex_doc: \"ExDoc\",\n },\n elixirClustering: {\n libcluster: \"libcluster\",\n },\n elixirDeploy: {\n docker: \"Docker\",\n fly: \"Fly.io\",\n gigalixir: \"Gigalixir\",\n \"mix-release\": \"Mix Release\",\n },\n};\n\nconst OPTION_ALIASES: Partial<Record<OptionCategory, Partial<Record<string, readonly string[]>>>> =\n {\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-vinext\": \"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.split(\"-\").filter(Boolean).map(toStartCaseToken).join(\" \");\n}\n\nfunction getOptionLabel(category: OptionCategory, id: string): string {\n if (category === \"auth\") {\n return (\n getCapabilityDefinitions(\"auth\").find((option) => option.id === id)?.label ??\n humanizeOptionId(id)\n );\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 rateLimit: buildCategoryMetadata(\"rateLimit\"),\n i18n: buildCategoryMetadata(\"i18n\"),\n search: buildCategoryMetadata(\"search\"),\n vectorDb: buildCategoryMetadata(\"vectorDb\"),\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 integrations: buildCategoryMetadata(\"integrations\"),\n ecommerce: buildCategoryMetadata(\"ecommerce\"),\n analytics: buildCategoryMetadata(\"analytics\"),\n mobileNavigation: buildCategoryMetadata(\"mobileNavigation\"),\n mobileUI: buildCategoryMetadata(\"mobileUI\"),\n mobileStorage: buildCategoryMetadata(\"mobileStorage\"),\n mobileTesting: buildCategoryMetadata(\"mobileTesting\"),\n mobilePush: buildCategoryMetadata(\"mobilePush\"),\n mobileOTA: buildCategoryMetadata(\"mobileOTA\"),\n mobileDeepLinking: buildCategoryMetadata(\"mobileDeepLinking\"),\n mobileLibraries: buildCategoryMetadata(\"mobileLibraries\"),\n codeQuality: buildCategoryMetadata(\"codeQuality\"),\n documentation: buildCategoryMetadata(\"documentation\"),\n appShells: buildCategoryMetadata(\"appShells\"),\n appPlatforms: buildCategoryMetadata(\"appPlatforms\"),\n packageManager: buildCategoryMetadata(\"packageManager\"),\n workspaceShape: buildCategoryMetadata(\"workspaceShape\"),\n versionChannel: buildCategoryMetadata(\"versionChannel\"),\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 rustLogging: buildCategoryMetadata(\"rustLogging\"),\n rustErrorHandling: buildCategoryMetadata(\"rustErrorHandling\"),\n rustCaching: buildCategoryMetadata(\"rustCaching\"),\n rustAuth: buildCategoryMetadata(\"rustAuth\"),\n rustRealtime: buildCategoryMetadata(\"rustRealtime\"),\n rustMessageQueue: buildCategoryMetadata(\"rustMessageQueue\"),\n rustObservability: buildCategoryMetadata(\"rustObservability\"),\n rustTemplating: buildCategoryMetadata(\"rustTemplating\"),\n pythonWebFramework: buildCategoryMetadata(\"pythonWebFramework\"),\n pythonOrm: buildCategoryMetadata(\"pythonOrm\"),\n pythonValidation: buildCategoryMetadata(\"pythonValidation\"),\n pythonAi: buildCategoryMetadata(\"pythonAi\"),\n pythonAuth: buildCategoryMetadata(\"pythonAuth\"),\n pythonApi: buildCategoryMetadata(\"pythonApi\"),\n pythonTaskQueue: buildCategoryMetadata(\"pythonTaskQueue\"),\n pythonGraphql: buildCategoryMetadata(\"pythonGraphql\"),\n pythonQuality: buildCategoryMetadata(\"pythonQuality\"),\n pythonTesting: buildCategoryMetadata(\"pythonTesting\"),\n pythonCaching: buildCategoryMetadata(\"pythonCaching\"),\n pythonRealtime: buildCategoryMetadata(\"pythonRealtime\"),\n pythonObservability: buildCategoryMetadata(\"pythonObservability\"),\n pythonCli: buildCategoryMetadata(\"pythonCli\"),\n pythonCloudSdk: buildCategoryMetadata(\"pythonCloudSdk\"),\n pythonHttpClient: buildCategoryMetadata(\"pythonHttpClient\"),\n pythonData: buildCategoryMetadata(\"pythonData\"),\n pythonMedia: buildCategoryMetadata(\"pythonMedia\"),\n pythonServer: buildCategoryMetadata(\"pythonServer\"),\n pythonPackageManager: buildCategoryMetadata(\"pythonPackageManager\"),\n pythonMessageQueue: buildCategoryMetadata(\"pythonMessageQueue\"),\n goWebFramework: buildCategoryMetadata(\"goWebFramework\"),\n goOrm: buildCategoryMetadata(\"goOrm\"),\n goApi: buildCategoryMetadata(\"goApi\"),\n goCli: buildCategoryMetadata(\"goCli\"),\n goLogging: buildCategoryMetadata(\"goLogging\"),\n goAuth: buildCategoryMetadata(\"goAuth\"),\n goTesting: buildCategoryMetadata(\"goTesting\"),\n goRealtime: buildCategoryMetadata(\"goRealtime\"),\n goMessageQueue: buildCategoryMetadata(\"goMessageQueue\"),\n goCaching: buildCategoryMetadata(\"goCaching\"),\n goConfig: buildCategoryMetadata(\"goConfig\"),\n goObservability: buildCategoryMetadata(\"goObservability\"),\n goValidation: buildCategoryMetadata(\"goValidation\"),\n goQuality: buildCategoryMetadata(\"goQuality\"),\n goMigrations: buildCategoryMetadata(\"goMigrations\"),\n goTemplating: buildCategoryMetadata(\"goTemplating\"),\n goProtoTooling: buildCategoryMetadata(\"goProtoTooling\"),\n goDI: buildCategoryMetadata(\"goDI\"),\n javaLanguage: buildCategoryMetadata(\"javaLanguage\"),\n javaWebFramework: buildCategoryMetadata(\"javaWebFramework\"),\n javaBuildTool: buildCategoryMetadata(\"javaBuildTool\"),\n javaOrm: buildCategoryMetadata(\"javaOrm\"),\n javaAuth: buildCategoryMetadata(\"javaAuth\"),\n javaApi: buildCategoryMetadata(\"javaApi\"),\n javaLogging: buildCategoryMetadata(\"javaLogging\"),\n javaLibraries: buildCategoryMetadata(\"javaLibraries\"),\n javaTestingLibraries: buildCategoryMetadata(\"javaTestingLibraries\"),\n dotnetWebFramework: buildCategoryMetadata(\"dotnetWebFramework\"),\n dotnetOrm: buildCategoryMetadata(\"dotnetOrm\"),\n dotnetAuth: buildCategoryMetadata(\"dotnetAuth\"),\n dotnetApi: buildCategoryMetadata(\"dotnetApi\"),\n dotnetTesting: buildCategoryMetadata(\"dotnetTesting\"),\n dotnetJobQueue: buildCategoryMetadata(\"dotnetJobQueue\"),\n dotnetRealtime: buildCategoryMetadata(\"dotnetRealtime\"),\n dotnetObservability: buildCategoryMetadata(\"dotnetObservability\"),\n dotnetValidation: buildCategoryMetadata(\"dotnetValidation\"),\n dotnetCaching: buildCategoryMetadata(\"dotnetCaching\"),\n dotnetDeploy: buildCategoryMetadata(\"dotnetDeploy\"),\n dotnetLibraries: buildCategoryMetadata(\"dotnetLibraries\"),\n elixirWebFramework: buildCategoryMetadata(\"elixirWebFramework\"),\n elixirOrm: buildCategoryMetadata(\"elixirOrm\"),\n elixirAuth: buildCategoryMetadata(\"elixirAuth\"),\n elixirApi: buildCategoryMetadata(\"elixirApi\"),\n elixirRealtime: buildCategoryMetadata(\"elixirRealtime\"),\n elixirJobs: buildCategoryMetadata(\"elixirJobs\"),\n elixirValidation: buildCategoryMetadata(\"elixirValidation\"),\n elixirHttp: buildCategoryMetadata(\"elixirHttp\"),\n elixirJson: buildCategoryMetadata(\"elixirJson\"),\n elixirEmail: buildCategoryMetadata(\"elixirEmail\"),\n elixirCaching: buildCategoryMetadata(\"elixirCaching\"),\n elixirObservability: buildCategoryMetadata(\"elixirObservability\"),\n elixirTesting: buildCategoryMetadata(\"elixirTesting\"),\n elixirQuality: buildCategoryMetadata(\"elixirQuality\"),\n elixirI18n: buildCategoryMetadata(\"elixirI18n\"),\n elixirHttpServer: buildCategoryMetadata(\"elixirHttpServer\"),\n elixirApplicationFramework: buildCategoryMetadata(\"elixirApplicationFramework\"),\n elixirDocumentation: buildCategoryMetadata(\"elixirDocumentation\"),\n elixirClustering: buildCategoryMetadata(\"elixirClustering\"),\n elixirDeploy: buildCategoryMetadata(\"elixirDeploy\"),\n elixirLibraries: buildCategoryMetadata(\"elixirLibraries\"),\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(\n category: OptionCategory,\n optionId: string,\n): 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","import type {\n AI,\n Addons,\n API,\n AstroIntegration,\n Auth,\n Backend,\n CSSFramework,\n Forms,\n Frontend,\n ProjectConfig,\n Runtime,\n StackPartEcosystem,\n StackPartRole,\n UILibrary,\n} from \"./types\";\n\nimport { getCapabilityDisabledReason, normalizeCapabilitySelection } from \"./capabilities\";\nimport { CATEGORY_ORDER, getCategoryDisplayName, type OptionCategory } from \"./option-metadata\";\nimport {\n getUnsupportedWebDeployFrontend,\n hasPWACompatibleFrontend,\n hasTanStackAICompatibleFrontend,\n hasTauriCompatibleFrontend,\n requiresChatSdkVercelAIForExamples,\n UI_LIBRARY_COMPATIBILITY,\n} from \"./stack-compatibility-rules\";\nimport {\n getAddonStackPartBinding,\n getStackPartCompatibilityIssueForPart,\n legacyProjectConfigToStackParts,\n} from \"./stack-graph\";\n\nexport {\n BACKEND_UTILS_COMPATIBLE_BACKENDS,\n getUnsupportedWebDeployFrontend,\n hasDockerComposeCompatibleFrontend,\n hasPWACompatibleFrontend,\n hasTanStackAICompatibleFrontend,\n hasTauriCompatibleFrontend,\n isBackendUtilsCompatibleBackend,\n isExampleAIAllowed,\n isExampleChatSdkAllowed,\n requiresChatSdkVercelAIForExamples,\n UI_LIBRARY_COMPATIBILITY,\n} from \"./stack-compatibility-rules\";\n\nexport type CompatibilityCategory = OptionCategory;\n\nconst SIGNOZ_SUPPORTED_GO_WEB_FRAMEWORKS = new Set([\n \"gin\",\n \"echo\",\n \"fiber\",\n \"chi\",\n \"stdlib\",\n]);\nconst SIGNOZ_SUPPORTED_PYTHON_WEB_FRAMEWORKS = new Set([\"fastapi\"]);\n\nexport function isSignozSupportedGoWebFramework(framework: string): boolean {\n return SIGNOZ_SUPPORTED_GO_WEB_FRAMEWORKS.has(framework);\n}\n\nexport function hasSignozSupportedGoServerTarget(stack: {\n goWebFramework?: string;\n goApi?: string;\n auth?: string;\n}): boolean {\n return (\n isSignozSupportedGoWebFramework(stack.goWebFramework ?? \"none\") ||\n ((stack.goWebFramework ?? \"none\") === \"none\" &&\n (stack.goApi === \"grpc-go\" || stack.auth === \"go-better-auth\"))\n );\n}\n\nexport function isSignozSupportedPythonWebFramework(framework: string): boolean {\n return SIGNOZ_SUPPORTED_PYTHON_WEB_FRAMEWORKS.has(framework);\n}\n\n// ============================================\n// KOTLIN (JAVA ECOSYSTEM) SUPPORT GATE\n// ============================================\n// Kotlin is a `javaLanguage` variant of the Java ecosystem, wired only for the\n// Spring Boot scaffold and the option surface that has Kotlin source templates.\n// This is the single source of truth for that gate — the stack normalization\n// below, `getDisabledReason`, the CLI create path, and the template generator\n// all consume it so the lists can never drift apart.\n\nexport const KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES: ReadonlySet<string> = new Set([\n \"testcontainers\",\n \"rest-assured\",\n \"wiremock\",\n \"awaitility\",\n \"archunit\",\n \"jqwik\",\n]);\n\n// Java annotation-processor tooling the Kotlin scaffold drops rather than\n// blocks: data classes replace Lombok, and MapStruct would need kapt.\nexport const KOTLIN_DROPPED_JAVA_LIBRARIES: ReadonlySet<string> = new Set([\"lombok\", \"mapstruct\"]);\n\nexport type KotlinJavaGateInput = {\n javaWebFramework?: string;\n javaBuildTool?: string;\n javaOrm?: string;\n javaApi?: string;\n javaTestingLibraries?: string[];\n email?: string;\n search?: string;\n caching?: string;\n observability?: string;\n};\n\nexport function getKotlinJavaIncompatibilityReason(stack: KotlinJavaGateInput): string | null {\n if (stack.javaWebFramework !== \"spring-boot\") {\n return \"Kotlin sources are only wired for the Spring Boot scaffold\";\n }\n if (!stack.javaBuildTool || stack.javaBuildTool === \"none\") {\n return \"Kotlin requires Maven or Gradle\";\n }\n if (stack.javaOrm === \"jooq\" || stack.javaOrm === \"mybatis\") {\n return \"The Kotlin scaffold supports Spring Data JPA or no ORM (jOOQ/MyBatis sources are Java-only)\";\n }\n if (stack.javaApi === \"grpc\" || stack.javaApi === \"openapi-generator\") {\n return \"The Kotlin scaffold supports Spring GraphQL or no API layer (gRPC/OpenAPI codegen paths are Java-only)\";\n }\n if (stack.email === \"resend\") {\n return \"The Resend email integration is Java-only in the Java ecosystem scaffold\";\n }\n if (stack.search === \"meilisearch\") {\n return \"The Meilisearch integration is Java-only in the Java ecosystem scaffold\";\n }\n if (stack.caching === \"upstash-redis\") {\n return \"The Upstash Redis integration is Java-only in the Java ecosystem scaffold\";\n }\n if (stack.observability === \"sentry\") {\n return \"The Sentry integration is Java-only in the Java ecosystem scaffold\";\n }\n const unsupportedTestingLibrary = (stack.javaTestingLibraries ?? []).find((library) =>\n KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES.has(library),\n );\n if (unsupportedTestingLibrary) {\n return `The '${unsupportedTestingLibrary}' testing library is not wired for the Kotlin scaffold`;\n }\n return null;\n}\n\nexport type CompatibilityIssue = {\n code: string;\n message: string;\n category?: CompatibilityCategory;\n optionId?: string;\n provided?: Record<string, string | string[]>;\n suggestions?: 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:\n | \"typescript\"\n | \"react-native\"\n | \"rust\"\n | \"python\"\n | \"go\"\n | \"java\"\n | \"elixir\"\n | \"dotnet\";\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 integrations: string;\n ecommerce: 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 rateLimit: string;\n animation: string;\n cssFramework: string;\n uiLibrary: string;\n shadcnBase: string;\n shadcnStyle: string;\n shadcnIconLibrary: string;\n shadcnColorTheme: string;\n shadcnBaseColor: string;\n shadcnFont: string;\n shadcnRadius: string;\n cms: string;\n i18n: string;\n search: string;\n vectorDb: string;\n fileStorage: string;\n mobileNavigation: string;\n mobileUI: string;\n mobileStorage: string;\n mobileTesting: string;\n mobilePush: string;\n mobileOTA: string;\n mobileDeepLinking: string;\n mobileLibraries: string[];\n codeQuality: string[];\n documentation: string[];\n appPlatforms: string[];\n packageManager: string;\n workspaceShape: string;\n versionChannel: 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 rustLogging: string;\n rustErrorHandling: string;\n rustCaching: string;\n rustAuth: string;\n rustRealtime: string;\n rustMessageQueue: string;\n rustObservability: string;\n rustTemplating: string;\n pythonWebFramework: string;\n pythonOrm: string;\n pythonValidation: string;\n pythonAi: string[];\n pythonAuth: string;\n pythonApi: string;\n pythonTaskQueue: string;\n pythonGraphql: string;\n pythonQuality: string;\n pythonTesting: string[];\n pythonCaching: string;\n pythonRealtime: string;\n pythonObservability: string;\n pythonCli: string[];\n pythonCloudSdk: string;\n pythonHttpClient: string;\n pythonData: string[];\n pythonMedia: string;\n pythonServer: string;\n pythonPackageManager: string;\n pythonMessageQueue: string;\n goWebFramework: string;\n goOrm: string;\n goApi: string;\n goCli: string;\n goLogging: string;\n goAuth: string;\n goTesting: string[];\n goRealtime: string;\n goMessageQueue: string;\n goCaching: string;\n goConfig: string;\n goObservability: string;\n goValidation: string;\n goQuality: string;\n goMigrations: string;\n goTemplating: string;\n goProtoTooling: string;\n goDI: string;\n javaLanguage: string;\n javaWebFramework: string;\n javaBuildTool: string;\n javaOrm: string;\n javaAuth: string;\n javaApi: string;\n javaLogging: string;\n javaLibraries: string[];\n javaTestingLibraries: string[];\n dotnetWebFramework: string;\n dotnetOrm: string;\n dotnetAuth: string;\n dotnetApi: string;\n dotnetTesting: string[];\n dotnetJobQueue: string;\n dotnetRealtime: string;\n dotnetObservability: string[];\n dotnetValidation: string;\n dotnetCaching: string;\n dotnetDeploy: string;\n dotnetLibraries: string[];\n elixirWebFramework: string;\n elixirOrm: string;\n elixirAuth: string;\n elixirApi: string;\n elixirRealtime: string;\n elixirJobs: string;\n elixirValidation: string;\n elixirHttp: string;\n elixirJson: string;\n elixirEmail: string;\n elixirCaching: string;\n elixirObservability: string;\n elixirTesting: string;\n elixirQuality: string;\n elixirI18n: string;\n elixirHttpServer: string;\n elixirApplicationFramework: string;\n elixirDocumentation: string;\n elixirClustering: string;\n elixirDeploy: string;\n elixirLibraries: string[];\n};\n\nconst DEFAULT_RUNTIME = \"bun\";\nconst REVENUECAT_NATIVE_FRONTENDS = new Set<Frontend>([\n \"native-bare\",\n \"native-uniwind\",\n \"native-unistyles\",\n]);\nconst PARAGLIDE_COMPATIBLE_FRONTENDS = new Set<Frontend>([\n \"next\",\n \"nuxt\",\n \"vinext\",\n \"tanstack-router\",\n \"tanstack-start\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n]);\nconst INTLAYER_COMPATIBLE_FRONTENDS = new Set<Frontend>([\n \"next\",\n \"vinext\",\n \"tanstack-router\",\n \"tanstack-start\",\n \"react-router\",\n \"react-vite\",\n]);\n\nconst hasRevenueCatCompatibleNativeFrontend = (frontends: readonly string[]) =>\n frontends.some((frontend) => REVENUECAT_NATIVE_FRONTENDS.has(frontend as Frontend));\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\nconst isChatSdkExampleSupported = (stack: CompatibilityInput): boolean => {\n if (stack.ecosystem !== \"typescript\") return false;\n\n if (\n stack.backend === \"self-next\" ||\n stack.backend === \"self-vinext\" ||\n stack.backend === \"self-tanstack-start\"\n ) {\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 requiresChatSdkVercelAIForExamples(stack.backend, stack.runtime, stack.examples);\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 */\n/**\n * Backends that can collapse into a flat single-app layout (no separate\n * apps/server or packages/* workspace). These are the \"thin self\" fullstack\n * frameworks whose web app already owns the server via route handlers AND that\n * expose a `@/*` -> ./src path alias so the inlined env module resolves cleanly.\n * Nuxt is intentionally excluded from the MVP (different alias convention).\n */\nconst SINGLE_APP_SELF_BACKENDS = new Set([\"self-next\", \"self-tanstack-start\"]);\nconst SINGLE_APP_CONTAINER_ADDONS = new Set([\"docker-compose\", \"devcontainer\", \"kong\"]);\nconst FULLSTACK_SELF_BACKENDS = new Set([\n \"self-next\",\n \"self-vinext\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n]);\nconst SINGLE_APP_WEB_FRONTEND_BY_BACKEND: Record<string, string> = {\n \"self-next\": \"next\",\n \"self-tanstack-start\": \"tanstack-start\",\n};\n\n/**\n * A single-app (flat) layout is only safe for a \"thin self\" stack that emits no\n * sibling workspace package (database/orm, better-auth server, trpc/orpc\n * packages/api, payments, email, etc.) and no separate native/server app. For\n * anything else, `single-app` is normalized back to `monorepo` so we never emit\n * a broken flat layout. appPlatforms (turborepo/nx) are ignored here — the\n * generator drops the workspace tooling when it flattens.\n */\nexport function stackQualifiesForSingleApp(stack: CompatibilityInput): boolean {\n if (!SINGLE_APP_SELF_BACKENDS.has(stack.backend)) return false;\n if ((stack.appPlatforms ?? []).some((addon) => SINGLE_APP_CONTAINER_ADDONS.has(addon))) {\n return false;\n }\n\n const nativeFrontends = (stack.nativeFrontend ?? []).filter((f) => f && f !== \"none\");\n if (nativeFrontends.length > 0) return false;\n\n const webFrontends = (stack.webFrontend ?? []).filter((f) => f && f !== \"none\");\n if (webFrontends.length !== 1) return false;\n if (webFrontends[0] !== SINGLE_APP_WEB_FRONTEND_BY_BACKEND[stack.backend]) return false;\n\n const siblingPackageScalars = [\n stack.api,\n stack.database,\n stack.orm,\n stack.auth,\n stack.payments,\n stack.email,\n stack.fileUpload,\n stack.realtime,\n stack.jobQueue,\n stack.caching,\n stack.rateLimit,\n stack.i18n,\n stack.search,\n stack.vectorDb,\n stack.fileStorage,\n stack.cms,\n stack.aiSdk,\n stack.analytics,\n stack.featureFlags,\n stack.integrations,\n stack.ecommerce,\n stack.observability,\n stack.logging,\n stack.webDeploy,\n stack.serverDeploy,\n ];\n if (siblingPackageScalars.some((value) => value && value !== \"none\")) return false;\n\n const nonNoneExamples = (stack.examples ?? []).filter((e) => e && e !== \"none\");\n if (nonNoneExamples.length > 0) return false;\n\n return true;\n}\n\nconst usesCloudflareFullstackRuntime = (stack: CompatibilityInput): boolean =>\n stack.webDeploy === \"cloudflare\" && FULLSTACK_SELF_BACKENDS.has(stack.backend);\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 // Newer optional fields may be absent from older callers and fixtures. Treat\n // them as \"none\" before service overrides report schema-default adjustments.\n if (nextStack.vectorDb === undefined) {\n nextStack.vectorDb = \"none\";\n }\n if (nextStack.integrations === undefined) {\n nextStack.integrations = \"none\";\n }\n if (nextStack.ecommerce === undefined) {\n nextStack.ecommerce = \"none\";\n }\n let changed = false;\n const notes: CompatibilityAnalysisResult[\"notes\"] = {};\n const changes: CompatibilityAdjustment[] = [];\n\n if (\n nextStack.observability === \"signoz\" &&\n (nextStack.backend === \"none\" || nextStack.backend === \"convex\")\n ) {\n nextStack.observability = \"none\";\n changed = true;\n changes.push({\n category: \"observability\",\n message: \"Observability set to 'None' (SigNoz tracing requires a generated server target)\",\n });\n }\n\n if (\n nextStack.observability === \"signoz\" &&\n (nextStack.backend === \"self-tanstack-start\" || nextStack.backend === \"self-astro\")\n ) {\n nextStack.observability = \"none\";\n changed = true;\n changes.push({\n category: \"observability\",\n message:\n \"Observability set to 'None' (SigNoz tracing is not yet bootstrapped for this fullstack frontend)\",\n });\n }\n\n if (\n nextStack.observability === \"signoz\" &&\n nextStack.webDeploy === \"cloudflare\" &&\n (nextStack.backend === \"self\" || nextStack.backend.startsWith(\"self-\"))\n ) {\n nextStack.observability = \"none\";\n changed = true;\n changes.push({\n category: \"observability\",\n message:\n \"Observability set to 'None' (SigNoz's Node SDK is incompatible with Cloudflare-hosted fullstack apps)\",\n });\n }\n\n if (\n nextStack.ecosystem !== \"typescript\" &&\n nextStack.ecosystem !== \"react-native\" &&\n nextStack.codeQuality.includes(\"knip\")\n ) {\n nextStack.codeQuality = nextStack.codeQuality.filter((addon) => addon !== \"knip\");\n changed = true;\n changes.push({\n category: \"codeQuality\",\n message: \"Removed Knip (Knip requires a TypeScript or React Native workspace)\",\n });\n }\n\n if (nextStack.ecosystem === \"react-native\") {\n const supportedCodeQuality = new Set([\"knip\", \"gitleaks\"]);\n const filteredCodeQuality = nextStack.codeQuality.filter((addon) =>\n supportedCodeQuality.has(addon),\n );\n if (filteredCodeQuality.length !== nextStack.codeQuality.length) {\n nextStack.codeQuality = filteredCodeQuality;\n changed = true;\n changes.push({\n category: \"codeQuality\",\n message: \"Removed code-quality tools that are not supported by React Native projects\",\n });\n }\n }\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 vectorDb: \"none\",\n rateLimit: \"none\",\n fileStorage: \"none\",\n integrations: \"none\",\n ecommerce: \"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({\n category: \"backend\",\n message: \"Removed Solid (incompatible with Convex)\",\n });\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({\n category: \"backend\",\n message: \"Removed Astro (incompatible with Convex)\",\n });\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 if (nextStack.backend === \"none\") {\n // No backend means no runtime, database, orm, api, auth, dbSetup, serverDeploy\n const shouldKeepRevenueCatPayments =\n nextStack.payments === \"revenuecat\" &&\n (nextStack.ecosystem === \"react-native\" ||\n hasRevenueCatCompatibleNativeFrontend(nextStack.nativeFrontend));\n const noneOverrides: Partial<CompatibilityInput> = {\n runtime: \"none\",\n database: \"none\",\n orm: \"none\",\n api: \"none\",\n dbSetup: \"none\",\n serverDeploy: \"none\",\n search: \"none\",\n vectorDb: \"none\",\n rateLimit: \"none\",\n fileStorage: \"none\",\n integrations: \"none\",\n ecommerce: \"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 if (!shouldKeepRevenueCatPayments && nextStack.payments !== \"none\") {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Payments set to 'none' (no backend)\",\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({\n category: \"backend\",\n message: \"Examples cleared (no backend)\",\n });\n }\n }\n\n // Self (fullstack) backend constraints\n if (\n nextStack.backend === \"self-next\" ||\n nextStack.backend === \"self-vinext\" ||\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 (nextStack.backend === \"self-vinext\" && !nextStack.webFrontend.includes(\"vinext\")) {\n nextStack.webFrontend = [\"vinext\"];\n changed = true;\n changes.push({\n category: \"backend\",\n message: \"Frontend set to 'Vinext' (required for Vinext 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 if (nextStack.backend === \"effect\") {\n if (nextStack.backendLibraries !== \"effect-full\") {\n nextStack.backendLibraries = \"effect-full\";\n changed = true;\n changes.push({\n category: \"backendLibraries\",\n message: \"Effect services set to 'Effect Platform + SQL' (required for Effect backend)\",\n });\n }\n if (nextStack.validation !== \"effect-schema\") {\n nextStack.validation = \"effect-schema\";\n changed = true;\n changes.push({\n category: \"validation\",\n message: \"Validation set to 'Effect Schema' (required for Effect backend)\",\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({\n category: \"runtime\",\n message: \"Backend set to 'Hono' (required for Workers)\",\n });\n }\n\n // The SigNoz TypeScript scaffold uses the OpenTelemetry Node SDK. Bun/fetch\n // is instrumented explicitly, but the SDK itself is not Workers-compatible.\n if (nextStack.runtime === \"workers\" && nextStack.observability === \"signoz\") {\n nextStack.observability = \"none\";\n changed = true;\n changes.push({\n category: \"observability\",\n message: \"Observability set to 'None' (SigNoz requires the Node.js or Bun runtime)\",\n });\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 if (\n (nextStack.runtime === \"workers\" || usesCloudflareFullstackRuntime(nextStack)) &&\n nextStack.integrations !== \"none\"\n ) {\n nextStack.integrations = \"none\";\n changed = true;\n changes.push({\n category: \"integrations\",\n message:\n \"Integrations set to 'none' (Nango's Node SDK is not available on Cloudflare 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-vinext\" &&\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({\n category: \"database\",\n message: \"ORM set to 'None' (no database selected)\",\n });\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({\n category: \"orm\",\n message: \"Database set to 'SQLite' (required for ORM)\",\n });\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 const hasStandaloneViteFrontend = nextStack.webFrontend.some((frontend) =>\n [\"vanilla-vite\", \"vue\"].includes(frontend),\n );\n if (hasStandaloneViteFrontend && [\"trpc\", \"orpc\", \"ts-rest\", \"garph\"].includes(nextStack.api)) {\n nextStack.api = \"graphql-yoga\";\n changed = true;\n changes.push({\n category: \"api\",\n message: \"API set to 'GraphQL Yoga' (supported by standalone Vite frontends)\",\n });\n }\n\n // Nuxt, Svelte, Solid, SolidStart require oRPC for React-only API clients.\n const needsOrpc = nextStack.webFrontend.some((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"solid-start\"].includes(f),\n );\n if (needsOrpc && (nextStack.api === \"trpc\" || nextStack.api === \"apollo-server\")) {\n nextStack.api = \"orpc\";\n changed = true;\n changes.push({\n category: \"api\",\n message: \"API set to 'oRPC' (required for this frontend)\",\n });\n }\n\n // Astro with non-React integration requires oRPC for React-only API clients.\n if (\n nextStack.webFrontend.includes(\"astro\") &&\n nextStack.astroIntegration !== \"react\" &&\n (nextStack.api === \"trpc\" || nextStack.api === \"apollo-server\")\n ) {\n const apiName = nextStack.api === \"apollo-server\" ? \"Apollo Server\" : \"tRPC\";\n nextStack.api = \"orpc\";\n changed = true;\n changes.push({\n category: \"api\",\n message: `API set to 'oRPC' (${apiName} 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 // Redis is a key-value store without SQL support — better-auth requires SQL tables\n const isBetterAuthSelection =\n nextStack.auth === \"better-auth\" || nextStack.auth === \"better-auth-organizations\";\n\n if (isBetterAuthSelection && nextStack.database === \"redis\") {\n nextStack.auth = \"none\";\n changed = true;\n changes.push({\n category: \"auth\",\n message: \"Auth set to 'None' (Better Auth requires a SQL database, not Redis)\",\n });\n }\n\n const ormsWithoutBetterAuth = [\"typeorm\", \"sequelize\", \"mikroorm\"];\n if (isBetterAuthSelection && ormsWithoutBetterAuth.includes(nextStack.orm)) {\n nextStack.auth = \"none\";\n changed = true;\n changes.push({\n category: \"auth\",\n message: `Auth set to 'None' (${nextStack.orm} has no Better Auth adapter)`,\n });\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 // CACHING CONSTRAINTS\n // ============================================\n\n // Self-hosted Redis caching (ioredis) is TypeScript-only; other ecosystems\n // have their own native caching fields (goCaching/rustCaching/pythonCaching).\n if (nextStack.caching === \"redis\" && nextStack.ecosystem !== \"typescript\") {\n nextStack.caching = \"none\";\n changed = true;\n changes.push({\n category: \"caching\",\n message:\n \"Caching set to 'None' (self-hosted Redis is only available for the TypeScript ecosystem)\",\n });\n }\n\n // ============================================\n // SEARCH CONSTRAINTS\n // ============================================\n\n // Bleve is a Go-only embedded search engine; drop it for non-Go ecosystems.\n if (nextStack.search === \"bleve\" && nextStack.ecosystem !== \"go\") {\n nextStack.search = \"none\";\n changed = true;\n changes.push({\n category: \"search\",\n message: \"Search set to 'None' (Bleve is only available for the Go ecosystem)\",\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\" && nextStack.auth !== \"better-auth-organizations\") {\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 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 if (nextStack.payments === \"revenuecat\") {\n const hasNativeFrontend =\n nextStack.ecosystem === \"react-native\" ||\n hasRevenueCatCompatibleNativeFrontend(nextStack.nativeFrontend);\n if (!hasNativeFrontend) {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message: \"Payments set to 'None' (RevenueCat requires a native frontend)\",\n });\n }\n }\n\n if (nextStack.payments === \"paypal\") {\n const hasWebFrontend = nextStack.webFrontend.some((f) => f !== \"none\");\n if (!hasWebFrontend || [\"none\", \"convex\"].includes(nextStack.backend)) {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message: hasWebFrontend\n ? \"Payments set to 'None' (PayPal requires a standalone or fullstack backend)\"\n : \"Payments set to 'None' (PayPal requires a web frontend)\",\n });\n }\n }\n\n if (nextStack.payments === \"xendit\" && [\"none\", \"convex\"].includes(nextStack.backend)) {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message: \"Payments set to 'None' (Xendit Payment Sessions require a server backend)\",\n });\n }\n\n if (\n [\"openai-sdk\", \"anthropic-sdk\"].includes(nextStack.aiSdk) &&\n [\"none\", \"convex\"].includes(nextStack.backend)\n ) {\n nextStack.aiSdk = \"none\";\n changed = true;\n changes.push({\n category: \"ai\",\n message: \"AI SDK set to 'None' (direct provider SDKs require a backend)\",\n });\n }\n\n if (nextStack.realtime === \"ws\" && nextStack.backend !== \"express\") {\n nextStack.realtime = \"none\";\n changed = true;\n changes.push({\n category: \"realtime\",\n message: \"Realtime set to 'None' (the ws integration requires Express)\",\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 let hasNativeFrontend = nextStack.nativeFrontend.some((f) => f !== \"none\");\n\n if (nextStack.ecosystem === \"react-native\") {\n const reactNativeOnlyCategories = [\n [\"webFrontend\", [\"none\"], \"Web frontend set to 'None' (React Native ecosystem)\"],\n [\"backend\", \"none\", \"Backend set to 'None' (React Native ecosystem)\"],\n [\"runtime\", \"none\", \"Runtime set to 'None' (React Native ecosystem)\"],\n [\"api\", \"none\", \"API set to 'None' (React Native ecosystem)\"],\n [\"database\", \"none\", \"Database set to 'None' (React Native ecosystem)\"],\n [\"orm\", \"none\", \"ORM set to 'None' (React Native ecosystem)\"],\n [\"dbSetup\", \"none\", \"Database setup set to 'None' (React Native ecosystem)\"],\n [\"webDeploy\", \"none\", \"Web deployment set to 'None' (React Native ecosystem)\"],\n [\"serverDeploy\", \"none\", \"Server deployment set to 'None' (React Native ecosystem)\"],\n [\"cssFramework\", \"none\", \"CSS framework set to 'None' (React Native ecosystem)\"],\n [\"uiLibrary\", \"none\", \"UI library set to 'None' (React Native ecosystem)\"],\n [\"testing\", \"none\", \"Web testing set to 'None' (React Native ecosystem)\"],\n [\"forms\", \"none\", \"Web forms set to 'None' (React Native ecosystem)\"],\n [\"stateManagement\", \"none\", \"Web state management set to 'None' (React Native ecosystem)\"],\n [\"animation\", \"none\", \"Web animation set to 'None' (React Native ecosystem)\"],\n [\"realtime\", \"none\", \"Realtime set to 'None' (React Native ecosystem)\"],\n [\"jobQueue\", \"none\", \"Job queue set to 'None' (React Native ecosystem)\"],\n [\"fileUpload\", \"none\", \"File upload set to 'None' (React Native ecosystem)\"],\n [\"email\", \"none\", \"Email set to 'None' (React Native ecosystem)\"],\n [\"search\", \"none\", \"Search set to 'None' (React Native ecosystem)\"],\n [\"vectorDb\", \"none\", \"Vector database set to 'None' (React Native ecosystem)\"],\n [\"rateLimit\", \"none\", \"Rate limiting set to 'None' (React Native ecosystem)\"],\n [\"fileStorage\", \"none\", \"File storage set to 'None' (React Native ecosystem)\"],\n [\"cms\", \"none\", \"CMS set to 'None' (React Native ecosystem)\"],\n [\"caching\", \"none\", \"Caching set to 'None' (React Native ecosystem)\"],\n [\"i18n\", \"none\", \"i18n set to 'None' (React Native ecosystem)\"],\n [\"featureFlags\", \"none\", \"Feature flags set to 'None' (React Native ecosystem)\"],\n [\"ecommerce\", \"none\", \"E-commerce set to 'None' (React Native ecosystem)\"],\n [\"integrations\", \"none\", \"Integrations set to 'None' (React Native ecosystem)\"],\n [\"analytics\", \"none\", \"Analytics set to 'None' (React Native ecosystem)\"],\n [\"aiSdk\", \"none\", \"AI SDK set to 'None' (React Native ecosystem)\"],\n [\"backendLibraries\", \"none\", \"Backend libraries set to 'None' (React Native ecosystem)\"],\n [\"examples\", [], \"Examples cleared (React Native ecosystem)\"],\n ] as const;\n\n for (const [category, value, message] of reactNativeOnlyCategories) {\n const currentValue = nextStack[category];\n const isSameArray =\n Array.isArray(currentValue) &&\n Array.isArray(value) &&\n currentValue.length === value.length &&\n currentValue.every((entry, index) => entry === value[index]);\n if (Array.isArray(value) ? !isSameArray : currentValue !== value) {\n (nextStack as Record<string, unknown>)[category] = Array.isArray(value)\n ? [...value]\n : value;\n changed = true;\n changes.push({ category, message });\n }\n }\n\n if (nextStack.payments !== \"none\" && nextStack.payments !== \"revenuecat\") {\n nextStack.payments = \"none\";\n changed = true;\n changes.push({\n category: \"payments\",\n message: \"Payments set to 'None' (React Native payments currently support RevenueCat only)\",\n });\n }\n\n if (!hasNativeFrontend) {\n nextStack.nativeFrontend = [\"native-bare\"];\n hasNativeFrontend = true;\n changed = true;\n changes.push({\n category: \"nativeFrontend\",\n message: \"Native frontend set to 'Expo + StyleSheet' (React Native ecosystem)\",\n });\n }\n }\n\n if (!hasNativeFrontend) {\n const nativeOnlyCategories = [\n [\"mobileNavigation\", \"none\", \"Mobile navigation set to 'None' (no native frontend)\"],\n [\"mobileUI\", \"none\", \"Mobile UI set to 'None' (no native frontend)\"],\n [\"mobileStorage\", \"none\", \"Mobile storage set to 'None' (no native frontend)\"],\n [\"mobileTesting\", \"none\", \"Mobile testing set to 'None' (no native frontend)\"],\n [\"mobilePush\", \"none\", \"Mobile push set to 'None' (no native frontend)\"],\n [\"mobileOTA\", \"none\", \"Mobile OTA set to 'None' (no native frontend)\"],\n [\"mobileDeepLinking\", \"none\", \"Mobile deep linking set to 'None' (no native frontend)\"],\n ] as const;\n\n for (const [category, value, message] of nativeOnlyCategories) {\n if (nextStack[category] !== value) {\n nextStack[category] = value;\n changed = true;\n changes.push({ category, message });\n }\n }\n if ((nextStack.mobileLibraries?.length ?? 0) > 0) {\n nextStack.mobileLibraries = [];\n changed = true;\n changes.push({\n category: \"mobileLibraries\",\n message: \"Mobile libraries cleared (no native frontend)\",\n });\n }\n } else {\n if (nextStack.mobileNavigation === \"none\") {\n nextStack.mobileNavigation = \"expo-router\";\n changed = true;\n changes.push({\n category: \"mobileNavigation\",\n message: \"Mobile navigation set to 'Expo Router' (native frontend selected)\",\n });\n }\n\n if (nextStack.mobileDeepLinking === \"none\" && nextStack.auth !== \"none\") {\n nextStack.mobileDeepLinking = \"expo-linking\";\n changed = true;\n changes.push({\n category: \"mobileDeepLinking\",\n message: \"Mobile deep linking set to 'Expo Linking' (required for mobile auth redirects)\",\n });\n }\n\n if (nextStack.nativeFrontend.includes(\"native-uniwind\") && nextStack.mobileUI !== \"uniwind\") {\n nextStack.mobileUI = \"uniwind\";\n changed = true;\n changes.push({\n category: \"mobileUI\",\n message: \"Mobile UI set to 'Uniwind' (required by Expo + Uniwind)\",\n });\n }\n\n if (\n nextStack.nativeFrontend.includes(\"native-unistyles\") &&\n nextStack.mobileUI !== \"unistyles\"\n ) {\n nextStack.mobileUI = \"unistyles\";\n changed = true;\n changes.push({\n category: \"mobileUI\",\n message: \"Mobile UI set to 'Unistyles' (required by Expo + Unistyles)\",\n });\n }\n }\n\n // UI libraries requiring Tailwind - auto-adjust CSS framework or clear UI library\n const styledComponentsFrontends = new Set([\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"redwood\",\n ]);\n if (\n nextStack.cssFramework === \"styled-components\" &&\n !nextStack.webFrontend.some((frontend) => styledComponentsFrontends.has(frontend))\n ) {\n nextStack.cssFramework = \"none\";\n changed = true;\n changes.push({\n category: \"cssFramework\",\n message: \"CSS framework set to 'None' (styled-components requires a React frontend)\",\n });\n }\n\n const requiresTailwind = [\"shadcn-ui\", \"shadcn-svelte\", \"daisyui\", \"nextui\"].includes(\n nextStack.uiLibrary,\n );\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\", \"mui\", \"antd\"];\n const reactFrontends = [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n ];\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 if (nextStack.uiLibrary === \"shadcn-svelte\") {\n const hasSvelteFrontend = nextStack.webFrontend.includes(\"svelte\");\n const hasAstroSvelte =\n nextStack.webFrontend.includes(\"astro\") && nextStack.astroIntegration === \"svelte\";\n if (!hasSvelteFrontend && !hasAstroSvelte && nextStack.webFrontend.some((f) => f !== \"none\")) {\n nextStack.uiLibrary = \"daisyui\";\n changed = true;\n changes.push({\n category: \"uiLibrary\",\n message:\n \"UI library changed to 'daisyUI' (shadcn-svelte requires SvelteKit or Astro + Svelte)\",\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\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 for (const platform of [\"electron\", \"capacitor\"] as const) {\n if (\n nextStack.appPlatforms.includes(platform) &&\n !validateAddonCompatibility(platform, nextStack.webFrontend as Frontend[]).isCompatible\n ) {\n nextStack.appPlatforms = nextStack.appPlatforms.filter((addon) => addon !== platform);\n changed = true;\n changes.push({\n category: \"appPlatforms\",\n message: `${platform === \"electron\" ? \"Electron\" : \"Capacitor\"} removed (requires compatible frontend)`,\n });\n }\n }\n\n for (const platform of [\"docker-compose\", \"devcontainer\", \"kong\"] as const) {\n if (!nextStack.appPlatforms.includes(platform)) continue;\n const reason = getDisabledReason(nextStack, \"appPlatforms\", platform);\n if (!reason) continue;\n\n nextStack.appPlatforms = nextStack.appPlatforms.filter((addon) => addon !== platform);\n changed = true;\n const label =\n platform === \"docker-compose\"\n ? \"Docker Compose\"\n : platform === \"devcontainer\"\n ? \"DevContainer\"\n : \"Kong Gateway\";\n changes.push({\n category: \"appPlatforms\",\n message: `${label} removed (${reason})`,\n });\n }\n\n if (\n nextStack.appPlatforms.includes(\"graphql-codegen\") &&\n ![\"garph\", \"graphql-yoga\", \"apollo-server\"].includes(nextStack.api) &&\n !nextStack.webFrontend.includes(\"redwood\")\n ) {\n nextStack.appPlatforms = nextStack.appPlatforms.filter(\n (platform) => platform !== \"graphql-codegen\",\n );\n changed = true;\n changes.push({\n category: \"appPlatforms\",\n message: \"GraphQL Code Generator removed (requires a GraphQL API selection)\",\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 const hasStandaloneViteFrontend = nextStack.webFrontend.some((frontend) =>\n [\"vanilla-vite\", \"vue\"].includes(frontend),\n );\n if (hasStandaloneViteFrontend && nextStack.forms !== \"none\") {\n nextStack.forms = \"none\";\n changed = true;\n changes.push({\n category: \"forms\",\n message: \"Forms set to 'None' (standalone Vue and Vanilla integrations are not wired yet)\",\n });\n }\n if (hasStandaloneViteFrontend && nextStack.cms !== \"none\" && nextStack.cms !== \"contentful\") {\n nextStack.cms = \"none\";\n changed = true;\n changes.push({\n category: \"cms\",\n message: \"CMS set to 'None' (standalone Vue and Vanilla CMS templates are not wired yet)\",\n });\n }\n if (hasStandaloneViteFrontend && nextStack.featureFlags !== \"none\") {\n nextStack.featureFlags = \"none\";\n changed = true;\n changes.push({\n category: \"featureFlags\",\n message:\n \"Feature flags set to 'None' (standalone Vue and Vanilla client integrations are not wired yet)\",\n });\n }\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 // PYTHON ECOSYSTEM CONSTRAINTS\n // ============================================\n\n if (nextStack.ecosystem === \"python\") {\n if (\n nextStack.pythonObservability === \"signoz\" &&\n !isSignozSupportedPythonWebFramework(nextStack.pythonWebFramework)\n ) {\n nextStack.pythonObservability = \"none\";\n changed = true;\n changes.push({\n category: \"pythonObservability\",\n message: \"Python observability set to 'None' (SigNoz request tracing is wired for FastAPI)\",\n });\n }\n if (nextStack.pythonWebFramework !== \"django\" && nextStack.pythonApi !== \"none\") {\n nextStack.pythonApi = \"none\";\n changed = true;\n changes.push({\n category: \"pythonWebFramework\",\n message: \"Python API framework set to 'None' (DRF and Django Ninja require Django)\",\n });\n }\n if (nextStack.pythonOrm === \"pymongo\" && nextStack.database !== \"mongodb\") {\n nextStack.database = \"mongodb\";\n changed = true;\n changes.push({\n category: \"pythonOrm\",\n message: \"Database set to MongoDB (required by PyMongo)\",\n });\n }\n if (\n nextStack.pythonOrm === \"pymongo\" &&\n nextStack.dbSetup !== \"mongodb-atlas\" &&\n nextStack.dbSetup !== \"none\" &&\n nextStack.dbSetup !== \"docker\"\n ) {\n // This runs after the generic DB-setup normalization, so clear setups\n // that only support relational databases (Neon, Supabase, Turso, ...).\n nextStack.dbSetup = \"none\";\n changed = true;\n changes.push({\n category: \"pythonOrm\",\n message: \"DB Setup set to 'None' (incompatible with MongoDB)\",\n });\n }\n if (\n nextStack.database === \"mongodb\" &&\n nextStack.pythonOrm !== \"pymongo\" &&\n nextStack.pythonOrm !== \"none\"\n ) {\n nextStack.database = \"sqlite\";\n changed = true;\n changes.push({\n category: \"database\",\n message: `Database set to SQLite (MongoDB requires PyMongo, not ${nextStack.pythonOrm})`,\n });\n }\n if (\n (nextStack.pythonWebFramework === \"none\" ||\n nextStack.pythonWebFramework === \"aiohttp\" ||\n nextStack.pythonWebFramework === \"starlette\" ||\n nextStack.pythonWebFramework === \"streamlit\") &&\n nextStack.pythonGraphql !== \"none\"\n ) {\n nextStack.pythonGraphql = \"none\";\n changed = true;\n changes.push({\n category: \"pythonGraphql\",\n message: \"GraphQL set to 'None' (only wired for FastAPI, Django, Flask, and Litestar)\",\n });\n }\n if (\n (nextStack.pythonWebFramework === \"none\" ||\n nextStack.pythonWebFramework === \"aiohttp\" ||\n nextStack.pythonWebFramework === \"starlette\" ||\n nextStack.pythonWebFramework === \"streamlit\") &&\n nextStack.pythonAuth !== \"none\"\n ) {\n nextStack.pythonAuth = \"none\";\n changed = true;\n changes.push({\n category: \"pythonAuth\",\n message: `Auth set to 'None' (auth routes are not wired for ${nextStack.pythonWebFramework})`,\n });\n }\n if (\n (nextStack.pythonWebFramework === \"streamlit\" || nextStack.pythonWebFramework === \"none\") &&\n nextStack.pythonObservability === \"prometheus-client\"\n ) {\n nextStack.pythonObservability = \"none\";\n changed = true;\n changes.push({\n category: \"pythonObservability\",\n message:\n \"Observability set to 'None' (prometheus-client needs an HTTP server to expose /metrics)\",\n });\n }\n if (\n nextStack.pythonServer === \"gunicorn\" &&\n (nextStack.pythonWebFramework === \"streamlit\" || nextStack.pythonWebFramework === \"none\")\n ) {\n nextStack.pythonServer = \"none\";\n changed = true;\n changes.push({\n category: \"pythonServer\",\n message: \"Production server set to 'None' (Gunicorn requires a WSGI, ASGI, or aiohttp app)\",\n });\n }\n }\n\n if (\n nextStack.ecosystem === \"go\" &&\n nextStack.goObservability === \"signoz\" &&\n !hasSignozSupportedGoServerTarget(nextStack)\n ) {\n nextStack.goObservability = \"none\";\n changed = true;\n changes.push({\n category: \"goObservability\",\n message:\n \"Go observability set to 'None' (SigNoz requires an instrumented HTTP, gRPC, or Go Better Auth server target)\",\n });\n }\n\n // ============================================\n // JAVA ECOSYSTEM CONSTRAINTS\n // ============================================\n\n if (nextStack.ecosystem === \"java\") {\n if (nextStack.javaBuildTool === \"none\") {\n if (nextStack.javaWebFramework !== \"none\") {\n nextStack.javaWebFramework = \"none\";\n changed = true;\n changes.push({\n category: \"javaBuildTool\",\n message: \"Java web framework set to 'None' (source-only Java does not use a framework)\",\n });\n }\n\n if (nextStack.javaTestingLibraries.some((library) => library !== \"none\")) {\n nextStack.javaTestingLibraries = [];\n changed = true;\n changes.push({\n category: \"javaBuildTool\",\n message:\n \"Java testing libraries cleared (a build tool is required for test dependencies)\",\n });\n }\n }\n\n if (nextStack.javaWebFramework !== \"spring-boot\" || nextStack.javaBuildTool === \"none\") {\n if (nextStack.javaOrm !== \"none\") {\n nextStack.javaOrm = \"none\";\n changed = true;\n changes.push({\n category: \"javaWebFramework\",\n message: \"Java ORM set to 'None' (current scaffold only supports it with Spring Boot)\",\n });\n }\n\n if (nextStack.javaAuth !== \"none\") {\n nextStack.javaAuth = \"none\";\n changed = true;\n changes.push({\n category: \"javaWebFramework\",\n message: \"Java auth set to 'None' (current scaffold only supports it with Spring Boot)\",\n });\n }\n\n if (nextStack.javaApi !== \"none\") {\n nextStack.javaApi = \"none\";\n changed = true;\n changes.push({\n category: \"javaWebFramework\",\n message: \"Java API set to 'None' (current scaffold only supports it with Spring Boot)\",\n });\n }\n\n if (nextStack.javaLibraries.some((library) => library !== \"none\")) {\n nextStack.javaLibraries = [];\n changed = true;\n changes.push({\n category: \"javaWebFramework\",\n message: \"Java libraries cleared (Spring libraries require Spring Boot)\",\n });\n }\n }\n\n if (nextStack.javaWebFramework === \"spring-boot\" && nextStack.javaBuildTool !== \"none\") {\n if (nextStack.javaOrm !== \"spring-data-jpa\") {\n const filteredLibraries = nextStack.javaLibraries.filter(\n (library) => library !== \"flyway\" && library !== \"liquibase\",\n );\n if (filteredLibraries.length !== nextStack.javaLibraries.length) {\n nextStack.javaLibraries = filteredLibraries;\n changed = true;\n changes.push({\n category: \"javaOrm\",\n message:\n \"Java migration libraries cleared (Flyway and Liquibase require Spring Data JPA)\",\n });\n }\n }\n\n if (\n nextStack.javaLibraries.includes(\"flyway\") &&\n nextStack.javaLibraries.includes(\"liquibase\")\n ) {\n nextStack.javaLibraries = nextStack.javaLibraries.filter(\n (library) => library !== \"liquibase\",\n );\n changed = true;\n changes.push({\n category: \"javaLibraries\",\n message: \"Liquibase cleared (Flyway and Liquibase cannot be combined)\",\n });\n }\n }\n\n // Kotlin is only wired for the Spring Boot scaffold (with Maven or Gradle)\n // and its common option surface. For every other Java combination we\n // normalize the language back to `java` so the generator never emits a\n // half-built Kotlin project. See `getKotlinJavaIncompatibilityReason` for\n // the full gate (shared with getDisabledReason, the CLI, and the generator).\n if (nextStack.javaLanguage === \"kotlin\") {\n const kotlinBlocker = getKotlinJavaIncompatibilityReason(nextStack);\n if (kotlinBlocker) {\n nextStack.javaLanguage = \"java\";\n changed = true;\n changes.push({\n category: \"javaLanguage\",\n message: `Java language set to 'Java' (${kotlinBlocker})`,\n });\n } else {\n const kotlinLibraries = nextStack.javaLibraries.filter(\n (library) => !KOTLIN_DROPPED_JAVA_LIBRARIES.has(library),\n );\n if (kotlinLibraries.length !== nextStack.javaLibraries.length) {\n nextStack.javaLibraries = kotlinLibraries;\n changed = true;\n changes.push({\n category: \"javaLibraries\",\n message:\n \"Java annotation-processor libraries cleared (Lombok and MapStruct are not wired for Kotlin)\",\n });\n }\n }\n }\n }\n\n if (nextStack.i18n === \"intlayer\") {\n const hasWebFrontend = nextStack.webFrontend.some((frontend) => frontend !== \"none\");\n const unsupportedFrontend = nextStack.webFrontend.find(\n (frontend) => frontend !== \"none\" && !INTLAYER_COMPATIBLE_FRONTENDS.has(frontend as Frontend),\n );\n\n if (!hasWebFrontend || unsupportedFrontend) {\n nextStack.i18n = \"none\";\n changed = true;\n changes.push({\n category: \"i18n\",\n message: unsupportedFrontend\n ? `i18n set to 'None' (Intlayer is not wired for the '${unsupportedFrontend}' frontend)`\n : \"i18n set to 'None' (Intlayer requires a web frontend)\",\n });\n }\n }\n\n // ============================================\n // ELIXIR ECOSYSTEM CONSTRAINTS\n // ============================================\n\n if (nextStack.ecosystem === \"elixir\") {\n if (nextStack.elixirWebFramework === \"none\") {\n const dependentKeys: Array<keyof CompatibilityInput> = [\n \"elixirAuth\",\n \"elixirApi\",\n \"elixirRealtime\",\n \"elixirObservability\",\n \"elixirI18n\",\n \"elixirHttpServer\",\n ];\n\n for (const key of dependentKeys) {\n const value = nextStack[key];\n const shouldClear =\n key !== \"elixirObservability\" ? value !== \"none\" : value === \"phoenix-telemetry\";\n\n if (shouldClear) {\n nextStack[key] = \"none\" as never;\n changed = true;\n changes.push({\n category: \"elixirWebFramework\",\n message: `${getCategoryDisplayName(key)} set to 'None' (requires Phoenix)`,\n });\n }\n }\n }\n\n if (nextStack.elixirWebFramework === \"phoenix-live-view\" && nextStack.elixirApi === \"none\") {\n nextStack.elixirRealtime = \"live-view-streams\";\n changed = true;\n changes.push({\n category: \"elixirRealtime\",\n message: \"Elixir realtime set to 'LiveView Streams' (Phoenix LiveView selected)\",\n });\n }\n\n if (nextStack.elixirOrm === \"none\") {\n if (nextStack.elixirJobs === \"oban\") {\n nextStack.elixirJobs = \"none\";\n changed = true;\n changes.push({\n category: \"elixirOrm\",\n message: \"Elixir jobs set to 'None' (Oban requires Ecto SQL with PostgreSQL)\",\n });\n }\n if (nextStack.elixirAuth === \"phx-gen-auth\") {\n nextStack.elixirAuth = \"none\";\n changed = true;\n changes.push({\n category: \"elixirOrm\",\n message: \"Elixir auth set to 'None' (phx.gen.auth requires Ecto)\",\n });\n }\n if (nextStack.elixirApi === \"absinthe\") {\n nextStack.elixirApi = \"rest\";\n changed = true;\n changes.push({\n category: \"elixirOrm\",\n message: \"Elixir API set to 'REST' (the generated Absinthe resolver needs Ecto)\",\n });\n }\n }\n\n if (nextStack.elixirJobs === \"oban\" && nextStack.elixirOrm !== \"ecto-sql\") {\n nextStack.elixirJobs = \"none\";\n changed = true;\n changes.push({\n category: \"elixirJobs\",\n message: \"Elixir jobs set to 'None' (Oban requires Ecto SQL with PostgreSQL)\",\n });\n }\n\n if (nextStack.elixirAuth === \"phx-gen-auth\" && nextStack.elixirOrm !== \"ecto-sql\") {\n nextStack.elixirAuth = \"none\";\n changed = true;\n changes.push({\n category: \"elixirAuth\",\n message: \"Elixir auth set to 'None' (phx.gen.auth requires Ecto SQL with PostgreSQL)\",\n });\n }\n\n const sqlBackedElixirOrms = new Set([\"ecto-sql\", \"myxql\", \"ecto_sqlite3\"]);\n if (nextStack.elixirAuth === \"pow\" && !sqlBackedElixirOrms.has(nextStack.elixirOrm)) {\n nextStack.elixirAuth = \"none\";\n changed = true;\n changes.push({\n category: \"elixirAuth\",\n message: \"Elixir auth set to 'None' (Pow requires an Ecto SQL repository)\",\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({\n category: \"webDeploy\",\n message: \"Web deploy set to 'None' (no web frontend)\",\n });\n }\n\n const unsupportedWebDeployFrontend = getUnsupportedWebDeployFrontend(\n nextStack.webDeploy,\n nextStack.webFrontend,\n );\n if (nextStack.webDeploy !== \"none\" && unsupportedWebDeployFrontend) {\n const webDeploy = nextStack.webDeploy;\n nextStack.webDeploy = \"none\";\n changed = true;\n changes.push({\n category: \"webDeploy\",\n message: `Web deploy set to 'None' ('${webDeploy}' is not wired for the '${unsupportedWebDeployFrontend}' frontend)`,\n });\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-vinext\",\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 // Workspace shape: single-app (flat) only applies to a qualifying thin self\n // app; normalize back to monorepo for anything else so we never emit a broken\n // flat layout.\n if (nextStack.workspaceShape === \"single-app\" && !stackQualifiesForSingleApp(nextStack)) {\n nextStack.workspaceShape = \"monorepo\";\n changed = true;\n changes.push({\n category: \"workspaceShape\",\n message:\n \"Workspace shape set to 'Monorepo' (single-app only supports a thin self app: Next.js or TanStack Start fullstack with no separate database/auth/api/server packages)\",\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 if (\n currentStack.ecosystem === \"react-native\" &&\n category === \"codeQuality\" &&\n optionId !== \"knip\" &&\n optionId !== \"gitleaks\"\n ) {\n return \"React Native code quality currently supports Knip and Gitleaks only\";\n }\n\n if (\n category === \"codeQuality\" &&\n optionId === \"knip\" &&\n currentStack.ecosystem !== \"typescript\" &&\n currentStack.ecosystem !== \"react-native\"\n ) {\n return \"Knip requires a TypeScript or React Native workspace\";\n }\n\n if (\n ((category === \"observability\" && optionId === \"signoz\") ||\n (category === \"backend\" && currentStack.observability === \"signoz\")) &&\n (category === \"backend\"\n ? optionId === \"none\" || optionId === \"convex\"\n : currentStack.backend === \"none\" || currentStack.backend === \"convex\")\n ) {\n return \"SigNoz tracing requires a generated server target\";\n }\n\n if (\n ((category === \"observability\" && optionId === \"signoz\") ||\n (category === \"backend\" && currentStack.observability === \"signoz\")) &&\n (category === \"backend\"\n ? optionId === \"self-tanstack-start\" || optionId === \"self-astro\"\n : currentStack.backend === \"self-tanstack-start\" || currentStack.backend === \"self-astro\")\n ) {\n return \"SigNoz tracing is not yet bootstrapped for TanStack Start or Astro fullstack apps\";\n }\n\n const signozBackend = category === \"backend\" ? optionId : currentStack.backend;\n const signozWebDeploy = category === \"webDeploy\" ? optionId : currentStack.webDeploy;\n const signozSelected =\n (category === \"observability\" && optionId === \"signoz\") ||\n currentStack.observability === \"signoz\";\n if (\n signozSelected &&\n signozWebDeploy === \"cloudflare\" &&\n (signozBackend === \"self\" || signozBackend.startsWith(\"self-\"))\n ) {\n return \"SigNoz's Node SDK is incompatible with Cloudflare-hosted fullstack apps\";\n }\n\n if (\n category === \"appPlatforms\" &&\n optionId === \"kong\" &&\n currentStack.ecosystem === \"typescript\" &&\n currentStack.backend === \"encore\"\n ) {\n return \"Kong Gateway does not yet support Encore's container workflow\";\n }\n\n const hasStandaloneViteFrontend = currentStack.webFrontend.some((frontend) =>\n [\"vanilla-vite\", \"vue\"].includes(frontend),\n );\n if (\n category === \"api\" &&\n hasStandaloneViteFrontend &&\n [\"trpc\", \"orpc\", \"ts-rest\", \"garph\"].includes(optionId)\n ) {\n return \"Standalone Vite frontends support only GraphQL and OpenAPI API integrations\";\n }\n if (category === \"forms\" && hasStandaloneViteFrontend && optionId !== \"none\") {\n return \"Form library integrations are not yet wired for standalone Vue or Vanilla Vite\";\n }\n if (\n category === \"cms\" &&\n hasStandaloneViteFrontend &&\n optionId !== \"none\" &&\n optionId !== \"contentful\"\n ) {\n return \"CMS integrations other than Contentful are not yet wired for standalone Vue or Vanilla Vite\";\n }\n if (category === \"featureFlags\" && hasStandaloneViteFrontend && optionId !== \"none\") {\n return \"Feature flag client integrations are not yet wired for standalone Vue or Vanilla Vite\";\n }\n\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 === \"vectorDb\" && optionId !== \"none\") {\n return \"Vector database requires a standalone backend (Convex has built-in vector search)\";\n }\n if (category === \"rateLimit\" && optionId !== \"none\") {\n return \"Rate limiting 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 }\n\n if (currentStack.ecosystem === \"react-native\") {\n const reactNativeCategories = new Set([\n \"nativeFrontend\",\n \"mobileNavigation\",\n \"mobileUI\",\n \"mobileStorage\",\n \"mobileTesting\",\n \"mobilePush\",\n \"mobileOTA\",\n \"mobileDeepLinking\",\n \"mobileLibraries\",\n \"auth\",\n \"payments\",\n \"packageManager\",\n \"aiDocs\",\n \"git\",\n \"install\",\n \"codeQuality\",\n ]);\n\n if (category === \"payments\" && optionId !== \"none\" && optionId !== \"revenuecat\") {\n return \"React Native payments currently support RevenueCat only\";\n }\n\n if (\n !reactNativeCategories.has(category) &&\n optionId !== \"none\" &&\n optionId !== \"false\"\n ) {\n return \"React Native ecosystem only supports native mobile options\";\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\" && optionId !== \"revenuecat\") {\n return \"No backend selected\";\n }\n if (category === \"search\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"vectorDb\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"rateLimit\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"fileStorage\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"integrations\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"ecommerce\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n if (category === \"examples\" && optionId !== \"none\") {\n return \"No backend selected\";\n }\n }\n\n if (currentStack.backend === \"effect\") {\n if (category === \"backendLibraries\" && optionId !== \"effect-full\") {\n return \"Effect backend requires Effect Platform + SQL services\";\n }\n if (category === \"validation\" && optionId !== \"effect-schema\") {\n return \"Effect backend requires Effect Schema validation\";\n }\n }\n\n // ============================================\n // KOTLIN (JAVA LANGUAGE VARIANT) RULES\n // ============================================\n // Grey out the 'kotlin' option when the current stack excludes it, and grey\n // out Kotlin-incompatible options while Kotlin is selected — instead of\n // silently normalizing the language back to Java after the fact. Shares the\n // gate in getKotlinJavaIncompatibilityReason. These run BEFORE the graph\n // delegation below: the graph engine authoritatively handles categories like\n // javaOrm and the ecosystem-scoped email/search/caching/observability rules\n // return early for non-TypeScript ecosystems, so later placement would make\n // these rules unreachable.\n if (category === \"javaLanguage\" && optionId === \"kotlin\" && currentStack.ecosystem === \"java\") {\n const kotlinBlocker = getKotlinJavaIncompatibilityReason(currentStack);\n if (kotlinBlocker) {\n return kotlinBlocker;\n }\n }\n\n if (currentStack.ecosystem === \"java\" && currentStack.javaLanguage === \"kotlin\") {\n if (category === \"javaWebFramework\" && optionId !== \"spring-boot\") {\n return \"Kotlin sources are only wired for the Spring Boot scaffold\";\n }\n if (category === \"javaBuildTool\" && optionId === \"none\") {\n return \"Kotlin requires Maven or Gradle\";\n }\n if (category === \"javaOrm\" && (optionId === \"jooq\" || optionId === \"mybatis\")) {\n return \"The Kotlin scaffold supports Spring Data JPA or no ORM (jOOQ/MyBatis sources are Java-only)\";\n }\n if (category === \"javaApi\" && (optionId === \"grpc\" || optionId === \"openapi-generator\")) {\n return \"The Kotlin scaffold supports Spring GraphQL or no API layer (gRPC/OpenAPI codegen paths are Java-only)\";\n }\n if (category === \"javaLibraries\" && KOTLIN_DROPPED_JAVA_LIBRARIES.has(optionId)) {\n return \"Java annotation-processor tooling is not wired for Kotlin (data classes replace Lombok; MapStruct would need kapt)\";\n }\n if (\n category === \"javaTestingLibraries\" &&\n KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES.has(optionId)\n ) {\n return `The '${optionId}' testing library is not wired for the Kotlin scaffold`;\n }\n if (category === \"email\" && optionId === \"resend\") {\n return \"The Resend email integration is Java-only in the Java ecosystem scaffold\";\n }\n if (category === \"search\" && optionId === \"meilisearch\") {\n return \"The Meilisearch integration is Java-only in the Java ecosystem scaffold\";\n }\n if (category === \"caching\" && optionId === \"upstash-redis\") {\n return \"The Upstash Redis integration is Java-only in the Java ecosystem scaffold\";\n }\n if (category === \"observability\" && optionId === \"sentry\") {\n return \"The Sentry integration is Java-only in the Java ecosystem scaffold\";\n }\n }\n\n if (currentStack.ecosystem === \"rust\") {\n const filterOnlyFramework =\n currentStack.rustWebFramework === \"warp\" || currentStack.rustWebFramework === \"salvo\";\n\n if (\n category === \"rustApi\" &&\n filterOnlyFramework &&\n optionId !== \"none\" &&\n optionId !== \"jsonrpsee\"\n ) {\n return \"Warp and Salvo currently support REST or the standalone jsonrpsee server\";\n }\n if (\n category === \"rustWebFramework\" &&\n (optionId === \"warp\" || optionId === \"salvo\") &&\n currentStack.rustApi !== \"none\" &&\n currentStack.rustApi !== \"jsonrpsee\"\n ) {\n return \"Warp and Salvo currently support REST or the standalone jsonrpsee server\";\n }\n if (\n category === \"rustApi\" &&\n currentStack.rustWebFramework === \"loco\" &&\n optionId === \"jsonrpsee\"\n ) {\n return \"Loco owns the server boot sequence; jsonrpsee is available with the other Rust frameworks\";\n }\n if (\n category === \"rustWebFramework\" &&\n optionId === \"loco\" &&\n currentStack.rustApi === \"jsonrpsee\"\n ) {\n return \"Loco owns the server boot sequence and cannot start the generated jsonrpsee server\";\n }\n if (\n category === \"rustAuth\" &&\n optionId === \"tower-sessions\" &&\n currentStack.rustWebFramework !== \"axum\"\n ) {\n return \"The generated tower-sessions middleware is wired specifically for Axum\";\n }\n if (\n category === \"rustWebFramework\" &&\n optionId !== \"axum\" &&\n currentStack.rustAuth === \"tower-sessions\"\n ) {\n return \"tower-sessions requires the generated Axum middleware stack\";\n }\n // Torii's SQLite storage pins sqlx 0.8.0 (libsqlite3-sys 0.28) while\n // rusqlite uses libsqlite3-sys 0.36 — cargo permits only one crate to link\n // the native sqlite3 library, so this pair can never resolve.\n if (category === \"rustAuth\" && optionId === \"torii\" && currentStack.rustOrm === \"rusqlite\") {\n return \"Torii's sqlx-based storage conflicts with rusqlite (both link the native sqlite3 library)\";\n }\n if (category === \"rustOrm\" && optionId === \"rusqlite\" && currentStack.rustAuth === \"torii\") {\n return \"rusqlite conflicts with Torii's sqlx-based storage (both link the native sqlite3 library)\";\n }\n }\n\n // Python prerequisites must run before graph-owned category handling returns.\n if (category === \"pythonApi\") {\n if (optionId !== \"none\" && currentStack.pythonWebFramework !== \"django\") {\n return \"Python API frameworks currently require Django\";\n }\n }\n if (\n category === \"pythonServer\" &&\n optionId === \"gunicorn\" &&\n (currentStack.pythonWebFramework === \"streamlit\" || currentStack.pythonWebFramework === \"none\")\n ) {\n return \"Gunicorn requires a WSGI, ASGI, or aiohttp application\";\n }\n\n // Runtime-specific observability gates must run before graph-owned category\n // handling returns an authoritative result.\n if (\n (category === \"observability\" && optionId === \"signoz\" && currentStack.runtime === \"workers\") ||\n (category === \"runtime\" && optionId === \"workers\" && currentStack.observability === \"signoz\")\n ) {\n return \"SigNoz tracing currently requires the Node.js or Bun runtime\";\n }\n if (\n ((category === \"goObservability\" && optionId === \"signoz\") ||\n (category === \"goWebFramework\" && currentStack.goObservability === \"signoz\") ||\n (category === \"goApi\" && currentStack.goObservability === \"signoz\") ||\n (category === \"auth\" && currentStack.goObservability === \"signoz\")) &&\n !hasSignozSupportedGoServerTarget({\n ...currentStack,\n ...(category === \"goWebFramework\" ? { goWebFramework: optionId } : {}),\n ...(category === \"goApi\" ? { goApi: optionId } : {}),\n ...(category === \"auth\" ? { auth: optionId } : {}),\n })\n ) {\n return \"SigNoz requires Gin, Echo, Fiber, Chi, net/http, gRPC, or Go Better Auth to provide a server target\";\n }\n if (\n ((category === \"pythonObservability\" && optionId === \"signoz\") ||\n (category === \"pythonWebFramework\" && currentStack.pythonObservability === \"signoz\")) &&\n !isSignozSupportedPythonWebFramework(\n category === \"pythonWebFramework\" ? optionId : currentStack.pythonWebFramework,\n )\n ) {\n return \"SigNoz request tracing is currently wired for FastAPI\";\n }\n if (\n category === \"integrations\" &&\n optionId === \"nango\" &&\n usesCloudflareFullstackRuntime(currentStack)\n ) {\n return \"Nango's Node SDK is not available on Cloudflare Workers\";\n }\n if (\n category === \"webDeploy\" &&\n optionId === \"cloudflare\" &&\n currentStack.integrations === \"nango\" &&\n FULLSTACK_SELF_BACKENDS.has(currentStack.backend)\n ) {\n return \"Nango's Node SDK is not available on Cloudflare Workers\";\n }\n\n const graphDisabledReason =\n (category === \"payments\" && optionId === \"revenuecat\") ||\n (category === \"i18n\" && optionId === \"intlayer\")\n ? { handled: false, authoritative: false, reason: null }\n : getGraphDisabledReason(currentStack, category, optionId);\n if (graphDisabledReason.reason) {\n return graphDisabledReason.reason;\n }\n if (graphDisabledReason.handled && graphDisabledReason.authoritative) {\n return null;\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-vinext\") {\n if (category === \"runtime\" && optionId !== \"none\") {\n return \"Vinext fullstack uses built-in API routes\";\n }\n if (category === \"webFrontend\" && optionId !== \"vinext\" && optionId !== \"none\") {\n return \"Vinext fullstack requires Vinext 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 (optionId === \"self-vinext\" && !currentStack.webFrontend.includes(\"vinext\")) {\n return \"Requires Vinext 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.observability === \"signoz\") {\n return \"SigNoz tracing currently requires the Node.js or Bun runtime\";\n }\n if (optionId === \"workers\" && currentStack.integrations === \"nango\") {\n return \"Nango's Node SDK is not available on Workers runtime\";\n }\n if (optionId === \"workers\" && currentStack.backend !== \"hono\") {\n return \"In Better-Fullstack, Workers runtime currently requires the Hono backend\";\n }\n if (\n optionId === \"workers\" &&\n currentStack.cms === \"keystatic\" &&\n currentStack.webFrontend.includes(\"astro\") &&\n !currentStack.webFrontend.includes(\"next\")\n ) {\n return \"Keystatic's Astro integration is not Astro 7-compatible yet.\";\n }\n if (optionId === \"none\") {\n const allowedBackends = [\n \"convex\",\n \"none\",\n \"self-next\",\n \"self-vinext\",\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 if (category === \"api\" && optionId === \"openapi\") {\n if (currentStack.backend === \"self\") {\n return \"OpenAPI server scaffolding currently requires a standalone TypeScript backend\";\n }\n if (currentStack.nativeFrontend.length > 0) {\n return \"OpenAPI is currently available for web frontends, not React Native\";\n }\n if (![\"hono\", \"effect\", \"express\", \"fastify\", \"elysia\"].includes(currentStack.backend)) {\n return \"OpenAPI currently supports Hono, Effect, Express, Fastify, and Elysia backends\";\n }\n }\n\n if (category === \"api\" && optionId === \"apollo-server\") {\n const needsReactFrontend = currentStack.webFrontend.some((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"solid-start\"].includes(f),\n );\n if (needsReactFrontend) {\n const frontendName = currentStack.webFrontend.find((f) =>\n [\"nuxt\", \"svelte\", \"solid\", \"solid-start\"].includes(f),\n );\n return `${frontendName} requires oRPC, not Apollo Server`;\n }\n if (currentStack.webFrontend.includes(\"astro\") && currentStack.astroIntegration !== \"react\") {\n return \"Apollo Server requires React integration with Astro\";\n }\n if (currentStack.backend === \"self\") {\n return \"Apollo Server scaffolding currently requires a standalone TypeScript backend\";\n }\n if (currentStack.nativeFrontend.length > 0) {\n return \"Apollo Server is currently available for web frontends, not React Native\";\n }\n if (![\"hono\", \"effect\", \"express\", \"fastify\", \"elysia\"].includes(currentStack.backend)) {\n return \"Apollo Server currently supports Hono, Effect, Express, Fastify, and Elysia backends\";\n }\n }\n\n if (\n category === \"appPlatforms\" &&\n optionId === \"nx\" &&\n currentStack.appPlatforms.includes(\"turborepo\")\n ) {\n return \"Choose either Nx or Turborepo, not both\";\n }\n\n if (\n category === \"appPlatforms\" &&\n optionId === \"turborepo\" &&\n currentStack.appPlatforms.includes(\"nx\")\n ) {\n return \"Choose either Turborepo or Nx, not both\";\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 // React-only APIs require React integration\n if (\n currentStack.webFrontend.includes(\"astro\") &&\n currentStack.api === \"apollo-server\" &&\n optionId !== \"react\"\n ) {\n return \"Apollo Server requires React integration with Astro\";\n }\n if (\n currentStack.webFrontend.includes(\"astro\") &&\n currentStack.api === \"trpc\" &&\n optionId !== \"react\" &&\n optionId !== \"none\"\n ) {\n return \"tRPC requires React integration with Astro\";\n }\n }\n\n // ============================================\n // AUTH CONSTRAINTS\n // ============================================\n if (category === \"auth\") {\n const isBetterAuthOption =\n optionId === \"better-auth\" || optionId === \"better-auth-organizations\";\n if (isBetterAuthOption && currentStack.database === \"redis\") {\n return \"Better Auth requires a SQL database (not Redis)\";\n }\n const ormsWithoutBetterAuth = [\"typeorm\", \"sequelize\", \"mikroorm\"];\n if (isBetterAuthOption && ormsWithoutBetterAuth.includes(currentStack.orm)) {\n return `Better Auth has no ${currentStack.orm} adapter`;\n }\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\" && currentStack.auth !== \"better-auth-organizations\") {\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 if (category === \"payments\" && optionId === \"revenuecat\") {\n const hasNativeFrontend = hasRevenueCatCompatibleNativeFrontend(currentStack.nativeFrontend);\n if (!hasNativeFrontend) {\n return \"RevenueCat payments requires a native frontend (native-bare, native-uniwind, or native-unistyles)\";\n }\n }\n\n if (category === \"payments\" && optionId === \"paypal\") {\n if (!currentStack.webFrontend.some((f) => f !== \"none\")) {\n return \"PayPal requires a web frontend\";\n }\n if ([\"none\", \"convex\"].includes(currentStack.backend)) {\n return \"PayPal checkout requires a standalone or fullstack backend\";\n }\n }\n\n if (\n category === \"payments\" &&\n optionId === \"xendit\" &&\n [\"none\", \"convex\"].includes(currentStack.backend)\n ) {\n return \"Xendit Payment Sessions require a standalone or fullstack backend\";\n }\n\n // ============================================\n // CMS CONSTRAINTS\n // ============================================\n if (category === \"cms\" && optionId === \"payload\") {\n if (!currentStack.webFrontend.includes(\"next\")) {\n return \"Payload CMS v3 requires Next.js\";\n }\n }\n if (category === \"cms\" && optionId === \"keystatic\") {\n if (!currentStack.webFrontend.includes(\"next\")) {\n return \"Keystatic is currently scaffolded for Next.js only because @keystatic/astro is not Astro 7-compatible yet.\";\n }\n }\n\n if (category === \"realtime\" && optionId === \"ws\" && currentStack.backend !== \"express\") {\n return \"The ws integration is currently wired for the Express backend\";\n }\n\n // ============================================\n // EMAIL CONSTRAINTS\n // ============================================\n if (category === \"email\" && optionId !== \"none\") {\n if (currentStack.ecosystem !== \"typescript\") {\n return null;\n }\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 if (category === \"ecommerce\" && optionId !== \"none\") {\n if (currentStack.ecosystem !== \"typescript\") {\n return \"MedusaJS SDK generation is only available for the TypeScript ecosystem\";\n }\n if (currentStack.backend === \"convex\") {\n return \"MedusaJS SDK generation is not available with Convex backend\";\n }\n if (currentStack.backend === \"none\") {\n return \"MedusaJS SDK generation requires a backend\";\n }\n }\n\n // ============================================\n // OBSERVABILITY CONSTRAINTS\n // ============================================\n if (category === \"observability\" && optionId !== \"none\") {\n if (currentStack.ecosystem !== \"typescript\") {\n return null;\n }\n }\n\n if (category === \"integrations\" && optionId !== \"none\") {\n if (currentStack.ecosystem !== \"typescript\") {\n return \"Nango SDK generation is only available for the TypeScript ecosystem\";\n }\n if (currentStack.backend === \"convex\") {\n return \"Nango SDK generation is not available with Convex backend\";\n }\n if (currentStack.backend === \"none\") {\n return \"Nango SDK generation requires a backend\";\n }\n if (currentStack.runtime === \"workers\" || usesCloudflareFullstackRuntime(currentStack)) {\n return \"Nango's Node SDK is not available on Cloudflare Workers\";\n }\n }\n\n // ============================================\n // CACHING CONSTRAINTS\n // ============================================\n if (category === \"caching\" && optionId === \"redis\" && currentStack.ecosystem !== \"typescript\") {\n return \"Self-hosted Redis caching (ioredis) is only available for the TypeScript ecosystem\";\n }\n if (category === \"caching\" && optionId !== \"none\") {\n if (currentStack.ecosystem !== \"typescript\") {\n return null;\n }\n }\n\n // ============================================\n // RATE LIMITING CONSTRAINTS\n // ============================================\n if (category === \"rateLimit\" && optionId !== \"none\") {\n if (currentStack.ecosystem !== \"typescript\") {\n return null;\n }\n if (currentStack.backend === \"convex\") {\n return \"Rate limiting helpers are not generated with Convex backend\";\n }\n if (currentStack.backend === \"none\") {\n return \"Rate limiting requires a backend\";\n }\n }\n\n // ============================================\n // SEARCH CONSTRAINTS\n // ============================================\n if (category === \"search\" && optionId === \"bleve\" && currentStack.ecosystem !== \"go\") {\n return \"Bleve is an embedded Go search engine, only available for the Go ecosystem\";\n }\n if (category === \"search\" && optionId !== \"none\") {\n if (currentStack.ecosystem !== \"typescript\") {\n return null;\n }\n }\n\n // ============================================\n // VECTOR DATABASE CONSTRAINTS\n // ============================================\n if (category === \"vectorDb\" && optionId !== \"none\") {\n // Vector DB is a TypeScript-ecosystem feature only.\n if (currentStack.ecosystem !== \"typescript\") {\n return \"Vector database is only available for the TypeScript ecosystem\";\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 if (\n category === \"ai\" &&\n [\"openai-sdk\", \"anthropic-sdk\"].includes(optionId) &&\n [\"none\", \"convex\"].includes(currentStack.backend)\n ) {\n return \"Direct AI provider SDKs require a standalone or fullstack backend\";\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\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"redwood\",\n \"solid\",\n \"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 // TanStack addons with Astro require a UI framework integration\n const tanstackAddons = [\n \"tanstack-query\",\n \"tanstack-table\",\n \"tanstack-virtual\",\n \"tanstack-db\",\n \"tanstack-pacer\",\n ];\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 if (\n optionId === \"graphql-codegen\" &&\n ![\"garph\", \"graphql-yoga\", \"apollo-server\"].includes(currentStack.api) &&\n !currentStack.webFrontend.includes(\"redwood\")\n ) {\n return \"GraphQL Code Generator requires a GraphQL API selection\";\n }\n\n if (optionId === \"openapi-typescript\" && currentStack.api !== \"openapi\") {\n return \"openapi-typescript requires the OpenAPI API selection\";\n }\n\n if (optionId === \"openapi-typescript\" && currentStack.backend === \"self\") {\n return \"openapi-typescript requires a standalone backend that exposes an OpenAPI schema\";\n }\n\n if (\n optionId === \"apollo-client\" &&\n ![\"garph\", \"graphql-yoga\", \"apollo-server\"].includes(currentStack.api)\n ) {\n return \"Apollo Client requires a GraphQL API selection\";\n }\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 if (\n optionId === \"styled-components\" &&\n !currentStack.webFrontend.some((f) =>\n [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"redwood\",\n ].includes(f),\n )\n ) {\n return \"styled-components requires a React frontend\";\n }\n // Some UI libraries require Tailwind\n const requiresTailwind = [\"shadcn-ui\", \"shadcn-svelte\", \"daisyui\", \"nextui\"].includes(\n currentStack.uiLibrary,\n );\n if (requiresTailwind && optionId !== \"tailwind\") {\n const libraryName =\n currentStack.uiLibrary === \"shadcn-ui\"\n ? \"shadcn/ui\"\n : currentStack.uiLibrary === \"shadcn-svelte\"\n ? \"shadcn-svelte\"\n : currentStack.uiLibrary === \"daisyui\"\n ? \"daisyUI\"\n : \"NextUI\";\n return `${libraryName} requires Tailwind CSS`;\n }\n }\n\n const mobileCategories = new Set([\n \"mobileNavigation\",\n \"mobileUI\",\n \"mobileStorage\",\n \"mobileTesting\",\n \"mobilePush\",\n \"mobileOTA\",\n \"mobileDeepLinking\",\n \"mobileLibraries\",\n ]);\n\n if (mobileCategories.has(category)) {\n const hasNativeFrontend = currentStack.nativeFrontend.some((f) => f !== \"none\");\n if (!hasNativeFrontend && optionId !== \"none\") {\n return `${getCategoryDisplayName(category)} requires a native Expo frontend`;\n }\n\n if (category === \"mobileNavigation\" && optionId === \"react-navigation\") {\n return null;\n }\n\n if (category === \"mobileUI\") {\n if (optionId === \"uniwind\" && !currentStack.nativeFrontend.includes(\"native-uniwind\")) {\n return \"Uniwind mobile UI requires Expo + Uniwind frontend\";\n }\n if (optionId === \"unistyles\" && !currentStack.nativeFrontend.includes(\"native-unistyles\")) {\n return \"Unistyles mobile UI requires Expo + Unistyles frontend\";\n }\n if (\n [\"tamagui\", \"gluestack-ui\"].includes(optionId) &&\n currentStack.nativeFrontend.some((f) => [\"native-uniwind\", \"native-unistyles\"].includes(f))\n ) {\n return \"Tamagui and Gluestack UI require Expo + StyleSheet to avoid conflicting styling setup\";\n }\n }\n\n if (\n (category === \"mobilePush\" && optionId === \"expo-notifications\") ||\n (category === \"mobileOTA\" && optionId === \"expo-updates\") ||\n (category === \"mobileDeepLinking\" && optionId === \"expo-linking\")\n ) {\n return null;\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\", \"mui\", \"antd\"];\n const reactFrontends = [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n ];\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 : optionId === \"mui\"\n ? \"MUI\"\n : optionId === \"antd\"\n ? \"Ant Design\"\n : \"NextUI\";\n return `${libraryName} requires a React-based frontend`;\n }\n }\n\n if (optionId === \"shadcn-svelte\") {\n const hasSvelteFrontend = currentStack.webFrontend.includes(\"svelte\");\n const hasAstroSvelte =\n currentStack.webFrontend.includes(\"astro\") && currentStack.astroIntegration === \"svelte\";\n if (!hasSvelteFrontend && !hasAstroSvelte) {\n return \"shadcn-svelte requires SvelteKit or Astro with Svelte integration\";\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\", \"shadcn-svelte\", \"daisyui\", \"nextui\"].includes(optionId)) {\n if (currentStack.cssFramework !== \"tailwind\") {\n const libraryName =\n optionId === \"shadcn-ui\"\n ? \"shadcn/ui\"\n : optionId === \"shadcn-svelte\"\n ? \"shadcn-svelte\"\n : optionId === \"daisyui\"\n ? \"daisyUI\"\n : \"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 if (optionId === \"vercel\") {\n // These frontends don't have Vercel templates\n if (currentStack.webFrontend.some((f) => [\"redwood\", \"fresh\"].includes(f))) {\n return \"Vercel deployment is not available for Redwood/Fresh (they have their own deploy systems)\";\n }\n }\n if (optionId === \"render\" || optionId === \"netlify\") {\n const blocked = getUnsupportedWebDeployFrontend(optionId, currentStack.webFrontend);\n if (blocked) {\n const deployName = optionId === \"render\" ? \"Render\" : \"Netlify\";\n return `${deployName} deployment is not yet wired up for the '${blocked}' frontend`;\n }\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 === \"vercel\") {\n // Vercel serverless can't host persistent-process backends\n if ([\"nestjs\", \"adonisjs\"].includes(currentStack.backend)) {\n return \"Vercel serverless functions are incompatible with persistent-process backends like NestJS/AdonisJS. Use Fly.io or Railway instead.\";\n }\n // Encore has its own deployment\n if (currentStack.backend === \"encore\") {\n return \"Encore manages its own deployment infrastructure\";\n }\n }\n if (optionId === \"netlify\") {\n if (currentStack.backend !== \"hono\") {\n return \"Netlify Functions server deploy is currently supported only with Hono\";\n }\n if (currentStack.runtime !== \"node\") {\n return \"Netlify Functions server deploy requires Node.js runtime\";\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 // ============================================\n // I18N RULES\n // ============================================\n if (category === \"i18n\") {\n if (optionId !== \"none\" && !currentStack.webFrontend.some((f) => f !== \"none\")) {\n return \"i18n requires a web frontend\";\n }\n\n if (optionId === \"paraglide\") {\n const unsupportedFrontend = currentStack.webFrontend.find(\n (frontend) =>\n frontend !== \"none\" && !PARAGLIDE_COMPATIBLE_FRONTENDS.has(frontend as Frontend),\n );\n\n if (unsupportedFrontend) {\n return `Paraglide is not yet wired for the '${unsupportedFrontend}' frontend`;\n }\n }\n\n if (optionId === \"next-intl\") {\n if (!currentStack.webFrontend.includes(\"next\")) {\n return \"next-intl requires Next.js\";\n }\n }\n\n if (optionId === \"intlayer\") {\n const unsupportedFrontend = currentStack.webFrontend.find(\n (frontend) =>\n frontend !== \"none\" && !INTLAYER_COMPATIBLE_FRONTENDS.has(frontend as Frontend),\n );\n\n if (unsupportedFrontend) {\n return `Intlayer is not yet wired for the '${unsupportedFrontend}' frontend`;\n }\n }\n }\n\n // ============================================\n // GO ECOSYSTEM RULES\n // ============================================\n if (\n category === \"goMigrations\" &&\n optionId !== \"none\" &&\n currentStack.ecosystem === \"go\" &&\n ![\"sqlite\", \"postgres\", \"mysql\"].includes(currentStack.database)\n ) {\n return \"Go migrations require SQLite, PostgreSQL, or MySQL\";\n }\n\n if (\n category === \"database\" &&\n currentStack.ecosystem === \"go\" &&\n currentStack.goMigrations !== \"none\" &&\n ![\"sqlite\", \"postgres\", \"mysql\"].includes(optionId)\n ) {\n return \"The selected Go migration tool requires SQLite, PostgreSQL, or MySQL\";\n }\n\n // ============================================\n // JAVA ECOSYSTEM RULES\n // ============================================\n if (category === \"javaWebFramework\") {\n if (optionId !== \"none\" && currentStack.javaBuildTool === \"none\") {\n return \"Java web frameworks require Maven or Gradle\";\n }\n }\n\n if (category === \"javaBuildTool\") {\n if (optionId === \"none\") {\n if (currentStack.javaWebFramework !== \"none\") {\n return \"Java web frameworks require Maven or Gradle\";\n }\n if (currentStack.javaOrm !== \"none\") {\n return \"Java ORM support requires Maven or Gradle\";\n }\n if (currentStack.javaAuth !== \"none\") {\n return \"Java auth support requires Maven or Gradle\";\n }\n if (currentStack.javaApi !== \"none\") {\n return \"Java API support requires Maven or Gradle\";\n }\n if (currentStack.javaLibraries.some((library) => library !== \"none\")) {\n return \"Java libraries require Maven or Gradle\";\n }\n if (currentStack.javaTestingLibraries.some((library) => library !== \"none\")) {\n return \"Java testing libraries require Maven or Gradle\";\n }\n }\n }\n\n if (category === \"javaOrm\") {\n if (optionId !== \"none\" && currentStack.javaWebFramework !== \"spring-boot\") {\n return \"Java ORM support currently requires Spring Boot\";\n }\n if (optionId !== \"none\" && currentStack.javaBuildTool === \"none\") {\n return \"Java ORM support requires Maven or Gradle\";\n }\n }\n\n if (category === \"javaAuth\") {\n if (optionId !== \"none\" && currentStack.javaWebFramework !== \"spring-boot\") {\n return \"Java auth support currently requires Spring Boot\";\n }\n if (optionId !== \"none\" && currentStack.javaBuildTool === \"none\") {\n return \"Java auth support requires Maven or Gradle\";\n }\n }\n\n if (category === \"javaApi\") {\n if (optionId !== \"none\" && currentStack.javaWebFramework !== \"spring-boot\") {\n return \"Java API support currently requires Spring Boot\";\n }\n if (optionId !== \"none\" && currentStack.javaBuildTool === \"none\") {\n return \"Java API support requires Maven or Gradle\";\n }\n }\n\n if (category === \"javaLibraries\") {\n if (optionId !== \"none\" && currentStack.javaWebFramework !== \"spring-boot\") {\n return \"Spring libraries currently require Spring Boot in the Java scaffold\";\n }\n if (optionId !== \"none\" && currentStack.javaBuildTool === \"none\") {\n return \"Java libraries require Maven or Gradle\";\n }\n if (optionId === \"flyway\" && currentStack.javaOrm !== \"spring-data-jpa\") {\n return \"Flyway currently requires Spring Data JPA in the Java scaffold\";\n }\n if (optionId === \"liquibase\" && currentStack.javaOrm !== \"spring-data-jpa\") {\n return \"Liquibase currently requires Spring Data JPA in the Java scaffold\";\n }\n if (optionId === \"flyway\" && currentStack.javaLibraries.includes(\"liquibase\")) {\n return \"Flyway cannot be combined with Liquibase in the current Java scaffold\";\n }\n if (optionId === \"liquibase\" && currentStack.javaLibraries.includes(\"flyway\")) {\n return \"Liquibase cannot be combined with Flyway in the current Java scaffold\";\n }\n }\n\n if (category === \"javaTestingLibraries\") {\n if (optionId !== \"none\" && currentStack.javaBuildTool === \"none\") {\n return \"Java testing libraries require Maven or Gradle\";\n }\n }\n\n // ============================================\n // ELIXIR ECOSYSTEM RULES\n // ============================================\n const elixirCategories = new Set<CompatibilityCategory>([\n \"elixirOrm\",\n \"elixirAuth\",\n \"elixirApi\",\n \"elixirRealtime\",\n \"elixirJobs\",\n \"elixirValidation\",\n \"elixirHttp\",\n \"elixirJson\",\n \"elixirEmail\",\n \"elixirCaching\",\n \"elixirObservability\",\n \"elixirTesting\",\n \"elixirQuality\",\n \"elixirI18n\",\n \"elixirHttpServer\",\n \"elixirApplicationFramework\",\n \"elixirDocumentation\",\n \"elixirClustering\",\n \"elixirDeploy\",\n ]);\n\n if (elixirCategories.has(category) && optionId !== \"none\") {\n if (currentStack.ecosystem !== \"elixir\") {\n return \"Elixir options only apply when the Elixir ecosystem is selected\";\n }\n }\n\n if (\n category === \"elixirTesting\" &&\n optionId === \"wallaby\" &&\n currentStack.ecosystem === \"elixir\" &&\n currentStack.elixirWebFramework === \"none\"\n ) {\n return \"Wallaby browser tests require Phoenix\";\n }\n\n if (\n category === \"elixirTesting\" &&\n optionId === \"ex_machina\" &&\n currentStack.ecosystem === \"elixir\" &&\n ![\"ecto-sql\", \"myxql\", \"ecto_sqlite3\"].includes(currentStack.elixirOrm)\n ) {\n return \"ExMachina requires an Ecto SQL repository\";\n }\n\n if (\n category === \"elixirAuth\" &&\n optionId === \"pow\" &&\n currentStack.ecosystem === \"elixir\" &&\n (currentStack.elixirWebFramework === \"none\" ||\n ![\"ecto-sql\", \"myxql\", \"ecto_sqlite3\"].includes(currentStack.elixirOrm))\n ) {\n return \"Pow requires Phoenix and an Ecto SQL repository\";\n }\n\n if (\n ((category === \"elixirApi\" && optionId === \"open_api_spex\") ||\n (category === \"elixirI18n\" && optionId === \"gettext\")) &&\n currentStack.ecosystem === \"elixir\" &&\n currentStack.elixirWebFramework === \"none\"\n ) {\n return `${getCategoryDisplayName(category)} requires Phoenix`;\n }\n\n if (\n category === \"elixirHttpServer\" &&\n currentStack.ecosystem === \"elixir\" &&\n ((optionId === \"none\" && currentStack.elixirWebFramework !== \"none\") ||\n (optionId !== \"none\" && currentStack.elixirWebFramework === \"none\"))\n ) {\n return currentStack.elixirWebFramework === \"none\"\n ? \"HTTP server adapters require Phoenix\"\n : \"Phoenix requires Bandit or Cowboy\";\n }\n\n if (\n category === \"elixirJobs\" &&\n optionId === \"oban\" &&\n currentStack.ecosystem === \"elixir\" &&\n currentStack.elixirOrm !== \"ecto-sql\"\n ) {\n return \"Oban requires the PostgreSQL Ecto SQL option\";\n }\n\n if (\n category === \"elixirOrm\" &&\n [\"myxql\", \"ecto_sqlite3\"].includes(optionId) &&\n currentStack.ecosystem === \"elixir\" &&\n currentStack.elixirJobs === \"oban\"\n ) {\n return \"Oban requires PostgreSQL-backed Ecto SQL\";\n }\n\n if (\n category === \"elixirWebFramework\" &&\n optionId !== \"none\" &&\n currentStack.ecosystem !== \"elixir\"\n ) {\n return \"Elixir web frameworks are available only in the Elixir ecosystem\";\n }\n\n if (\n category === \"elixirJson\" &&\n optionId === \"none\" &&\n currentStack.ecosystem === \"elixir\" &&\n currentStack.elixirWebFramework !== \"none\"\n ) {\n return \"Phoenix JSON scaffolds require Jason\";\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\ntype GraphDisabledReasonOwnerRole = \"frontend\" | \"backend\" | \"mobile\" | \"database\";\n\ntype GraphDisabledReasonBinding = {\n role: StackPartRole;\n ecosystem: StackPartEcosystem;\n ownerRole?: GraphDisabledReasonOwnerRole;\n ownerEcosystem?: StackPartEcosystem;\n currentEcosystem?: StackPartEcosystem;\n allowNoneCandidate?: boolean;\n allowOwnerlessCandidate?: boolean;\n authoritative?: boolean;\n candidateIdPrefix?: string;\n missingOwnerReason?: string;\n};\n\ntype GraphDisabledReasonResult = {\n handled: boolean;\n authoritative: boolean;\n reason: string | null;\n};\n\nconst SHARED_BACKEND_SERVICE_CATEGORIES = new Set<CompatibilityCategory>([\n \"email\",\n \"observability\",\n \"caching\",\n \"rateLimit\",\n \"search\",\n]);\n\nconst SHARED_BACKEND_SERVICE_MISSING_OWNER_REASONS: Partial<Record<CompatibilityCategory, string>> =\n {\n email: \"Email integration requires a backend\",\n rateLimit: \"Rate limiting requires a backend\",\n };\n\nfunction getSharedBackendServiceGraphBinding(\n currentStack: CompatibilityInput,\n category: CompatibilityCategory,\n): GraphDisabledReasonBinding | undefined {\n if (!SHARED_BACKEND_SERVICE_CATEGORIES.has(category)) return undefined;\n if (currentStack.ecosystem === \"react-native\") return undefined;\n\n return {\n role: category as StackPartRole,\n ecosystem: currentStack.ecosystem,\n ownerRole: \"backend\",\n ownerEcosystem: currentStack.ecosystem,\n authoritative: true,\n missingOwnerReason: SHARED_BACKEND_SERVICE_MISSING_OWNER_REASONS[category],\n };\n}\n\nconst ELIXIR_GRAPH_DISABLED_REASON_ROLES: Partial<Record<CompatibilityCategory, StackPartRole>> = {\n elixirOrm: \"orm\",\n elixirAuth: \"auth\",\n elixirApi: \"api\",\n elixirRealtime: \"realtime\",\n elixirJobs: \"jobQueue\",\n elixirValidation: \"validation\",\n elixirHttp: \"httpClient\",\n elixirEmail: \"email\",\n elixirCaching: \"caching\",\n elixirObservability: \"observability\",\n elixirTesting: \"testing\",\n elixirQuality: \"codeQuality\",\n elixirI18n: \"i18n\",\n elixirHttpServer: \"runtime\",\n elixirApplicationFramework: \"libraries\",\n elixirDocumentation: \"documentation\",\n elixirClustering: \"config\",\n elixirDeploy: \"deploy\",\n};\n\nfunction getElixirGraphBinding(\n currentStack: CompatibilityInput,\n category: CompatibilityCategory,\n): GraphDisabledReasonBinding | undefined {\n const role = ELIXIR_GRAPH_DISABLED_REASON_ROLES[category];\n if (!role || currentStack.ecosystem !== \"elixir\") return undefined;\n\n return {\n role,\n ecosystem: \"elixir\",\n ownerRole: \"backend\",\n ownerEcosystem: \"elixir\",\n currentEcosystem: \"elixir\",\n allowOwnerlessCandidate: true,\n authoritative: true,\n candidateIdPrefix: \"candidate:native\",\n };\n}\n\nfunction getAddonOrExampleGraphBinding(\n category: CompatibilityCategory,\n optionId: string,\n): GraphDisabledReasonBinding | undefined {\n if (category === \"examples\") {\n return {\n role: \"examples\",\n ecosystem: \"universal\",\n allowOwnerlessCandidate: true,\n authoritative: true,\n };\n }\n\n if (category !== \"appPlatforms\") return undefined;\n\n const binding = getAddonStackPartBinding(optionId);\n if (!binding) return undefined;\n\n return {\n role: binding.role,\n ecosystem: binding.ecosystem,\n ownerRole: binding.ownerRole,\n ownerEcosystem: binding.ownerRole ? binding.ecosystem : undefined,\n allowOwnerlessCandidate: binding.ownerRole === undefined,\n authoritative: true,\n missingOwnerReason:\n binding.ownerRole === \"frontend\" ? `${optionId} requires a web frontend` : undefined,\n };\n}\n\nconst GRAPH_DISABLED_REASON_BINDINGS: Partial<\n Record<CompatibilityCategory, GraphDisabledReasonBinding>\n> = {\n cssFramework: {\n role: \"css\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"CSS framework requires a web frontend\",\n },\n uiLibrary: {\n role: \"ui\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"UI library requires a web frontend\",\n },\n forms: {\n role: \"forms\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"Forms requires a web frontend\",\n },\n stateManagement: {\n role: \"stateManagement\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"State management requires a web frontend\",\n },\n animation: {\n role: \"animation\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"Animation requires a web frontend\",\n },\n fileUpload: {\n role: \"fileUpload\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"File upload requires a web frontend\",\n },\n i18n: {\n role: \"i18n\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"i18n requires a web frontend\",\n },\n analytics: {\n role: \"analytics\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"Analytics requires a web frontend\",\n },\n webDeploy: {\n role: \"deploy\",\n ecosystem: \"typescript\",\n ownerRole: \"frontend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"Web deployment requires a web frontend\",\n },\n payments: {\n role: \"payments\",\n ecosystem: \"typescript\",\n ownerRole: \"backend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"Payments requires a backend\",\n },\n cms: {\n role: \"cms\",\n ecosystem: \"typescript\",\n ownerRole: \"backend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n missingOwnerReason: \"CMS requires a backend\",\n },\n ai: {\n role: \"ai\",\n ecosystem: \"typescript\",\n ownerRole: \"backend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n },\n vectorDb: {\n role: \"vectorDb\",\n ecosystem: \"typescript\",\n ownerRole: \"backend\",\n ownerEcosystem: \"typescript\",\n currentEcosystem: \"typescript\",\n authoritative: true,\n },\n fileStorage: {\n role: \"fileStorage\",\n ecosystem: \"typescript\",\n ownerRole: \"backend\",\n ownerEcosystem: \"typescript\",\n currentEcosystem: \"typescript\",\n authoritative: true,\n },\n serverDeploy: {\n role: \"deploy\",\n ecosystem: \"typescript\",\n ownerRole: \"backend\",\n ownerEcosystem: \"typescript\",\n authoritative: true,\n },\n dbSetup: {\n role: \"dbSetup\",\n ecosystem: \"universal\",\n ownerRole: \"database\",\n ownerEcosystem: \"universal\",\n authoritative: true,\n missingOwnerReason: \"Select a database first\",\n },\n mobileNavigation: {\n role: \"navigation\",\n ecosystem: \"react-native\",\n ownerRole: \"mobile\",\n ownerEcosystem: \"react-native\",\n authoritative: true,\n missingOwnerReason: \"Mobile navigation requires a native Expo frontend\",\n },\n mobileUI: {\n role: \"ui\",\n ecosystem: \"react-native\",\n ownerRole: \"mobile\",\n ownerEcosystem: \"react-native\",\n authoritative: true,\n missingOwnerReason: \"Mobile UI requires a native Expo frontend\",\n },\n mobileStorage: {\n role: \"storage\",\n ecosystem: \"react-native\",\n ownerRole: \"mobile\",\n ownerEcosystem: \"react-native\",\n authoritative: true,\n missingOwnerReason: \"Mobile storage requires a native Expo frontend\",\n },\n mobileTesting: {\n role: \"testing\",\n ecosystem: \"react-native\",\n ownerRole: \"mobile\",\n ownerEcosystem: \"react-native\",\n authoritative: true,\n missingOwnerReason: \"Mobile testing requires a native Expo frontend\",\n },\n mobilePush: {\n role: \"push\",\n ecosystem: \"react-native\",\n ownerRole: \"mobile\",\n ownerEcosystem: \"react-native\",\n authoritative: true,\n missingOwnerReason: \"Mobile push requires a native Expo frontend\",\n },\n mobileOTA: {\n role: \"ota\",\n ecosystem: \"react-native\",\n ownerRole: \"mobile\",\n ownerEcosystem: \"react-native\",\n authoritative: true,\n missingOwnerReason: \"Mobile OTA requires a native Expo frontend\",\n },\n mobileDeepLinking: {\n role: \"deepLinking\",\n ecosystem: \"react-native\",\n ownerRole: \"mobile\",\n ownerEcosystem: \"react-native\",\n authoritative: true,\n missingOwnerReason: \"Mobile deep linking requires a native Expo frontend\",\n },\n mobileLibraries: {\n role: \"libraries\",\n ecosystem: \"react-native\",\n ownerRole: \"mobile\",\n ownerEcosystem: \"react-native\",\n authoritative: true,\n missingOwnerReason: \"Mobile libraries require a native Expo frontend\",\n candidateIdPrefix: \"candidate:native\",\n },\n javaBuildTool: {\n role: \"buildTool\",\n ecosystem: \"java\",\n ownerRole: \"backend\",\n ownerEcosystem: \"java\",\n currentEcosystem: \"java\",\n allowNoneCandidate: true,\n authoritative: true,\n },\n javaOrm: {\n role: \"orm\",\n ecosystem: \"java\",\n ownerRole: \"backend\",\n ownerEcosystem: \"java\",\n currentEcosystem: \"java\",\n authoritative: true,\n missingOwnerReason: \"Java ORM support currently requires Spring Boot\",\n },\n javaAuth: {\n role: \"auth\",\n ecosystem: \"java\",\n ownerRole: \"backend\",\n ownerEcosystem: \"java\",\n currentEcosystem: \"java\",\n authoritative: true,\n missingOwnerReason: \"Java auth support currently requires Spring Boot\",\n },\n javaLibraries: {\n role: \"libraries\",\n ecosystem: \"java\",\n ownerRole: \"backend\",\n ownerEcosystem: \"java\",\n currentEcosystem: \"java\",\n authoritative: true,\n missingOwnerReason: \"Spring libraries currently require Spring Boot in the Java scaffold\",\n },\n javaTestingLibraries: {\n role: \"testing\",\n ecosystem: \"java\",\n ownerRole: \"backend\",\n ownerEcosystem: \"java\",\n currentEcosystem: \"java\",\n authoritative: true,\n },\n rustRealtime: {\n role: \"realtime\",\n ecosystem: \"rust\",\n ownerRole: \"backend\",\n ownerEcosystem: \"rust\",\n currentEcosystem: \"rust\",\n authoritative: true,\n },\n rustMessageQueue: {\n role: \"jobQueue\",\n ecosystem: \"rust\",\n ownerRole: \"backend\",\n ownerEcosystem: \"rust\",\n currentEcosystem: \"rust\",\n authoritative: true,\n },\n rustObservability: {\n role: \"observability\",\n ecosystem: \"rust\",\n ownerRole: \"backend\",\n ownerEcosystem: \"rust\",\n currentEcosystem: \"rust\",\n authoritative: true,\n candidateIdPrefix: \"candidate:native\",\n },\n rustTemplating: {\n role: \"templating\",\n ecosystem: \"rust\",\n ownerRole: \"backend\",\n ownerEcosystem: \"rust\",\n currentEcosystem: \"rust\",\n authoritative: true,\n },\n pythonTesting: {\n role: \"testing\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n },\n pythonCaching: {\n role: \"caching\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n candidateIdPrefix: \"candidate:native\",\n },\n pythonRealtime: {\n role: \"realtime\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n },\n pythonObservability: {\n role: \"observability\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n candidateIdPrefix: \"candidate:native\",\n },\n pythonCli: {\n role: \"cli\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n },\n pythonCloudSdk: {\n role: \"cloudSdk\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n },\n pythonHttpClient: {\n role: \"httpClient\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n },\n pythonData: {\n role: \"data\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n },\n pythonMedia: {\n role: \"media\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n },\n pythonServer: {\n role: \"server\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n },\n pythonPackageManager: {\n role: \"packageManager\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n },\n pythonMessageQueue: {\n role: \"messageQueue\",\n ecosystem: \"python\",\n ownerRole: \"backend\",\n ownerEcosystem: \"python\",\n currentEcosystem: \"python\",\n authoritative: true,\n },\n goTesting: {\n role: \"testing\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n },\n goRealtime: {\n role: \"realtime\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n },\n goMessageQueue: {\n role: \"jobQueue\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n },\n goCaching: {\n role: \"caching\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n candidateIdPrefix: \"candidate:native\",\n },\n goConfig: {\n role: \"config\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n },\n goObservability: {\n role: \"observability\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n candidateIdPrefix: \"candidate:native\",\n },\n goValidation: {\n role: \"validation\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n },\n goQuality: {\n role: \"codeQuality\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n },\n goMigrations: {\n role: \"migrations\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n },\n goTemplating: {\n role: \"templating\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n },\n goProtoTooling: {\n role: \"buildTool\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n },\n goDI: {\n role: \"libraries\",\n ecosystem: \"go\",\n ownerRole: \"backend\",\n ownerEcosystem: \"go\",\n currentEcosystem: \"go\",\n authoritative: true,\n },\n dotnetOrm: {\n role: \"orm\",\n ecosystem: \"dotnet\",\n ownerRole: \"backend\",\n ownerEcosystem: \"dotnet\",\n currentEcosystem: \"dotnet\",\n authoritative: true,\n missingOwnerReason: \".NET data access requires an ASP.NET backend\",\n },\n dotnetAuth: {\n role: \"auth\",\n ecosystem: \"dotnet\",\n ownerRole: \"backend\",\n ownerEcosystem: \"dotnet\",\n currentEcosystem: \"dotnet\",\n authoritative: true,\n missingOwnerReason: \".NET auth requires an ASP.NET backend\",\n },\n dotnetApi: {\n role: \"api\",\n ecosystem: \"dotnet\",\n ownerRole: \"backend\",\n ownerEcosystem: \"dotnet\",\n currentEcosystem: \"dotnet\",\n authoritative: true,\n },\n dotnetTesting: {\n role: \"testing\",\n ecosystem: \"dotnet\",\n ownerRole: \"backend\",\n ownerEcosystem: \"dotnet\",\n currentEcosystem: \"dotnet\",\n authoritative: true,\n },\n dotnetJobQueue: {\n role: \"jobQueue\",\n ecosystem: \"dotnet\",\n ownerRole: \"backend\",\n ownerEcosystem: \"dotnet\",\n currentEcosystem: \"dotnet\",\n authoritative: true,\n },\n dotnetRealtime: {\n role: \"realtime\",\n ecosystem: \"dotnet\",\n ownerRole: \"backend\",\n ownerEcosystem: \"dotnet\",\n currentEcosystem: \"dotnet\",\n authoritative: true,\n },\n dotnetObservability: {\n role: \"observability\",\n ecosystem: \"dotnet\",\n ownerRole: \"backend\",\n ownerEcosystem: \"dotnet\",\n currentEcosystem: \"dotnet\",\n authoritative: true,\n candidateIdPrefix: \"candidate:native\",\n },\n dotnetCaching: {\n role: \"caching\",\n ecosystem: \"dotnet\",\n ownerRole: \"backend\",\n ownerEcosystem: \"dotnet\",\n currentEcosystem: \"dotnet\",\n authoritative: true,\n candidateIdPrefix: \"candidate:native\",\n },\n dotnetDeploy: {\n role: \"deploy\",\n ecosystem: \"dotnet\",\n ownerRole: \"backend\",\n ownerEcosystem: \"dotnet\",\n currentEcosystem: \"dotnet\",\n authoritative: true,\n },\n dotnetLibraries: {\n role: \"libraries\",\n ecosystem: \"dotnet\",\n ownerRole: \"backend\",\n ownerEcosystem: \"dotnet\",\n currentEcosystem: \"dotnet\",\n authoritative: true,\n candidateIdPrefix: \"candidate:native\",\n },\n};\n\nfunction compatibilityInputToGraphProjectConfig(\n currentStack: CompatibilityInput,\n): Partial<ProjectConfig> {\n const frontend = [\n ...currentStack.webFrontend.filter((frontend) => frontend !== \"none\"),\n ...currentStack.nativeFrontend.filter((frontend) => frontend !== \"none\"),\n ];\n\n return {\n ...currentStack,\n frontend: (frontend.length > 0 ? frontend : [\"none\"]) as ProjectConfig[\"frontend\"],\n addons: [\n ...currentStack.codeQuality,\n ...currentStack.documentation,\n ...currentStack.appPlatforms,\n ] as ProjectConfig[\"addons\"],\n ai: currentStack.aiSdk as ProjectConfig[\"ai\"],\n } as unknown as Partial<ProjectConfig>;\n}\n\nfunction getGraphDisabledReason(\n currentStack: CompatibilityInput,\n category: CompatibilityCategory,\n optionId: string,\n): GraphDisabledReasonResult {\n const unhandled = { handled: false, authoritative: false, reason: null };\n\n if (optionId === \"false\") return unhandled;\n\n const binding =\n getAddonOrExampleGraphBinding(category, optionId) ??\n getSharedBackendServiceGraphBinding(currentStack, category) ??\n getElixirGraphBinding(currentStack, category) ??\n GRAPH_DISABLED_REASON_BINDINGS[category];\n if (!binding) return unhandled;\n if (binding.currentEcosystem && currentStack.ecosystem !== binding.currentEcosystem) {\n return unhandled;\n }\n if (optionId === \"none\" && category !== \"cssFramework\" && !binding.allowNoneCandidate) {\n return unhandled;\n }\n\n let parts;\n try {\n parts = legacyProjectConfigToStackParts(compatibilityInputToGraphProjectConfig(currentStack));\n } catch {\n return unhandled;\n }\n\n const owner = binding.ownerRole\n ? parts.find(\n (part) =>\n part.role === binding.ownerRole &&\n !part.ownerPartId &&\n (!binding.ownerEcosystem || part.ecosystem === binding.ownerEcosystem),\n )\n : undefined;\n if (!owner && optionId === \"none\") return unhandled;\n if (!owner && !binding.allowOwnerlessCandidate) {\n return {\n handled: true,\n authoritative: binding.authoritative === true,\n reason: binding.missingOwnerReason ?? null,\n };\n }\n\n const issue = getStackPartCompatibilityIssueForPart(\n {\n id: `${binding.candidateIdPrefix ?? \"candidate\"}:${binding.ownerRole}.${binding.role}:${binding.ecosystem}:${optionId}`,\n role: binding.role,\n toolId: optionId,\n ecosystem: binding.ecosystem,\n ownerPartId: owner?.id,\n settings: {\n astroIntegration: currentStack.astroIntegration,\n ecosystem: currentStack.ecosystem,\n },\n },\n parts,\n );\n\n return {\n handled: true,\n authoritative: binding.authoritative === true,\n reason: issue?.message ?? (!owner ? (binding.missingOwnerReason ?? null) : null),\n };\n}\n\nconst WEB_FRAMEWORKS: readonly Frontend[] = [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\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 CODEGEN_COMPATIBLE_FRONTENDS: readonly Frontend[] = [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n];\n\nconst ADDON_COMPATIBILITY: Record<Addons, readonly Frontend[]> = {\n pwa: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"solid\",\n \"next\",\n \"vinext\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n ],\n tauri: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"next\",\n \"astro\",\n \"qwik\",\n \"angular\",\n \"redwood\",\n \"fresh\",\n ],\n electron: [\"tanstack-router\", \"react-vite\", \"vanilla-vite\", \"vue\", \"solid\"],\n capacitor: [\"tanstack-router\", \"react-vite\", \"vanilla-vite\", \"vue\", \"solid\"],\n biome: [],\n eslint: [],\n prettier: [],\n husky: [],\n lefthook: [],\n knip: [],\n gitleaks: [],\n turborepo: [],\n nx: [],\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 axios: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n ],\n firebase: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vanilla-vite\",\n \"vue\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"astro\",\n \"qwik\",\n \"angular\",\n ],\n \"graphql-codegen\": CODEGEN_COMPATIBLE_FRONTENDS,\n \"openapi-typescript\": CODEGEN_COMPATIBLE_FRONTENDS,\n \"apollo-client\": [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"vue\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n ],\n swr: [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"astro\",\n \"redwood\",\n ],\n \"tanstack-query\": [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"angular\",\n \"astro\",\n \"redwood\",\n ],\n \"tanstack-table\": [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"angular\",\n \"astro\",\n \"redwood\",\n ],\n \"tanstack-virtual\": [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"angular\",\n \"astro\",\n \"redwood\",\n ],\n \"tanstack-db\": [\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 \"redwood\",\n ],\n \"tanstack-pacer\": [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n \"solid-start\",\n \"angular\",\n \"astro\",\n \"redwood\",\n ],\n \"backend-utils\": [],\n \"docker-compose\": [],\n kong: [],\n devcontainer: [],\n \"github-actions\": [],\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 includesStandaloneVite = frontends.includes(\"vanilla-vite\") || frontends.includes(\"vue\");\n const includesNative = frontends.some((frontend) =>\n [\"native-bare\", \"native-uniwind\", \"native-unistyles\"].includes(frontend),\n );\n const base: API[] = [\n \"trpc\",\n \"orpc\",\n \"ts-rest\",\n \"garph\",\n \"graphql-yoga\",\n \"apollo-server\",\n \"openapi\",\n \"none\",\n ];\n\n if (includesNative) {\n return [\"trpc\", \"orpc\", \"ts-rest\", \"garph\", \"none\"] as API[];\n }\n\n if (includesStandaloneVite) {\n return [\"graphql-yoga\", \"apollo-server\", \"openapi\", \"none\"] as API[];\n }\n\n if (includesQwik || includesAngular || includesRedwood || includesFresh) {\n return [\"graphql-yoga\", \"none\"] as API[];\n }\n\n const includesSolidStartApi = frontends.includes(\"solid-start\");\n if (includesNuxt || includesSvelte || includesSolid || includesSolidStartApi) {\n return [\"orpc\", \"graphql-yoga\", \"openapi\", \"none\"] as API[];\n }\n\n if (includesAstro && astroIntegration !== \"react\") {\n return [\"orpc\", \"graphql-yoga\", \"openapi\", \"none\"] as API[];\n }\n\n return base;\n}\n\nfunction getReactOnlyApiDisplayName(api: API) {\n if (api === \"trpc\") return \"tRPC\";\n if (api === \"ts-rest\") return \"ts-rest\";\n if (api === \"openapi\") return \"OpenAPI\";\n if (api === \"apollo-server\") return \"Apollo Server\";\n return \"garph\";\n}\n\nexport function getApiFrontendCompatibilityIssue(\n api: API | undefined,\n frontends: Frontend[] = [],\n astroIntegration?: AstroIntegration,\n): CompatibilityIssue | undefined {\n if (!api || api === \"none\") return undefined;\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 includesSolidStart = frontends.includes(\"solid-start\");\n const includesStandaloneVite = frontends.includes(\"vanilla-vite\") || frontends.includes(\"vue\");\n const isReactOnlyApi =\n api === \"trpc\" || api === \"ts-rest\" || api === \"garph\" || api === \"apollo-server\";\n\n if (\n includesStandaloneVite &&\n (api === \"trpc\" || api === \"orpc\" || api === \"ts-rest\" || api === \"garph\")\n ) {\n const incompatibleFrontend = frontends.includes(\"vanilla-vite\") ? \"vanilla-vite\" : \"vue\";\n return {\n code: \"STANDALONE_VITE_API_UNSUPPORTED\",\n message: \"Standalone Vite frontends support only GraphQL and OpenAPI API integrations.\",\n category: \"api\",\n optionId: api,\n provided: { api, frontend: incompatibleFrontend },\n suggestions: [\n \"Use --api graphql-yoga, --api apollo-server, or --api openapi\",\n \"Choose a React-based frontend for tRPC, oRPC, ts-rest, or garph\",\n \"Use --api none\",\n ],\n };\n }\n\n if ((includesNuxt || includesSvelte || includesSolid || includesSolidStart) && isReactOnlyApi) {\n const incompatibleFrontend = includesNuxt\n ? \"nuxt\"\n : includesSvelte\n ? \"svelte\"\n : includesSolid\n ? \"solid\"\n : \"solid-start\";\n\n return {\n code: \"API_REQUIRES_REACT_FRONTEND\",\n message: `${getReactOnlyApiDisplayName(api)} API requires React-based frontends.`,\n category: \"api\",\n optionId: api,\n provided: { api, frontend: incompatibleFrontend },\n suggestions: [\n \"Use --api orpc (works with all frontends)\",\n \"Use --api none\",\n \"Choose next, react-router, react-vite, or tanstack-start\",\n ],\n };\n }\n\n if (includesQwik) {\n return {\n code: \"QWIK_REJECTS_EXTERNAL_API\",\n message: \"Qwik has built-in server capabilities and doesn't support external APIs.\",\n category: \"api\",\n optionId: api,\n provided: { api, frontend: \"qwik\" },\n suggestions: [\"Use --api none with Qwik\"],\n };\n }\n\n if (includesAngular) {\n return {\n code: \"ANGULAR_REJECTS_EXTERNAL_API\",\n message: \"Angular has built-in HttpClient and doesn't support external APIs.\",\n category: \"api\",\n optionId: api,\n provided: { api, frontend: \"angular\" },\n suggestions: [\"Use --api none with Angular\"],\n };\n }\n\n if (includesRedwood) {\n return {\n code: \"REDWOOD_REJECTS_EXTERNAL_API\",\n message: \"RedwoodJS has built-in GraphQL API and doesn't support external APIs.\",\n category: \"api\",\n optionId: api,\n provided: { api, frontend: \"redwood\" },\n suggestions: [\"Use --api none with RedwoodJS\"],\n };\n }\n\n if (includesFresh) {\n return {\n code: \"FRESH_REJECTS_EXTERNAL_API\",\n message: \"Fresh has built-in server capabilities and doesn't support external APIs.\",\n category: \"api\",\n optionId: api,\n provided: { api, frontend: \"fresh\" },\n suggestions: [\"Use --api none with Fresh\"],\n };\n }\n\n if (includesAstro && astroIntegration !== \"react\" && isReactOnlyApi) {\n return {\n code: \"ASTRO_API_REQUIRES_REACT_INTEGRATION\",\n message: `${getReactOnlyApiDisplayName(api)} API requires React integration with Astro.`,\n category: \"api\",\n optionId: api,\n provided: { api, \"astro-integration\": astroIntegration ?? \"none\" },\n suggestions: [\n \"Use --api orpc (works with all Astro integrations)\",\n \"Use --api none\",\n \"Use --astro-integration react\",\n ],\n };\n }\n\n return undefined;\n}\n\nexport function getAIFrontendCompatibilityIssue(\n ai: AI | undefined,\n frontends: Frontend[] = [],\n): CompatibilityIssue | undefined {\n if (!ai || ai !== \"tanstack-ai\") return undefined;\n\n if (hasTanStackAICompatibleFrontend(frontends)) return undefined;\n\n return {\n code: \"TANSTACK_AI_REQUIRES_REACT_OR_SOLID_FRONTEND\",\n message:\n \"TanStack AI requires React or Solid frontend (no Vue/Svelte/Angular adapter yet). \" +\n \"Please use a React-based frontend (Next.js, TanStack Router, React Router, etc.) or Solid.\",\n category: \"ai\",\n optionId: ai,\n provided: { ai, frontend: frontends.length > 0 ? frontends : \"none\" },\n suggestions: [\n \"Use a React-based frontend such as Next.js, TanStack Router, or React Router\",\n \"Use Solid or SolidStart\",\n \"Choose a different AI SDK\",\n ],\n };\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 === \"self\") {\n return false;\n }\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 webFrontend: [frontend],\n },\n auth as Auth,\n ) === null\n );\n }\n\n return true;\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 [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"astro\",\n ].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(\n uiLibrary: UILibrary | undefined,\n frontends: Frontend[] = [],\n): CSSFramework[] {\n const frameworks =\n !uiLibrary || uiLibrary === \"none\"\n ? ([\n \"tailwind\",\n \"scss\",\n \"less\",\n \"postcss-only\",\n \"styled-components\",\n \"none\",\n ] as CSSFramework[])\n : ([...UI_LIBRARY_COMPATIBILITY[uiLibrary].cssFrameworks] as CSSFramework[]);\n\n if (frontends.length === 0) return frameworks;\n\n const reactFrontends: Frontend[] = [\n \"tanstack-router\",\n \"react-router\",\n \"react-vite\",\n \"tanstack-start\",\n \"next\",\n \"vinext\",\n \"redwood\",\n ];\n return frontends.some((frontend) => reactFrontends.includes(frontend))\n ? frameworks\n : frameworks.filter((framework) => framework !== \"styled-components\");\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 if (frontends.some((frontend) => [\"vanilla-vite\", \"vue\"].includes(frontend))) {\n return [\"none\"];\n }\n\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 [\"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 [\"cms\", input.cms],\n [\"featureFlags\", input.featureFlags],\n [\"integrations\", input.integrations],\n [\"ecommerce\", input.ecommerce],\n [\"pythonApi\", input.pythonApi],\n [\"javaWebFramework\", input.javaWebFramework],\n [\"javaBuildTool\", input.javaBuildTool],\n [\"javaOrm\", input.javaOrm],\n [\"javaAuth\", input.javaAuth],\n [\"dotnetWebFramework\", input.dotnetWebFramework],\n [\"dotnetOrm\", input.dotnetOrm],\n [\"dotnetAuth\", input.dotnetAuth],\n [\"dotnetApi\", input.dotnetApi],\n [\"dotnetJobQueue\", input.dotnetJobQueue],\n [\"dotnetRealtime\", input.dotnetRealtime],\n [\"dotnetCaching\", input.dotnetCaching],\n [\"dotnetDeploy\", input.dotnetDeploy],\n [\"elixirWebFramework\", input.elixirWebFramework],\n [\"elixirOrm\", input.elixirOrm],\n [\"elixirAuth\", input.elixirAuth],\n [\"elixirApi\", input.elixirApi],\n [\"elixirRealtime\", input.elixirRealtime],\n [\"elixirJobs\", input.elixirJobs],\n [\"elixirValidation\", input.elixirValidation],\n [\"elixirHttp\", input.elixirHttp],\n [\"elixirJson\", input.elixirJson],\n [\"elixirEmail\", input.elixirEmail],\n [\"elixirCaching\", input.elixirCaching],\n [\"elixirObservability\", input.elixirObservability],\n [\"elixirTesting\", input.elixirTesting],\n [\"elixirQuality\", input.elixirQuality],\n [\"elixirI18n\", input.elixirI18n],\n [\"elixirHttpServer\", input.elixirHttpServer],\n [\"elixirApplicationFramework\", input.elixirApplicationFramework],\n [\"elixirDocumentation\", input.elixirDocumentation],\n [\"elixirClustering\", input.elixirClustering],\n [\"elixirDeploy\", input.elixirDeploy],\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 const apiFrontendIssue = getApiFrontendCompatibilityIssue(\n input.api as API | undefined,\n [...input.webFrontend, ...input.nativeFrontend] as Frontend[],\n input.astroIntegration as AstroIntegration | undefined,\n );\n if (apiFrontendIssue) {\n issues.push(apiFrontendIssue);\n }\n\n const aiFrontendIssue = getAIFrontendCompatibilityIssue(\n input.aiSdk as AI | undefined,\n [...input.webFrontend, ...input.nativeFrontend] as Frontend[],\n );\n if (aiFrontendIssue) {\n issues.push(aiFrontendIssue);\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 for (const addon of input.examples) {\n const reason = getDisabledReason(input, \"examples\", addon);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_ADDON\",\n message: reason,\n category: \"examples\",\n optionId: addon,\n });\n }\n }\n\n for (const javaLibrary of input.javaLibraries) {\n const reason = getDisabledReason(input, \"javaLibraries\", javaLibrary);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_JAVA_LIBRARY\",\n message: reason,\n category: \"javaLibraries\",\n optionId: javaLibrary,\n });\n }\n }\n\n for (const mobileLibrary of input.mobileLibraries ?? []) {\n const reason = getDisabledReason(input, \"mobileLibraries\", mobileLibrary);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_MOBILE_LIBRARY\",\n message: reason,\n category: \"mobileLibraries\",\n optionId: mobileLibrary,\n });\n }\n }\n\n for (const testingLibrary of input.javaTestingLibraries) {\n const reason = getDisabledReason(input, \"javaTestingLibraries\", testingLibrary);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_JAVA_TESTING_LIBRARY\",\n message: reason,\n category: \"javaTestingLibraries\",\n optionId: testingLibrary,\n });\n }\n }\n\n for (const testingLibrary of input.dotnetTesting) {\n const reason = getDisabledReason(input, \"dotnetTesting\", testingLibrary);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_DOTNET_TESTING_LIBRARY\",\n message: reason,\n category: \"dotnetTesting\",\n optionId: testingLibrary,\n });\n }\n }\n\n for (const observabilityLibrary of input.dotnetObservability) {\n const reason = getDisabledReason(input, \"dotnetObservability\", observabilityLibrary);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_DOTNET_OBSERVABILITY\",\n message: reason,\n category: \"dotnetObservability\",\n optionId: observabilityLibrary,\n });\n }\n }\n\n for (const dotnetLibrary of input.dotnetLibraries ?? []) {\n const reason = getDisabledReason(input, \"dotnetLibraries\", dotnetLibrary);\n if (reason) {\n issues.push({\n code: \"INCOMPATIBLE_DOTNET_LIBRARY\",\n message: reason,\n category: \"dotnetLibraries\",\n optionId: dotnetLibrary,\n });\n }\n }\n\n return { issues };\n}\n","import type {\n CLIInput,\n ProjectConfig,\n StackPart,\n StackPartEcosystem,\n StackPartRole,\n} from \"./types\";\n\nimport { analyzeStackCompatibility, type CompatibilityInput } from \"./compatibility\";\nimport { createCliDefaultProjectConfigBase, type CliDefaultProjectConfigBase } from \"./defaults\";\nimport { normalizeOptionId, type OptionCategory } from \"./option-metadata\";\nimport {\n formatStackPartSpec,\n getAddonStackPartBinding,\n legacyProjectConfigToStackParts,\n parseStackPartSpecs,\n stackPartsToLegacyProjectConfigPartial,\n validateStackParts,\n} from \"./stack-graph\";\n\nexport type StackSelectionMode = \"solo\" | \"multi\";\nexport type StackSelectionInput = CompatibilityInput & {\n stackMode: StackSelectionMode;\n stackPartSpecs: string[];\n};\nexport type StackSelectionState = StackSelectionInput;\n\nexport const DEFAULT_STACK_SELECTION: StackSelectionState = {\n stackMode: \"solo\",\n stackPartSpecs: [],\n ecosystem: \"typescript\",\n projectName: \"my-app\",\n webFrontend: [\"tanstack-router\"],\n nativeFrontend: [\"none\"],\n astroIntegration: \"none\",\n runtime: \"bun\",\n backend: \"hono\",\n database: \"sqlite\",\n orm: \"drizzle\",\n dbSetup: \"none\",\n auth: \"better-auth\",\n payments: \"none\",\n email: \"none\",\n fileUpload: \"none\",\n logging: \"none\",\n observability: \"none\",\n featureFlags: \"none\",\n integrations: \"none\",\n ecommerce: \"none\",\n analytics: \"none\",\n mobileNavigation: \"none\",\n mobileUI: \"none\",\n mobileStorage: \"none\",\n mobileTesting: \"none\",\n mobilePush: \"none\",\n mobileOTA: \"none\",\n mobileDeepLinking: \"none\",\n mobileLibraries: [],\n backendLibraries: \"none\",\n stateManagement: \"none\",\n forms: \"react-hook-form\",\n validation: \"zod\",\n testing: \"vitest\",\n realtime: \"none\",\n jobQueue: \"none\",\n caching: \"none\",\n rateLimit: \"none\",\n i18n: \"none\",\n animation: \"none\",\n cssFramework: \"tailwind\",\n uiLibrary: \"shadcn-ui\",\n shadcnBase: \"radix\",\n shadcnStyle: \"nova\",\n shadcnIconLibrary: \"lucide\",\n shadcnColorTheme: \"neutral\",\n shadcnBaseColor: \"neutral\",\n shadcnFont: \"inter\",\n shadcnRadius: \"default\",\n cms: \"none\",\n search: \"none\",\n vectorDb: \"none\",\n fileStorage: \"none\",\n codeQuality: [],\n documentation: [],\n appPlatforms: [\"turborepo\"],\n packageManager: \"bun\",\n workspaceShape: \"monorepo\",\n versionChannel: \"stable\",\n examples: [],\n aiSdk: \"none\",\n aiDocs: [\"claude-md\", \"agents-md\"],\n git: \"true\",\n install: \"true\",\n api: \"trpc\",\n webDeploy: \"none\",\n serverDeploy: \"none\",\n yolo: \"false\",\n rustWebFramework: \"axum\",\n rustFrontend: \"none\",\n rustOrm: \"sea-orm\",\n rustApi: \"none\",\n rustCli: \"none\",\n rustLibraries: [],\n rustLogging: \"tracing\",\n rustErrorHandling: \"anyhow-thiserror\",\n rustCaching: \"none\",\n rustAuth: \"none\",\n rustRealtime: \"none\",\n rustMessageQueue: \"none\",\n rustObservability: \"none\",\n rustTemplating: \"none\",\n pythonWebFramework: \"fastapi\",\n pythonOrm: \"sqlalchemy\",\n pythonValidation: \"pydantic\",\n pythonAi: [],\n pythonAuth: \"none\",\n pythonApi: \"none\",\n pythonTaskQueue: \"none\",\n pythonGraphql: \"none\",\n pythonQuality: \"ruff\",\n pythonTesting: [],\n pythonCaching: \"none\",\n pythonRealtime: \"none\",\n pythonObservability: \"none\",\n pythonCli: [],\n pythonCloudSdk: \"none\",\n pythonHttpClient: \"none\",\n pythonData: [],\n pythonMedia: \"none\",\n pythonServer: \"none\",\n pythonPackageManager: \"uv\",\n pythonMessageQueue: \"none\",\n goWebFramework: \"gin\",\n goOrm: \"gorm\",\n goApi: \"none\",\n goCli: \"none\",\n goLogging: \"zap\",\n goAuth: \"none\",\n goTesting: [],\n goRealtime: \"none\",\n goMessageQueue: \"none\",\n goCaching: \"none\",\n goConfig: \"none\",\n goObservability: \"none\",\n goValidation: \"none\",\n goQuality: \"none\",\n goMigrations: \"none\",\n goTemplating: \"none\",\n goProtoTooling: \"none\",\n goDI: \"none\",\n javaLanguage: \"java\",\n javaWebFramework: \"spring-boot\",\n javaBuildTool: \"maven\",\n javaOrm: \"none\",\n javaAuth: \"none\",\n javaApi: \"none\",\n javaLogging: \"none\",\n javaLibraries: [],\n javaTestingLibraries: [\"junit5\"],\n dotnetWebFramework: \"aspnet-minimal\",\n dotnetOrm: \"ef-core\",\n dotnetAuth: \"aspnet-identity\",\n dotnetApi: \"minimal-api\",\n dotnetTesting: [\"xunit\"],\n dotnetJobQueue: \"none\",\n dotnetRealtime: \"signalr\",\n dotnetObservability: [\"serilog\"],\n dotnetValidation: \"none\",\n dotnetCaching: \"none\",\n dotnetDeploy: \"docker\",\n dotnetLibraries: [],\n elixirWebFramework: \"phoenix\",\n elixirOrm: \"ecto-sql\",\n elixirAuth: \"none\",\n elixirApi: \"rest\",\n elixirRealtime: \"channels\",\n elixirJobs: \"none\",\n elixirValidation: \"ecto-changesets\",\n elixirHttp: \"req\",\n elixirJson: \"jason\",\n elixirEmail: \"none\",\n elixirCaching: \"none\",\n elixirObservability: \"telemetry\",\n elixirTesting: \"ex_unit\",\n elixirQuality: \"credo\",\n elixirI18n: \"none\",\n elixirHttpServer: \"cowboy\",\n elixirApplicationFramework: \"none\",\n elixirDocumentation: \"none\",\n elixirClustering: \"none\",\n elixirDeploy: \"none\",\n elixirLibraries: [],\n};\n\nexport type StackSelectionKey = keyof StackSelectionState;\n\ntype StackSelectionUrlValue = string | string[] | null | undefined;\ntype StackSelectionUrlRecord = Record<string, StackSelectionUrlValue>;\n\nexport const NON_OPTION_STACK_SELECTION_KEYS = [\n \"stackMode\",\n \"stackPartSpecs\",\n \"ecosystem\",\n \"projectName\",\n \"yolo\",\n] as const;\n\nexport const STACK_SELECTION_OPTION_CATEGORY_BY_KEY: Record<\n Exclude<StackSelectionKey, (typeof NON_OPTION_STACK_SELECTION_KEYS)[number]>,\n OptionCategory\n> = {\n webFrontend: \"webFrontend\",\n nativeFrontend: \"nativeFrontend\",\n astroIntegration: \"astroIntegration\",\n runtime: \"runtime\",\n backend: \"backend\",\n database: \"database\",\n orm: \"orm\",\n dbSetup: \"dbSetup\",\n auth: \"auth\",\n payments: \"payments\",\n email: \"email\",\n fileUpload: \"fileUpload\",\n logging: \"logging\",\n observability: \"observability\",\n featureFlags: \"featureFlags\",\n integrations: \"integrations\",\n ecommerce: \"ecommerce\",\n analytics: \"analytics\",\n mobileNavigation: \"mobileNavigation\",\n mobileUI: \"mobileUI\",\n mobileStorage: \"mobileStorage\",\n mobileTesting: \"mobileTesting\",\n mobilePush: \"mobilePush\",\n mobileOTA: \"mobileOTA\",\n mobileDeepLinking: \"mobileDeepLinking\",\n mobileLibraries: \"mobileLibraries\",\n backendLibraries: \"backendLibraries\",\n stateManagement: \"stateManagement\",\n forms: \"forms\",\n validation: \"validation\",\n testing: \"testing\",\n realtime: \"realtime\",\n jobQueue: \"jobQueue\",\n caching: \"caching\",\n rateLimit: \"rateLimit\",\n i18n: \"i18n\",\n animation: \"animation\",\n cssFramework: \"cssFramework\",\n uiLibrary: \"uiLibrary\",\n shadcnBase: \"shadcnBase\",\n shadcnStyle: \"shadcnStyle\",\n shadcnIconLibrary: \"shadcnIconLibrary\",\n shadcnColorTheme: \"shadcnColorTheme\",\n shadcnBaseColor: \"shadcnBaseColor\",\n shadcnFont: \"shadcnFont\",\n shadcnRadius: \"shadcnRadius\",\n cms: \"cms\",\n search: \"search\",\n vectorDb: \"vectorDb\",\n fileStorage: \"fileStorage\",\n codeQuality: \"codeQuality\",\n documentation: \"documentation\",\n appPlatforms: \"appPlatforms\",\n packageManager: \"packageManager\",\n workspaceShape: \"workspaceShape\",\n versionChannel: \"versionChannel\",\n examples: \"examples\",\n aiSdk: \"ai\",\n aiDocs: \"aiDocs\",\n git: \"git\",\n install: \"install\",\n api: \"api\",\n webDeploy: \"webDeploy\",\n serverDeploy: \"serverDeploy\",\n rustWebFramework: \"rustWebFramework\",\n rustFrontend: \"rustFrontend\",\n rustOrm: \"rustOrm\",\n rustApi: \"rustApi\",\n rustCli: \"rustCli\",\n rustLibraries: \"rustLibraries\",\n rustLogging: \"rustLogging\",\n rustErrorHandling: \"rustErrorHandling\",\n rustCaching: \"rustCaching\",\n rustAuth: \"rustAuth\",\n rustRealtime: \"rustRealtime\",\n rustMessageQueue: \"rustMessageQueue\",\n rustObservability: \"rustObservability\",\n rustTemplating: \"rustTemplating\",\n pythonWebFramework: \"pythonWebFramework\",\n pythonOrm: \"pythonOrm\",\n pythonValidation: \"pythonValidation\",\n pythonAi: \"pythonAi\",\n pythonAuth: \"pythonAuth\",\n pythonApi: \"pythonApi\",\n pythonTaskQueue: \"pythonTaskQueue\",\n pythonGraphql: \"pythonGraphql\",\n pythonQuality: \"pythonQuality\",\n pythonTesting: \"pythonTesting\",\n pythonCaching: \"pythonCaching\",\n pythonRealtime: \"pythonRealtime\",\n pythonObservability: \"pythonObservability\",\n pythonCli: \"pythonCli\",\n pythonCloudSdk: \"pythonCloudSdk\",\n pythonHttpClient: \"pythonHttpClient\",\n pythonData: \"pythonData\",\n pythonMedia: \"pythonMedia\",\n pythonServer: \"pythonServer\",\n pythonPackageManager: \"pythonPackageManager\",\n pythonMessageQueue: \"pythonMessageQueue\",\n goWebFramework: \"goWebFramework\",\n goOrm: \"goOrm\",\n goApi: \"goApi\",\n goCli: \"goCli\",\n goLogging: \"goLogging\",\n goAuth: \"goAuth\",\n goTesting: \"goTesting\",\n goRealtime: \"goRealtime\",\n goMessageQueue: \"goMessageQueue\",\n goCaching: \"goCaching\",\n goConfig: \"goConfig\",\n goObservability: \"goObservability\",\n goValidation: \"goValidation\",\n goQuality: \"goQuality\",\n goMigrations: \"goMigrations\",\n goTemplating: \"goTemplating\",\n goProtoTooling: \"goProtoTooling\",\n goDI: \"goDI\",\n javaLanguage: \"javaLanguage\",\n javaWebFramework: \"javaWebFramework\",\n javaBuildTool: \"javaBuildTool\",\n javaOrm: \"javaOrm\",\n javaAuth: \"javaAuth\",\n javaApi: \"javaApi\",\n javaLogging: \"javaLogging\",\n javaLibraries: \"javaLibraries\",\n javaTestingLibraries: \"javaTestingLibraries\",\n dotnetWebFramework: \"dotnetWebFramework\",\n dotnetOrm: \"dotnetOrm\",\n dotnetAuth: \"dotnetAuth\",\n dotnetApi: \"dotnetApi\",\n dotnetTesting: \"dotnetTesting\",\n dotnetJobQueue: \"dotnetJobQueue\",\n dotnetRealtime: \"dotnetRealtime\",\n dotnetObservability: \"dotnetObservability\",\n dotnetValidation: \"dotnetValidation\",\n dotnetCaching: \"dotnetCaching\",\n dotnetDeploy: \"dotnetDeploy\",\n dotnetLibraries: \"dotnetLibraries\",\n elixirWebFramework: \"elixirWebFramework\",\n elixirOrm: \"elixirOrm\",\n elixirAuth: \"elixirAuth\",\n elixirApi: \"elixirApi\",\n elixirRealtime: \"elixirRealtime\",\n elixirJobs: \"elixirJobs\",\n elixirValidation: \"elixirValidation\",\n elixirHttp: \"elixirHttp\",\n elixirJson: \"elixirJson\",\n elixirEmail: \"elixirEmail\",\n elixirCaching: \"elixirCaching\",\n elixirObservability: \"elixirObservability\",\n elixirTesting: \"elixirTesting\",\n elixirQuality: \"elixirQuality\",\n elixirI18n: \"elixirI18n\",\n elixirHttpServer: \"elixirHttpServer\",\n elixirApplicationFramework: \"elixirApplicationFramework\",\n elixirDocumentation: \"elixirDocumentation\",\n elixirClustering: \"elixirClustering\",\n elixirDeploy: \"elixirDeploy\",\n elixirLibraries: \"elixirLibraries\",\n};\n\nexport const VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS = [\n \"rustLibraries\",\n \"pythonAi\",\n \"javaLibraries\",\n \"javaTestingLibraries\",\n \"dotnetTesting\",\n \"dotnetObservability\",\n \"goTesting\",\n \"pythonTesting\",\n \"pythonCli\",\n \"pythonData\",\n \"elixirLibraries\",\n \"aiDocs\",\n] as const;\n\nexport function usesVirtualNoneStackSelection(\n key: StackSelectionKey,\n): key is (typeof VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS)[number] {\n return (VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS as readonly string[]).includes(key);\n}\n\nexport const STACK_SELECTION_URL_KEYS = {\n stackMode: \"mode\",\n stackPartSpecs: \"part\",\n ecosystem: \"eco\",\n projectName: \"name\",\n webFrontend: \"fe-w\",\n nativeFrontend: \"fe-n\",\n astroIntegration: \"ai\",\n runtime: \"rt\",\n backend: \"be\",\n database: \"db\",\n orm: \"orm\",\n dbSetup: \"dbs\",\n auth: \"au\",\n payments: \"pay\",\n email: \"em\",\n fileUpload: \"fu\",\n logging: \"log\",\n observability: \"obs\",\n featureFlags: \"ff\",\n integrations: \"int\",\n ecommerce: \"ecm\",\n analytics: \"an\",\n mobileNavigation: \"mn\",\n mobileUI: \"mui\",\n mobileStorage: \"mst\",\n mobileTesting: \"mte\",\n mobilePush: \"mpu\",\n mobileOTA: \"mota\",\n mobileDeepLinking: \"mdl\",\n mobileLibraries: \"mlib\",\n backendLibraries: \"bl\",\n stateManagement: \"sm\",\n forms: \"frm\",\n validation: \"val\",\n testing: \"tst\",\n realtime: \"rt2\",\n jobQueue: \"jq\",\n caching: \"cache\",\n rateLimit: \"rl\",\n i18n: \"i18n\",\n animation: \"anim\",\n cssFramework: \"css\",\n uiLibrary: \"ui\",\n shadcnBase: \"scb\",\n shadcnStyle: \"scs\",\n shadcnIconLibrary: \"sci\",\n shadcnColorTheme: \"scc\",\n shadcnBaseColor: \"scbc\",\n shadcnFont: \"scf\",\n shadcnRadius: \"scr\",\n cms: \"cms\",\n search: \"srch\",\n vectorDb: \"vdb\",\n fileStorage: \"fs\",\n codeQuality: \"cq\",\n documentation: \"doc\",\n appPlatforms: \"ap\",\n packageManager: \"pm\",\n workspaceShape: \"ws\",\n versionChannel: \"vc\",\n examples: \"ex\",\n aiSdk: \"aisdk\",\n aiDocs: \"aid\",\n git: \"git\",\n install: \"i\",\n api: \"api\",\n webDeploy: \"wd\",\n serverDeploy: \"sd\",\n yolo: \"yolo\",\n rustWebFramework: \"rwf\",\n rustFrontend: \"rfe\",\n rustOrm: \"rorm\",\n rustApi: \"rapi\",\n rustCli: \"rcli\",\n rustLibraries: \"rlib\",\n rustLogging: \"rlog\",\n rustErrorHandling: \"reh\",\n rustCaching: \"rca\",\n rustAuth: \"rau\",\n rustRealtime: \"rrt\",\n rustMessageQueue: \"rmq\",\n rustObservability: \"robs\",\n rustTemplating: \"rtpl\",\n pythonWebFramework: \"pwf\",\n pythonOrm: \"porm\",\n pythonValidation: \"pval\",\n pythonAi: \"pai\",\n pythonAuth: \"pauth\",\n pythonApi: \"papi\",\n pythonTaskQueue: \"ptq\",\n pythonGraphql: \"pgql\",\n pythonQuality: \"pq\",\n pythonTesting: \"ptest\",\n pythonCaching: \"pcache\",\n pythonRealtime: \"prt\",\n pythonObservability: \"pobs\",\n pythonCli: \"pcli\",\n pythonCloudSdk: \"pcloud\",\n pythonHttpClient: \"phttp\",\n pythonData: \"pdata\",\n pythonMedia: \"pmedia\",\n pythonServer: \"pserver\",\n pythonPackageManager: \"ppm\",\n pythonMessageQueue: \"pmq\",\n goWebFramework: \"gwf\",\n goOrm: \"gorm\",\n goApi: \"gapi\",\n goCli: \"gcli\",\n goLogging: \"glog\",\n goAuth: \"gauth\",\n goTesting: \"gtest\",\n goRealtime: \"grt\",\n goMessageQueue: \"gmq\",\n goCaching: \"gcache\",\n goConfig: \"gcfg\",\n goObservability: \"gobs\",\n goValidation: \"gval\",\n goQuality: \"gqual\",\n goMigrations: \"gmig\",\n goTemplating: \"gtpl\",\n goProtoTooling: \"gproto\",\n goDI: \"gdi\",\n javaLanguage: \"jlang\",\n javaWebFramework: \"jwf\",\n javaBuildTool: \"jbt\",\n javaOrm: \"jorm\",\n javaAuth: \"jauth\",\n javaApi: \"japi\",\n javaLogging: \"jlog\",\n javaLibraries: \"jlib\",\n javaTestingLibraries: \"jtest\",\n dotnetWebFramework: \"dnwf\",\n dotnetOrm: \"dnorm\",\n dotnetAuth: \"dnauth\",\n dotnetApi: \"dnapi\",\n dotnetTesting: \"dntest\",\n dotnetJobQueue: \"dnjob\",\n dotnetRealtime: \"dnrt\",\n dotnetObservability: \"dnobs\",\n dotnetValidation: \"dnval\",\n dotnetCaching: \"dncache\",\n dotnetDeploy: \"dndeploy\",\n dotnetLibraries: \"dnlib\",\n elixirWebFramework: \"ewf\",\n elixirOrm: \"eorm\",\n elixirAuth: \"eauth\",\n elixirApi: \"eapi\",\n elixirRealtime: \"ert\",\n elixirJobs: \"ejob\",\n elixirValidation: \"eval\",\n elixirHttp: \"ehttp\",\n elixirJson: \"ejson\",\n elixirEmail: \"emailx\",\n elixirCaching: \"ecache\",\n elixirObservability: \"eobs\",\n elixirTesting: \"etest\",\n elixirQuality: \"eq\",\n elixirI18n: \"ei18n\",\n elixirHttpServer: \"ehs\",\n elixirApplicationFramework: \"eaf\",\n elixirDocumentation: \"edoc\",\n elixirClustering: \"ecluster\",\n elixirDeploy: \"edeploy\",\n elixirLibraries: \"elib\",\n} as const satisfies Record<StackSelectionKey, string>;\n\nexport const STACK_SELECTION_KEYS = Object.keys(STACK_SELECTION_URL_KEYS) as StackSelectionKey[];\n\nconst stackSelectionArrayKeySet = new Set<StackSelectionKey>(\n STACK_SELECTION_KEYS.filter((key) => Array.isArray(DEFAULT_STACK_SELECTION[key])),\n);\n\nexport function isArrayStackSelectionKey(key: StackSelectionKey): boolean {\n return stackSelectionArrayKeySet.has(key);\n}\n\nexport function cloneDefaultStackSelection(): StackSelectionState {\n const cloned: Partial<StackSelectionState> = {};\n\n for (const key of STACK_SELECTION_KEYS) {\n const defaultValue = DEFAULT_STACK_SELECTION[key];\n (cloned as Record<string, unknown>)[key] = Array.isArray(defaultValue)\n ? [...defaultValue]\n : defaultValue;\n }\n\n return cloned as StackSelectionState;\n}\n\nexport function normalizeStackSelectionValue<K extends StackSelectionKey>(\n key: K,\n value: StackSelectionState[K],\n): StackSelectionState[K] {\n const category = STACK_SELECTION_OPTION_CATEGORY_BY_KEY[\n key as keyof typeof STACK_SELECTION_OPTION_CATEGORY_BY_KEY\n ] as OptionCategory | undefined;\n if (!category) return value;\n\n if (Array.isArray(value)) {\n const normalizedValues = [...new Set(value.map((entry) => normalizeOptionId(category, entry)))];\n const filteredValues =\n normalizedValues.length > 1\n ? normalizedValues.filter((entry) => entry !== \"none\")\n : normalizedValues;\n\n if (usesVirtualNoneStackSelection(key)) {\n if (filteredValues.length === 0) return [] as unknown as StackSelectionState[K];\n if (filteredValues.length === 1 && filteredValues[0] === \"none\") {\n return [] as unknown as StackSelectionState[K];\n }\n return filteredValues.filter((entry) => entry !== \"none\") as StackSelectionState[K];\n }\n\n return filteredValues as StackSelectionState[K];\n }\n\n if (typeof value === \"string\") {\n return normalizeOptionId(category, value) as StackSelectionState[K];\n }\n\n return value;\n}\n\nfunction normalizeStackSelectionMode(value: unknown): StackSelectionMode {\n return value === \"multi\" || value === \"graph\" ? \"multi\" : \"solo\";\n}\n\nexport function normalizeStackSelection(selection: StackSelectionState): StackSelectionState {\n const normalized: Record<string, unknown> = { ...selection };\n normalized.stackMode = normalizeStackSelectionMode(normalized.stackMode);\n\n for (const key of Object.keys(STACK_SELECTION_OPTION_CATEGORY_BY_KEY) as StackSelectionKey[]) {\n normalized[key] = normalizeStackSelectionValue(\n key,\n normalized[key] as string | string[] | null,\n );\n }\n\n return normalized as StackSelectionState;\n}\n\nfunction parseArraySelectionValue(\n value: StackSelectionUrlValue,\n defaultValue: readonly string[],\n): string[] {\n if (typeof value === \"string\") {\n return value.split(\",\").filter(Boolean);\n }\n\n if (Array.isArray(value)) {\n return value\n .flatMap((item) => (typeof item === \"string\" ? item.split(\",\") : []))\n .filter(Boolean);\n }\n\n return [...defaultValue];\n}\n\nfunction parseScalarSelectionValue(value: StackSelectionUrlValue, defaultValue: string): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n const firstString = value.find((item): item is string => typeof item === \"string\");\n if (firstString) return firstString;\n }\n\n return defaultValue;\n}\n\nexport function parseStackSelectionFromUrlRecord(\n params: StackSelectionUrlRecord,\n): StackSelectionState {\n const parsed = cloneDefaultStackSelection() as Record<string, unknown>;\n\n for (const stackKey of STACK_SELECTION_KEYS) {\n const urlKey = STACK_SELECTION_URL_KEYS[stackKey];\n const rawValue = params[urlKey];\n const defaultValue = DEFAULT_STACK_SELECTION[stackKey];\n\n if (isArrayStackSelectionKey(stackKey)) {\n parsed[stackKey] = parseArraySelectionValue(rawValue, defaultValue as string[]);\n continue;\n }\n\n parsed[stackKey] = parseScalarSelectionValue(rawValue, String(defaultValue ?? \"\"));\n }\n\n return normalizeStackSelection(parsed as StackSelectionState);\n}\n\nexport function parseStackSelectionFromSearch(\n search: Record<string, unknown> | undefined,\n): StackSelectionState {\n if (!search) return cloneDefaultStackSelection();\n\n const normalized: StackSelectionUrlRecord = {};\n\n for (const [key, value] of Object.entries(search)) {\n if (typeof value === \"string\" || Array.isArray(value)) {\n normalized[key] = value as StackSelectionUrlValue;\n continue;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n normalized[key] = String(value);\n }\n }\n\n return parseStackSelectionFromUrlRecord(normalized);\n}\n\nexport function createStackSelectionSearchParams(\n selection: StackSelectionState,\n options?: { includeDefaults?: boolean },\n): URLSearchParams {\n const includeDefaults = options?.includeDefaults ?? false;\n const params = new URLSearchParams();\n\n for (const stackKey of STACK_SELECTION_KEYS) {\n const urlKey = STACK_SELECTION_URL_KEYS[stackKey];\n const value = selection[stackKey];\n const defaultValue = DEFAULT_STACK_SELECTION[stackKey];\n\n if (Array.isArray(value)) {\n const serialized = value.join(\",\");\n const defaultSerialized = Array.isArray(defaultValue) ? defaultValue.join(\",\") : \"\";\n if (includeDefaults || serialized !== defaultSerialized) {\n params.set(urlKey, serialized);\n }\n continue;\n }\n\n if (value === undefined || value === null) {\n if (includeDefaults && typeof defaultValue === \"string\") {\n params.set(urlKey, defaultValue);\n }\n continue;\n }\n\n const serialized = String(value);\n const defaultSerialized = typeof defaultValue === \"string\" ? defaultValue : \"\";\n if (includeDefaults || serialized !== defaultSerialized) {\n params.set(urlKey, serialized);\n }\n }\n\n return params;\n}\n\nexport type StackProjectConfigOptions = {\n projectDir: string;\n relativePath: string;\n install?: boolean;\n};\n\nconst CLI_SCALAR_CONFIG_FIELDS = [\n [\"ecosystem\", \"ecosystem\"],\n [\"api\", \"api\"],\n [\"backend\", \"backend\"],\n [\"database\", \"database\"],\n [\"orm\", \"orm\"],\n [\"auth\", \"auth\"],\n [\"payments\", \"payments\"],\n [\"email\", \"email\"],\n [\"effect\", \"effect\"],\n [\"stateManagement\", \"stateManagement\"],\n [\"validation\", \"validation\"],\n [\"realtime\", \"realtime\"],\n [\"jobQueue\", \"jobQueue\"],\n [\"animation\", \"animation\"],\n [\"ai\", \"ai\"],\n [\"forms\", \"forms\"],\n [\"testing\", \"testing\"],\n [\"logging\", \"logging\"],\n [\"observability\", \"observability\"],\n [\"cms\", \"cms\"],\n [\"caching\", \"caching\"],\n [\"rateLimit\", \"rateLimit\"],\n [\"i18n\", \"i18n\"],\n [\"search\", \"search\"],\n [\"vectorDb\", \"vectorDb\"],\n [\"fileStorage\", \"fileStorage\"],\n [\"analytics\", \"analytics\"],\n [\"mobileNavigation\", \"mobileNavigation\"],\n [\"mobileUI\", \"mobileUI\"],\n [\"mobileStorage\", \"mobileStorage\"],\n [\"mobileTesting\", \"mobileTesting\"],\n [\"mobilePush\", \"mobilePush\"],\n [\"mobileOTA\", \"mobileOTA\"],\n [\"mobileDeepLinking\", \"mobileDeepLinking\"],\n [\"featureFlags\", \"featureFlags\"],\n [\"integrations\", \"integrations\"],\n [\"ecommerce\", \"ecommerce\"],\n [\"fileUpload\", \"fileUpload\"],\n [\"git\", \"git\"],\n [\"install\", \"install\"],\n [\"runtime\", \"runtime\"],\n [\"dbSetup\", \"dbSetup\"],\n [\"packageManager\", \"packageManager\"],\n [\"workspaceShape\", \"workspaceShape\"],\n [\"versionChannel\", \"versionChannel\"],\n [\"webDeploy\", \"webDeploy\"],\n [\"serverDeploy\", \"serverDeploy\"],\n [\"astroIntegration\", \"astroIntegration\"],\n [\"cssFramework\", \"cssFramework\"],\n [\"uiLibrary\", \"uiLibrary\"],\n [\"shadcnBase\", \"shadcnBase\"],\n [\"shadcnStyle\", \"shadcnStyle\"],\n [\"shadcnIconLibrary\", \"shadcnIconLibrary\"],\n [\"shadcnColorTheme\", \"shadcnColorTheme\"],\n [\"shadcnBaseColor\", \"shadcnBaseColor\"],\n [\"shadcnFont\", \"shadcnFont\"],\n [\"shadcnRadius\", \"shadcnRadius\"],\n [\"rustWebFramework\", \"rustWebFramework\"],\n [\"rustFrontend\", \"rustFrontend\"],\n [\"rustOrm\", \"rustOrm\"],\n [\"rustApi\", \"rustApi\"],\n [\"rustCli\", \"rustCli\"],\n [\"rustLogging\", \"rustLogging\"],\n [\"rustErrorHandling\", \"rustErrorHandling\"],\n [\"rustCaching\", \"rustCaching\"],\n [\"rustAuth\", \"rustAuth\"],\n [\"rustRealtime\", \"rustRealtime\"],\n [\"rustMessageQueue\", \"rustMessageQueue\"],\n [\"rustObservability\", \"rustObservability\"],\n [\"rustTemplating\", \"rustTemplating\"],\n [\"pythonWebFramework\", \"pythonWebFramework\"],\n [\"pythonOrm\", \"pythonOrm\"],\n [\"pythonValidation\", \"pythonValidation\"],\n [\"pythonAuth\", \"pythonAuth\"],\n [\"pythonApi\", \"pythonApi\"],\n [\"pythonTaskQueue\", \"pythonTaskQueue\"],\n [\"pythonGraphql\", \"pythonGraphql\"],\n [\"pythonQuality\", \"pythonQuality\"],\n [\"pythonCaching\", \"pythonCaching\"],\n [\"pythonRealtime\", \"pythonRealtime\"],\n [\"pythonObservability\", \"pythonObservability\"],\n [\"pythonCloudSdk\", \"pythonCloudSdk\"],\n [\"pythonHttpClient\", \"pythonHttpClient\"],\n [\"pythonMedia\", \"pythonMedia\"],\n [\"pythonServer\", \"pythonServer\"],\n [\"pythonPackageManager\", \"pythonPackageManager\"],\n [\"pythonMessageQueue\", \"pythonMessageQueue\"],\n [\"goWebFramework\", \"goWebFramework\"],\n [\"goOrm\", \"goOrm\"],\n [\"goApi\", \"goApi\"],\n [\"goCli\", \"goCli\"],\n [\"goLogging\", \"goLogging\"],\n [\"goAuth\", \"goAuth\"],\n [\"goRealtime\", \"goRealtime\"],\n [\"goMessageQueue\", \"goMessageQueue\"],\n [\"goCaching\", \"goCaching\"],\n [\"goConfig\", \"goConfig\"],\n [\"goObservability\", \"goObservability\"],\n [\"goValidation\", \"goValidation\"],\n [\"goQuality\", \"goQuality\"],\n [\"goMigrations\", \"goMigrations\"],\n [\"goTemplating\", \"goTemplating\"],\n [\"goProtoTooling\", \"goProtoTooling\"],\n [\"goDI\", \"goDI\"],\n [\"javaLanguage\", \"javaLanguage\"],\n [\"javaWebFramework\", \"javaWebFramework\"],\n [\"javaBuildTool\", \"javaBuildTool\"],\n [\"javaOrm\", \"javaOrm\"],\n [\"javaAuth\", \"javaAuth\"],\n [\"javaApi\", \"javaApi\"],\n [\"javaLogging\", \"javaLogging\"],\n [\"dotnetWebFramework\", \"dotnetWebFramework\"],\n [\"dotnetOrm\", \"dotnetOrm\"],\n [\"dotnetAuth\", \"dotnetAuth\"],\n [\"dotnetApi\", \"dotnetApi\"],\n [\"dotnetJobQueue\", \"dotnetJobQueue\"],\n [\"dotnetRealtime\", \"dotnetRealtime\"],\n [\"dotnetValidation\", \"dotnetValidation\"],\n [\"dotnetCaching\", \"dotnetCaching\"],\n [\"dotnetDeploy\", \"dotnetDeploy\"],\n [\"elixirWebFramework\", \"elixirWebFramework\"],\n [\"elixirOrm\", \"elixirOrm\"],\n [\"elixirAuth\", \"elixirAuth\"],\n [\"elixirApi\", \"elixirApi\"],\n [\"elixirRealtime\", \"elixirRealtime\"],\n [\"elixirJobs\", \"elixirJobs\"],\n [\"elixirValidation\", \"elixirValidation\"],\n [\"elixirHttp\", \"elixirHttp\"],\n [\"elixirJson\", \"elixirJson\"],\n [\"elixirEmail\", \"elixirEmail\"],\n [\"elixirCaching\", \"elixirCaching\"],\n [\"elixirObservability\", \"elixirObservability\"],\n [\"elixirTesting\", \"elixirTesting\"],\n [\"elixirQuality\", \"elixirQuality\"],\n [\"elixirI18n\", \"elixirI18n\"],\n [\"elixirHttpServer\", \"elixirHttpServer\"],\n [\"elixirApplicationFramework\", \"elixirApplicationFramework\"],\n [\"elixirDocumentation\", \"elixirDocumentation\"],\n [\"elixirClustering\", \"elixirClustering\"],\n [\"elixirDeploy\", \"elixirDeploy\"],\n] as const satisfies readonly (readonly [keyof CLIInput, keyof ProjectConfig])[];\n\nconst CLI_NON_EMPTY_ARRAY_CONFIG_FIELDS = [\n [\"frontend\", \"frontend\"],\n [\"addons\", \"addons\"],\n [\"examples\", \"examples\"],\n] as const satisfies readonly (readonly [keyof CLIInput, keyof ProjectConfig])[];\n\nconst CLI_DEFINED_ARRAY_CONFIG_FIELDS = [\n [\"aiDocs\", \"aiDocs\"],\n [\"mobileLibraries\", \"mobileLibraries\"],\n [\"rustLibraries\", \"rustLibraries\"],\n [\"pythonAi\", \"pythonAi\"],\n [\"javaLibraries\", \"javaLibraries\"],\n [\"javaTestingLibraries\", \"javaTestingLibraries\"],\n [\"dotnetTesting\", \"dotnetTesting\"],\n [\"dotnetObservability\", \"dotnetObservability\"],\n [\"dotnetLibraries\", \"dotnetLibraries\"],\n [\"goTesting\", \"goTesting\"],\n [\"pythonTesting\", \"pythonTesting\"],\n [\"pythonCli\", \"pythonCli\"],\n [\"pythonData\", \"pythonData\"],\n [\"elixirLibraries\", \"elixirLibraries\"],\n] as const satisfies readonly (readonly [keyof CLIInput, keyof ProjectConfig])[];\n\nconst PACKAGE_MANAGER_COMMANDS = {\n npm: \"npx create-better-fullstack@latest\",\n pnpm: \"pnpm create better-fullstack@latest\",\n yarn: \"yarn create better-fullstack@latest\",\n bun: \"bun create better-fullstack@latest\",\n} as const;\n\nconst SELF_BACKENDS = new Set([\n \"self-next\",\n \"self-tanstack-start\",\n \"self-astro\",\n \"self-nuxt\",\n \"self-svelte\",\n \"self-solid-start\",\n \"self-vinext\",\n]);\n\nconst RUST_CONFIG_KEYS = [\n \"rustWebFramework\",\n \"rustFrontend\",\n \"rustOrm\",\n \"rustApi\",\n \"rustCli\",\n \"rustLibraries\",\n \"rustLogging\",\n \"rustErrorHandling\",\n \"rustCaching\",\n \"rustAuth\",\n \"rustRealtime\",\n \"rustMessageQueue\",\n \"rustObservability\",\n \"rustTemplating\",\n] as const satisfies readonly (keyof CliDefaultProjectConfigBase)[];\n\nconst PYTHON_CONFIG_KEYS = [\n \"pythonWebFramework\",\n \"pythonOrm\",\n \"pythonValidation\",\n \"pythonAi\",\n \"pythonAuth\",\n \"pythonApi\",\n \"pythonTaskQueue\",\n \"pythonGraphql\",\n \"pythonQuality\",\n \"pythonTesting\",\n \"pythonCaching\",\n \"pythonRealtime\",\n \"pythonObservability\",\n \"pythonCli\",\n \"pythonCloudSdk\",\n \"pythonHttpClient\",\n \"pythonData\",\n \"pythonMedia\",\n \"pythonServer\",\n \"pythonPackageManager\",\n \"pythonMessageQueue\",\n] as const satisfies readonly (keyof CliDefaultProjectConfigBase)[];\n\nconst GO_CONFIG_KEYS = [\n \"goWebFramework\",\n \"goOrm\",\n \"goApi\",\n \"goCli\",\n \"goLogging\",\n \"goAuth\",\n \"goTesting\",\n \"goRealtime\",\n \"goMessageQueue\",\n \"goCaching\",\n \"goConfig\",\n \"goObservability\",\n \"goValidation\",\n \"goQuality\",\n \"goMigrations\",\n \"goTemplating\",\n \"goProtoTooling\",\n \"goDI\",\n] as const satisfies readonly (keyof CliDefaultProjectConfigBase)[];\n\nconst JAVA_CONFIG_KEYS = [\n \"javaLanguage\",\n \"javaWebFramework\",\n \"javaBuildTool\",\n \"javaOrm\",\n \"javaAuth\",\n \"javaApi\",\n \"javaLogging\",\n \"javaLibraries\",\n \"javaTestingLibraries\",\n] as const satisfies readonly (keyof CliDefaultProjectConfigBase)[];\n\nconst DOTNET_CONFIG_KEYS = [\n \"dotnetWebFramework\",\n \"dotnetOrm\",\n \"dotnetAuth\",\n \"dotnetApi\",\n \"dotnetTesting\",\n \"dotnetJobQueue\",\n \"dotnetRealtime\",\n \"dotnetObservability\",\n \"dotnetValidation\",\n \"dotnetCaching\",\n \"dotnetDeploy\",\n \"dotnetLibraries\",\n] as const satisfies readonly (keyof CliDefaultProjectConfigBase)[];\n\nconst ELIXIR_CONFIG_KEYS = [\n \"elixirWebFramework\",\n \"elixirOrm\",\n \"elixirAuth\",\n \"elixirApi\",\n \"elixirRealtime\",\n \"elixirJobs\",\n \"elixirValidation\",\n \"elixirHttp\",\n \"elixirJson\",\n \"elixirEmail\",\n \"elixirCaching\",\n \"elixirObservability\",\n \"elixirTesting\",\n \"elixirQuality\",\n \"elixirI18n\",\n \"elixirHttpServer\",\n \"elixirApplicationFramework\",\n \"elixirDocumentation\",\n \"elixirClustering\",\n \"elixirDeploy\",\n \"elixirLibraries\",\n] as const satisfies readonly (keyof CliDefaultProjectConfigBase)[];\n\nconst REACT_NATIVE_CONFIG_KEYS = [\n \"mobileNavigation\",\n \"mobileUI\",\n \"mobileStorage\",\n \"mobileTesting\",\n \"mobilePush\",\n \"mobileOTA\",\n \"mobileDeepLinking\",\n \"mobileLibraries\",\n] as const satisfies readonly (keyof CliDefaultProjectConfigBase)[];\n\nfunction withoutNone(values: readonly string[]): string[] {\n return values.filter((value) => value !== \"none\");\n}\n\nexport function processCliArrayOption<T>(options: readonly (T | \"none\")[] | undefined) {\n if (!options || options.length === 0) return [];\n if (options.includes(\"none\" as T | \"none\")) return [];\n return options.filter((item): item is T => item !== \"none\");\n}\n\nfunction toUniqueNonNoneArray(values: readonly string[]) {\n return [...new Set(withoutNone(values))];\n}\n\nfunction formatArrayFlag(flag: string, values: readonly string[]) {\n const filteredValues = toUniqueNonNoneArray(values);\n return `--${flag} ${filteredValues.join(\" \") || \"none\"}`;\n}\n\nfunction formatTypeScriptAddonsFlag(selection: StackSelectionInput) {\n const addons = [...selection.codeQuality, ...selection.documentation, ...selection.appPlatforms];\n\n if (addons.length === 0) return \"--addons none\";\n\n return `--addons ${toUniqueNonNoneArray(addons).join(\" \") || \"none\"}`;\n}\n\ntype StackSelectionStringKey = {\n [K in keyof StackSelectionState]: StackSelectionState[K] extends string ? K : never;\n}[keyof StackSelectionState];\n\nconst GRAPH_TYPESCRIPT_FRONTEND_FLAG_KEYS = [\n [\"validation\", \"validation\"],\n [\"testing\", \"testing\"],\n] as const satisfies readonly [StackSelectionStringKey, string][];\n\nconst GRAPH_SHADCN_FLAG_KEYS = [\n [\"shadcnBase\", \"shadcn-base\"],\n [\"shadcnStyle\", \"shadcn-style\"],\n [\"shadcnIconLibrary\", \"shadcn-icon-library\"],\n [\"shadcnColorTheme\", \"shadcn-color-theme\"],\n [\"shadcnBaseColor\", \"shadcn-base-color\"],\n [\"shadcnFont\", \"shadcn-font\"],\n [\"shadcnRadius\", \"shadcn-radius\"],\n] as const satisfies readonly [StackSelectionStringKey, string][];\n\nconst GRAPH_MOBILE_FLAG_KEYS = [] as const satisfies readonly [StackSelectionStringKey, string][];\n\nconst GRAPH_TYPESCRIPT_BACKEND_FLAG_KEYS = [\n [\"backendLibraries\", \"effect\"],\n] as const satisfies readonly [StackSelectionStringKey, string][];\n\nconst GRAPH_SHARED_BACKEND_FLAG_KEYS = [\n [\"email\", \"email\"],\n [\"observability\", \"observability\"],\n [\"caching\", \"caching\"],\n [\"rateLimit\", \"rate-limit\"],\n [\"search\", \"search\"],\n] as const satisfies readonly [StackSelectionStringKey, string][];\n\nconst GRAPH_ELIXIR_BACKEND_FLAG_KEYS = [[\"elixirJson\", \"elixir-json\"]] as const satisfies readonly [\n StackSelectionStringKey,\n string,\n][];\n\nfunction formatChangedStringFlag(\n selection: StackSelectionInput,\n key: StackSelectionStringKey,\n flag: string,\n) {\n return selection[key] === DEFAULT_STACK_SELECTION[key]\n ? undefined\n : `--${flag} ${selection[key]}`;\n}\n\ntype StackSelectionArrayKey = {\n [K in keyof StackSelectionState]: StackSelectionState[K] extends string[] ? K : never;\n}[keyof StackSelectionState];\n\nfunction formatChangedStringFlags(\n selection: StackSelectionInput,\n keys: readonly [StackSelectionStringKey, string][],\n) {\n return keys.flatMap(([key, flag]) => {\n const formattedFlag = formatChangedStringFlag(selection, key, flag);\n return formattedFlag ? [formattedFlag] : [];\n });\n}\n\nfunction hasGraphPrimaryPart(\n parts: readonly {\n role: string;\n ecosystem: string;\n toolId?: string;\n ownerPartId?: string;\n }[],\n role: \"frontend\" | \"backend\" | \"mobile\" | \"database\",\n ecosystem?: string,\n toolId?: string,\n) {\n return parts.some(\n (part) =>\n part.role === role &&\n !part.ownerPartId &&\n (!ecosystem || part.ecosystem === ecosystem) &&\n (!toolId || part.toolId === toolId),\n );\n}\n\ntype ScopedStackPartRole = Exclude<StackPartRole, \"frontend\" | \"backend\" | \"mobile\" | \"database\">;\ntype ScopedStackPartField = {\n ownerRole?: \"frontend\" | \"backend\" | \"mobile\" | \"database\";\n ecosystem: StackPartEcosystem;\n role: ScopedStackPartRole;\n value: string | readonly string[] | undefined;\n allowMultiple?: boolean;\n};\n\nconst GRAPH_TYPESCRIPT_FRONTEND_PART_SELECTION_KEYS = [\n [\"webDeploy\", \"deploy\"],\n [\"cssFramework\", \"css\"],\n [\"uiLibrary\", \"ui\"],\n [\"forms\", \"forms\"],\n [\"stateManagement\", \"stateManagement\"],\n [\"animation\", \"animation\"],\n [\"fileUpload\", \"fileUpload\"],\n [\"i18n\", \"i18n\"],\n [\"analytics\", \"analytics\"],\n] as const satisfies readonly [StackSelectionStringKey, ScopedStackPartRole][];\n\nconst GRAPH_TYPESCRIPT_BACKEND_PART_SELECTION_KEYS = [\n [\"runtime\", \"runtime\"],\n [\"serverDeploy\", \"deploy\"],\n [\"payments\", \"payments\"],\n [\"email\", \"email\"],\n [\"aiSdk\", \"ai\"],\n [\"realtime\", \"realtime\"],\n [\"jobQueue\", \"jobQueue\"],\n [\"logging\", \"logging\"],\n [\"observability\", \"observability\"],\n [\"featureFlags\", \"featureFlags\"],\n [\"integrations\", \"integrations\"],\n [\"ecommerce\", \"ecommerce\"],\n [\"caching\", \"caching\"],\n [\"rateLimit\", \"rateLimit\"],\n [\"cms\", \"cms\"],\n [\"search\", \"search\"],\n [\"vectorDb\", \"vectorDb\"],\n [\"fileStorage\", \"fileStorage\"],\n] as const satisfies readonly [StackSelectionStringKey, ScopedStackPartRole][];\n\nconst GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS = [\n [\"elixirRealtime\", \"realtime\"],\n [\"elixirJobs\", \"jobQueue\"],\n [\"elixirValidation\", \"validation\"],\n [\"elixirHttp\", \"httpClient\"],\n [\"elixirEmail\", \"email\"],\n [\"elixirCaching\", \"caching\"],\n [\"elixirObservability\", \"observability\"],\n [\"elixirTesting\", \"testing\"],\n [\"elixirQuality\", \"codeQuality\"],\n [\"elixirI18n\", \"i18n\"],\n [\"elixirHttpServer\", \"runtime\"],\n [\"elixirApplicationFramework\", \"libraries\"],\n [\"elixirDocumentation\", \"documentation\"],\n [\"elixirClustering\", \"config\"],\n [\"elixirDeploy\", \"deploy\"],\n] as const satisfies readonly [StackSelectionStringKey, ScopedStackPartRole][];\n\nconst GRAPH_DATABASE_PART_SELECTION_KEYS = [[\"dbSetup\", \"dbSetup\"]] as const satisfies readonly [\n StackSelectionStringKey,\n ScopedStackPartRole,\n][];\n\nconst GRAPH_MOBILE_PART_SELECTION_KEYS = [\n [\"mobileNavigation\", \"navigation\"],\n [\"mobileUI\", \"ui\"],\n [\"mobileStorage\", \"storage\"],\n [\"mobileTesting\", \"testing\"],\n [\"mobilePush\", \"push\"],\n [\"mobileOTA\", \"ota\"],\n [\"mobileDeepLinking\", \"deepLinking\"],\n] as const satisfies readonly [StackSelectionStringKey, ScopedStackPartRole][];\n\nconst GRAPH_MOBILE_ARRAY_PART_SELECTION_KEYS = [\n [\"mobileLibraries\", \"libraries\"],\n] as const satisfies readonly [StackSelectionArrayKey, ScopedStackPartRole][];\n\nconst GRAPH_RUST_BACKEND_PART_SELECTION_KEYS = [\n [\"rustCli\", \"cli\"],\n [\"rustLogging\", \"logging\"],\n [\"rustErrorHandling\", \"errorHandling\"],\n [\"caching\", \"caching\"],\n [\"search\", \"search\"],\n [\"rustCaching\", \"caching\"],\n] as const satisfies readonly [StackSelectionStringKey, ScopedStackPartRole][];\n\nconst GRAPH_RUST_BACKEND_ARRAY_PART_SELECTION_KEYS = [\n [\"rustLibraries\", \"libraries\"],\n] as const satisfies readonly [StackSelectionArrayKey, ScopedStackPartRole][];\n\nconst GRAPH_PYTHON_BACKEND_PART_SELECTION_KEYS = [\n [\"pythonValidation\", \"validation\"],\n [\"pythonTaskQueue\", \"jobQueue\"],\n [\"pythonGraphql\", \"graphql\"],\n [\"pythonQuality\", \"codeQuality\"],\n [\"pythonCloudSdk\", \"cloudSdk\"],\n [\"pythonHttpClient\", \"httpClient\"],\n [\"pythonMedia\", \"media\"],\n [\"pythonServer\", \"server\"],\n [\"pythonPackageManager\", \"packageManager\"],\n [\"pythonMessageQueue\", \"messageQueue\"],\n [\"caching\", \"caching\"],\n [\"search\", \"search\"],\n] as const satisfies readonly [StackSelectionStringKey, ScopedStackPartRole][];\n\nconst GRAPH_PYTHON_BACKEND_ARRAY_PART_SELECTION_KEYS = [\n [\"pythonAi\", \"ai\"],\n [\"pythonData\", \"data\"],\n] as const satisfies readonly [StackSelectionArrayKey, ScopedStackPartRole][];\n\nconst GRAPH_GO_BACKEND_PART_SELECTION_KEYS = [\n [\"goCli\", \"cli\"],\n [\"goLogging\", \"logging\"],\n [\"goValidation\", \"validation\"],\n [\"goQuality\", \"codeQuality\"],\n [\"goMigrations\", \"migrations\"],\n [\"goTemplating\", \"templating\"],\n [\"goProtoTooling\", \"buildTool\"],\n [\"goDI\", \"libraries\"],\n [\"caching\", \"caching\"],\n [\"search\", \"search\"],\n] as const satisfies readonly [StackSelectionStringKey, ScopedStackPartRole][];\n\nconst GRAPH_JAVA_BACKEND_PART_SELECTION_KEYS = [\n [\"javaLanguage\", \"language\"],\n [\"javaBuildTool\", \"buildTool\"],\n [\"caching\", \"caching\"],\n [\"search\", \"search\"],\n] as const satisfies readonly [StackSelectionStringKey, ScopedStackPartRole][];\n\nconst GRAPH_JAVA_BACKEND_ARRAY_PART_SELECTION_KEYS = [\n [\"javaLibraries\", \"libraries\"],\n [\"javaTestingLibraries\", \"testing\"],\n] as const satisfies readonly [StackSelectionArrayKey, ScopedStackPartRole][];\n\nconst GRAPH_DOTNET_BACKEND_PART_SELECTION_KEYS = [\n [\"dotnetOrm\", \"orm\"],\n [\"dotnetAuth\", \"auth\"],\n [\"dotnetApi\", \"api\"],\n [\"dotnetJobQueue\", \"jobQueue\"],\n [\"dotnetRealtime\", \"realtime\"],\n [\"dotnetCaching\", \"caching\"],\n [\"dotnetDeploy\", \"deploy\"],\n] as const satisfies readonly [StackSelectionStringKey, ScopedStackPartRole][];\n\nconst GRAPH_DOTNET_BACKEND_ARRAY_PART_SELECTION_KEYS = [\n [\"dotnetTesting\", \"testing\"],\n [\"dotnetObservability\", \"observability\"],\n [\"dotnetLibraries\", \"libraries\"],\n] as const satisfies readonly [StackSelectionArrayKey, ScopedStackPartRole][];\n\nconst GRAPH_TYPESCRIPT_FRONTEND_PART_CLI_KEYS = [\n [\"webDeploy\", \"deploy\"],\n [\"cssFramework\", \"css\"],\n [\"uiLibrary\", \"ui\"],\n [\"forms\", \"forms\"],\n [\"stateManagement\", \"stateManagement\"],\n [\"animation\", \"animation\"],\n [\"fileUpload\", \"fileUpload\"],\n [\"i18n\", \"i18n\"],\n [\"analytics\", \"analytics\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_TYPESCRIPT_BACKEND_PART_CLI_KEYS = [\n [\"runtime\", \"runtime\"],\n [\"serverDeploy\", \"deploy\"],\n [\"payments\", \"payments\"],\n [\"email\", \"email\"],\n [\"ai\", \"ai\"],\n [\"realtime\", \"realtime\"],\n [\"jobQueue\", \"jobQueue\"],\n [\"logging\", \"logging\"],\n [\"observability\", \"observability\"],\n [\"featureFlags\", \"featureFlags\"],\n [\"integrations\", \"integrations\"],\n [\"ecommerce\", \"ecommerce\"],\n [\"caching\", \"caching\"],\n [\"rateLimit\", \"rateLimit\"],\n [\"cms\", \"cms\"],\n [\"search\", \"search\"],\n [\"vectorDb\", \"vectorDb\"],\n [\"fileStorage\", \"fileStorage\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS = [\n [\"elixirRealtime\", \"realtime\"],\n [\"elixirJobs\", \"jobQueue\"],\n [\"elixirValidation\", \"validation\"],\n [\"elixirHttp\", \"httpClient\"],\n [\"elixirEmail\", \"email\"],\n [\"elixirCaching\", \"caching\"],\n [\"elixirObservability\", \"observability\"],\n [\"elixirTesting\", \"testing\"],\n [\"elixirQuality\", \"codeQuality\"],\n [\"elixirI18n\", \"i18n\"],\n [\"elixirHttpServer\", \"runtime\"],\n [\"elixirApplicationFramework\", \"libraries\"],\n [\"elixirDocumentation\", \"documentation\"],\n [\"elixirClustering\", \"config\"],\n [\"elixirDeploy\", \"deploy\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_DATABASE_PART_CLI_KEYS = [[\"dbSetup\", \"dbSetup\"]] as const satisfies readonly [\n keyof CLIInput,\n ScopedStackPartRole,\n][];\n\nconst GRAPH_MOBILE_PART_CLI_KEYS = [\n [\"mobileNavigation\", \"navigation\"],\n [\"mobileUI\", \"ui\"],\n [\"mobileStorage\", \"storage\"],\n [\"mobileTesting\", \"testing\"],\n [\"mobilePush\", \"push\"],\n [\"mobileOTA\", \"ota\"],\n [\"mobileDeepLinking\", \"deepLinking\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_MOBILE_ARRAY_PART_CLI_KEYS = [\n [\"mobileLibraries\", \"libraries\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_RUST_BACKEND_PART_CLI_KEYS = [\n [\"rustCli\", \"cli\"],\n [\"rustLogging\", \"logging\"],\n [\"rustErrorHandling\", \"errorHandling\"],\n [\"caching\", \"caching\"],\n [\"search\", \"search\"],\n [\"rustCaching\", \"caching\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_RUST_BACKEND_ARRAY_PART_CLI_KEYS = [\n [\"rustLibraries\", \"libraries\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_PYTHON_BACKEND_PART_CLI_KEYS = [\n [\"pythonValidation\", \"validation\"],\n [\"pythonTaskQueue\", \"jobQueue\"],\n [\"pythonGraphql\", \"graphql\"],\n [\"pythonQuality\", \"codeQuality\"],\n [\"pythonCloudSdk\", \"cloudSdk\"],\n [\"pythonHttpClient\", \"httpClient\"],\n [\"pythonMedia\", \"media\"],\n [\"pythonServer\", \"server\"],\n [\"pythonPackageManager\", \"packageManager\"],\n [\"pythonMessageQueue\", \"messageQueue\"],\n [\"caching\", \"caching\"],\n [\"search\", \"search\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_PYTHON_BACKEND_ARRAY_PART_CLI_KEYS = [\n [\"pythonAi\", \"ai\"],\n [\"pythonData\", \"data\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_GO_BACKEND_PART_CLI_KEYS = [\n [\"goCli\", \"cli\"],\n [\"goLogging\", \"logging\"],\n [\"goValidation\", \"validation\"],\n [\"goQuality\", \"codeQuality\"],\n [\"goMigrations\", \"migrations\"],\n [\"goTemplating\", \"templating\"],\n [\"goProtoTooling\", \"buildTool\"],\n [\"goDI\", \"libraries\"],\n [\"caching\", \"caching\"],\n [\"search\", \"search\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_JAVA_BACKEND_PART_CLI_KEYS = [\n [\"javaBuildTool\", \"buildTool\"],\n [\"caching\", \"caching\"],\n [\"search\", \"search\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_JAVA_BACKEND_ARRAY_PART_CLI_KEYS = [\n [\"javaLibraries\", \"libraries\"],\n [\"javaTestingLibraries\", \"testing\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_DOTNET_BACKEND_PART_CLI_KEYS = [\n [\"dotnetOrm\", \"orm\"],\n [\"dotnetAuth\", \"auth\"],\n [\"dotnetApi\", \"api\"],\n [\"dotnetJobQueue\", \"jobQueue\"],\n [\"dotnetRealtime\", \"realtime\"],\n [\"dotnetCaching\", \"caching\"],\n [\"dotnetDeploy\", \"deploy\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nconst GRAPH_DOTNET_BACKEND_ARRAY_PART_CLI_KEYS = [\n [\"dotnetTesting\", \"testing\"],\n [\"dotnetObservability\", \"observability\"],\n [\"dotnetLibraries\", \"libraries\"],\n] as const satisfies readonly [keyof CLIInput, ScopedStackPartRole][];\n\nfunction getAddonScopedPartFields(addons: readonly string[] | undefined): ScopedStackPartField[] {\n return toUniqueNonNoneArray(addons ?? []).flatMap((addon) => {\n const binding = getAddonStackPartBinding(addon);\n if (!binding) return [];\n return [\n {\n ownerRole: binding.ownerRole,\n ecosystem: binding.ecosystem,\n role: binding.role as ScopedStackPartRole,\n value: addon,\n allowMultiple: true,\n },\n ];\n });\n}\n\nfunction getExampleScopedPartFields(\n examples: readonly string[] | undefined,\n): ScopedStackPartField[] {\n return toUniqueNonNoneArray(examples ?? []).map((example) => ({\n ecosystem: \"universal\" as const,\n role: \"examples\" as const,\n value: example,\n allowMultiple: true,\n }));\n}\n\nfunction expandScopedStackPartSpecs(\n specs: readonly string[],\n fields: readonly ScopedStackPartField[],\n) {\n const stackParts = parseStackPartSpecs(specs, \"selected\");\n const stackPartSpecs = stackParts.map((part) => formatStackPartSpec(part, stackParts));\n const stackPartSpecSet = new Set(stackPartSpecs);\n\n const getPrimary = (\n role: \"frontend\" | \"backend\" | \"mobile\" | \"database\",\n ecosystem: StackPartEcosystem,\n ) =>\n stackParts.find(\n (part) =>\n part.role === role &&\n part.ecosystem === ecosystem &&\n !part.ownerPartId &&\n part.source !== \"provided\",\n );\n const hasScoped = (\n ownerId: string,\n role: StackPartRole,\n ecosystem: StackPartEcosystem,\n toolId: string,\n allowMultiple = false,\n ) =>\n stackParts.some(\n (part) =>\n part.role === role &&\n part.ecosystem === ecosystem &&\n part.ownerPartId === ownerId &&\n part.source !== \"provided\" &&\n (allowMultiple ? part.toolId === toolId : true),\n );\n\n for (const { ownerRole, ecosystem, role, value, allowMultiple } of fields) {\n const values = Array.isArray(value) ? value : [value];\n for (const toolId of values) {\n if (!toolId || toolId === \"none\") continue;\n\n if (!ownerRole) {\n const spec = `${role}:${ecosystem}:${toolId}`;\n if (!stackPartSpecSet.has(spec)) {\n stackPartSpecs.push(spec);\n stackPartSpecSet.add(spec);\n }\n continue;\n }\n\n const owner = getPrimary(ownerRole, ecosystem);\n if (!owner || hasScoped(owner.id, role, ecosystem, toolId, allowMultiple)) {\n continue;\n }\n const spec = `${ownerRole}.${role}:${ecosystem}:${toolId}`;\n if (!stackPartSpecSet.has(spec)) {\n stackPartSpecs.push(spec);\n stackPartSpecSet.add(spec);\n }\n }\n }\n\n return stackPartSpecs;\n}\n\nfunction getSelectionScopedPartFields(selection: StackSelectionInput): ScopedStackPartField[] {\n return [\n ...GRAPH_TYPESCRIPT_FRONTEND_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"frontend\" as const,\n ecosystem: \"typescript\" as const,\n role,\n value: selection[key],\n })),\n ...GRAPH_TYPESCRIPT_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"typescript\" as const,\n role,\n value: selection[key],\n })),\n ...GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"elixir\" as const,\n role,\n value: selection[key],\n })),\n ...GRAPH_MOBILE_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"mobile\" as const,\n ecosystem: \"react-native\" as const,\n role,\n value: selection[key],\n })),\n ...GRAPH_MOBILE_ARRAY_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"mobile\" as const,\n ecosystem: \"react-native\" as const,\n role,\n value: selection[key],\n allowMultiple: true,\n })),\n ...GRAPH_RUST_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"rust\" as const,\n role,\n value: selection[key],\n })),\n ...GRAPH_RUST_BACKEND_ARRAY_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"rust\" as const,\n role,\n value: selection[key],\n allowMultiple: true,\n })),\n ...GRAPH_PYTHON_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"python\" as const,\n role,\n value: selection[key],\n })),\n ...GRAPH_PYTHON_BACKEND_ARRAY_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"python\" as const,\n role,\n value: selection[key],\n allowMultiple: true,\n })),\n ...GRAPH_GO_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"go\" as const,\n role,\n value: selection[key],\n })),\n ...GRAPH_JAVA_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"java\" as const,\n role,\n value: selection[key],\n })),\n ...GRAPH_JAVA_BACKEND_ARRAY_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"java\" as const,\n role,\n value: selection[key],\n allowMultiple: true,\n })),\n ...GRAPH_DOTNET_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"dotnet\" as const,\n role,\n value: selection[key],\n })),\n ...GRAPH_DOTNET_BACKEND_ARRAY_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"dotnet\" as const,\n role,\n value: selection[key],\n allowMultiple: true,\n })),\n ...GRAPH_DATABASE_PART_SELECTION_KEYS.map(([key, role]) => ({\n ownerRole: \"database\" as const,\n ecosystem: \"universal\" as const,\n role,\n value: selection[key],\n })),\n ...getAddonScopedPartFields([\n ...selection.codeQuality,\n ...selection.documentation,\n ...selection.appPlatforms,\n ]),\n ...getExampleScopedPartFields(selection.examples),\n ];\n}\n\nfunction getCliScopedPartFields(input: CLIInput): ScopedStackPartField[] {\n const getValue = (key: keyof CLIInput) => {\n const value = input[key];\n return typeof value === \"string\" ? value : undefined;\n };\n const getArrayValue = (key: keyof CLIInput) => {\n const value = input[key];\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\")\n : undefined;\n };\n\n return [\n ...GRAPH_TYPESCRIPT_FRONTEND_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"frontend\" as const,\n ecosystem: \"typescript\" as const,\n role,\n value: getValue(key),\n })),\n ...GRAPH_TYPESCRIPT_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"typescript\" as const,\n role,\n value: getValue(key),\n })),\n ...GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"elixir\" as const,\n role,\n value: getValue(key),\n })),\n ...GRAPH_MOBILE_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"mobile\" as const,\n ecosystem: \"react-native\" as const,\n role,\n value: getValue(key),\n })),\n ...GRAPH_MOBILE_ARRAY_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"mobile\" as const,\n ecosystem: \"react-native\" as const,\n role,\n value: getArrayValue(key),\n allowMultiple: true,\n })),\n ...GRAPH_RUST_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"rust\" as const,\n role,\n value: getValue(key),\n })),\n ...GRAPH_RUST_BACKEND_ARRAY_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"rust\" as const,\n role,\n value: getArrayValue(key),\n allowMultiple: true,\n })),\n ...GRAPH_PYTHON_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"python\" as const,\n role,\n value: getValue(key),\n })),\n ...GRAPH_PYTHON_BACKEND_ARRAY_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"python\" as const,\n role,\n value: getArrayValue(key),\n allowMultiple: true,\n })),\n ...GRAPH_GO_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"go\" as const,\n role,\n value: getValue(key),\n })),\n ...GRAPH_JAVA_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"java\" as const,\n role,\n value: getValue(key),\n })),\n ...GRAPH_JAVA_BACKEND_ARRAY_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"java\" as const,\n role,\n value: getArrayValue(key),\n allowMultiple: true,\n })),\n ...GRAPH_DOTNET_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"dotnet\" as const,\n role,\n value: getValue(key),\n })),\n ...GRAPH_DOTNET_BACKEND_ARRAY_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"backend\" as const,\n ecosystem: \"dotnet\" as const,\n role,\n value: getArrayValue(key),\n allowMultiple: true,\n })),\n ...GRAPH_DATABASE_PART_CLI_KEYS.map(([key, role]) => ({\n ownerRole: \"database\" as const,\n ecosystem: \"universal\" as const,\n role,\n value: getValue(key),\n })),\n ...getAddonScopedPartFields(input.addons),\n ...getExampleScopedPartFields(input.examples),\n ];\n}\n\nfunction mapBackendToCli(backend: string) {\n return SELF_BACKENDS.has(backend) ? \"self\" : backend;\n}\n\nfunction getSelectableStackPartSpecs(specs: readonly string[]): string[] {\n return specs.filter((spec) => spec.split(\":\")[2] !== \"none\");\n}\n\nexport function isGraphStackSelection(\n selection: Pick<StackSelectionInput, \"stackMode\" | \"stackPartSpecs\">,\n): boolean {\n return (\n (selection.stackMode === \"multi\" || String(selection.stackMode) === \"graph\") &&\n getSelectableStackPartSpecs(selection.stackPartSpecs).length > 0\n );\n}\n\nfunction getGraphStackParts(selection: StackSelectionInput) {\n const stackPartSpecs = expandScopedStackPartSpecs(\n selection.stackPartSpecs,\n getSelectionScopedPartFields(selection),\n );\n const stackParts = parseStackPartSpecs(stackPartSpecs, \"selected\");\n const selectableStackParts = parseStackPartSpecs(\n getSelectableStackPartSpecs(stackPartSpecs),\n \"selected\",\n );\n const validation = validateStackParts(selectableStackParts);\n if (validation.issues.length > 0) {\n throw new Error(validation.issues.map((issue) => issue.message).join(\"\\n\"));\n }\n return stackParts;\n}\n\nfunction getAdjustedSelection(selection: StackSelectionInput): StackSelectionInput {\n const compatibility = analyzeStackCompatibility(selection);\n if (!compatibility.adjustedStack) return selection;\n return { ...selection, ...compatibility.adjustedStack };\n}\n\nfunction getProjectName(selection: StackSelectionInput, projectName?: string) {\n return projectName?.trim() || selection.projectName?.trim() || \"my-app\";\n}\n\nfunction areStringArraysEqual(left: readonly string[], right: readonly string[]) {\n const sortedLeft = [...left].sort();\n const sortedRight = [...right].sort();\n\n return (\n sortedLeft.length === sortedRight.length &&\n sortedLeft.every((value, index) => value === sortedRight[index])\n );\n}\n\nfunction isStringArray(value: readonly unknown[]): value is readonly string[] {\n return value.every((item) => typeof item === \"string\");\n}\n\nexport function isStackSelectionDefault<K extends keyof StackSelectionState>(\n selection: StackSelectionState,\n key: K,\n value: StackSelectionState[K],\n): boolean {\n const defaultValue = DEFAULT_STACK_SELECTION[key];\n\n if (selection.backend === \"convex\") {\n if (key === \"runtime\" && value === \"none\") return true;\n if (key === \"database\" && value === \"none\") return true;\n if (key === \"orm\" && value === \"none\") return true;\n if (key === \"api\" && value === \"none\") return true;\n if (key === \"auth\" && value === \"none\") return true;\n if (key === \"dbSetup\" && value === \"none\") return true;\n }\n\n if (Array.isArray(defaultValue) && Array.isArray(value)) {\n return areStringArraysEqual(defaultValue, value);\n }\n\n return defaultValue === value;\n}\n\nexport function cliInputToProjectConfigPartial(\n input: CLIInput,\n projectName?: string,\n): Partial<ProjectConfig> {\n const config: Partial<ProjectConfig> = {};\n const assignableConfig = config as Partial<Record<keyof ProjectConfig, unknown>>;\n\n for (const [inputKey, configKey] of CLI_SCALAR_CONFIG_FIELDS) {\n const value = input[inputKey];\n if (value !== undefined) {\n assignableConfig[configKey] = value;\n }\n }\n\n if (projectName) {\n config.projectName = projectName;\n }\n\n for (const [inputKey, configKey] of CLI_NON_EMPTY_ARRAY_CONFIG_FIELDS) {\n const value = input[inputKey];\n if (Array.isArray(value) && value.length > 0) {\n assignableConfig[configKey] = processCliArrayOption(value);\n }\n }\n\n for (const [inputKey, configKey] of CLI_DEFINED_ARRAY_CONFIG_FIELDS) {\n const value = input[inputKey];\n if (Array.isArray(value)) {\n assignableConfig[configKey] = processCliArrayOption(value);\n }\n }\n\n if (Array.isArray(input.part) && input.part.length > 0) {\n const stackParts = getCliGraphStackParts(input);\n Object.assign(config, stackPartsToLegacyProjectConfigPartial(stackParts), {\n stackParts,\n });\n }\n\n return config;\n}\n\nfunction getCliGraphStackParts(input: CLIInput): StackPart[] {\n const inputSpecs = [...(input.part ?? [])];\n const stackParts = parseStackPartSpecs(inputSpecs, \"selected\");\n const stackPartSpecs = stackParts.map((part) => formatStackPartSpec(part, stackParts));\n const stackPartSpecSet = new Set(stackPartSpecs);\n\n const hasPrimary = (role: StackPartRole, ecosystem: StackPartEcosystem) =>\n stackParts.some(\n (part) =>\n part.role === role &&\n part.ecosystem === ecosystem &&\n !part.ownerPartId &&\n part.source !== \"provided\",\n );\n const hasScoped = (role: StackPartRole, ecosystem: StackPartEcosystem) =>\n stackParts.some(\n (part) => part.role === role && part.ecosystem === ecosystem && part.source !== \"provided\",\n );\n const addScopedBackendPart = (\n ecosystem: Exclude<StackPartEcosystem, \"universal\" | \"react-native\">,\n role: Exclude<StackPartRole, \"frontend\" | \"backend\" | \"mobile\" | \"database\">,\n value: string | undefined,\n ) => {\n if (\n !value ||\n value === \"none\" ||\n !hasPrimary(\"backend\", ecosystem) ||\n hasScoped(role, ecosystem)\n ) {\n return;\n }\n const spec = `backend.${role}:${ecosystem}:${value}`;\n if (!stackPartSpecSet.has(spec)) {\n stackPartSpecs.push(spec);\n stackPartSpecSet.add(spec);\n }\n };\n\n if (input.database && input.database !== \"none\" && !hasPrimary(\"database\", \"universal\")) {\n const spec = `database:universal:${input.database}`;\n if (!stackPartSpecSet.has(spec)) {\n stackPartSpecs.push(spec);\n stackPartSpecSet.add(spec);\n }\n }\n\n addScopedBackendPart(\"typescript\", \"orm\", input.orm);\n addScopedBackendPart(\"typescript\", \"api\", input.api);\n addScopedBackendPart(\"typescript\", \"auth\", input.auth);\n addScopedBackendPart(\"rust\", \"orm\", input.rustOrm);\n addScopedBackendPart(\"rust\", \"api\", input.rustApi);\n addScopedBackendPart(\"rust\", \"auth\", input.rustAuth);\n addScopedBackendPart(\"python\", \"orm\", input.pythonOrm);\n addScopedBackendPart(\"python\", \"api\", input.pythonApi);\n addScopedBackendPart(\"python\", \"graphql\", input.pythonGraphql);\n addScopedBackendPart(\"python\", \"auth\", input.pythonAuth);\n addScopedBackendPart(\"go\", \"orm\", input.goOrm);\n addScopedBackendPart(\"go\", \"api\", input.goApi);\n addScopedBackendPart(\"go\", \"auth\", input.goAuth);\n addScopedBackendPart(\"java\", \"orm\", input.javaOrm);\n addScopedBackendPart(\"java\", \"auth\", input.javaAuth);\n addScopedBackendPart(\"dotnet\", \"orm\", input.dotnetOrm);\n addScopedBackendPart(\"dotnet\", \"api\", input.dotnetApi);\n addScopedBackendPart(\"dotnet\", \"auth\", input.dotnetAuth);\n addScopedBackendPart(\"elixir\", \"orm\", input.elixirOrm);\n addScopedBackendPart(\"elixir\", \"api\", input.elixirApi);\n addScopedBackendPart(\"elixir\", \"auth\", input.elixirAuth);\n\n return parseStackPartSpecs(\n expandScopedStackPartSpecs(stackPartSpecs, getCliScopedPartFields(input)),\n \"selected\",\n );\n}\n\nfunction buildProjectConfigBase(\n selection: StackSelectionInput,\n projectName: string,\n relativePath: string,\n install: boolean,\n): CliDefaultProjectConfigBase {\n const stack = getAdjustedSelection(selection);\n const graphStack = isGraphStackSelection(selection) ? selection : stack;\n const usesEffectBackend = stack.backend === \"effect\";\n const frontend = [\n ...toUniqueNonNoneArray(stack.webFrontend),\n ...toUniqueNonNoneArray(stack.nativeFrontend),\n ] as ProjectConfig[\"frontend\"];\n const baseConfig: CliDefaultProjectConfigBase = {\n projectName,\n relativePath,\n ecosystem: stack.ecosystem as ProjectConfig[\"ecosystem\"],\n database: stack.database as ProjectConfig[\"database\"],\n orm: stack.orm as ProjectConfig[\"orm\"],\n backend: mapBackendToCli(stack.backend) as ProjectConfig[\"backend\"],\n runtime: stack.runtime as ProjectConfig[\"runtime\"],\n frontend: frontend.length > 0 ? frontend : [\"tanstack-router\"],\n addons: [\n ...toUniqueNonNoneArray(stack.codeQuality),\n ...toUniqueNonNoneArray(stack.documentation),\n ...toUniqueNonNoneArray(stack.appPlatforms),\n ] as ProjectConfig[\"addons\"],\n examples: toUniqueNonNoneArray(stack.examples) as ProjectConfig[\"examples\"],\n auth: stack.auth as ProjectConfig[\"auth\"],\n payments: stack.payments as ProjectConfig[\"payments\"],\n email: stack.email as ProjectConfig[\"email\"],\n fileUpload: stack.fileUpload as ProjectConfig[\"fileUpload\"],\n effect: (usesEffectBackend ? \"effect-full\" : stack.backendLibraries) as ProjectConfig[\"effect\"],\n ai: stack.aiSdk as ProjectConfig[\"ai\"],\n stateManagement: stack.stateManagement as ProjectConfig[\"stateManagement\"],\n forms: stack.forms as ProjectConfig[\"forms\"],\n testing: stack.testing as ProjectConfig[\"testing\"],\n git: stack.git === \"true\",\n packageManager: stack.packageManager as ProjectConfig[\"packageManager\"],\n workspaceShape: stack.workspaceShape as ProjectConfig[\"workspaceShape\"],\n versionChannel: stack.versionChannel as ProjectConfig[\"versionChannel\"],\n install,\n dbSetup: stack.dbSetup as ProjectConfig[\"dbSetup\"],\n api: stack.api as ProjectConfig[\"api\"],\n webDeploy: stack.webDeploy as ProjectConfig[\"webDeploy\"],\n serverDeploy: stack.serverDeploy as ProjectConfig[\"serverDeploy\"],\n astroIntegration: stack.astroIntegration as ProjectConfig[\"astroIntegration\"],\n cssFramework: stack.cssFramework as ProjectConfig[\"cssFramework\"],\n uiLibrary: stack.uiLibrary as ProjectConfig[\"uiLibrary\"],\n shadcnBase: stack.shadcnBase as ProjectConfig[\"shadcnBase\"],\n shadcnStyle: stack.shadcnStyle as ProjectConfig[\"shadcnStyle\"],\n shadcnIconLibrary: stack.shadcnIconLibrary as ProjectConfig[\"shadcnIconLibrary\"],\n shadcnColorTheme: stack.shadcnColorTheme as ProjectConfig[\"shadcnColorTheme\"],\n shadcnBaseColor: stack.shadcnBaseColor as ProjectConfig[\"shadcnBaseColor\"],\n shadcnFont: stack.shadcnFont as ProjectConfig[\"shadcnFont\"],\n shadcnRadius: stack.shadcnRadius as ProjectConfig[\"shadcnRadius\"],\n validation: (usesEffectBackend\n ? \"effect-schema\"\n : stack.validation) as ProjectConfig[\"validation\"],\n realtime: stack.realtime as ProjectConfig[\"realtime\"],\n jobQueue: stack.jobQueue as ProjectConfig[\"jobQueue\"],\n animation: stack.animation as ProjectConfig[\"animation\"],\n logging: stack.logging as ProjectConfig[\"logging\"],\n observability: stack.observability as ProjectConfig[\"observability\"],\n featureFlags: stack.featureFlags as ProjectConfig[\"featureFlags\"],\n integrations: stack.integrations as ProjectConfig[\"integrations\"],\n ecommerce: stack.ecommerce as ProjectConfig[\"ecommerce\"],\n analytics: stack.analytics as ProjectConfig[\"analytics\"],\n mobileNavigation: stack.mobileNavigation as ProjectConfig[\"mobileNavigation\"],\n mobileUI: stack.mobileUI as ProjectConfig[\"mobileUI\"],\n mobileStorage: stack.mobileStorage as ProjectConfig[\"mobileStorage\"],\n mobileTesting: stack.mobileTesting as ProjectConfig[\"mobileTesting\"],\n mobilePush: stack.mobilePush as ProjectConfig[\"mobilePush\"],\n mobileOTA: stack.mobileOTA as ProjectConfig[\"mobileOTA\"],\n mobileDeepLinking: stack.mobileDeepLinking as ProjectConfig[\"mobileDeepLinking\"],\n mobileLibraries: toUniqueNonNoneArray(\n stack.mobileLibraries,\n ) as ProjectConfig[\"mobileLibraries\"],\n cms: stack.cms as ProjectConfig[\"cms\"],\n caching: stack.caching as ProjectConfig[\"caching\"],\n rateLimit: stack.rateLimit as ProjectConfig[\"rateLimit\"],\n i18n: stack.i18n as ProjectConfig[\"i18n\"],\n search: stack.search as ProjectConfig[\"search\"],\n vectorDb: stack.vectorDb as ProjectConfig[\"vectorDb\"],\n fileStorage: stack.fileStorage as ProjectConfig[\"fileStorage\"],\n rustWebFramework: stack.rustWebFramework as ProjectConfig[\"rustWebFramework\"],\n rustFrontend: stack.rustFrontend as ProjectConfig[\"rustFrontend\"],\n rustOrm: stack.rustOrm as ProjectConfig[\"rustOrm\"],\n rustApi: stack.rustApi as ProjectConfig[\"rustApi\"],\n rustCli: stack.rustCli as ProjectConfig[\"rustCli\"],\n rustLogging: stack.rustLogging as ProjectConfig[\"rustLogging\"],\n rustErrorHandling: stack.rustErrorHandling as ProjectConfig[\"rustErrorHandling\"],\n rustCaching: stack.rustCaching as ProjectConfig[\"rustCaching\"],\n rustAuth: stack.rustAuth as ProjectConfig[\"rustAuth\"],\n rustRealtime: stack.rustRealtime as ProjectConfig[\"rustRealtime\"],\n rustMessageQueue: stack.rustMessageQueue as ProjectConfig[\"rustMessageQueue\"],\n rustObservability: stack.rustObservability as ProjectConfig[\"rustObservability\"],\n rustTemplating: stack.rustTemplating as ProjectConfig[\"rustTemplating\"],\n rustLibraries: toUniqueNonNoneArray(stack.rustLibraries) as ProjectConfig[\"rustLibraries\"],\n pythonWebFramework: stack.pythonWebFramework as ProjectConfig[\"pythonWebFramework\"],\n pythonOrm: stack.pythonOrm as ProjectConfig[\"pythonOrm\"],\n pythonValidation: stack.pythonValidation as ProjectConfig[\"pythonValidation\"],\n pythonAi: toUniqueNonNoneArray(stack.pythonAi) as ProjectConfig[\"pythonAi\"],\n pythonAuth: stack.pythonAuth as ProjectConfig[\"pythonAuth\"],\n pythonApi: stack.pythonApi as ProjectConfig[\"pythonApi\"],\n pythonTaskQueue: stack.pythonTaskQueue as ProjectConfig[\"pythonTaskQueue\"],\n pythonGraphql: stack.pythonGraphql as ProjectConfig[\"pythonGraphql\"],\n pythonQuality: stack.pythonQuality as ProjectConfig[\"pythonQuality\"],\n pythonTesting: toUniqueNonNoneArray(stack.pythonTesting) as ProjectConfig[\"pythonTesting\"],\n pythonCaching: stack.pythonCaching as ProjectConfig[\"pythonCaching\"],\n pythonRealtime: stack.pythonRealtime as ProjectConfig[\"pythonRealtime\"],\n pythonObservability: stack.pythonObservability as ProjectConfig[\"pythonObservability\"],\n pythonCli: toUniqueNonNoneArray(stack.pythonCli) as ProjectConfig[\"pythonCli\"],\n pythonCloudSdk: stack.pythonCloudSdk as ProjectConfig[\"pythonCloudSdk\"],\n pythonHttpClient: stack.pythonHttpClient as ProjectConfig[\"pythonHttpClient\"],\n pythonData: toUniqueNonNoneArray(stack.pythonData) as ProjectConfig[\"pythonData\"],\n pythonMedia: stack.pythonMedia as ProjectConfig[\"pythonMedia\"],\n pythonServer: stack.pythonServer as ProjectConfig[\"pythonServer\"],\n pythonPackageManager: stack.pythonPackageManager as ProjectConfig[\"pythonPackageManager\"],\n pythonMessageQueue: stack.pythonMessageQueue as ProjectConfig[\"pythonMessageQueue\"],\n goWebFramework: stack.goWebFramework as ProjectConfig[\"goWebFramework\"],\n goOrm: stack.goOrm as ProjectConfig[\"goOrm\"],\n goApi: stack.goApi as ProjectConfig[\"goApi\"],\n goCli: stack.goCli as ProjectConfig[\"goCli\"],\n goLogging: stack.goLogging as ProjectConfig[\"goLogging\"],\n goAuth: stack.goAuth as ProjectConfig[\"goAuth\"],\n goTesting: toUniqueNonNoneArray(stack.goTesting) as ProjectConfig[\"goTesting\"],\n goRealtime: stack.goRealtime as ProjectConfig[\"goRealtime\"],\n goMessageQueue: stack.goMessageQueue as ProjectConfig[\"goMessageQueue\"],\n goCaching: stack.goCaching as ProjectConfig[\"goCaching\"],\n goConfig: stack.goConfig as ProjectConfig[\"goConfig\"],\n goObservability: stack.goObservability as ProjectConfig[\"goObservability\"],\n goValidation: stack.goValidation as ProjectConfig[\"goValidation\"],\n goQuality: stack.goQuality as ProjectConfig[\"goQuality\"],\n goMigrations: stack.goMigrations as ProjectConfig[\"goMigrations\"],\n goTemplating: stack.goTemplating as ProjectConfig[\"goTemplating\"],\n goProtoTooling: stack.goProtoTooling as ProjectConfig[\"goProtoTooling\"],\n goDI: stack.goDI as ProjectConfig[\"goDI\"],\n javaLanguage: stack.javaLanguage as ProjectConfig[\"javaLanguage\"],\n javaWebFramework: stack.javaWebFramework as ProjectConfig[\"javaWebFramework\"],\n javaBuildTool: stack.javaBuildTool as ProjectConfig[\"javaBuildTool\"],\n javaOrm: stack.javaOrm as ProjectConfig[\"javaOrm\"],\n javaAuth: stack.javaAuth as ProjectConfig[\"javaAuth\"],\n javaApi: stack.javaApi as ProjectConfig[\"javaApi\"],\n javaLogging: stack.javaLogging as ProjectConfig[\"javaLogging\"],\n javaLibraries: toUniqueNonNoneArray(stack.javaLibraries) as ProjectConfig[\"javaLibraries\"],\n javaTestingLibraries: toUniqueNonNoneArray(\n stack.javaTestingLibraries,\n ) as ProjectConfig[\"javaTestingLibraries\"],\n dotnetWebFramework: stack.dotnetWebFramework as ProjectConfig[\"dotnetWebFramework\"],\n dotnetOrm: stack.dotnetOrm as ProjectConfig[\"dotnetOrm\"],\n dotnetAuth: stack.dotnetAuth as ProjectConfig[\"dotnetAuth\"],\n dotnetApi: stack.dotnetApi as ProjectConfig[\"dotnetApi\"],\n dotnetTesting: toUniqueNonNoneArray(stack.dotnetTesting) as ProjectConfig[\"dotnetTesting\"],\n dotnetJobQueue: stack.dotnetJobQueue as ProjectConfig[\"dotnetJobQueue\"],\n dotnetRealtime: stack.dotnetRealtime as ProjectConfig[\"dotnetRealtime\"],\n dotnetObservability: toUniqueNonNoneArray(\n stack.dotnetObservability,\n ) as ProjectConfig[\"dotnetObservability\"],\n dotnetValidation: stack.dotnetValidation as ProjectConfig[\"dotnetValidation\"],\n dotnetCaching: stack.dotnetCaching as ProjectConfig[\"dotnetCaching\"],\n dotnetDeploy: stack.dotnetDeploy as ProjectConfig[\"dotnetDeploy\"],\n dotnetLibraries: toUniqueNonNoneArray(\n stack.dotnetLibraries,\n ) as ProjectConfig[\"dotnetLibraries\"],\n elixirWebFramework: stack.elixirWebFramework as ProjectConfig[\"elixirWebFramework\"],\n elixirOrm: stack.elixirOrm as ProjectConfig[\"elixirOrm\"],\n elixirAuth: stack.elixirAuth as ProjectConfig[\"elixirAuth\"],\n elixirApi: stack.elixirApi as ProjectConfig[\"elixirApi\"],\n elixirRealtime: stack.elixirRealtime as ProjectConfig[\"elixirRealtime\"],\n elixirJobs: stack.elixirJobs as ProjectConfig[\"elixirJobs\"],\n elixirValidation: stack.elixirValidation as ProjectConfig[\"elixirValidation\"],\n elixirHttp: stack.elixirHttp as ProjectConfig[\"elixirHttp\"],\n elixirJson: stack.elixirJson as ProjectConfig[\"elixirJson\"],\n elixirEmail: stack.elixirEmail as ProjectConfig[\"elixirEmail\"],\n elixirCaching: stack.elixirCaching as ProjectConfig[\"elixirCaching\"],\n elixirObservability: stack.elixirObservability as ProjectConfig[\"elixirObservability\"],\n elixirTesting: stack.elixirTesting as ProjectConfig[\"elixirTesting\"],\n elixirQuality: stack.elixirQuality as ProjectConfig[\"elixirQuality\"],\n elixirI18n: stack.elixirI18n as ProjectConfig[\"elixirI18n\"],\n elixirHttpServer: stack.elixirHttpServer as ProjectConfig[\"elixirHttpServer\"],\n elixirApplicationFramework:\n stack.elixirApplicationFramework as ProjectConfig[\"elixirApplicationFramework\"],\n elixirDocumentation: stack.elixirDocumentation as ProjectConfig[\"elixirDocumentation\"],\n elixirClustering: stack.elixirClustering as ProjectConfig[\"elixirClustering\"],\n elixirDeploy: stack.elixirDeploy as ProjectConfig[\"elixirDeploy\"],\n elixirLibraries: toUniqueNonNoneArray(\n stack.elixirLibraries,\n ) as ProjectConfig[\"elixirLibraries\"],\n aiDocs: toUniqueNonNoneArray(stack.aiDocs) as ProjectConfig[\"aiDocs\"],\n };\n\n if (!isGraphStackSelection(graphStack)) {\n return baseConfig;\n }\n\n const stackParts = getGraphStackParts(graphStack);\n const loweredGraphConfig = stackPartsToLegacyProjectConfigPartial(stackParts);\n const graphBackend = loweredGraphConfig.backend === \"effect\" || baseConfig.backend === \"effect\";\n\n return {\n ...baseConfig,\n ...loweredGraphConfig,\n ...(graphBackend\n ? { effect: \"effect-full\" as const, validation: \"effect-schema\" as const }\n : {}),\n projectName,\n relativePath,\n git: stack.git === \"true\",\n packageManager: stack.packageManager as ProjectConfig[\"packageManager\"],\n versionChannel: stack.versionChannel as ProjectConfig[\"versionChannel\"],\n install,\n aiDocs: toUniqueNonNoneArray(stack.aiDocs) as ProjectConfig[\"aiDocs\"],\n stackParts,\n };\n}\n\nexport function stackSelectionToProjectConfig(\n selection: StackSelectionInput,\n options: StackProjectConfigOptions,\n): ProjectConfig {\n const projectName = getProjectName(selection);\n const install = options.install ?? selection.install === \"true\";\n\n return {\n ...buildProjectConfigBase(selection, projectName, options.relativePath, install),\n projectDir: options.projectDir,\n };\n}\n\nexport function stackSelectionToCliComparableConfig(\n selection: StackSelectionInput,\n projectName = getProjectName(selection),\n): CliDefaultProjectConfigBase {\n return buildProjectConfigBase(selection, projectName, projectName, selection.install === \"true\");\n}\n\nexport function isCliDefaultStackSelection(\n selection: StackSelectionInput,\n projectName = getProjectName(selection),\n): boolean {\n if (isGraphStackSelection(selection)) return false;\n\n const comparableConfig = stackSelectionToCliComparableConfig(selection, projectName);\n const cliDefaults = {\n ...createCliDefaultProjectConfigBase(\n selection.packageManager as CliDefaultProjectConfigBase[\"packageManager\"],\n ),\n projectName,\n relativePath: projectName,\n };\n const ignoredKeys =\n selection.ecosystem === \"typescript\" || selection.ecosystem === \"react-native\"\n ? new Set<keyof CliDefaultProjectConfigBase>([\n ...RUST_CONFIG_KEYS,\n ...PYTHON_CONFIG_KEYS,\n ...GO_CONFIG_KEYS,\n ...JAVA_CONFIG_KEYS,\n ...DOTNET_CONFIG_KEYS,\n ...ELIXIR_CONFIG_KEYS,\n ...(selection.ecosystem === \"typescript\" ? REACT_NATIVE_CONFIG_KEYS : []),\n ])\n : new Set<keyof CliDefaultProjectConfigBase>();\n\n return (Object.keys(cliDefaults) as Array<keyof CliDefaultProjectConfigBase>).every((key) => {\n if (ignoredKeys.has(key)) return true;\n\n const currentValue = comparableConfig[key];\n const defaultValue = cliDefaults[key];\n\n if (Array.isArray(currentValue) && Array.isArray(defaultValue)) {\n const currentArray: readonly unknown[] = currentValue;\n const defaultArray: readonly unknown[] = defaultValue;\n if (isStringArray(currentArray) && isStringArray(defaultArray)) {\n return areStringArraysEqual(currentArray, defaultArray);\n }\n return JSON.stringify(currentValue) === JSON.stringify(defaultValue);\n }\n\n return currentValue === defaultValue;\n });\n}\n\nfunction getBaseCommand(selection: StackSelectionInput) {\n return (\n PACKAGE_MANAGER_COMMANDS[selection.packageManager as keyof typeof PACKAGE_MANAGER_COMMANDS] ??\n PACKAGE_MANAGER_COMMANDS.bun\n );\n}\n\nfunction generateGraphCommand(selection: StackSelectionInput, projectName: string) {\n const stackParts = getGraphStackParts(selection);\n const hasTypeScriptFrontend = hasGraphPrimaryPart(stackParts, \"frontend\", \"typescript\");\n const hasAstroFrontend = hasGraphPrimaryPart(stackParts, \"frontend\", \"typescript\", \"astro\");\n const hasTypeScriptBackend = hasGraphPrimaryPart(stackParts, \"backend\", \"typescript\");\n const hasRustBackend = hasGraphPrimaryPart(stackParts, \"backend\", \"rust\");\n const hasPythonBackend = hasGraphPrimaryPart(stackParts, \"backend\", \"python\");\n const hasGoBackend = hasGraphPrimaryPart(stackParts, \"backend\", \"go\");\n const hasJavaBackend = hasGraphPrimaryPart(stackParts, \"backend\", \"java\");\n const hasDotnetBackend = hasGraphPrimaryPart(stackParts, \"backend\", \"dotnet\");\n const hasElixirBackend = hasGraphPrimaryPart(stackParts, \"backend\", \"elixir\");\n const hasNonTypeScriptBackend =\n hasRustBackend ||\n hasPythonBackend ||\n hasGoBackend ||\n hasJavaBackend ||\n hasDotnetBackend ||\n hasElixirBackend;\n const hasMobile = hasGraphPrimaryPart(stackParts, \"mobile\");\n const flags = [\n ...stackParts\n .filter((part) => part.source !== \"provided\" && part.toolId !== \"none\")\n .map((part) => `--part ${formatStackPartSpec(part, stackParts)}`),\n ...(hasTypeScriptFrontend\n ? formatChangedStringFlags(selection, GRAPH_TYPESCRIPT_FRONTEND_FLAG_KEYS)\n : []),\n ...(hasAstroFrontend && selection.astroIntegration !== \"none\"\n ? [`--astro-integration ${selection.astroIntegration}`]\n : []),\n ...(hasTypeScriptFrontend && selection.uiLibrary === \"shadcn-ui\"\n ? formatChangedStringFlags(selection, GRAPH_SHADCN_FLAG_KEYS)\n : []),\n ...(hasTypeScriptBackend\n ? formatChangedStringFlags(selection, GRAPH_TYPESCRIPT_BACKEND_FLAG_KEYS)\n : []),\n ...(hasNonTypeScriptBackend\n ? formatChangedStringFlags(selection, GRAPH_SHARED_BACKEND_FLAG_KEYS)\n : []),\n ...(hasElixirBackend\n ? formatChangedStringFlags(selection, GRAPH_ELIXIR_BACKEND_FLAG_KEYS)\n : []),\n ...(hasMobile ? formatChangedStringFlags(selection, GRAPH_MOBILE_FLAG_KEYS) : []),\n `--package-manager ${selection.packageManager}`,\n ...(selection.versionChannel !== \"stable\"\n ? [`--version-channel ${selection.versionChannel}`]\n : []),\n selection.git === \"false\" ? \"--no-git\" : \"--git\",\n selection.install === \"false\" ? \"--no-install\" : \"--install\",\n formatArrayFlag(\"ai-docs\", selection.aiDocs),\n ];\n\n if (selection.yolo === \"true\") {\n flags.push(\"--yolo\");\n }\n\n return `${getBaseCommand(selection)} ${projectName} ${flags.join(\" \")}`;\n}\n\nfunction generateTypeScriptCommand(selection: StackSelectionInput, projectName: string) {\n const base = getBaseCommand(selection);\n\n if (isCliDefaultStackSelection(selection, projectName)) {\n return `${base} ${projectName} --yes`;\n }\n\n const cliBackend = mapBackendToCli(selection.backend);\n const effectSelection =\n selection.backend === \"effect\" ? \"effect-full\" : selection.backendLibraries;\n const validationSelection =\n selection.backend === \"effect\" ? \"effect-schema\" : selection.validation;\n const flags = [\n \"--ecosystem typescript\",\n `--frontend ${\n [...selection.webFrontend, ...selection.nativeFrontend]\n .filter((value, _, values) => value !== \"none\" || values.length === 1)\n .join(\" \") || \"none\"\n }`,\n ...(selection.webFrontend.includes(\"astro\") && selection.astroIntegration !== \"none\"\n ? [`--astro-integration ${selection.astroIntegration}`]\n : []),\n `--css-framework ${selection.cssFramework}`,\n `--ui-library ${selection.uiLibrary}`,\n ...(selection.uiLibrary === \"shadcn-ui\"\n ? [\n `--shadcn-base ${selection.shadcnBase}`,\n `--shadcn-style ${selection.shadcnStyle}`,\n `--shadcn-icon-library ${selection.shadcnIconLibrary}`,\n `--shadcn-color-theme ${selection.shadcnColorTheme}`,\n `--shadcn-base-color ${selection.shadcnBaseColor}`,\n `--shadcn-font ${selection.shadcnFont}`,\n `--shadcn-radius ${selection.shadcnRadius}`,\n ]\n : []),\n `--backend ${cliBackend}`,\n `--runtime ${\n cliBackend === \"self\" || selection.backend === \"convex\" || selection.backend === \"none\"\n ? \"none\"\n : selection.runtime\n }`,\n `--api ${selection.api}`,\n `--auth ${selection.auth}`,\n `--payments ${selection.payments}`,\n `--email ${selection.email}`,\n `--file-upload ${selection.fileUpload}`,\n `--logging ${selection.logging}`,\n `--observability ${selection.observability}`,\n `--feature-flags ${selection.featureFlags}`,\n `--integrations ${selection.integrations}`,\n `--ecommerce ${selection.ecommerce}`,\n `--realtime ${selection.realtime}`,\n `--job-queue ${selection.jobQueue}`,\n `--caching ${selection.caching}`,\n `--rate-limit ${selection.rateLimit}`,\n `--i18n ${selection.i18n}`,\n `--search ${selection.search}`,\n `--vector-db ${selection.vectorDb}`,\n `--file-storage ${selection.fileStorage}`,\n `--cms ${selection.cms}`,\n `--effect ${effectSelection}`,\n `--ai ${selection.aiSdk}`,\n `--state-management ${selection.stateManagement}`,\n `--forms ${selection.forms}`,\n `--validation ${validationSelection}`,\n `--testing ${selection.testing}`,\n `--animation ${selection.animation}`,\n `--database ${selection.database}`,\n `--orm ${selection.orm}`,\n `--db-setup ${selection.dbSetup}`,\n ...(selection.workspaceShape !== \"monorepo\"\n ? [`--workspace-shape ${selection.workspaceShape}`]\n : []),\n `--package-manager ${selection.packageManager}`,\n ...(selection.versionChannel !== \"stable\"\n ? [`--version-channel ${selection.versionChannel}`]\n : []),\n selection.git === \"false\" ? \"--no-git\" : \"--git\",\n `--web-deploy ${selection.webDeploy}`,\n `--server-deploy ${selection.serverDeploy}`,\n selection.install === \"false\" ? \"--no-install\" : \"--install\",\n formatTypeScriptAddonsFlag(selection),\n formatArrayFlag(\"examples\", selection.examples),\n formatArrayFlag(\"ai-docs\", selection.aiDocs),\n ];\n\n if (selection.yolo === \"true\") {\n flags.push(\"--yolo\");\n }\n\n return `${base} ${projectName} ${flags.join(\" \")}`;\n}\n\nfunction generateReactNativeCommand(selection: StackSelectionInput, projectName: string) {\n const flags = [\n \"--ecosystem react-native\",\n `--frontend ${\n selection.nativeFrontend\n .filter((value, _, values) => value !== \"none\" || values.length === 1)\n .join(\" \") || \"native-bare\"\n }`,\n `--auth ${selection.auth}`,\n `--payments ${selection.payments}`,\n `--mobile-navigation ${selection.mobileNavigation}`,\n `--mobile-ui ${selection.mobileUI}`,\n `--mobile-storage ${selection.mobileStorage}`,\n `--mobile-testing ${selection.mobileTesting}`,\n `--mobile-push ${selection.mobilePush}`,\n `--mobile-ota ${selection.mobileOTA}`,\n `--mobile-deep-linking ${selection.mobileDeepLinking}`,\n formatArrayFlag(\"mobile-libraries\", selection.mobileLibraries),\n `--package-manager ${selection.packageManager}`,\n selection.git === \"false\" ? \"--no-git\" : \"--git\",\n selection.install === \"false\" ? \"--no-install\" : \"--install\",\n formatArrayFlag(\"ai-docs\", selection.aiDocs),\n ];\n\n if (selection.yolo === \"true\") {\n flags.push(\"--yolo\");\n }\n\n return `${getBaseCommand(selection)} ${projectName} ${flags.join(\" \")}`;\n}\n\nfunction generateRustCommand(selection: StackSelectionInput, projectName: string) {\n const flags: string[] = [\n \"--ecosystem rust\",\n `--database ${selection.database}`,\n `--rust-web-framework ${selection.rustWebFramework}`,\n `--rust-frontend ${selection.rustFrontend}`,\n `--rust-orm ${selection.rustOrm}`,\n `--rust-api ${selection.rustApi}`,\n `--rust-cli ${selection.rustCli}`,\n formatArrayFlag(\"rust-libraries\", selection.rustLibraries),\n `--rust-logging ${selection.rustLogging}`,\n `--rust-error-handling ${selection.rustErrorHandling}`,\n `--rust-caching ${selection.rustCaching}`,\n `--rust-auth ${selection.rustAuth}`,\n `--rust-realtime ${selection.rustRealtime}`,\n `--rust-message-queue ${selection.rustMessageQueue}`,\n `--rust-observability ${selection.rustObservability}`,\n `--rust-templating ${selection.rustTemplating}`,\n `--email ${selection.email}`,\n `--observability ${selection.observability}`,\n `--caching ${selection.caching}`,\n `--search ${selection.search}`,\n formatArrayFlag(\"ai-docs\", selection.aiDocs),\n ];\n\n if (selection.git === \"false\") flags.push(\"--no-git\");\n if (selection.install === \"false\") flags.push(\"--no-install\");\n\n return `${getBaseCommand(selection)} ${projectName} ${flags.join(\" \")}`;\n}\n\nfunction generatePythonCommand(selection: StackSelectionInput, projectName: string) {\n const flags: string[] = [\n \"--ecosystem python\",\n `--database ${selection.database}`,\n `--python-web-framework ${selection.pythonWebFramework}`,\n `--python-orm ${selection.pythonOrm}`,\n `--python-validation ${selection.pythonValidation}`,\n formatArrayFlag(\"python-ai\", selection.pythonAi),\n `--python-auth ${selection.pythonAuth}`,\n `--python-api ${selection.pythonApi}`,\n `--python-task-queue ${selection.pythonTaskQueue}`,\n `--python-graphql ${selection.pythonGraphql}`,\n `--python-quality ${selection.pythonQuality}`,\n formatArrayFlag(\"python-testing\", selection.pythonTesting),\n `--python-caching ${selection.pythonCaching}`,\n `--python-realtime ${selection.pythonRealtime}`,\n `--python-observability ${selection.pythonObservability}`,\n formatArrayFlag(\"python-cli\", selection.pythonCli),\n `--python-cloud-sdk ${selection.pythonCloudSdk}`,\n `--python-http-client ${selection.pythonHttpClient}`,\n formatArrayFlag(\"python-data\", selection.pythonData),\n `--python-media ${selection.pythonMedia}`,\n `--python-server ${selection.pythonServer}`,\n `--python-package-manager ${selection.pythonPackageManager}`,\n `--python-message-queue ${selection.pythonMessageQueue}`,\n `--email ${selection.email}`,\n `--observability ${selection.observability}`,\n `--caching ${selection.caching}`,\n `--search ${selection.search}`,\n formatArrayFlag(\"ai-docs\", selection.aiDocs),\n ];\n\n if (selection.git === \"false\") flags.push(\"--no-git\");\n if (selection.install === \"false\") flags.push(\"--no-install\");\n\n return `${getBaseCommand(selection)} ${projectName} ${flags.join(\" \")}`;\n}\n\nfunction generateGoCommand(selection: StackSelectionInput, projectName: string) {\n const flags: string[] = [\n \"--ecosystem go\",\n `--database ${selection.database}`,\n `--go-web-framework ${selection.goWebFramework}`,\n `--go-orm ${selection.goOrm}`,\n `--go-api ${selection.goApi}`,\n `--go-cli ${selection.goCli}`,\n `--go-logging ${selection.goLogging}`,\n `--go-auth ${selection.goAuth}`,\n formatArrayFlag(\"go-testing\", selection.goTesting),\n `--go-realtime ${selection.goRealtime}`,\n `--go-message-queue ${selection.goMessageQueue}`,\n `--go-caching ${selection.goCaching}`,\n `--go-config ${selection.goConfig}`,\n `--go-observability ${selection.goObservability}`,\n `--go-validation ${selection.goValidation}`,\n `--go-quality ${selection.goQuality}`,\n `--go-migrations ${selection.goMigrations}`,\n `--go-templating ${selection.goTemplating}`,\n `--go-proto-tooling ${selection.goProtoTooling}`,\n `--go-di ${selection.goDI}`,\n `--auth ${selection.auth}`,\n `--email ${selection.email}`,\n `--observability ${selection.observability}`,\n `--caching ${selection.caching}`,\n `--search ${selection.search}`,\n formatArrayFlag(\"ai-docs\", selection.aiDocs),\n ];\n\n if (selection.git === \"false\") flags.push(\"--no-git\");\n if (selection.install === \"false\") flags.push(\"--no-install\");\n\n return `${getBaseCommand(selection)} ${projectName} ${flags.join(\" \")}`;\n}\n\nfunction generateJavaCommand(selection: StackSelectionInput, projectName: string) {\n const flags: string[] = [\n \"--ecosystem java\",\n `--database ${selection.database}`,\n `--java-web-framework ${selection.javaWebFramework}`,\n // Emit the language flag only for the non-default (Kotlin) variant so the\n // command for every existing Java selection stays byte-identical.\n ...(selection.javaLanguage === \"kotlin\" ? [`--java-language ${selection.javaLanguage}`] : []),\n `--java-build-tool ${selection.javaBuildTool}`,\n `--java-orm ${selection.javaOrm}`,\n `--java-auth ${selection.javaAuth}`,\n `--java-api ${selection.javaApi}`,\n `--java-logging ${selection.javaLogging}`,\n formatArrayFlag(\"java-libraries\", selection.javaLibraries),\n formatArrayFlag(\"java-testing-libraries\", selection.javaTestingLibraries),\n `--email ${selection.email}`,\n `--observability ${selection.observability}`,\n `--caching ${selection.caching}`,\n `--search ${selection.search}`,\n formatArrayFlag(\"ai-docs\", selection.aiDocs),\n ];\n\n if (selection.git === \"false\") flags.push(\"--no-git\");\n if (selection.install === \"false\") flags.push(\"--no-install\");\n\n return `${getBaseCommand(selection)} ${projectName} ${flags.join(\" \")}`;\n}\n\nfunction generateDotnetCommand(selection: StackSelectionInput, projectName: string) {\n const flags: string[] = [\n \"--ecosystem dotnet\",\n `--database ${selection.database}`,\n `--dotnet-web-framework ${selection.dotnetWebFramework}`,\n `--dotnet-orm ${selection.dotnetOrm}`,\n `--dotnet-auth ${selection.dotnetAuth}`,\n `--dotnet-api ${selection.dotnetApi}`,\n formatArrayFlag(\"dotnet-testing\", selection.dotnetTesting),\n `--dotnet-job-queue ${selection.dotnetJobQueue}`,\n `--dotnet-realtime ${selection.dotnetRealtime}`,\n formatArrayFlag(\"dotnet-observability\", selection.dotnetObservability),\n `--dotnet-validation ${selection.dotnetValidation}`,\n `--dotnet-caching ${selection.dotnetCaching}`,\n `--dotnet-deploy ${selection.dotnetDeploy}`,\n formatArrayFlag(\"dotnet-libraries\", selection.dotnetLibraries),\n formatArrayFlag(\"ai-docs\", selection.aiDocs),\n ];\n\n if (selection.git === \"false\") flags.push(\"--no-git\");\n if (selection.install === \"false\") flags.push(\"--no-install\");\n\n return `${getBaseCommand(selection)} ${projectName} ${flags.join(\" \")}`;\n}\n\nfunction generateElixirCommand(selection: StackSelectionInput, projectName: string) {\n const flags: string[] = [\n \"--ecosystem elixir\",\n `--database ${selection.database}`,\n `--elixir-web-framework ${selection.elixirWebFramework}`,\n `--elixir-orm ${selection.elixirOrm}`,\n `--elixir-auth ${selection.elixirAuth}`,\n `--elixir-api ${selection.elixirApi}`,\n `--elixir-realtime ${selection.elixirRealtime}`,\n `--elixir-jobs ${selection.elixirJobs}`,\n `--elixir-validation ${selection.elixirValidation}`,\n `--elixir-http ${selection.elixirHttp}`,\n `--elixir-json ${selection.elixirJson}`,\n `--elixir-email ${selection.elixirEmail}`,\n `--elixir-caching ${selection.elixirCaching}`,\n `--elixir-observability ${selection.elixirObservability}`,\n `--elixir-testing ${selection.elixirTesting}`,\n `--elixir-quality ${selection.elixirQuality}`,\n `--elixir-i18n ${selection.elixirI18n}`,\n `--elixir-http-server ${selection.elixirHttpServer}`,\n `--elixir-application-framework ${selection.elixirApplicationFramework}`,\n `--elixir-documentation ${selection.elixirDocumentation}`,\n `--elixir-clustering ${selection.elixirClustering}`,\n `--elixir-deploy ${selection.elixirDeploy}`,\n formatArrayFlag(\"elixir-libraries\", selection.elixirLibraries),\n formatArrayFlag(\"ai-docs\", selection.aiDocs),\n ];\n\n if (selection.git === \"false\") flags.push(\"--no-git\");\n if (selection.install === \"false\") flags.push(\"--no-install\");\n\n return `${getBaseCommand(selection)} ${projectName} ${flags.join(\" \")}`;\n}\n\nexport function generateStackSelectionCommand(selection: StackSelectionInput): string {\n const projectName = getProjectName(selection);\n\n if (isGraphStackSelection(selection)) {\n return generateGraphCommand(selection, projectName);\n }\n\n switch (selection.ecosystem) {\n case \"react-native\":\n return generateReactNativeCommand(selection, projectName);\n case \"rust\":\n return generateRustCommand(selection, projectName);\n case \"python\":\n return generatePythonCommand(selection, projectName);\n case \"go\":\n return generateGoCommand(selection, projectName);\n case \"java\":\n return generateJavaCommand(selection, projectName);\n case \"dotnet\":\n return generateDotnetCommand(selection, projectName);\n case \"elixir\":\n return generateElixirCommand(selection, projectName);\n case \"typescript\":\n default:\n return generateTypeScriptCommand(selection, projectName);\n }\n}\n"],"mappings":"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yBAAyB,WAAW,CAAC,QACzC,eAAe,4BAA4B,YAAY,SAAS,WAAW,GAAG,KAAK,KACrF;;AAGH,SAAgB,6BACd,YACA,SACA,UACkC;CAClC,MAAM,gBAAgB;AAEtB,KAAI,CAAC,YAAY,aAAa,cAC5B,QAAO;EACL,OAAQ,YAAY;EACpB,YAAY;EACZ,QAAQ;EACR,SAAS;EACV;CAGH,MAAM,SAAS,4BAA4B,YAAY,SAAS,SAAS;AACzE,KAAI,CAAC,OACH,QAAO;EACL,OAAO;EACP,YAAY;EACZ,QAAQ;EACR,SAAS;EACV;AAGH,QAAO;EACL,OAAO;EACP,YAAY;EACZ;EACA,SAAS,GAAG,gBAAgB,WAAW,CAAC,kBAAkB,OAAO;EAClE;;;;;AC7EH,MAAa,4BAA4B;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,8BAA8B;CACzC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,sBAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,wBAAwB;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,sBAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,wBAAwB;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,wBAAwB;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,iBAAiB,CAC5B,GAAG,IAAI,IAAI;CACT,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACJ,CAAC,CACH;AAED,SAAgB,6BACd,WAC2B;AAC3B,SAAQ,WAAR;EACE,KAAK,eACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,KACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,aACH,QAAO;;;AAIb,SAAgB,uBAAuB,aAA6B;CA+GlE,MAAM,aA9GwC;EAC5C,MAAM;EACN,WAAW;EACX,cAAc;EACd,kBAAkB;EAClB,UAAU;EACV,eAAe;EACf,eAAe;EACf,YAAY;EACZ,WAAW;EACX,mBAAmB;EACnB,iBAAiB;EACjB,kBAAkB;EAClB,kBAAkB;EAClB,cAAc;EACd,SAAS;EACT,SAAS;EACT,SAAS;EACT,eAAe;EACf,aAAa;EACb,mBAAmB;EACnB,aAAa;EACb,UAAU;EACV,cAAc;EACd,kBAAkB;EAClB,mBAAmB;EACnB,gBAAgB;EAChB,oBAAoB;EACpB,WAAW;EACX,kBAAkB;EAClB,UAAU;EACV,YAAY;EACZ,WAAW;EACX,iBAAiB;EACjB,eAAe;EACf,eAAe;EACf,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,YAAY;EACZ,aAAa;EACb,cAAc;EACd,sBAAsB;EACtB,oBAAoB;EACpB,gBAAgB;EAChB,OAAO;EACP,OAAO;EACP,OAAO;EACP,WAAW;EACX,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,WAAW;EACX,UAAU;EACV,iBAAiB;EACjB,cAAc;EACd,WAAW;EACX,cAAc;EACd,cAAc;EACd,gBAAgB;EAChB,MAAM;EACN,cAAc;EACd,kBAAkB;EAClB,eAAe;EACf,SAAS;EACT,UAAU;EACV,SAAS;EACT,aAAa;EACb,eAAe;EACf,sBAAsB;EACtB,oBAAoB;EACpB,WAAW;EACX,YAAY;EACZ,WAAW;EACX,eAAe;EACf,gBAAgB;EAChB,gBAAgB;EAChB,qBAAqB;EACrB,kBAAkB;EAClB,eAAe;EACf,cAAc;EACd,iBAAiB;EACjB,oBAAoB;EACpB,WAAW;EACX,YAAY;EACZ,WAAW;EACX,gBAAgB;EAChB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,eAAe;EACf,qBAAqB;EACrB,eAAe;EACf,eAAe;EACf,YAAY;EACZ,kBAAkB;EAClB,4BAA4B;EAC5B,qBAAqB;EACrB,kBAAkB;EAClB,cAAc;EACd,iBAAiB;EAClB,CAEgC;AACjC,KAAI,WAAY,QAAO;CAEvB,MAAM,SAAS,YAAY,QAAQ,YAAY,MAAM;AACrD,QAAO,OAAO,OAAO,EAAE,CAAC,aAAa,GAAG,OAAO,MAAM,EAAE;;AAezD,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;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;CACA;CACA;CACD;AAED,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,uBAAuB,CAAC,aAAa,WAAW;AAEtD,MAAM,mBAAmB;AAEzB,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;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;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;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,WAAW;CACX,MAAM;CACN,QAAQ;CACR,UAAU;CACV,aAAa;CACb,WAAW;CACX,cAAc;CACd,WAAW;CACX,KAAK;CACL,cAAc;CACd,cAAc;CACd,WAAW;CACX,WAAW;CACX,kBAAkB;CAClB,UAAU;CACV,eAAe;CACf,eAAe;CACf,YAAY;CACZ,WAAW;CACX,mBAAmB;CACnB,iBAAiB;CACjB,aAAa;CACb,eAAe;CACf,WAAW;CACX,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,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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rB;CACD,MAAM;EACJ,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,UAAU;EACR,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,KAAK;EACH,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,IAAI;EACF,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EAChB;CACD,UAAU;EACR,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,aAAa;EACX,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,cAAc;EACZ,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EAChB;CACD,SAAS;EACP,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,kBAAkB;EAChB,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,UAAU;EACR,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,eAAe;EACb,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,eAAe;EACb,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,YAAY;EACV,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,mBAAmB;EACjB,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACrB;CACD,iBAAiB;EACf,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACpB,mBAAmB;EACpB;CACD,eAAe;EACb,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,oBAAoB;EACpB,eAAe;EAChB;CACD,SAAS;EACP,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,oBAAoB;EACrB;CACD,UAAU;EACR,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,oBAAoB;EACrB;CACD,eAAe;EACb,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,oBAAoB;EACrB;CACD,sBAAsB;EACpB,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,cAAc;EACZ,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,kBAAkB;EAChB,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,mBAAmB;EACjB,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,mBAAmB;EACpB;CACD,gBAAgB;EACd,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,eAAe;EACb,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,eAAe;EACb,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,mBAAmB;EACpB;CACD,gBAAgB;EACd,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,qBAAqB;EACnB,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,mBAAmB;EACpB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,gBAAgB;EACd,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,kBAAkB;EAChB,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,YAAY;EACV,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,aAAa;EACX,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,cAAc;EACZ,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,sBAAsB;EACpB,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,oBAAoB;EAClB,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,YAAY;EACV,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,gBAAgB;EACd,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,mBAAmB;EACpB;CACD,UAAU;EACR,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,iBAAiB;EACf,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,mBAAmB;EACpB;CACD,cAAc;EACZ,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,cAAc;EACZ,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,cAAc;EACZ,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,gBAAgB;EACd,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,MAAM;EACJ,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,oBAAoB;EACrB;CACD,YAAY;EACV,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,oBAAoB;EACrB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,eAAe;EACb,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,gBAAgB;EACd,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EAChB;CACD,gBAAgB;EACd,MAAM;EACN,WAAW;EACX,WAAW;EACX,gBAAgB;EA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AS,EAAE;CACX,KAAK,EAAE;CACP,KAAK,EAAE;CACP,WAAW;EAAC;EAAmB;EAAgB;EAAc;EAAQ;EAAQ;EAAU;EAAQ;CAC/F,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,mBAAmB;CACnB,sBAAsB;CACtB,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,KAAK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,kBAAkB;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,kBAAkB;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,oBAAoB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,eAAe;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,kBAAkB;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,iBAAiB,EAAE;CACnB,kBAAkB,EAAE;CACpB,MAAM,EAAE;CACR,cAAc,EAAE;CAChB,kBAAkB,EAAE;CACpB,MAAM,EAAE;CACT;AAED,SAAgB,cAAc,OAAiB;AAC7C,QAAO,eAAe,SAAS,MAAM;;AAGvC,SAAgB,eAAe,SAAqB,EAAE,EAGpD;AAKA,QAAO;EAAE,KAJG,OAAO,QAAQ,MAAM,cAAc,EAAE,CAAC;EAIpC,QAHC,OAAO,QACnB,MAAM,MAAM,iBAAiB,MAAM,oBAAoB,MAAM,mBAC/D;EACqB;;AAGxB,SAAgB,wBACd,YAAwB,EAAE,EAC1B,kBACA;CACA,MAAM,eAAe,UAAU,SAAS,OAAO;CAC/C,MAAM,iBAA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5B,CAAC,mBAAmB,kBAAkB;CACvC;AAED,MAAM,2BAA2B;CAC/B,KAAK;CACL,MAAM;CACN,MAAM;CACN,KAAK;CACN;AAED,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,mBAAmB;CACvB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,qBAAqB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,iBAAiB;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,mBAAmB;CACvB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,qBAAqB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,qBAAqB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,2BAA2B;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,YAAY,QAAqC;AACxD,QAAO,OAAO,QAAQ,UAAU,UAAU,OAAO;;AAGnD,SAAgB,sBAAyB,SAA8C;AACrF,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO,EAAE;AAC/C,KAAI,QAAQ,SAAS,OAAqB,CAAE,QAAO,EAAE;AACrD,QAAO,QAAQ,QAAQ,SAAoB,SAAS,OAAO;;AAG7D,SAAS,qBAAqB,QAA2B;AACvD,QAAO,CAAC,GAAG,IAAI,IAAI,YAAY,OAAO,CAAC,CAAC;;AAG1C,SAAS,gBAAgB,MAAc,QAA2B;AAEhE,QAAO,KAAK,KAAK,GADM,qBAAqB,OAAO,CAChB,KA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"}
|