@better-fullstack/types 2.1.3 → 2.1.4

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 (38) hide show
  1. package/dist/{defaults-14rSFqF6.d.mts → defaults-azh56xa4.d.mts} +2 -2
  2. package/dist/defaults-azh56xa4.d.mts.map +1 -0
  3. package/dist/defaults.d.mts +3 -3
  4. package/dist/index.d.mts +5 -5
  5. package/dist/index.d.mts.map +1 -1
  6. package/dist/index.mjs +3 -3
  7. package/dist/json-schema.d.mts +300 -268
  8. package/dist/json-schema.d.mts.map +1 -1
  9. package/dist/json-schema.mjs +1 -1
  10. package/dist/{schemas-jMCVu0xX.d.mts → schemas-C3iF9TRm.d.mts} +1271 -347
  11. package/dist/schemas-C3iF9TRm.d.mts.map +1 -0
  12. package/dist/{schemas-Cg75ZlzB.mjs → schemas-ZxRzd5TP.mjs} +18 -9
  13. package/dist/schemas-ZxRzd5TP.mjs.map +1 -0
  14. package/dist/schemas.d.mts +1 -1
  15. package/dist/schemas.mjs +1 -1
  16. package/dist/{stack-graph-Q0PrewPk.mjs → stack-graph-BwtoYnJg.mjs} +171 -9
  17. package/dist/stack-graph-BwtoYnJg.mjs.map +1 -0
  18. package/dist/{stack-graph-CjobAqsm.d.mts → stack-graph-CiXONkqh.d.mts} +4 -3
  19. package/dist/stack-graph-CiXONkqh.d.mts.map +1 -0
  20. package/dist/stack-graph.d.mts +3 -3
  21. package/dist/stack-graph.mjs +2 -2
  22. package/dist/{stack-translation-CjsJzLCX.d.mts → stack-translation-BNwlAM1B.d.mts} +3 -3
  23. package/dist/{stack-translation-CjsJzLCX.d.mts.map → stack-translation-BNwlAM1B.d.mts.map} +1 -1
  24. package/dist/{stack-translation-gNYPvlYt.mjs → stack-translation-DNT-iMAE.mjs} +255 -111
  25. package/dist/stack-translation-DNT-iMAE.mjs.map +1 -0
  26. package/dist/stack-translation.d.mts +4 -4
  27. package/dist/stack-translation.mjs +3 -3
  28. package/dist/{types-DwY2BNyU.d.mts → types-BG-DsHQ9.d.mts} +2 -2
  29. package/dist/types-BG-DsHQ9.d.mts.map +1 -0
  30. package/dist/types.d.mts +2 -2
  31. package/package.json +1 -1
  32. package/dist/defaults-14rSFqF6.d.mts.map +0 -1
  33. package/dist/schemas-Cg75ZlzB.mjs.map +0 -1
  34. package/dist/schemas-jMCVu0xX.d.mts.map +0 -1
  35. package/dist/stack-graph-CjobAqsm.d.mts.map +0 -1
  36. package/dist/stack-graph-Q0PrewPk.mjs.map +0 -1
  37. package/dist/stack-translation-gNYPvlYt.mjs.map +0 -1
  38. package/dist/types-DwY2BNyU.d.mts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { $n as MOBILE_STORAGE_VALUES, $r as RUST_CLI_VALUES, An as JAVA_AUTH_VALUES, B as DOTNET_OBSERVABILITY_VALUES, Cr as PYTHON_QUALITY_VALUES, Ct as ELIXIR_WEB_FRAMEWORK_VALUES, D as CMS_VALUES, Di as SEARCH_VALUES, Dr as PYTHON_VALIDATION_VALUES, En as I18N_VALUES, Er as PYTHON_TESTING_VALUES, F as DOTNET_API_VALUES, Fn as JAVA_TESTING_LIBRARIES_VALUES, G as DOTNET_WEB_FRAMEWORK_VALUES, H as DOTNET_REALTIME_VALUES, I as DOTNET_AUTH_VALUES, Ii as STATE_MANAGEMENT_VALUES, In as JAVA_WEB_FRAMEWORK_VALUES, Jr as REALTIME_VALUES, Jt as FILE_UPLOAD_VALUES, Kt as FEATURE_FLAGS_VALUES, L as DOTNET_CACHING_VALUES, Ln as JOB_QUEUE_VALUES, M as DATABASE_SETUP_VALUES, Mn as JAVA_LIBRARIES_VALUES, N as DATABASE_VALUES, Nn as JAVA_LOGGING_VALUES, Oi as SERVER_DEPLOY_VALUES, Or as PYTHON_WEB_FRAMEWORK_VALUES, Pn as JAVA_ORM_VALUES, Qr as RUST_CACHING_VALUES, R as DOTNET_DEPLOY_VALUES, Sr as PYTHON_ORM_VALUES, St as ELIXIR_VALIDATION_VALUES, Tr as PYTHON_TASK_QUEUE_VALUES, Tt as EXAMPLES_VALUES, U as DOTNET_TESTING_VALUES, V as DOTNET_ORM_VALUES, W as DOTNET_VALIDATION_VALUES, Xn as MOBILE_NAVIGATION_VALUES, Xr as RUST_API_VALUES, Xt as FRONTEND_VALUES, Yr as RUNTIME_VALUES, Yt as FORMS_VALUES, Zr as RUST_AUTH_VALUES, _r as PYTHON_AUTH_VALUES, _t as ELIXIR_OBSERVABILITY_VALUES, a as ANALYTICS_VALUES, ai as RUST_OBSERVABILITY_VALUES, an as GO_CLI_VALUES, br as PYTHON_GRAPHQL_VALUES, bt as ELIXIR_REALTIME_VALUES, c as API_VALUES, ci as RUST_TEMPLATING_VALUES, cn as GO_MESSAGE_QUEUE_VALUES, ct as ELIXIR_API_VALUES, dn as GO_REALTIME_VALUES, dr as ORM_VALUES, dt as ELIXIR_DEPLOY_VALUES, ei as RUST_ERROR_HANDLING_VALUES, er as MOBILE_TESTING_VALUES, fn as GO_TESTING_VALUES, ft as ELIXIR_EMAIL_VALUES, gr as PYTHON_API_VALUES, gt as ELIXIR_LIBRARIES_VALUES, hr as PYTHON_AI_VALUES, i as AI_VALUES, ia as VECTOR_DB_VALUES, ii as RUST_MESSAGE_QUEUE_VALUES, in as GO_CACHING_VALUES, jn as JAVA_BUILD_TOOL_VALUES, k as CSS_FRAMEWORK_VALUES, kn as JAVA_API_VALUES, la as WEB_DEPLOY_VALUES, li as RUST_WEB_FRAMEWORK_VALUES, ln as GO_OBSERVABILITY_VALUES, lr as OBSERVABILITY_VALUES, lt as ELIXIR_AUTH_VALUES, mr as PAYMENTS_VALUES, mt as ELIXIR_JOBS_VALUES, na as UI_LIBRARY_VALUES, ni as RUST_LIBRARIES_VALUES, nn as GO_API_VALUES, o as ANIMATION_VALUES, oi as RUST_ORM_VALUES, on as GO_CONFIG_VALUES, pn as GO_WEB_FRAMEWORK_VALUES, pt as ELIXIR_HTTP_VALUES, qi as StackPartRoleSchema, qn as LOGGING_VALUES, qr as RATE_LIMIT_VALUES, qt as FILE_STORAGE_VALUES, ra as VALIDATION_VALUES, ri as RUST_LOGGING_VALUES, rn as GO_AUTH_VALUES, si as RUST_REALTIME_VALUES, sn as GO_LOGGING_VALUES, st as EFFECT_VALUES, t as ADDONS_VALUES, ti as RUST_FRONTEND_VALUES, tr as MOBILE_UI_VALUES, u as AUTH_VALUES, un as GO_ORM_VALUES, ut as ELIXIR_CACHING_VALUES, v as BACKEND_VALUES, vr as PYTHON_CACHING_VALUES, vt as ELIXIR_ORM_VALUES, w as CACHING_VALUES, wr as PYTHON_REALTIME_VALUES, wt as EMAIL_VALUES, xr as PYTHON_OBSERVABILITY_VALUES, xt as ELIXIR_TESTING_VALUES, yr as PYTHON_CLI_VALUES, yt as ELIXIR_QUALITY_VALUES, z as DOTNET_JOB_QUEUE_VALUES } from "./schemas-Cg75ZlzB.mjs";
1
+ import { $n as MOBILE_STORAGE_VALUES, $r as RUST_CLI_VALUES, An as JAVA_AUTH_VALUES, B as DOTNET_OBSERVABILITY_VALUES, Cr as PYTHON_QUALITY_VALUES, Ct as ELIXIR_WEB_FRAMEWORK_VALUES, D as CMS_VALUES, Di as SEARCH_VALUES, Dr as PYTHON_VALIDATION_VALUES, En as I18N_VALUES, Er as PYTHON_TESTING_VALUES, F as DOTNET_API_VALUES, Fn as JAVA_TESTING_LIBRARIES_VALUES, G as DOTNET_WEB_FRAMEWORK_VALUES, H as DOTNET_REALTIME_VALUES, I as DOTNET_AUTH_VALUES, Ii as STATE_MANAGEMENT_VALUES, In as JAVA_WEB_FRAMEWORK_VALUES, Jr as REALTIME_VALUES, Jt as FILE_UPLOAD_VALUES, Kt as FEATURE_FLAGS_VALUES, L as DOTNET_CACHING_VALUES, Ln as JOB_QUEUE_VALUES, M as DATABASE_SETUP_VALUES, Mn as JAVA_LIBRARIES_VALUES, N as DATABASE_VALUES, Nn as JAVA_LOGGING_VALUES, Oi as SERVER_DEPLOY_VALUES, Or as PYTHON_WEB_FRAMEWORK_VALUES, Pn as JAVA_ORM_VALUES, Qn as MOBILE_PUSH_VALUES, Qr as RUST_CACHING_VALUES, R as DOTNET_DEPLOY_VALUES, Sr as PYTHON_ORM_VALUES, St as ELIXIR_VALIDATION_VALUES, Tr as PYTHON_TASK_QUEUE_VALUES, Tt as EXAMPLES_VALUES, U as DOTNET_TESTING_VALUES, V as DOTNET_ORM_VALUES, W as DOTNET_VALIDATION_VALUES, Xn as MOBILE_NAVIGATION_VALUES, Xr as RUST_API_VALUES, Xt as FRONTEND_VALUES, Yn as MOBILE_DEEP_LINKING_VALUES, Yr as RUNTIME_VALUES, Yt as FORMS_VALUES, Zn as MOBILE_OTA_VALUES, Zr as RUST_AUTH_VALUES, _r as PYTHON_AUTH_VALUES, _t as ELIXIR_OBSERVABILITY_VALUES, a as ANALYTICS_VALUES, ai as RUST_OBSERVABILITY_VALUES, an as GO_CLI_VALUES, br as PYTHON_GRAPHQL_VALUES, bt as ELIXIR_REALTIME_VALUES, c as API_VALUES, ci as RUST_TEMPLATING_VALUES, cn as GO_MESSAGE_QUEUE_VALUES, ct as ELIXIR_API_VALUES, dn as GO_REALTIME_VALUES, dr as ORM_VALUES, dt as ELIXIR_DEPLOY_VALUES, ei as RUST_ERROR_HANDLING_VALUES, er as MOBILE_TESTING_VALUES, fn as GO_TESTING_VALUES, ft as ELIXIR_EMAIL_VALUES, gr as PYTHON_API_VALUES, gt as ELIXIR_LIBRARIES_VALUES, hr as PYTHON_AI_VALUES, i as AI_VALUES, ia as VECTOR_DB_VALUES, ii as RUST_MESSAGE_QUEUE_VALUES, in as GO_CACHING_VALUES, jn as JAVA_BUILD_TOOL_VALUES, k as CSS_FRAMEWORK_VALUES, kn as JAVA_API_VALUES, la as WEB_DEPLOY_VALUES, li as RUST_WEB_FRAMEWORK_VALUES, ln as GO_OBSERVABILITY_VALUES, lr as OBSERVABILITY_VALUES, lt as ELIXIR_AUTH_VALUES, mr as PAYMENTS_VALUES, mt as ELIXIR_JOBS_VALUES, na as UI_LIBRARY_VALUES, ni as RUST_LIBRARIES_VALUES, nn as GO_API_VALUES, o as ANIMATION_VALUES, oi as RUST_ORM_VALUES, on as GO_CONFIG_VALUES, pn as GO_WEB_FRAMEWORK_VALUES, pt as ELIXIR_HTTP_VALUES, qi as StackPartRoleSchema, qn as LOGGING_VALUES, qr as RATE_LIMIT_VALUES, qt as FILE_STORAGE_VALUES, ra as VALIDATION_VALUES, ri as RUST_LOGGING_VALUES, rn as GO_AUTH_VALUES, si as RUST_REALTIME_VALUES, sn as GO_LOGGING_VALUES, st as EFFECT_VALUES, t as ADDONS_VALUES, ti as RUST_FRONTEND_VALUES, tr as MOBILE_UI_VALUES, u as AUTH_VALUES, un as GO_ORM_VALUES, ut as ELIXIR_CACHING_VALUES, v as BACKEND_VALUES, vr as PYTHON_CACHING_VALUES, vt as ELIXIR_ORM_VALUES, w as CACHING_VALUES, wr as PYTHON_REALTIME_VALUES, wt as EMAIL_VALUES, xr as PYTHON_OBSERVABILITY_VALUES, xt as ELIXIR_TESTING_VALUES, yr as PYTHON_CLI_VALUES, yt as ELIXIR_QUALITY_VALUES, z as DOTNET_JOB_QUEUE_VALUES } from "./schemas-ZxRzd5TP.mjs";
2
2
 
3
3
  //#region src/stack-compatibility-rules.ts
4
4
  const WEB_FRAMEWORKS = [
@@ -526,7 +526,10 @@ const LEGACY_MOBILE_SINGLE_CATEGORIES = {
526
526
  navigation: "mobileNavigation",
527
527
  ui: "mobileUI",
528
528
  storage: "mobileStorage",
529
- testing: "mobileTesting"
529
+ testing: "mobileTesting",
530
+ push: "mobilePush",
531
+ ota: "mobileOTA",
532
+ deepLinking: "mobileDeepLinking"
530
533
  };
531
534
  const LEGACY_BACKEND_ARRAY_CATEGORIES_BY_ECOSYSTEM = {
532
535
  rust: { libraries: "rustLibraries" },
@@ -580,6 +583,13 @@ const WORKSPACE_TOOLING_ADDONS = new Set([
580
583
  "skills",
581
584
  "backend-utils"
582
585
  ]);
586
+ const DOCKER_COMPOSE_COMPATIBLE_ECOSYSTEMS = new Set([
587
+ "typescript",
588
+ "python",
589
+ "go",
590
+ "rust",
591
+ "java"
592
+ ]);
583
593
  const LEGACY_ADDON_GRAPH_ROLES = new Set([
584
594
  "appPlatform",
585
595
  "codeQuality",
@@ -638,6 +648,7 @@ const OWNER_ROLES_BY_SCOPED_ROLE = {
638
648
  deploy: ["frontend", "backend"],
639
649
  dbSetup: ["database"],
640
650
  ui: ["frontend", "mobile"],
651
+ graphql: ["backend"],
641
652
  appPlatform: ["frontend"],
642
653
  dataFetching: ["frontend"],
643
654
  testing: [
@@ -735,7 +746,7 @@ const LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM = {
735
746
  python: {
736
747
  validation: "pythonValidation",
737
748
  jobQueue: "pythonTaskQueue",
738
- api: "pythonGraphql",
749
+ graphql: "pythonGraphql",
739
750
  codeQuality: "pythonQuality",
740
751
  caching: "pythonCaching",
741
752
  realtime: "pythonRealtime",
@@ -774,6 +785,26 @@ const LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM = {
774
785
  deploy: "elixirDeploy"
775
786
  }
776
787
  };
788
+ const LEGACY_SHARED_BACKEND_SINGLE_CATEGORIES_BY_ECOSYSTEM = {
789
+ rust: {
790
+ caching: "caching",
791
+ search: "search"
792
+ },
793
+ python: {
794
+ caching: "caching",
795
+ search: "search"
796
+ },
797
+ go: {
798
+ caching: "caching",
799
+ search: "search"
800
+ },
801
+ java: {
802
+ caching: "caching",
803
+ search: "search"
804
+ },
805
+ dotnet: {},
806
+ elixir: {}
807
+ };
777
808
  const GRAPH_PROJECTION_DEFAULT_LEGACY_CATEGORIES = [
778
809
  "backend",
779
810
  "database",
@@ -788,7 +819,8 @@ const GRAPH_PROJECTION_DEFAULT_LEGACY_CATEGORIES = [
788
819
  ...Object.values(LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES),
789
820
  ...Object.values(LEGACY_DATABASE_SINGLE_CATEGORIES),
790
821
  ...Object.values(LEGACY_MOBILE_SINGLE_CATEGORIES),
791
- ...Object.values(LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM).flatMap((categories) => Object.values(categories))
822
+ ...Object.values(LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM).flatMap((categories) => Object.values(categories)),
823
+ ...Object.values(LEGACY_SHARED_BACKEND_SINGLE_CATEGORIES_BY_ECOSYSTEM).flatMap((categories) => Object.values(categories))
792
824
  ];
793
825
  function defineTools(values, role, ecosystem, legacyCategory, options = {}) {
794
826
  return values.filter((toolId) => toolId !== "none").map((toolId) => {
@@ -864,6 +896,9 @@ const STACK_TOOL_DEFINITIONS = [
864
896
  ...defineTools(MOBILE_UI_VALUES, "ui", "react-native", "mobileUI"),
865
897
  ...defineTools(MOBILE_STORAGE_VALUES, "storage", "react-native", "mobileStorage"),
866
898
  ...defineTools(MOBILE_TESTING_VALUES, "testing", "react-native", "mobileTesting"),
899
+ ...defineTools(MOBILE_PUSH_VALUES, "push", "react-native", "mobilePush"),
900
+ ...defineTools(MOBILE_OTA_VALUES, "ota", "react-native", "mobileOTA"),
901
+ ...defineTools(MOBILE_DEEP_LINKING_VALUES, "deepLinking", "react-native", "mobileDeepLinking"),
867
902
  ...defineTools(RUST_WEB_FRAMEWORK_VALUES, "backend", "rust", "rustWebFramework"),
868
903
  ...defineTools(RUST_FRONTEND_VALUES, "frontend", "rust", "rustFrontend"),
869
904
  ...defineTools(RUST_ORM_VALUES, "orm", "rust", "rustOrm"),
@@ -873,6 +908,8 @@ const STACK_TOOL_DEFINITIONS = [
873
908
  ...defineTools(["sentry"], "observability", "rust", "observability"),
874
909
  ...defineTools(RUST_REALTIME_VALUES, "realtime", "rust", "rustRealtime"),
875
910
  ...defineTools(RUST_MESSAGE_QUEUE_VALUES, "jobQueue", "rust", "rustMessageQueue"),
911
+ ...defineTools(["upstash-redis"], "caching", "rust", "caching"),
912
+ ...defineTools(["meilisearch"], "search", "rust", "search"),
876
913
  ...defineTools(RUST_OBSERVABILITY_VALUES, "observability", "rust", "rustObservability"),
877
914
  ...defineTools(RUST_TEMPLATING_VALUES, "templating", "rust", "rustTemplating"),
878
915
  ...defineTools(RUST_CLI_VALUES, "cli", "rust", "rustCli"),
@@ -889,10 +926,12 @@ const STACK_TOOL_DEFINITIONS = [
889
926
  ...defineTools(["resend"], "email", "python", "email"),
890
927
  ...defineTools(["sentry"], "observability", "python", "observability"),
891
928
  ...defineTools(PYTHON_TASK_QUEUE_VALUES, "jobQueue", "python", "pythonTaskQueue"),
892
- ...defineTools(PYTHON_GRAPHQL_VALUES, "api", "python", "pythonGraphql"),
929
+ ...defineTools(PYTHON_GRAPHQL_VALUES, "graphql", "python", "pythonGraphql"),
893
930
  ...defineTools(PYTHON_QUALITY_VALUES, "codeQuality", "python", "pythonQuality"),
894
931
  ...defineTools(PYTHON_TESTING_VALUES, "testing", "python", "pythonTesting", { allowMultiple: true }),
895
932
  ...defineTools(PYTHON_CACHING_VALUES, "caching", "python", "pythonCaching"),
933
+ ...defineTools(["upstash-redis"], "caching", "python", "caching"),
934
+ ...defineTools(["meilisearch"], "search", "python", "search"),
896
935
  ...defineTools(PYTHON_REALTIME_VALUES, "realtime", "python", "pythonRealtime"),
897
936
  ...defineTools(PYTHON_OBSERVABILITY_VALUES, "observability", "python", "pythonObservability"),
898
937
  ...defineTools(PYTHON_CLI_VALUES, "cli", "python", "pythonCli", { allowMultiple: true }),
@@ -908,6 +947,8 @@ const STACK_TOOL_DEFINITIONS = [
908
947
  ...defineTools(GO_REALTIME_VALUES, "realtime", "go", "goRealtime"),
909
948
  ...defineTools(GO_MESSAGE_QUEUE_VALUES, "jobQueue", "go", "goMessageQueue"),
910
949
  ...defineTools(GO_CACHING_VALUES, "caching", "go", "goCaching"),
950
+ ...defineTools(["upstash-redis"], "caching", "go", "caching"),
951
+ ...defineTools(["meilisearch"], "search", "go", "search"),
911
952
  ...defineTools(GO_CONFIG_VALUES, "config", "go", "goConfig"),
912
953
  ...defineTools(GO_OBSERVABILITY_VALUES, "observability", "go", "goObservability"),
913
954
  ...defineTools(JAVA_WEB_FRAMEWORK_VALUES, "backend", "java", "javaWebFramework"),
@@ -917,6 +958,8 @@ const STACK_TOOL_DEFINITIONS = [
917
958
  ...defineTools(JAVA_API_VALUES, "api", "java", "javaApi"),
918
959
  ...defineTools(["resend"], "email", "java", "email"),
919
960
  ...defineTools(["sentry"], "observability", "java", "observability"),
961
+ ...defineTools(["upstash-redis"], "caching", "java", "caching"),
962
+ ...defineTools(["meilisearch"], "search", "java", "search"),
920
963
  ...defineTools(JAVA_LOGGING_VALUES, "logging", "java", "javaLogging"),
921
964
  ...defineTools(JAVA_LIBRARIES_VALUES, "libraries", "java", "javaLibraries", { allowMultiple: true }),
922
965
  ...defineTools(JAVA_TESTING_LIBRARIES_VALUES, "testing", "java", "javaTestingLibraries", { allowMultiple: true }),
@@ -1058,6 +1101,47 @@ function createTypeScriptFrontendCompatibilityIssue(part, context) {
1058
1101
  toolId: part.toolId,
1059
1102
  message: `'${part.toolId}' is not compatible with the '${context.ownerToolId}' frontend.`
1060
1103
  });
1104
+ if (context.ownerToolId === "astro" && context.settings?.astroIntegration !== void 0) {
1105
+ const astroIntegration = context.settings.astroIntegration;
1106
+ if (new Set([
1107
+ "shadcn-ui",
1108
+ "radix-ui",
1109
+ "chakra-ui",
1110
+ "nextui",
1111
+ "mui",
1112
+ "antd"
1113
+ ]).has(part.toolId) && astroIntegration !== "react") {
1114
+ const libraryName = part.toolId === "shadcn-ui" ? "shadcn/ui" : part.toolId === "radix-ui" ? "Radix UI" : part.toolId === "chakra-ui" ? "Chakra UI" : part.toolId === "mui" ? "MUI" : part.toolId === "antd" ? "Ant Design" : "NextUI";
1115
+ return createStackGraphIssue({
1116
+ code: "INCOMPATIBLE_OWNER_TOOL",
1117
+ partId: part.id,
1118
+ role: part.role,
1119
+ toolId: part.toolId,
1120
+ message: `${libraryName} requires a React-based frontend`
1121
+ });
1122
+ }
1123
+ if (part.toolId === "shadcn-svelte" && astroIntegration !== "svelte") return createStackGraphIssue({
1124
+ code: "INCOMPATIBLE_OWNER_TOOL",
1125
+ partId: part.id,
1126
+ role: part.role,
1127
+ toolId: part.toolId,
1128
+ message: "shadcn-svelte requires SvelteKit or Astro with Svelte integration"
1129
+ });
1130
+ if (part.toolId === "headless-ui" && astroIntegration !== "react" && astroIntegration !== "vue") return createStackGraphIssue({
1131
+ code: "INCOMPATIBLE_OWNER_TOOL",
1132
+ partId: part.id,
1133
+ role: part.role,
1134
+ toolId: part.toolId,
1135
+ message: "Headless UI requires React or Vue frontend"
1136
+ });
1137
+ if (part.toolId === "park-ui" && astroIntegration !== "react" && astroIntegration !== "vue" && astroIntegration !== "solid") return createStackGraphIssue({
1138
+ code: "INCOMPATIBLE_OWNER_TOOL",
1139
+ partId: part.id,
1140
+ role: part.role,
1141
+ toolId: part.toolId,
1142
+ message: "Park UI requires React, Vue, or Solid frontend"
1143
+ });
1144
+ }
1061
1145
  const cssTool = context.siblingToolIdsByRole?.css ?? "tailwind";
1062
1146
  if (compatibility && !compatibility.cssFrameworks.includes(cssTool)) return createStackGraphIssue({
1063
1147
  code: "INCOMPATIBLE_GRAPH_SELECTION",
@@ -1108,6 +1192,20 @@ function createTypeScriptBackendCompatibilityIssue(part, context) {
1108
1192
  message: "Dodo Payments are not yet supported for React + Vite projects."
1109
1193
  });
1110
1194
  }
1195
+ if (part.role === "email" && part.toolId !== "none" && context.ownerToolId === "convex") return createStackGraphIssue({
1196
+ code: "INCOMPATIBLE_OWNER_TOOL",
1197
+ partId: part.id,
1198
+ role: part.role,
1199
+ toolId: part.toolId,
1200
+ message: "Email integration is not available with Convex backend"
1201
+ });
1202
+ if (part.role === "rateLimit" && part.toolId !== "none" && context.ownerToolId === "convex") return createStackGraphIssue({
1203
+ code: "INCOMPATIBLE_OWNER_TOOL",
1204
+ partId: part.id,
1205
+ role: part.role,
1206
+ toolId: part.toolId,
1207
+ message: "Rate limiting helpers are not generated with Convex backend"
1208
+ });
1111
1209
  if (part.role === "cms" && part.toolId === "payload") {
1112
1210
  if (context.primaryToolIdsByRole?.frontend !== "next") return createStackGraphIssue({
1113
1211
  code: "INCOMPATIBLE_GRAPH_SELECTION",
@@ -1393,10 +1491,40 @@ function createAddonCompatibilityIssue(part, context) {
1393
1491
  toolId: part.toolId,
1394
1492
  message: "TanStack Query is already included via the selected API layer."
1395
1493
  });
1494
+ if ([
1495
+ "tanstack-query",
1496
+ "tanstack-table",
1497
+ "tanstack-virtual",
1498
+ "tanstack-db",
1499
+ "tanstack-pacer"
1500
+ ].includes(part.toolId) && frontendTool === "astro" && context.settings?.astroIntegration === "none") return createStackGraphIssue({
1501
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1502
+ partId: part.id,
1503
+ role: part.role,
1504
+ toolId: part.toolId,
1505
+ message: "TanStack libraries with Astro require a UI framework integration (React, Vue, Svelte, or Solid)"
1506
+ });
1396
1507
  }
1397
1508
  if (part.role === "workspaceTooling") {
1509
+ const workspaceTooling = context.selectedToolIdsByRoleList?.workspaceTooling ?? [];
1510
+ if (part.toolId === "nx" && workspaceTooling.includes("turborepo")) return createStackGraphIssue({
1511
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1512
+ partId: part.id,
1513
+ role: part.role,
1514
+ toolId: part.toolId,
1515
+ message: "Choose either Nx or Turborepo, not both"
1516
+ });
1517
+ if (part.toolId === "turborepo" && workspaceTooling.includes("nx")) return createStackGraphIssue({
1518
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1519
+ partId: part.id,
1520
+ role: part.role,
1521
+ toolId: part.toolId,
1522
+ message: "Choose either Turborepo or Nx, not both"
1523
+ });
1398
1524
  if (part.toolId === "docker-compose" || part.toolId === "devcontainer") {
1399
1525
  const title = part.toolId === "devcontainer" ? "DevContainer" : "Docker Compose";
1526
+ const databaseTool = context.primaryToolIdsByRole?.database;
1527
+ const primaryEcosystem = backendEcosystem ?? frontendEcosystem ?? context.settings?.ecosystem;
1400
1528
  if (backendTool === "convex") return createStackGraphIssue({
1401
1529
  code: "INCOMPATIBLE_GRAPH_SELECTION",
1402
1530
  partId: part.id,
@@ -1411,12 +1539,19 @@ function createAddonCompatibilityIssue(part, context) {
1411
1539
  toolId: part.toolId,
1412
1540
  message: `${title} is not compatible with Cloudflare Workers runtime.`
1413
1541
  });
1414
- if (frontendEcosystem === "typescript" && frontendTool && !hasDockerComposeCompatibleFrontend(frontendTools)) return createStackGraphIssue({
1542
+ if (!primaryEcosystem || !DOCKER_COMPOSE_COMPATIBLE_ECOSYSTEMS.has(primaryEcosystem)) return createStackGraphIssue({
1543
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1544
+ partId: part.id,
1545
+ role: part.role,
1546
+ toolId: part.toolId,
1547
+ message: `${title} currently supports TypeScript, Python, Go, Rust, or Java projects.`
1548
+ });
1549
+ if ((frontendEcosystem === "typescript" || backendEcosystem === "typescript") && (!frontendTool || !hasDockerComposeCompatibleFrontend(frontendTools))) return createStackGraphIssue({
1415
1550
  code: "INCOMPATIBLE_GRAPH_SELECTION",
1416
1551
  partId: part.id,
1417
1552
  role: part.role,
1418
1553
  toolId: part.toolId,
1419
- message: `${title} is not wired for the selected web frontend.`
1554
+ message: `${title} currently supports Next.js, TanStack Router, React Router, React Vite, Solid, or Astro.`
1420
1555
  });
1421
1556
  if (backendEcosystem === "typescript" && backendTool === "self" && frontendTool !== "next") return createStackGraphIssue({
1422
1557
  code: "INCOMPATIBLE_GRAPH_SELECTION",
@@ -1425,6 +1560,27 @@ function createAddonCompatibilityIssue(part, context) {
1425
1560
  toolId: part.toolId,
1426
1561
  message: `${title} self-backend support currently requires Next.js.`
1427
1562
  });
1563
+ if (frontendEcosystem === "rust" && frontendTool && frontendTool !== "none") return createStackGraphIssue({
1564
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1565
+ partId: part.id,
1566
+ role: part.role,
1567
+ toolId: part.toolId,
1568
+ message: `${title} for Rust currently supports server-only projects.`
1569
+ });
1570
+ if (primaryEcosystem === "java" && backendTool !== "spring-boot") return createStackGraphIssue({
1571
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1572
+ partId: part.id,
1573
+ role: part.role,
1574
+ toolId: part.toolId,
1575
+ message: `${title} for Java currently requires Spring Boot.`
1576
+ });
1577
+ if (primaryEcosystem === "python" && databaseTool && databaseTool !== "none" && databaseTool !== "sqlite" && databaseTool !== "postgres") return createStackGraphIssue({
1578
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1579
+ partId: part.id,
1580
+ role: part.role,
1581
+ toolId: part.toolId,
1582
+ message: `${title} for Python ORM projects currently supports SQLite defaults or Postgres.`
1583
+ });
1428
1584
  }
1429
1585
  if (part.toolId === "backend-utils") {
1430
1586
  if (backendEcosystem !== "typescript" || !isBackendUtilsCompatibleBackend(backendTool)) return createStackGraphIssue({
@@ -1698,7 +1854,7 @@ function getStackPartCompatibilityIssue(part, context) {
1698
1854
  message: "LiveView Streams require Phoenix LiveView"
1699
1855
  });
1700
1856
  }
1701
- if (part.ecosystem === "elixir" && part.toolId === "wallaby" && context.ownerRole === "backend" && context.ownerToolId === "none") return createStackGraphIssue({
1857
+ if (part.ecosystem === "elixir" && part.toolId === "wallaby" && (!context.ownerRole || context.ownerRole === "backend" && context.ownerToolId === "none")) return createStackGraphIssue({
1702
1858
  code: "INCOMPATIBLE_OWNER_TOOL",
1703
1859
  partId: part.id,
1704
1860
  role: part.role,
@@ -1867,6 +2023,7 @@ function getStackPartOptionContextForPart(part, parts) {
1867
2023
  ownerRole: owner && PRIMARY_ROLES.has(owner.role) ? owner.role : void 0,
1868
2024
  ownerToolId: owner?.toolId,
1869
2025
  ownerEcosystem: owner?.ecosystem,
2026
+ settings: part.settings,
1870
2027
  siblingToolIdsByRole: getSiblingToolIdsByRole(part, parts),
1871
2028
  siblingToolIdsByRoleList: getSiblingToolIdsByRoleList(part, parts),
1872
2029
  selectedToolIdsByRole: getSelectedToolIdsByRole(parts),
@@ -1943,6 +2100,11 @@ function legacyProjectConfigToStackParts(config, source = "legacy") {
1943
2100
  if (isLegacyBackendEcosystem(config.ecosystem)) {
1944
2101
  for (const [role, category] of Object.entries(LEGACY_CAPABILITY_CATEGORIES_BY_ECOSYSTEM[config.ecosystem])) addLegacyPart(parts, role, config.ecosystem, config[category], source, backendPart?.id);
1945
2102
  if (backendPart) {
2103
+ for (const [role, category] of Object.entries(LEGACY_SHARED_BACKEND_SINGLE_CATEGORIES_BY_ECOSYSTEM[config.ecosystem])) {
2104
+ const toolId = config[category];
2105
+ if (parts.some((part) => part.ownerPartId === backendPart.id && part.role === role && part.ecosystem === config.ecosystem && part.source !== "provided")) continue;
2106
+ addLegacyPart(parts, role, config.ecosystem, toolId, source, backendPart.id);
2107
+ }
1946
2108
  for (const [role, category] of Object.entries(LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM[config.ecosystem])) {
1947
2109
  const toolId = config[category];
1948
2110
  if (config.ecosystem === "elixir" && toolId && ELIXIR_UNSUPPORTED_GRAPH_TOOLS.has(toolId)) continue;
@@ -2179,4 +2341,4 @@ function validateStackParts(parts) {
2179
2341
 
2180
2342
  //#endregion
2181
2343
  export { isBackendUtilsCompatibleBackend as C, requiresChatSdkVercelAIForExamples as E, hasTauriCompatibleFrontend as S, isExampleChatSdkAllowed as T, UI_LIBRARY_COMPATIBILITY as _, getAddonStackPartBinding as a, hasPWACompatibleFrontend as b, getStackPartOptions as c, materializeProvidedStackParts as d, parseStackPartSpecs as f, BACKEND_UTILS_COMPATIBLE_BACKENDS as g, validateStackParts as h, formatStackPartSpec as i, getStackToolDefinitions as l, stackPartsToLegacyProjectConfigPartial as m, STACK_TOOL_DEFINITIONS as n, getRoleTargetPath as o, stackGraphToLegacyProjectConfigForEcosystem as p, createStackPart as r, getStackPartCompatibilityIssueForPart as s, ELIXIR_UNSUPPORTED_GRAPH_TOOLS as t, legacyProjectConfigToStackParts as u, getUnsupportedWebDeployFrontend as v, isExampleAIAllowed as w, hasTanStackAICompatibleFrontend as x, hasDockerComposeCompatibleFrontend as y };
2182
- //# sourceMappingURL=stack-graph-Q0PrewPk.mjs.map
2344
+ //# sourceMappingURL=stack-graph-BwtoYnJg.mjs.map