@better-fullstack/types 2.1.7 → 2.2.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.
Files changed (44) hide show
  1. package/dist/{defaults-DNnZX9er.mjs → defaults-DgL5YPQY.mjs} +12 -1
  2. package/dist/defaults-DgL5YPQY.mjs.map +1 -0
  3. package/dist/{defaults-Cpkx-Eu7.d.mts → defaults-DyNR1d-V.d.mts} +2 -2
  4. package/dist/defaults-DyNR1d-V.d.mts.map +1 -0
  5. package/dist/defaults.d.mts +3 -3
  6. package/dist/defaults.mjs +1 -1
  7. package/dist/index.d.mts +7 -7
  8. package/dist/index.d.mts.map +1 -1
  9. package/dist/index.mjs +110 -5
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/json-schema.d.mts +1814 -362
  12. package/dist/json-schema.d.mts.map +1 -1
  13. package/dist/json-schema.mjs +94 -2
  14. package/dist/json-schema.mjs.map +1 -1
  15. package/dist/{schemas-DOb4t_el.d.mts → schemas-D9kkuJz7.d.mts} +1811 -645
  16. package/dist/schemas-D9kkuJz7.d.mts.map +1 -0
  17. package/dist/{schemas-BXDvWDRp.mjs → schemas-l7hOhH8U.mjs} +161 -6
  18. package/dist/schemas-l7hOhH8U.mjs.map +1 -0
  19. package/dist/schemas.d.mts +2 -2
  20. package/dist/schemas.mjs +2 -2
  21. package/dist/{stack-graph-BAad0vv4.mjs → stack-graph-C8r3fTh4.mjs} +180 -27
  22. package/dist/stack-graph-C8r3fTh4.mjs.map +1 -0
  23. package/dist/{stack-graph-0MDSuSPQ.d.mts → stack-graph-F6UKYYR0.d.mts} +2 -2
  24. package/dist/{stack-graph-0MDSuSPQ.d.mts.map → stack-graph-F6UKYYR0.d.mts.map} +1 -1
  25. package/dist/stack-graph.d.mts +3 -3
  26. package/dist/stack-graph.mjs +2 -2
  27. package/dist/{stack-translation-Dau06ig9.d.mts → stack-translation-BNHNx5_b.d.mts} +46 -10
  28. package/dist/stack-translation-BNHNx5_b.d.mts.map +1 -0
  29. package/dist/{stack-translation-DncO452_.mjs → stack-translation-Kr0TyRAm.mjs} +755 -92
  30. package/dist/stack-translation-Kr0TyRAm.mjs.map +1 -0
  31. package/dist/stack-translation.d.mts +4 -4
  32. package/dist/stack-translation.mjs +3 -3
  33. package/dist/{types-CcWal512.d.mts → types-C7RpHf2e.d.mts} +14 -3
  34. package/dist/types-C7RpHf2e.d.mts.map +1 -0
  35. package/dist/types.d.mts +3 -3
  36. package/package.json +2 -2
  37. package/dist/defaults-Cpkx-Eu7.d.mts.map +0 -1
  38. package/dist/defaults-DNnZX9er.mjs.map +0 -1
  39. package/dist/schemas-BXDvWDRp.mjs.map +0 -1
  40. package/dist/schemas-DOb4t_el.d.mts.map +0 -1
  41. package/dist/stack-graph-BAad0vv4.mjs.map +0 -1
  42. package/dist/stack-translation-Dau06ig9.d.mts.map +0 -1
  43. package/dist/stack-translation-DncO452_.mjs.map +0 -1
  44. package/dist/types-CcWal512.d.mts.map +0 -1
@@ -1,6 +1,6 @@
1
- import { $n as MOBILE_OTA_VALUES, $r as RUST_AUTH_VALUES, Ai as SERVER_DEPLOY_VALUES, An as JAVA_AUTH_VALUES, Ar as PYTHON_WEB_FRAMEWORK_VALUES, B as DOTNET_OBSERVABILITY_VALUES, Cr as PYTHON_OBSERVABILITY_VALUES, Ct as ELIXIR_WEB_FRAMEWORK_VALUES, D as CMS_VALUES, Dr as PYTHON_TASK_QUEUE_VALUES, En as I18N_VALUES, Er as PYTHON_REALTIME_VALUES, F as DOTNET_API_VALUES, Fi as SHADCN_ICON_LIBRARY_VALUES, Fn as JAVA_ORM_VALUES, G as DOTNET_WEB_FRAMEWORK_VALUES, H as DOTNET_REALTIME_VALUES, I as DOTNET_AUTH_VALUES, Ii as SHADCN_RADIUS_VALUES, In as JAVA_TESTING_LIBRARIES_VALUES, Jt as FILE_UPLOAD_VALUES, Kt as FEATURE_FLAGS_VALUES, L as DOTNET_CACHING_VALUES, Li as SHADCN_STYLE_VALUES, Ln as JAVA_WEB_FRAMEWORK_VALUES, M as DATABASE_SETUP_VALUES, Mi as SHADCN_BASE_VALUES, Mn as JAVA_LANGUAGE_VALUES, N as DATABASE_VALUES, Ni as SHADCN_COLOR_THEME_VALUES, Nn as JAVA_LIBRARIES_VALUES, Or as PYTHON_TESTING_VALUES, Pi as SHADCN_FONT_VALUES, Pn as JAVA_LOGGING_VALUES, Qn as MOBILE_NAVIGATION_VALUES, Qr as RUST_API_VALUES, R as DOTNET_DEPLOY_VALUES, Ri as STATE_MANAGEMENT_VALUES, Rn as JOB_QUEUE_VALUES, Sr as PYTHON_GRAPHQL_VALUES, St as ELIXIR_VALIDATION_VALUES, Tr as PYTHON_QUALITY_VALUES, U as DOTNET_TESTING_VALUES, V as DOTNET_ORM_VALUES, W as DOTNET_VALIDATION_VALUES, Xr as REALTIME_VALUES, Yn as LOGGING_VALUES, Yr as RATE_LIMIT_VALUES, Yt as FORMS_VALUES, Zn as MOBILE_DEEP_LINKING_VALUES, Zr as RUNTIME_VALUES, _r as PYTHON_AI_VALUES, _t as ELIXIR_OBSERVABILITY_VALUES, a as ANALYTICS_VALUES, aa as VALIDATION_VALUES, ai as RUST_LOGGING_VALUES, an as GO_CLI_VALUES, br as PYTHON_CACHING_VALUES, bt as ELIXIR_REALTIME_VALUES, c as API_VALUES, ci as RUST_ORM_VALUES, cn as GO_MESSAGE_QUEUE_VALUES, ct as ELIXIR_API_VALUES, da as WEB_DEPLOY_VALUES, di as RUST_WEB_FRAMEWORK_VALUES, dn as GO_REALTIME_VALUES, dr as OBSERVABILITY_VALUES, dt as ELIXIR_DEPLOY_VALUES, ea as TESTING_VALUES, ei as RUST_CACHING_VALUES, er as MOBILE_PUSH_VALUES, fa as WORKSPACE_SHAPE_VALUES, fn as GO_TESTING_VALUES, ft as ELIXIR_EMAIL_VALUES, gr as PAYMENTS_VALUES, gt as ELIXIR_LIBRARIES_VALUES, hr as PACKAGE_MANAGER_VALUES, ht as ELIXIR_JSON_VALUES, i as AI_VALUES, ia as UI_LIBRARY_VALUES, ii as RUST_LIBRARIES_VALUES, in as GO_CACHING_VALUES, ji as SHADCN_BASE_COLOR_VALUES, jn as JAVA_BUILD_TOOL_VALUES, k as CSS_FRAMEWORK_VALUES, ki as SEARCH_VALUES, kn as JAVA_API_VALUES, kr as PYTHON_VALIDATION_VALUES, l as ASTRO_INTEGRATION_VALUES, li as RUST_REALTIME_VALUES, ln as GO_OBSERVABILITY_VALUES, lt as ELIXIR_AUTH_VALUES, mt as ELIXIR_JOBS_VALUES, ni as RUST_ERROR_HANDLING_VALUES, nn as GO_API_VALUES, nr as MOBILE_TESTING_VALUES, o as ANIMATION_VALUES, oa as VECTOR_DB_VALUES, oi as RUST_MESSAGE_QUEUE_VALUES, on as GO_CONFIG_VALUES, pn as GO_WEB_FRAMEWORK_VALUES, pr as ORM_VALUES, pt as ELIXIR_HTTP_VALUES, qt as FILE_STORAGE_VALUES, r as AI_DOCS_VALUES, ri as RUST_FRONTEND_VALUES, rn as GO_AUTH_VALUES, rr as MOBILE_UI_VALUES, sa as VERSION_CHANNEL_VALUES, si as RUST_OBSERVABILITY_VALUES, sn as GO_LOGGING_VALUES, st as EFFECT_VALUES, ti as RUST_CLI_VALUES, tr as MOBILE_STORAGE_VALUES, u as AUTH_VALUES, ui as RUST_TEMPLATING_VALUES, un as GO_ORM_VALUES, ut as ELIXIR_CACHING_VALUES, vr as PYTHON_API_VALUES, vt as ELIXIR_ORM_VALUES, w as CACHING_VALUES, wr as PYTHON_ORM_VALUES, wt as EMAIL_VALUES, xr as PYTHON_CLI_VALUES, xt as ELIXIR_TESTING_VALUES, yr as PYTHON_AUTH_VALUES, yt as ELIXIR_QUALITY_VALUES, z as DOTNET_JOB_QUEUE_VALUES } from "./schemas-BXDvWDRp.mjs";
2
- import { E as requiresChatSdkVercelAIForExamples, S as hasTauriCompatibleFrontend, _ as UI_LIBRARY_COMPATIBILITY, a as getAddonStackPartBinding, b as hasPWACompatibleFrontend, f as parseStackPartSpecs, h as validateStackParts, i as formatStackPartSpec, m as stackPartsToLegacyProjectConfigPartial, s as getStackPartCompatibilityIssueForPart, u as legacyProjectConfigToStackParts, v as getUnsupportedWebDeployFrontend, x as hasTanStackAICompatibleFrontend } from "./stack-graph-BAad0vv4.mjs";
3
- import { t as createCliDefaultProjectConfigBase } from "./defaults-DNnZX9er.mjs";
1
+ import { $i as SERVER_DEPLOY_VALUES, $n as JAVA_AUTH_VALUES, $r as PYTHON_WEB_FRAMEWORK_VALUES, A as CSS_FRAMEWORK_VALUES, Aa as VERSION_CHANNEL_VALUES, Ai as RUST_OBSERVABILITY_VALUES, An as GO_WEB_FRAMEWORK_VALUES, At as EMAIL_VALUES, B as DOTNET_JOB_QUEUE_VALUES, Br as PYTHON_AI_VALUES, Ca as TESTING_VALUES, Ci as RUST_CACHING_VALUES, Cn as GO_ORM_VALUES, Cr as MOBILE_PUSH_VALUES, Ct as ELIXIR_OBSERVABILITY_VALUES, Da as UI_LIBRARY_VALUES, Di as RUST_LIBRARIES_VALUES, Dn as GO_TEMPLATING_VALUES, Dt as ELIXIR_TESTING_VALUES, Ei as RUST_FRONTEND_VALUES, En as GO_REALTIME_VALUES, Er as MOBILE_UI_VALUES, Et as ELIXIR_REALTIME_VALUES, Fa as WORKSPACE_SHAPE_VALUES, G as DOTNET_VALIDATION_VALUES, Gr as PYTHON_GRAPHQL_VALUES, H as DOTNET_ORM_VALUES, Hr as PYTHON_AUTH_VALUES, I as DOTNET_API_VALUES, Ir as ORM_VALUES, Jr as PYTHON_QUALITY_VALUES, K as DOTNET_WEB_FRAMEWORK_VALUES, Kr as PYTHON_OBSERVABILITY_VALUES, L as DOTNET_AUTH_VALUES, Mi as RUST_REALTIME_VALUES, N as DATABASE_SETUP_VALUES, Ni as RUST_TEMPLATING_VALUES, O as CMS_VALUES, Oa as VALIDATION_VALUES, Oi as RUST_LOGGING_VALUES, On as GO_TESTING_VALUES, Ot as ELIXIR_VALIDATION_VALUES, P as DATABASE_VALUES, Pa as WEB_DEPLOY_VALUES, Pi as RUST_WEB_FRAMEWORK_VALUES, Pr as OBSERVABILITY_VALUES, Qi as SEARCH_VALUES, Qn as JAVA_API_VALUES, Qr as PYTHON_VALIDATION_VALUES, R as DOTNET_CACHING_VALUES, Rr as PACKAGE_MANAGER_VALUES, Si as RUST_AUTH_VALUES, Sn as GO_OBSERVABILITY_VALUES, Sr as MOBILE_OTA_VALUES, St as ELIXIR_LIBRARIES_VALUES, T as CACHING_VALUES, Ti as RUST_ERROR_HANDLING_VALUES, Tn as GO_QUALITY_VALUES, Tr as MOBILE_TESTING_VALUES, Tt as ELIXIR_QUALITY_VALUES, U as DOTNET_REALTIME_VALUES, Ur as PYTHON_CACHING_VALUES, V as DOTNET_OBSERVABILITY_VALUES, Vr as PYTHON_API_VALUES, W as DOTNET_TESTING_VALUES, Wr as PYTHON_CLI_VALUES, Xr as PYTHON_TASK_QUEUE_VALUES, Yn as I18N_VALUES, Yr as PYTHON_REALTIME_VALUES, Zr as PYTHON_TESTING_VALUES, _n as GO_CONFIG_VALUES, _t as ELIXIR_HTTP_SERVER_VALUES, a as ANALYTICS_VALUES, aa as SHADCN_RADIUS_VALUES, an as FILE_UPLOAD_VALUES, ar as JAVA_TESTING_LIBRARIES_VALUES, bi as RUNTIME_VALUES, bn as GO_MESSAGE_QUEUE_VALUES, br as MOBILE_DEEP_LINKING_VALUES, bt as ELIXIR_JOBS_VALUES, c as API_VALUES, ct as EFFECT_VALUES, d as AUTH_VALUES, dt as ELIXIR_AUTH_VALUES, ea as SHADCN_BASE_COLOR_VALUES, er as JAVA_BUILD_TOOL_VALUES, ft as ELIXIR_CACHING_VALUES, gn as GO_CLI_VALUES, gt as ELIXIR_EMAIL_VALUES, hn as GO_CACHING_VALUES, ht as ELIXIR_DOCUMENTATION_VALUES, i as AI_VALUES, ia as SHADCN_ICON_LIBRARY_VALUES, in as FILE_STORAGE_VALUES, ir as JAVA_ORM_VALUES, ji as RUST_ORM_VALUES, ka as VECTOR_DB_VALUES, ki as RUST_MESSAGE_QUEUE_VALUES, kn as GO_VALIDATION_VALUES, kt as ELIXIR_WEB_FRAMEWORK_VALUES, l as APP_PLATFORM_ADDON_VALUES, lt as ELIXIR_API_VALUES, mn as GO_AUTH_VALUES, mt as ELIXIR_DEPLOY_VALUES, na as SHADCN_COLOR_THEME_VALUES, nr as JAVA_LIBRARIES_VALUES, o as ANIMATION_VALUES, oa as SHADCN_STYLE_VALUES, on as FORMS_VALUES, or as JAVA_WEB_FRAMEWORK_VALUES, pn as GO_API_VALUES, pt as ELIXIR_CLUSTERING_VALUES, qr as PYTHON_ORM_VALUES, r as AI_DOCS_VALUES, ra as SHADCN_FONT_VALUES, rn as FEATURE_FLAGS_VALUES, rr as JAVA_LOGGING_VALUES, sa as STATE_MANAGEMENT_VALUES, sr as JOB_QUEUE_VALUES, ta as SHADCN_BASE_VALUES, tr as JAVA_LANGUAGE_VALUES, u as ASTRO_INTEGRATION_VALUES, ut as ELIXIR_APPLICATION_FRAMEWORK_VALUES, vi as RATE_LIMIT_VALUES, vn as GO_DI_VALUES, vr as LOGGING_VALUES, vt as ELIXIR_HTTP_VALUES, wi as RUST_CLI_VALUES, wn as GO_PROTO_TOOLING_VALUES, wr as MOBILE_STORAGE_VALUES, wt as ELIXIR_ORM_VALUES, xi as RUST_API_VALUES, xn as GO_MIGRATIONS_VALUES, xr as MOBILE_NAVIGATION_VALUES, xt as ELIXIR_JSON_VALUES, yi as REALTIME_VALUES, yn as GO_LOGGING_VALUES, yt as ELIXIR_I18N_VALUES, z as DOTNET_DEPLOY_VALUES, zr as PAYMENTS_VALUES } from "./schemas-l7hOhH8U.mjs";
2
+ import { E as requiresChatSdkVercelAIForExamples, S as hasTauriCompatibleFrontend, _ as UI_LIBRARY_COMPATIBILITY, a as getAddonStackPartBinding, b as hasPWACompatibleFrontend, f as parseStackPartSpecs, h as validateStackParts, i as formatStackPartSpec, m as stackPartsToLegacyProjectConfigPartial, s as getStackPartCompatibilityIssueForPart, u as legacyProjectConfigToStackParts, v as getUnsupportedWebDeployFrontend, x as hasTanStackAICompatibleFrontend } from "./stack-graph-C8r3fTh4.mjs";
3
+ import { t as createCliDefaultProjectConfigBase } from "./defaults-DgL5YPQY.mjs";
4
4
 
5
5
  //#region src/capabilities.ts
6
6
  const CAPABILITY_DEFINITIONS = { auth: [
@@ -85,6 +85,14 @@ const CAPABILITY_DEFINITIONS = { auth: [
85
85
  icon: "https://cdn.simpleicons.org/kinde/00A9FF",
86
86
  color: "from-sky-400 to-cyan-600"
87
87
  },
88
+ {
89
+ id: "passport",
90
+ label: "Passport.js",
91
+ description: "Strategy-based authentication middleware for Express applications",
92
+ promptHint: "Passport.js with GitHub OAuth for Express",
93
+ icon: "https://cdn.simpleicons.org/passport/34E27A",
94
+ color: "from-emerald-400 to-green-600"
95
+ },
88
96
  {
89
97
  id: "none",
90
98
  label: "No Auth",
@@ -160,6 +168,7 @@ function getAuthDisabledReason(context, optionId) {
160
168
  if (optionId === "go-better-auth") return ecosystem === "go" ? null : "GoBetterAuth is available only for Go stacks";
161
169
  if (ecosystem === "go") return "Go stacks currently support GoBetterAuth only";
162
170
  if (ecosystem !== "typescript") return `${capitalizeFirst(ecosystem)} stacks do not support auth integrations yet`;
171
+ if (webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend))) return "Auth client integrations are not yet wired for standalone Vue or Vanilla Vite frontends";
163
172
  if (backend === "none") return "No backend selected";
164
173
  if (optionId === "better-auth" || optionId === "better-auth-organizations") {
165
174
  if (optionId === "better-auth-organizations" && backend === "convex") return "Better Auth organizations is currently generated for non-Convex Better Auth stacks";
@@ -196,6 +205,7 @@ function getAuthDisabledReason(context, optionId) {
196
205
  }
197
206
  return "In Better-Fullstack, Supabase Auth is currently supported only with the 'self' backend (fullstack Next.js or TanStack Start)";
198
207
  }
208
+ if (optionId === "passport") return backend === "express" ? null : "Passport.js is currently scaffolded for the Express backend";
199
209
  const nextOnlyLabel = getNextOnlyAuthLabel(optionId);
200
210
  if (backend !== "self" && backend !== "self-next") return `In Better-Fullstack, ${nextOnlyLabel} is currently supported only with the 'self' backend (fullstack Next.js)`;
201
211
  if (!hasNextJs) return `In Better-Fullstack, ${nextOnlyLabel} currently requires the Next.js frontend`;
@@ -239,6 +249,7 @@ function normalizeCapabilitySelection(capability, context, optionId) {
239
249
  const TYPESCRIPT_CATEGORY_ORDER = [
240
250
  "webFrontend",
241
251
  "astroIntegration",
252
+ "appShells",
242
253
  "cssFramework",
243
254
  "uiLibrary",
244
255
  "shadcnBase",
@@ -366,6 +377,12 @@ const GO_CATEGORY_ORDER = [
366
377
  "goCaching",
367
378
  "goConfig",
368
379
  "goObservability",
380
+ "goValidation",
381
+ "goQuality",
382
+ "goMigrations",
383
+ "goTemplating",
384
+ "goProtoTooling",
385
+ "goDI",
369
386
  "auth",
370
387
  "email",
371
388
  "observability",
@@ -424,6 +441,11 @@ const ELIXIR_CATEGORY_ORDER = [
424
441
  "elixirObservability",
425
442
  "elixirTesting",
426
443
  "elixirQuality",
444
+ "elixirI18n",
445
+ "elixirHttpServer",
446
+ "elixirApplicationFramework",
447
+ "elixirDocumentation",
448
+ "elixirClustering",
427
449
  "elixirDeploy",
428
450
  "elixirLibraries",
429
451
  "aiDocs",
@@ -455,6 +477,8 @@ function getCategoryOrderForEcosystem(ecosystem) {
455
477
  function getCategoryDisplayName(categoryKey) {
456
478
  const customName = {
457
479
  i18n: "Internationalization (i18n)",
480
+ appShells: "App Platforms",
481
+ appPlatforms: "Addons",
458
482
  mobileNavigation: "Mobile Navigation",
459
483
  mobileUI: "Mobile UI",
460
484
  mobileStorage: "Mobile Storage",
@@ -503,6 +527,12 @@ function getCategoryDisplayName(categoryKey) {
503
527
  goCaching: "Go Caching",
504
528
  goConfig: "Go Config",
505
529
  goObservability: "Go Observability",
530
+ goValidation: "Go Validation",
531
+ goQuality: "Go Code Quality",
532
+ goMigrations: "Go Database Migrations",
533
+ goTemplating: "Go Templating",
534
+ goProtoTooling: "Go Protobuf Tooling",
535
+ goDI: "Go Dependency Injection",
506
536
  javaLanguage: "Java Language",
507
537
  javaWebFramework: "Java Web Framework",
508
538
  javaBuildTool: "Java Build Tool",
@@ -537,6 +567,11 @@ function getCategoryDisplayName(categoryKey) {
537
567
  elixirObservability: "Elixir Observability",
538
568
  elixirTesting: "Elixir Testing",
539
569
  elixirQuality: "Elixir Code Quality",
570
+ elixirI18n: "Elixir Localization",
571
+ elixirHttpServer: "Elixir HTTP Server",
572
+ elixirApplicationFramework: "Elixir Application Framework",
573
+ elixirDocumentation: "Elixir Documentation",
574
+ elixirClustering: "Elixir Clustering",
540
575
  elixirDeploy: "Elixir Deploy",
541
576
  elixirLibraries: "Elixir Libraries"
542
577
  }[categoryKey];
@@ -548,6 +583,8 @@ const WEB_FRONTEND_VALUES = [
548
583
  "tanstack-router",
549
584
  "react-router",
550
585
  "react-vite",
586
+ "vanilla-vite",
587
+ "vue",
551
588
  "tanstack-start",
552
589
  "next",
553
590
  "vinext",
@@ -591,6 +628,8 @@ const BACKEND_BUILDER_VALUES = [
591
628
  ];
592
629
  const CODE_QUALITY_VALUES = [
593
630
  "biome",
631
+ "eslint",
632
+ "prettier",
594
633
  "oxlint",
595
634
  "ultracite",
596
635
  "lefthook",
@@ -598,13 +637,10 @@ const CODE_QUALITY_VALUES = [
598
637
  "ruler"
599
638
  ];
600
639
  const DOCUMENTATION_VALUES = ["starlight", "fumadocs"];
640
+ const APP_SHELL_VALUES = APP_PLATFORM_ADDON_VALUES;
601
641
  const APP_PLATFORM_VALUES = [
602
642
  "turborepo",
603
643
  "nx",
604
- "pwa",
605
- "tauri",
606
- "wxt",
607
- "opentui",
608
644
  "mcp",
609
645
  "skills",
610
646
  "msw",
@@ -618,7 +654,12 @@ const APP_PLATFORM_VALUES = [
618
654
  "backend-utils",
619
655
  "devcontainer",
620
656
  "docker-compose",
621
- "github-actions"
657
+ "github-actions",
658
+ "axios",
659
+ "firebase",
660
+ "graphql-codegen",
661
+ "openapi-typescript",
662
+ "apollo-client"
622
663
  ];
623
664
  const EXAMPLE_VALUES = ["ai", "chat-sdk"];
624
665
  const BOOLEAN_OPTION_VALUES = ["true", "false"];
@@ -627,6 +668,7 @@ const MULTI_SELECT_CATEGORIES = new Set([
627
668
  "nativeFrontend",
628
669
  "codeQuality",
629
670
  "documentation",
671
+ "appShells",
630
672
  "appPlatforms",
631
673
  "examples",
632
674
  "aiDocs",
@@ -687,6 +729,7 @@ const CATEGORY_VALUE_IDS = {
687
729
  mobileDeepLinking: MOBILE_DEEP_LINKING_VALUES,
688
730
  codeQuality: CODE_QUALITY_VALUES,
689
731
  documentation: DOCUMENTATION_VALUES,
732
+ appShells: APP_SHELL_VALUES,
690
733
  appPlatforms: APP_PLATFORM_VALUES,
691
734
  packageManager: PACKAGE_MANAGER_VALUES,
692
735
  workspaceShape: WORKSPACE_SHAPE_VALUES,
@@ -744,6 +787,12 @@ const CATEGORY_VALUE_IDS = {
744
787
  goCaching: GO_CACHING_VALUES,
745
788
  goConfig: GO_CONFIG_VALUES,
746
789
  goObservability: GO_OBSERVABILITY_VALUES,
790
+ goValidation: GO_VALIDATION_VALUES,
791
+ goQuality: GO_QUALITY_VALUES,
792
+ goMigrations: GO_MIGRATIONS_VALUES,
793
+ goTemplating: GO_TEMPLATING_VALUES,
794
+ goProtoTooling: GO_PROTO_TOOLING_VALUES,
795
+ goDI: GO_DI_VALUES,
747
796
  javaLanguage: JAVA_LANGUAGE_VALUES,
748
797
  javaWebFramework: JAVA_WEB_FRAMEWORK_VALUES,
749
798
  javaBuildTool: JAVA_BUILD_TOOL_VALUES,
@@ -778,6 +827,11 @@ const CATEGORY_VALUE_IDS = {
778
827
  elixirObservability: ELIXIR_OBSERVABILITY_VALUES,
779
828
  elixirTesting: ELIXIR_TESTING_VALUES,
780
829
  elixirQuality: ELIXIR_QUALITY_VALUES,
830
+ elixirI18n: ELIXIR_I18N_VALUES,
831
+ elixirHttpServer: ELIXIR_HTTP_SERVER_VALUES,
832
+ elixirApplicationFramework: ELIXIR_APPLICATION_FRAMEWORK_VALUES,
833
+ elixirDocumentation: ELIXIR_DOCUMENTATION_VALUES,
834
+ elixirClustering: ELIXIR_CLUSTERING_VALUES,
781
835
  elixirDeploy: ELIXIR_DEPLOY_VALUES,
782
836
  elixirLibraries: ELIXIR_LIBRARIES_VALUES
783
837
  };
@@ -793,6 +847,8 @@ const EXACT_LABEL_OVERRIDES = {
793
847
  next: "Next.js",
794
848
  vinext: "Vinext",
795
849
  "react-vite": "React + Vite",
850
+ "vanilla-vite": "Vite (Vanilla TypeScript)",
851
+ vue: "Vue 3 + Vite",
796
852
  svelte: "SvelteKit",
797
853
  redwood: "RedwoodJS"
798
854
  },
@@ -858,17 +914,20 @@ const EXACT_LABEL_OVERRIDES = {
858
914
  cms: {
859
915
  tinacms: "TinaCMS",
860
916
  directus: "Directus",
861
- keystatic: "Keystatic"
917
+ keystatic: "Keystatic",
918
+ contentful: "Contentful"
862
919
  },
863
920
  auth: {
864
921
  "better-auth-organizations": "Better Auth + Organizations",
865
922
  auth0: "Auth0",
866
923
  workos: "WorkOS AuthKit",
867
- kinde: "Kinde"
924
+ kinde: "Kinde",
925
+ passport: "Passport.js"
868
926
  },
869
927
  payments: {
870
928
  "lemon-squeezy": "Lemon Squeezy",
871
- dodo: "Dodo Payments"
929
+ dodo: "Dodo Payments",
930
+ paypal: "PayPal"
872
931
  },
873
932
  email: {
874
933
  "react-email": "React Email",
@@ -910,9 +969,13 @@ const EXACT_LABEL_OVERRIDES = {
910
969
  typebox: "TypeBox",
911
970
  "effect-schema": "Effect Schema"
912
971
  },
913
- testing: { "vitest-playwright": "Vitest + Playwright" },
972
+ testing: {
973
+ "vitest-playwright": "Vitest + Playwright",
974
+ mocha: "Mocha"
975
+ },
914
976
  realtime: {
915
977
  "socket-io": "Socket.IO",
978
+ ws: "ws",
916
979
  yjs: "Y.js"
917
980
  },
918
981
  jobQueue: {
@@ -947,7 +1010,8 @@ const EXACT_LABEL_OVERRIDES = {
947
1010
  cssFramework: {
948
1011
  tailwind: "Tailwind CSS",
949
1012
  scss: "SCSS",
950
- "postcss-only": "PostCSS Only"
1013
+ "postcss-only": "PostCSS Only",
1014
+ "styled-components": "styled-components"
951
1015
  },
952
1016
  uiLibrary: {
953
1017
  "shadcn-ui": "shadcn/ui",
@@ -973,7 +1037,8 @@ const EXACT_LABEL_OVERRIDES = {
973
1037
  },
974
1038
  analytics: {
975
1039
  plausible: "Plausible",
976
- umami: "Umami"
1040
+ umami: "Umami",
1041
+ ga4: "Google Analytics 4"
977
1042
  },
978
1043
  mobileNavigation: {
979
1044
  "expo-router": "Expo Router",
@@ -996,6 +1061,8 @@ const EXACT_LABEL_OVERRIDES = {
996
1061
  mobileDeepLinking: { "expo-linking": "Expo Linking" },
997
1062
  codeQuality: {
998
1063
  biome: "Biome",
1064
+ eslint: "ESLint",
1065
+ prettier: "Prettier",
999
1066
  oxlint: "Oxlint",
1000
1067
  ultracite: "Ultracite",
1001
1068
  lefthook: "Lefthook",
@@ -1006,10 +1073,15 @@ const EXACT_LABEL_OVERRIDES = {
1006
1073
  starlight: "Starlight",
1007
1074
  fumadocs: "Fumadocs"
1008
1075
  },
1009
- appPlatforms: {
1076
+ appShells: {
1010
1077
  pwa: "PWA",
1078
+ tauri: "Tauri",
1079
+ electron: "Electron",
1080
+ capacitor: "Capacitor",
1011
1081
  wxt: "WXT",
1012
- opentui: "OpenTUI",
1082
+ opentui: "OpenTUI"
1083
+ },
1084
+ appPlatforms: {
1013
1085
  mcp: "MCP",
1014
1086
  msw: "MSW",
1015
1087
  swr: "SWR",
@@ -1020,7 +1092,12 @@ const EXACT_LABEL_OVERRIDES = {
1020
1092
  "tanstack-pacer": "TanStack Pacer",
1021
1093
  devcontainer: "DevContainer",
1022
1094
  "docker-compose": "Docker Compose",
1023
- "github-actions": "GitHub Actions"
1095
+ "github-actions": "GitHub Actions",
1096
+ axios: "Axios",
1097
+ firebase: "Firebase JS SDK",
1098
+ "graphql-codegen": "GraphQL Code Generator",
1099
+ "openapi-typescript": "openapi-typescript",
1100
+ "apollo-client": "Apollo Client"
1024
1101
  },
1025
1102
  versionChannel: {
1026
1103
  stable: "Stable",
@@ -1036,6 +1113,8 @@ const EXACT_LABEL_OVERRIDES = {
1036
1113
  voltagent: "VoltAgent",
1037
1114
  langgraph: "LangGraph.js",
1038
1115
  "openai-agents": "OpenAI Agents SDK",
1116
+ "openai-sdk": "OpenAI SDK",
1117
+ "anthropic-sdk": "Anthropic SDK",
1039
1118
  "google-adk": "Google ADK",
1040
1119
  modelfusion: "ModelFusion",
1041
1120
  langchain: "LangChain",
@@ -1104,20 +1183,27 @@ const EXACT_LABEL_OVERRIDES = {
1104
1183
  "actix-web": "Actix-web",
1105
1184
  rocket: "Rocket",
1106
1185
  poem: "Poem",
1107
- loco: "Loco"
1186
+ loco: "Loco",
1187
+ warp: "Warp",
1188
+ salvo: "Salvo"
1108
1189
  },
1109
1190
  rustFrontend: {
1110
1191
  leptos: "Leptos",
1111
- dioxus: "Dioxus"
1192
+ dioxus: "Dioxus",
1193
+ yew: "Yew"
1112
1194
  },
1113
1195
  rustOrm: {
1114
1196
  "sea-orm": "SeaORM",
1115
1197
  sqlx: "SQLx",
1116
- diesel: "Diesel"
1198
+ diesel: "Diesel",
1199
+ mongodb: "MongoDB Rust Driver",
1200
+ rusqlite: "rusqlite",
1201
+ "tokio-postgres": "tokio-postgres"
1117
1202
  },
1118
1203
  rustApi: {
1119
1204
  "async-graphql": "async-graphql",
1120
- tonic: "Tonic"
1205
+ tonic: "Tonic",
1206
+ jsonrpsee: "jsonrpsee"
1121
1207
  },
1122
1208
  rustCli: {
1123
1209
  clap: "Clap",
@@ -1140,7 +1226,14 @@ const EXACT_LABEL_OVERRIDES = {
1140
1226
  "tokio-test": "Tokio Test",
1141
1227
  mockall: "Mockall",
1142
1228
  proptest: "Proptest",
1143
- insta: "Insta"
1229
+ insta: "Insta",
1230
+ rand: "rand",
1231
+ regex: "regex",
1232
+ rayon: "Rayon",
1233
+ itertools: "Itertools",
1234
+ rstest: "rstest",
1235
+ "cargo-nextest": "cargo-nextest",
1236
+ "cargo-audit": "cargo-audit"
1144
1237
  },
1145
1238
  rustLogging: {
1146
1239
  tracing: "Tracing",
@@ -1156,14 +1249,24 @@ const EXACT_LABEL_OVERRIDES = {
1156
1249
  },
1157
1250
  rustAuth: {
1158
1251
  oauth2: "OAuth2",
1159
- torii: "Torii"
1252
+ torii: "Torii",
1253
+ openidconnect: "OpenID Connect",
1254
+ "tower-sessions": "tower-sessions"
1160
1255
  },
1161
1256
  rustRealtime: { "tokio-tungstenite": "tokio-tungstenite" },
1162
- rustMessageQueue: { lapin: "Lapin (RabbitMQ)" },
1163
- rustObservability: { opentelemetry: "OpenTelemetry" },
1257
+ rustMessageQueue: {
1258
+ lapin: "Lapin (RabbitMQ)",
1259
+ rdkafka: "rdkafka (Kafka)",
1260
+ "async-nats": "async-nats"
1261
+ },
1262
+ rustObservability: {
1263
+ opentelemetry: "OpenTelemetry",
1264
+ metrics: "metrics"
1265
+ },
1164
1266
  rustTemplating: {
1165
1267
  askama: "Askama",
1166
- tera: "Tera"
1268
+ tera: "Tera",
1269
+ minijinja: "MiniJinja"
1167
1270
  },
1168
1271
  pythonWebFramework: {
1169
1272
  fastapi: "FastAPI",
@@ -1239,17 +1342,24 @@ const EXACT_LABEL_OVERRIDES = {
1239
1342
  echo: "Echo",
1240
1343
  fiber: "Fiber",
1241
1344
  chi: "Chi",
1242
- stdlib: "net/http"
1345
+ stdlib: "net/http",
1346
+ "go-zero": "go-zero",
1347
+ kratos: "Kratos",
1348
+ httprouter: "HttpRouter"
1243
1349
  },
1244
1350
  goOrm: {
1245
1351
  gorm: "GORM",
1246
1352
  sqlc: "sqlc",
1247
1353
  ent: "Ent",
1248
- bun: "Bun"
1354
+ bun: "Bun",
1355
+ sqlx: "sqlx"
1249
1356
  },
1250
1357
  goApi: {
1251
1358
  "grpc-go": "gRPC-Go",
1252
- gqlgen: "gqlgen"
1359
+ gqlgen: "gqlgen",
1360
+ "grpc-gateway": "grpc-gateway",
1361
+ "connect-go": "Connect-Go",
1362
+ "oapi-codegen": "oapi-codegen"
1253
1363
  },
1254
1364
  goCli: {
1255
1365
  cobra: "Cobra",
@@ -1265,11 +1375,15 @@ const EXACT_LABEL_OVERRIDES = {
1265
1375
  goAuth: {
1266
1376
  casbin: "Casbin",
1267
1377
  jwt: "golang-jwt",
1268
- goth: "Goth"
1378
+ goth: "Goth",
1379
+ oauth2: "golang.org/x/oauth2"
1269
1380
  },
1270
1381
  goTesting: {
1271
1382
  testify: "Testify",
1272
- gomock: "GoMock"
1383
+ gomock: "GoMock",
1384
+ testcontainers: "Testcontainers for Go",
1385
+ "ginkgo-gomega": "Ginkgo + Gomega",
1386
+ mockery: "mockery"
1273
1387
  },
1274
1388
  goRealtime: {
1275
1389
  "gorilla-websocket": "Gorilla WebSocket",
@@ -1277,7 +1391,9 @@ const EXACT_LABEL_OVERRIDES = {
1277
1391
  },
1278
1392
  goMessageQueue: {
1279
1393
  nats: "NATS",
1280
- watermill: "Watermill"
1394
+ watermill: "Watermill",
1395
+ "kafka-go": "kafka-go",
1396
+ asynq: "Asynq"
1281
1397
  },
1282
1398
  goCaching: {
1283
1399
  redis: "go-redis",
@@ -1287,7 +1403,16 @@ const EXACT_LABEL_OVERRIDES = {
1287
1403
  viper: "Viper",
1288
1404
  koanf: "Koanf"
1289
1405
  },
1290
- goObservability: { opentelemetry: "OpenTelemetry" },
1406
+ goObservability: {
1407
+ opentelemetry: "OpenTelemetry",
1408
+ prometheus: "Prometheus"
1409
+ },
1410
+ goValidation: { validator: "go-playground/validator" },
1411
+ goQuality: { "golangci-lint": "golangci-lint" },
1412
+ goMigrations: { "golang-migrate": "golang-migrate" },
1413
+ goTemplating: { templ: "templ" },
1414
+ goProtoTooling: { buf: "Buf" },
1415
+ goDI: { fx: "Uber Fx" },
1291
1416
  javaLanguage: {
1292
1417
  java: "Java",
1293
1418
  kotlin: "Kotlin"
@@ -1404,21 +1529,28 @@ const EXACT_LABEL_OVERRIDES = {
1404
1529
  },
1405
1530
  elixirOrm: {
1406
1531
  ecto: "Ecto",
1407
- "ecto-sql": "Ecto SQL"
1532
+ "ecto-sql": "Ecto SQL",
1533
+ myxql: "MyXQL",
1534
+ ecto_sqlite3: "ecto_sqlite3"
1408
1535
  },
1409
1536
  elixirAuth: {
1410
1537
  "phx-gen-auth": "phx.gen.auth",
1411
1538
  ueberauth: "Ueberauth",
1412
- guardian: "Guardian"
1539
+ guardian: "Guardian",
1540
+ pow: "Pow"
1413
1541
  },
1414
1542
  elixirApi: {
1415
1543
  rest: "Phoenix REST",
1416
1544
  absinthe: "Absinthe GraphQL",
1417
- grpc: "gRPC (grpc-elixir)"
1545
+ grpc: "gRPC (grpc-elixir)",
1546
+ open_api_spex: "OpenApiSpex"
1418
1547
  },
1419
1548
  elixirLibraries: {
1420
1549
  broadway: "Broadway",
1421
- nx: "Nx (Numerical Elixir)"
1550
+ nx: "Nx (Numerical Elixir)",
1551
+ ex_aws: "ExAws",
1552
+ floki: "Floki",
1553
+ rustler: "Rustler"
1422
1554
  },
1423
1555
  elixirRealtime: {
1424
1556
  channels: "Phoenix Channels",
@@ -1436,30 +1568,48 @@ const EXACT_LABEL_OVERRIDES = {
1436
1568
  },
1437
1569
  elixirHttp: {
1438
1570
  req: "Req",
1439
- finch: "Finch"
1571
+ finch: "Finch",
1572
+ tesla: "Tesla"
1440
1573
  },
1441
1574
  elixirJson: { jason: "Jason" },
1442
- elixirEmail: { swoosh: "Swoosh" },
1575
+ elixirEmail: {
1576
+ swoosh: "Swoosh",
1577
+ bamboo: "Bamboo"
1578
+ },
1443
1579
  elixirCaching: {
1444
1580
  cachex: "Cachex",
1445
- nebulex: "Nebulex"
1581
+ nebulex: "Nebulex",
1582
+ redix: "Redix"
1446
1583
  },
1447
1584
  elixirObservability: {
1448
1585
  telemetry: "Telemetry",
1449
1586
  opentelemetry: "OpenTelemetry",
1450
- prom_ex: "PromEx"
1587
+ prom_ex: "PromEx",
1588
+ sentry: "Sentry"
1451
1589
  },
1452
1590
  elixirTesting: {
1453
1591
  ex_unit: "ExUnit",
1454
1592
  mox: "Mox",
1455
1593
  bypass: "Bypass",
1456
- wallaby: "Wallaby"
1594
+ wallaby: "Wallaby",
1595
+ stream_data: "StreamData",
1596
+ ex_machina: "ExMachina"
1457
1597
  },
1458
1598
  elixirQuality: {
1459
1599
  credo: "Credo",
1460
1600
  dialyxir: "Dialyxir",
1461
- sobelow: "Sobelow"
1462
- },
1601
+ sobelow: "Sobelow",
1602
+ excoveralls: "ExCoveralls",
1603
+ mix_audit: "MixAudit"
1604
+ },
1605
+ elixirI18n: { gettext: "Gettext" },
1606
+ elixirHttpServer: {
1607
+ bandit: "Bandit",
1608
+ cowboy: "Cowboy"
1609
+ },
1610
+ elixirApplicationFramework: { ash: "Ash Framework" },
1611
+ elixirDocumentation: { ex_doc: "ExDoc" },
1612
+ elixirClustering: { libcluster: "libcluster" },
1463
1613
  elixirDeploy: {
1464
1614
  docker: "Docker",
1465
1615
  fly: "Fly.io",
@@ -1571,6 +1721,7 @@ const OPTION_CATEGORY_METADATA = {
1571
1721
  mobileDeepLinking: buildCategoryMetadata("mobileDeepLinking"),
1572
1722
  codeQuality: buildCategoryMetadata("codeQuality"),
1573
1723
  documentation: buildCategoryMetadata("documentation"),
1724
+ appShells: buildCategoryMetadata("appShells"),
1574
1725
  appPlatforms: buildCategoryMetadata("appPlatforms"),
1575
1726
  packageManager: buildCategoryMetadata("packageManager"),
1576
1727
  workspaceShape: buildCategoryMetadata("workspaceShape"),
@@ -1628,6 +1779,12 @@ const OPTION_CATEGORY_METADATA = {
1628
1779
  goCaching: buildCategoryMetadata("goCaching"),
1629
1780
  goConfig: buildCategoryMetadata("goConfig"),
1630
1781
  goObservability: buildCategoryMetadata("goObservability"),
1782
+ goValidation: buildCategoryMetadata("goValidation"),
1783
+ goQuality: buildCategoryMetadata("goQuality"),
1784
+ goMigrations: buildCategoryMetadata("goMigrations"),
1785
+ goTemplating: buildCategoryMetadata("goTemplating"),
1786
+ goProtoTooling: buildCategoryMetadata("goProtoTooling"),
1787
+ goDI: buildCategoryMetadata("goDI"),
1631
1788
  javaLanguage: buildCategoryMetadata("javaLanguage"),
1632
1789
  javaWebFramework: buildCategoryMetadata("javaWebFramework"),
1633
1790
  javaBuildTool: buildCategoryMetadata("javaBuildTool"),
@@ -1662,6 +1819,11 @@ const OPTION_CATEGORY_METADATA = {
1662
1819
  elixirObservability: buildCategoryMetadata("elixirObservability"),
1663
1820
  elixirTesting: buildCategoryMetadata("elixirTesting"),
1664
1821
  elixirQuality: buildCategoryMetadata("elixirQuality"),
1822
+ elixirI18n: buildCategoryMetadata("elixirI18n"),
1823
+ elixirHttpServer: buildCategoryMetadata("elixirHttpServer"),
1824
+ elixirApplicationFramework: buildCategoryMetadata("elixirApplicationFramework"),
1825
+ elixirDocumentation: buildCategoryMetadata("elixirDocumentation"),
1826
+ elixirClustering: buildCategoryMetadata("elixirClustering"),
1665
1827
  elixirDeploy: buildCategoryMetadata("elixirDeploy"),
1666
1828
  elixirLibraries: buildCategoryMetadata("elixirLibraries")
1667
1829
  };
@@ -1684,6 +1846,28 @@ function normalizeOptionId(category, value) {
1684
1846
 
1685
1847
  //#endregion
1686
1848
  //#region src/compatibility.ts
1849
+ const KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES = new Set([
1850
+ "testcontainers",
1851
+ "rest-assured",
1852
+ "wiremock",
1853
+ "awaitility",
1854
+ "archunit",
1855
+ "jqwik"
1856
+ ]);
1857
+ const KOTLIN_DROPPED_JAVA_LIBRARIES = new Set(["lombok", "mapstruct"]);
1858
+ function getKotlinJavaIncompatibilityReason(stack) {
1859
+ if (stack.javaWebFramework !== "spring-boot") return "Kotlin sources are only wired for the Spring Boot scaffold";
1860
+ if (!stack.javaBuildTool || stack.javaBuildTool === "none") return "Kotlin requires Maven or Gradle";
1861
+ if (stack.javaOrm === "jooq" || stack.javaOrm === "mybatis") return "The Kotlin scaffold supports Spring Data JPA or no ORM (jOOQ/MyBatis sources are Java-only)";
1862
+ if (stack.javaApi === "grpc" || stack.javaApi === "openapi-generator") return "The Kotlin scaffold supports Spring GraphQL or no API layer (gRPC/OpenAPI codegen paths are Java-only)";
1863
+ if (stack.email === "resend") return "The Resend email integration is Java-only in the Java ecosystem scaffold";
1864
+ if (stack.search === "meilisearch") return "The Meilisearch integration is Java-only in the Java ecosystem scaffold";
1865
+ if (stack.caching === "upstash-redis") return "The Upstash Redis integration is Java-only in the Java ecosystem scaffold";
1866
+ if (stack.observability === "sentry") return "The Sentry integration is Java-only in the Java ecosystem scaffold";
1867
+ const unsupportedTestingLibrary = (stack.javaTestingLibraries ?? []).find((library) => KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES.has(library));
1868
+ if (unsupportedTestingLibrary) return `The '${unsupportedTestingLibrary}' testing library is not wired for the Kotlin scaffold`;
1869
+ return null;
1870
+ }
1687
1871
  const DEFAULT_RUNTIME = "bun";
1688
1872
  const REVENUECAT_NATIVE_FRONTENDS = new Set([
1689
1873
  "native-bare",
@@ -1698,6 +1882,8 @@ const PARAGLIDE_COMPATIBLE_FRONTENDS = new Set([
1698
1882
  "tanstack-start",
1699
1883
  "react-router",
1700
1884
  "react-vite",
1885
+ "vanilla-vite",
1886
+ "vue",
1701
1887
  "svelte",
1702
1888
  "solid",
1703
1889
  "solid-start",
@@ -2215,6 +2401,19 @@ const analyzeStackCompatibility = (stack) => {
2215
2401
  }
2216
2402
  }
2217
2403
  if (nextStack.backend !== "convex" && nextStack.backend !== "none") {
2404
+ if (nextStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend)) && [
2405
+ "trpc",
2406
+ "orpc",
2407
+ "ts-rest",
2408
+ "garph"
2409
+ ].includes(nextStack.api)) {
2410
+ nextStack.api = "graphql-yoga";
2411
+ changed = true;
2412
+ changes.push({
2413
+ category: "api",
2414
+ message: "API set to 'GraphQL Yoga' (supported by standalone Vite frontends)"
2415
+ });
2416
+ }
2218
2417
  if (nextStack.webFrontend.some((f) => [
2219
2418
  "nuxt",
2220
2419
  "svelte",
@@ -2343,6 +2542,33 @@ const analyzeStackCompatibility = (stack) => {
2343
2542
  });
2344
2543
  }
2345
2544
  }
2545
+ if (nextStack.payments === "paypal") {
2546
+ const hasWebFrontend = nextStack.webFrontend.some((f) => f !== "none");
2547
+ if (!hasWebFrontend || ["none", "convex"].includes(nextStack.backend)) {
2548
+ nextStack.payments = "none";
2549
+ changed = true;
2550
+ changes.push({
2551
+ category: "payments",
2552
+ message: hasWebFrontend ? "Payments set to 'None' (PayPal requires a standalone or fullstack backend)" : "Payments set to 'None' (PayPal requires a web frontend)"
2553
+ });
2554
+ }
2555
+ }
2556
+ if (["openai-sdk", "anthropic-sdk"].includes(nextStack.aiSdk) && ["none", "convex"].includes(nextStack.backend)) {
2557
+ nextStack.aiSdk = "none";
2558
+ changed = true;
2559
+ changes.push({
2560
+ category: "ai",
2561
+ message: "AI SDK set to 'None' (direct provider SDKs require a backend)"
2562
+ });
2563
+ }
2564
+ if (nextStack.realtime === "ws" && nextStack.backend !== "express") {
2565
+ nextStack.realtime = "none";
2566
+ changed = true;
2567
+ changes.push({
2568
+ category: "realtime",
2569
+ message: "Realtime set to 'None' (the ws integration requires Express)"
2570
+ });
2571
+ }
2346
2572
  if (nextStack.email !== "none") {
2347
2573
  if (nextStack.backend === "convex") {
2348
2574
  nextStack.email = "none";
@@ -2646,6 +2872,23 @@ const analyzeStackCompatibility = (stack) => {
2646
2872
  });
2647
2873
  }
2648
2874
  }
2875
+ const styledComponentsFrontends = new Set([
2876
+ "tanstack-router",
2877
+ "react-router",
2878
+ "react-vite",
2879
+ "tanstack-start",
2880
+ "next",
2881
+ "vinext",
2882
+ "redwood"
2883
+ ]);
2884
+ if (nextStack.cssFramework === "styled-components" && !nextStack.webFrontend.some((frontend) => styledComponentsFrontends.has(frontend))) {
2885
+ nextStack.cssFramework = "none";
2886
+ changed = true;
2887
+ changes.push({
2888
+ category: "cssFramework",
2889
+ message: "CSS framework set to 'None' (styled-components requires a React frontend)"
2890
+ });
2891
+ }
2649
2892
  if ([
2650
2893
  "shadcn-ui",
2651
2894
  "shadcn-svelte",
@@ -2748,6 +2991,26 @@ const analyzeStackCompatibility = (stack) => {
2748
2991
  message: "Tauri removed (requires compatible frontend)"
2749
2992
  });
2750
2993
  }
2994
+ for (const platform of ["electron", "capacitor"]) if (nextStack.appPlatforms.includes(platform) && !validateAddonCompatibility(platform, nextStack.webFrontend).isCompatible) {
2995
+ nextStack.appPlatforms = nextStack.appPlatforms.filter((addon) => addon !== platform);
2996
+ changed = true;
2997
+ changes.push({
2998
+ category: "appPlatforms",
2999
+ message: `${platform === "electron" ? "Electron" : "Capacitor"} removed (requires compatible frontend)`
3000
+ });
3001
+ }
3002
+ if (nextStack.appPlatforms.includes("graphql-codegen") && ![
3003
+ "garph",
3004
+ "graphql-yoga",
3005
+ "apollo-server"
3006
+ ].includes(nextStack.api) && !nextStack.webFrontend.includes("redwood")) {
3007
+ nextStack.appPlatforms = nextStack.appPlatforms.filter((platform) => platform !== "graphql-codegen");
3008
+ changed = true;
3009
+ changes.push({
3010
+ category: "appPlatforms",
3011
+ message: "GraphQL Code Generator removed (requires a GraphQL API selection)"
3012
+ });
3013
+ }
2751
3014
  if (nextStack.examples.includes("ai")) {
2752
3015
  if (nextStack.webFrontend.includes("solid") || nextStack.webFrontend.includes("solid-start")) {
2753
3016
  nextStack.examples = nextStack.examples.filter((e) => e !== "ai");
@@ -2796,7 +3059,33 @@ const analyzeStackCompatibility = (stack) => {
2796
3059
  });
2797
3060
  }
2798
3061
  }
2799
- if (nextStack.webFrontend.includes("fresh")) {
3062
+ const isFresh = nextStack.webFrontend.includes("fresh");
3063
+ const hasStandaloneViteFrontend = nextStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend));
3064
+ if (hasStandaloneViteFrontend && nextStack.forms !== "none") {
3065
+ nextStack.forms = "none";
3066
+ changed = true;
3067
+ changes.push({
3068
+ category: "forms",
3069
+ message: "Forms set to 'None' (standalone Vue and Vanilla integrations are not wired yet)"
3070
+ });
3071
+ }
3072
+ if (hasStandaloneViteFrontend && nextStack.cms !== "none" && nextStack.cms !== "contentful") {
3073
+ nextStack.cms = "none";
3074
+ changed = true;
3075
+ changes.push({
3076
+ category: "cms",
3077
+ message: "CMS set to 'None' (standalone Vue and Vanilla CMS templates are not wired yet)"
3078
+ });
3079
+ }
3080
+ if (hasStandaloneViteFrontend && nextStack.featureFlags !== "none") {
3081
+ nextStack.featureFlags = "none";
3082
+ changed = true;
3083
+ changes.push({
3084
+ category: "featureFlags",
3085
+ message: "Feature flags set to 'None' (standalone Vue and Vanilla client integrations are not wired yet)"
3086
+ });
3087
+ }
3088
+ if (isFresh) {
2800
3089
  if (nextStack.forms === "tanstack-form") {
2801
3090
  nextStack.forms = "none";
2802
3091
  changed = true;
@@ -2912,21 +3201,24 @@ const analyzeStackCompatibility = (stack) => {
2912
3201
  }
2913
3202
  }
2914
3203
  if (nextStack.javaLanguage === "kotlin") {
2915
- const kotlinUnsupportedTestingLibraries = new Set([
2916
- "testcontainers",
2917
- "rest-assured",
2918
- "wiremock",
2919
- "awaitility",
2920
- "archunit",
2921
- "jqwik"
2922
- ]);
2923
- if (!(nextStack.javaWebFramework === "spring-boot" && nextStack.javaBuildTool !== "none" && nextStack.javaOrm !== "jooq" && nextStack.javaOrm !== "mybatis" && nextStack.javaApi !== "grpc" && nextStack.javaApi !== "openapi-generator" && nextStack.email !== "resend" && nextStack.search !== "meilisearch" && nextStack.caching !== "upstash-redis" && nextStack.observability !== "sentry" && !nextStack.javaTestingLibraries.some((library) => kotlinUnsupportedTestingLibraries.has(library)))) {
3204
+ const kotlinBlocker = getKotlinJavaIncompatibilityReason(nextStack);
3205
+ if (kotlinBlocker) {
2924
3206
  nextStack.javaLanguage = "java";
2925
3207
  changed = true;
2926
3208
  changes.push({
2927
3209
  category: "javaLanguage",
2928
- message: "Java language set to 'Java' (Kotlin currently targets the Spring Boot scaffold with Spring Data JPA/none, Spring GraphQL/none, and no jOOQ/MyBatis/gRPC/OpenAPI or Java-only service integrations)"
3210
+ message: `Java language set to 'Java' (${kotlinBlocker})`
2929
3211
  });
3212
+ } else {
3213
+ const kotlinLibraries = nextStack.javaLibraries.filter((library) => !KOTLIN_DROPPED_JAVA_LIBRARIES.has(library));
3214
+ if (kotlinLibraries.length !== nextStack.javaLibraries.length) {
3215
+ nextStack.javaLibraries = kotlinLibraries;
3216
+ changed = true;
3217
+ changes.push({
3218
+ category: "javaLibraries",
3219
+ message: "Java annotation-processor libraries cleared (Lombok and MapStruct are not wired for Kotlin)"
3220
+ });
3221
+ }
2930
3222
  }
2931
3223
  }
2932
3224
  }
@@ -2947,7 +3239,9 @@ const analyzeStackCompatibility = (stack) => {
2947
3239
  "elixirAuth",
2948
3240
  "elixirApi",
2949
3241
  "elixirRealtime",
2950
- "elixirObservability"
3242
+ "elixirObservability",
3243
+ "elixirI18n",
3244
+ "elixirHttpServer"
2951
3245
  ]) {
2952
3246
  const value = nextStack[key];
2953
3247
  if (key !== "elixirObservability" ? value !== "none" : value === "phoenix-telemetry") {
@@ -3009,6 +3303,19 @@ const analyzeStackCompatibility = (stack) => {
3009
3303
  message: "Elixir auth set to 'None' (phx.gen.auth requires Ecto SQL with PostgreSQL)"
3010
3304
  });
3011
3305
  }
3306
+ const sqlBackedElixirOrms = new Set([
3307
+ "ecto-sql",
3308
+ "myxql",
3309
+ "ecto_sqlite3"
3310
+ ]);
3311
+ if (nextStack.elixirAuth === "pow" && !sqlBackedElixirOrms.has(nextStack.elixirOrm)) {
3312
+ nextStack.elixirAuth = "none";
3313
+ changed = true;
3314
+ changes.push({
3315
+ category: "elixirAuth",
3316
+ message: "Elixir auth set to 'None' (Pow requires an Ecto SQL repository)"
3317
+ });
3318
+ }
3012
3319
  }
3013
3320
  if (nextStack.webDeploy !== "none" && !nextStack.webFrontend.some((f) => f !== "none")) {
3014
3321
  nextStack.webDeploy = "none";
@@ -3018,6 +3325,16 @@ const analyzeStackCompatibility = (stack) => {
3018
3325
  message: "Web deploy set to 'None' (no web frontend)"
3019
3326
  });
3020
3327
  }
3328
+ const unsupportedWebDeployFrontend = getUnsupportedWebDeployFrontend(nextStack.webDeploy, nextStack.webFrontend);
3329
+ if (nextStack.webDeploy !== "none" && unsupportedWebDeployFrontend) {
3330
+ const webDeploy = nextStack.webDeploy;
3331
+ nextStack.webDeploy = "none";
3332
+ changed = true;
3333
+ changes.push({
3334
+ category: "webDeploy",
3335
+ message: `Web deploy set to 'None' ('${webDeploy}' is not wired for the '${unsupportedWebDeployFrontend}' frontend)`
3336
+ });
3337
+ }
3021
3338
  if (nextStack.serverDeploy === "cloudflare") {
3022
3339
  if (nextStack.runtime !== "workers" || nextStack.backend !== "hono") {
3023
3340
  nextStack.serverDeploy = "none";
@@ -3069,6 +3386,16 @@ const analyzeStackCompatibility = (stack) => {
3069
3386
  * - Follow CLI behavior: filter options based on UPSTREAM selections only
3070
3387
  */
3071
3388
  const getDisabledReason = (currentStack, category, optionId) => {
3389
+ const hasStandaloneViteFrontend = currentStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend));
3390
+ if (category === "api" && hasStandaloneViteFrontend && [
3391
+ "trpc",
3392
+ "orpc",
3393
+ "ts-rest",
3394
+ "garph"
3395
+ ].includes(optionId)) return "Standalone Vite frontends support only GraphQL and OpenAPI API integrations";
3396
+ if (category === "forms" && hasStandaloneViteFrontend && optionId !== "none") return "Form library integrations are not yet wired for standalone Vue or Vanilla Vite";
3397
+ if (category === "cms" && hasStandaloneViteFrontend && optionId !== "none" && optionId !== "contentful") return "CMS integrations other than Contentful are not yet wired for standalone Vue or Vanilla Vite";
3398
+ if (category === "featureFlags" && hasStandaloneViteFrontend && optionId !== "none") return "Feature flag client integrations are not yet wired for standalone Vue or Vanilla Vite";
3072
3399
  if (currentStack.backend === "convex") {
3073
3400
  if (category === "runtime" && optionId !== "none") return "Convex provides its own runtime";
3074
3401
  if (category === "database" && optionId !== "none") return "Convex provides its own database";
@@ -3132,6 +3459,31 @@ const getDisabledReason = (currentStack, category, optionId) => {
3132
3459
  if (category === "backendLibraries" && optionId !== "effect-full") return "Effect backend requires Effect Platform + SQL services";
3133
3460
  if (category === "validation" && optionId !== "effect-schema") return "Effect backend requires Effect Schema validation";
3134
3461
  }
3462
+ if (category === "javaLanguage" && optionId === "kotlin" && currentStack.ecosystem === "java") {
3463
+ const kotlinBlocker = getKotlinJavaIncompatibilityReason(currentStack);
3464
+ if (kotlinBlocker) return kotlinBlocker;
3465
+ }
3466
+ if (currentStack.ecosystem === "java" && currentStack.javaLanguage === "kotlin") {
3467
+ if (category === "javaWebFramework" && optionId !== "spring-boot") return "Kotlin sources are only wired for the Spring Boot scaffold";
3468
+ if (category === "javaBuildTool" && optionId === "none") return "Kotlin requires Maven or Gradle";
3469
+ if (category === "javaOrm" && (optionId === "jooq" || optionId === "mybatis")) return "The Kotlin scaffold supports Spring Data JPA or no ORM (jOOQ/MyBatis sources are Java-only)";
3470
+ if (category === "javaApi" && (optionId === "grpc" || optionId === "openapi-generator")) return "The Kotlin scaffold supports Spring GraphQL or no API layer (gRPC/OpenAPI codegen paths are Java-only)";
3471
+ if (category === "javaLibraries" && KOTLIN_DROPPED_JAVA_LIBRARIES.has(optionId)) return "Java annotation-processor tooling is not wired for Kotlin (data classes replace Lombok; MapStruct would need kapt)";
3472
+ if (category === "javaTestingLibraries" && KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES.has(optionId)) return `The '${optionId}' testing library is not wired for the Kotlin scaffold`;
3473
+ if (category === "email" && optionId === "resend") return "The Resend email integration is Java-only in the Java ecosystem scaffold";
3474
+ if (category === "search" && optionId === "meilisearch") return "The Meilisearch integration is Java-only in the Java ecosystem scaffold";
3475
+ if (category === "caching" && optionId === "upstash-redis") return "The Upstash Redis integration is Java-only in the Java ecosystem scaffold";
3476
+ if (category === "observability" && optionId === "sentry") return "The Sentry integration is Java-only in the Java ecosystem scaffold";
3477
+ }
3478
+ if (currentStack.ecosystem === "rust") {
3479
+ const filterOnlyFramework = currentStack.rustWebFramework === "warp" || currentStack.rustWebFramework === "salvo";
3480
+ if (category === "rustApi" && filterOnlyFramework && optionId !== "none" && optionId !== "jsonrpsee") return "Warp and Salvo currently support REST or the standalone jsonrpsee server";
3481
+ if (category === "rustWebFramework" && (optionId === "warp" || optionId === "salvo") && currentStack.rustApi !== "none" && currentStack.rustApi !== "jsonrpsee") return "Warp and Salvo currently support REST or the standalone jsonrpsee server";
3482
+ if (category === "rustApi" && currentStack.rustWebFramework === "loco" && optionId === "jsonrpsee") return "Loco owns the server boot sequence; jsonrpsee is available with the other Rust frameworks";
3483
+ if (category === "rustWebFramework" && optionId === "loco" && currentStack.rustApi === "jsonrpsee") return "Loco owns the server boot sequence and cannot start the generated jsonrpsee server";
3484
+ if (category === "rustAuth" && optionId === "tower-sessions" && currentStack.rustWebFramework !== "axum") return "The generated tower-sessions middleware is wired specifically for Axum";
3485
+ if (category === "rustWebFramework" && optionId !== "axum" && currentStack.rustAuth === "tower-sessions") return "tower-sessions requires the generated Axum middleware stack";
3486
+ }
3135
3487
  const graphDisabledReason = category === "payments" && optionId === "revenuecat" || category === "i18n" && optionId === "intlayer" ? {
3136
3488
  handled: false,
3137
3489
  authoritative: false,
@@ -3310,12 +3662,17 @@ const getDisabledReason = (currentStack, category, optionId) => {
3310
3662
  if (category === "payments" && optionId === "revenuecat") {
3311
3663
  if (!hasRevenueCatCompatibleNativeFrontend(currentStack.nativeFrontend)) return "RevenueCat payments requires a native frontend (native-bare, native-uniwind, or native-unistyles)";
3312
3664
  }
3665
+ if (category === "payments" && optionId === "paypal") {
3666
+ if (!currentStack.webFrontend.some((f) => f !== "none")) return "PayPal requires a web frontend";
3667
+ if (["none", "convex"].includes(currentStack.backend)) return "PayPal checkout requires a standalone or fullstack backend";
3668
+ }
3313
3669
  if (category === "cms" && optionId === "payload") {
3314
3670
  if (!currentStack.webFrontend.includes("next")) return "Payload CMS v3 requires Next.js";
3315
3671
  }
3316
3672
  if (category === "cms" && optionId === "keystatic") {
3317
3673
  if (!currentStack.webFrontend.includes("next")) return "Keystatic is currently scaffolded for Next.js only because @keystatic/astro is not Astro 7-compatible yet.";
3318
3674
  }
3675
+ if (category === "realtime" && optionId === "ws" && currentStack.backend !== "express") return "The ws integration is currently wired for the Express backend";
3319
3676
  if (category === "email" && optionId !== "none") {
3320
3677
  if (currentStack.ecosystem !== "typescript") return null;
3321
3678
  if (currentStack.backend === "convex") return "Email integration is not available with Convex backend";
@@ -3341,6 +3698,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
3341
3698
  if (currentStack.ecosystem !== "typescript") return "Vector database is only available for the TypeScript ecosystem";
3342
3699
  }
3343
3700
  if (category === "ai" && requiresChatSdkVercelAI(currentStack) && optionId !== "vercel-ai") return "Chat SDK example (Nuxt/Hono profile) requires Vercel AI SDK in v1";
3701
+ if (category === "ai" && ["openai-sdk", "anthropic-sdk"].includes(optionId) && ["none", "convex"].includes(currentStack.backend)) return "Direct AI provider SDKs require a standalone or fullstack backend";
3344
3702
  if (category === "ai" && optionId === "tanstack-ai") {
3345
3703
  const compatibleFrontends = [
3346
3704
  "tanstack-router",
@@ -3362,11 +3720,32 @@ const getDisabledReason = (currentStack, category, optionId) => {
3362
3720
  "tanstack-db",
3363
3721
  "tanstack-pacer"
3364
3722
  ].includes(optionId) && currentStack.webFrontend.length === 1 && currentStack.webFrontend[0] === "astro" && (!currentStack.astroIntegration || currentStack.astroIntegration === "none")) return "TanStack libraries with Astro require a UI framework integration (React, Vue, Svelte, or Solid)";
3723
+ if (optionId === "graphql-codegen" && ![
3724
+ "garph",
3725
+ "graphql-yoga",
3726
+ "apollo-server"
3727
+ ].includes(currentStack.api) && !currentStack.webFrontend.includes("redwood")) return "GraphQL Code Generator requires a GraphQL API selection";
3728
+ if (optionId === "openapi-typescript" && currentStack.api !== "openapi") return "openapi-typescript requires the OpenAPI API selection";
3729
+ if (optionId === "openapi-typescript" && currentStack.backend === "self") return "openapi-typescript requires a standalone backend that exposes an OpenAPI schema";
3730
+ if (optionId === "apollo-client" && ![
3731
+ "garph",
3732
+ "graphql-yoga",
3733
+ "apollo-server"
3734
+ ].includes(currentStack.api)) return "Apollo Client requires a GraphQL API selection";
3365
3735
  }
3366
3736
  if (category === "cssFramework") {
3367
3737
  if (!currentStack.webFrontend.some((f) => f !== "none")) {
3368
3738
  if (optionId !== "none") return "CSS framework requires a web frontend";
3369
3739
  }
3740
+ if (optionId === "styled-components" && !currentStack.webFrontend.some((f) => [
3741
+ "tanstack-router",
3742
+ "react-router",
3743
+ "react-vite",
3744
+ "tanstack-start",
3745
+ "next",
3746
+ "vinext",
3747
+ "redwood"
3748
+ ].includes(f))) return "styled-components requires a React frontend";
3370
3749
  if ([
3371
3750
  "shadcn-ui",
3372
3751
  "shadcn-svelte",
@@ -3502,6 +3881,16 @@ const getDisabledReason = (currentStack, category, optionId) => {
3502
3881
  if (category === "pythonApi") {
3503
3882
  if (optionId !== "none" && currentStack.pythonWebFramework !== "django") return "Python API frameworks currently require Django";
3504
3883
  }
3884
+ if (category === "goMigrations" && optionId !== "none" && currentStack.ecosystem === "go" && ![
3885
+ "sqlite",
3886
+ "postgres",
3887
+ "mysql"
3888
+ ].includes(currentStack.database)) return "Go migrations require SQLite, PostgreSQL, or MySQL";
3889
+ if (category === "database" && currentStack.ecosystem === "go" && currentStack.goMigrations !== "none" && ![
3890
+ "sqlite",
3891
+ "postgres",
3892
+ "mysql"
3893
+ ].includes(optionId)) return "The selected Go migration tool requires SQLite, PostgreSQL, or MySQL";
3505
3894
  if (category === "javaWebFramework") {
3506
3895
  if (optionId !== "none" && currentStack.javaBuildTool === "none") return "Java web frameworks require Maven or Gradle";
3507
3896
  }
@@ -3552,11 +3941,30 @@ const getDisabledReason = (currentStack, category, optionId) => {
3552
3941
  "elixirObservability",
3553
3942
  "elixirTesting",
3554
3943
  "elixirQuality",
3944
+ "elixirI18n",
3945
+ "elixirHttpServer",
3946
+ "elixirApplicationFramework",
3947
+ "elixirDocumentation",
3948
+ "elixirClustering",
3555
3949
  "elixirDeploy"
3556
3950
  ]).has(category) && optionId !== "none") {
3557
3951
  if (currentStack.ecosystem !== "elixir") return "Elixir options only apply when the Elixir ecosystem is selected";
3558
3952
  }
3559
3953
  if (category === "elixirTesting" && optionId === "wallaby" && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework === "none") return "Wallaby browser tests require Phoenix";
3954
+ if (category === "elixirTesting" && optionId === "ex_machina" && currentStack.ecosystem === "elixir" && ![
3955
+ "ecto-sql",
3956
+ "myxql",
3957
+ "ecto_sqlite3"
3958
+ ].includes(currentStack.elixirOrm)) return "ExMachina requires an Ecto SQL repository";
3959
+ if (category === "elixirAuth" && optionId === "pow" && currentStack.ecosystem === "elixir" && (currentStack.elixirWebFramework === "none" || ![
3960
+ "ecto-sql",
3961
+ "myxql",
3962
+ "ecto_sqlite3"
3963
+ ].includes(currentStack.elixirOrm))) return "Pow requires Phoenix and an Ecto SQL repository";
3964
+ if ((category === "elixirApi" && optionId === "open_api_spex" || category === "elixirI18n" && optionId === "gettext") && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework === "none") return `${getCategoryDisplayName(category)} requires Phoenix`;
3965
+ if (category === "elixirHttpServer" && currentStack.ecosystem === "elixir" && (optionId === "none" && currentStack.elixirWebFramework !== "none" || optionId !== "none" && currentStack.elixirWebFramework === "none")) return currentStack.elixirWebFramework === "none" ? "HTTP server adapters require Phoenix" : "Phoenix requires Bandit or Cowboy";
3966
+ if (category === "elixirJobs" && optionId === "oban" && currentStack.ecosystem === "elixir" && currentStack.elixirOrm !== "ecto-sql") return "Oban requires the PostgreSQL Ecto SQL option";
3967
+ if (category === "elixirOrm" && ["myxql", "ecto_sqlite3"].includes(optionId) && currentStack.ecosystem === "elixir" && currentStack.elixirJobs === "oban") return "Oban requires PostgreSQL-backed Ecto SQL";
3560
3968
  if (category === "elixirWebFramework" && optionId !== "none" && currentStack.ecosystem !== "elixir") return "Elixir web frameworks are available only in the Elixir ecosystem";
3561
3969
  if (category === "elixirJson" && optionId === "none" && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework !== "none") return "Phoenix JSON scaffolds require Jason";
3562
3970
  return null;
@@ -3601,6 +4009,11 @@ const ELIXIR_GRAPH_DISABLED_REASON_ROLES = {
3601
4009
  elixirObservability: "observability",
3602
4010
  elixirTesting: "testing",
3603
4011
  elixirQuality: "codeQuality",
4012
+ elixirI18n: "i18n",
4013
+ elixirHttpServer: "runtime",
4014
+ elixirApplicationFramework: "libraries",
4015
+ elixirDocumentation: "documentation",
4016
+ elixirClustering: "config",
3604
4017
  elixirDeploy: "deploy"
3605
4018
  };
3606
4019
  function getElixirGraphBinding(currentStack, category) {
@@ -3989,6 +4402,54 @@ const GRAPH_DISABLED_REASON_BINDINGS = {
3989
4402
  authoritative: true,
3990
4403
  candidateIdPrefix: "candidate:native"
3991
4404
  },
4405
+ goValidation: {
4406
+ role: "validation",
4407
+ ecosystem: "go",
4408
+ ownerRole: "backend",
4409
+ ownerEcosystem: "go",
4410
+ currentEcosystem: "go",
4411
+ authoritative: true
4412
+ },
4413
+ goQuality: {
4414
+ role: "codeQuality",
4415
+ ecosystem: "go",
4416
+ ownerRole: "backend",
4417
+ ownerEcosystem: "go",
4418
+ currentEcosystem: "go",
4419
+ authoritative: true
4420
+ },
4421
+ goMigrations: {
4422
+ role: "migrations",
4423
+ ecosystem: "go",
4424
+ ownerRole: "backend",
4425
+ ownerEcosystem: "go",
4426
+ currentEcosystem: "go",
4427
+ authoritative: true
4428
+ },
4429
+ goTemplating: {
4430
+ role: "templating",
4431
+ ecosystem: "go",
4432
+ ownerRole: "backend",
4433
+ ownerEcosystem: "go",
4434
+ currentEcosystem: "go",
4435
+ authoritative: true
4436
+ },
4437
+ goProtoTooling: {
4438
+ role: "buildTool",
4439
+ ecosystem: "go",
4440
+ ownerRole: "backend",
4441
+ ownerEcosystem: "go",
4442
+ currentEcosystem: "go",
4443
+ authoritative: true
4444
+ },
4445
+ goDI: {
4446
+ role: "libraries",
4447
+ ecosystem: "go",
4448
+ ownerRole: "backend",
4449
+ ownerEcosystem: "go",
4450
+ currentEcosystem: "go",
4451
+ authoritative: true
4452
+ },
3992
4453
  dotnetOrm: {
3993
4454
  role: "orm",
3994
4455
  ecosystem: "dotnet",
@@ -4124,6 +4585,8 @@ const WEB_FRAMEWORKS = [
4124
4585
  "tanstack-router",
4125
4586
  "react-router",
4126
4587
  "react-vite",
4588
+ "vanilla-vite",
4589
+ "vue",
4127
4590
  "tanstack-start",
4128
4591
  "next",
4129
4592
  "vinext",
@@ -4138,11 +4601,32 @@ const WEB_FRAMEWORKS = [
4138
4601
  "fresh",
4139
4602
  "none"
4140
4603
  ];
4604
+ const CODEGEN_COMPATIBLE_FRONTENDS = [
4605
+ "tanstack-router",
4606
+ "react-router",
4607
+ "react-vite",
4608
+ "vanilla-vite",
4609
+ "vue",
4610
+ "tanstack-start",
4611
+ "next",
4612
+ "vinext",
4613
+ "nuxt",
4614
+ "svelte",
4615
+ "solid",
4616
+ "solid-start",
4617
+ "astro",
4618
+ "qwik",
4619
+ "angular",
4620
+ "redwood",
4621
+ "fresh"
4622
+ ];
4141
4623
  const ADDON_COMPATIBILITY = {
4142
4624
  pwa: [
4143
4625
  "tanstack-router",
4144
4626
  "react-router",
4145
4627
  "react-vite",
4628
+ "vanilla-vite",
4629
+ "vue",
4146
4630
  "solid",
4147
4631
  "next",
4148
4632
  "vinext",
@@ -4156,6 +4640,8 @@ const ADDON_COMPATIBILITY = {
4156
4640
  "tanstack-router",
4157
4641
  "react-router",
4158
4642
  "react-vite",
4643
+ "vanilla-vite",
4644
+ "vue",
4159
4645
  "nuxt",
4160
4646
  "svelte",
4161
4647
  "solid",
@@ -4166,7 +4652,23 @@ const ADDON_COMPATIBILITY = {
4166
4652
  "redwood",
4167
4653
  "fresh"
4168
4654
  ],
4655
+ electron: [
4656
+ "tanstack-router",
4657
+ "react-vite",
4658
+ "vanilla-vite",
4659
+ "vue",
4660
+ "solid"
4661
+ ],
4662
+ capacitor: [
4663
+ "tanstack-router",
4664
+ "react-vite",
4665
+ "vanilla-vite",
4666
+ "vue",
4667
+ "solid"
4668
+ ],
4169
4669
  biome: [],
4670
+ eslint: [],
4671
+ prettier: [],
4170
4672
  husky: [],
4171
4673
  lefthook: [],
4172
4674
  turborepo: [],
@@ -4190,6 +4692,55 @@ const ADDON_COMPATIBILITY = {
4190
4692
  "svelte",
4191
4693
  "solid"
4192
4694
  ],
4695
+ axios: [
4696
+ "tanstack-router",
4697
+ "react-router",
4698
+ "react-vite",
4699
+ "vanilla-vite",
4700
+ "vue",
4701
+ "tanstack-start",
4702
+ "next",
4703
+ "vinext",
4704
+ "nuxt",
4705
+ "svelte",
4706
+ "solid",
4707
+ "solid-start",
4708
+ "astro",
4709
+ "qwik",
4710
+ "angular"
4711
+ ],
4712
+ firebase: [
4713
+ "tanstack-router",
4714
+ "react-router",
4715
+ "react-vite",
4716
+ "vanilla-vite",
4717
+ "vue",
4718
+ "tanstack-start",
4719
+ "next",
4720
+ "vinext",
4721
+ "nuxt",
4722
+ "svelte",
4723
+ "solid",
4724
+ "solid-start",
4725
+ "astro",
4726
+ "qwik",
4727
+ "angular"
4728
+ ],
4729
+ "graphql-codegen": CODEGEN_COMPATIBLE_FRONTENDS,
4730
+ "openapi-typescript": CODEGEN_COMPATIBLE_FRONTENDS,
4731
+ "apollo-client": [
4732
+ "tanstack-router",
4733
+ "react-router",
4734
+ "react-vite",
4735
+ "vue",
4736
+ "tanstack-start",
4737
+ "next",
4738
+ "vinext",
4739
+ "nuxt",
4740
+ "svelte",
4741
+ "solid",
4742
+ "solid-start"
4743
+ ],
4193
4744
  swr: [
4194
4745
  "tanstack-router",
4195
4746
  "react-router",
@@ -4293,6 +4844,7 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
4293
4844
  const includesAngular = frontends.includes("angular");
4294
4845
  const includesRedwood = frontends.includes("redwood");
4295
4846
  const includesFresh = frontends.includes("fresh");
4847
+ const includesStandaloneVite = frontends.includes("vanilla-vite") || frontends.includes("vue");
4296
4848
  const includesNative = frontends.some((frontend) => [
4297
4849
  "native-bare",
4298
4850
  "native-uniwind",
@@ -4315,6 +4867,12 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
4315
4867
  "garph",
4316
4868
  "none"
4317
4869
  ];
4870
+ if (includesStandaloneVite) return [
4871
+ "graphql-yoga",
4872
+ "apollo-server",
4873
+ "openapi",
4874
+ "none"
4875
+ ];
4318
4876
  if (includesQwik || includesAngular || includesRedwood || includesFresh) return ["graphql-yoga", "none"];
4319
4877
  const includesSolidStartApi = frontends.includes("solid-start");
4320
4878
  if (includesNuxt || includesSvelte || includesSolid || includesSolidStartApi) return [
@@ -4349,7 +4907,23 @@ function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration)
4349
4907
  const includesRedwood = frontends.includes("redwood");
4350
4908
  const includesFresh = frontends.includes("fresh");
4351
4909
  const includesSolidStart = frontends.includes("solid-start");
4910
+ const includesStandaloneVite = frontends.includes("vanilla-vite") || frontends.includes("vue");
4352
4911
  const isReactOnlyApi = api === "trpc" || api === "ts-rest" || api === "garph" || api === "apollo-server";
4912
+ if (includesStandaloneVite && (api === "trpc" || api === "orpc" || api === "ts-rest" || api === "garph")) return {
4913
+ code: "STANDALONE_VITE_API_UNSUPPORTED",
4914
+ message: "Standalone Vite frontends support only GraphQL and OpenAPI API integrations.",
4915
+ category: "api",
4916
+ optionId: api,
4917
+ provided: {
4918
+ api,
4919
+ frontend: frontends.includes("vanilla-vite") ? "vanilla-vite" : "vue"
4920
+ },
4921
+ suggestions: [
4922
+ "Use --api graphql-yoga, --api apollo-server, or --api openapi",
4923
+ "Choose a React-based frontend for tRPC, oRPC, ts-rest, or garph",
4924
+ "Use --api none"
4925
+ ]
4926
+ };
4353
4927
  if ((includesNuxt || includesSvelte || includesSolid || includesSolidStart) && isReactOnlyApi) {
4354
4928
  const incompatibleFrontend = includesNuxt ? "nuxt" : includesSvelte ? "svelte" : includesSolid ? "solid" : "solid-start";
4355
4929
  return {
@@ -4517,21 +5091,33 @@ function getCompatibleUILibraries(frontends = [], astroIntegration) {
4517
5091
  return compatibility.frontends.includes(webFrontend);
4518
5092
  });
4519
5093
  }
4520
- function getCompatibleCSSFrameworks(uiLibrary) {
4521
- if (!uiLibrary || uiLibrary === "none") return [
5094
+ function getCompatibleCSSFrameworks(uiLibrary, frontends = []) {
5095
+ const frameworks = !uiLibrary || uiLibrary === "none" ? [
4522
5096
  "tailwind",
4523
5097
  "scss",
4524
5098
  "less",
4525
5099
  "postcss-only",
5100
+ "styled-components",
4526
5101
  "none"
5102
+ ] : [...UI_LIBRARY_COMPATIBILITY[uiLibrary].cssFrameworks];
5103
+ if (frontends.length === 0) return frameworks;
5104
+ const reactFrontends = [
5105
+ "tanstack-router",
5106
+ "react-router",
5107
+ "react-vite",
5108
+ "tanstack-start",
5109
+ "next",
5110
+ "vinext",
5111
+ "redwood"
4527
5112
  ];
4528
- return UI_LIBRARY_COMPATIBILITY[uiLibrary].cssFrameworks;
5113
+ return frontends.some((frontend) => reactFrontends.includes(frontend)) ? frameworks : frameworks.filter((framework) => framework !== "styled-components");
4529
5114
  }
4530
5115
  function hasWebStyling(frontends = []) {
4531
5116
  const { web } = splitFrontends(frontends);
4532
5117
  return web.length > 0;
4533
5118
  }
4534
5119
  function getCompatibleFormLibraries(frontends = []) {
5120
+ if (frontends.some((frontend) => ["vanilla-vite", "vue"].includes(frontend))) return ["none"];
4535
5121
  const hasSolid = frontends.includes("solid");
4536
5122
  const hasSolidStart = frontends.includes("solid-start");
4537
5123
  const hasQwik = frontends.includes("qwik");
@@ -4567,6 +5153,8 @@ function evaluateCompatibility(input) {
4567
5153
  ["forms", input.forms],
4568
5154
  ["stateManagement", input.stateManagement],
4569
5155
  ["animation", input.animation],
5156
+ ["cms", input.cms],
5157
+ ["featureFlags", input.featureFlags],
4570
5158
  ["pythonApi", input.pythonApi],
4571
5159
  ["javaWebFramework", input.javaWebFramework],
4572
5160
  ["javaBuildTool", input.javaBuildTool],
@@ -4594,6 +5182,11 @@ function evaluateCompatibility(input) {
4594
5182
  ["elixirObservability", input.elixirObservability],
4595
5183
  ["elixirTesting", input.elixirTesting],
4596
5184
  ["elixirQuality", input.elixirQuality],
5185
+ ["elixirI18n", input.elixirI18n],
5186
+ ["elixirHttpServer", input.elixirHttpServer],
5187
+ ["elixirApplicationFramework", input.elixirApplicationFramework],
5188
+ ["elixirDocumentation", input.elixirDocumentation],
5189
+ ["elixirClustering", input.elixirClustering],
4597
5190
  ["elixirDeploy", input.elixirDeploy]
4598
5191
  ];
4599
5192
  for (const [category, optionId] of scalarChecks) {
@@ -4788,6 +5381,12 @@ const DEFAULT_STACK_SELECTION = {
4788
5381
  goCaching: "none",
4789
5382
  goConfig: "none",
4790
5383
  goObservability: "none",
5384
+ goValidation: "none",
5385
+ goQuality: "none",
5386
+ goMigrations: "none",
5387
+ goTemplating: "none",
5388
+ goProtoTooling: "none",
5389
+ goDI: "none",
4791
5390
  javaLanguage: "java",
4792
5391
  javaWebFramework: "spring-boot",
4793
5392
  javaBuildTool: "maven",
@@ -4822,6 +5421,11 @@ const DEFAULT_STACK_SELECTION = {
4822
5421
  elixirObservability: "telemetry",
4823
5422
  elixirTesting: "ex_unit",
4824
5423
  elixirQuality: "credo",
5424
+ elixirI18n: "none",
5425
+ elixirHttpServer: "cowboy",
5426
+ elixirApplicationFramework: "none",
5427
+ elixirDocumentation: "none",
5428
+ elixirClustering: "none",
4825
5429
  elixirDeploy: "none",
4826
5430
  elixirLibraries: []
4827
5431
  };
@@ -4934,6 +5538,12 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
4934
5538
  goCaching: "goCaching",
4935
5539
  goConfig: "goConfig",
4936
5540
  goObservability: "goObservability",
5541
+ goValidation: "goValidation",
5542
+ goQuality: "goQuality",
5543
+ goMigrations: "goMigrations",
5544
+ goTemplating: "goTemplating",
5545
+ goProtoTooling: "goProtoTooling",
5546
+ goDI: "goDI",
4937
5547
  javaLanguage: "javaLanguage",
4938
5548
  javaWebFramework: "javaWebFramework",
4939
5549
  javaBuildTool: "javaBuildTool",
@@ -4968,6 +5578,11 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
4968
5578
  elixirObservability: "elixirObservability",
4969
5579
  elixirTesting: "elixirTesting",
4970
5580
  elixirQuality: "elixirQuality",
5581
+ elixirI18n: "elixirI18n",
5582
+ elixirHttpServer: "elixirHttpServer",
5583
+ elixirApplicationFramework: "elixirApplicationFramework",
5584
+ elixirDocumentation: "elixirDocumentation",
5585
+ elixirClustering: "elixirClustering",
4971
5586
  elixirDeploy: "elixirDeploy",
4972
5587
  elixirLibraries: "elixirLibraries"
4973
5588
  };
@@ -5094,6 +5709,12 @@ const STACK_SELECTION_URL_KEYS = {
5094
5709
  goCaching: "gcache",
5095
5710
  goConfig: "gcfg",
5096
5711
  goObservability: "gobs",
5712
+ goValidation: "gval",
5713
+ goQuality: "gqual",
5714
+ goMigrations: "gmig",
5715
+ goTemplating: "gtpl",
5716
+ goProtoTooling: "gproto",
5717
+ goDI: "gdi",
5097
5718
  javaLanguage: "jlang",
5098
5719
  javaWebFramework: "jwf",
5099
5720
  javaBuildTool: "jbt",
@@ -5128,6 +5749,11 @@ const STACK_SELECTION_URL_KEYS = {
5128
5749
  elixirObservability: "eobs",
5129
5750
  elixirTesting: "etest",
5130
5751
  elixirQuality: "eq",
5752
+ elixirI18n: "ei18n",
5753
+ elixirHttpServer: "ehs",
5754
+ elixirApplicationFramework: "eaf",
5755
+ elixirDocumentation: "edoc",
5756
+ elixirClustering: "ecluster",
5131
5757
  elixirDeploy: "edeploy",
5132
5758
  elixirLibraries: "elib"
5133
5759
  };
@@ -5320,6 +5946,12 @@ const CLI_SCALAR_CONFIG_FIELDS = [
5320
5946
  ["goCaching", "goCaching"],
5321
5947
  ["goConfig", "goConfig"],
5322
5948
  ["goObservability", "goObservability"],
5949
+ ["goValidation", "goValidation"],
5950
+ ["goQuality", "goQuality"],
5951
+ ["goMigrations", "goMigrations"],
5952
+ ["goTemplating", "goTemplating"],
5953
+ ["goProtoTooling", "goProtoTooling"],
5954
+ ["goDI", "goDI"],
5323
5955
  ["javaLanguage", "javaLanguage"],
5324
5956
  ["javaWebFramework", "javaWebFramework"],
5325
5957
  ["javaBuildTool", "javaBuildTool"],
@@ -5350,6 +5982,11 @@ const CLI_SCALAR_CONFIG_FIELDS = [
5350
5982
  ["elixirObservability", "elixirObservability"],
5351
5983
  ["elixirTesting", "elixirTesting"],
5352
5984
  ["elixirQuality", "elixirQuality"],
5985
+ ["elixirI18n", "elixirI18n"],
5986
+ ["elixirHttpServer", "elixirHttpServer"],
5987
+ ["elixirApplicationFramework", "elixirApplicationFramework"],
5988
+ ["elixirDocumentation", "elixirDocumentation"],
5989
+ ["elixirClustering", "elixirClustering"],
5353
5990
  ["elixirDeploy", "elixirDeploy"]
5354
5991
  ];
5355
5992
  const CLI_NON_EMPTY_ARRAY_CONFIG_FIELDS = [
@@ -5429,7 +6066,13 @@ const GO_CONFIG_KEYS = [
5429
6066
  "goMessageQueue",
5430
6067
  "goCaching",
5431
6068
  "goConfig",
5432
- "goObservability"
6069
+ "goObservability",
6070
+ "goValidation",
6071
+ "goQuality",
6072
+ "goMigrations",
6073
+ "goTemplating",
6074
+ "goProtoTooling",
6075
+ "goDI"
5433
6076
  ];
5434
6077
  const JAVA_CONFIG_KEYS = [
5435
6078
  "javaLanguage",
@@ -5470,6 +6113,11 @@ const ELIXIR_CONFIG_KEYS = [
5470
6113
  "elixirObservability",
5471
6114
  "elixirTesting",
5472
6115
  "elixirQuality",
6116
+ "elixirI18n",
6117
+ "elixirHttpServer",
6118
+ "elixirApplicationFramework",
6119
+ "elixirDocumentation",
6120
+ "elixirClustering",
5473
6121
  "elixirDeploy",
5474
6122
  "elixirLibraries"
5475
6123
  ];
@@ -5482,35 +6130,6 @@ const REACT_NATIVE_CONFIG_KEYS = [
5482
6130
  "mobileOTA",
5483
6131
  "mobileDeepLinking"
5484
6132
  ];
5485
- const COMMAND_ADDONS = new Set([
5486
- "pwa",
5487
- "tauri",
5488
- "starlight",
5489
- "biome",
5490
- "lefthook",
5491
- "husky",
5492
- "turborepo",
5493
- "nx",
5494
- "docker-compose",
5495
- "devcontainer",
5496
- "github-actions",
5497
- "ultracite",
5498
- "fumadocs",
5499
- "oxlint",
5500
- "ruler",
5501
- "opentui",
5502
- "mcp",
5503
- "skills",
5504
- "wxt",
5505
- "msw",
5506
- "storybook",
5507
- "swr",
5508
- "tanstack-query",
5509
- "tanstack-table",
5510
- "tanstack-virtual",
5511
- "tanstack-db",
5512
- "tanstack-pacer"
5513
- ]);
5514
6133
  function withoutNone(values) {
5515
6134
  return values.filter((value) => value !== "none");
5516
6135
  }
@@ -5532,7 +6151,7 @@ function formatTypeScriptAddonsFlag(selection) {
5532
6151
  ...selection.appPlatforms
5533
6152
  ];
5534
6153
  if (addons.length === 0) return "--addons none";
5535
- return `--addons ${addons.filter((addon) => COMMAND_ADDONS.has(addon)).join(" ") || "none"}`;
6154
+ return `--addons ${toUniqueNonNoneArray(addons).join(" ") || "none"}`;
5536
6155
  }
5537
6156
  const GRAPH_TYPESCRIPT_FRONTEND_FLAG_KEYS = [["validation", "validation"], ["testing", "testing"]];
5538
6157
  const GRAPH_SHADCN_FLAG_KEYS = [
@@ -5605,6 +6224,11 @@ const GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS = [
5605
6224
  ["elixirObservability", "observability"],
5606
6225
  ["elixirTesting", "testing"],
5607
6226
  ["elixirQuality", "codeQuality"],
6227
+ ["elixirI18n", "i18n"],
6228
+ ["elixirHttpServer", "runtime"],
6229
+ ["elixirApplicationFramework", "libraries"],
6230
+ ["elixirDocumentation", "documentation"],
6231
+ ["elixirClustering", "config"],
5608
6232
  ["elixirDeploy", "deploy"]
5609
6233
  ];
5610
6234
  const GRAPH_DATABASE_PART_SELECTION_KEYS = [["dbSetup", "dbSetup"]];
@@ -5638,6 +6262,12 @@ const GRAPH_PYTHON_BACKEND_ARRAY_PART_SELECTION_KEYS = [["pythonAi", "ai"]];
5638
6262
  const GRAPH_GO_BACKEND_PART_SELECTION_KEYS = [
5639
6263
  ["goCli", "cli"],
5640
6264
  ["goLogging", "logging"],
6265
+ ["goValidation", "validation"],
6266
+ ["goQuality", "codeQuality"],
6267
+ ["goMigrations", "migrations"],
6268
+ ["goTemplating", "templating"],
6269
+ ["goProtoTooling", "buildTool"],
6270
+ ["goDI", "libraries"],
5641
6271
  ["caching", "caching"],
5642
6272
  ["search", "search"]
5643
6273
  ];
@@ -5697,6 +6327,11 @@ const GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS = [
5697
6327
  ["elixirObservability", "observability"],
5698
6328
  ["elixirTesting", "testing"],
5699
6329
  ["elixirQuality", "codeQuality"],
6330
+ ["elixirI18n", "i18n"],
6331
+ ["elixirHttpServer", "runtime"],
6332
+ ["elixirApplicationFramework", "libraries"],
6333
+ ["elixirDocumentation", "documentation"],
6334
+ ["elixirClustering", "config"],
5700
6335
  ["elixirDeploy", "deploy"]
5701
6336
  ];
5702
6337
  const GRAPH_DATABASE_PART_CLI_KEYS = [["dbSetup", "dbSetup"]];
@@ -5730,6 +6365,12 @@ const GRAPH_PYTHON_BACKEND_ARRAY_PART_CLI_KEYS = [["pythonAi", "ai"]];
5730
6365
  const GRAPH_GO_BACKEND_PART_CLI_KEYS = [
5731
6366
  ["goCli", "cli"],
5732
6367
  ["goLogging", "logging"],
6368
+ ["goValidation", "validation"],
6369
+ ["goQuality", "codeQuality"],
6370
+ ["goMigrations", "migrations"],
6371
+ ["goTemplating", "templating"],
6372
+ ["goProtoTooling", "buildTool"],
6373
+ ["goDI", "libraries"],
5733
6374
  ["caching", "caching"],
5734
6375
  ["search", "search"]
5735
6376
  ];
@@ -6223,6 +6864,12 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
6223
6864
  goCaching: stack.goCaching,
6224
6865
  goConfig: stack.goConfig,
6225
6866
  goObservability: stack.goObservability,
6867
+ goValidation: stack.goValidation,
6868
+ goQuality: stack.goQuality,
6869
+ goMigrations: stack.goMigrations,
6870
+ goTemplating: stack.goTemplating,
6871
+ goProtoTooling: stack.goProtoTooling,
6872
+ goDI: stack.goDI,
6226
6873
  javaLanguage: stack.javaLanguage,
6227
6874
  javaWebFramework: stack.javaWebFramework,
6228
6875
  javaBuildTool: stack.javaBuildTool,
@@ -6257,6 +6904,11 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
6257
6904
  elixirObservability: stack.elixirObservability,
6258
6905
  elixirTesting: stack.elixirTesting,
6259
6906
  elixirQuality: stack.elixirQuality,
6907
+ elixirI18n: stack.elixirI18n,
6908
+ elixirHttpServer: stack.elixirHttpServer,
6909
+ elixirApplicationFramework: stack.elixirApplicationFramework,
6910
+ elixirDocumentation: stack.elixirDocumentation,
6911
+ elixirClustering: stack.elixirClustering,
6260
6912
  elixirDeploy: stack.elixirDeploy,
6261
6913
  elixirLibraries: toUniqueNonNoneArray(stack.elixirLibraries),
6262
6914
  aiDocs: toUniqueNonNoneArray(stack.aiDocs)
@@ -6511,6 +7163,12 @@ function generateGoCommand(selection, projectName) {
6511
7163
  `--go-caching ${selection.goCaching}`,
6512
7164
  `--go-config ${selection.goConfig}`,
6513
7165
  `--go-observability ${selection.goObservability}`,
7166
+ `--go-validation ${selection.goValidation}`,
7167
+ `--go-quality ${selection.goQuality}`,
7168
+ `--go-migrations ${selection.goMigrations}`,
7169
+ `--go-templating ${selection.goTemplating}`,
7170
+ `--go-proto-tooling ${selection.goProtoTooling}`,
7171
+ `--go-di ${selection.goDI}`,
6514
7172
  `--auth ${selection.auth}`,
6515
7173
  `--email ${selection.email}`,
6516
7174
  `--observability ${selection.observability}`,
@@ -6581,6 +7239,11 @@ function generateElixirCommand(selection, projectName) {
6581
7239
  `--elixir-observability ${selection.elixirObservability}`,
6582
7240
  `--elixir-testing ${selection.elixirTesting}`,
6583
7241
  `--elixir-quality ${selection.elixirQuality}`,
7242
+ `--elixir-i18n ${selection.elixirI18n}`,
7243
+ `--elixir-http-server ${selection.elixirHttpServer}`,
7244
+ `--elixir-application-framework ${selection.elixirApplicationFramework}`,
7245
+ `--elixir-documentation ${selection.elixirDocumentation}`,
7246
+ `--elixir-clustering ${selection.elixirClustering}`,
6584
7247
  `--elixir-deploy ${selection.elixirDeploy}`,
6585
7248
  formatArrayFlag("elixir-libraries", selection.elixirLibraries),
6586
7249
  formatArrayFlag("ai-docs", selection.aiDocs)
@@ -6606,5 +7269,5 @@ function generateStackSelectionCommand(selection) {
6606
7269
  }
6607
7270
 
6608
7271
  //#endregion
6609
- export { getCategoryCliValues as $, getCompatibleFormLibraries as A, stackQualifiesForSingleApp as B, allowedApisForFrontends as C, getApiFrontendCompatibilityIssue as D, getAIFrontendCompatibilityIssue as E, isOptionCompatible as F, ELIXIR_CATEGORY_ORDER as G, validateProjectName as H, isWebFrontend as I, OPTION_CATEGORY_METADATA as J, GO_CATEGORY_ORDER as K, requiresChatSdkVercelAI as L, getDisabledReason as M, hasWebStyling as N, getCompatibleAddons as O, isFrontendAllowedWithBackend as P, TYPESCRIPT_CATEGORY_ORDER as Q, requiresChatSdkVercelAIForSelection as R, usesVirtualNoneStackSelection as S, evaluateCompatibility as T, CATEGORY_ORDER as U, validateAddonCompatibility as V, DOTNET_CATEGORY_ORDER as W, REACT_NATIVE_CATEGORY_ORDER as X, PYTHON_CATEGORY_ORDER as Y, RUST_CATEGORY_ORDER as Z, parseStackSelectionFromSearch as _, STACK_SELECTION_URL_KEYS as a, normalizeOptionId as at, stackSelectionToCliComparableConfig as b, cloneDefaultStackSelection as c, getSupportedCapabilityOptions as ct, isArrayStackSelectionKey as d, getCategoryDisplayName as et, isCliDefaultStackSelection as f, normalizeStackSelectionValue as g, normalizeStackSelection as h, STACK_SELECTION_OPTION_CATEGORY_BY_KEY as i, isMultiSelectCategory as it, getCompatibleUILibraries as j, getCompatibleCSSFrameworks as k, createStackSelectionSearchParams as l, normalizeCapabilitySelection as lt, isStackSelectionDefault as m, NON_OPTION_STACK_SELECTION_KEYS as n, getCategoryOrderForEcosystem as nt, VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS as o, getCapabilityDefinitions as ot, isGraphStackSelection as p, JAVA_CATEGORY_ORDER as q, STACK_SELECTION_KEYS as r, getOptionMetadata as rt, cliInputToProjectConfigPartial as s, getCapabilityDisabledReason as st, DEFAULT_STACK_SELECTION as t, getCategoryOptionIds as tt, generateStackSelectionCommand as u, parseStackSelectionFromUrlRecord as v, analyzeStackCompatibility as w, stackSelectionToProjectConfig as x, processCliArrayOption as y, splitFrontends as z };
6610
- //# sourceMappingURL=stack-translation-DncO452_.mjs.map
7272
+ export { REACT_NATIVE_CATEGORY_ORDER as $, getCompatibleAddons as A, requiresChatSdkVercelAI as B, KOTLIN_DROPPED_JAVA_LIBRARIES as C, evaluateCompatibility as D, analyzeStackCompatibility as E, getKotlinJavaIncompatibilityReason as F, validateProjectName as G, splitFrontends as H, hasWebStyling as I, ELIXIR_CATEGORY_ORDER as J, CATEGORY_ORDER as K, isFrontendAllowedWithBackend as L, getCompatibleFormLibraries as M, getCompatibleUILibraries as N, getAIFrontendCompatibilityIssue as O, getDisabledReason as P, PYTHON_CATEGORY_ORDER as Q, isOptionCompatible as R, usesVirtualNoneStackSelection as S, allowedApisForFrontends as T, stackQualifiesForSingleApp as U, requiresChatSdkVercelAIForSelection as V, validateAddonCompatibility as W, JAVA_CATEGORY_ORDER as X, GO_CATEGORY_ORDER as Y, OPTION_CATEGORY_METADATA as Z, parseStackSelectionFromSearch as _, STACK_SELECTION_URL_KEYS as a, getCategoryOrderForEcosystem as at, stackSelectionToCliComparableConfig as b, cloneDefaultStackSelection as c, normalizeOptionId as ct, isArrayStackSelectionKey as d, getSupportedCapabilityOptions as dt, RUST_CATEGORY_ORDER as et, isCliDefaultStackSelection as f, normalizeCapabilitySelection as ft, normalizeStackSelectionValue as g, normalizeStackSelection as h, STACK_SELECTION_OPTION_CATEGORY_BY_KEY as i, getCategoryOptionIds as it, getCompatibleCSSFrameworks as j, getApiFrontendCompatibilityIssue as k, createStackSelectionSearchParams as l, getCapabilityDefinitions as lt, isStackSelectionDefault as m, NON_OPTION_STACK_SELECTION_KEYS as n, getCategoryCliValues as nt, VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS as o, getOptionMetadata as ot, isGraphStackSelection as p, DOTNET_CATEGORY_ORDER as q, STACK_SELECTION_KEYS as r, getCategoryDisplayName as rt, cliInputToProjectConfigPartial as s, isMultiSelectCategory as st, DEFAULT_STACK_SELECTION as t, TYPESCRIPT_CATEGORY_ORDER as tt, generateStackSelectionCommand as u, getCapabilityDisabledReason as ut, parseStackSelectionFromUrlRecord as v, KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES as w, stackSelectionToProjectConfig as x, processCliArrayOption as y, isWebFrontend as z };
7273
+ //# sourceMappingURL=stack-translation-Kr0TyRAm.mjs.map