@better-fullstack/types 2.1.8 → 2.3.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 (46) hide show
  1. package/dist/{defaults-Cpkx-Eu7.d.mts → defaults-BT-WhLPX.d.mts} +2 -2
  2. package/dist/defaults-BT-WhLPX.d.mts.map +1 -0
  3. package/dist/{defaults-DNnZX9er.mjs → defaults-Cl16mM84.mjs} +21 -1
  4. package/dist/defaults-Cl16mM84.mjs.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 +194 -5
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/json-schema.d.mts +3076 -364
  12. package/dist/json-schema.d.mts.map +1 -1
  13. package/dist/json-schema.mjs +102 -2
  14. package/dist/json-schema.mjs.map +1 -1
  15. package/dist/{schemas-BXDvWDRp.mjs → schemas-CprYz5Sh.mjs} +301 -8
  16. package/dist/schemas-CprYz5Sh.mjs.map +1 -0
  17. package/dist/{schemas-DOb4t_el.d.mts → schemas-q5-QVYJy.d.mts} +2945 -642
  18. package/dist/schemas-q5-QVYJy.d.mts.map +1 -0
  19. package/dist/schemas.d.mts +2 -2
  20. package/dist/schemas.mjs +2 -2
  21. package/dist/{stack-graph-0MDSuSPQ.d.mts → stack-graph-CgFYIeir.d.mts} +2 -2
  22. package/dist/stack-graph-CgFYIeir.d.mts.map +1 -0
  23. package/dist/{stack-graph-BAad0vv4.mjs → stack-graph-DiLi3WuL.mjs} +228 -33
  24. package/dist/stack-graph-DiLi3WuL.mjs.map +1 -0
  25. package/dist/stack-graph.d.mts +3 -3
  26. package/dist/stack-graph.mjs +2 -2
  27. package/dist/{stack-translation-DwSS9Vc2.mjs → stack-translation-Ay-_1mNB.mjs} +1117 -98
  28. package/dist/stack-translation-Ay-_1mNB.mjs.map +1 -0
  29. package/dist/{stack-translation-CnNmU8Z5.d.mts → stack-translation-CU1kpqq3.d.mts} +53 -13
  30. package/dist/stack-translation-CU1kpqq3.d.mts.map +1 -0
  31. package/dist/stack-translation.d.mts +4 -4
  32. package/dist/stack-translation.mjs +3 -3
  33. package/dist/types-Cp7krSdb.d.mts +176 -0
  34. package/dist/types-Cp7krSdb.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-0MDSuSPQ.d.mts.map +0 -1
  42. package/dist/stack-graph-BAad0vv4.mjs.map +0 -1
  43. package/dist/stack-translation-CnNmU8Z5.d.mts.map +0 -1
  44. package/dist/stack-translation-DwSS9Vc2.mjs.map +0 -1
  45. package/dist/types-CcWal512.d.mts +0 -156
  46. 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 { $a as WORKSPACE_SHAPE_VALUES, $r as PYTHON_MEDIA_VALUES, A as CSS_FRAMEWORK_VALUES, An as GO_TESTING_VALUES, At as ELIXIR_VALIDATION_VALUES, B as DOTNET_JOB_QUEUE_VALUES, Bi as RUST_AUTH_VALUES, Br as ORM_VALUES, Ca as SHADCN_RADIUS_VALUES, Cn as GO_MIGRATIONS_VALUES, Cr as MOBILE_LIBRARIES_VALUES, Ct as ELIXIR_JSON_VALUES, Dn as GO_QUALITY_VALUES, Dr as MOBILE_STORAGE_VALUES, Dt as ELIXIR_QUALITY_VALUES, En as GO_PROTO_TOOLING_VALUES, Er as MOBILE_PUSH_VALUES, Et as ELIXIR_ORM_VALUES, G as DOTNET_TESTING_VALUES, Ga as UI_LIBRARY_VALUES, Gi as RUST_LIBRARIES_VALUES, Gr as PYTHON_API_VALUES, H as DOTNET_OBSERVABILITY_VALUES, Hi as RUST_CLI_VALUES, Hr as PACKAGE_MANAGER_VALUES, I as DOTNET_API_VALUES, Ii as RATE_LIMIT_VALUES, Ja as VERSION_CHANNEL_VALUES, Ji as RUST_OBSERVABILITY_VALUES, Jr as PYTHON_CLI_VALUES, K as DOTNET_VALIDATION_VALUES, Ka as VALIDATION_VALUES, Ki as RUST_LOGGING_VALUES, Kr as PYTHON_AUTH_VALUES, L as DOTNET_AUTH_VALUES, Li as REALTIME_VALUES, Mn as GO_WEB_FRAMEWORK_VALUES, Mt as EMAIL_VALUES, N as DATABASE_SETUP_VALUES, O as CMS_VALUES, On as GO_REALTIME_VALUES, Or as MOBILE_TESTING_VALUES, Ot as ELIXIR_REALTIME_VALUES, P as DATABASE_VALUES, Qa as WEB_DEPLOY_VALUES, Qi as RUST_WEB_FRAMEWORK_VALUES, Qr as PYTHON_HTTP_CLIENT_VALUES, R as DOTNET_CACHING_VALUES, Ri as RUNTIME_VALUES, Rr as OBSERVABILITY_VALUES, Sa as SHADCN_ICON_LIBRARY_VALUES, Sn as GO_MESSAGE_QUEUE_VALUES, Sr as MOBILE_DEEP_LINKING_VALUES, St as ELIXIR_JOBS_VALUES, T as CACHING_VALUES, Ta as STATE_MANAGEMENT_VALUES, Tn as GO_ORM_VALUES, Tr as MOBILE_OTA_VALUES, Tt as ELIXIR_OBSERVABILITY_VALUES, U as DOTNET_ORM_VALUES, Ui as RUST_ERROR_HANDLING_VALUES, Ur as PAYMENTS_VALUES, V as DOTNET_LIBRARIES_VALUES, Va as TESTING_VALUES, Vi as RUST_CACHING_VALUES, W as DOTNET_REALTIME_VALUES, Wi as RUST_FRONTEND_VALUES, Wr as PYTHON_AI_VALUES, Xi as RUST_REALTIME_VALUES, Xr as PYTHON_DATA_VALUES, Yi as RUST_ORM_VALUES, Yr as PYTHON_CLOUD_SDK_VALUES, Zi as RUST_TEMPLATING_VALUES, Zn as I18N_VALUES, Zr as PYTHON_GRAPHQL_VALUES, _a as SERVER_DEPLOY_VALUES, _n as GO_CACHING_VALUES, _t as ELIXIR_DOCUMENTATION_VALUES, a as ANALYTICS_VALUES, ai as PYTHON_REALTIME_VALUES, an as FEATURE_FLAGS_VALUES, ar as JAVA_LOGGING_VALUES, ba as SHADCN_COLOR_THEME_VALUES, bn as GO_DI_VALUES, br as LOGGING_VALUES, bt as ELIXIR_HTTP_VALUES, c as API_VALUES, ci as PYTHON_TESTING_VALUES, cn as FORMS_VALUES, cr as JAVA_WEB_FRAMEWORK_VALUES, d as AUTH_VALUES, dt as ELIXIR_API_VALUES, ei as PYTHON_MESSAGE_QUEUE_VALUES, er as JAVA_API_VALUES, ft as ELIXIR_APPLICATION_FRAMEWORK_VALUES, ga as SEARCH_VALUES, gn as GO_AUTH_VALUES, gt as ELIXIR_DEPLOY_VALUES, hn as GO_API_VALUES, ht as ELIXIR_CLUSTERING_VALUES, i as AI_VALUES, ii as PYTHON_QUALITY_VALUES, ir as JAVA_LIBRARIES_VALUES, jn as GO_VALIDATION_VALUES, jt as ELIXIR_WEB_FRAMEWORK_VALUES, kn as GO_TEMPLATING_VALUES, kr as MOBILE_UI_VALUES, kt as ELIXIR_TESTING_VALUES, l as APP_PLATFORM_ADDON_VALUES, li as PYTHON_VALIDATION_VALUES, lr as JOB_QUEUE_VALUES, mt as ELIXIR_CACHING_VALUES, ni as PYTHON_ORM_VALUES, nr as JAVA_BUILD_TOOL_VALUES, o as ANIMATION_VALUES, oi as PYTHON_SERVER_VALUES, on as FILE_STORAGE_VALUES, or as JAVA_ORM_VALUES, pt as ELIXIR_AUTH_VALUES, q as DOTNET_WEB_FRAMEWORK_VALUES, qa as VECTOR_DB_VALUES, qi as RUST_MESSAGE_QUEUE_VALUES, qr as PYTHON_CACHING_VALUES, r as AI_DOCS_VALUES, ri as PYTHON_PACKAGE_MANAGER_VALUES, rr as JAVA_LANGUAGE_VALUES, si as PYTHON_TASK_QUEUE_VALUES, sn as FILE_UPLOAD_VALUES, sr as JAVA_TESTING_LIBRARIES_VALUES, ti as PYTHON_OBSERVABILITY_VALUES, tr as JAVA_AUTH_VALUES, u as ASTRO_INTEGRATION_VALUES, ui as PYTHON_WEB_FRAMEWORK_VALUES, ut as EFFECT_VALUES, va as SHADCN_BASE_COLOR_VALUES, vn as GO_CLI_VALUES, vt as ELIXIR_EMAIL_VALUES, wa as SHADCN_STYLE_VALUES, wn as GO_OBSERVABILITY_VALUES, wr as MOBILE_NAVIGATION_VALUES, wt as ELIXIR_LIBRARIES_VALUES, xa as SHADCN_FONT_VALUES, xn as GO_LOGGING_VALUES, xt as ELIXIR_I18N_VALUES, ya as SHADCN_BASE_VALUES, yn as GO_CONFIG_VALUES, yt as ELIXIR_HTTP_SERVER_VALUES, z as DOTNET_DEPLOY_VALUES, zi as RUST_API_VALUES } from "./schemas-CprYz5Sh.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-DiLi3WuL.mjs";
3
+ import { t as createCliDefaultProjectConfigBase } from "./defaults-Cl16mM84.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",
@@ -300,6 +311,7 @@ const REACT_NATIVE_CATEGORY_ORDER = [
300
311
  "mobilePush",
301
312
  "mobileOTA",
302
313
  "mobileDeepLinking",
314
+ "mobileLibraries",
303
315
  "auth",
304
316
  "payments",
305
317
  "packageManager",
@@ -345,6 +357,13 @@ const PYTHON_CATEGORY_ORDER = [
345
357
  "pythonRealtime",
346
358
  "pythonObservability",
347
359
  "pythonCli",
360
+ "pythonCloudSdk",
361
+ "pythonHttpClient",
362
+ "pythonData",
363
+ "pythonMedia",
364
+ "pythonServer",
365
+ "pythonPackageManager",
366
+ "pythonMessageQueue",
348
367
  "email",
349
368
  "observability",
350
369
  "caching",
@@ -366,6 +385,12 @@ const GO_CATEGORY_ORDER = [
366
385
  "goCaching",
367
386
  "goConfig",
368
387
  "goObservability",
388
+ "goValidation",
389
+ "goQuality",
390
+ "goMigrations",
391
+ "goTemplating",
392
+ "goProtoTooling",
393
+ "goDI",
369
394
  "auth",
370
395
  "email",
371
396
  "observability",
@@ -405,6 +430,7 @@ const DOTNET_CATEGORY_ORDER = [
405
430
  "dotnetValidation",
406
431
  "dotnetCaching",
407
432
  "dotnetDeploy",
433
+ "dotnetLibraries",
408
434
  "aiDocs",
409
435
  "git",
410
436
  "install"
@@ -424,6 +450,11 @@ const ELIXIR_CATEGORY_ORDER = [
424
450
  "elixirObservability",
425
451
  "elixirTesting",
426
452
  "elixirQuality",
453
+ "elixirI18n",
454
+ "elixirHttpServer",
455
+ "elixirApplicationFramework",
456
+ "elixirDocumentation",
457
+ "elixirClustering",
427
458
  "elixirDeploy",
428
459
  "elixirLibraries",
429
460
  "aiDocs",
@@ -455,6 +486,8 @@ function getCategoryOrderForEcosystem(ecosystem) {
455
486
  function getCategoryDisplayName(categoryKey) {
456
487
  const customName = {
457
488
  i18n: "Internationalization (i18n)",
489
+ appShells: "App Platforms",
490
+ appPlatforms: "Addons",
458
491
  mobileNavigation: "Mobile Navigation",
459
492
  mobileUI: "Mobile UI",
460
493
  mobileStorage: "Mobile Storage",
@@ -462,6 +495,7 @@ function getCategoryDisplayName(categoryKey) {
462
495
  mobilePush: "Mobile Push",
463
496
  mobileOTA: "Mobile OTA",
464
497
  mobileDeepLinking: "Mobile Deep Linking",
498
+ mobileLibraries: "Mobile Libraries",
465
499
  backendLibraries: "Effect Services",
466
500
  rustWebFramework: "Rust Web Framework",
467
501
  rustFrontend: "Rust Frontend (WASM)",
@@ -491,6 +525,13 @@ function getCategoryDisplayName(categoryKey) {
491
525
  pythonRealtime: "Python Realtime",
492
526
  pythonObservability: "Python Observability",
493
527
  pythonCli: "Python CLI Tooling",
528
+ pythonCloudSdk: "Python Cloud SDK",
529
+ pythonHttpClient: "Python HTTP Client",
530
+ pythonData: "Python Data & Scientific Computing",
531
+ pythonMedia: "Python Media",
532
+ pythonServer: "Python Production Server",
533
+ pythonPackageManager: "Python Package Manager",
534
+ pythonMessageQueue: "Python Message Queue",
494
535
  goWebFramework: "Go Web Framework",
495
536
  goOrm: "Go ORM / Database",
496
537
  goApi: "Go API Layer",
@@ -503,6 +544,12 @@ function getCategoryDisplayName(categoryKey) {
503
544
  goCaching: "Go Caching",
504
545
  goConfig: "Go Config",
505
546
  goObservability: "Go Observability",
547
+ goValidation: "Go Validation",
548
+ goQuality: "Go Code Quality",
549
+ goMigrations: "Go Database Migrations",
550
+ goTemplating: "Go Templating",
551
+ goProtoTooling: "Go Protobuf Tooling",
552
+ goDI: "Go Dependency Injection",
506
553
  javaLanguage: "Java Language",
507
554
  javaWebFramework: "Java Web Framework",
508
555
  javaBuildTool: "Java Build Tool",
@@ -523,6 +570,7 @@ function getCategoryDisplayName(categoryKey) {
523
570
  dotnetValidation: ".NET Validation",
524
571
  dotnetCaching: ".NET Caching",
525
572
  dotnetDeploy: ".NET Deploy",
573
+ dotnetLibraries: ".NET Libraries",
526
574
  elixirWebFramework: "Elixir Web Framework",
527
575
  elixirOrm: "Elixir ORM / Database",
528
576
  elixirAuth: "Elixir Auth",
@@ -537,6 +585,11 @@ function getCategoryDisplayName(categoryKey) {
537
585
  elixirObservability: "Elixir Observability",
538
586
  elixirTesting: "Elixir Testing",
539
587
  elixirQuality: "Elixir Code Quality",
588
+ elixirI18n: "Elixir Localization",
589
+ elixirHttpServer: "Elixir HTTP Server",
590
+ elixirApplicationFramework: "Elixir Application Framework",
591
+ elixirDocumentation: "Elixir Documentation",
592
+ elixirClustering: "Elixir Clustering",
540
593
  elixirDeploy: "Elixir Deploy",
541
594
  elixirLibraries: "Elixir Libraries"
542
595
  }[categoryKey];
@@ -548,6 +601,8 @@ const WEB_FRONTEND_VALUES = [
548
601
  "tanstack-router",
549
602
  "react-router",
550
603
  "react-vite",
604
+ "vanilla-vite",
605
+ "vue",
551
606
  "tanstack-start",
552
607
  "next",
553
608
  "vinext",
@@ -591,6 +646,8 @@ const BACKEND_BUILDER_VALUES = [
591
646
  ];
592
647
  const CODE_QUALITY_VALUES = [
593
648
  "biome",
649
+ "eslint",
650
+ "prettier",
594
651
  "oxlint",
595
652
  "ultracite",
596
653
  "lefthook",
@@ -598,13 +655,10 @@ const CODE_QUALITY_VALUES = [
598
655
  "ruler"
599
656
  ];
600
657
  const DOCUMENTATION_VALUES = ["starlight", "fumadocs"];
658
+ const APP_SHELL_VALUES = APP_PLATFORM_ADDON_VALUES;
601
659
  const APP_PLATFORM_VALUES = [
602
660
  "turborepo",
603
661
  "nx",
604
- "pwa",
605
- "tauri",
606
- "wxt",
607
- "opentui",
608
662
  "mcp",
609
663
  "skills",
610
664
  "msw",
@@ -618,7 +672,12 @@ const APP_PLATFORM_VALUES = [
618
672
  "backend-utils",
619
673
  "devcontainer",
620
674
  "docker-compose",
621
- "github-actions"
675
+ "github-actions",
676
+ "axios",
677
+ "firebase",
678
+ "graphql-codegen",
679
+ "openapi-typescript",
680
+ "apollo-client"
622
681
  ];
623
682
  const EXAMPLE_VALUES = ["ai", "chat-sdk"];
624
683
  const BOOLEAN_OPTION_VALUES = ["true", "false"];
@@ -627,6 +686,7 @@ const MULTI_SELECT_CATEGORIES = new Set([
627
686
  "nativeFrontend",
628
687
  "codeQuality",
629
688
  "documentation",
689
+ "appShells",
630
690
  "appPlatforms",
631
691
  "examples",
632
692
  "aiDocs",
@@ -634,11 +694,14 @@ const MULTI_SELECT_CATEGORIES = new Set([
634
694
  "pythonAi",
635
695
  "javaLibraries",
636
696
  "javaTestingLibraries",
697
+ "mobileLibraries",
698
+ "dotnetLibraries",
637
699
  "dotnetTesting",
638
700
  "dotnetObservability",
639
701
  "goTesting",
640
702
  "pythonTesting",
641
703
  "pythonCli",
704
+ "pythonData",
642
705
  "elixirLibraries"
643
706
  ]);
644
707
  const CATEGORY_VALUE_IDS = {
@@ -685,8 +748,10 @@ const CATEGORY_VALUE_IDS = {
685
748
  mobilePush: MOBILE_PUSH_VALUES,
686
749
  mobileOTA: MOBILE_OTA_VALUES,
687
750
  mobileDeepLinking: MOBILE_DEEP_LINKING_VALUES,
751
+ mobileLibraries: MOBILE_LIBRARIES_VALUES,
688
752
  codeQuality: CODE_QUALITY_VALUES,
689
753
  documentation: DOCUMENTATION_VALUES,
754
+ appShells: APP_SHELL_VALUES,
690
755
  appPlatforms: APP_PLATFORM_VALUES,
691
756
  packageManager: PACKAGE_MANAGER_VALUES,
692
757
  workspaceShape: WORKSPACE_SHAPE_VALUES,
@@ -732,6 +797,13 @@ const CATEGORY_VALUE_IDS = {
732
797
  pythonRealtime: PYTHON_REALTIME_VALUES,
733
798
  pythonObservability: PYTHON_OBSERVABILITY_VALUES,
734
799
  pythonCli: PYTHON_CLI_VALUES,
800
+ pythonCloudSdk: PYTHON_CLOUD_SDK_VALUES,
801
+ pythonHttpClient: PYTHON_HTTP_CLIENT_VALUES,
802
+ pythonData: PYTHON_DATA_VALUES,
803
+ pythonMedia: PYTHON_MEDIA_VALUES,
804
+ pythonServer: PYTHON_SERVER_VALUES,
805
+ pythonPackageManager: PYTHON_PACKAGE_MANAGER_VALUES,
806
+ pythonMessageQueue: PYTHON_MESSAGE_QUEUE_VALUES,
735
807
  goWebFramework: GO_WEB_FRAMEWORK_VALUES,
736
808
  goOrm: GO_ORM_VALUES,
737
809
  goApi: GO_API_VALUES,
@@ -744,6 +816,12 @@ const CATEGORY_VALUE_IDS = {
744
816
  goCaching: GO_CACHING_VALUES,
745
817
  goConfig: GO_CONFIG_VALUES,
746
818
  goObservability: GO_OBSERVABILITY_VALUES,
819
+ goValidation: GO_VALIDATION_VALUES,
820
+ goQuality: GO_QUALITY_VALUES,
821
+ goMigrations: GO_MIGRATIONS_VALUES,
822
+ goTemplating: GO_TEMPLATING_VALUES,
823
+ goProtoTooling: GO_PROTO_TOOLING_VALUES,
824
+ goDI: GO_DI_VALUES,
747
825
  javaLanguage: JAVA_LANGUAGE_VALUES,
748
826
  javaWebFramework: JAVA_WEB_FRAMEWORK_VALUES,
749
827
  javaBuildTool: JAVA_BUILD_TOOL_VALUES,
@@ -764,6 +842,7 @@ const CATEGORY_VALUE_IDS = {
764
842
  dotnetValidation: DOTNET_VALIDATION_VALUES,
765
843
  dotnetCaching: DOTNET_CACHING_VALUES,
766
844
  dotnetDeploy: DOTNET_DEPLOY_VALUES,
845
+ dotnetLibraries: DOTNET_LIBRARIES_VALUES,
767
846
  elixirWebFramework: ELIXIR_WEB_FRAMEWORK_VALUES,
768
847
  elixirOrm: ELIXIR_ORM_VALUES,
769
848
  elixirAuth: ELIXIR_AUTH_VALUES,
@@ -778,6 +857,11 @@ const CATEGORY_VALUE_IDS = {
778
857
  elixirObservability: ELIXIR_OBSERVABILITY_VALUES,
779
858
  elixirTesting: ELIXIR_TESTING_VALUES,
780
859
  elixirQuality: ELIXIR_QUALITY_VALUES,
860
+ elixirI18n: ELIXIR_I18N_VALUES,
861
+ elixirHttpServer: ELIXIR_HTTP_SERVER_VALUES,
862
+ elixirApplicationFramework: ELIXIR_APPLICATION_FRAMEWORK_VALUES,
863
+ elixirDocumentation: ELIXIR_DOCUMENTATION_VALUES,
864
+ elixirClustering: ELIXIR_CLUSTERING_VALUES,
781
865
  elixirDeploy: ELIXIR_DEPLOY_VALUES,
782
866
  elixirLibraries: ELIXIR_LIBRARIES_VALUES
783
867
  };
@@ -793,6 +877,8 @@ const EXACT_LABEL_OVERRIDES = {
793
877
  next: "Next.js",
794
878
  vinext: "Vinext",
795
879
  "react-vite": "React + Vite",
880
+ "vanilla-vite": "Vite (Vanilla TypeScript)",
881
+ vue: "Vue 3 + Vite",
796
882
  svelte: "SvelteKit",
797
883
  redwood: "RedwoodJS"
798
884
  },
@@ -858,17 +944,20 @@ const EXACT_LABEL_OVERRIDES = {
858
944
  cms: {
859
945
  tinacms: "TinaCMS",
860
946
  directus: "Directus",
861
- keystatic: "Keystatic"
947
+ keystatic: "Keystatic",
948
+ contentful: "Contentful"
862
949
  },
863
950
  auth: {
864
951
  "better-auth-organizations": "Better Auth + Organizations",
865
952
  auth0: "Auth0",
866
953
  workos: "WorkOS AuthKit",
867
- kinde: "Kinde"
954
+ kinde: "Kinde",
955
+ passport: "Passport.js"
868
956
  },
869
957
  payments: {
870
958
  "lemon-squeezy": "Lemon Squeezy",
871
- dodo: "Dodo Payments"
959
+ dodo: "Dodo Payments",
960
+ paypal: "PayPal"
872
961
  },
873
962
  email: {
874
963
  "react-email": "React Email",
@@ -910,9 +999,13 @@ const EXACT_LABEL_OVERRIDES = {
910
999
  typebox: "TypeBox",
911
1000
  "effect-schema": "Effect Schema"
912
1001
  },
913
- testing: { "vitest-playwright": "Vitest + Playwright" },
1002
+ testing: {
1003
+ "vitest-playwright": "Vitest + Playwright",
1004
+ mocha: "Mocha"
1005
+ },
914
1006
  realtime: {
915
1007
  "socket-io": "Socket.IO",
1008
+ ws: "ws",
916
1009
  yjs: "Y.js"
917
1010
  },
918
1011
  jobQueue: {
@@ -947,7 +1040,8 @@ const EXACT_LABEL_OVERRIDES = {
947
1040
  cssFramework: {
948
1041
  tailwind: "Tailwind CSS",
949
1042
  scss: "SCSS",
950
- "postcss-only": "PostCSS Only"
1043
+ "postcss-only": "PostCSS Only",
1044
+ "styled-components": "styled-components"
951
1045
  },
952
1046
  uiLibrary: {
953
1047
  "shadcn-ui": "shadcn/ui",
@@ -973,7 +1067,8 @@ const EXACT_LABEL_OVERRIDES = {
973
1067
  },
974
1068
  analytics: {
975
1069
  plausible: "Plausible",
976
- umami: "Umami"
1070
+ umami: "Umami",
1071
+ ga4: "Google Analytics 4"
977
1072
  },
978
1073
  mobileNavigation: {
979
1074
  "expo-router": "Expo Router",
@@ -994,8 +1089,32 @@ const EXACT_LABEL_OVERRIDES = {
994
1089
  mobilePush: { "expo-notifications": "Expo Notifications" },
995
1090
  mobileOTA: { "expo-updates": "Expo Updates" },
996
1091
  mobileDeepLinking: { "expo-linking": "Expo Linking" },
1092
+ mobileLibraries: {
1093
+ "expo-sqlite": "Expo SQLite",
1094
+ "expo-camera": "Expo Camera",
1095
+ "expo-image-picker": "Expo Image Picker",
1096
+ "expo-location": "Expo Location",
1097
+ "expo-sensors": "Expo Sensors",
1098
+ "expo-file-system": "Expo File System",
1099
+ "expo-image": "Expo Image",
1100
+ "expo-audio": "Expo Audio",
1101
+ "expo-video": "Expo Video",
1102
+ "expo-contacts": "Expo Contacts",
1103
+ "expo-calendar": "Expo Calendar",
1104
+ "expo-local-authentication": "Expo Local Authentication",
1105
+ "expo-sharing": "Expo Sharing",
1106
+ "expo-clipboard": "Expo Clipboard",
1107
+ "expo-task-manager": "Expo Task Manager",
1108
+ "expo-background-task": "Expo Background Task",
1109
+ "expo-maps": "Expo Maps",
1110
+ "expo-brightness": "Expo Brightness",
1111
+ "expo-battery": "Expo Battery",
1112
+ "expo-screen-capture": "Expo Screen Capture"
1113
+ },
997
1114
  codeQuality: {
998
1115
  biome: "Biome",
1116
+ eslint: "ESLint",
1117
+ prettier: "Prettier",
999
1118
  oxlint: "Oxlint",
1000
1119
  ultracite: "Ultracite",
1001
1120
  lefthook: "Lefthook",
@@ -1006,10 +1125,15 @@ const EXACT_LABEL_OVERRIDES = {
1006
1125
  starlight: "Starlight",
1007
1126
  fumadocs: "Fumadocs"
1008
1127
  },
1009
- appPlatforms: {
1128
+ appShells: {
1010
1129
  pwa: "PWA",
1130
+ tauri: "Tauri",
1131
+ electron: "Electron",
1132
+ capacitor: "Capacitor",
1011
1133
  wxt: "WXT",
1012
- opentui: "OpenTUI",
1134
+ opentui: "OpenTUI"
1135
+ },
1136
+ appPlatforms: {
1013
1137
  mcp: "MCP",
1014
1138
  msw: "MSW",
1015
1139
  swr: "SWR",
@@ -1020,7 +1144,12 @@ const EXACT_LABEL_OVERRIDES = {
1020
1144
  "tanstack-pacer": "TanStack Pacer",
1021
1145
  devcontainer: "DevContainer",
1022
1146
  "docker-compose": "Docker Compose",
1023
- "github-actions": "GitHub Actions"
1147
+ "github-actions": "GitHub Actions",
1148
+ axios: "Axios",
1149
+ firebase: "Firebase JS SDK",
1150
+ "graphql-codegen": "GraphQL Code Generator",
1151
+ "openapi-typescript": "openapi-typescript",
1152
+ "apollo-client": "Apollo Client"
1024
1153
  },
1025
1154
  versionChannel: {
1026
1155
  stable: "Stable",
@@ -1036,6 +1165,8 @@ const EXACT_LABEL_OVERRIDES = {
1036
1165
  voltagent: "VoltAgent",
1037
1166
  langgraph: "LangGraph.js",
1038
1167
  "openai-agents": "OpenAI Agents SDK",
1168
+ "openai-sdk": "OpenAI SDK",
1169
+ "anthropic-sdk": "Anthropic SDK",
1039
1170
  "google-adk": "Google ADK",
1040
1171
  modelfusion: "ModelFusion",
1041
1172
  langchain: "LangChain",
@@ -1104,20 +1235,27 @@ const EXACT_LABEL_OVERRIDES = {
1104
1235
  "actix-web": "Actix-web",
1105
1236
  rocket: "Rocket",
1106
1237
  poem: "Poem",
1107
- loco: "Loco"
1238
+ loco: "Loco",
1239
+ warp: "Warp",
1240
+ salvo: "Salvo"
1108
1241
  },
1109
1242
  rustFrontend: {
1110
1243
  leptos: "Leptos",
1111
- dioxus: "Dioxus"
1244
+ dioxus: "Dioxus",
1245
+ yew: "Yew"
1112
1246
  },
1113
1247
  rustOrm: {
1114
1248
  "sea-orm": "SeaORM",
1115
1249
  sqlx: "SQLx",
1116
- diesel: "Diesel"
1250
+ diesel: "Diesel",
1251
+ mongodb: "MongoDB Rust Driver",
1252
+ rusqlite: "rusqlite",
1253
+ "tokio-postgres": "tokio-postgres"
1117
1254
  },
1118
1255
  rustApi: {
1119
1256
  "async-graphql": "async-graphql",
1120
- tonic: "Tonic"
1257
+ tonic: "Tonic",
1258
+ jsonrpsee: "jsonrpsee"
1121
1259
  },
1122
1260
  rustCli: {
1123
1261
  clap: "Clap",
@@ -1140,7 +1278,14 @@ const EXACT_LABEL_OVERRIDES = {
1140
1278
  "tokio-test": "Tokio Test",
1141
1279
  mockall: "Mockall",
1142
1280
  proptest: "Proptest",
1143
- insta: "Insta"
1281
+ insta: "Insta",
1282
+ rand: "rand",
1283
+ regex: "regex",
1284
+ rayon: "Rayon",
1285
+ itertools: "Itertools",
1286
+ rstest: "rstest",
1287
+ "cargo-nextest": "cargo-nextest",
1288
+ "cargo-audit": "cargo-audit"
1144
1289
  },
1145
1290
  rustLogging: {
1146
1291
  tracing: "Tracing",
@@ -1156,27 +1301,40 @@ const EXACT_LABEL_OVERRIDES = {
1156
1301
  },
1157
1302
  rustAuth: {
1158
1303
  oauth2: "OAuth2",
1159
- torii: "Torii"
1304
+ torii: "Torii",
1305
+ openidconnect: "OpenID Connect",
1306
+ "tower-sessions": "tower-sessions"
1160
1307
  },
1161
1308
  rustRealtime: { "tokio-tungstenite": "tokio-tungstenite" },
1162
- rustMessageQueue: { lapin: "Lapin (RabbitMQ)" },
1163
- rustObservability: { opentelemetry: "OpenTelemetry" },
1309
+ rustMessageQueue: {
1310
+ lapin: "Lapin (RabbitMQ)",
1311
+ rdkafka: "rdkafka (Kafka)",
1312
+ "async-nats": "async-nats"
1313
+ },
1314
+ rustObservability: {
1315
+ opentelemetry: "OpenTelemetry",
1316
+ metrics: "metrics"
1317
+ },
1164
1318
  rustTemplating: {
1165
1319
  askama: "Askama",
1166
- tera: "Tera"
1320
+ tera: "Tera",
1321
+ minijinja: "MiniJinja"
1167
1322
  },
1168
1323
  pythonWebFramework: {
1169
1324
  fastapi: "FastAPI",
1170
1325
  django: "Django",
1171
1326
  flask: "Flask",
1172
1327
  litestar: "Litestar",
1173
- starlette: "Starlette"
1328
+ starlette: "Starlette",
1329
+ aiohttp: "aiohttp",
1330
+ streamlit: "Streamlit"
1174
1331
  },
1175
1332
  pythonOrm: {
1176
1333
  sqlalchemy: "SQLAlchemy",
1177
1334
  sqlmodel: "SQLModel",
1178
1335
  "tortoise-orm": "Tortoise ORM",
1179
- peewee: "Peewee"
1336
+ peewee: "Peewee",
1337
+ pymongo: "PyMongo"
1180
1338
  },
1181
1339
  pythonValidation: { pydantic: "Pydantic" },
1182
1340
  pythonAi: {
@@ -1189,11 +1347,17 @@ const EXACT_LABEL_OVERRIDES = {
1189
1347
  haystack: "Haystack",
1190
1348
  "pydantic-ai": "Pydantic AI",
1191
1349
  "google-adk": "Google ADK",
1192
- smolagents: "smolagents"
1350
+ smolagents: "smolagents",
1351
+ pytorch: "PyTorch",
1352
+ transformers: "Transformers",
1353
+ "scikit-learn": "scikit-learn",
1354
+ tensorflow: "TensorFlow",
1355
+ mcp: "MCP Python SDK"
1193
1356
  },
1194
1357
  pythonAuth: {
1195
1358
  authlib: "Authlib",
1196
1359
  jwt: "JWT (python-jose)",
1360
+ pyjwt: "PyJWT",
1197
1361
  "fastapi-users": "FastAPI Users"
1198
1362
  },
1199
1363
  pythonApi: {
@@ -1218,7 +1382,8 @@ const EXACT_LABEL_OVERRIDES = {
1218
1382
  },
1219
1383
  pythonTesting: {
1220
1384
  pytest: "pytest",
1221
- hypothesis: "Hypothesis"
1385
+ hypothesis: "Hypothesis",
1386
+ "pytest-cov": "pytest-cov"
1222
1387
  },
1223
1388
  pythonCaching: {
1224
1389
  redis: "redis-py",
@@ -1228,28 +1393,52 @@ const EXACT_LABEL_OVERRIDES = {
1228
1393
  "python-socketio": "python-socketio",
1229
1394
  websockets: "websockets"
1230
1395
  },
1231
- pythonObservability: { opentelemetry: "OpenTelemetry" },
1396
+ pythonObservability: {
1397
+ opentelemetry: "OpenTelemetry",
1398
+ "prometheus-client": "Prometheus Client"
1399
+ },
1232
1400
  pythonCli: {
1233
1401
  typer: "Typer",
1234
1402
  click: "Click",
1235
1403
  rich: "Rich"
1236
1404
  },
1405
+ pythonCloudSdk: { boto3: "Boto3" },
1406
+ pythonHttpClient: { requests: "Requests" },
1407
+ pythonData: {
1408
+ numpy: "NumPy",
1409
+ pandas: "pandas",
1410
+ scipy: "SciPy"
1411
+ },
1412
+ pythonMedia: { pillow: "Pillow" },
1413
+ pythonServer: { gunicorn: "Gunicorn" },
1414
+ pythonPackageManager: {
1415
+ uv: "uv",
1416
+ poetry: "Poetry"
1417
+ },
1418
+ pythonMessageQueue: { "confluent-kafka": "Confluent Kafka" },
1237
1419
  goWebFramework: {
1238
1420
  gin: "Gin",
1239
1421
  echo: "Echo",
1240
1422
  fiber: "Fiber",
1241
1423
  chi: "Chi",
1242
- stdlib: "net/http"
1424
+ stdlib: "net/http",
1425
+ "go-zero": "go-zero",
1426
+ kratos: "Kratos",
1427
+ httprouter: "HttpRouter"
1243
1428
  },
1244
1429
  goOrm: {
1245
1430
  gorm: "GORM",
1246
1431
  sqlc: "sqlc",
1247
1432
  ent: "Ent",
1248
- bun: "Bun"
1433
+ bun: "Bun",
1434
+ sqlx: "sqlx"
1249
1435
  },
1250
1436
  goApi: {
1251
1437
  "grpc-go": "gRPC-Go",
1252
- gqlgen: "gqlgen"
1438
+ gqlgen: "gqlgen",
1439
+ "grpc-gateway": "grpc-gateway",
1440
+ "connect-go": "Connect-Go",
1441
+ "oapi-codegen": "oapi-codegen"
1253
1442
  },
1254
1443
  goCli: {
1255
1444
  cobra: "Cobra",
@@ -1265,11 +1454,15 @@ const EXACT_LABEL_OVERRIDES = {
1265
1454
  goAuth: {
1266
1455
  casbin: "Casbin",
1267
1456
  jwt: "golang-jwt",
1268
- goth: "Goth"
1457
+ goth: "Goth",
1458
+ oauth2: "golang.org/x/oauth2"
1269
1459
  },
1270
1460
  goTesting: {
1271
1461
  testify: "Testify",
1272
- gomock: "GoMock"
1462
+ gomock: "GoMock",
1463
+ testcontainers: "Testcontainers for Go",
1464
+ "ginkgo-gomega": "Ginkgo + Gomega",
1465
+ mockery: "mockery"
1273
1466
  },
1274
1467
  goRealtime: {
1275
1468
  "gorilla-websocket": "Gorilla WebSocket",
@@ -1277,7 +1470,9 @@ const EXACT_LABEL_OVERRIDES = {
1277
1470
  },
1278
1471
  goMessageQueue: {
1279
1472
  nats: "NATS",
1280
- watermill: "Watermill"
1473
+ watermill: "Watermill",
1474
+ "kafka-go": "kafka-go",
1475
+ asynq: "Asynq"
1281
1476
  },
1282
1477
  goCaching: {
1283
1478
  redis: "go-redis",
@@ -1287,7 +1482,16 @@ const EXACT_LABEL_OVERRIDES = {
1287
1482
  viper: "Viper",
1288
1483
  koanf: "Koanf"
1289
1484
  },
1290
- goObservability: { opentelemetry: "OpenTelemetry" },
1485
+ goObservability: {
1486
+ opentelemetry: "OpenTelemetry",
1487
+ prometheus: "Prometheus"
1488
+ },
1489
+ goValidation: { validator: "go-playground/validator" },
1490
+ goQuality: { "golangci-lint": "golangci-lint" },
1491
+ goMigrations: { "golang-migrate": "golang-migrate" },
1492
+ goTemplating: { templ: "templ" },
1493
+ goProtoTooling: { buf: "Buf" },
1494
+ goDI: { fx: "Uber Fx" },
1291
1495
  javaLanguage: {
1292
1496
  java: "Java",
1293
1497
  kotlin: "Kotlin"
@@ -1334,7 +1538,27 @@ const EXACT_LABEL_OVERRIDES = {
1334
1538
  "micrometer-prometheus": "Micrometer Prometheus",
1335
1539
  thymeleaf: "Thymeleaf",
1336
1540
  "spring-amqp": "Spring AMQP (RabbitMQ)",
1337
- "opentelemetry-java": "OpenTelemetry"
1541
+ "opentelemetry-java": "OpenTelemetry",
1542
+ "spring-data-redis": "Spring Data Redis",
1543
+ "spring-data-mongodb": "Spring Data MongoDB",
1544
+ "spring-data-elasticsearch": "Spring Data Elasticsearch",
1545
+ "spring-data-neo4j": "Spring Data Neo4j",
1546
+ "spring-data-cassandra": "Spring Data Cassandra",
1547
+ "spring-data-couchbase": "Spring Data Couchbase",
1548
+ "spring-data-jdbc": "Spring Data JDBC",
1549
+ "spring-data-rest": "Spring Data REST",
1550
+ "spring-quartz": "Quartz Scheduler",
1551
+ "spring-pulsar": "Spring for Apache Pulsar",
1552
+ "spring-integration": "Spring Integration",
1553
+ "spring-websocket": "Spring WebSocket",
1554
+ "spring-rsocket": "Spring RSocket",
1555
+ "spring-hateoas": "Spring HATEOAS",
1556
+ "spring-session-redis": "Spring Session Redis",
1557
+ "spring-session-jdbc": "Spring Session JDBC",
1558
+ "spring-ldap": "Spring LDAP",
1559
+ "spring-oauth2-client": "Spring Security OAuth2 Client",
1560
+ "spring-saml2": "Spring Security SAML2",
1561
+ "spring-restclient": "Spring REST Client"
1338
1562
  },
1339
1563
  javaTestingLibraries: {
1340
1564
  junit5: "JUnit 5",
@@ -1398,27 +1622,56 @@ const EXACT_LABEL_OVERRIDES = {
1398
1622
  azure: "Azure",
1399
1623
  aws: "AWS"
1400
1624
  },
1625
+ dotnetLibraries: {
1626
+ automapper: "AutoMapper",
1627
+ mediatr: "MediatR",
1628
+ fastendpoints: "FastEndpoints",
1629
+ "api-versioning": "ASP.NET API Versioning",
1630
+ scalar: "Scalar",
1631
+ polly: "Polly",
1632
+ masstransit: "MassTransit",
1633
+ rebus: "Rebus",
1634
+ coravel: "Coravel",
1635
+ "magic-onion": "MagicOnion",
1636
+ "prometheus-net": "prometheus-net",
1637
+ seq: "Seq",
1638
+ "application-insights": "Application Insights",
1639
+ sentry: "Sentry",
1640
+ "mongodb-driver": "MongoDB Driver",
1641
+ nhibernate: "NHibernate",
1642
+ mapster: "Mapster",
1643
+ scrutor: "Scrutor",
1644
+ refit: "Refit",
1645
+ "fluent-email": "FluentEmail"
1646
+ },
1401
1647
  elixirWebFramework: {
1402
1648
  phoenix: "Phoenix",
1403
1649
  "phoenix-live-view": "Phoenix LiveView"
1404
1650
  },
1405
1651
  elixirOrm: {
1406
1652
  ecto: "Ecto",
1407
- "ecto-sql": "Ecto SQL"
1653
+ "ecto-sql": "Ecto SQL",
1654
+ myxql: "MyXQL",
1655
+ ecto_sqlite3: "ecto_sqlite3"
1408
1656
  },
1409
1657
  elixirAuth: {
1410
1658
  "phx-gen-auth": "phx.gen.auth",
1411
1659
  ueberauth: "Ueberauth",
1412
- guardian: "Guardian"
1660
+ guardian: "Guardian",
1661
+ pow: "Pow"
1413
1662
  },
1414
1663
  elixirApi: {
1415
1664
  rest: "Phoenix REST",
1416
1665
  absinthe: "Absinthe GraphQL",
1417
- grpc: "gRPC (grpc-elixir)"
1666
+ grpc: "gRPC (grpc-elixir)",
1667
+ open_api_spex: "OpenApiSpex"
1418
1668
  },
1419
1669
  elixirLibraries: {
1420
1670
  broadway: "Broadway",
1421
- nx: "Nx (Numerical Elixir)"
1671
+ nx: "Nx (Numerical Elixir)",
1672
+ ex_aws: "ExAws",
1673
+ floki: "Floki",
1674
+ rustler: "Rustler"
1422
1675
  },
1423
1676
  elixirRealtime: {
1424
1677
  channels: "Phoenix Channels",
@@ -1436,30 +1689,48 @@ const EXACT_LABEL_OVERRIDES = {
1436
1689
  },
1437
1690
  elixirHttp: {
1438
1691
  req: "Req",
1439
- finch: "Finch"
1692
+ finch: "Finch",
1693
+ tesla: "Tesla"
1440
1694
  },
1441
1695
  elixirJson: { jason: "Jason" },
1442
- elixirEmail: { swoosh: "Swoosh" },
1696
+ elixirEmail: {
1697
+ swoosh: "Swoosh",
1698
+ bamboo: "Bamboo"
1699
+ },
1443
1700
  elixirCaching: {
1444
1701
  cachex: "Cachex",
1445
- nebulex: "Nebulex"
1702
+ nebulex: "Nebulex",
1703
+ redix: "Redix"
1446
1704
  },
1447
1705
  elixirObservability: {
1448
1706
  telemetry: "Telemetry",
1449
1707
  opentelemetry: "OpenTelemetry",
1450
- prom_ex: "PromEx"
1708
+ prom_ex: "PromEx",
1709
+ sentry: "Sentry"
1451
1710
  },
1452
1711
  elixirTesting: {
1453
1712
  ex_unit: "ExUnit",
1454
1713
  mox: "Mox",
1455
1714
  bypass: "Bypass",
1456
- wallaby: "Wallaby"
1715
+ wallaby: "Wallaby",
1716
+ stream_data: "StreamData",
1717
+ ex_machina: "ExMachina"
1457
1718
  },
1458
1719
  elixirQuality: {
1459
1720
  credo: "Credo",
1460
1721
  dialyxir: "Dialyxir",
1461
- sobelow: "Sobelow"
1462
- },
1722
+ sobelow: "Sobelow",
1723
+ excoveralls: "ExCoveralls",
1724
+ mix_audit: "MixAudit"
1725
+ },
1726
+ elixirI18n: { gettext: "Gettext" },
1727
+ elixirHttpServer: {
1728
+ bandit: "Bandit",
1729
+ cowboy: "Cowboy"
1730
+ },
1731
+ elixirApplicationFramework: { ash: "Ash Framework" },
1732
+ elixirDocumentation: { ex_doc: "ExDoc" },
1733
+ elixirClustering: { libcluster: "libcluster" },
1463
1734
  elixirDeploy: {
1464
1735
  docker: "Docker",
1465
1736
  fly: "Fly.io",
@@ -1569,8 +1840,10 @@ const OPTION_CATEGORY_METADATA = {
1569
1840
  mobilePush: buildCategoryMetadata("mobilePush"),
1570
1841
  mobileOTA: buildCategoryMetadata("mobileOTA"),
1571
1842
  mobileDeepLinking: buildCategoryMetadata("mobileDeepLinking"),
1843
+ mobileLibraries: buildCategoryMetadata("mobileLibraries"),
1572
1844
  codeQuality: buildCategoryMetadata("codeQuality"),
1573
1845
  documentation: buildCategoryMetadata("documentation"),
1846
+ appShells: buildCategoryMetadata("appShells"),
1574
1847
  appPlatforms: buildCategoryMetadata("appPlatforms"),
1575
1848
  packageManager: buildCategoryMetadata("packageManager"),
1576
1849
  workspaceShape: buildCategoryMetadata("workspaceShape"),
@@ -1616,6 +1889,13 @@ const OPTION_CATEGORY_METADATA = {
1616
1889
  pythonRealtime: buildCategoryMetadata("pythonRealtime"),
1617
1890
  pythonObservability: buildCategoryMetadata("pythonObservability"),
1618
1891
  pythonCli: buildCategoryMetadata("pythonCli"),
1892
+ pythonCloudSdk: buildCategoryMetadata("pythonCloudSdk"),
1893
+ pythonHttpClient: buildCategoryMetadata("pythonHttpClient"),
1894
+ pythonData: buildCategoryMetadata("pythonData"),
1895
+ pythonMedia: buildCategoryMetadata("pythonMedia"),
1896
+ pythonServer: buildCategoryMetadata("pythonServer"),
1897
+ pythonPackageManager: buildCategoryMetadata("pythonPackageManager"),
1898
+ pythonMessageQueue: buildCategoryMetadata("pythonMessageQueue"),
1619
1899
  goWebFramework: buildCategoryMetadata("goWebFramework"),
1620
1900
  goOrm: buildCategoryMetadata("goOrm"),
1621
1901
  goApi: buildCategoryMetadata("goApi"),
@@ -1628,6 +1908,12 @@ const OPTION_CATEGORY_METADATA = {
1628
1908
  goCaching: buildCategoryMetadata("goCaching"),
1629
1909
  goConfig: buildCategoryMetadata("goConfig"),
1630
1910
  goObservability: buildCategoryMetadata("goObservability"),
1911
+ goValidation: buildCategoryMetadata("goValidation"),
1912
+ goQuality: buildCategoryMetadata("goQuality"),
1913
+ goMigrations: buildCategoryMetadata("goMigrations"),
1914
+ goTemplating: buildCategoryMetadata("goTemplating"),
1915
+ goProtoTooling: buildCategoryMetadata("goProtoTooling"),
1916
+ goDI: buildCategoryMetadata("goDI"),
1631
1917
  javaLanguage: buildCategoryMetadata("javaLanguage"),
1632
1918
  javaWebFramework: buildCategoryMetadata("javaWebFramework"),
1633
1919
  javaBuildTool: buildCategoryMetadata("javaBuildTool"),
@@ -1648,6 +1934,7 @@ const OPTION_CATEGORY_METADATA = {
1648
1934
  dotnetValidation: buildCategoryMetadata("dotnetValidation"),
1649
1935
  dotnetCaching: buildCategoryMetadata("dotnetCaching"),
1650
1936
  dotnetDeploy: buildCategoryMetadata("dotnetDeploy"),
1937
+ dotnetLibraries: buildCategoryMetadata("dotnetLibraries"),
1651
1938
  elixirWebFramework: buildCategoryMetadata("elixirWebFramework"),
1652
1939
  elixirOrm: buildCategoryMetadata("elixirOrm"),
1653
1940
  elixirAuth: buildCategoryMetadata("elixirAuth"),
@@ -1662,6 +1949,11 @@ const OPTION_CATEGORY_METADATA = {
1662
1949
  elixirObservability: buildCategoryMetadata("elixirObservability"),
1663
1950
  elixirTesting: buildCategoryMetadata("elixirTesting"),
1664
1951
  elixirQuality: buildCategoryMetadata("elixirQuality"),
1952
+ elixirI18n: buildCategoryMetadata("elixirI18n"),
1953
+ elixirHttpServer: buildCategoryMetadata("elixirHttpServer"),
1954
+ elixirApplicationFramework: buildCategoryMetadata("elixirApplicationFramework"),
1955
+ elixirDocumentation: buildCategoryMetadata("elixirDocumentation"),
1956
+ elixirClustering: buildCategoryMetadata("elixirClustering"),
1665
1957
  elixirDeploy: buildCategoryMetadata("elixirDeploy"),
1666
1958
  elixirLibraries: buildCategoryMetadata("elixirLibraries")
1667
1959
  };
@@ -1720,6 +2012,8 @@ const PARAGLIDE_COMPATIBLE_FRONTENDS = new Set([
1720
2012
  "tanstack-start",
1721
2013
  "react-router",
1722
2014
  "react-vite",
2015
+ "vanilla-vite",
2016
+ "vue",
1723
2017
  "svelte",
1724
2018
  "solid",
1725
2019
  "solid-start",
@@ -2237,6 +2531,19 @@ const analyzeStackCompatibility = (stack) => {
2237
2531
  }
2238
2532
  }
2239
2533
  if (nextStack.backend !== "convex" && nextStack.backend !== "none") {
2534
+ if (nextStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend)) && [
2535
+ "trpc",
2536
+ "orpc",
2537
+ "ts-rest",
2538
+ "garph"
2539
+ ].includes(nextStack.api)) {
2540
+ nextStack.api = "graphql-yoga";
2541
+ changed = true;
2542
+ changes.push({
2543
+ category: "api",
2544
+ message: "API set to 'GraphQL Yoga' (supported by standalone Vite frontends)"
2545
+ });
2546
+ }
2240
2547
  if (nextStack.webFrontend.some((f) => [
2241
2548
  "nuxt",
2242
2549
  "svelte",
@@ -2365,6 +2672,33 @@ const analyzeStackCompatibility = (stack) => {
2365
2672
  });
2366
2673
  }
2367
2674
  }
2675
+ if (nextStack.payments === "paypal") {
2676
+ const hasWebFrontend = nextStack.webFrontend.some((f) => f !== "none");
2677
+ if (!hasWebFrontend || ["none", "convex"].includes(nextStack.backend)) {
2678
+ nextStack.payments = "none";
2679
+ changed = true;
2680
+ changes.push({
2681
+ category: "payments",
2682
+ message: hasWebFrontend ? "Payments set to 'None' (PayPal requires a standalone or fullstack backend)" : "Payments set to 'None' (PayPal requires a web frontend)"
2683
+ });
2684
+ }
2685
+ }
2686
+ if (["openai-sdk", "anthropic-sdk"].includes(nextStack.aiSdk) && ["none", "convex"].includes(nextStack.backend)) {
2687
+ nextStack.aiSdk = "none";
2688
+ changed = true;
2689
+ changes.push({
2690
+ category: "ai",
2691
+ message: "AI SDK set to 'None' (direct provider SDKs require a backend)"
2692
+ });
2693
+ }
2694
+ if (nextStack.realtime === "ws" && nextStack.backend !== "express") {
2695
+ nextStack.realtime = "none";
2696
+ changed = true;
2697
+ changes.push({
2698
+ category: "realtime",
2699
+ message: "Realtime set to 'None' (the ws integration requires Express)"
2700
+ });
2701
+ }
2368
2702
  if (nextStack.email !== "none") {
2369
2703
  if (nextStack.backend === "convex") {
2370
2704
  nextStack.email = "none";
@@ -2634,6 +2968,14 @@ const analyzeStackCompatibility = (stack) => {
2634
2968
  message
2635
2969
  });
2636
2970
  }
2971
+ if ((nextStack.mobileLibraries?.length ?? 0) > 0) {
2972
+ nextStack.mobileLibraries = [];
2973
+ changed = true;
2974
+ changes.push({
2975
+ category: "mobileLibraries",
2976
+ message: "Mobile libraries cleared (no native frontend)"
2977
+ });
2978
+ }
2637
2979
  } else {
2638
2980
  if (nextStack.mobileNavigation === "none") {
2639
2981
  nextStack.mobileNavigation = "expo-router";
@@ -2668,6 +3010,23 @@ const analyzeStackCompatibility = (stack) => {
2668
3010
  });
2669
3011
  }
2670
3012
  }
3013
+ const styledComponentsFrontends = new Set([
3014
+ "tanstack-router",
3015
+ "react-router",
3016
+ "react-vite",
3017
+ "tanstack-start",
3018
+ "next",
3019
+ "vinext",
3020
+ "redwood"
3021
+ ]);
3022
+ if (nextStack.cssFramework === "styled-components" && !nextStack.webFrontend.some((frontend) => styledComponentsFrontends.has(frontend))) {
3023
+ nextStack.cssFramework = "none";
3024
+ changed = true;
3025
+ changes.push({
3026
+ category: "cssFramework",
3027
+ message: "CSS framework set to 'None' (styled-components requires a React frontend)"
3028
+ });
3029
+ }
2671
3030
  if ([
2672
3031
  "shadcn-ui",
2673
3032
  "shadcn-svelte",
@@ -2770,6 +3129,26 @@ const analyzeStackCompatibility = (stack) => {
2770
3129
  message: "Tauri removed (requires compatible frontend)"
2771
3130
  });
2772
3131
  }
3132
+ for (const platform of ["electron", "capacitor"]) if (nextStack.appPlatforms.includes(platform) && !validateAddonCompatibility(platform, nextStack.webFrontend).isCompatible) {
3133
+ nextStack.appPlatforms = nextStack.appPlatforms.filter((addon) => addon !== platform);
3134
+ changed = true;
3135
+ changes.push({
3136
+ category: "appPlatforms",
3137
+ message: `${platform === "electron" ? "Electron" : "Capacitor"} removed (requires compatible frontend)`
3138
+ });
3139
+ }
3140
+ if (nextStack.appPlatforms.includes("graphql-codegen") && ![
3141
+ "garph",
3142
+ "graphql-yoga",
3143
+ "apollo-server"
3144
+ ].includes(nextStack.api) && !nextStack.webFrontend.includes("redwood")) {
3145
+ nextStack.appPlatforms = nextStack.appPlatforms.filter((platform) => platform !== "graphql-codegen");
3146
+ changed = true;
3147
+ changes.push({
3148
+ category: "appPlatforms",
3149
+ message: "GraphQL Code Generator removed (requires a GraphQL API selection)"
3150
+ });
3151
+ }
2773
3152
  if (nextStack.examples.includes("ai")) {
2774
3153
  if (nextStack.webFrontend.includes("solid") || nextStack.webFrontend.includes("solid-start")) {
2775
3154
  nextStack.examples = nextStack.examples.filter((e) => e !== "ai");
@@ -2818,7 +3197,33 @@ const analyzeStackCompatibility = (stack) => {
2818
3197
  });
2819
3198
  }
2820
3199
  }
2821
- if (nextStack.webFrontend.includes("fresh")) {
3200
+ const isFresh = nextStack.webFrontend.includes("fresh");
3201
+ const hasStandaloneViteFrontend = nextStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend));
3202
+ if (hasStandaloneViteFrontend && nextStack.forms !== "none") {
3203
+ nextStack.forms = "none";
3204
+ changed = true;
3205
+ changes.push({
3206
+ category: "forms",
3207
+ message: "Forms set to 'None' (standalone Vue and Vanilla integrations are not wired yet)"
3208
+ });
3209
+ }
3210
+ if (hasStandaloneViteFrontend && nextStack.cms !== "none" && nextStack.cms !== "contentful") {
3211
+ nextStack.cms = "none";
3212
+ changed = true;
3213
+ changes.push({
3214
+ category: "cms",
3215
+ message: "CMS set to 'None' (standalone Vue and Vanilla CMS templates are not wired yet)"
3216
+ });
3217
+ }
3218
+ if (hasStandaloneViteFrontend && nextStack.featureFlags !== "none") {
3219
+ nextStack.featureFlags = "none";
3220
+ changed = true;
3221
+ changes.push({
3222
+ category: "featureFlags",
3223
+ message: "Feature flags set to 'None' (standalone Vue and Vanilla client integrations are not wired yet)"
3224
+ });
3225
+ }
3226
+ if (isFresh) {
2822
3227
  if (nextStack.forms === "tanstack-form") {
2823
3228
  nextStack.forms = "none";
2824
3229
  changed = true;
@@ -2858,6 +3263,62 @@ const analyzeStackCompatibility = (stack) => {
2858
3263
  message: "Python API framework set to 'None' (DRF and Django Ninja require Django)"
2859
3264
  });
2860
3265
  }
3266
+ if (nextStack.pythonOrm === "pymongo" && nextStack.database !== "mongodb") {
3267
+ nextStack.database = "mongodb";
3268
+ changed = true;
3269
+ changes.push({
3270
+ category: "pythonOrm",
3271
+ message: "Database set to MongoDB (required by PyMongo)"
3272
+ });
3273
+ }
3274
+ if (nextStack.pythonOrm === "pymongo" && nextStack.dbSetup !== "mongodb-atlas" && nextStack.dbSetup !== "none" && nextStack.dbSetup !== "docker") {
3275
+ nextStack.dbSetup = "none";
3276
+ changed = true;
3277
+ changes.push({
3278
+ category: "pythonOrm",
3279
+ message: "DB Setup set to 'None' (incompatible with MongoDB)"
3280
+ });
3281
+ }
3282
+ if (nextStack.database === "mongodb" && nextStack.pythonOrm !== "pymongo" && nextStack.pythonOrm !== "none") {
3283
+ nextStack.database = "sqlite";
3284
+ changed = true;
3285
+ changes.push({
3286
+ category: "database",
3287
+ message: `Database set to SQLite (MongoDB requires PyMongo, not ${nextStack.pythonOrm})`
3288
+ });
3289
+ }
3290
+ if ((nextStack.pythonWebFramework === "none" || nextStack.pythonWebFramework === "aiohttp" || nextStack.pythonWebFramework === "starlette" || nextStack.pythonWebFramework === "streamlit") && nextStack.pythonGraphql !== "none") {
3291
+ nextStack.pythonGraphql = "none";
3292
+ changed = true;
3293
+ changes.push({
3294
+ category: "pythonGraphql",
3295
+ message: "GraphQL set to 'None' (only wired for FastAPI, Django, Flask, and Litestar)"
3296
+ });
3297
+ }
3298
+ if ((nextStack.pythonWebFramework === "none" || nextStack.pythonWebFramework === "aiohttp" || nextStack.pythonWebFramework === "starlette" || nextStack.pythonWebFramework === "streamlit") && nextStack.pythonAuth !== "none") {
3299
+ nextStack.pythonAuth = "none";
3300
+ changed = true;
3301
+ changes.push({
3302
+ category: "pythonAuth",
3303
+ message: `Auth set to 'None' (auth routes are not wired for ${nextStack.pythonWebFramework})`
3304
+ });
3305
+ }
3306
+ if ((nextStack.pythonWebFramework === "streamlit" || nextStack.pythonWebFramework === "none") && nextStack.pythonObservability === "prometheus-client") {
3307
+ nextStack.pythonObservability = "none";
3308
+ changed = true;
3309
+ changes.push({
3310
+ category: "pythonObservability",
3311
+ message: "Observability set to 'None' (prometheus-client needs an HTTP server to expose /metrics)"
3312
+ });
3313
+ }
3314
+ if (nextStack.pythonServer === "gunicorn" && (nextStack.pythonWebFramework === "streamlit" || nextStack.pythonWebFramework === "none")) {
3315
+ nextStack.pythonServer = "none";
3316
+ changed = true;
3317
+ changes.push({
3318
+ category: "pythonServer",
3319
+ message: "Production server set to 'None' (Gunicorn requires a WSGI, ASGI, or aiohttp app)"
3320
+ });
3321
+ }
2861
3322
  }
2862
3323
  if (nextStack.ecosystem === "java") {
2863
3324
  if (nextStack.javaBuildTool === "none") {
@@ -2972,7 +3433,9 @@ const analyzeStackCompatibility = (stack) => {
2972
3433
  "elixirAuth",
2973
3434
  "elixirApi",
2974
3435
  "elixirRealtime",
2975
- "elixirObservability"
3436
+ "elixirObservability",
3437
+ "elixirI18n",
3438
+ "elixirHttpServer"
2976
3439
  ]) {
2977
3440
  const value = nextStack[key];
2978
3441
  if (key !== "elixirObservability" ? value !== "none" : value === "phoenix-telemetry") {
@@ -3034,6 +3497,19 @@ const analyzeStackCompatibility = (stack) => {
3034
3497
  message: "Elixir auth set to 'None' (phx.gen.auth requires Ecto SQL with PostgreSQL)"
3035
3498
  });
3036
3499
  }
3500
+ const sqlBackedElixirOrms = new Set([
3501
+ "ecto-sql",
3502
+ "myxql",
3503
+ "ecto_sqlite3"
3504
+ ]);
3505
+ if (nextStack.elixirAuth === "pow" && !sqlBackedElixirOrms.has(nextStack.elixirOrm)) {
3506
+ nextStack.elixirAuth = "none";
3507
+ changed = true;
3508
+ changes.push({
3509
+ category: "elixirAuth",
3510
+ message: "Elixir auth set to 'None' (Pow requires an Ecto SQL repository)"
3511
+ });
3512
+ }
3037
3513
  }
3038
3514
  if (nextStack.webDeploy !== "none" && !nextStack.webFrontend.some((f) => f !== "none")) {
3039
3515
  nextStack.webDeploy = "none";
@@ -3043,6 +3519,16 @@ const analyzeStackCompatibility = (stack) => {
3043
3519
  message: "Web deploy set to 'None' (no web frontend)"
3044
3520
  });
3045
3521
  }
3522
+ const unsupportedWebDeployFrontend = getUnsupportedWebDeployFrontend(nextStack.webDeploy, nextStack.webFrontend);
3523
+ if (nextStack.webDeploy !== "none" && unsupportedWebDeployFrontend) {
3524
+ const webDeploy = nextStack.webDeploy;
3525
+ nextStack.webDeploy = "none";
3526
+ changed = true;
3527
+ changes.push({
3528
+ category: "webDeploy",
3529
+ message: `Web deploy set to 'None' ('${webDeploy}' is not wired for the '${unsupportedWebDeployFrontend}' frontend)`
3530
+ });
3531
+ }
3046
3532
  if (nextStack.serverDeploy === "cloudflare") {
3047
3533
  if (nextStack.runtime !== "workers" || nextStack.backend !== "hono") {
3048
3534
  nextStack.serverDeploy = "none";
@@ -3094,6 +3580,16 @@ const analyzeStackCompatibility = (stack) => {
3094
3580
  * - Follow CLI behavior: filter options based on UPSTREAM selections only
3095
3581
  */
3096
3582
  const getDisabledReason = (currentStack, category, optionId) => {
3583
+ const hasStandaloneViteFrontend = currentStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend));
3584
+ if (category === "api" && hasStandaloneViteFrontend && [
3585
+ "trpc",
3586
+ "orpc",
3587
+ "ts-rest",
3588
+ "garph"
3589
+ ].includes(optionId)) return "Standalone Vite frontends support only GraphQL and OpenAPI API integrations";
3590
+ if (category === "forms" && hasStandaloneViteFrontend && optionId !== "none") return "Form library integrations are not yet wired for standalone Vue or Vanilla Vite";
3591
+ if (category === "cms" && hasStandaloneViteFrontend && optionId !== "none" && optionId !== "contentful") return "CMS integrations other than Contentful are not yet wired for standalone Vue or Vanilla Vite";
3592
+ if (category === "featureFlags" && hasStandaloneViteFrontend && optionId !== "none") return "Feature flag client integrations are not yet wired for standalone Vue or Vanilla Vite";
3097
3593
  if (currentStack.backend === "convex") {
3098
3594
  if (category === "runtime" && optionId !== "none") return "Convex provides its own runtime";
3099
3595
  if (category === "database" && optionId !== "none") return "Convex provides its own database";
@@ -3129,6 +3625,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
3129
3625
  "mobilePush",
3130
3626
  "mobileOTA",
3131
3627
  "mobileDeepLinking",
3628
+ "mobileLibraries",
3132
3629
  "auth",
3133
3630
  "payments",
3134
3631
  "packageManager",
@@ -3173,6 +3670,21 @@ const getDisabledReason = (currentStack, category, optionId) => {
3173
3670
  if (category === "caching" && optionId === "upstash-redis") return "The Upstash Redis integration is Java-only in the Java ecosystem scaffold";
3174
3671
  if (category === "observability" && optionId === "sentry") return "The Sentry integration is Java-only in the Java ecosystem scaffold";
3175
3672
  }
3673
+ if (currentStack.ecosystem === "rust") {
3674
+ const filterOnlyFramework = currentStack.rustWebFramework === "warp" || currentStack.rustWebFramework === "salvo";
3675
+ if (category === "rustApi" && filterOnlyFramework && optionId !== "none" && optionId !== "jsonrpsee") return "Warp and Salvo currently support REST or the standalone jsonrpsee server";
3676
+ 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";
3677
+ if (category === "rustApi" && currentStack.rustWebFramework === "loco" && optionId === "jsonrpsee") return "Loco owns the server boot sequence; jsonrpsee is available with the other Rust frameworks";
3678
+ if (category === "rustWebFramework" && optionId === "loco" && currentStack.rustApi === "jsonrpsee") return "Loco owns the server boot sequence and cannot start the generated jsonrpsee server";
3679
+ if (category === "rustAuth" && optionId === "tower-sessions" && currentStack.rustWebFramework !== "axum") return "The generated tower-sessions middleware is wired specifically for Axum";
3680
+ if (category === "rustWebFramework" && optionId !== "axum" && currentStack.rustAuth === "tower-sessions") return "tower-sessions requires the generated Axum middleware stack";
3681
+ if (category === "rustAuth" && optionId === "torii" && currentStack.rustOrm === "rusqlite") return "Torii's sqlx-based storage conflicts with rusqlite (both link the native sqlite3 library)";
3682
+ if (category === "rustOrm" && optionId === "rusqlite" && currentStack.rustAuth === "torii") return "rusqlite conflicts with Torii's sqlx-based storage (both link the native sqlite3 library)";
3683
+ }
3684
+ if (category === "pythonApi") {
3685
+ if (optionId !== "none" && currentStack.pythonWebFramework !== "django") return "Python API frameworks currently require Django";
3686
+ }
3687
+ if (category === "pythonServer" && optionId === "gunicorn" && (currentStack.pythonWebFramework === "streamlit" || currentStack.pythonWebFramework === "none")) return "Gunicorn requires a WSGI, ASGI, or aiohttp application";
3176
3688
  const graphDisabledReason = category === "payments" && optionId === "revenuecat" || category === "i18n" && optionId === "intlayer" ? {
3177
3689
  handled: false,
3178
3690
  authoritative: false,
@@ -3351,12 +3863,17 @@ const getDisabledReason = (currentStack, category, optionId) => {
3351
3863
  if (category === "payments" && optionId === "revenuecat") {
3352
3864
  if (!hasRevenueCatCompatibleNativeFrontend(currentStack.nativeFrontend)) return "RevenueCat payments requires a native frontend (native-bare, native-uniwind, or native-unistyles)";
3353
3865
  }
3866
+ if (category === "payments" && optionId === "paypal") {
3867
+ if (!currentStack.webFrontend.some((f) => f !== "none")) return "PayPal requires a web frontend";
3868
+ if (["none", "convex"].includes(currentStack.backend)) return "PayPal checkout requires a standalone or fullstack backend";
3869
+ }
3354
3870
  if (category === "cms" && optionId === "payload") {
3355
3871
  if (!currentStack.webFrontend.includes("next")) return "Payload CMS v3 requires Next.js";
3356
3872
  }
3357
3873
  if (category === "cms" && optionId === "keystatic") {
3358
3874
  if (!currentStack.webFrontend.includes("next")) return "Keystatic is currently scaffolded for Next.js only because @keystatic/astro is not Astro 7-compatible yet.";
3359
3875
  }
3876
+ if (category === "realtime" && optionId === "ws" && currentStack.backend !== "express") return "The ws integration is currently wired for the Express backend";
3360
3877
  if (category === "email" && optionId !== "none") {
3361
3878
  if (currentStack.ecosystem !== "typescript") return null;
3362
3879
  if (currentStack.backend === "convex") return "Email integration is not available with Convex backend";
@@ -3382,6 +3899,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
3382
3899
  if (currentStack.ecosystem !== "typescript") return "Vector database is only available for the TypeScript ecosystem";
3383
3900
  }
3384
3901
  if (category === "ai" && requiresChatSdkVercelAI(currentStack) && optionId !== "vercel-ai") return "Chat SDK example (Nuxt/Hono profile) requires Vercel AI SDK in v1";
3902
+ 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";
3385
3903
  if (category === "ai" && optionId === "tanstack-ai") {
3386
3904
  const compatibleFrontends = [
3387
3905
  "tanstack-router",
@@ -3403,11 +3921,32 @@ const getDisabledReason = (currentStack, category, optionId) => {
3403
3921
  "tanstack-db",
3404
3922
  "tanstack-pacer"
3405
3923
  ].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)";
3924
+ if (optionId === "graphql-codegen" && ![
3925
+ "garph",
3926
+ "graphql-yoga",
3927
+ "apollo-server"
3928
+ ].includes(currentStack.api) && !currentStack.webFrontend.includes("redwood")) return "GraphQL Code Generator requires a GraphQL API selection";
3929
+ if (optionId === "openapi-typescript" && currentStack.api !== "openapi") return "openapi-typescript requires the OpenAPI API selection";
3930
+ if (optionId === "openapi-typescript" && currentStack.backend === "self") return "openapi-typescript requires a standalone backend that exposes an OpenAPI schema";
3931
+ if (optionId === "apollo-client" && ![
3932
+ "garph",
3933
+ "graphql-yoga",
3934
+ "apollo-server"
3935
+ ].includes(currentStack.api)) return "Apollo Client requires a GraphQL API selection";
3406
3936
  }
3407
3937
  if (category === "cssFramework") {
3408
3938
  if (!currentStack.webFrontend.some((f) => f !== "none")) {
3409
3939
  if (optionId !== "none") return "CSS framework requires a web frontend";
3410
3940
  }
3941
+ if (optionId === "styled-components" && !currentStack.webFrontend.some((f) => [
3942
+ "tanstack-router",
3943
+ "react-router",
3944
+ "react-vite",
3945
+ "tanstack-start",
3946
+ "next",
3947
+ "vinext",
3948
+ "redwood"
3949
+ ].includes(f))) return "styled-components requires a React frontend";
3411
3950
  if ([
3412
3951
  "shadcn-ui",
3413
3952
  "shadcn-svelte",
@@ -3422,7 +3961,8 @@ const getDisabledReason = (currentStack, category, optionId) => {
3422
3961
  "mobileTesting",
3423
3962
  "mobilePush",
3424
3963
  "mobileOTA",
3425
- "mobileDeepLinking"
3964
+ "mobileDeepLinking",
3965
+ "mobileLibraries"
3426
3966
  ]).has(category)) {
3427
3967
  if (!currentStack.nativeFrontend.some((f) => f !== "none") && optionId !== "none") return `${getCategoryDisplayName(category)} requires a native Expo frontend`;
3428
3968
  if (category === "mobileNavigation" && optionId === "react-navigation") return null;
@@ -3540,9 +4080,16 @@ const getDisabledReason = (currentStack, category, optionId) => {
3540
4080
  if (unsupportedFrontend) return `Intlayer is not yet wired for the '${unsupportedFrontend}' frontend`;
3541
4081
  }
3542
4082
  }
3543
- if (category === "pythonApi") {
3544
- if (optionId !== "none" && currentStack.pythonWebFramework !== "django") return "Python API frameworks currently require Django";
3545
- }
4083
+ if (category === "goMigrations" && optionId !== "none" && currentStack.ecosystem === "go" && ![
4084
+ "sqlite",
4085
+ "postgres",
4086
+ "mysql"
4087
+ ].includes(currentStack.database)) return "Go migrations require SQLite, PostgreSQL, or MySQL";
4088
+ if (category === "database" && currentStack.ecosystem === "go" && currentStack.goMigrations !== "none" && ![
4089
+ "sqlite",
4090
+ "postgres",
4091
+ "mysql"
4092
+ ].includes(optionId)) return "The selected Go migration tool requires SQLite, PostgreSQL, or MySQL";
3546
4093
  if (category === "javaWebFramework") {
3547
4094
  if (optionId !== "none" && currentStack.javaBuildTool === "none") return "Java web frameworks require Maven or Gradle";
3548
4095
  }
@@ -3593,11 +4140,30 @@ const getDisabledReason = (currentStack, category, optionId) => {
3593
4140
  "elixirObservability",
3594
4141
  "elixirTesting",
3595
4142
  "elixirQuality",
4143
+ "elixirI18n",
4144
+ "elixirHttpServer",
4145
+ "elixirApplicationFramework",
4146
+ "elixirDocumentation",
4147
+ "elixirClustering",
3596
4148
  "elixirDeploy"
3597
4149
  ]).has(category) && optionId !== "none") {
3598
4150
  if (currentStack.ecosystem !== "elixir") return "Elixir options only apply when the Elixir ecosystem is selected";
3599
4151
  }
3600
4152
  if (category === "elixirTesting" && optionId === "wallaby" && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework === "none") return "Wallaby browser tests require Phoenix";
4153
+ if (category === "elixirTesting" && optionId === "ex_machina" && currentStack.ecosystem === "elixir" && ![
4154
+ "ecto-sql",
4155
+ "myxql",
4156
+ "ecto_sqlite3"
4157
+ ].includes(currentStack.elixirOrm)) return "ExMachina requires an Ecto SQL repository";
4158
+ if (category === "elixirAuth" && optionId === "pow" && currentStack.ecosystem === "elixir" && (currentStack.elixirWebFramework === "none" || ![
4159
+ "ecto-sql",
4160
+ "myxql",
4161
+ "ecto_sqlite3"
4162
+ ].includes(currentStack.elixirOrm))) return "Pow requires Phoenix and an Ecto SQL repository";
4163
+ if ((category === "elixirApi" && optionId === "open_api_spex" || category === "elixirI18n" && optionId === "gettext") && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework === "none") return `${getCategoryDisplayName(category)} requires Phoenix`;
4164
+ 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";
4165
+ if (category === "elixirJobs" && optionId === "oban" && currentStack.ecosystem === "elixir" && currentStack.elixirOrm !== "ecto-sql") return "Oban requires the PostgreSQL Ecto SQL option";
4166
+ if (category === "elixirOrm" && ["myxql", "ecto_sqlite3"].includes(optionId) && currentStack.ecosystem === "elixir" && currentStack.elixirJobs === "oban") return "Oban requires PostgreSQL-backed Ecto SQL";
3601
4167
  if (category === "elixirWebFramework" && optionId !== "none" && currentStack.ecosystem !== "elixir") return "Elixir web frameworks are available only in the Elixir ecosystem";
3602
4168
  if (category === "elixirJson" && optionId === "none" && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework !== "none") return "Phoenix JSON scaffolds require Jason";
3603
4169
  return null;
@@ -3642,6 +4208,11 @@ const ELIXIR_GRAPH_DISABLED_REASON_ROLES = {
3642
4208
  elixirObservability: "observability",
3643
4209
  elixirTesting: "testing",
3644
4210
  elixirQuality: "codeQuality",
4211
+ elixirI18n: "i18n",
4212
+ elixirHttpServer: "runtime",
4213
+ elixirApplicationFramework: "libraries",
4214
+ elixirDocumentation: "documentation",
4215
+ elixirClustering: "config",
3645
4216
  elixirDeploy: "deploy"
3646
4217
  };
3647
4218
  function getElixirGraphBinding(currentStack, category) {
@@ -3861,6 +4432,15 @@ const GRAPH_DISABLED_REASON_BINDINGS = {
3861
4432
  authoritative: true,
3862
4433
  missingOwnerReason: "Mobile deep linking requires a native Expo frontend"
3863
4434
  },
4435
+ mobileLibraries: {
4436
+ role: "libraries",
4437
+ ecosystem: "react-native",
4438
+ ownerRole: "mobile",
4439
+ ownerEcosystem: "react-native",
4440
+ authoritative: true,
4441
+ missingOwnerReason: "Mobile libraries require a native Expo frontend",
4442
+ candidateIdPrefix: "candidate:native"
4443
+ },
3864
4444
  javaBuildTool: {
3865
4445
  role: "buildTool",
3866
4446
  ecosystem: "java",
@@ -3980,6 +4560,62 @@ const GRAPH_DISABLED_REASON_BINDINGS = {
3980
4560
  currentEcosystem: "python",
3981
4561
  authoritative: true
3982
4562
  },
4563
+ pythonCloudSdk: {
4564
+ role: "cloudSdk",
4565
+ ecosystem: "python",
4566
+ ownerRole: "backend",
4567
+ ownerEcosystem: "python",
4568
+ currentEcosystem: "python",
4569
+ authoritative: true
4570
+ },
4571
+ pythonHttpClient: {
4572
+ role: "httpClient",
4573
+ ecosystem: "python",
4574
+ ownerRole: "backend",
4575
+ ownerEcosystem: "python",
4576
+ currentEcosystem: "python",
4577
+ authoritative: true
4578
+ },
4579
+ pythonData: {
4580
+ role: "data",
4581
+ ecosystem: "python",
4582
+ ownerRole: "backend",
4583
+ ownerEcosystem: "python",
4584
+ currentEcosystem: "python",
4585
+ authoritative: true
4586
+ },
4587
+ pythonMedia: {
4588
+ role: "media",
4589
+ ecosystem: "python",
4590
+ ownerRole: "backend",
4591
+ ownerEcosystem: "python",
4592
+ currentEcosystem: "python",
4593
+ authoritative: true
4594
+ },
4595
+ pythonServer: {
4596
+ role: "server",
4597
+ ecosystem: "python",
4598
+ ownerRole: "backend",
4599
+ ownerEcosystem: "python",
4600
+ currentEcosystem: "python",
4601
+ authoritative: true
4602
+ },
4603
+ pythonPackageManager: {
4604
+ role: "packageManager",
4605
+ ecosystem: "python",
4606
+ ownerRole: "backend",
4607
+ ownerEcosystem: "python",
4608
+ currentEcosystem: "python",
4609
+ authoritative: true
4610
+ },
4611
+ pythonMessageQueue: {
4612
+ role: "messageQueue",
4613
+ ecosystem: "python",
4614
+ ownerRole: "backend",
4615
+ ownerEcosystem: "python",
4616
+ currentEcosystem: "python",
4617
+ authoritative: true
4618
+ },
3983
4619
  goTesting: {
3984
4620
  role: "testing",
3985
4621
  ecosystem: "go",
@@ -4030,6 +4666,54 @@ const GRAPH_DISABLED_REASON_BINDINGS = {
4030
4666
  authoritative: true,
4031
4667
  candidateIdPrefix: "candidate:native"
4032
4668
  },
4669
+ goValidation: {
4670
+ role: "validation",
4671
+ ecosystem: "go",
4672
+ ownerRole: "backend",
4673
+ ownerEcosystem: "go",
4674
+ currentEcosystem: "go",
4675
+ authoritative: true
4676
+ },
4677
+ goQuality: {
4678
+ role: "codeQuality",
4679
+ ecosystem: "go",
4680
+ ownerRole: "backend",
4681
+ ownerEcosystem: "go",
4682
+ currentEcosystem: "go",
4683
+ authoritative: true
4684
+ },
4685
+ goMigrations: {
4686
+ role: "migrations",
4687
+ ecosystem: "go",
4688
+ ownerRole: "backend",
4689
+ ownerEcosystem: "go",
4690
+ currentEcosystem: "go",
4691
+ authoritative: true
4692
+ },
4693
+ goTemplating: {
4694
+ role: "templating",
4695
+ ecosystem: "go",
4696
+ ownerRole: "backend",
4697
+ ownerEcosystem: "go",
4698
+ currentEcosystem: "go",
4699
+ authoritative: true
4700
+ },
4701
+ goProtoTooling: {
4702
+ role: "buildTool",
4703
+ ecosystem: "go",
4704
+ ownerRole: "backend",
4705
+ ownerEcosystem: "go",
4706
+ currentEcosystem: "go",
4707
+ authoritative: true
4708
+ },
4709
+ goDI: {
4710
+ role: "libraries",
4711
+ ecosystem: "go",
4712
+ ownerRole: "backend",
4713
+ ownerEcosystem: "go",
4714
+ currentEcosystem: "go",
4715
+ authoritative: true
4716
+ },
4033
4717
  dotnetOrm: {
4034
4718
  role: "orm",
4035
4719
  ecosystem: "dotnet",
@@ -4105,6 +4789,15 @@ const GRAPH_DISABLED_REASON_BINDINGS = {
4105
4789
  ownerEcosystem: "dotnet",
4106
4790
  currentEcosystem: "dotnet",
4107
4791
  authoritative: true
4792
+ },
4793
+ dotnetLibraries: {
4794
+ role: "libraries",
4795
+ ecosystem: "dotnet",
4796
+ ownerRole: "backend",
4797
+ ownerEcosystem: "dotnet",
4798
+ currentEcosystem: "dotnet",
4799
+ authoritative: true,
4800
+ candidateIdPrefix: "candidate:native"
4108
4801
  }
4109
4802
  };
4110
4803
  function compatibilityInputToGraphProjectConfig(currentStack) {
@@ -4165,6 +4858,8 @@ const WEB_FRAMEWORKS = [
4165
4858
  "tanstack-router",
4166
4859
  "react-router",
4167
4860
  "react-vite",
4861
+ "vanilla-vite",
4862
+ "vue",
4168
4863
  "tanstack-start",
4169
4864
  "next",
4170
4865
  "vinext",
@@ -4179,11 +4874,32 @@ const WEB_FRAMEWORKS = [
4179
4874
  "fresh",
4180
4875
  "none"
4181
4876
  ];
4877
+ const CODEGEN_COMPATIBLE_FRONTENDS = [
4878
+ "tanstack-router",
4879
+ "react-router",
4880
+ "react-vite",
4881
+ "vanilla-vite",
4882
+ "vue",
4883
+ "tanstack-start",
4884
+ "next",
4885
+ "vinext",
4886
+ "nuxt",
4887
+ "svelte",
4888
+ "solid",
4889
+ "solid-start",
4890
+ "astro",
4891
+ "qwik",
4892
+ "angular",
4893
+ "redwood",
4894
+ "fresh"
4895
+ ];
4182
4896
  const ADDON_COMPATIBILITY = {
4183
4897
  pwa: [
4184
4898
  "tanstack-router",
4185
4899
  "react-router",
4186
4900
  "react-vite",
4901
+ "vanilla-vite",
4902
+ "vue",
4187
4903
  "solid",
4188
4904
  "next",
4189
4905
  "vinext",
@@ -4197,6 +4913,8 @@ const ADDON_COMPATIBILITY = {
4197
4913
  "tanstack-router",
4198
4914
  "react-router",
4199
4915
  "react-vite",
4916
+ "vanilla-vite",
4917
+ "vue",
4200
4918
  "nuxt",
4201
4919
  "svelte",
4202
4920
  "solid",
@@ -4207,7 +4925,23 @@ const ADDON_COMPATIBILITY = {
4207
4925
  "redwood",
4208
4926
  "fresh"
4209
4927
  ],
4928
+ electron: [
4929
+ "tanstack-router",
4930
+ "react-vite",
4931
+ "vanilla-vite",
4932
+ "vue",
4933
+ "solid"
4934
+ ],
4935
+ capacitor: [
4936
+ "tanstack-router",
4937
+ "react-vite",
4938
+ "vanilla-vite",
4939
+ "vue",
4940
+ "solid"
4941
+ ],
4210
4942
  biome: [],
4943
+ eslint: [],
4944
+ prettier: [],
4211
4945
  husky: [],
4212
4946
  lefthook: [],
4213
4947
  turborepo: [],
@@ -4231,6 +4965,55 @@ const ADDON_COMPATIBILITY = {
4231
4965
  "svelte",
4232
4966
  "solid"
4233
4967
  ],
4968
+ axios: [
4969
+ "tanstack-router",
4970
+ "react-router",
4971
+ "react-vite",
4972
+ "vanilla-vite",
4973
+ "vue",
4974
+ "tanstack-start",
4975
+ "next",
4976
+ "vinext",
4977
+ "nuxt",
4978
+ "svelte",
4979
+ "solid",
4980
+ "solid-start",
4981
+ "astro",
4982
+ "qwik",
4983
+ "angular"
4984
+ ],
4985
+ firebase: [
4986
+ "tanstack-router",
4987
+ "react-router",
4988
+ "react-vite",
4989
+ "vanilla-vite",
4990
+ "vue",
4991
+ "tanstack-start",
4992
+ "next",
4993
+ "vinext",
4994
+ "nuxt",
4995
+ "svelte",
4996
+ "solid",
4997
+ "solid-start",
4998
+ "astro",
4999
+ "qwik",
5000
+ "angular"
5001
+ ],
5002
+ "graphql-codegen": CODEGEN_COMPATIBLE_FRONTENDS,
5003
+ "openapi-typescript": CODEGEN_COMPATIBLE_FRONTENDS,
5004
+ "apollo-client": [
5005
+ "tanstack-router",
5006
+ "react-router",
5007
+ "react-vite",
5008
+ "vue",
5009
+ "tanstack-start",
5010
+ "next",
5011
+ "vinext",
5012
+ "nuxt",
5013
+ "svelte",
5014
+ "solid",
5015
+ "solid-start"
5016
+ ],
4234
5017
  swr: [
4235
5018
  "tanstack-router",
4236
5019
  "react-router",
@@ -4334,6 +5117,7 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
4334
5117
  const includesAngular = frontends.includes("angular");
4335
5118
  const includesRedwood = frontends.includes("redwood");
4336
5119
  const includesFresh = frontends.includes("fresh");
5120
+ const includesStandaloneVite = frontends.includes("vanilla-vite") || frontends.includes("vue");
4337
5121
  const includesNative = frontends.some((frontend) => [
4338
5122
  "native-bare",
4339
5123
  "native-uniwind",
@@ -4356,6 +5140,12 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
4356
5140
  "garph",
4357
5141
  "none"
4358
5142
  ];
5143
+ if (includesStandaloneVite) return [
5144
+ "graphql-yoga",
5145
+ "apollo-server",
5146
+ "openapi",
5147
+ "none"
5148
+ ];
4359
5149
  if (includesQwik || includesAngular || includesRedwood || includesFresh) return ["graphql-yoga", "none"];
4360
5150
  const includesSolidStartApi = frontends.includes("solid-start");
4361
5151
  if (includesNuxt || includesSvelte || includesSolid || includesSolidStartApi) return [
@@ -4390,7 +5180,23 @@ function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration)
4390
5180
  const includesRedwood = frontends.includes("redwood");
4391
5181
  const includesFresh = frontends.includes("fresh");
4392
5182
  const includesSolidStart = frontends.includes("solid-start");
5183
+ const includesStandaloneVite = frontends.includes("vanilla-vite") || frontends.includes("vue");
4393
5184
  const isReactOnlyApi = api === "trpc" || api === "ts-rest" || api === "garph" || api === "apollo-server";
5185
+ if (includesStandaloneVite && (api === "trpc" || api === "orpc" || api === "ts-rest" || api === "garph")) return {
5186
+ code: "STANDALONE_VITE_API_UNSUPPORTED",
5187
+ message: "Standalone Vite frontends support only GraphQL and OpenAPI API integrations.",
5188
+ category: "api",
5189
+ optionId: api,
5190
+ provided: {
5191
+ api,
5192
+ frontend: frontends.includes("vanilla-vite") ? "vanilla-vite" : "vue"
5193
+ },
5194
+ suggestions: [
5195
+ "Use --api graphql-yoga, --api apollo-server, or --api openapi",
5196
+ "Choose a React-based frontend for tRPC, oRPC, ts-rest, or garph",
5197
+ "Use --api none"
5198
+ ]
5199
+ };
4394
5200
  if ((includesNuxt || includesSvelte || includesSolid || includesSolidStart) && isReactOnlyApi) {
4395
5201
  const incompatibleFrontend = includesNuxt ? "nuxt" : includesSvelte ? "svelte" : includesSolid ? "solid" : "solid-start";
4396
5202
  return {
@@ -4558,21 +5364,33 @@ function getCompatibleUILibraries(frontends = [], astroIntegration) {
4558
5364
  return compatibility.frontends.includes(webFrontend);
4559
5365
  });
4560
5366
  }
4561
- function getCompatibleCSSFrameworks(uiLibrary) {
4562
- if (!uiLibrary || uiLibrary === "none") return [
5367
+ function getCompatibleCSSFrameworks(uiLibrary, frontends = []) {
5368
+ const frameworks = !uiLibrary || uiLibrary === "none" ? [
4563
5369
  "tailwind",
4564
5370
  "scss",
4565
5371
  "less",
4566
5372
  "postcss-only",
5373
+ "styled-components",
4567
5374
  "none"
5375
+ ] : [...UI_LIBRARY_COMPATIBILITY[uiLibrary].cssFrameworks];
5376
+ if (frontends.length === 0) return frameworks;
5377
+ const reactFrontends = [
5378
+ "tanstack-router",
5379
+ "react-router",
5380
+ "react-vite",
5381
+ "tanstack-start",
5382
+ "next",
5383
+ "vinext",
5384
+ "redwood"
4568
5385
  ];
4569
- return UI_LIBRARY_COMPATIBILITY[uiLibrary].cssFrameworks;
5386
+ return frontends.some((frontend) => reactFrontends.includes(frontend)) ? frameworks : frameworks.filter((framework) => framework !== "styled-components");
4570
5387
  }
4571
5388
  function hasWebStyling(frontends = []) {
4572
5389
  const { web } = splitFrontends(frontends);
4573
5390
  return web.length > 0;
4574
5391
  }
4575
5392
  function getCompatibleFormLibraries(frontends = []) {
5393
+ if (frontends.some((frontend) => ["vanilla-vite", "vue"].includes(frontend))) return ["none"];
4576
5394
  const hasSolid = frontends.includes("solid");
4577
5395
  const hasSolidStart = frontends.includes("solid-start");
4578
5396
  const hasQwik = frontends.includes("qwik");
@@ -4608,6 +5426,8 @@ function evaluateCompatibility(input) {
4608
5426
  ["forms", input.forms],
4609
5427
  ["stateManagement", input.stateManagement],
4610
5428
  ["animation", input.animation],
5429
+ ["cms", input.cms],
5430
+ ["featureFlags", input.featureFlags],
4611
5431
  ["pythonApi", input.pythonApi],
4612
5432
  ["javaWebFramework", input.javaWebFramework],
4613
5433
  ["javaBuildTool", input.javaBuildTool],
@@ -4635,6 +5455,11 @@ function evaluateCompatibility(input) {
4635
5455
  ["elixirObservability", input.elixirObservability],
4636
5456
  ["elixirTesting", input.elixirTesting],
4637
5457
  ["elixirQuality", input.elixirQuality],
5458
+ ["elixirI18n", input.elixirI18n],
5459
+ ["elixirHttpServer", input.elixirHttpServer],
5460
+ ["elixirApplicationFramework", input.elixirApplicationFramework],
5461
+ ["elixirDocumentation", input.elixirDocumentation],
5462
+ ["elixirClustering", input.elixirClustering],
4638
5463
  ["elixirDeploy", input.elixirDeploy]
4639
5464
  ];
4640
5465
  for (const [category, optionId] of scalarChecks) {
@@ -4690,6 +5515,15 @@ function evaluateCompatibility(input) {
4690
5515
  optionId: javaLibrary
4691
5516
  });
4692
5517
  }
5518
+ for (const mobileLibrary of input.mobileLibraries ?? []) {
5519
+ const reason = getDisabledReason(input, "mobileLibraries", mobileLibrary);
5520
+ if (reason) issues.push({
5521
+ code: "INCOMPATIBLE_MOBILE_LIBRARY",
5522
+ message: reason,
5523
+ category: "mobileLibraries",
5524
+ optionId: mobileLibrary
5525
+ });
5526
+ }
4693
5527
  for (const testingLibrary of input.javaTestingLibraries) {
4694
5528
  const reason = getDisabledReason(input, "javaTestingLibraries", testingLibrary);
4695
5529
  if (reason) issues.push({
@@ -4717,6 +5551,15 @@ function evaluateCompatibility(input) {
4717
5551
  optionId: observabilityLibrary
4718
5552
  });
4719
5553
  }
5554
+ for (const dotnetLibrary of input.dotnetLibraries ?? []) {
5555
+ const reason = getDisabledReason(input, "dotnetLibraries", dotnetLibrary);
5556
+ if (reason) issues.push({
5557
+ code: "INCOMPATIBLE_DOTNET_LIBRARY",
5558
+ message: reason,
5559
+ category: "dotnetLibraries",
5560
+ optionId: dotnetLibrary
5561
+ });
5562
+ }
4720
5563
  return { issues };
4721
5564
  }
4722
5565
 
@@ -4750,6 +5593,7 @@ const DEFAULT_STACK_SELECTION = {
4750
5593
  mobilePush: "none",
4751
5594
  mobileOTA: "none",
4752
5595
  mobileDeepLinking: "none",
5596
+ mobileLibraries: [],
4753
5597
  backendLibraries: "none",
4754
5598
  stateManagement: "none",
4755
5599
  forms: "react-hook-form",
@@ -4817,6 +5661,13 @@ const DEFAULT_STACK_SELECTION = {
4817
5661
  pythonRealtime: "none",
4818
5662
  pythonObservability: "none",
4819
5663
  pythonCli: [],
5664
+ pythonCloudSdk: "none",
5665
+ pythonHttpClient: "none",
5666
+ pythonData: [],
5667
+ pythonMedia: "none",
5668
+ pythonServer: "none",
5669
+ pythonPackageManager: "uv",
5670
+ pythonMessageQueue: "none",
4820
5671
  goWebFramework: "gin",
4821
5672
  goOrm: "gorm",
4822
5673
  goApi: "none",
@@ -4829,6 +5680,12 @@ const DEFAULT_STACK_SELECTION = {
4829
5680
  goCaching: "none",
4830
5681
  goConfig: "none",
4831
5682
  goObservability: "none",
5683
+ goValidation: "none",
5684
+ goQuality: "none",
5685
+ goMigrations: "none",
5686
+ goTemplating: "none",
5687
+ goProtoTooling: "none",
5688
+ goDI: "none",
4832
5689
  javaLanguage: "java",
4833
5690
  javaWebFramework: "spring-boot",
4834
5691
  javaBuildTool: "maven",
@@ -4849,6 +5706,7 @@ const DEFAULT_STACK_SELECTION = {
4849
5706
  dotnetValidation: "none",
4850
5707
  dotnetCaching: "none",
4851
5708
  dotnetDeploy: "docker",
5709
+ dotnetLibraries: [],
4852
5710
  elixirWebFramework: "phoenix",
4853
5711
  elixirOrm: "ecto-sql",
4854
5712
  elixirAuth: "none",
@@ -4863,6 +5721,11 @@ const DEFAULT_STACK_SELECTION = {
4863
5721
  elixirObservability: "telemetry",
4864
5722
  elixirTesting: "ex_unit",
4865
5723
  elixirQuality: "credo",
5724
+ elixirI18n: "none",
5725
+ elixirHttpServer: "cowboy",
5726
+ elixirApplicationFramework: "none",
5727
+ elixirDocumentation: "none",
5728
+ elixirClustering: "none",
4866
5729
  elixirDeploy: "none",
4867
5730
  elixirLibraries: []
4868
5731
  };
@@ -4897,6 +5760,7 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
4897
5760
  mobilePush: "mobilePush",
4898
5761
  mobileOTA: "mobileOTA",
4899
5762
  mobileDeepLinking: "mobileDeepLinking",
5763
+ mobileLibraries: "mobileLibraries",
4900
5764
  backendLibraries: "backendLibraries",
4901
5765
  stateManagement: "stateManagement",
4902
5766
  forms: "forms",
@@ -4963,6 +5827,13 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
4963
5827
  pythonRealtime: "pythonRealtime",
4964
5828
  pythonObservability: "pythonObservability",
4965
5829
  pythonCli: "pythonCli",
5830
+ pythonCloudSdk: "pythonCloudSdk",
5831
+ pythonHttpClient: "pythonHttpClient",
5832
+ pythonData: "pythonData",
5833
+ pythonMedia: "pythonMedia",
5834
+ pythonServer: "pythonServer",
5835
+ pythonPackageManager: "pythonPackageManager",
5836
+ pythonMessageQueue: "pythonMessageQueue",
4966
5837
  goWebFramework: "goWebFramework",
4967
5838
  goOrm: "goOrm",
4968
5839
  goApi: "goApi",
@@ -4975,6 +5846,12 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
4975
5846
  goCaching: "goCaching",
4976
5847
  goConfig: "goConfig",
4977
5848
  goObservability: "goObservability",
5849
+ goValidation: "goValidation",
5850
+ goQuality: "goQuality",
5851
+ goMigrations: "goMigrations",
5852
+ goTemplating: "goTemplating",
5853
+ goProtoTooling: "goProtoTooling",
5854
+ goDI: "goDI",
4978
5855
  javaLanguage: "javaLanguage",
4979
5856
  javaWebFramework: "javaWebFramework",
4980
5857
  javaBuildTool: "javaBuildTool",
@@ -4995,6 +5872,7 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
4995
5872
  dotnetValidation: "dotnetValidation",
4996
5873
  dotnetCaching: "dotnetCaching",
4997
5874
  dotnetDeploy: "dotnetDeploy",
5875
+ dotnetLibraries: "dotnetLibraries",
4998
5876
  elixirWebFramework: "elixirWebFramework",
4999
5877
  elixirOrm: "elixirOrm",
5000
5878
  elixirAuth: "elixirAuth",
@@ -5009,6 +5887,11 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
5009
5887
  elixirObservability: "elixirObservability",
5010
5888
  elixirTesting: "elixirTesting",
5011
5889
  elixirQuality: "elixirQuality",
5890
+ elixirI18n: "elixirI18n",
5891
+ elixirHttpServer: "elixirHttpServer",
5892
+ elixirApplicationFramework: "elixirApplicationFramework",
5893
+ elixirDocumentation: "elixirDocumentation",
5894
+ elixirClustering: "elixirClustering",
5012
5895
  elixirDeploy: "elixirDeploy",
5013
5896
  elixirLibraries: "elixirLibraries"
5014
5897
  };
@@ -5022,6 +5905,7 @@ const VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS = [
5022
5905
  "goTesting",
5023
5906
  "pythonTesting",
5024
5907
  "pythonCli",
5908
+ "pythonData",
5025
5909
  "elixirLibraries",
5026
5910
  "aiDocs"
5027
5911
  ];
@@ -5056,6 +5940,7 @@ const STACK_SELECTION_URL_KEYS = {
5056
5940
  mobilePush: "mpu",
5057
5941
  mobileOTA: "mota",
5058
5942
  mobileDeepLinking: "mdl",
5943
+ mobileLibraries: "mlib",
5059
5944
  backendLibraries: "bl",
5060
5945
  stateManagement: "sm",
5061
5946
  forms: "frm",
@@ -5123,6 +6008,13 @@ const STACK_SELECTION_URL_KEYS = {
5123
6008
  pythonRealtime: "prt",
5124
6009
  pythonObservability: "pobs",
5125
6010
  pythonCli: "pcli",
6011
+ pythonCloudSdk: "pcloud",
6012
+ pythonHttpClient: "phttp",
6013
+ pythonData: "pdata",
6014
+ pythonMedia: "pmedia",
6015
+ pythonServer: "pserver",
6016
+ pythonPackageManager: "ppm",
6017
+ pythonMessageQueue: "pmq",
5126
6018
  goWebFramework: "gwf",
5127
6019
  goOrm: "gorm",
5128
6020
  goApi: "gapi",
@@ -5135,6 +6027,12 @@ const STACK_SELECTION_URL_KEYS = {
5135
6027
  goCaching: "gcache",
5136
6028
  goConfig: "gcfg",
5137
6029
  goObservability: "gobs",
6030
+ goValidation: "gval",
6031
+ goQuality: "gqual",
6032
+ goMigrations: "gmig",
6033
+ goTemplating: "gtpl",
6034
+ goProtoTooling: "gproto",
6035
+ goDI: "gdi",
5138
6036
  javaLanguage: "jlang",
5139
6037
  javaWebFramework: "jwf",
5140
6038
  javaBuildTool: "jbt",
@@ -5155,6 +6053,7 @@ const STACK_SELECTION_URL_KEYS = {
5155
6053
  dotnetValidation: "dnval",
5156
6054
  dotnetCaching: "dncache",
5157
6055
  dotnetDeploy: "dndeploy",
6056
+ dotnetLibraries: "dnlib",
5158
6057
  elixirWebFramework: "ewf",
5159
6058
  elixirOrm: "eorm",
5160
6059
  elixirAuth: "eauth",
@@ -5169,6 +6068,11 @@ const STACK_SELECTION_URL_KEYS = {
5169
6068
  elixirObservability: "eobs",
5170
6069
  elixirTesting: "etest",
5171
6070
  elixirQuality: "eq",
6071
+ elixirI18n: "ei18n",
6072
+ elixirHttpServer: "ehs",
6073
+ elixirApplicationFramework: "eaf",
6074
+ elixirDocumentation: "edoc",
6075
+ elixirClustering: "ecluster",
5172
6076
  elixirDeploy: "edeploy",
5173
6077
  elixirLibraries: "elib"
5174
6078
  };
@@ -5350,6 +6254,12 @@ const CLI_SCALAR_CONFIG_FIELDS = [
5350
6254
  ["pythonCaching", "pythonCaching"],
5351
6255
  ["pythonRealtime", "pythonRealtime"],
5352
6256
  ["pythonObservability", "pythonObservability"],
6257
+ ["pythonCloudSdk", "pythonCloudSdk"],
6258
+ ["pythonHttpClient", "pythonHttpClient"],
6259
+ ["pythonMedia", "pythonMedia"],
6260
+ ["pythonServer", "pythonServer"],
6261
+ ["pythonPackageManager", "pythonPackageManager"],
6262
+ ["pythonMessageQueue", "pythonMessageQueue"],
5353
6263
  ["goWebFramework", "goWebFramework"],
5354
6264
  ["goOrm", "goOrm"],
5355
6265
  ["goApi", "goApi"],
@@ -5361,6 +6271,12 @@ const CLI_SCALAR_CONFIG_FIELDS = [
5361
6271
  ["goCaching", "goCaching"],
5362
6272
  ["goConfig", "goConfig"],
5363
6273
  ["goObservability", "goObservability"],
6274
+ ["goValidation", "goValidation"],
6275
+ ["goQuality", "goQuality"],
6276
+ ["goMigrations", "goMigrations"],
6277
+ ["goTemplating", "goTemplating"],
6278
+ ["goProtoTooling", "goProtoTooling"],
6279
+ ["goDI", "goDI"],
5364
6280
  ["javaLanguage", "javaLanguage"],
5365
6281
  ["javaWebFramework", "javaWebFramework"],
5366
6282
  ["javaBuildTool", "javaBuildTool"],
@@ -5391,6 +6307,11 @@ const CLI_SCALAR_CONFIG_FIELDS = [
5391
6307
  ["elixirObservability", "elixirObservability"],
5392
6308
  ["elixirTesting", "elixirTesting"],
5393
6309
  ["elixirQuality", "elixirQuality"],
6310
+ ["elixirI18n", "elixirI18n"],
6311
+ ["elixirHttpServer", "elixirHttpServer"],
6312
+ ["elixirApplicationFramework", "elixirApplicationFramework"],
6313
+ ["elixirDocumentation", "elixirDocumentation"],
6314
+ ["elixirClustering", "elixirClustering"],
5394
6315
  ["elixirDeploy", "elixirDeploy"]
5395
6316
  ];
5396
6317
  const CLI_NON_EMPTY_ARRAY_CONFIG_FIELDS = [
@@ -5400,15 +6321,18 @@ const CLI_NON_EMPTY_ARRAY_CONFIG_FIELDS = [
5400
6321
  ];
5401
6322
  const CLI_DEFINED_ARRAY_CONFIG_FIELDS = [
5402
6323
  ["aiDocs", "aiDocs"],
6324
+ ["mobileLibraries", "mobileLibraries"],
5403
6325
  ["rustLibraries", "rustLibraries"],
5404
6326
  ["pythonAi", "pythonAi"],
5405
6327
  ["javaLibraries", "javaLibraries"],
5406
6328
  ["javaTestingLibraries", "javaTestingLibraries"],
5407
6329
  ["dotnetTesting", "dotnetTesting"],
5408
6330
  ["dotnetObservability", "dotnetObservability"],
6331
+ ["dotnetLibraries", "dotnetLibraries"],
5409
6332
  ["goTesting", "goTesting"],
5410
6333
  ["pythonTesting", "pythonTesting"],
5411
6334
  ["pythonCli", "pythonCli"],
6335
+ ["pythonData", "pythonData"],
5412
6336
  ["elixirLibraries", "elixirLibraries"]
5413
6337
  ];
5414
6338
  const PACKAGE_MANAGER_COMMANDS = {
@@ -5456,7 +6380,14 @@ const PYTHON_CONFIG_KEYS = [
5456
6380
  "pythonCaching",
5457
6381
  "pythonRealtime",
5458
6382
  "pythonObservability",
5459
- "pythonCli"
6383
+ "pythonCli",
6384
+ "pythonCloudSdk",
6385
+ "pythonHttpClient",
6386
+ "pythonData",
6387
+ "pythonMedia",
6388
+ "pythonServer",
6389
+ "pythonPackageManager",
6390
+ "pythonMessageQueue"
5460
6391
  ];
5461
6392
  const GO_CONFIG_KEYS = [
5462
6393
  "goWebFramework",
@@ -5470,7 +6401,13 @@ const GO_CONFIG_KEYS = [
5470
6401
  "goMessageQueue",
5471
6402
  "goCaching",
5472
6403
  "goConfig",
5473
- "goObservability"
6404
+ "goObservability",
6405
+ "goValidation",
6406
+ "goQuality",
6407
+ "goMigrations",
6408
+ "goTemplating",
6409
+ "goProtoTooling",
6410
+ "goDI"
5474
6411
  ];
5475
6412
  const JAVA_CONFIG_KEYS = [
5476
6413
  "javaLanguage",
@@ -5494,7 +6431,8 @@ const DOTNET_CONFIG_KEYS = [
5494
6431
  "dotnetObservability",
5495
6432
  "dotnetValidation",
5496
6433
  "dotnetCaching",
5497
- "dotnetDeploy"
6434
+ "dotnetDeploy",
6435
+ "dotnetLibraries"
5498
6436
  ];
5499
6437
  const ELIXIR_CONFIG_KEYS = [
5500
6438
  "elixirWebFramework",
@@ -5511,6 +6449,11 @@ const ELIXIR_CONFIG_KEYS = [
5511
6449
  "elixirObservability",
5512
6450
  "elixirTesting",
5513
6451
  "elixirQuality",
6452
+ "elixirI18n",
6453
+ "elixirHttpServer",
6454
+ "elixirApplicationFramework",
6455
+ "elixirDocumentation",
6456
+ "elixirClustering",
5514
6457
  "elixirDeploy",
5515
6458
  "elixirLibraries"
5516
6459
  ];
@@ -5521,37 +6464,9 @@ const REACT_NATIVE_CONFIG_KEYS = [
5521
6464
  "mobileTesting",
5522
6465
  "mobilePush",
5523
6466
  "mobileOTA",
5524
- "mobileDeepLinking"
6467
+ "mobileDeepLinking",
6468
+ "mobileLibraries"
5525
6469
  ];
5526
- const COMMAND_ADDONS = new Set([
5527
- "pwa",
5528
- "tauri",
5529
- "starlight",
5530
- "biome",
5531
- "lefthook",
5532
- "husky",
5533
- "turborepo",
5534
- "nx",
5535
- "docker-compose",
5536
- "devcontainer",
5537
- "github-actions",
5538
- "ultracite",
5539
- "fumadocs",
5540
- "oxlint",
5541
- "ruler",
5542
- "opentui",
5543
- "mcp",
5544
- "skills",
5545
- "wxt",
5546
- "msw",
5547
- "storybook",
5548
- "swr",
5549
- "tanstack-query",
5550
- "tanstack-table",
5551
- "tanstack-virtual",
5552
- "tanstack-db",
5553
- "tanstack-pacer"
5554
- ]);
5555
6470
  function withoutNone(values) {
5556
6471
  return values.filter((value) => value !== "none");
5557
6472
  }
@@ -5573,7 +6488,7 @@ function formatTypeScriptAddonsFlag(selection) {
5573
6488
  ...selection.appPlatforms
5574
6489
  ];
5575
6490
  if (addons.length === 0) return "--addons none";
5576
- return `--addons ${addons.filter((addon) => COMMAND_ADDONS.has(addon)).join(" ") || "none"}`;
6491
+ return `--addons ${toUniqueNonNoneArray(addons).join(" ") || "none"}`;
5577
6492
  }
5578
6493
  const GRAPH_TYPESCRIPT_FRONTEND_FLAG_KEYS = [["validation", "validation"], ["testing", "testing"]];
5579
6494
  const GRAPH_SHADCN_FLAG_KEYS = [
@@ -5646,6 +6561,11 @@ const GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS = [
5646
6561
  ["elixirObservability", "observability"],
5647
6562
  ["elixirTesting", "testing"],
5648
6563
  ["elixirQuality", "codeQuality"],
6564
+ ["elixirI18n", "i18n"],
6565
+ ["elixirHttpServer", "runtime"],
6566
+ ["elixirApplicationFramework", "libraries"],
6567
+ ["elixirDocumentation", "documentation"],
6568
+ ["elixirClustering", "config"],
5649
6569
  ["elixirDeploy", "deploy"]
5650
6570
  ];
5651
6571
  const GRAPH_DATABASE_PART_SELECTION_KEYS = [["dbSetup", "dbSetup"]];
@@ -5658,6 +6578,7 @@ const GRAPH_MOBILE_PART_SELECTION_KEYS = [
5658
6578
  ["mobileOTA", "ota"],
5659
6579
  ["mobileDeepLinking", "deepLinking"]
5660
6580
  ];
6581
+ const GRAPH_MOBILE_ARRAY_PART_SELECTION_KEYS = [["mobileLibraries", "libraries"]];
5661
6582
  const GRAPH_RUST_BACKEND_PART_SELECTION_KEYS = [
5662
6583
  ["rustCli", "cli"],
5663
6584
  ["rustLogging", "logging"],
@@ -5672,13 +6593,25 @@ const GRAPH_PYTHON_BACKEND_PART_SELECTION_KEYS = [
5672
6593
  ["pythonTaskQueue", "jobQueue"],
5673
6594
  ["pythonGraphql", "graphql"],
5674
6595
  ["pythonQuality", "codeQuality"],
6596
+ ["pythonCloudSdk", "cloudSdk"],
6597
+ ["pythonHttpClient", "httpClient"],
6598
+ ["pythonMedia", "media"],
6599
+ ["pythonServer", "server"],
6600
+ ["pythonPackageManager", "packageManager"],
6601
+ ["pythonMessageQueue", "messageQueue"],
5675
6602
  ["caching", "caching"],
5676
6603
  ["search", "search"]
5677
6604
  ];
5678
- const GRAPH_PYTHON_BACKEND_ARRAY_PART_SELECTION_KEYS = [["pythonAi", "ai"]];
6605
+ const GRAPH_PYTHON_BACKEND_ARRAY_PART_SELECTION_KEYS = [["pythonAi", "ai"], ["pythonData", "data"]];
5679
6606
  const GRAPH_GO_BACKEND_PART_SELECTION_KEYS = [
5680
6607
  ["goCli", "cli"],
5681
6608
  ["goLogging", "logging"],
6609
+ ["goValidation", "validation"],
6610
+ ["goQuality", "codeQuality"],
6611
+ ["goMigrations", "migrations"],
6612
+ ["goTemplating", "templating"],
6613
+ ["goProtoTooling", "buildTool"],
6614
+ ["goDI", "libraries"],
5682
6615
  ["caching", "caching"],
5683
6616
  ["search", "search"]
5684
6617
  ];
@@ -5698,7 +6631,11 @@ const GRAPH_DOTNET_BACKEND_PART_SELECTION_KEYS = [
5698
6631
  ["dotnetCaching", "caching"],
5699
6632
  ["dotnetDeploy", "deploy"]
5700
6633
  ];
5701
- const GRAPH_DOTNET_BACKEND_ARRAY_PART_SELECTION_KEYS = [["dotnetTesting", "testing"], ["dotnetObservability", "observability"]];
6634
+ const GRAPH_DOTNET_BACKEND_ARRAY_PART_SELECTION_KEYS = [
6635
+ ["dotnetTesting", "testing"],
6636
+ ["dotnetObservability", "observability"],
6637
+ ["dotnetLibraries", "libraries"]
6638
+ ];
5702
6639
  const GRAPH_TYPESCRIPT_FRONTEND_PART_CLI_KEYS = [
5703
6640
  ["webDeploy", "deploy"],
5704
6641
  ["cssFramework", "css"],
@@ -5738,6 +6675,11 @@ const GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS = [
5738
6675
  ["elixirObservability", "observability"],
5739
6676
  ["elixirTesting", "testing"],
5740
6677
  ["elixirQuality", "codeQuality"],
6678
+ ["elixirI18n", "i18n"],
6679
+ ["elixirHttpServer", "runtime"],
6680
+ ["elixirApplicationFramework", "libraries"],
6681
+ ["elixirDocumentation", "documentation"],
6682
+ ["elixirClustering", "config"],
5741
6683
  ["elixirDeploy", "deploy"]
5742
6684
  ];
5743
6685
  const GRAPH_DATABASE_PART_CLI_KEYS = [["dbSetup", "dbSetup"]];
@@ -5750,6 +6692,7 @@ const GRAPH_MOBILE_PART_CLI_KEYS = [
5750
6692
  ["mobileOTA", "ota"],
5751
6693
  ["mobileDeepLinking", "deepLinking"]
5752
6694
  ];
6695
+ const GRAPH_MOBILE_ARRAY_PART_CLI_KEYS = [["mobileLibraries", "libraries"]];
5753
6696
  const GRAPH_RUST_BACKEND_PART_CLI_KEYS = [
5754
6697
  ["rustCli", "cli"],
5755
6698
  ["rustLogging", "logging"],
@@ -5764,13 +6707,25 @@ const GRAPH_PYTHON_BACKEND_PART_CLI_KEYS = [
5764
6707
  ["pythonTaskQueue", "jobQueue"],
5765
6708
  ["pythonGraphql", "graphql"],
5766
6709
  ["pythonQuality", "codeQuality"],
6710
+ ["pythonCloudSdk", "cloudSdk"],
6711
+ ["pythonHttpClient", "httpClient"],
6712
+ ["pythonMedia", "media"],
6713
+ ["pythonServer", "server"],
6714
+ ["pythonPackageManager", "packageManager"],
6715
+ ["pythonMessageQueue", "messageQueue"],
5767
6716
  ["caching", "caching"],
5768
6717
  ["search", "search"]
5769
6718
  ];
5770
- const GRAPH_PYTHON_BACKEND_ARRAY_PART_CLI_KEYS = [["pythonAi", "ai"]];
6719
+ const GRAPH_PYTHON_BACKEND_ARRAY_PART_CLI_KEYS = [["pythonAi", "ai"], ["pythonData", "data"]];
5771
6720
  const GRAPH_GO_BACKEND_PART_CLI_KEYS = [
5772
6721
  ["goCli", "cli"],
5773
6722
  ["goLogging", "logging"],
6723
+ ["goValidation", "validation"],
6724
+ ["goQuality", "codeQuality"],
6725
+ ["goMigrations", "migrations"],
6726
+ ["goTemplating", "templating"],
6727
+ ["goProtoTooling", "buildTool"],
6728
+ ["goDI", "libraries"],
5774
6729
  ["caching", "caching"],
5775
6730
  ["search", "search"]
5776
6731
  ];
@@ -5789,7 +6744,11 @@ const GRAPH_DOTNET_BACKEND_PART_CLI_KEYS = [
5789
6744
  ["dotnetCaching", "caching"],
5790
6745
  ["dotnetDeploy", "deploy"]
5791
6746
  ];
5792
- const GRAPH_DOTNET_BACKEND_ARRAY_PART_CLI_KEYS = [["dotnetTesting", "testing"], ["dotnetObservability", "observability"]];
6747
+ const GRAPH_DOTNET_BACKEND_ARRAY_PART_CLI_KEYS = [
6748
+ ["dotnetTesting", "testing"],
6749
+ ["dotnetObservability", "observability"],
6750
+ ["dotnetLibraries", "libraries"]
6751
+ ];
5793
6752
  function getAddonScopedPartFields(addons) {
5794
6753
  return toUniqueNonNoneArray(addons ?? []).flatMap((addon) => {
5795
6754
  const binding = getAddonStackPartBinding(addon);
@@ -5866,6 +6825,13 @@ function getSelectionScopedPartFields(selection) {
5866
6825
  role,
5867
6826
  value: selection[key]
5868
6827
  })),
6828
+ ...GRAPH_MOBILE_ARRAY_PART_SELECTION_KEYS.map(([key, role]) => ({
6829
+ ownerRole: "mobile",
6830
+ ecosystem: "react-native",
6831
+ role,
6832
+ value: selection[key],
6833
+ allowMultiple: true
6834
+ })),
5869
6835
  ...GRAPH_RUST_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({
5870
6836
  ownerRole: "backend",
5871
6837
  ecosystem: "rust",
@@ -5972,6 +6938,13 @@ function getCliScopedPartFields(input) {
5972
6938
  role,
5973
6939
  value: getValue(key)
5974
6940
  })),
6941
+ ...GRAPH_MOBILE_ARRAY_PART_CLI_KEYS.map(([key, role]) => ({
6942
+ ownerRole: "mobile",
6943
+ ecosystem: "react-native",
6944
+ role,
6945
+ value: getArrayValue(key),
6946
+ allowMultiple: true
6947
+ })),
5975
6948
  ...GRAPH_RUST_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({
5976
6949
  ownerRole: "backend",
5977
6950
  ecosystem: "rust",
@@ -6217,6 +7190,7 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
6217
7190
  mobilePush: stack.mobilePush,
6218
7191
  mobileOTA: stack.mobileOTA,
6219
7192
  mobileDeepLinking: stack.mobileDeepLinking,
7193
+ mobileLibraries: toUniqueNonNoneArray(stack.mobileLibraries),
6220
7194
  cms: stack.cms,
6221
7195
  caching: stack.caching,
6222
7196
  rateLimit: stack.rateLimit,
@@ -6252,6 +7226,13 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
6252
7226
  pythonRealtime: stack.pythonRealtime,
6253
7227
  pythonObservability: stack.pythonObservability,
6254
7228
  pythonCli: toUniqueNonNoneArray(stack.pythonCli),
7229
+ pythonCloudSdk: stack.pythonCloudSdk,
7230
+ pythonHttpClient: stack.pythonHttpClient,
7231
+ pythonData: toUniqueNonNoneArray(stack.pythonData),
7232
+ pythonMedia: stack.pythonMedia,
7233
+ pythonServer: stack.pythonServer,
7234
+ pythonPackageManager: stack.pythonPackageManager,
7235
+ pythonMessageQueue: stack.pythonMessageQueue,
6255
7236
  goWebFramework: stack.goWebFramework,
6256
7237
  goOrm: stack.goOrm,
6257
7238
  goApi: stack.goApi,
@@ -6264,6 +7245,12 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
6264
7245
  goCaching: stack.goCaching,
6265
7246
  goConfig: stack.goConfig,
6266
7247
  goObservability: stack.goObservability,
7248
+ goValidation: stack.goValidation,
7249
+ goQuality: stack.goQuality,
7250
+ goMigrations: stack.goMigrations,
7251
+ goTemplating: stack.goTemplating,
7252
+ goProtoTooling: stack.goProtoTooling,
7253
+ goDI: stack.goDI,
6267
7254
  javaLanguage: stack.javaLanguage,
6268
7255
  javaWebFramework: stack.javaWebFramework,
6269
7256
  javaBuildTool: stack.javaBuildTool,
@@ -6284,6 +7271,7 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
6284
7271
  dotnetValidation: stack.dotnetValidation,
6285
7272
  dotnetCaching: stack.dotnetCaching,
6286
7273
  dotnetDeploy: stack.dotnetDeploy,
7274
+ dotnetLibraries: toUniqueNonNoneArray(stack.dotnetLibraries),
6287
7275
  elixirWebFramework: stack.elixirWebFramework,
6288
7276
  elixirOrm: stack.elixirOrm,
6289
7277
  elixirAuth: stack.elixirAuth,
@@ -6298,6 +7286,11 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
6298
7286
  elixirObservability: stack.elixirObservability,
6299
7287
  elixirTesting: stack.elixirTesting,
6300
7288
  elixirQuality: stack.elixirQuality,
7289
+ elixirI18n: stack.elixirI18n,
7290
+ elixirHttpServer: stack.elixirHttpServer,
7291
+ elixirApplicationFramework: stack.elixirApplicationFramework,
7292
+ elixirDocumentation: stack.elixirDocumentation,
7293
+ elixirClustering: stack.elixirClustering,
6301
7294
  elixirDeploy: stack.elixirDeploy,
6302
7295
  elixirLibraries: toUniqueNonNoneArray(stack.elixirLibraries),
6303
7296
  aiDocs: toUniqueNonNoneArray(stack.aiDocs)
@@ -6475,6 +7468,7 @@ function generateReactNativeCommand(selection, projectName) {
6475
7468
  `--mobile-push ${selection.mobilePush}`,
6476
7469
  `--mobile-ota ${selection.mobileOTA}`,
6477
7470
  `--mobile-deep-linking ${selection.mobileDeepLinking}`,
7471
+ formatArrayFlag("mobile-libraries", selection.mobileLibraries),
6478
7472
  `--package-manager ${selection.packageManager}`,
6479
7473
  selection.git === "false" ? "--no-git" : "--git",
6480
7474
  selection.install === "false" ? "--no-install" : "--install",
@@ -6486,6 +7480,7 @@ function generateReactNativeCommand(selection, projectName) {
6486
7480
  function generateRustCommand(selection, projectName) {
6487
7481
  const flags = [
6488
7482
  "--ecosystem rust",
7483
+ `--database ${selection.database}`,
6489
7484
  `--rust-web-framework ${selection.rustWebFramework}`,
6490
7485
  `--rust-frontend ${selection.rustFrontend}`,
6491
7486
  `--rust-orm ${selection.rustOrm}`,
@@ -6513,6 +7508,7 @@ function generateRustCommand(selection, projectName) {
6513
7508
  function generatePythonCommand(selection, projectName) {
6514
7509
  const flags = [
6515
7510
  "--ecosystem python",
7511
+ `--database ${selection.database}`,
6516
7512
  `--python-web-framework ${selection.pythonWebFramework}`,
6517
7513
  `--python-orm ${selection.pythonOrm}`,
6518
7514
  `--python-validation ${selection.pythonValidation}`,
@@ -6527,6 +7523,13 @@ function generatePythonCommand(selection, projectName) {
6527
7523
  `--python-realtime ${selection.pythonRealtime}`,
6528
7524
  `--python-observability ${selection.pythonObservability}`,
6529
7525
  formatArrayFlag("python-cli", selection.pythonCli),
7526
+ `--python-cloud-sdk ${selection.pythonCloudSdk}`,
7527
+ `--python-http-client ${selection.pythonHttpClient}`,
7528
+ formatArrayFlag("python-data", selection.pythonData),
7529
+ `--python-media ${selection.pythonMedia}`,
7530
+ `--python-server ${selection.pythonServer}`,
7531
+ `--python-package-manager ${selection.pythonPackageManager}`,
7532
+ `--python-message-queue ${selection.pythonMessageQueue}`,
6530
7533
  `--email ${selection.email}`,
6531
7534
  `--observability ${selection.observability}`,
6532
7535
  `--caching ${selection.caching}`,
@@ -6540,6 +7543,7 @@ function generatePythonCommand(selection, projectName) {
6540
7543
  function generateGoCommand(selection, projectName) {
6541
7544
  const flags = [
6542
7545
  "--ecosystem go",
7546
+ `--database ${selection.database}`,
6543
7547
  `--go-web-framework ${selection.goWebFramework}`,
6544
7548
  `--go-orm ${selection.goOrm}`,
6545
7549
  `--go-api ${selection.goApi}`,
@@ -6552,6 +7556,12 @@ function generateGoCommand(selection, projectName) {
6552
7556
  `--go-caching ${selection.goCaching}`,
6553
7557
  `--go-config ${selection.goConfig}`,
6554
7558
  `--go-observability ${selection.goObservability}`,
7559
+ `--go-validation ${selection.goValidation}`,
7560
+ `--go-quality ${selection.goQuality}`,
7561
+ `--go-migrations ${selection.goMigrations}`,
7562
+ `--go-templating ${selection.goTemplating}`,
7563
+ `--go-proto-tooling ${selection.goProtoTooling}`,
7564
+ `--go-di ${selection.goDI}`,
6555
7565
  `--auth ${selection.auth}`,
6556
7566
  `--email ${selection.email}`,
6557
7567
  `--observability ${selection.observability}`,
@@ -6566,6 +7576,7 @@ function generateGoCommand(selection, projectName) {
6566
7576
  function generateJavaCommand(selection, projectName) {
6567
7577
  const flags = [
6568
7578
  "--ecosystem java",
7579
+ `--database ${selection.database}`,
6569
7580
  `--java-web-framework ${selection.javaWebFramework}`,
6570
7581
  ...selection.javaLanguage === "kotlin" ? [`--java-language ${selection.javaLanguage}`] : [],
6571
7582
  `--java-build-tool ${selection.javaBuildTool}`,
@@ -6588,6 +7599,7 @@ function generateJavaCommand(selection, projectName) {
6588
7599
  function generateDotnetCommand(selection, projectName) {
6589
7600
  const flags = [
6590
7601
  "--ecosystem dotnet",
7602
+ `--database ${selection.database}`,
6591
7603
  `--dotnet-web-framework ${selection.dotnetWebFramework}`,
6592
7604
  `--dotnet-orm ${selection.dotnetOrm}`,
6593
7605
  `--dotnet-auth ${selection.dotnetAuth}`,
@@ -6599,6 +7611,7 @@ function generateDotnetCommand(selection, projectName) {
6599
7611
  `--dotnet-validation ${selection.dotnetValidation}`,
6600
7612
  `--dotnet-caching ${selection.dotnetCaching}`,
6601
7613
  `--dotnet-deploy ${selection.dotnetDeploy}`,
7614
+ formatArrayFlag("dotnet-libraries", selection.dotnetLibraries),
6602
7615
  formatArrayFlag("ai-docs", selection.aiDocs)
6603
7616
  ];
6604
7617
  if (selection.git === "false") flags.push("--no-git");
@@ -6608,6 +7621,7 @@ function generateDotnetCommand(selection, projectName) {
6608
7621
  function generateElixirCommand(selection, projectName) {
6609
7622
  const flags = [
6610
7623
  "--ecosystem elixir",
7624
+ `--database ${selection.database}`,
6611
7625
  `--elixir-web-framework ${selection.elixirWebFramework}`,
6612
7626
  `--elixir-orm ${selection.elixirOrm}`,
6613
7627
  `--elixir-auth ${selection.elixirAuth}`,
@@ -6622,6 +7636,11 @@ function generateElixirCommand(selection, projectName) {
6622
7636
  `--elixir-observability ${selection.elixirObservability}`,
6623
7637
  `--elixir-testing ${selection.elixirTesting}`,
6624
7638
  `--elixir-quality ${selection.elixirQuality}`,
7639
+ `--elixir-i18n ${selection.elixirI18n}`,
7640
+ `--elixir-http-server ${selection.elixirHttpServer}`,
7641
+ `--elixir-application-framework ${selection.elixirApplicationFramework}`,
7642
+ `--elixir-documentation ${selection.elixirDocumentation}`,
7643
+ `--elixir-clustering ${selection.elixirClustering}`,
6625
7644
  `--elixir-deploy ${selection.elixirDeploy}`,
6626
7645
  formatArrayFlag("elixir-libraries", selection.elixirLibraries),
6627
7646
  formatArrayFlag("ai-docs", selection.aiDocs)
@@ -6648,4 +7667,4 @@ function generateStackSelectionCommand(selection) {
6648
7667
 
6649
7668
  //#endregion
6650
7669
  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 };
6651
- //# sourceMappingURL=stack-translation-DwSS9Vc2.mjs.map
7670
+ //# sourceMappingURL=stack-translation-Ay-_1mNB.mjs.map