@better-fullstack/types 2.3.1 → 2.5.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 (45) hide show
  1. package/LICENSE +22 -0
  2. package/dist/{defaults-Cl16mM84.mjs → defaults-BzWJP6p0.mjs} +3 -1
  3. package/dist/defaults-BzWJP6p0.mjs.map +1 -0
  4. package/dist/{defaults-BCprHCB6.d.mts → defaults-CbLlpynl.d.mts} +2 -2
  5. package/dist/defaults-CbLlpynl.d.mts.map +1 -0
  6. package/dist/defaults.d.mts +3 -3
  7. package/dist/defaults.mjs +1 -1
  8. package/dist/index.d.mts +6 -6
  9. package/dist/index.d.mts.map +1 -1
  10. package/dist/index.mjs +69 -5
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/json-schema.d.mts +518 -20
  13. package/dist/json-schema.d.mts.map +1 -1
  14. package/dist/json-schema.mjs +1 -1
  15. package/dist/{schemas-B79HRN5e.d.mts → schemas-BRAokgPa.d.mts} +520 -27
  16. package/dist/schemas-BRAokgPa.d.mts.map +1 -0
  17. package/dist/{schemas-CprYz5Sh.mjs → schemas-CtieNRfz.mjs} +74 -3
  18. package/dist/schemas-CtieNRfz.mjs.map +1 -0
  19. package/dist/schemas.d.mts +2 -2
  20. package/dist/schemas.mjs +2 -2
  21. package/dist/{stack-graph-BkHZlyKH.d.mts → stack-graph-BPw9KsNm.d.mts} +3 -3
  22. package/dist/stack-graph-BPw9KsNm.d.mts.map +1 -0
  23. package/dist/{stack-graph-DiLi3WuL.mjs → stack-graph-CXTiPofQ.mjs} +205 -27
  24. package/dist/stack-graph-CXTiPofQ.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-Ay-_1mNB.mjs → stack-translation-B-zArJLM.mjs} +433 -29
  28. package/dist/stack-translation-B-zArJLM.mjs.map +1 -0
  29. package/dist/{stack-translation-BmsX82IA.d.mts → stack-translation-D7KkQm8W.d.mts} +30 -9
  30. package/dist/stack-translation-D7KkQm8W.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-BuRzqsRV.d.mts → types-Br0NsnBr.d.mts} +10 -3
  34. package/dist/types-Br0NsnBr.d.mts.map +1 -0
  35. package/dist/types.d.mts +3 -3
  36. package/package.json +3 -2
  37. package/dist/defaults-BCprHCB6.d.mts.map +0 -1
  38. package/dist/defaults-Cl16mM84.mjs.map +0 -1
  39. package/dist/schemas-B79HRN5e.d.mts.map +0 -1
  40. package/dist/schemas-CprYz5Sh.mjs.map +0 -1
  41. package/dist/stack-graph-BkHZlyKH.d.mts.map +0 -1
  42. package/dist/stack-graph-DiLi3WuL.mjs.map +0 -1
  43. package/dist/stack-translation-Ay-_1mNB.mjs.map +0 -1
  44. package/dist/stack-translation-BmsX82IA.d.mts.map +0 -1
  45. package/dist/types-BuRzqsRV.d.mts.map +0 -1
@@ -1,6 +1,6 @@
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";
1
+ import { $i as RUST_CACHING_VALUES, A as CSS_FRAMEWORK_VALUES, Aa as SHADCN_BASE_COLOR_VALUES, An as GO_OBSERVABILITY_VALUES, At as ELIXIR_OBSERVABILITY_VALUES, B as DOTNET_DEPLOY_VALUES, Br as MOBILE_TESTING_VALUES, Cn as GO_CACHING_VALUES, Ct as ELIXIR_EMAIL_VALUES, Dn as GO_LOGGING_VALUES, Dt as ELIXIR_JOBS_VALUES, En as GO_DI_VALUES, Et as ELIXIR_I18N_VALUES, F as DATABASE_VALUES, Fa as SHADCN_RADIUS_VALUES, Fn as GO_TEMPLATING_VALUES, Fr as MOBILE_LIBRARIES_VALUES, Ft as ELIXIR_VALIDATION_VALUES, G as DOTNET_ORM_VALUES, H as DOTNET_JOB_QUEUE_VALUES, Ia as SHADCN_STYLE_VALUES, In as GO_TESTING_VALUES, Ir as MOBILE_NAVIGATION_VALUES, It as ELIXIR_WEB_FRAMEWORK_VALUES, J as DOTNET_VALIDATION_VALUES, Ji as RATE_LIMIT_VALUES, K as DOTNET_REALTIME_VALUES, L as DOTNET_API_VALUES, La as STATE_MANAGEMENT_VALUES, Ln as GO_VALIDATION_VALUES, Lr as MOBILE_OTA_VALUES, Lt as EMAIL_VALUES, Ma as SHADCN_COLOR_THEME_VALUES, Mn as GO_PROTO_TOOLING_VALUES, Mr as LOGGING_VALUES, Mt as ELIXIR_QUALITY_VALUES, N as DART_MOBILE_VALUES, Na as SHADCN_FONT_VALUES, Nn as GO_QUALITY_VALUES, Nt as ELIXIR_REALTIME_VALUES, O as CMS_VALUES, Oa as SEARCH_VALUES, On as GO_MESSAGE_QUEUE_VALUES, Or as KOTLIN_MOBILE_LIBRARIES_VALUES, Ot as ELIXIR_JSON_VALUES, P as DATABASE_SETUP_VALUES, Pa as SHADCN_ICON_LIBRARY_VALUES, Pn as GO_REALTIME_VALUES, Pr as MOBILE_DEEP_LINKING_VALUES, Pt as ELIXIR_TESTING_VALUES, Qi as RUST_AUTH_VALUES, Qr as ORM_VALUES, R as DOTNET_AUTH_VALUES, Ra as SWIFT_MOBILE_VALUES, Rn as GO_WEB_FRAMEWORK_VALUES, Rr as MOBILE_PUSH_VALUES, Si as PYTHON_WEB_FRAMEWORK_VALUES, Sn as GO_AUTH_VALUES, St as ELIXIR_DOCUMENTATION_VALUES, T as CACHING_VALUES, Tn as GO_CONFIG_VALUES, Tt as ELIXIR_HTTP_VALUES, U as DOTNET_LIBRARIES_VALUES, V as DOTNET_FRONTEND_VALUES, Vr as MOBILE_UI_VALUES, W as DOTNET_OBSERVABILITY_VALUES, Xi as RUNTIME_VALUES, Xr as OBSERVABILITY_VALUES, Y as DOTNET_WEB_FRAMEWORK_VALUES, Yi as REALTIME_VALUES, Zi as RUST_API_VALUES, _i as PYTHON_REALTIME_VALUES, _r as JOB_QUEUE_VALUES, _t as ELIXIR_APPLICATION_FRAMEWORK_VALUES, a as ANALYTICS_VALUES, aa as RUST_MESSAGE_QUEUE_VALUES, ai as PYTHON_CACHING_VALUES, ao as UI_LIBRARY_VALUES, ar as INTEGRATIONS_VALUES, bi as PYTHON_TESTING_VALUES, bt as ELIXIR_CLUSTERING_VALUES, c as API_VALUES, ca as RUST_REALTIME_VALUES, ci as PYTHON_DATA_VALUES, co as VERSION_CHANNEL_VALUES, cr as JAVA_API_VALUES, d as AUTH_VALUES, di as PYTHON_MEDIA_VALUES, dn as FEATURE_FLAGS_VALUES, dr as JAVA_LANGUAGE_VALUES, ea as RUST_CLI_VALUES, ei as PACKAGE_MANAGER_VALUES, fi as PYTHON_MESSAGE_QUEUE_VALUES, fn as FILE_STORAGE_VALUES, fo as WEB_DEPLOY_VALUES, fr as JAVA_LIBRARIES_VALUES, gi as PYTHON_QUALITY_VALUES, gr as JAVA_WEB_FRAMEWORK_VALUES, gt as ELIXIR_API_VALUES, hi as PYTHON_PACKAGE_MANAGER_VALUES, hr as JAVA_TESTING_LIBRARIES_VALUES, ht as EFFECT_VALUES, i as AI_VALUES, ia as RUST_LOGGING_VALUES, ii as PYTHON_AUTH_VALUES, ja as SHADCN_BASE_VALUES, jn as GO_ORM_VALUES, jt as ELIXIR_ORM_VALUES, ka as SERVER_DEPLOY_VALUES, kn as GO_MIGRATIONS_VALUES, kr as KOTLIN_MOBILE_VALUES, kt as ELIXIR_LIBRARIES_VALUES, l as APP_PLATFORM_ADDON_VALUES, la as RUST_TEMPLATING_VALUES, li as PYTHON_GRAPHQL_VALUES, lr as JAVA_AUTH_VALUES, mi as PYTHON_ORM_VALUES, mn as FORMS_VALUES, mr as JAVA_ORM_VALUES, na as RUST_FRONTEND_VALUES, ni as PYTHON_AI_VALUES, o as ANIMATION_VALUES, oa as RUST_OBSERVABILITY_VALUES, oi as PYTHON_CLI_VALUES, oo as VALIDATION_VALUES, pi as PYTHON_OBSERVABILITY_VALUES, pn as FILE_UPLOAD_VALUES, po as WORKSPACE_SHAPE_VALUES, pr as JAVA_LOGGING_VALUES, pt as ECOMMERCE_VALUES, q as DOTNET_TESTING_VALUES, r as AI_DOCS_VALUES, ra as RUST_LIBRARIES_VALUES, ri as PYTHON_API_VALUES, rr as I18N_VALUES, sa as RUST_ORM_VALUES, si as PYTHON_CLOUD_SDK_VALUES, so as VECTOR_DB_VALUES, ta as RUST_ERROR_HANDLING_VALUES, ti as PAYMENTS_VALUES, to as TESTING_VALUES, u as ASTRO_INTEGRATION_VALUES, ua as RUST_WEB_FRAMEWORK_VALUES, ui as PYTHON_HTTP_CLIENT_VALUES, ur as JAVA_BUILD_TOOL_VALUES, vi as PYTHON_SERVER_VALUES, vt as ELIXIR_AUTH_VALUES, wn as GO_CLI_VALUES, wt as ELIXIR_HTTP_SERVER_VALUES, xi as PYTHON_VALIDATION_VALUES, xn as GO_API_VALUES, xt as ELIXIR_DEPLOY_VALUES, yi as PYTHON_TASK_QUEUE_VALUES, yt as ELIXIR_CACHING_VALUES, z as DOTNET_CACHING_VALUES, zr as MOBILE_STORAGE_VALUES } from "./schemas-CtieNRfz.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-CXTiPofQ.mjs";
3
+ import { t as createCliDefaultProjectConfigBase } from "./defaults-BzWJP6p0.mjs";
4
4
 
5
5
  //#region src/capabilities.ts
6
6
  const CAPABILITY_DEFINITIONS = { auth: [
@@ -274,6 +274,8 @@ const TYPESCRIPT_CATEGORY_ORDER = [
274
274
  "logging",
275
275
  "observability",
276
276
  "featureFlags",
277
+ "integrations",
278
+ "ecommerce",
277
279
  "analytics",
278
280
  "ai",
279
281
  "stateManagement",
@@ -304,6 +306,10 @@ const TYPESCRIPT_CATEGORY_ORDER = [
304
306
  ];
305
307
  const REACT_NATIVE_CATEGORY_ORDER = [
306
308
  "nativeFrontend",
309
+ "kotlinMobile",
310
+ "kotlinMobileLibraries",
311
+ "swiftMobile",
312
+ "dartMobile",
307
313
  "mobileNavigation",
308
314
  "mobileUI",
309
315
  "mobileStorage",
@@ -419,6 +425,7 @@ const JAVA_CATEGORY_ORDER = [
419
425
  "install"
420
426
  ];
421
427
  const DOTNET_CATEGORY_ORDER = [
428
+ "dotnetFrontend",
422
429
  "dotnetWebFramework",
423
430
  "dotnetOrm",
424
431
  "dotnetAuth",
@@ -499,6 +506,11 @@ function getCategoryDisplayName(categoryKey) {
499
506
  backendLibraries: "Effect Services",
500
507
  rustWebFramework: "Rust Web Framework",
501
508
  rustFrontend: "Rust Frontend (WASM)",
509
+ dotnetFrontend: ".NET Frontend",
510
+ kotlinMobile: "Kotlin Mobile",
511
+ kotlinMobileLibraries: "Kotlin Mobile Libraries",
512
+ swiftMobile: "Swift Mobile",
513
+ dartMobile: "Flutter / Dart Mobile",
502
514
  rustOrm: "Rust ORM / Database",
503
515
  rustApi: "Rust API Layer",
504
516
  rustCli: "Rust CLI Tools",
@@ -652,6 +664,8 @@ const CODE_QUALITY_VALUES = [
652
664
  "ultracite",
653
665
  "lefthook",
654
666
  "husky",
667
+ "knip",
668
+ "gitleaks",
655
669
  "ruler"
656
670
  ];
657
671
  const DOCUMENTATION_VALUES = ["starlight", "fumadocs"];
@@ -672,6 +686,7 @@ const APP_PLATFORM_VALUES = [
672
686
  "backend-utils",
673
687
  "devcontainer",
674
688
  "docker-compose",
689
+ "kong",
675
690
  "github-actions",
676
691
  "axios",
677
692
  "firebase",
@@ -695,6 +710,7 @@ const MULTI_SELECT_CATEGORIES = new Set([
695
710
  "javaLibraries",
696
711
  "javaTestingLibraries",
697
712
  "mobileLibraries",
713
+ "kotlinMobileLibraries",
698
714
  "dotnetLibraries",
699
715
  "dotnetTesting",
700
716
  "dotnetObservability",
@@ -740,6 +756,8 @@ const CATEGORY_VALUE_IDS = {
740
756
  uiLibrary: UI_LIBRARY_VALUES,
741
757
  cms: CMS_VALUES,
742
758
  featureFlags: FEATURE_FLAGS_VALUES,
759
+ integrations: INTEGRATIONS_VALUES,
760
+ ecommerce: ECOMMERCE_VALUES,
743
761
  analytics: ANALYTICS_VALUES,
744
762
  mobileNavigation: MOBILE_NAVIGATION_VALUES,
745
763
  mobileUI: MOBILE_UI_VALUES,
@@ -771,6 +789,11 @@ const CATEGORY_VALUE_IDS = {
771
789
  shadcnRadius: SHADCN_RADIUS_VALUES,
772
790
  rustWebFramework: RUST_WEB_FRAMEWORK_VALUES,
773
791
  rustFrontend: RUST_FRONTEND_VALUES,
792
+ dotnetFrontend: DOTNET_FRONTEND_VALUES,
793
+ kotlinMobile: KOTLIN_MOBILE_VALUES,
794
+ kotlinMobileLibraries: KOTLIN_MOBILE_LIBRARIES_VALUES,
795
+ swiftMobile: SWIFT_MOBILE_VALUES,
796
+ dartMobile: DART_MOBILE_VALUES,
774
797
  rustOrm: RUST_ORM_VALUES,
775
798
  rustApi: RUST_API_VALUES,
776
799
  rustCli: RUST_CLI_VALUES,
@@ -957,7 +980,8 @@ const EXACT_LABEL_OVERRIDES = {
957
980
  payments: {
958
981
  "lemon-squeezy": "Lemon Squeezy",
959
982
  dodo: "Dodo Payments",
960
- paypal: "PayPal"
983
+ paypal: "PayPal",
984
+ xendit: "Xendit"
961
985
  },
962
986
  email: {
963
987
  "react-email": "React Email",
@@ -971,6 +995,7 @@ const EXACT_LABEL_OVERRIDES = {
971
995
  },
972
996
  observability: {
973
997
  opentelemetry: "OpenTelemetry",
998
+ signoz: "SigNoz",
974
999
  datadog: "Datadog",
975
1000
  axiom: "Axiom",
976
1001
  betterstack: "Better Stack"
@@ -1065,6 +1090,8 @@ const EXACT_LABEL_OVERRIDES = {
1065
1090
  flagsmith: "Flagsmith",
1066
1091
  unleash: "Unleash"
1067
1092
  },
1093
+ integrations: { nango: "Nango" },
1094
+ ecommerce: { medusa: "MedusaJS" },
1068
1095
  analytics: {
1069
1096
  plausible: "Plausible",
1070
1097
  umami: "Umami",
@@ -1119,6 +1146,8 @@ const EXACT_LABEL_OVERRIDES = {
1119
1146
  ultracite: "Ultracite",
1120
1147
  lefthook: "Lefthook",
1121
1148
  husky: "Husky",
1149
+ knip: "Knip",
1150
+ gitleaks: "Gitleaks",
1122
1151
  ruler: "Ruler"
1123
1152
  },
1124
1153
  documentation: {
@@ -1144,6 +1173,7 @@ const EXACT_LABEL_OVERRIDES = {
1144
1173
  "tanstack-pacer": "TanStack Pacer",
1145
1174
  devcontainer: "DevContainer",
1146
1175
  "docker-compose": "Docker Compose",
1176
+ kong: "Kong Gateway",
1147
1177
  "github-actions": "GitHub Actions",
1148
1178
  axios: "Axios",
1149
1179
  firebase: "Firebase JS SDK",
@@ -1244,6 +1274,28 @@ const EXACT_LABEL_OVERRIDES = {
1244
1274
  dioxus: "Dioxus",
1245
1275
  yew: "Yew"
1246
1276
  },
1277
+ dotnetFrontend: {
1278
+ "blazor-webassembly": "Blazor WebAssembly",
1279
+ "blazor-web-app": "Blazor Web App"
1280
+ },
1281
+ kotlinMobile: {
1282
+ "jetpack-compose": "Jetpack Compose",
1283
+ "compose-multiplatform": "Compose Multiplatform"
1284
+ },
1285
+ kotlinMobileLibraries: {
1286
+ "navigation-compose": "Navigation Compose",
1287
+ voyager: "Voyager",
1288
+ koin: "Koin",
1289
+ "ktor-client": "Ktor Client",
1290
+ "kotlinx-serialization-json": "Kotlinx Serialization JSON",
1291
+ datastore: "DataStore",
1292
+ coil: "Coil",
1293
+ mockk: "MockK",
1294
+ turbine: "Turbine",
1295
+ junit5: "JUnit 5"
1296
+ },
1297
+ swiftMobile: { swiftui: "SwiftUI" },
1298
+ dartMobile: { flutter: "Flutter" },
1247
1299
  rustOrm: {
1248
1300
  "sea-orm": "SeaORM",
1249
1301
  sqlx: "SQLx",
@@ -1395,6 +1447,7 @@ const EXACT_LABEL_OVERRIDES = {
1395
1447
  },
1396
1448
  pythonObservability: {
1397
1449
  opentelemetry: "OpenTelemetry",
1450
+ signoz: "SigNoz",
1398
1451
  "prometheus-client": "Prometheus Client"
1399
1452
  },
1400
1453
  pythonCli: {
@@ -1484,6 +1537,7 @@ const EXACT_LABEL_OVERRIDES = {
1484
1537
  },
1485
1538
  goObservability: {
1486
1539
  opentelemetry: "OpenTelemetry",
1540
+ signoz: "SigNoz",
1487
1541
  prometheus: "Prometheus"
1488
1542
  },
1489
1543
  goValidation: { validator: "go-playground/validator" },
@@ -1498,6 +1552,7 @@ const EXACT_LABEL_OVERRIDES = {
1498
1552
  },
1499
1553
  javaWebFramework: {
1500
1554
  "spring-boot": "Spring Boot",
1555
+ ktor: "Ktor",
1501
1556
  quarkus: "Quarkus",
1502
1557
  micronaut: "Micronaut"
1503
1558
  },
@@ -1832,6 +1887,8 @@ const OPTION_CATEGORY_METADATA = {
1832
1887
  uiLibrary: buildCategoryMetadata("uiLibrary"),
1833
1888
  cms: buildCategoryMetadata("cms"),
1834
1889
  featureFlags: buildCategoryMetadata("featureFlags"),
1890
+ integrations: buildCategoryMetadata("integrations"),
1891
+ ecommerce: buildCategoryMetadata("ecommerce"),
1835
1892
  analytics: buildCategoryMetadata("analytics"),
1836
1893
  mobileNavigation: buildCategoryMetadata("mobileNavigation"),
1837
1894
  mobileUI: buildCategoryMetadata("mobileUI"),
@@ -1863,6 +1920,11 @@ const OPTION_CATEGORY_METADATA = {
1863
1920
  shadcnRadius: buildCategoryMetadata("shadcnRadius"),
1864
1921
  rustWebFramework: buildCategoryMetadata("rustWebFramework"),
1865
1922
  rustFrontend: buildCategoryMetadata("rustFrontend"),
1923
+ dotnetFrontend: buildCategoryMetadata("dotnetFrontend"),
1924
+ kotlinMobile: buildCategoryMetadata("kotlinMobile"),
1925
+ kotlinMobileLibraries: buildCategoryMetadata("kotlinMobileLibraries"),
1926
+ swiftMobile: buildCategoryMetadata("swiftMobile"),
1927
+ dartMobile: buildCategoryMetadata("dartMobile"),
1866
1928
  rustOrm: buildCategoryMetadata("rustOrm"),
1867
1929
  rustApi: buildCategoryMetadata("rustApi"),
1868
1930
  rustCli: buildCategoryMetadata("rustCli"),
@@ -1976,6 +2038,23 @@ function normalizeOptionId(category, value) {
1976
2038
 
1977
2039
  //#endregion
1978
2040
  //#region src/compatibility.ts
2041
+ const SIGNOZ_SUPPORTED_GO_WEB_FRAMEWORKS = new Set([
2042
+ "gin",
2043
+ "echo",
2044
+ "fiber",
2045
+ "chi",
2046
+ "stdlib"
2047
+ ]);
2048
+ const SIGNOZ_SUPPORTED_PYTHON_WEB_FRAMEWORKS = new Set(["fastapi"]);
2049
+ function isSignozSupportedGoWebFramework(framework) {
2050
+ return SIGNOZ_SUPPORTED_GO_WEB_FRAMEWORKS.has(framework);
2051
+ }
2052
+ function hasSignozSupportedGoServerTarget(stack) {
2053
+ return isSignozSupportedGoWebFramework(stack.goWebFramework ?? "none") || (stack.goWebFramework ?? "none") === "none" && (stack.goApi === "grpc-go" || stack.auth === "go-better-auth");
2054
+ }
2055
+ function isSignozSupportedPythonWebFramework(framework) {
2056
+ return SIGNOZ_SUPPORTED_PYTHON_WEB_FRAMEWORKS.has(framework);
2057
+ }
1979
2058
  const KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES = new Set([
1980
2059
  "testcontainers",
1981
2060
  "rest-assured",
@@ -1986,7 +2065,7 @@ const KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES = new Set([
1986
2065
  ]);
1987
2066
  const KOTLIN_DROPPED_JAVA_LIBRARIES = new Set(["lombok", "mapstruct"]);
1988
2067
  function getKotlinJavaIncompatibilityReason(stack) {
1989
- if (stack.javaWebFramework !== "spring-boot") return "Kotlin sources are only wired for the Spring Boot scaffold";
2068
+ if (stack.javaWebFramework !== "spring-boot" && stack.javaWebFramework !== "ktor") return "Kotlin sources are only wired for the Spring Boot and Ktor scaffolds";
1990
2069
  if (!stack.javaBuildTool || stack.javaBuildTool === "none") return "Kotlin requires Maven or Gradle";
1991
2070
  if (stack.javaOrm === "jooq" || stack.javaOrm === "mybatis") return "The Kotlin scaffold supports Spring Data JPA or no ORM (jOOQ/MyBatis sources are Java-only)";
1992
2071
  if (stack.javaApi === "grpc" || stack.javaApi === "openapi-generator") return "The Kotlin scaffold supports Spring GraphQL or no API layer (gRPC/OpenAPI codegen paths are Java-only)";
@@ -2071,6 +2150,20 @@ const requiresChatSdkVercelAI = (stack) => {
2071
2150
  * Nuxt is intentionally excluded from the MVP (different alias convention).
2072
2151
  */
2073
2152
  const SINGLE_APP_SELF_BACKENDS = new Set(["self-next", "self-tanstack-start"]);
2153
+ const SINGLE_APP_CONTAINER_ADDONS = new Set([
2154
+ "docker-compose",
2155
+ "devcontainer",
2156
+ "kong"
2157
+ ]);
2158
+ const FULLSTACK_SELF_BACKENDS = new Set([
2159
+ "self-next",
2160
+ "self-vinext",
2161
+ "self-tanstack-start",
2162
+ "self-astro",
2163
+ "self-nuxt",
2164
+ "self-svelte",
2165
+ "self-solid-start"
2166
+ ]);
2074
2167
  const SINGLE_APP_WEB_FRONTEND_BY_BACKEND = {
2075
2168
  "self-next": "next",
2076
2169
  "self-tanstack-start": "tanstack-start"
@@ -2085,6 +2178,7 @@ const SINGLE_APP_WEB_FRONTEND_BY_BACKEND = {
2085
2178
  */
2086
2179
  function stackQualifiesForSingleApp(stack) {
2087
2180
  if (!SINGLE_APP_SELF_BACKENDS.has(stack.backend)) return false;
2181
+ if ((stack.appPlatforms ?? []).some((addon) => SINGLE_APP_CONTAINER_ADDONS.has(addon))) return false;
2088
2182
  if ((stack.nativeFrontend ?? []).filter((f) => f && f !== "none").length > 0) return false;
2089
2183
  const webFrontends = (stack.webFrontend ?? []).filter((f) => f && f !== "none");
2090
2184
  if (webFrontends.length !== 1) return false;
@@ -2109,6 +2203,8 @@ function stackQualifiesForSingleApp(stack) {
2109
2203
  stack.aiSdk,
2110
2204
  stack.analytics,
2111
2205
  stack.featureFlags,
2206
+ stack.integrations,
2207
+ stack.ecommerce,
2112
2208
  stack.observability,
2113
2209
  stack.logging,
2114
2210
  stack.webDeploy,
@@ -2117,6 +2213,7 @@ function stackQualifiesForSingleApp(stack) {
2117
2213
  if ((stack.examples ?? []).filter((e) => e && e !== "none").length > 0) return false;
2118
2214
  return true;
2119
2215
  }
2216
+ const usesCloudflareFullstackRuntime = (stack) => stack.webDeploy === "cloudflare" && FULLSTACK_SELF_BACKENDS.has(stack.backend);
2120
2217
  const analyzeStackCompatibility = (stack) => {
2121
2218
  if (stack.yolo === "true") return {
2122
2219
  adjustedStack: null,
@@ -2125,9 +2222,55 @@ const analyzeStackCompatibility = (stack) => {
2125
2222
  };
2126
2223
  const nextStack = { ...stack };
2127
2224
  if (nextStack.vectorDb === void 0) nextStack.vectorDb = "none";
2225
+ if (nextStack.integrations === void 0) nextStack.integrations = "none";
2226
+ if (nextStack.ecommerce === void 0) nextStack.ecommerce = "none";
2128
2227
  let changed = false;
2129
2228
  const notes = {};
2130
2229
  const changes = [];
2230
+ if (nextStack.observability === "signoz" && (nextStack.backend === "none" || nextStack.backend === "convex")) {
2231
+ nextStack.observability = "none";
2232
+ changed = true;
2233
+ changes.push({
2234
+ category: "observability",
2235
+ message: "Observability set to 'None' (SigNoz tracing requires a generated server target)"
2236
+ });
2237
+ }
2238
+ if (nextStack.observability === "signoz" && (nextStack.backend === "self-tanstack-start" || nextStack.backend === "self-astro")) {
2239
+ nextStack.observability = "none";
2240
+ changed = true;
2241
+ changes.push({
2242
+ category: "observability",
2243
+ message: "Observability set to 'None' (SigNoz tracing is not yet bootstrapped for this fullstack frontend)"
2244
+ });
2245
+ }
2246
+ if (nextStack.observability === "signoz" && nextStack.webDeploy === "cloudflare" && (nextStack.backend === "self" || nextStack.backend.startsWith("self-"))) {
2247
+ nextStack.observability = "none";
2248
+ changed = true;
2249
+ changes.push({
2250
+ category: "observability",
2251
+ message: "Observability set to 'None' (SigNoz's Node SDK is incompatible with Cloudflare-hosted fullstack apps)"
2252
+ });
2253
+ }
2254
+ if (nextStack.ecosystem !== "typescript" && nextStack.ecosystem !== "react-native" && nextStack.codeQuality.includes("knip")) {
2255
+ nextStack.codeQuality = nextStack.codeQuality.filter((addon) => addon !== "knip");
2256
+ changed = true;
2257
+ changes.push({
2258
+ category: "codeQuality",
2259
+ message: "Removed Knip (Knip requires a TypeScript or React Native workspace)"
2260
+ });
2261
+ }
2262
+ if (nextStack.ecosystem === "react-native") {
2263
+ const supportedCodeQuality = new Set(["knip", "gitleaks"]);
2264
+ const filteredCodeQuality = nextStack.codeQuality.filter((addon) => supportedCodeQuality.has(addon));
2265
+ if (filteredCodeQuality.length !== nextStack.codeQuality.length) {
2266
+ nextStack.codeQuality = filteredCodeQuality;
2267
+ changed = true;
2268
+ changes.push({
2269
+ category: "codeQuality",
2270
+ message: "Removed code-quality tools that are not supported by React Native projects"
2271
+ });
2272
+ }
2273
+ }
2131
2274
  for (const cat of CATEGORY_ORDER) notes[cat] = {
2132
2275
  notes: [],
2133
2276
  hasIssue: false
@@ -2143,7 +2286,9 @@ const analyzeStackCompatibility = (stack) => {
2143
2286
  search: "none",
2144
2287
  vectorDb: "none",
2145
2288
  rateLimit: "none",
2146
- fileStorage: "none"
2289
+ fileStorage: "none",
2290
+ integrations: "none",
2291
+ ecommerce: "none"
2147
2292
  })) {
2148
2293
  const catKey = key;
2149
2294
  if (nextStack[catKey] !== value) {
@@ -2211,7 +2356,9 @@ const analyzeStackCompatibility = (stack) => {
2211
2356
  search: "none",
2212
2357
  vectorDb: "none",
2213
2358
  rateLimit: "none",
2214
- fileStorage: "none"
2359
+ fileStorage: "none",
2360
+ integrations: "none",
2361
+ ecommerce: "none"
2215
2362
  };
2216
2363
  if (nextStack.ecosystem !== "go") noneOverrides.auth = "none";
2217
2364
  for (const [key, value] of Object.entries(noneOverrides)) {
@@ -2343,6 +2490,14 @@ const analyzeStackCompatibility = (stack) => {
2343
2490
  message: "Backend set to 'Hono' (required for Workers)"
2344
2491
  });
2345
2492
  }
2493
+ if (nextStack.runtime === "workers" && nextStack.observability === "signoz") {
2494
+ nextStack.observability = "none";
2495
+ changed = true;
2496
+ changes.push({
2497
+ category: "observability",
2498
+ message: "Observability set to 'None' (SigNoz requires the Node.js or Bun runtime)"
2499
+ });
2500
+ }
2346
2501
  if (nextStack.runtime === "workers" && nextStack.serverDeploy === "none") {
2347
2502
  nextStack.serverDeploy = "cloudflare";
2348
2503
  changed = true;
@@ -2361,6 +2516,14 @@ const analyzeStackCompatibility = (stack) => {
2361
2516
  message: "Database changed to SQLite with D1 (Better-Fullstack doesn't support MongoDB with Workers)"
2362
2517
  });
2363
2518
  }
2519
+ if ((nextStack.runtime === "workers" || usesCloudflareFullstackRuntime(nextStack)) && nextStack.integrations !== "none") {
2520
+ nextStack.integrations = "none";
2521
+ changed = true;
2522
+ changes.push({
2523
+ category: "integrations",
2524
+ message: "Integrations set to 'none' (Nango's Node SDK is not available on Cloudflare Workers)"
2525
+ });
2526
+ }
2364
2527
  if (nextStack.runtime === "none" && nextStack.backend !== "convex" && nextStack.backend !== "none" && nextStack.backend !== "self-next" && nextStack.backend !== "self-vinext" && nextStack.backend !== "self-tanstack-start" && nextStack.backend !== "self-astro" && nextStack.backend !== "self-nuxt" && nextStack.backend !== "self-svelte" && nextStack.backend !== "self-solid-start") {
2365
2528
  nextStack.runtime = DEFAULT_RUNTIME;
2366
2529
  changed = true;
@@ -2683,6 +2846,14 @@ const analyzeStackCompatibility = (stack) => {
2683
2846
  });
2684
2847
  }
2685
2848
  }
2849
+ if (nextStack.payments === "xendit" && ["none", "convex"].includes(nextStack.backend)) {
2850
+ nextStack.payments = "none";
2851
+ changed = true;
2852
+ changes.push({
2853
+ category: "payments",
2854
+ message: "Payments set to 'None' (Xendit Payment Sessions require a server backend)"
2855
+ });
2856
+ }
2686
2857
  if (["openai-sdk", "anthropic-sdk"].includes(nextStack.aiSdk) && ["none", "convex"].includes(nextStack.backend)) {
2687
2858
  nextStack.aiSdk = "none";
2688
2859
  changed = true;
@@ -2873,6 +3044,16 @@ const analyzeStackCompatibility = (stack) => {
2873
3044
  "none",
2874
3045
  "Feature flags set to 'None' (React Native ecosystem)"
2875
3046
  ],
3047
+ [
3048
+ "ecommerce",
3049
+ "none",
3050
+ "E-commerce set to 'None' (React Native ecosystem)"
3051
+ ],
3052
+ [
3053
+ "integrations",
3054
+ "none",
3055
+ "Integrations set to 'None' (React Native ecosystem)"
3056
+ ],
2876
3057
  [
2877
3058
  "analytics",
2878
3059
  "none",
@@ -3010,6 +3191,14 @@ const analyzeStackCompatibility = (stack) => {
3010
3191
  });
3011
3192
  }
3012
3193
  }
3194
+ if ((nextStack.kotlinMobile === void 0 || nextStack.kotlinMobile === "none") && (nextStack.kotlinMobileLibraries?.length ?? 0) > 0) {
3195
+ nextStack.kotlinMobileLibraries = [];
3196
+ changed = true;
3197
+ changes.push({
3198
+ category: "kotlinMobileLibraries",
3199
+ message: "Kotlin mobile libraries cleared (no Kotlin mobile app)"
3200
+ });
3201
+ }
3013
3202
  const styledComponentsFrontends = new Set([
3014
3203
  "tanstack-router",
3015
3204
  "react-router",
@@ -3137,6 +3326,22 @@ const analyzeStackCompatibility = (stack) => {
3137
3326
  message: `${platform === "electron" ? "Electron" : "Capacitor"} removed (requires compatible frontend)`
3138
3327
  });
3139
3328
  }
3329
+ for (const platform of [
3330
+ "docker-compose",
3331
+ "devcontainer",
3332
+ "kong"
3333
+ ]) {
3334
+ if (!nextStack.appPlatforms.includes(platform)) continue;
3335
+ const reason = getDisabledReason(nextStack, "appPlatforms", platform);
3336
+ if (!reason) continue;
3337
+ nextStack.appPlatforms = nextStack.appPlatforms.filter((addon) => addon !== platform);
3338
+ changed = true;
3339
+ const label = platform === "docker-compose" ? "Docker Compose" : platform === "devcontainer" ? "DevContainer" : "Kong Gateway";
3340
+ changes.push({
3341
+ category: "appPlatforms",
3342
+ message: `${label} removed (${reason})`
3343
+ });
3344
+ }
3140
3345
  if (nextStack.appPlatforms.includes("graphql-codegen") && ![
3141
3346
  "garph",
3142
3347
  "graphql-yoga",
@@ -3255,6 +3460,14 @@ const analyzeStackCompatibility = (stack) => {
3255
3460
  }
3256
3461
  }
3257
3462
  if (nextStack.ecosystem === "python") {
3463
+ if (nextStack.pythonObservability === "signoz" && !isSignozSupportedPythonWebFramework(nextStack.pythonWebFramework)) {
3464
+ nextStack.pythonObservability = "none";
3465
+ changed = true;
3466
+ changes.push({
3467
+ category: "pythonObservability",
3468
+ message: "Python observability set to 'None' (SigNoz request tracing is wired for FastAPI)"
3469
+ });
3470
+ }
3258
3471
  if (nextStack.pythonWebFramework !== "django" && nextStack.pythonApi !== "none") {
3259
3472
  nextStack.pythonApi = "none";
3260
3473
  changed = true;
@@ -3320,6 +3533,14 @@ const analyzeStackCompatibility = (stack) => {
3320
3533
  });
3321
3534
  }
3322
3535
  }
3536
+ if (nextStack.ecosystem === "go" && nextStack.goObservability === "signoz" && !hasSignozSupportedGoServerTarget(nextStack)) {
3537
+ nextStack.goObservability = "none";
3538
+ changed = true;
3539
+ changes.push({
3540
+ category: "goObservability",
3541
+ message: "Go observability set to 'None' (SigNoz requires an instrumented HTTP, gRPC, or Go Better Auth server target)"
3542
+ });
3543
+ }
3323
3544
  if (nextStack.ecosystem === "java") {
3324
3545
  if (nextStack.javaBuildTool === "none") {
3325
3546
  if (nextStack.javaWebFramework !== "none") {
@@ -3580,6 +3801,14 @@ const analyzeStackCompatibility = (stack) => {
3580
3801
  * - Follow CLI behavior: filter options based on UPSTREAM selections only
3581
3802
  */
3582
3803
  const getDisabledReason = (currentStack, category, optionId) => {
3804
+ if (currentStack.ecosystem === "react-native" && category === "codeQuality" && optionId !== "knip" && optionId !== "gitleaks") return "React Native code quality currently supports Knip and Gitleaks only";
3805
+ if (category === "codeQuality" && optionId === "knip" && currentStack.ecosystem !== "typescript" && currentStack.ecosystem !== "react-native") return "Knip requires a TypeScript or React Native workspace";
3806
+ if ((category === "observability" && optionId === "signoz" || category === "backend" && currentStack.observability === "signoz") && (category === "backend" ? optionId === "none" || optionId === "convex" : currentStack.backend === "none" || currentStack.backend === "convex")) return "SigNoz tracing requires a generated server target";
3807
+ if ((category === "observability" && optionId === "signoz" || category === "backend" && currentStack.observability === "signoz") && (category === "backend" ? optionId === "self-tanstack-start" || optionId === "self-astro" : currentStack.backend === "self-tanstack-start" || currentStack.backend === "self-astro")) return "SigNoz tracing is not yet bootstrapped for TanStack Start or Astro fullstack apps";
3808
+ const signozBackend = category === "backend" ? optionId : currentStack.backend;
3809
+ const signozWebDeploy = category === "webDeploy" ? optionId : currentStack.webDeploy;
3810
+ if ((category === "observability" && optionId === "signoz" || currentStack.observability === "signoz") && signozWebDeploy === "cloudflare" && (signozBackend === "self" || signozBackend.startsWith("self-"))) return "SigNoz's Node SDK is incompatible with Cloudflare-hosted fullstack apps";
3811
+ if (category === "appPlatforms" && optionId === "kong" && currentStack.ecosystem === "typescript" && currentStack.backend === "encore") return "Kong Gateway does not yet support Encore's container workflow";
3583
3812
  const hasStandaloneViteFrontend = currentStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend));
3584
3813
  if (category === "api" && hasStandaloneViteFrontend && [
3585
3814
  "trpc",
@@ -3631,7 +3860,8 @@ const getDisabledReason = (currentStack, category, optionId) => {
3631
3860
  "packageManager",
3632
3861
  "aiDocs",
3633
3862
  "git",
3634
- "install"
3863
+ "install",
3864
+ "codeQuality"
3635
3865
  ]);
3636
3866
  if (category === "payments" && optionId !== "none" && optionId !== "revenuecat") return "React Native payments currently support RevenueCat only";
3637
3867
  if (!reactNativeCategories.has(category) && optionId !== "none" && optionId !== "false") return "React Native ecosystem only supports native mobile options";
@@ -3648,6 +3878,8 @@ const getDisabledReason = (currentStack, category, optionId) => {
3648
3878
  if (category === "vectorDb" && optionId !== "none") return "No backend selected";
3649
3879
  if (category === "rateLimit" && optionId !== "none") return "No backend selected";
3650
3880
  if (category === "fileStorage" && optionId !== "none") return "No backend selected";
3881
+ if (category === "integrations" && optionId !== "none") return "No backend selected";
3882
+ if (category === "ecommerce" && optionId !== "none") return "No backend selected";
3651
3883
  if (category === "examples" && optionId !== "none") return "No backend selected";
3652
3884
  }
3653
3885
  if (currentStack.backend === "effect") {
@@ -3659,7 +3891,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
3659
3891
  if (kotlinBlocker) return kotlinBlocker;
3660
3892
  }
3661
3893
  if (currentStack.ecosystem === "java" && currentStack.javaLanguage === "kotlin") {
3662
- if (category === "javaWebFramework" && optionId !== "spring-boot") return "Kotlin sources are only wired for the Spring Boot scaffold";
3894
+ if (category === "javaWebFramework" && optionId !== "spring-boot" && optionId !== "ktor") return "Kotlin sources are only wired for the Spring Boot and Ktor scaffolds";
3663
3895
  if (category === "javaBuildTool" && optionId === "none") return "Kotlin requires Maven or Gradle";
3664
3896
  if (category === "javaOrm" && (optionId === "jooq" || optionId === "mybatis")) return "The Kotlin scaffold supports Spring Data JPA or no ORM (jOOQ/MyBatis sources are Java-only)";
3665
3897
  if (category === "javaApi" && (optionId === "grpc" || optionId === "openapi-generator")) return "The Kotlin scaffold supports Spring GraphQL or no API layer (gRPC/OpenAPI codegen paths are Java-only)";
@@ -3685,6 +3917,16 @@ const getDisabledReason = (currentStack, category, optionId) => {
3685
3917
  if (optionId !== "none" && currentStack.pythonWebFramework !== "django") return "Python API frameworks currently require Django";
3686
3918
  }
3687
3919
  if (category === "pythonServer" && optionId === "gunicorn" && (currentStack.pythonWebFramework === "streamlit" || currentStack.pythonWebFramework === "none")) return "Gunicorn requires a WSGI, ASGI, or aiohttp application";
3920
+ if (category === "observability" && optionId === "signoz" && currentStack.runtime === "workers" || category === "runtime" && optionId === "workers" && currentStack.observability === "signoz") return "SigNoz tracing currently requires the Node.js or Bun runtime";
3921
+ if ((category === "goObservability" && optionId === "signoz" || category === "goWebFramework" && currentStack.goObservability === "signoz" || category === "goApi" && currentStack.goObservability === "signoz" || category === "auth" && currentStack.goObservability === "signoz") && !hasSignozSupportedGoServerTarget({
3922
+ ...currentStack,
3923
+ ...category === "goWebFramework" ? { goWebFramework: optionId } : {},
3924
+ ...category === "goApi" ? { goApi: optionId } : {},
3925
+ ...category === "auth" ? { auth: optionId } : {}
3926
+ })) return "SigNoz requires Gin, Echo, Fiber, Chi, net/http, gRPC, or Go Better Auth to provide a server target";
3927
+ if ((category === "pythonObservability" && optionId === "signoz" || category === "pythonWebFramework" && currentStack.pythonObservability === "signoz") && !isSignozSupportedPythonWebFramework(category === "pythonWebFramework" ? optionId : currentStack.pythonWebFramework)) return "SigNoz request tracing is currently wired for FastAPI";
3928
+ if (category === "integrations" && optionId === "nango" && usesCloudflareFullstackRuntime(currentStack)) return "Nango's Node SDK is not available on Cloudflare Workers";
3929
+ if (category === "webDeploy" && optionId === "cloudflare" && currentStack.integrations === "nango" && FULLSTACK_SELF_BACKENDS.has(currentStack.backend)) return "Nango's Node SDK is not available on Cloudflare Workers";
3688
3930
  const graphDisabledReason = category === "payments" && optionId === "revenuecat" || category === "i18n" && optionId === "intlayer" ? {
3689
3931
  handled: false,
3690
3932
  authoritative: false,
@@ -3741,6 +3983,8 @@ const getDisabledReason = (currentStack, category, optionId) => {
3741
3983
  if (currentStack.runtime === "workers" && optionId !== "hono" && optionId !== "none") return "In Better-Fullstack, Workers runtime is currently supported only with Hono";
3742
3984
  }
3743
3985
  if (category === "runtime") {
3986
+ if (optionId === "workers" && currentStack.observability === "signoz") return "SigNoz tracing currently requires the Node.js or Bun runtime";
3987
+ if (optionId === "workers" && currentStack.integrations === "nango") return "Nango's Node SDK is not available on Workers runtime";
3744
3988
  if (optionId === "workers" && currentStack.backend !== "hono") return "In Better-Fullstack, Workers runtime currently requires the Hono backend";
3745
3989
  if (optionId === "workers" && currentStack.cms === "keystatic" && currentStack.webFrontend.includes("astro") && !currentStack.webFrontend.includes("next")) return "Keystatic's Astro integration is not Astro 7-compatible yet.";
3746
3990
  if (optionId === "none") {
@@ -3867,6 +4111,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
3867
4111
  if (!currentStack.webFrontend.some((f) => f !== "none")) return "PayPal requires a web frontend";
3868
4112
  if (["none", "convex"].includes(currentStack.backend)) return "PayPal checkout requires a standalone or fullstack backend";
3869
4113
  }
4114
+ if (category === "payments" && optionId === "xendit" && ["none", "convex"].includes(currentStack.backend)) return "Xendit Payment Sessions require a standalone or fullstack backend";
3870
4115
  if (category === "cms" && optionId === "payload") {
3871
4116
  if (!currentStack.webFrontend.includes("next")) return "Payload CMS v3 requires Next.js";
3872
4117
  }
@@ -3879,9 +4124,20 @@ const getDisabledReason = (currentStack, category, optionId) => {
3879
4124
  if (currentStack.backend === "convex") return "Email integration is not available with Convex backend";
3880
4125
  if (currentStack.backend === "none") return "Email integration requires a backend";
3881
4126
  }
4127
+ if (category === "ecommerce" && optionId !== "none") {
4128
+ if (currentStack.ecosystem !== "typescript") return "MedusaJS SDK generation is only available for the TypeScript ecosystem";
4129
+ if (currentStack.backend === "convex") return "MedusaJS SDK generation is not available with Convex backend";
4130
+ if (currentStack.backend === "none") return "MedusaJS SDK generation requires a backend";
4131
+ }
3882
4132
  if (category === "observability" && optionId !== "none") {
3883
4133
  if (currentStack.ecosystem !== "typescript") return null;
3884
4134
  }
4135
+ if (category === "integrations" && optionId !== "none") {
4136
+ if (currentStack.ecosystem !== "typescript") return "Nango SDK generation is only available for the TypeScript ecosystem";
4137
+ if (currentStack.backend === "convex") return "Nango SDK generation is not available with Convex backend";
4138
+ if (currentStack.backend === "none") return "Nango SDK generation requires a backend";
4139
+ if (currentStack.runtime === "workers" || usesCloudflareFullstackRuntime(currentStack)) return "Nango's Node SDK is not available on Cloudflare Workers";
4140
+ }
3885
4141
  if (category === "caching" && optionId === "redis" && currentStack.ecosystem !== "typescript") return "Self-hosted Redis caching (ioredis) is only available for the TypeScript ecosystem";
3886
4142
  if (category === "caching" && optionId !== "none") {
3887
4143
  if (currentStack.ecosystem !== "typescript") return null;
@@ -4944,6 +5200,8 @@ const ADDON_COMPATIBILITY = {
4944
5200
  prettier: [],
4945
5201
  husky: [],
4946
5202
  lefthook: [],
5203
+ knip: [],
5204
+ gitleaks: [],
4947
5205
  turborepo: [],
4948
5206
  nx: [],
4949
5207
  starlight: [],
@@ -5095,6 +5353,7 @@ const ADDON_COMPATIBILITY = {
5095
5353
  ],
5096
5354
  "backend-utils": [],
5097
5355
  "docker-compose": [],
5356
+ kong: [],
5098
5357
  devcontainer: [],
5099
5358
  "github-actions": [],
5100
5359
  none: []
@@ -5428,6 +5687,8 @@ function evaluateCompatibility(input) {
5428
5687
  ["animation", input.animation],
5429
5688
  ["cms", input.cms],
5430
5689
  ["featureFlags", input.featureFlags],
5690
+ ["integrations", input.integrations],
5691
+ ["ecommerce", input.ecommerce],
5431
5692
  ["pythonApi", input.pythonApi],
5432
5693
  ["javaWebFramework", input.javaWebFramework],
5433
5694
  ["javaBuildTool", input.javaBuildTool],
@@ -5585,6 +5846,8 @@ const DEFAULT_STACK_SELECTION = {
5585
5846
  logging: "none",
5586
5847
  observability: "none",
5587
5848
  featureFlags: "none",
5849
+ integrations: "none",
5850
+ ecommerce: "none",
5588
5851
  analytics: "none",
5589
5852
  mobileNavigation: "none",
5590
5853
  mobileUI: "none",
@@ -5635,6 +5898,11 @@ const DEFAULT_STACK_SELECTION = {
5635
5898
  yolo: "false",
5636
5899
  rustWebFramework: "axum",
5637
5900
  rustFrontend: "none",
5901
+ dotnetFrontend: "none",
5902
+ kotlinMobile: "none",
5903
+ kotlinMobileLibraries: [],
5904
+ swiftMobile: "none",
5905
+ dartMobile: "none",
5638
5906
  rustOrm: "sea-orm",
5639
5907
  rustApi: "none",
5640
5908
  rustCli: "none",
@@ -5752,6 +6020,8 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
5752
6020
  logging: "logging",
5753
6021
  observability: "observability",
5754
6022
  featureFlags: "featureFlags",
6023
+ integrations: "integrations",
6024
+ ecommerce: "ecommerce",
5755
6025
  analytics: "analytics",
5756
6026
  mobileNavigation: "mobileNavigation",
5757
6027
  mobileUI: "mobileUI",
@@ -5801,6 +6071,11 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
5801
6071
  serverDeploy: "serverDeploy",
5802
6072
  rustWebFramework: "rustWebFramework",
5803
6073
  rustFrontend: "rustFrontend",
6074
+ dotnetFrontend: "dotnetFrontend",
6075
+ kotlinMobile: "kotlinMobile",
6076
+ kotlinMobileLibraries: "kotlinMobileLibraries",
6077
+ swiftMobile: "swiftMobile",
6078
+ dartMobile: "dartMobile",
5804
6079
  rustOrm: "rustOrm",
5805
6080
  rustApi: "rustApi",
5806
6081
  rustCli: "rustCli",
@@ -5932,6 +6207,8 @@ const STACK_SELECTION_URL_KEYS = {
5932
6207
  logging: "log",
5933
6208
  observability: "obs",
5934
6209
  featureFlags: "ff",
6210
+ integrations: "int",
6211
+ ecommerce: "ecm",
5935
6212
  analytics: "an",
5936
6213
  mobileNavigation: "mn",
5937
6214
  mobileUI: "mui",
@@ -5982,6 +6259,11 @@ const STACK_SELECTION_URL_KEYS = {
5982
6259
  yolo: "yolo",
5983
6260
  rustWebFramework: "rwf",
5984
6261
  rustFrontend: "rfe",
6262
+ dotnetFrontend: "dnfe",
6263
+ kotlinMobile: "km",
6264
+ kotlinMobileLibraries: "kmlib",
6265
+ swiftMobile: "sm",
6266
+ dartMobile: "dm",
5985
6267
  rustOrm: "rorm",
5986
6268
  rustApi: "rapi",
5987
6269
  rustCli: "rcli",
@@ -6210,6 +6492,8 @@ const CLI_SCALAR_CONFIG_FIELDS = [
6210
6492
  ["mobileOTA", "mobileOTA"],
6211
6493
  ["mobileDeepLinking", "mobileDeepLinking"],
6212
6494
  ["featureFlags", "featureFlags"],
6495
+ ["integrations", "integrations"],
6496
+ ["ecommerce", "ecommerce"],
6213
6497
  ["fileUpload", "fileUpload"],
6214
6498
  ["git", "git"],
6215
6499
  ["install", "install"],
@@ -6232,6 +6516,10 @@ const CLI_SCALAR_CONFIG_FIELDS = [
6232
6516
  ["shadcnRadius", "shadcnRadius"],
6233
6517
  ["rustWebFramework", "rustWebFramework"],
6234
6518
  ["rustFrontend", "rustFrontend"],
6519
+ ["dotnetFrontend", "dotnetFrontend"],
6520
+ ["kotlinMobile", "kotlinMobile"],
6521
+ ["swiftMobile", "swiftMobile"],
6522
+ ["dartMobile", "dartMobile"],
6235
6523
  ["rustOrm", "rustOrm"],
6236
6524
  ["rustApi", "rustApi"],
6237
6525
  ["rustCli", "rustCli"],
@@ -6322,6 +6610,7 @@ const CLI_NON_EMPTY_ARRAY_CONFIG_FIELDS = [
6322
6610
  const CLI_DEFINED_ARRAY_CONFIG_FIELDS = [
6323
6611
  ["aiDocs", "aiDocs"],
6324
6612
  ["mobileLibraries", "mobileLibraries"],
6613
+ ["kotlinMobileLibraries", "kotlinMobileLibraries"],
6325
6614
  ["rustLibraries", "rustLibraries"],
6326
6615
  ["pythonAi", "pythonAi"],
6327
6616
  ["javaLibraries", "javaLibraries"],
@@ -6476,7 +6765,7 @@ function processCliArrayOption(options) {
6476
6765
  return options.filter((item) => item !== "none");
6477
6766
  }
6478
6767
  function toUniqueNonNoneArray(values) {
6479
- return [...new Set(withoutNone(values))];
6768
+ return [...new Set(withoutNone(values ?? []))];
6480
6769
  }
6481
6770
  function formatArrayFlag(flag, values) {
6482
6771
  return `--${flag} ${toUniqueNonNoneArray(values).join(" ") || "none"}`;
@@ -6490,7 +6779,6 @@ function formatTypeScriptAddonsFlag(selection) {
6490
6779
  if (addons.length === 0) return "--addons none";
6491
6780
  return `--addons ${toUniqueNonNoneArray(addons).join(" ") || "none"}`;
6492
6781
  }
6493
- const GRAPH_TYPESCRIPT_FRONTEND_FLAG_KEYS = [["validation", "validation"], ["testing", "testing"]];
6494
6782
  const GRAPH_SHADCN_FLAG_KEYS = [
6495
6783
  ["shadcnBase", "shadcn-base"],
6496
6784
  ["shadcnStyle", "shadcn-style"],
@@ -6501,14 +6789,7 @@ const GRAPH_SHADCN_FLAG_KEYS = [
6501
6789
  ["shadcnRadius", "shadcn-radius"]
6502
6790
  ];
6503
6791
  const GRAPH_MOBILE_FLAG_KEYS = [];
6504
- const GRAPH_TYPESCRIPT_BACKEND_FLAG_KEYS = [["backendLibraries", "effect"]];
6505
- const GRAPH_SHARED_BACKEND_FLAG_KEYS = [
6506
- ["email", "email"],
6507
- ["observability", "observability"],
6508
- ["caching", "caching"],
6509
- ["rateLimit", "rate-limit"],
6510
- ["search", "search"]
6511
- ];
6792
+ const GRAPH_SHARED_BACKEND_FLAG_KEYS = [["rateLimit", "rate-limit"]];
6512
6793
  const GRAPH_ELIXIR_BACKEND_FLAG_KEYS = [["elixirJson", "elixir-json"]];
6513
6794
  function formatChangedStringFlag(selection, key, flag) {
6514
6795
  return selection[key] === DEFAULT_STACK_SELECTION[key] ? void 0 : `--${flag} ${selection[key]}`;
@@ -6544,12 +6825,17 @@ const GRAPH_TYPESCRIPT_BACKEND_PART_SELECTION_KEYS = [
6544
6825
  ["logging", "logging"],
6545
6826
  ["observability", "observability"],
6546
6827
  ["featureFlags", "featureFlags"],
6828
+ ["integrations", "integrations"],
6829
+ ["ecommerce", "ecommerce"],
6547
6830
  ["caching", "caching"],
6548
6831
  ["rateLimit", "rateLimit"],
6549
6832
  ["cms", "cms"],
6550
6833
  ["search", "search"],
6551
6834
  ["vectorDb", "vectorDb"],
6552
- ["fileStorage", "fileStorage"]
6835
+ ["fileStorage", "fileStorage"],
6836
+ ["backendLibraries", "effect"],
6837
+ ["validation", "validation"],
6838
+ ["testing", "testing"]
6553
6839
  ];
6554
6840
  const GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS = [
6555
6841
  ["elixirRealtime", "realtime"],
@@ -6570,6 +6856,8 @@ const GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS = [
6570
6856
  ];
6571
6857
  const GRAPH_DATABASE_PART_SELECTION_KEYS = [["dbSetup", "dbSetup"]];
6572
6858
  const GRAPH_MOBILE_PART_SELECTION_KEYS = [
6859
+ ["auth", "auth"],
6860
+ ["payments", "payments"],
6573
6861
  ["mobileNavigation", "navigation"],
6574
6862
  ["mobileUI", "ui"],
6575
6863
  ["mobileStorage", "storage"],
@@ -6579,10 +6867,17 @@ const GRAPH_MOBILE_PART_SELECTION_KEYS = [
6579
6867
  ["mobileDeepLinking", "deepLinking"]
6580
6868
  ];
6581
6869
  const GRAPH_MOBILE_ARRAY_PART_SELECTION_KEYS = [["mobileLibraries", "libraries"]];
6870
+ const GRAPH_KOTLIN_MOBILE_ARRAY_PART_SELECTION_KEYS = [["kotlinMobileLibraries", "libraries"]];
6582
6871
  const GRAPH_RUST_BACKEND_PART_SELECTION_KEYS = [
6583
6872
  ["rustCli", "cli"],
6584
6873
  ["rustLogging", "logging"],
6585
6874
  ["rustErrorHandling", "errorHandling"],
6875
+ ["rustRealtime", "realtime"],
6876
+ ["rustMessageQueue", "jobQueue"],
6877
+ ["rustObservability", "observability"],
6878
+ ["rustTemplating", "templating"],
6879
+ ["email", "email"],
6880
+ ["observability", "observability"],
6586
6881
  ["caching", "caching"],
6587
6882
  ["search", "search"],
6588
6883
  ["rustCaching", "caching"]
@@ -6599,10 +6894,20 @@ const GRAPH_PYTHON_BACKEND_PART_SELECTION_KEYS = [
6599
6894
  ["pythonServer", "server"],
6600
6895
  ["pythonPackageManager", "packageManager"],
6601
6896
  ["pythonMessageQueue", "messageQueue"],
6897
+ ["pythonCaching", "caching"],
6898
+ ["pythonRealtime", "realtime"],
6899
+ ["pythonObservability", "observability"],
6900
+ ["email", "email"],
6901
+ ["observability", "observability"],
6602
6902
  ["caching", "caching"],
6603
6903
  ["search", "search"]
6604
6904
  ];
6605
- const GRAPH_PYTHON_BACKEND_ARRAY_PART_SELECTION_KEYS = [["pythonAi", "ai"], ["pythonData", "data"]];
6905
+ const GRAPH_PYTHON_BACKEND_ARRAY_PART_SELECTION_KEYS = [
6906
+ ["pythonAi", "ai"],
6907
+ ["pythonTesting", "testing"],
6908
+ ["pythonCli", "cli"],
6909
+ ["pythonData", "data"]
6910
+ ];
6606
6911
  const GRAPH_GO_BACKEND_PART_SELECTION_KEYS = [
6607
6912
  ["goCli", "cli"],
6608
6913
  ["goLogging", "logging"],
@@ -6612,12 +6917,23 @@ const GRAPH_GO_BACKEND_PART_SELECTION_KEYS = [
6612
6917
  ["goTemplating", "templating"],
6613
6918
  ["goProtoTooling", "buildTool"],
6614
6919
  ["goDI", "libraries"],
6920
+ ["goRealtime", "realtime"],
6921
+ ["goMessageQueue", "jobQueue"],
6922
+ ["goCaching", "caching"],
6923
+ ["goConfig", "config"],
6924
+ ["goObservability", "observability"],
6925
+ ["email", "email"],
6926
+ ["observability", "observability"],
6615
6927
  ["caching", "caching"],
6616
6928
  ["search", "search"]
6617
6929
  ];
6930
+ const GRAPH_GO_BACKEND_ARRAY_PART_SELECTION_KEYS = [["goTesting", "testing"]];
6618
6931
  const GRAPH_JAVA_BACKEND_PART_SELECTION_KEYS = [
6619
6932
  ["javaLanguage", "language"],
6620
6933
  ["javaBuildTool", "buildTool"],
6934
+ ["javaLogging", "logging"],
6935
+ ["email", "email"],
6936
+ ["observability", "observability"],
6621
6937
  ["caching", "caching"],
6622
6938
  ["search", "search"]
6623
6939
  ];
@@ -6628,6 +6944,7 @@ const GRAPH_DOTNET_BACKEND_PART_SELECTION_KEYS = [
6628
6944
  ["dotnetApi", "api"],
6629
6945
  ["dotnetJobQueue", "jobQueue"],
6630
6946
  ["dotnetRealtime", "realtime"],
6947
+ ["dotnetValidation", "validation"],
6631
6948
  ["dotnetCaching", "caching"],
6632
6949
  ["dotnetDeploy", "deploy"]
6633
6950
  ];
@@ -6636,6 +6953,7 @@ const GRAPH_DOTNET_BACKEND_ARRAY_PART_SELECTION_KEYS = [
6636
6953
  ["dotnetObservability", "observability"],
6637
6954
  ["dotnetLibraries", "libraries"]
6638
6955
  ];
6956
+ const GRAPH_ELIXIR_BACKEND_ARRAY_PART_SELECTION_KEYS = [["elixirLibraries", "libraries"]];
6639
6957
  const GRAPH_TYPESCRIPT_FRONTEND_PART_CLI_KEYS = [
6640
6958
  ["webDeploy", "deploy"],
6641
6959
  ["cssFramework", "css"],
@@ -6645,7 +6963,9 @@ const GRAPH_TYPESCRIPT_FRONTEND_PART_CLI_KEYS = [
6645
6963
  ["animation", "animation"],
6646
6964
  ["fileUpload", "fileUpload"],
6647
6965
  ["i18n", "i18n"],
6648
- ["analytics", "analytics"]
6966
+ ["analytics", "analytics"],
6967
+ ["validation", "validation"],
6968
+ ["testing", "testing"]
6649
6969
  ];
6650
6970
  const GRAPH_TYPESCRIPT_BACKEND_PART_CLI_KEYS = [
6651
6971
  ["runtime", "runtime"],
@@ -6658,12 +6978,15 @@ const GRAPH_TYPESCRIPT_BACKEND_PART_CLI_KEYS = [
6658
6978
  ["logging", "logging"],
6659
6979
  ["observability", "observability"],
6660
6980
  ["featureFlags", "featureFlags"],
6981
+ ["integrations", "integrations"],
6982
+ ["ecommerce", "ecommerce"],
6661
6983
  ["caching", "caching"],
6662
6984
  ["rateLimit", "rateLimit"],
6663
6985
  ["cms", "cms"],
6664
6986
  ["search", "search"],
6665
6987
  ["vectorDb", "vectorDb"],
6666
- ["fileStorage", "fileStorage"]
6988
+ ["fileStorage", "fileStorage"],
6989
+ ["effect", "effect"]
6667
6990
  ];
6668
6991
  const GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS = [
6669
6992
  ["elixirRealtime", "realtime"],
@@ -6684,6 +7007,8 @@ const GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS = [
6684
7007
  ];
6685
7008
  const GRAPH_DATABASE_PART_CLI_KEYS = [["dbSetup", "dbSetup"]];
6686
7009
  const GRAPH_MOBILE_PART_CLI_KEYS = [
7010
+ ["auth", "auth"],
7011
+ ["payments", "payments"],
6687
7012
  ["mobileNavigation", "navigation"],
6688
7013
  ["mobileUI", "ui"],
6689
7014
  ["mobileStorage", "storage"],
@@ -6693,10 +7018,17 @@ const GRAPH_MOBILE_PART_CLI_KEYS = [
6693
7018
  ["mobileDeepLinking", "deepLinking"]
6694
7019
  ];
6695
7020
  const GRAPH_MOBILE_ARRAY_PART_CLI_KEYS = [["mobileLibraries", "libraries"]];
7021
+ const GRAPH_KOTLIN_MOBILE_ARRAY_PART_CLI_KEYS = [["kotlinMobileLibraries", "libraries"]];
6696
7022
  const GRAPH_RUST_BACKEND_PART_CLI_KEYS = [
6697
7023
  ["rustCli", "cli"],
6698
7024
  ["rustLogging", "logging"],
6699
7025
  ["rustErrorHandling", "errorHandling"],
7026
+ ["rustRealtime", "realtime"],
7027
+ ["rustMessageQueue", "jobQueue"],
7028
+ ["rustObservability", "observability"],
7029
+ ["rustTemplating", "templating"],
7030
+ ["email", "email"],
7031
+ ["observability", "observability"],
6700
7032
  ["caching", "caching"],
6701
7033
  ["search", "search"],
6702
7034
  ["rustCaching", "caching"]
@@ -6713,10 +7045,20 @@ const GRAPH_PYTHON_BACKEND_PART_CLI_KEYS = [
6713
7045
  ["pythonServer", "server"],
6714
7046
  ["pythonPackageManager", "packageManager"],
6715
7047
  ["pythonMessageQueue", "messageQueue"],
7048
+ ["pythonCaching", "caching"],
7049
+ ["pythonRealtime", "realtime"],
7050
+ ["pythonObservability", "observability"],
7051
+ ["email", "email"],
7052
+ ["observability", "observability"],
6716
7053
  ["caching", "caching"],
6717
7054
  ["search", "search"]
6718
7055
  ];
6719
- const GRAPH_PYTHON_BACKEND_ARRAY_PART_CLI_KEYS = [["pythonAi", "ai"], ["pythonData", "data"]];
7056
+ const GRAPH_PYTHON_BACKEND_ARRAY_PART_CLI_KEYS = [
7057
+ ["pythonAi", "ai"],
7058
+ ["pythonTesting", "testing"],
7059
+ ["pythonCli", "cli"],
7060
+ ["pythonData", "data"]
7061
+ ];
6720
7062
  const GRAPH_GO_BACKEND_PART_CLI_KEYS = [
6721
7063
  ["goCli", "cli"],
6722
7064
  ["goLogging", "logging"],
@@ -6726,11 +7068,22 @@ const GRAPH_GO_BACKEND_PART_CLI_KEYS = [
6726
7068
  ["goTemplating", "templating"],
6727
7069
  ["goProtoTooling", "buildTool"],
6728
7070
  ["goDI", "libraries"],
7071
+ ["goRealtime", "realtime"],
7072
+ ["goMessageQueue", "jobQueue"],
7073
+ ["goCaching", "caching"],
7074
+ ["goConfig", "config"],
7075
+ ["goObservability", "observability"],
7076
+ ["email", "email"],
7077
+ ["observability", "observability"],
6729
7078
  ["caching", "caching"],
6730
7079
  ["search", "search"]
6731
7080
  ];
7081
+ const GRAPH_GO_BACKEND_ARRAY_PART_CLI_KEYS = [["goTesting", "testing"]];
6732
7082
  const GRAPH_JAVA_BACKEND_PART_CLI_KEYS = [
6733
7083
  ["javaBuildTool", "buildTool"],
7084
+ ["javaLogging", "logging"],
7085
+ ["email", "email"],
7086
+ ["observability", "observability"],
6734
7087
  ["caching", "caching"],
6735
7088
  ["search", "search"]
6736
7089
  ];
@@ -6741,6 +7094,7 @@ const GRAPH_DOTNET_BACKEND_PART_CLI_KEYS = [
6741
7094
  ["dotnetApi", "api"],
6742
7095
  ["dotnetJobQueue", "jobQueue"],
6743
7096
  ["dotnetRealtime", "realtime"],
7097
+ ["dotnetValidation", "validation"],
6744
7098
  ["dotnetCaching", "caching"],
6745
7099
  ["dotnetDeploy", "deploy"]
6746
7100
  ];
@@ -6749,6 +7103,7 @@ const GRAPH_DOTNET_BACKEND_ARRAY_PART_CLI_KEYS = [
6749
7103
  ["dotnetObservability", "observability"],
6750
7104
  ["dotnetLibraries", "libraries"]
6751
7105
  ];
7106
+ const GRAPH_ELIXIR_BACKEND_ARRAY_PART_CLI_KEYS = [["elixirLibraries", "libraries"]];
6752
7107
  function getAddonScopedPartFields(addons) {
6753
7108
  return toUniqueNonNoneArray(addons ?? []).flatMap((addon) => {
6754
7109
  const binding = getAddonStackPartBinding(addon);
@@ -6832,6 +7187,13 @@ function getSelectionScopedPartFields(selection) {
6832
7187
  value: selection[key],
6833
7188
  allowMultiple: true
6834
7189
  })),
7190
+ ...GRAPH_KOTLIN_MOBILE_ARRAY_PART_SELECTION_KEYS.map(([key, role]) => ({
7191
+ ownerRole: "mobile",
7192
+ ecosystem: "kotlin",
7193
+ role,
7194
+ value: selection[key],
7195
+ allowMultiple: true
7196
+ })),
6835
7197
  ...GRAPH_RUST_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({
6836
7198
  ownerRole: "backend",
6837
7199
  ecosystem: "rust",
@@ -6864,6 +7226,13 @@ function getSelectionScopedPartFields(selection) {
6864
7226
  role,
6865
7227
  value: selection[key]
6866
7228
  })),
7229
+ ...GRAPH_GO_BACKEND_ARRAY_PART_SELECTION_KEYS.map(([key, role]) => ({
7230
+ ownerRole: "backend",
7231
+ ecosystem: "go",
7232
+ role,
7233
+ value: selection[key],
7234
+ allowMultiple: true
7235
+ })),
6867
7236
  ...GRAPH_JAVA_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({
6868
7237
  ownerRole: "backend",
6869
7238
  ecosystem: "java",
@@ -6890,6 +7259,13 @@ function getSelectionScopedPartFields(selection) {
6890
7259
  value: selection[key],
6891
7260
  allowMultiple: true
6892
7261
  })),
7262
+ ...GRAPH_ELIXIR_BACKEND_ARRAY_PART_SELECTION_KEYS.map(([key, role]) => ({
7263
+ ownerRole: "backend",
7264
+ ecosystem: "elixir",
7265
+ role,
7266
+ value: selection[key],
7267
+ allowMultiple: true
7268
+ })),
6893
7269
  ...GRAPH_DATABASE_PART_SELECTION_KEYS.map(([key, role]) => ({
6894
7270
  ownerRole: "database",
6895
7271
  ecosystem: "universal",
@@ -6945,6 +7321,13 @@ function getCliScopedPartFields(input) {
6945
7321
  value: getArrayValue(key),
6946
7322
  allowMultiple: true
6947
7323
  })),
7324
+ ...GRAPH_KOTLIN_MOBILE_ARRAY_PART_CLI_KEYS.map(([key, role]) => ({
7325
+ ownerRole: "mobile",
7326
+ ecosystem: "kotlin",
7327
+ role,
7328
+ value: getArrayValue(key),
7329
+ allowMultiple: true
7330
+ })),
6948
7331
  ...GRAPH_RUST_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({
6949
7332
  ownerRole: "backend",
6950
7333
  ecosystem: "rust",
@@ -6977,6 +7360,13 @@ function getCliScopedPartFields(input) {
6977
7360
  role,
6978
7361
  value: getValue(key)
6979
7362
  })),
7363
+ ...GRAPH_GO_BACKEND_ARRAY_PART_CLI_KEYS.map(([key, role]) => ({
7364
+ ownerRole: "backend",
7365
+ ecosystem: "go",
7366
+ role,
7367
+ value: getArrayValue(key),
7368
+ allowMultiple: true
7369
+ })),
6980
7370
  ...GRAPH_JAVA_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({
6981
7371
  ownerRole: "backend",
6982
7372
  ecosystem: "java",
@@ -7003,6 +7393,13 @@ function getCliScopedPartFields(input) {
7003
7393
  value: getArrayValue(key),
7004
7394
  allowMultiple: true
7005
7395
  })),
7396
+ ...GRAPH_ELIXIR_BACKEND_ARRAY_PART_CLI_KEYS.map(([key, role]) => ({
7397
+ ownerRole: "backend",
7398
+ ecosystem: "elixir",
7399
+ role,
7400
+ value: getArrayValue(key),
7401
+ allowMultiple: true
7402
+ })),
7006
7403
  ...GRAPH_DATABASE_PART_CLI_KEYS.map(([key, role]) => ({
7007
7404
  ownerRole: "database",
7008
7405
  ecosystem: "universal",
@@ -7182,6 +7579,8 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
7182
7579
  logging: stack.logging,
7183
7580
  observability: stack.observability,
7184
7581
  featureFlags: stack.featureFlags,
7582
+ integrations: stack.integrations,
7583
+ ecommerce: stack.ecommerce,
7185
7584
  analytics: stack.analytics,
7186
7585
  mobileNavigation: stack.mobileNavigation,
7187
7586
  mobileUI: stack.mobileUI,
@@ -7200,6 +7599,11 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
7200
7599
  fileStorage: stack.fileStorage,
7201
7600
  rustWebFramework: stack.rustWebFramework,
7202
7601
  rustFrontend: stack.rustFrontend,
7602
+ dotnetFrontend: stack.dotnetFrontend,
7603
+ kotlinMobile: stack.kotlinMobile,
7604
+ kotlinMobileLibraries: toUniqueNonNoneArray(stack.kotlinMobileLibraries),
7605
+ swiftMobile: stack.swiftMobile,
7606
+ dartMobile: stack.dartMobile,
7203
7607
  rustOrm: stack.rustOrm,
7204
7608
  rustApi: stack.rustApi,
7205
7609
  rustCli: stack.rustCli,
@@ -7364,7 +7768,6 @@ function generateGraphCommand(selection, projectName) {
7364
7768
  const stackParts = getGraphStackParts(selection);
7365
7769
  const hasTypeScriptFrontend = hasGraphPrimaryPart(stackParts, "frontend", "typescript");
7366
7770
  const hasAstroFrontend = hasGraphPrimaryPart(stackParts, "frontend", "typescript", "astro");
7367
- const hasTypeScriptBackend = hasGraphPrimaryPart(stackParts, "backend", "typescript");
7368
7771
  const hasRustBackend = hasGraphPrimaryPart(stackParts, "backend", "rust");
7369
7772
  const hasPythonBackend = hasGraphPrimaryPart(stackParts, "backend", "python");
7370
7773
  const hasGoBackend = hasGraphPrimaryPart(stackParts, "backend", "go");
@@ -7375,10 +7778,8 @@ function generateGraphCommand(selection, projectName) {
7375
7778
  const hasMobile = hasGraphPrimaryPart(stackParts, "mobile");
7376
7779
  const flags = [
7377
7780
  ...stackParts.filter((part) => part.source !== "provided" && part.toolId !== "none").map((part) => `--part ${formatStackPartSpec(part, stackParts)}`),
7378
- ...hasTypeScriptFrontend ? formatChangedStringFlags(selection, GRAPH_TYPESCRIPT_FRONTEND_FLAG_KEYS) : [],
7379
7781
  ...hasAstroFrontend && selection.astroIntegration !== "none" ? [`--astro-integration ${selection.astroIntegration}`] : [],
7380
7782
  ...hasTypeScriptFrontend && selection.uiLibrary === "shadcn-ui" ? formatChangedStringFlags(selection, GRAPH_SHADCN_FLAG_KEYS) : [],
7381
- ...hasTypeScriptBackend ? formatChangedStringFlags(selection, GRAPH_TYPESCRIPT_BACKEND_FLAG_KEYS) : [],
7382
7783
  ...hasNonTypeScriptBackend ? formatChangedStringFlags(selection, GRAPH_SHARED_BACKEND_FLAG_KEYS) : [],
7383
7784
  ...hasElixirBackend ? formatChangedStringFlags(selection, GRAPH_ELIXIR_BACKEND_FLAG_KEYS) : [],
7384
7785
  ...hasMobile ? formatChangedStringFlags(selection, GRAPH_MOBILE_FLAG_KEYS) : [],
@@ -7422,6 +7823,8 @@ function generateTypeScriptCommand(selection, projectName) {
7422
7823
  `--logging ${selection.logging}`,
7423
7824
  `--observability ${selection.observability}`,
7424
7825
  `--feature-flags ${selection.featureFlags}`,
7826
+ `--integrations ${selection.integrations}`,
7827
+ `--ecommerce ${selection.ecommerce}`,
7425
7828
  `--realtime ${selection.realtime}`,
7426
7829
  `--job-queue ${selection.jobQueue}`,
7427
7830
  `--caching ${selection.caching}`,
@@ -7469,6 +7872,7 @@ function generateReactNativeCommand(selection, projectName) {
7469
7872
  `--mobile-ota ${selection.mobileOTA}`,
7470
7873
  `--mobile-deep-linking ${selection.mobileDeepLinking}`,
7471
7874
  formatArrayFlag("mobile-libraries", selection.mobileLibraries),
7875
+ formatArrayFlag("kotlin-mobile-libraries", selection.kotlinMobileLibraries),
7472
7876
  `--package-manager ${selection.packageManager}`,
7473
7877
  selection.git === "false" ? "--no-git" : "--git",
7474
7878
  selection.install === "false" ? "--no-install" : "--install",
@@ -7666,5 +8070,5 @@ function generateStackSelectionCommand(selection) {
7666
8070
  }
7667
8071
 
7668
8072
  //#endregion
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 };
7670
- //# sourceMappingURL=stack-translation-Ay-_1mNB.mjs.map
8073
+ export { JAVA_CATEGORY_ORDER as $, getCompatibleAddons as A, isSignozSupportedGoWebFramework as B, KOTLIN_DROPPED_JAVA_LIBRARIES as C, evaluateCompatibility as D, analyzeStackCompatibility as E, getKotlinJavaIncompatibilityReason as F, splitFrontends as G, isWebFrontend as H, hasSignozSupportedGoServerTarget as I, validateProjectName as J, stackQualifiesForSingleApp as K, hasWebStyling as L, getCompatibleFormLibraries as M, getCompatibleUILibraries as N, getAIFrontendCompatibilityIssue as O, getDisabledReason as P, GO_CATEGORY_ORDER as Q, isFrontendAllowedWithBackend as R, usesVirtualNoneStackSelection as S, allowedApisForFrontends as T, requiresChatSdkVercelAI as U, isSignozSupportedPythonWebFramework as V, requiresChatSdkVercelAIForSelection as W, DOTNET_CATEGORY_ORDER as X, CATEGORY_ORDER as Y, ELIXIR_CATEGORY_ORDER as Z, parseStackSelectionFromSearch as _, STACK_SELECTION_URL_KEYS as a, getCategoryCliValues as at, stackSelectionToCliComparableConfig as b, cloneDefaultStackSelection as c, getCategoryOrderForEcosystem as ct, isArrayStackSelectionKey as d, normalizeOptionId as dt, OPTION_CATEGORY_METADATA as et, isCliDefaultStackSelection as f, getCapabilityDefinitions as ft, normalizeStackSelectionValue as g, normalizeStackSelection as h, normalizeCapabilitySelection as ht, STACK_SELECTION_OPTION_CATEGORY_BY_KEY as i, TYPESCRIPT_CATEGORY_ORDER as it, getCompatibleCSSFrameworks as j, getApiFrontendCompatibilityIssue as k, createStackSelectionSearchParams as l, getOptionMetadata as lt, isStackSelectionDefault as m, getSupportedCapabilityOptions as mt, NON_OPTION_STACK_SELECTION_KEYS as n, REACT_NATIVE_CATEGORY_ORDER as nt, VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS as o, getCategoryDisplayName as ot, isGraphStackSelection as p, getCapabilityDisabledReason as pt, validateAddonCompatibility as q, STACK_SELECTION_KEYS as r, RUST_CATEGORY_ORDER as rt, cliInputToProjectConfigPartial as s, getCategoryOptionIds as st, DEFAULT_STACK_SELECTION as t, PYTHON_CATEGORY_ORDER as tt, generateStackSelectionCommand as u, isMultiSelectCategory as ut, parseStackSelectionFromUrlRecord as v, KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES as w, stackSelectionToProjectConfig as x, processCliArrayOption as y, isOptionCompatible as z };
8074
+ //# sourceMappingURL=stack-translation-B-zArJLM.mjs.map