@better-fullstack/types 2.0.3 → 2.1.1

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-CGUDVwYW.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 +144 -0
  10. package/dist/json-schema.d.mts.map +1 -1
  11. package/dist/json-schema.mjs +1 -1
  12. package/dist/{schemas-D1fG1cXJ.mjs → schemas-Cg75ZlzB.mjs} +22 -4
  13. package/dist/schemas-Cg75ZlzB.mjs.map +1 -0
  14. package/dist/{schemas-DVyeJ5g_.d.mts → schemas-jMCVu0xX.d.mts} +135 -7
  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-DxbVgmAd.d.mts → stack-graph-CjobAqsm.d.mts} +2 -2
  19. package/dist/{stack-graph-DxbVgmAd.d.mts.map → stack-graph-CjobAqsm.d.mts.map} +1 -1
  20. package/dist/{stack-graph-DIXiAwrZ.mjs → stack-graph-Q0PrewPk.mjs} +116 -49
  21. package/dist/stack-graph-Q0PrewPk.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-DQfT1jwM.d.mts → stack-translation-CjsJzLCX.d.mts} +9 -7
  25. package/dist/stack-translation-CjsJzLCX.d.mts.map +1 -0
  26. package/dist/{stack-translation-9PxvYAJB.mjs → stack-translation-gNYPvlYt.mjs} +132 -25
  27. package/dist/stack-translation-gNYPvlYt.mjs.map +1 -0
  28. package/dist/stack-translation.d.mts +4 -4
  29. package/dist/stack-translation.mjs +3 -3
  30. package/dist/{types-j0tqBnAt.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-CGUDVwYW.d.mts.map +0 -1
  35. package/dist/defaults-Cy0_ttEE.mjs.map +0 -1
  36. package/dist/schemas-D1fG1cXJ.mjs.map +0 -1
  37. package/dist/schemas-DVyeJ5g_.d.mts.map +0 -1
  38. package/dist/stack-graph-DIXiAwrZ.mjs.map +0 -1
  39. package/dist/stack-translation-9PxvYAJB.mjs.map +0 -1
  40. package/dist/stack-translation-DQfT1jwM.d.mts.map +0 -1
  41. package/dist/types-j0tqBnAt.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-D1fG1cXJ.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-DIXiAwrZ.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-Q0PrewPk.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",
@@ -597,7 +598,9 @@ const APP_PLATFORM_VALUES = [
597
598
  "tanstack-db",
598
599
  "tanstack-pacer",
599
600
  "backend-utils",
600
- "docker-compose"
601
+ "devcontainer",
602
+ "docker-compose",
603
+ "github-actions"
601
604
  ];
602
605
  const EXAMPLE_VALUES = ["ai", "chat-sdk"];
603
606
  const BOOLEAN_OPTION_VALUES = ["true", "false"];
@@ -649,6 +652,7 @@ const CATEGORY_VALUE_IDS = {
649
652
  rateLimit: RATE_LIMIT_VALUES,
650
653
  i18n: I18N_VALUES,
651
654
  search: SEARCH_VALUES,
655
+ vectorDb: VECTOR_DB_VALUES,
652
656
  fileStorage: FILE_STORAGE_VALUES,
653
657
  animation: ANIMATION_VALUES,
654
658
  cssFramework: CSS_FRAMEWORK_VALUES,
@@ -762,6 +766,7 @@ const EXACT_LABEL_OVERRIDES = {
762
766
  trpc: "tRPC",
763
767
  orpc: "oRPC",
764
768
  "graphql-yoga": "GraphQL Yoga",
769
+ "apollo-server": "Apollo Server",
765
770
  openapi: "OpenAPI"
766
771
  },
767
772
  webFrontend: {
@@ -831,7 +836,8 @@ const EXACT_LABEL_OVERRIDES = {
831
836
  },
832
837
  cms: {
833
838
  tinacms: "TinaCMS",
834
- directus: "Directus"
839
+ directus: "Directus",
840
+ keystatic: "Keystatic"
835
841
  },
836
842
  auth: {
837
843
  "better-auth-organizations": "Better Auth + Organizations",
@@ -893,6 +899,7 @@ const EXACT_LABEL_OVERRIDES = {
893
899
  "trigger-dev": "Trigger.dev"
894
900
  },
895
901
  i18n: {
902
+ paraglide: "Paraglide",
896
903
  i18next: "i18next",
897
904
  "next-intl": "next-intl"
898
905
  },
@@ -900,8 +907,15 @@ const EXACT_LABEL_OVERRIDES = {
900
907
  meilisearch: "Meilisearch",
901
908
  typesense: "Typesense",
902
909
  elasticsearch: "Elasticsearch",
910
+ opensearch: "OpenSearch",
903
911
  algolia: "Algolia"
904
912
  },
913
+ vectorDb: {
914
+ pgvector: "pgvector",
915
+ qdrant: "Qdrant",
916
+ chroma: "Chroma",
917
+ pinecone: "Pinecone"
918
+ },
905
919
  fileStorage: {
906
920
  s3: "AWS S3",
907
921
  r2: "Cloudflare R2",
@@ -982,7 +996,9 @@ const EXACT_LABEL_OVERRIDES = {
982
996
  "tanstack-virtual": "TanStack Virtual",
983
997
  "tanstack-db": "TanStack DB",
984
998
  "tanstack-pacer": "TanStack Pacer",
985
- "docker-compose": "Docker Compose"
999
+ devcontainer: "DevContainer",
1000
+ "docker-compose": "Docker Compose",
1001
+ "github-actions": "GitHub Actions"
986
1002
  },
987
1003
  versionChannel: {
988
1004
  stable: "Stable",
@@ -1007,7 +1023,7 @@ const EXACT_LABEL_OVERRIDES = {
1007
1023
  },
1008
1024
  aiDocs: {
1009
1025
  "claude-md": "CLAUDE.md",
1010
- "agents-md": "Agents.md",
1026
+ "agents-md": "AGENTS.md",
1011
1027
  cursorrules: ".cursorrules"
1012
1028
  },
1013
1029
  git: {
@@ -1500,6 +1516,7 @@ const OPTION_CATEGORY_METADATA = {
1500
1516
  rateLimit: buildCategoryMetadata("rateLimit"),
1501
1517
  i18n: buildCategoryMetadata("i18n"),
1502
1518
  search: buildCategoryMetadata("search"),
1519
+ vectorDb: buildCategoryMetadata("vectorDb"),
1503
1520
  fileStorage: buildCategoryMetadata("fileStorage"),
1504
1521
  animation: buildCategoryMetadata("animation"),
1505
1522
  cssFramework: buildCategoryMetadata("cssFramework"),
@@ -1628,6 +1645,19 @@ function normalizeOptionId(category, value) {
1628
1645
  //#endregion
1629
1646
  //#region src/compatibility.ts
1630
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
+ ]);
1631
1661
  function validateProjectName(name) {
1632
1662
  const INVALID_CHARS = [
1633
1663
  "<",
@@ -1670,6 +1700,7 @@ const analyzeStackCompatibility = (stack) => {
1670
1700
  changes: []
1671
1701
  };
1672
1702
  const nextStack = { ...stack };
1703
+ if (nextStack.vectorDb === void 0) nextStack.vectorDb = "none";
1673
1704
  let changed = false;
1674
1705
  const notes = {};
1675
1706
  const changes = [];
@@ -1686,6 +1717,7 @@ const analyzeStackCompatibility = (stack) => {
1686
1717
  dbSetup: "none",
1687
1718
  serverDeploy: "none",
1688
1719
  search: "none",
1720
+ vectorDb: "none",
1689
1721
  rateLimit: "none",
1690
1722
  fileStorage: "none"
1691
1723
  })) {
@@ -1753,6 +1785,7 @@ const analyzeStackCompatibility = (stack) => {
1753
1785
  serverDeploy: "none",
1754
1786
  payments: "none",
1755
1787
  search: "none",
1788
+ vectorDb: "none",
1756
1789
  rateLimit: "none",
1757
1790
  fileStorage: "none"
1758
1791
  };
@@ -2053,7 +2086,7 @@ const analyzeStackCompatibility = (stack) => {
2053
2086
  "svelte",
2054
2087
  "solid",
2055
2088
  "solid-start"
2056
- ].includes(f)) && nextStack.api === "trpc") {
2089
+ ].includes(f)) && (nextStack.api === "trpc" || nextStack.api === "apollo-server")) {
2057
2090
  nextStack.api = "orpc";
2058
2091
  changed = true;
2059
2092
  changes.push({
@@ -2061,12 +2094,13 @@ const analyzeStackCompatibility = (stack) => {
2061
2094
  message: "API set to 'oRPC' (required for this frontend)"
2062
2095
  });
2063
2096
  }
2064
- 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";
2065
2099
  nextStack.api = "orpc";
2066
2100
  changed = true;
2067
2101
  changes.push({
2068
2102
  category: "api",
2069
- message: "API set to 'oRPC' (tRPC requires React integration with Astro)"
2103
+ message: `API set to 'oRPC' (${apiName} requires React integration with Astro)`
2070
2104
  });
2071
2105
  }
2072
2106
  }
@@ -2293,6 +2327,11 @@ const analyzeStackCompatibility = (stack) => {
2293
2327
  "none",
2294
2328
  "Search set to 'None' (React Native ecosystem)"
2295
2329
  ],
2330
+ [
2331
+ "vectorDb",
2332
+ "none",
2333
+ "Vector database set to 'None' (React Native ecosystem)"
2334
+ ],
2296
2335
  [
2297
2336
  "rateLimit",
2298
2337
  "none",
@@ -2761,6 +2800,14 @@ const analyzeStackCompatibility = (stack) => {
2761
2800
  message: "Elixir jobs set to 'None' (Oban requires Ecto SQL with PostgreSQL)"
2762
2801
  });
2763
2802
  }
2803
+ if (nextStack.elixirAuth === "phx-gen-auth" && nextStack.elixirOrm !== "ecto-sql") {
2804
+ nextStack.elixirAuth = "none";
2805
+ changed = true;
2806
+ changes.push({
2807
+ category: "elixirAuth",
2808
+ message: "Elixir auth set to 'None' (phx.gen.auth requires Ecto SQL with PostgreSQL)"
2809
+ });
2810
+ }
2764
2811
  }
2765
2812
  if (nextStack.webDeploy !== "none" && !nextStack.webFrontend.some((f) => f !== "none")) {
2766
2813
  nextStack.webDeploy = "none";
@@ -2821,6 +2868,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
2821
2868
  if (category === "dbSetup" && optionId !== "none") return "Convex handles database setup";
2822
2869
  if (category === "serverDeploy" && optionId !== "none") return "Convex has its own deployment";
2823
2870
  if (category === "search" && optionId !== "none") return "Search requires a standalone backend";
2871
+ if (category === "vectorDb" && optionId !== "none") return "Vector database requires a standalone backend (Convex has built-in vector search)";
2824
2872
  if (category === "rateLimit" && optionId !== "none") return "Rate limiting requires a standalone backend";
2825
2873
  if (category === "fileStorage" && optionId !== "none") return "File storage requires a standalone backend";
2826
2874
  if (category === "webFrontend" && optionId === "solid") return "In Better-Fullstack, the Convex backend is currently not available with Solid";
@@ -2863,6 +2911,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
2863
2911
  if (category === "serverDeploy" && optionId !== "none") return "No backend selected";
2864
2912
  if (category === "payments" && optionId !== "none") return "No backend selected";
2865
2913
  if (category === "search" && optionId !== "none") return "No backend selected";
2914
+ if (category === "vectorDb" && optionId !== "none") return "No backend selected";
2866
2915
  if (category === "rateLimit" && optionId !== "none") return "No backend selected";
2867
2916
  if (category === "fileStorage" && optionId !== "none") return "No backend selected";
2868
2917
  if (category === "examples" && optionId !== "none") return "No backend selected";
@@ -2919,6 +2968,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
2919
2968
  }
2920
2969
  if (category === "runtime") {
2921
2970
  if (optionId === "workers" && currentStack.backend !== "hono") return "In Better-Fullstack, Workers runtime currently requires the Hono backend";
2971
+ 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.";
2922
2972
  if (optionId === "none") {
2923
2973
  if (![
2924
2974
  "convex",
@@ -2985,11 +3035,34 @@ const getDisabledReason = (currentStack, category, optionId) => {
2985
3035
  "elysia"
2986
3036
  ].includes(currentStack.backend)) return "OpenAPI currently supports Hono, Express, Fastify, and Elysia backends";
2987
3037
  }
3038
+ if (category === "api" && optionId === "apollo-server") {
3039
+ if (currentStack.webFrontend.some((f) => [
3040
+ "nuxt",
3041
+ "svelte",
3042
+ "solid",
3043
+ "solid-start"
3044
+ ].includes(f))) return `${currentStack.webFrontend.find((f) => [
3045
+ "nuxt",
3046
+ "svelte",
3047
+ "solid",
3048
+ "solid-start"
3049
+ ].includes(f))} requires oRPC, not Apollo Server`;
3050
+ if (currentStack.webFrontend.includes("astro") && currentStack.astroIntegration !== "react") return "Apollo Server requires React integration with Astro";
3051
+ if (currentStack.backend === "self") return "Apollo Server scaffolding currently requires a standalone TypeScript backend";
3052
+ if (currentStack.nativeFrontend.length > 0) return "Apollo Server is currently available for web frontends, not React Native";
3053
+ if (![
3054
+ "hono",
3055
+ "express",
3056
+ "fastify",
3057
+ "elysia"
3058
+ ].includes(currentStack.backend)) return "Apollo Server currently supports Hono, Express, Fastify, and Elysia backends";
3059
+ }
2988
3060
  if (category === "appPlatforms" && optionId === "nx" && currentStack.appPlatforms.includes("turborepo")) return "Choose either Nx or Turborepo, not both";
2989
3061
  if (category === "appPlatforms" && optionId === "turborepo" && currentStack.appPlatforms.includes("nx")) return "Choose either Turborepo or Nx, not both";
2990
3062
  if (category === "astroIntegration") {
2991
3063
  if (!currentStack.webFrontend.includes("astro") && optionId !== "none") return "Astro integration requires Astro frontend";
2992
- if (currentStack.api === "trpc" && optionId !== "react" && optionId !== "none") return "tRPC requires React integration with Astro";
3064
+ if (currentStack.webFrontend.includes("astro") && currentStack.api === "apollo-server" && optionId !== "react") return "Apollo Server requires React integration with Astro";
3065
+ if (currentStack.webFrontend.includes("astro") && currentStack.api === "trpc" && optionId !== "react" && optionId !== "none") return "tRPC requires React integration with Astro";
2993
3066
  }
2994
3067
  if (category === "auth") {
2995
3068
  const isBetterAuthOption = optionId === "better-auth" || optionId === "better-auth-organizations";
@@ -3014,6 +3087,9 @@ const getDisabledReason = (currentStack, category, optionId) => {
3014
3087
  if (category === "cms" && optionId === "payload") {
3015
3088
  if (!currentStack.webFrontend.includes("next")) return "Payload CMS v3 requires Next.js";
3016
3089
  }
3090
+ if (category === "cms" && optionId === "keystatic") {
3091
+ if (!currentStack.webFrontend.includes("next")) return "Keystatic is currently scaffolded for Next.js only because @keystatic/astro is not Astro 7-compatible yet.";
3092
+ }
3017
3093
  if (category === "email" && optionId !== "none") {
3018
3094
  if (currentStack.ecosystem !== "typescript") return null;
3019
3095
  if (currentStack.backend === "convex") return "Email integration is not available with Convex backend";
@@ -3033,6 +3109,9 @@ const getDisabledReason = (currentStack, category, optionId) => {
3033
3109
  if (category === "search" && optionId !== "none") {
3034
3110
  if (currentStack.ecosystem !== "typescript") return null;
3035
3111
  }
3112
+ if (category === "vectorDb" && optionId !== "none") {
3113
+ if (currentStack.ecosystem !== "typescript") return "Vector database is only available for the TypeScript ecosystem";
3114
+ }
3036
3115
  if (category === "ai" && requiresChatSdkVercelAI(currentStack) && optionId !== "vercel-ai") return "Chat SDK example (Nuxt/Hono profile) requires Vercel AI SDK in v1";
3037
3116
  if (category === "ai" && optionId === "tanstack-ai") {
3038
3117
  const compatibleFrontends = [
@@ -3050,14 +3129,22 @@ const getDisabledReason = (currentStack, category, optionId) => {
3050
3129
  if (category === "appPlatforms") {
3051
3130
  if (optionId === "pwa" && !hasPWACompatibleFrontend(currentStack.webFrontend)) return "PWA requires TanStack Router, React Router, Solid, Next.js, Vinext, or Astro";
3052
3131
  if (optionId === "tauri" && !hasTauriCompatibleFrontend(currentStack.webFrontend)) return "Tauri requires TanStack Router, React Router, Nuxt, Svelte, Solid, Next.js, or Astro";
3053
- if (optionId === "docker-compose") {
3054
- if (currentStack.backend === "convex") return "Docker Compose is not compatible with Convex backend (managed service)";
3055
- if (currentStack.runtime === "workers") return "Docker Compose is not compatible with Cloudflare Workers runtime";
3056
- if (currentStack.ecosystem === "typescript" && !hasDockerComposeCompatibleFrontend(currentStack.webFrontend)) return "Docker Compose currently supports Next.js, TanStack Router, React Router, React Vite, Solid, or Astro";
3057
- if (currentStack.ecosystem === "typescript" && currentStack.backend === "self" && !currentStack.webFrontend.includes("next")) return "Docker Compose self-backend support currently requires Next.js";
3058
- if (currentStack.ecosystem === "rust" && currentStack.rustFrontend !== "none") return "Docker Compose for Rust currently supports server-only projects";
3059
- if (currentStack.ecosystem === "java" && currentStack.javaWebFramework !== "spring-boot") return "Docker Compose for Java currently requires Spring Boot";
3060
- 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";
3132
+ if (optionId === "docker-compose" || optionId === "devcontainer") {
3133
+ const title = optionId === "devcontainer" ? "DevContainer" : "Docker Compose";
3134
+ if (currentStack.backend === "convex") return `${title} is not compatible with Convex backend (managed service)`;
3135
+ if (currentStack.runtime === "workers") return `${title} is not compatible with Cloudflare Workers runtime`;
3136
+ if (![
3137
+ "typescript",
3138
+ "python",
3139
+ "go",
3140
+ "rust",
3141
+ "java"
3142
+ ].includes(currentStack.ecosystem)) return `${title} currently supports TypeScript, Python, Go, Rust, or Java projects`;
3143
+ if (currentStack.ecosystem === "typescript" && !hasDockerComposeCompatibleFrontend(currentStack.webFrontend)) return `${title} currently supports Next.js, TanStack Router, React Router, React Vite, Solid, or Astro`;
3144
+ if (currentStack.ecosystem === "typescript" && currentStack.backend === "self" && !currentStack.webFrontend.includes("next")) return `${title} self-backend support currently requires Next.js`;
3145
+ if (currentStack.ecosystem === "rust" && currentStack.rustFrontend !== "none") return `${title} for Rust currently supports server-only projects`;
3146
+ if (currentStack.ecosystem === "java" && currentStack.javaWebFramework !== "spring-boot") return `${title} for Java currently requires Spring Boot`;
3147
+ 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`;
3061
3148
  }
3062
3149
  if (optionId === "backend-utils") {
3063
3150
  if (currentStack.ecosystem !== "typescript") return "Backend Utils requires a TypeScript server stack";
@@ -3225,6 +3312,11 @@ const getDisabledReason = (currentStack, category, optionId) => {
3225
3312
  if (optionId === "none" && currentStack.runtime === "workers") return "Workers requires server deployment";
3226
3313
  }
3227
3314
  if (category === "i18n") {
3315
+ if (optionId !== "none" && !currentStack.webFrontend.some((f) => f !== "none")) return "i18n requires a web frontend";
3316
+ if (optionId === "paraglide") {
3317
+ const unsupportedFrontend = currentStack.webFrontend.find((frontend) => frontend !== "none" && !PARAGLIDE_COMPATIBLE_FRONTENDS.has(frontend));
3318
+ if (unsupportedFrontend) return `Paraglide is not yet wired for the '${unsupportedFrontend}' frontend`;
3319
+ }
3228
3320
  if (optionId === "next-intl") {
3229
3321
  if (!currentStack.webFrontend.includes("next")) return "next-intl requires Next.js";
3230
3322
  }
@@ -3281,6 +3373,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
3281
3373
  ]).has(category) && optionId !== "none") {
3282
3374
  if (currentStack.ecosystem !== "elixir") return "Elixir options only apply when the Elixir ecosystem is selected";
3283
3375
  }
3376
+ if (category === "elixirTesting" && optionId === "wallaby" && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework === "none") return "Wallaby browser tests require Phoenix";
3284
3377
  if (category === "elixirWebFramework" && optionId !== "none" && currentStack.ecosystem !== "elixir") return "Elixir web frameworks are available only in the Elixir ecosystem";
3285
3378
  if (category === "elixirJson" && optionId === "none" && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework !== "none") return "Phoenix JSON scaffolds require Jason";
3286
3379
  return null;
@@ -3843,6 +3936,8 @@ const ADDON_COMPATIBILITY = {
3843
3936
  ],
3844
3937
  "backend-utils": [],
3845
3938
  "docker-compose": [],
3939
+ devcontainer: [],
3940
+ "github-actions": [],
3846
3941
  none: []
3847
3942
  };
3848
3943
  function isWebFrontend(value) {
@@ -3874,6 +3969,7 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
3874
3969
  "ts-rest",
3875
3970
  "garph",
3876
3971
  "graphql-yoga",
3972
+ "apollo-server",
3877
3973
  "openapi",
3878
3974
  "none"
3879
3975
  ];
@@ -3892,7 +3988,7 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
3892
3988
  "openapi",
3893
3989
  "none"
3894
3990
  ];
3895
- if (includesAstro && astroIntegration && astroIntegration !== "react") return [
3991
+ if (includesAstro && astroIntegration !== "react") return [
3896
3992
  "orpc",
3897
3993
  "graphql-yoga",
3898
3994
  "openapi",
@@ -3904,6 +4000,7 @@ function getReactOnlyApiDisplayName(api) {
3904
4000
  if (api === "trpc") return "tRPC";
3905
4001
  if (api === "ts-rest") return "ts-rest";
3906
4002
  if (api === "openapi") return "OpenAPI";
4003
+ if (api === "apollo-server") return "Apollo Server";
3907
4004
  return "garph";
3908
4005
  }
3909
4006
  function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration) {
@@ -3917,7 +4014,7 @@ function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration)
3917
4014
  const includesRedwood = frontends.includes("redwood");
3918
4015
  const includesFresh = frontends.includes("fresh");
3919
4016
  const includesSolidStart = frontends.includes("solid-start");
3920
- const isReactOnlyApi = api === "trpc" || api === "ts-rest" || api === "garph";
4017
+ const isReactOnlyApi = api === "trpc" || api === "ts-rest" || api === "garph" || api === "apollo-server";
3921
4018
  if ((includesNuxt || includesSvelte || includesSolid || includesSolidStart) && isReactOnlyApi) {
3922
4019
  const incompatibleFrontend = includesNuxt ? "nuxt" : includesSvelte ? "svelte" : includesSolid ? "solid" : "solid-start";
3923
4020
  return {
@@ -3980,14 +4077,14 @@ function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration)
3980
4077
  },
3981
4078
  suggestions: ["Use --api none with Fresh"]
3982
4079
  };
3983
- if (includesAstro && astroIntegration && astroIntegration !== "react" && isReactOnlyApi) return {
4080
+ if (includesAstro && astroIntegration !== "react" && isReactOnlyApi) return {
3984
4081
  code: "ASTRO_API_REQUIRES_REACT_INTEGRATION",
3985
4082
  message: `${getReactOnlyApiDisplayName(api)} API requires React integration with Astro.`,
3986
4083
  category: "api",
3987
4084
  optionId: api,
3988
4085
  provided: {
3989
4086
  api,
3990
- "astro-integration": astroIntegration
4087
+ "astro-integration": astroIntegration ?? "none"
3991
4088
  },
3992
4089
  suggestions: [
3993
4090
  "Use --api orpc (works with all Astro integrations)",
@@ -4299,6 +4396,7 @@ const DEFAULT_STACK_SELECTION = {
4299
4396
  shadcnRadius: "default",
4300
4397
  cms: "none",
4301
4398
  search: "none",
4399
+ vectorDb: "none",
4302
4400
  fileStorage: "none",
4303
4401
  codeQuality: [],
4304
4402
  documentation: [],
@@ -4307,7 +4405,7 @@ const DEFAULT_STACK_SELECTION = {
4307
4405
  versionChannel: "stable",
4308
4406
  examples: [],
4309
4407
  aiSdk: "none",
4310
- aiDocs: ["claude-md"],
4408
+ aiDocs: ["claude-md", "agents-md"],
4311
4409
  git: "true",
4312
4410
  install: "true",
4313
4411
  api: "trpc",
@@ -4443,6 +4541,7 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
4443
4541
  shadcnRadius: "shadcnRadius",
4444
4542
  cms: "cms",
4445
4543
  search: "search",
4544
+ vectorDb: "vectorDb",
4446
4545
  fileStorage: "fileStorage",
4447
4546
  codeQuality: "codeQuality",
4448
4547
  documentation: "documentation",
@@ -4599,6 +4698,7 @@ const STACK_SELECTION_URL_KEYS = {
4599
4698
  shadcnRadius: "scr",
4600
4699
  cms: "cms",
4601
4700
  search: "srch",
4701
+ vectorDb: "vdb",
4602
4702
  fileStorage: "fs",
4603
4703
  codeQuality: "cq",
4604
4704
  documentation: "doc",
@@ -4813,6 +4913,7 @@ const CLI_SCALAR_CONFIG_FIELDS = [
4813
4913
  ["rateLimit", "rateLimit"],
4814
4914
  ["i18n", "i18n"],
4815
4915
  ["search", "search"],
4916
+ ["vectorDb", "vectorDb"],
4816
4917
  ["fileStorage", "fileStorage"],
4817
4918
  ["analytics", "analytics"],
4818
4919
  ["mobileNavigation", "mobileNavigation"],
@@ -5047,6 +5148,8 @@ const COMMAND_ADDONS = new Set([
5047
5148
  "turborepo",
5048
5149
  "nx",
5049
5150
  "docker-compose",
5151
+ "devcontainer",
5152
+ "github-actions",
5050
5153
  "ultracite",
5051
5154
  "fumadocs",
5052
5155
  "oxlint",
@@ -5149,6 +5252,7 @@ const GRAPH_TYPESCRIPT_BACKEND_PART_SELECTION_KEYS = [
5149
5252
  ["rateLimit", "rateLimit"],
5150
5253
  ["cms", "cms"],
5151
5254
  ["search", "search"],
5255
+ ["vectorDb", "vectorDb"],
5152
5256
  ["fileStorage", "fileStorage"]
5153
5257
  ];
5154
5258
  const GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS = [
@@ -5223,6 +5327,7 @@ const GRAPH_TYPESCRIPT_BACKEND_PART_CLI_KEYS = [
5223
5327
  ["rateLimit", "rateLimit"],
5224
5328
  ["cms", "cms"],
5225
5329
  ["search", "search"],
5330
+ ["vectorDb", "vectorDb"],
5226
5331
  ["fileStorage", "fileStorage"]
5227
5332
  ];
5228
5333
  const GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS = [
@@ -5696,6 +5801,7 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
5696
5801
  rateLimit: stack.rateLimit,
5697
5802
  i18n: stack.i18n,
5698
5803
  search: stack.search,
5804
+ vectorDb: stack.vectorDb,
5699
5805
  fileStorage: stack.fileStorage,
5700
5806
  rustWebFramework: stack.rustWebFramework,
5701
5807
  rustFrontend: stack.rustFrontend,
@@ -5900,6 +6006,7 @@ function generateTypeScriptCommand(selection, projectName) {
5900
6006
  `--rate-limit ${selection.rateLimit}`,
5901
6007
  `--i18n ${selection.i18n}`,
5902
6008
  `--search ${selection.search}`,
6009
+ `--vector-db ${selection.vectorDb}`,
5903
6010
  `--file-storage ${selection.fileStorage}`,
5904
6011
  `--cms ${selection.cms}`,
5905
6012
  `--effect ${selection.backendLibraries}`,
@@ -6109,4 +6216,4 @@ function generateStackSelectionCommand(selection) {
6109
6216
 
6110
6217
  //#endregion
6111
6218
  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 };
6112
- //# sourceMappingURL=stack-translation-9PxvYAJB.mjs.map
6219
+ //# sourceMappingURL=stack-translation-gNYPvlYt.mjs.map