@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.
- package/LICENSE +22 -0
- package/dist/{defaults-Cl16mM84.mjs → defaults-BzWJP6p0.mjs} +3 -1
- package/dist/defaults-BzWJP6p0.mjs.map +1 -0
- package/dist/{defaults-BCprHCB6.d.mts → defaults-CbLlpynl.d.mts} +2 -2
- package/dist/defaults-CbLlpynl.d.mts.map +1 -0
- package/dist/defaults.d.mts +3 -3
- package/dist/defaults.mjs +1 -1
- package/dist/index.d.mts +6 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +69 -5
- package/dist/index.mjs.map +1 -1
- package/dist/json-schema.d.mts +518 -20
- package/dist/json-schema.d.mts.map +1 -1
- package/dist/json-schema.mjs +1 -1
- package/dist/{schemas-B79HRN5e.d.mts → schemas-BRAokgPa.d.mts} +520 -27
- package/dist/schemas-BRAokgPa.d.mts.map +1 -0
- package/dist/{schemas-CprYz5Sh.mjs → schemas-CtieNRfz.mjs} +74 -3
- package/dist/schemas-CtieNRfz.mjs.map +1 -0
- package/dist/schemas.d.mts +2 -2
- package/dist/schemas.mjs +2 -2
- package/dist/{stack-graph-BkHZlyKH.d.mts → stack-graph-BPw9KsNm.d.mts} +3 -3
- package/dist/stack-graph-BPw9KsNm.d.mts.map +1 -0
- package/dist/{stack-graph-DiLi3WuL.mjs → stack-graph-CXTiPofQ.mjs} +205 -27
- package/dist/stack-graph-CXTiPofQ.mjs.map +1 -0
- package/dist/stack-graph.d.mts +3 -3
- package/dist/stack-graph.mjs +2 -2
- package/dist/{stack-translation-Ay-_1mNB.mjs → stack-translation-B-zArJLM.mjs} +433 -29
- package/dist/stack-translation-B-zArJLM.mjs.map +1 -0
- package/dist/{stack-translation-BmsX82IA.d.mts → stack-translation-D7KkQm8W.d.mts} +30 -9
- package/dist/stack-translation-D7KkQm8W.d.mts.map +1 -0
- package/dist/stack-translation.d.mts +4 -4
- package/dist/stack-translation.mjs +3 -3
- package/dist/{types-BuRzqsRV.d.mts → types-Br0NsnBr.d.mts} +10 -3
- package/dist/types-Br0NsnBr.d.mts.map +1 -0
- package/dist/types.d.mts +3 -3
- package/package.json +3 -2
- package/dist/defaults-BCprHCB6.d.mts.map +0 -1
- package/dist/defaults-Cl16mM84.mjs.map +0 -1
- package/dist/schemas-B79HRN5e.d.mts.map +0 -1
- package/dist/schemas-CprYz5Sh.mjs.map +0 -1
- package/dist/stack-graph-BkHZlyKH.d.mts.map +0 -1
- package/dist/stack-graph-DiLi3WuL.mjs.map +0 -1
- package/dist/stack-translation-Ay-_1mNB.mjs.map +0 -1
- package/dist/stack-translation-BmsX82IA.d.mts.map +0 -1
- package/dist/types-BuRzqsRV.d.mts.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { $
|
|
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-
|
|
3
|
-
import { t as createCliDefaultProjectConfigBase } from "./defaults-
|
|
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
|
|
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
|
|
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
|
|
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 = [
|
|
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 = [
|
|
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 {
|
|
7670
|
-
//# sourceMappingURL=stack-translation-
|
|
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
|