@better-fullstack/types 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/{defaults-zyxI-U_5.d.mts → defaults-14rSFqF6.d.mts} +2 -2
  2. package/dist/defaults-14rSFqF6.d.mts.map +1 -0
  3. package/dist/{defaults-Cy0_ttEE.mjs → defaults-u9UAambo.mjs} +3 -2
  4. package/dist/defaults-u9UAambo.mjs.map +1 -0
  5. package/dist/defaults.d.mts +3 -3
  6. package/dist/defaults.mjs +1 -1
  7. package/dist/index.d.mts +6 -6
  8. package/dist/index.mjs +5 -5
  9. package/dist/json-schema.d.mts +438 -270
  10. package/dist/json-schema.d.mts.map +1 -1
  11. package/dist/json-schema.mjs +1 -1
  12. package/dist/{schemas-D444b8s8.mjs → schemas-Cg75ZlzB.mjs} +24 -4
  13. package/dist/schemas-Cg75ZlzB.mjs.map +1 -0
  14. package/dist/{schemas-BTO7jwoE.d.mts → schemas-jMCVu0xX.d.mts} +422 -275
  15. package/dist/schemas-jMCVu0xX.d.mts.map +1 -0
  16. package/dist/schemas.d.mts +2 -2
  17. package/dist/schemas.mjs +2 -2
  18. package/dist/{stack-graph-DH1m1ONQ.d.mts → stack-graph-CjobAqsm.d.mts} +2 -2
  19. package/dist/{stack-graph-DH1m1ONQ.d.mts.map → stack-graph-CjobAqsm.d.mts.map} +1 -1
  20. package/dist/{stack-graph-DXh8F1TL.mjs → stack-graph-D4iCezUq.mjs} +60 -7
  21. package/dist/stack-graph-D4iCezUq.mjs.map +1 -0
  22. package/dist/stack-graph.d.mts +3 -3
  23. package/dist/stack-graph.mjs +2 -2
  24. package/dist/{stack-translation-Bb3LIDTp.mjs → stack-translation-CAU_sdNI.mjs} +156 -26
  25. package/dist/stack-translation-CAU_sdNI.mjs.map +1 -0
  26. package/dist/{stack-translation-LwAKaXg1.d.mts → stack-translation-CjsJzLCX.d.mts} +9 -7
  27. package/dist/stack-translation-CjsJzLCX.d.mts.map +1 -0
  28. package/dist/stack-translation.d.mts +4 -4
  29. package/dist/stack-translation.mjs +3 -3
  30. package/dist/{types-C4r4ucMM.d.mts → types-DwY2BNyU.d.mts} +4 -3
  31. package/dist/types-DwY2BNyU.d.mts.map +1 -0
  32. package/dist/types.d.mts +3 -3
  33. package/package.json +2 -1
  34. package/dist/defaults-Cy0_ttEE.mjs.map +0 -1
  35. package/dist/defaults-zyxI-U_5.d.mts.map +0 -1
  36. package/dist/schemas-BTO7jwoE.d.mts.map +0 -1
  37. package/dist/schemas-D444b8s8.mjs.map +0 -1
  38. package/dist/stack-graph-DXh8F1TL.mjs.map +0 -1
  39. package/dist/stack-translation-Bb3LIDTp.mjs.map +0 -1
  40. package/dist/stack-translation-LwAKaXg1.d.mts.map +0 -1
  41. package/dist/types-C4r4ucMM.d.mts.map +0 -1
@@ -1,6 +1,6 @@
1
- import { $n as MOBILE_STORAGE_VALUES, $r as RUST_CLI_VALUES, Ai as SHADCN_BASE_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, Fi as SHADCN_STYLE_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, Mi as SHADCN_FONT_VALUES, Mn as JAVA_LIBRARIES_VALUES, N as DATABASE_VALUES, Ni as SHADCN_ICON_LIBRARY_VALUES, Nn as JAVA_LOGGING_VALUES, Oi as SERVER_DEPLOY_VALUES, Or as PYTHON_WEB_FRAMEWORK_VALUES, Pi as SHADCN_RADIUS_VALUES, Pn as JAVA_ORM_VALUES, Qi as TESTING_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, 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, 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, ht as ELIXIR_JSON_VALUES, i as AI_VALUES, ia as VERSION_CHANNEL_VALUES, ii as RUST_MESSAGE_QUEUE_VALUES, in as GO_CACHING_VALUES, ji as SHADCN_COLOR_THEME_VALUES, jn as JAVA_BUILD_TOOL_VALUES, k as CSS_FRAMEWORK_VALUES, ki as SHADCN_BASE_COLOR_VALUES, kn as JAVA_API_VALUES, l as ASTRO_INTEGRATION_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, pr as PACKAGE_MANAGER_VALUES, pt as ELIXIR_HTTP_VALUES, qn as LOGGING_VALUES, qr as RATE_LIMIT_VALUES, qt as FILE_STORAGE_VALUES, r as AI_DOCS_VALUES, ra as VALIDATION_VALUES, ri as RUST_LOGGING_VALUES, rn as GO_AUTH_VALUES, sa as WEB_DEPLOY_VALUES, si as RUST_REALTIME_VALUES, sn as GO_LOGGING_VALUES, st as EFFECT_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, 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-D444b8s8.mjs";
2
- import { C as isBackendUtilsCompatibleBackend, 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, y as hasDockerComposeCompatibleFrontend } from "./stack-graph-DXh8F1TL.mjs";
3
- import { t as createCliDefaultProjectConfigBase } from "./defaults-Cy0_ttEE.mjs";
1
+ import { $n as MOBILE_STORAGE_VALUES, $r as RUST_CLI_VALUES, Ai as SHADCN_BASE_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, Fi as SHADCN_STYLE_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, Mi as SHADCN_FONT_VALUES, Mn as JAVA_LIBRARIES_VALUES, N as DATABASE_VALUES, Ni as SHADCN_ICON_LIBRARY_VALUES, Nn as JAVA_LOGGING_VALUES, Oi as SERVER_DEPLOY_VALUES, Or as PYTHON_WEB_FRAMEWORK_VALUES, Pi as SHADCN_RADIUS_VALUES, Pn as JAVA_ORM_VALUES, Qi as TESTING_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, 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, 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, aa as VERSION_CHANNEL_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, ht as ELIXIR_JSON_VALUES, i as AI_VALUES, ia as VECTOR_DB_VALUES, ii as RUST_MESSAGE_QUEUE_VALUES, in as GO_CACHING_VALUES, ji as SHADCN_COLOR_THEME_VALUES, jn as JAVA_BUILD_TOOL_VALUES, k as CSS_FRAMEWORK_VALUES, ki as SHADCN_BASE_COLOR_VALUES, kn as JAVA_API_VALUES, l as ASTRO_INTEGRATION_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, pr as PACKAGE_MANAGER_VALUES, pt as ELIXIR_HTTP_VALUES, qn as LOGGING_VALUES, qr as RATE_LIMIT_VALUES, qt as FILE_STORAGE_VALUES, r as AI_DOCS_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, ti as RUST_FRONTEND_VALUES, tr as MOBILE_UI_VALUES, u as AUTH_VALUES, un as GO_ORM_VALUES, ut as ELIXIR_CACHING_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";
2
+ import { C as isBackendUtilsCompatibleBackend, 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, y as hasDockerComposeCompatibleFrontend } from "./stack-graph-D4iCezUq.mjs";
3
+ import { t as createCliDefaultProjectConfigBase } from "./defaults-u9UAambo.mjs";
4
4
 
5
5
  //#region src/capabilities.ts
6
6
  const CAPABILITY_DEFINITIONS = { auth: [
@@ -264,6 +264,7 @@ const TYPESCRIPT_CATEGORY_ORDER = [
264
264
  "rateLimit",
265
265
  "i18n",
266
266
  "search",
267
+ "vectorDb",
267
268
  "fileStorage",
268
269
  "animation",
269
270
  "cms",
@@ -581,6 +582,7 @@ const CODE_QUALITY_VALUES = [
581
582
  const DOCUMENTATION_VALUES = ["starlight", "fumadocs"];
582
583
  const APP_PLATFORM_VALUES = [
583
584
  "turborepo",
585
+ "nx",
584
586
  "pwa",
585
587
  "tauri",
586
588
  "wxt",
@@ -596,7 +598,9 @@ const APP_PLATFORM_VALUES = [
596
598
  "tanstack-db",
597
599
  "tanstack-pacer",
598
600
  "backend-utils",
599
- "docker-compose"
601
+ "devcontainer",
602
+ "docker-compose",
603
+ "github-actions"
600
604
  ];
601
605
  const EXAMPLE_VALUES = ["ai", "chat-sdk"];
602
606
  const BOOLEAN_OPTION_VALUES = ["true", "false"];
@@ -648,6 +652,7 @@ const CATEGORY_VALUE_IDS = {
648
652
  rateLimit: RATE_LIMIT_VALUES,
649
653
  i18n: I18N_VALUES,
650
654
  search: SEARCH_VALUES,
655
+ vectorDb: VECTOR_DB_VALUES,
651
656
  fileStorage: FILE_STORAGE_VALUES,
652
657
  animation: ANIMATION_VALUES,
653
658
  cssFramework: CSS_FRAMEWORK_VALUES,
@@ -760,7 +765,9 @@ const EXACT_LABEL_OVERRIDES = {
760
765
  api: {
761
766
  trpc: "tRPC",
762
767
  orpc: "oRPC",
763
- "graphql-yoga": "GraphQL Yoga"
768
+ "graphql-yoga": "GraphQL Yoga",
769
+ "apollo-server": "Apollo Server",
770
+ openapi: "OpenAPI"
764
771
  },
765
772
  webFrontend: {
766
773
  next: "Next.js",
@@ -829,7 +836,8 @@ const EXACT_LABEL_OVERRIDES = {
829
836
  },
830
837
  cms: {
831
838
  tinacms: "TinaCMS",
832
- directus: "Directus"
839
+ directus: "Directus",
840
+ keystatic: "Keystatic"
833
841
  },
834
842
  auth: {
835
843
  "better-auth-organizations": "Better Auth + Organizations",
@@ -891,6 +899,7 @@ const EXACT_LABEL_OVERRIDES = {
891
899
  "trigger-dev": "Trigger.dev"
892
900
  },
893
901
  i18n: {
902
+ paraglide: "Paraglide",
894
903
  i18next: "i18next",
895
904
  "next-intl": "next-intl"
896
905
  },
@@ -898,8 +907,15 @@ const EXACT_LABEL_OVERRIDES = {
898
907
  meilisearch: "Meilisearch",
899
908
  typesense: "Typesense",
900
909
  elasticsearch: "Elasticsearch",
910
+ opensearch: "OpenSearch",
901
911
  algolia: "Algolia"
902
912
  },
913
+ vectorDb: {
914
+ pgvector: "pgvector",
915
+ qdrant: "Qdrant",
916
+ chroma: "Chroma",
917
+ pinecone: "Pinecone"
918
+ },
903
919
  fileStorage: {
904
920
  s3: "AWS S3",
905
921
  r2: "Cloudflare R2",
@@ -980,7 +996,9 @@ const EXACT_LABEL_OVERRIDES = {
980
996
  "tanstack-virtual": "TanStack Virtual",
981
997
  "tanstack-db": "TanStack DB",
982
998
  "tanstack-pacer": "TanStack Pacer",
983
- "docker-compose": "Docker Compose"
999
+ devcontainer: "DevContainer",
1000
+ "docker-compose": "Docker Compose",
1001
+ "github-actions": "GitHub Actions"
984
1002
  },
985
1003
  versionChannel: {
986
1004
  stable: "Stable",
@@ -1005,7 +1023,7 @@ const EXACT_LABEL_OVERRIDES = {
1005
1023
  },
1006
1024
  aiDocs: {
1007
1025
  "claude-md": "CLAUDE.md",
1008
- "agents-md": "Agents.md",
1026
+ "agents-md": "AGENTS.md",
1009
1027
  cursorrules: ".cursorrules"
1010
1028
  },
1011
1029
  git: {
@@ -1498,6 +1516,7 @@ const OPTION_CATEGORY_METADATA = {
1498
1516
  rateLimit: buildCategoryMetadata("rateLimit"),
1499
1517
  i18n: buildCategoryMetadata("i18n"),
1500
1518
  search: buildCategoryMetadata("search"),
1519
+ vectorDb: buildCategoryMetadata("vectorDb"),
1501
1520
  fileStorage: buildCategoryMetadata("fileStorage"),
1502
1521
  animation: buildCategoryMetadata("animation"),
1503
1522
  cssFramework: buildCategoryMetadata("cssFramework"),
@@ -1626,6 +1645,19 @@ function normalizeOptionId(category, value) {
1626
1645
  //#endregion
1627
1646
  //#region src/compatibility.ts
1628
1647
  const DEFAULT_RUNTIME = "bun";
1648
+ const PARAGLIDE_COMPATIBLE_FRONTENDS = new Set([
1649
+ "next",
1650
+ "nuxt",
1651
+ "vinext",
1652
+ "tanstack-router",
1653
+ "tanstack-start",
1654
+ "react-router",
1655
+ "react-vite",
1656
+ "svelte",
1657
+ "solid",
1658
+ "solid-start",
1659
+ "astro"
1660
+ ]);
1629
1661
  function validateProjectName(name) {
1630
1662
  const INVALID_CHARS = [
1631
1663
  "<",
@@ -1668,6 +1700,7 @@ const analyzeStackCompatibility = (stack) => {
1668
1700
  changes: []
1669
1701
  };
1670
1702
  const nextStack = { ...stack };
1703
+ if (nextStack.vectorDb === void 0) nextStack.vectorDb = "none";
1671
1704
  let changed = false;
1672
1705
  const notes = {};
1673
1706
  const changes = [];
@@ -1684,6 +1717,7 @@ const analyzeStackCompatibility = (stack) => {
1684
1717
  dbSetup: "none",
1685
1718
  serverDeploy: "none",
1686
1719
  search: "none",
1720
+ vectorDb: "none",
1687
1721
  rateLimit: "none",
1688
1722
  fileStorage: "none"
1689
1723
  })) {
@@ -1751,6 +1785,7 @@ const analyzeStackCompatibility = (stack) => {
1751
1785
  serverDeploy: "none",
1752
1786
  payments: "none",
1753
1787
  search: "none",
1788
+ vectorDb: "none",
1754
1789
  rateLimit: "none",
1755
1790
  fileStorage: "none"
1756
1791
  };
@@ -2051,7 +2086,7 @@ const analyzeStackCompatibility = (stack) => {
2051
2086
  "svelte",
2052
2087
  "solid",
2053
2088
  "solid-start"
2054
- ].includes(f)) && nextStack.api === "trpc") {
2089
+ ].includes(f)) && (nextStack.api === "trpc" || nextStack.api === "apollo-server")) {
2055
2090
  nextStack.api = "orpc";
2056
2091
  changed = true;
2057
2092
  changes.push({
@@ -2059,12 +2094,13 @@ const analyzeStackCompatibility = (stack) => {
2059
2094
  message: "API set to 'oRPC' (required for this frontend)"
2060
2095
  });
2061
2096
  }
2062
- if (nextStack.webFrontend.includes("astro") && nextStack.astroIntegration !== "react" && nextStack.api === "trpc") {
2097
+ if (nextStack.webFrontend.includes("astro") && nextStack.astroIntegration !== "react" && (nextStack.api === "trpc" || nextStack.api === "apollo-server")) {
2098
+ const apiName = nextStack.api === "apollo-server" ? "Apollo Server" : "tRPC";
2063
2099
  nextStack.api = "orpc";
2064
2100
  changed = true;
2065
2101
  changes.push({
2066
2102
  category: "api",
2067
- message: "API set to 'oRPC' (tRPC requires React integration with Astro)"
2103
+ message: `API set to 'oRPC' (${apiName} requires React integration with Astro)`
2068
2104
  });
2069
2105
  }
2070
2106
  }
@@ -2291,6 +2327,11 @@ const analyzeStackCompatibility = (stack) => {
2291
2327
  "none",
2292
2328
  "Search set to 'None' (React Native ecosystem)"
2293
2329
  ],
2330
+ [
2331
+ "vectorDb",
2332
+ "none",
2333
+ "Vector database set to 'None' (React Native ecosystem)"
2334
+ ],
2294
2335
  [
2295
2336
  "rateLimit",
2296
2337
  "none",
@@ -2819,6 +2860,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
2819
2860
  if (category === "dbSetup" && optionId !== "none") return "Convex handles database setup";
2820
2861
  if (category === "serverDeploy" && optionId !== "none") return "Convex has its own deployment";
2821
2862
  if (category === "search" && optionId !== "none") return "Search requires a standalone backend";
2863
+ if (category === "vectorDb" && optionId !== "none") return "Vector database requires a standalone backend (Convex has built-in vector search)";
2822
2864
  if (category === "rateLimit" && optionId !== "none") return "Rate limiting requires a standalone backend";
2823
2865
  if (category === "fileStorage" && optionId !== "none") return "File storage requires a standalone backend";
2824
2866
  if (category === "webFrontend" && optionId === "solid") return "In Better-Fullstack, the Convex backend is currently not available with Solid";
@@ -2861,6 +2903,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
2861
2903
  if (category === "serverDeploy" && optionId !== "none") return "No backend selected";
2862
2904
  if (category === "payments" && optionId !== "none") return "No backend selected";
2863
2905
  if (category === "search" && optionId !== "none") return "No backend selected";
2906
+ if (category === "vectorDb" && optionId !== "none") return "No backend selected";
2864
2907
  if (category === "rateLimit" && optionId !== "none") return "No backend selected";
2865
2908
  if (category === "fileStorage" && optionId !== "none") return "No backend selected";
2866
2909
  if (category === "examples" && optionId !== "none") return "No backend selected";
@@ -2917,6 +2960,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
2917
2960
  }
2918
2961
  if (category === "runtime") {
2919
2962
  if (optionId === "workers" && currentStack.backend !== "hono") return "In Better-Fullstack, Workers runtime currently requires the Hono backend";
2963
+ 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.";
2920
2964
  if (optionId === "none") {
2921
2965
  if (![
2922
2966
  "convex",
@@ -2973,9 +3017,44 @@ const getDisabledReason = (currentStack, category, optionId) => {
2973
3017
  ].includes(f))} requires oRPC, not tRPC`;
2974
3018
  if (currentStack.webFrontend.includes("astro") && currentStack.astroIntegration !== "react" && currentStack.astroIntegration !== "none") return `Astro with ${currentStack.astroIntegration} integration requires oRPC, not tRPC`;
2975
3019
  }
3020
+ if (category === "api" && optionId === "openapi") {
3021
+ if (currentStack.backend === "self") return "OpenAPI server scaffolding currently requires a standalone TypeScript backend";
3022
+ if (currentStack.nativeFrontend.length > 0) return "OpenAPI is currently available for web frontends, not React Native";
3023
+ if (![
3024
+ "hono",
3025
+ "express",
3026
+ "fastify",
3027
+ "elysia"
3028
+ ].includes(currentStack.backend)) return "OpenAPI currently supports Hono, Express, Fastify, and Elysia backends";
3029
+ }
3030
+ if (category === "api" && optionId === "apollo-server") {
3031
+ if (currentStack.webFrontend.some((f) => [
3032
+ "nuxt",
3033
+ "svelte",
3034
+ "solid",
3035
+ "solid-start"
3036
+ ].includes(f))) return `${currentStack.webFrontend.find((f) => [
3037
+ "nuxt",
3038
+ "svelte",
3039
+ "solid",
3040
+ "solid-start"
3041
+ ].includes(f))} requires oRPC, not Apollo Server`;
3042
+ if (currentStack.webFrontend.includes("astro") && currentStack.astroIntegration !== "react") return "Apollo Server requires React integration with Astro";
3043
+ if (currentStack.backend === "self") return "Apollo Server scaffolding currently requires a standalone TypeScript backend";
3044
+ if (currentStack.nativeFrontend.length > 0) return "Apollo Server is currently available for web frontends, not React Native";
3045
+ if (![
3046
+ "hono",
3047
+ "express",
3048
+ "fastify",
3049
+ "elysia"
3050
+ ].includes(currentStack.backend)) return "Apollo Server currently supports Hono, Express, Fastify, and Elysia backends";
3051
+ }
3052
+ if (category === "appPlatforms" && optionId === "nx" && currentStack.appPlatforms.includes("turborepo")) return "Choose either Nx or Turborepo, not both";
3053
+ if (category === "appPlatforms" && optionId === "turborepo" && currentStack.appPlatforms.includes("nx")) return "Choose either Turborepo or Nx, not both";
2976
3054
  if (category === "astroIntegration") {
2977
3055
  if (!currentStack.webFrontend.includes("astro") && optionId !== "none") return "Astro integration requires Astro frontend";
2978
- if (currentStack.api === "trpc" && optionId !== "react" && optionId !== "none") return "tRPC requires React integration with Astro";
3056
+ if (currentStack.webFrontend.includes("astro") && currentStack.api === "apollo-server" && optionId !== "react") return "Apollo Server requires React integration with Astro";
3057
+ if (currentStack.webFrontend.includes("astro") && currentStack.api === "trpc" && optionId !== "react" && optionId !== "none") return "tRPC requires React integration with Astro";
2979
3058
  }
2980
3059
  if (category === "auth") {
2981
3060
  const isBetterAuthOption = optionId === "better-auth" || optionId === "better-auth-organizations";
@@ -3000,6 +3079,9 @@ const getDisabledReason = (currentStack, category, optionId) => {
3000
3079
  if (category === "cms" && optionId === "payload") {
3001
3080
  if (!currentStack.webFrontend.includes("next")) return "Payload CMS v3 requires Next.js";
3002
3081
  }
3082
+ if (category === "cms" && optionId === "keystatic") {
3083
+ if (!currentStack.webFrontend.includes("next")) return "Keystatic is currently scaffolded for Next.js only because @keystatic/astro is not Astro 7-compatible yet.";
3084
+ }
3003
3085
  if (category === "email" && optionId !== "none") {
3004
3086
  if (currentStack.ecosystem !== "typescript") return null;
3005
3087
  if (currentStack.backend === "convex") return "Email integration is not available with Convex backend";
@@ -3019,6 +3101,9 @@ const getDisabledReason = (currentStack, category, optionId) => {
3019
3101
  if (category === "search" && optionId !== "none") {
3020
3102
  if (currentStack.ecosystem !== "typescript") return null;
3021
3103
  }
3104
+ if (category === "vectorDb" && optionId !== "none") {
3105
+ if (currentStack.ecosystem !== "typescript") return "Vector database is only available for the TypeScript ecosystem";
3106
+ }
3022
3107
  if (category === "ai" && requiresChatSdkVercelAI(currentStack) && optionId !== "vercel-ai") return "Chat SDK example (Nuxt/Hono profile) requires Vercel AI SDK in v1";
3023
3108
  if (category === "ai" && optionId === "tanstack-ai") {
3024
3109
  const compatibleFrontends = [
@@ -3036,14 +3121,22 @@ const getDisabledReason = (currentStack, category, optionId) => {
3036
3121
  if (category === "appPlatforms") {
3037
3122
  if (optionId === "pwa" && !hasPWACompatibleFrontend(currentStack.webFrontend)) return "PWA requires TanStack Router, React Router, Solid, Next.js, Vinext, or Astro";
3038
3123
  if (optionId === "tauri" && !hasTauriCompatibleFrontend(currentStack.webFrontend)) return "Tauri requires TanStack Router, React Router, Nuxt, Svelte, Solid, Next.js, or Astro";
3039
- if (optionId === "docker-compose") {
3040
- if (currentStack.backend === "convex") return "Docker Compose is not compatible with Convex backend (managed service)";
3041
- if (currentStack.runtime === "workers") return "Docker Compose is not compatible with Cloudflare Workers runtime";
3042
- if (currentStack.ecosystem === "typescript" && !hasDockerComposeCompatibleFrontend(currentStack.webFrontend)) return "Docker Compose currently supports Next.js, TanStack Router, React Router, React Vite, Solid, or Astro";
3043
- if (currentStack.ecosystem === "typescript" && currentStack.backend === "self" && !currentStack.webFrontend.includes("next")) return "Docker Compose self-backend support currently requires Next.js";
3044
- if (currentStack.ecosystem === "rust" && currentStack.rustFrontend !== "none") return "Docker Compose for Rust currently supports server-only projects";
3045
- if (currentStack.ecosystem === "java" && currentStack.javaWebFramework !== "spring-boot") return "Docker Compose for Java currently requires Spring Boot";
3046
- if (currentStack.ecosystem === "python" && currentStack.database !== "none" && currentStack.database !== "sqlite" && currentStack.database !== "postgres") return "Docker Compose for Python ORM projects currently supports SQLite defaults or Postgres";
3124
+ if (optionId === "docker-compose" || optionId === "devcontainer") {
3125
+ const title = optionId === "devcontainer" ? "DevContainer" : "Docker Compose";
3126
+ if (currentStack.backend === "convex") return `${title} is not compatible with Convex backend (managed service)`;
3127
+ if (currentStack.runtime === "workers") return `${title} is not compatible with Cloudflare Workers runtime`;
3128
+ if (![
3129
+ "typescript",
3130
+ "python",
3131
+ "go",
3132
+ "rust",
3133
+ "java"
3134
+ ].includes(currentStack.ecosystem)) return `${title} currently supports TypeScript, Python, Go, Rust, or Java projects`;
3135
+ if (currentStack.ecosystem === "typescript" && !hasDockerComposeCompatibleFrontend(currentStack.webFrontend)) return `${title} currently supports Next.js, TanStack Router, React Router, React Vite, Solid, or Astro`;
3136
+ if (currentStack.ecosystem === "typescript" && currentStack.backend === "self" && !currentStack.webFrontend.includes("next")) return `${title} self-backend support currently requires Next.js`;
3137
+ if (currentStack.ecosystem === "rust" && currentStack.rustFrontend !== "none") return `${title} for Rust currently supports server-only projects`;
3138
+ if (currentStack.ecosystem === "java" && currentStack.javaWebFramework !== "spring-boot") return `${title} for Java currently requires Spring Boot`;
3139
+ if (currentStack.ecosystem === "python" && currentStack.database !== "none" && currentStack.database !== "sqlite" && currentStack.database !== "postgres") return `${title} for Python ORM projects currently supports SQLite defaults or Postgres`;
3047
3140
  }
3048
3141
  if (optionId === "backend-utils") {
3049
3142
  if (currentStack.ecosystem !== "typescript") return "Backend Utils requires a TypeScript server stack";
@@ -3211,6 +3304,11 @@ const getDisabledReason = (currentStack, category, optionId) => {
3211
3304
  if (optionId === "none" && currentStack.runtime === "workers") return "Workers requires server deployment";
3212
3305
  }
3213
3306
  if (category === "i18n") {
3307
+ if (optionId !== "none" && !currentStack.webFrontend.some((f) => f !== "none")) return "i18n requires a web frontend";
3308
+ if (optionId === "paraglide") {
3309
+ const unsupportedFrontend = currentStack.webFrontend.find((frontend) => frontend !== "none" && !PARAGLIDE_COMPATIBLE_FRONTENDS.has(frontend));
3310
+ if (unsupportedFrontend) return `Paraglide is not yet wired for the '${unsupportedFrontend}' frontend`;
3311
+ }
3214
3312
  if (optionId === "next-intl") {
3215
3313
  if (!currentStack.webFrontend.includes("next")) return "next-intl requires Next.js";
3216
3314
  }
@@ -3728,6 +3826,7 @@ const ADDON_COMPATIBILITY = {
3728
3826
  husky: [],
3729
3827
  lefthook: [],
3730
3828
  turborepo: [],
3829
+ nx: [],
3731
3830
  starlight: [],
3732
3831
  ultracite: [],
3733
3832
  ruler: [],
@@ -3828,6 +3927,8 @@ const ADDON_COMPATIBILITY = {
3828
3927
  ],
3829
3928
  "backend-utils": [],
3830
3929
  "docker-compose": [],
3930
+ devcontainer: [],
3931
+ "github-actions": [],
3831
3932
  none: []
3832
3933
  };
3833
3934
  function isWebFrontend(value) {
@@ -3848,12 +3949,26 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
3848
3949
  const includesAngular = frontends.includes("angular");
3849
3950
  const includesRedwood = frontends.includes("redwood");
3850
3951
  const includesFresh = frontends.includes("fresh");
3952
+ const includesNative = frontends.some((frontend) => [
3953
+ "native-bare",
3954
+ "native-uniwind",
3955
+ "native-unistyles"
3956
+ ].includes(frontend));
3851
3957
  const base = [
3852
3958
  "trpc",
3853
3959
  "orpc",
3854
3960
  "ts-rest",
3855
3961
  "garph",
3856
3962
  "graphql-yoga",
3963
+ "apollo-server",
3964
+ "openapi",
3965
+ "none"
3966
+ ];
3967
+ if (includesNative) return [
3968
+ "trpc",
3969
+ "orpc",
3970
+ "ts-rest",
3971
+ "garph",
3857
3972
  "none"
3858
3973
  ];
3859
3974
  if (includesQwik || includesAngular || includesRedwood || includesFresh) return ["graphql-yoga", "none"];
@@ -3861,11 +3976,13 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
3861
3976
  if (includesNuxt || includesSvelte || includesSolid || includesSolidStartApi) return [
3862
3977
  "orpc",
3863
3978
  "graphql-yoga",
3979
+ "openapi",
3864
3980
  "none"
3865
3981
  ];
3866
- if (includesAstro && astroIntegration && astroIntegration !== "react") return [
3982
+ if (includesAstro && astroIntegration !== "react") return [
3867
3983
  "orpc",
3868
3984
  "graphql-yoga",
3985
+ "openapi",
3869
3986
  "none"
3870
3987
  ];
3871
3988
  return base;
@@ -3873,6 +3990,8 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
3873
3990
  function getReactOnlyApiDisplayName(api) {
3874
3991
  if (api === "trpc") return "tRPC";
3875
3992
  if (api === "ts-rest") return "ts-rest";
3993
+ if (api === "openapi") return "OpenAPI";
3994
+ if (api === "apollo-server") return "Apollo Server";
3876
3995
  return "garph";
3877
3996
  }
3878
3997
  function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration) {
@@ -3886,7 +4005,7 @@ function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration)
3886
4005
  const includesRedwood = frontends.includes("redwood");
3887
4006
  const includesFresh = frontends.includes("fresh");
3888
4007
  const includesSolidStart = frontends.includes("solid-start");
3889
- const isReactOnlyApi = api === "trpc" || api === "ts-rest" || api === "garph";
4008
+ const isReactOnlyApi = api === "trpc" || api === "ts-rest" || api === "garph" || api === "apollo-server";
3890
4009
  if ((includesNuxt || includesSvelte || includesSolid || includesSolidStart) && isReactOnlyApi) {
3891
4010
  const incompatibleFrontend = includesNuxt ? "nuxt" : includesSvelte ? "svelte" : includesSolid ? "solid" : "solid-start";
3892
4011
  return {
@@ -3949,14 +4068,14 @@ function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration)
3949
4068
  },
3950
4069
  suggestions: ["Use --api none with Fresh"]
3951
4070
  };
3952
- if (includesAstro && astroIntegration && astroIntegration !== "react" && isReactOnlyApi) return {
4071
+ if (includesAstro && astroIntegration !== "react" && isReactOnlyApi) return {
3953
4072
  code: "ASTRO_API_REQUIRES_REACT_INTEGRATION",
3954
4073
  message: `${getReactOnlyApiDisplayName(api)} API requires React integration with Astro.`,
3955
4074
  category: "api",
3956
4075
  optionId: api,
3957
4076
  provided: {
3958
4077
  api,
3959
- "astro-integration": astroIntegration
4078
+ "astro-integration": astroIntegration ?? "none"
3960
4079
  },
3961
4080
  suggestions: [
3962
4081
  "Use --api orpc (works with all Astro integrations)",
@@ -4268,6 +4387,7 @@ const DEFAULT_STACK_SELECTION = {
4268
4387
  shadcnRadius: "default",
4269
4388
  cms: "none",
4270
4389
  search: "none",
4390
+ vectorDb: "none",
4271
4391
  fileStorage: "none",
4272
4392
  codeQuality: [],
4273
4393
  documentation: [],
@@ -4276,7 +4396,7 @@ const DEFAULT_STACK_SELECTION = {
4276
4396
  versionChannel: "stable",
4277
4397
  examples: [],
4278
4398
  aiSdk: "none",
4279
- aiDocs: ["claude-md"],
4399
+ aiDocs: ["claude-md", "agents-md"],
4280
4400
  git: "true",
4281
4401
  install: "true",
4282
4402
  api: "trpc",
@@ -4412,6 +4532,7 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
4412
4532
  shadcnRadius: "shadcnRadius",
4413
4533
  cms: "cms",
4414
4534
  search: "search",
4535
+ vectorDb: "vectorDb",
4415
4536
  fileStorage: "fileStorage",
4416
4537
  codeQuality: "codeQuality",
4417
4538
  documentation: "documentation",
@@ -4568,6 +4689,7 @@ const STACK_SELECTION_URL_KEYS = {
4568
4689
  shadcnRadius: "scr",
4569
4690
  cms: "cms",
4570
4691
  search: "srch",
4692
+ vectorDb: "vdb",
4571
4693
  fileStorage: "fs",
4572
4694
  codeQuality: "cq",
4573
4695
  documentation: "doc",
@@ -4782,6 +4904,7 @@ const CLI_SCALAR_CONFIG_FIELDS = [
4782
4904
  ["rateLimit", "rateLimit"],
4783
4905
  ["i18n", "i18n"],
4784
4906
  ["search", "search"],
4907
+ ["vectorDb", "vectorDb"],
4785
4908
  ["fileStorage", "fileStorage"],
4786
4909
  ["analytics", "analytics"],
4787
4910
  ["mobileNavigation", "mobileNavigation"],
@@ -5014,7 +5137,10 @@ const COMMAND_ADDONS = new Set([
5014
5137
  "lefthook",
5015
5138
  "husky",
5016
5139
  "turborepo",
5140
+ "nx",
5017
5141
  "docker-compose",
5142
+ "devcontainer",
5143
+ "github-actions",
5018
5144
  "ultracite",
5019
5145
  "fumadocs",
5020
5146
  "oxlint",
@@ -5117,6 +5243,7 @@ const GRAPH_TYPESCRIPT_BACKEND_PART_SELECTION_KEYS = [
5117
5243
  ["rateLimit", "rateLimit"],
5118
5244
  ["cms", "cms"],
5119
5245
  ["search", "search"],
5246
+ ["vectorDb", "vectorDb"],
5120
5247
  ["fileStorage", "fileStorage"]
5121
5248
  ];
5122
5249
  const GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS = [
@@ -5191,6 +5318,7 @@ const GRAPH_TYPESCRIPT_BACKEND_PART_CLI_KEYS = [
5191
5318
  ["rateLimit", "rateLimit"],
5192
5319
  ["cms", "cms"],
5193
5320
  ["search", "search"],
5321
+ ["vectorDb", "vectorDb"],
5194
5322
  ["fileStorage", "fileStorage"]
5195
5323
  ];
5196
5324
  const GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS = [
@@ -5664,6 +5792,7 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
5664
5792
  rateLimit: stack.rateLimit,
5665
5793
  i18n: stack.i18n,
5666
5794
  search: stack.search,
5795
+ vectorDb: stack.vectorDb,
5667
5796
  fileStorage: stack.fileStorage,
5668
5797
  rustWebFramework: stack.rustWebFramework,
5669
5798
  rustFrontend: stack.rustFrontend,
@@ -5868,6 +5997,7 @@ function generateTypeScriptCommand(selection, projectName) {
5868
5997
  `--rate-limit ${selection.rateLimit}`,
5869
5998
  `--i18n ${selection.i18n}`,
5870
5999
  `--search ${selection.search}`,
6000
+ `--vector-db ${selection.vectorDb}`,
5871
6001
  `--file-storage ${selection.fileStorage}`,
5872
6002
  `--cms ${selection.cms}`,
5873
6003
  `--effect ${selection.backendLibraries}`,
@@ -6077,4 +6207,4 @@ function generateStackSelectionCommand(selection) {
6077
6207
 
6078
6208
  //#endregion
6079
6209
  export { getCategoryDisplayName as $, getCompatibleFormLibraries as A, validateAddonCompatibility as B, allowedApisForFrontends as C, getApiFrontendCompatibilityIssue as D, getAIFrontendCompatibilityIssue as E, isOptionCompatible as F, GO_CATEGORY_ORDER as G, CATEGORY_ORDER as H, isWebFrontend as I, PYTHON_CATEGORY_ORDER as J, JAVA_CATEGORY_ORDER as K, requiresChatSdkVercelAI as L, getDisabledReason as M, hasWebStyling as N, getCompatibleAddons as O, isFrontendAllowedWithBackend as P, getCategoryCliValues as Q, requiresChatSdkVercelAIForSelection as R, usesVirtualNoneStackSelection as S, evaluateCompatibility as T, DOTNET_CATEGORY_ORDER as U, validateProjectName as V, ELIXIR_CATEGORY_ORDER as W, RUST_CATEGORY_ORDER as X, REACT_NATIVE_CATEGORY_ORDER as Y, TYPESCRIPT_CATEGORY_ORDER as Z, parseStackSelectionFromSearch as _, STACK_SELECTION_URL_KEYS as a, getCapabilityDefinitions as at, stackSelectionToCliComparableConfig as b, cloneDefaultStackSelection as c, normalizeCapabilitySelection as ct, isArrayStackSelectionKey as d, getCategoryOptionIds as et, isCliDefaultStackSelection as f, normalizeStackSelectionValue as g, normalizeStackSelection as h, STACK_SELECTION_OPTION_CATEGORY_BY_KEY as i, normalizeOptionId as it, getCompatibleUILibraries as j, getCompatibleCSSFrameworks as k, createStackSelectionSearchParams as l, isStackSelectionDefault as m, NON_OPTION_STACK_SELECTION_KEYS as n, getOptionMetadata as nt, VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS as o, getCapabilityDisabledReason as ot, isGraphStackSelection as p, OPTION_CATEGORY_METADATA as q, STACK_SELECTION_KEYS as r, isMultiSelectCategory as rt, cliInputToProjectConfigPartial as s, getSupportedCapabilityOptions as st, DEFAULT_STACK_SELECTION as t, getCategoryOrderForEcosystem as tt, generateStackSelectionCommand as u, parseStackSelectionFromUrlRecord as v, analyzeStackCompatibility as w, stackSelectionToProjectConfig as x, processCliArrayOption as y, splitFrontends as z };
6080
- //# sourceMappingURL=stack-translation-Bb3LIDTp.mjs.map
6210
+ //# sourceMappingURL=stack-translation-CAU_sdNI.mjs.map