@better-fullstack/types 2.0.3 → 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-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-D4iCezUq.mjs} +59 -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-9PxvYAJB.mjs → stack-translation-CAU_sdNI.mjs} +123 -25
  25. package/dist/stack-translation-CAU_sdNI.mjs.map +1 -0
  26. package/dist/{stack-translation-DQfT1jwM.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-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-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",
@@ -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",
@@ -2821,6 +2860,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
2821
2860
  if (category === "dbSetup" && optionId !== "none") return "Convex handles database setup";
2822
2861
  if (category === "serverDeploy" && optionId !== "none") return "Convex has its own deployment";
2823
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)";
2824
2864
  if (category === "rateLimit" && optionId !== "none") return "Rate limiting requires a standalone backend";
2825
2865
  if (category === "fileStorage" && optionId !== "none") return "File storage requires a standalone backend";
2826
2866
  if (category === "webFrontend" && optionId === "solid") return "In Better-Fullstack, the Convex backend is currently not available with Solid";
@@ -2863,6 +2903,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
2863
2903
  if (category === "serverDeploy" && optionId !== "none") return "No backend selected";
2864
2904
  if (category === "payments" && optionId !== "none") return "No backend selected";
2865
2905
  if (category === "search" && optionId !== "none") return "No backend selected";
2906
+ if (category === "vectorDb" && optionId !== "none") return "No backend selected";
2866
2907
  if (category === "rateLimit" && optionId !== "none") return "No backend selected";
2867
2908
  if (category === "fileStorage" && optionId !== "none") return "No backend selected";
2868
2909
  if (category === "examples" && optionId !== "none") return "No backend selected";
@@ -2919,6 +2960,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
2919
2960
  }
2920
2961
  if (category === "runtime") {
2921
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.";
2922
2964
  if (optionId === "none") {
2923
2965
  if (![
2924
2966
  "convex",
@@ -2985,11 +3027,34 @@ const getDisabledReason = (currentStack, category, optionId) => {
2985
3027
  "elysia"
2986
3028
  ].includes(currentStack.backend)) return "OpenAPI currently supports Hono, Express, Fastify, and Elysia backends";
2987
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
+ }
2988
3052
  if (category === "appPlatforms" && optionId === "nx" && currentStack.appPlatforms.includes("turborepo")) return "Choose either Nx or Turborepo, not both";
2989
3053
  if (category === "appPlatforms" && optionId === "turborepo" && currentStack.appPlatforms.includes("nx")) return "Choose either Turborepo or Nx, not both";
2990
3054
  if (category === "astroIntegration") {
2991
3055
  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";
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";
2993
3058
  }
2994
3059
  if (category === "auth") {
2995
3060
  const isBetterAuthOption = optionId === "better-auth" || optionId === "better-auth-organizations";
@@ -3014,6 +3079,9 @@ const getDisabledReason = (currentStack, category, optionId) => {
3014
3079
  if (category === "cms" && optionId === "payload") {
3015
3080
  if (!currentStack.webFrontend.includes("next")) return "Payload CMS v3 requires Next.js";
3016
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
+ }
3017
3085
  if (category === "email" && optionId !== "none") {
3018
3086
  if (currentStack.ecosystem !== "typescript") return null;
3019
3087
  if (currentStack.backend === "convex") return "Email integration is not available with Convex backend";
@@ -3033,6 +3101,9 @@ const getDisabledReason = (currentStack, category, optionId) => {
3033
3101
  if (category === "search" && optionId !== "none") {
3034
3102
  if (currentStack.ecosystem !== "typescript") return null;
3035
3103
  }
3104
+ if (category === "vectorDb" && optionId !== "none") {
3105
+ if (currentStack.ecosystem !== "typescript") return "Vector database is only available for the TypeScript ecosystem";
3106
+ }
3036
3107
  if (category === "ai" && requiresChatSdkVercelAI(currentStack) && optionId !== "vercel-ai") return "Chat SDK example (Nuxt/Hono profile) requires Vercel AI SDK in v1";
3037
3108
  if (category === "ai" && optionId === "tanstack-ai") {
3038
3109
  const compatibleFrontends = [
@@ -3050,14 +3121,22 @@ const getDisabledReason = (currentStack, category, optionId) => {
3050
3121
  if (category === "appPlatforms") {
3051
3122
  if (optionId === "pwa" && !hasPWACompatibleFrontend(currentStack.webFrontend)) return "PWA requires TanStack Router, React Router, Solid, Next.js, Vinext, or Astro";
3052
3123
  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";
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`;
3061
3140
  }
3062
3141
  if (optionId === "backend-utils") {
3063
3142
  if (currentStack.ecosystem !== "typescript") return "Backend Utils requires a TypeScript server stack";
@@ -3225,6 +3304,11 @@ const getDisabledReason = (currentStack, category, optionId) => {
3225
3304
  if (optionId === "none" && currentStack.runtime === "workers") return "Workers requires server deployment";
3226
3305
  }
3227
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
+ }
3228
3312
  if (optionId === "next-intl") {
3229
3313
  if (!currentStack.webFrontend.includes("next")) return "next-intl requires Next.js";
3230
3314
  }
@@ -3843,6 +3927,8 @@ const ADDON_COMPATIBILITY = {
3843
3927
  ],
3844
3928
  "backend-utils": [],
3845
3929
  "docker-compose": [],
3930
+ devcontainer: [],
3931
+ "github-actions": [],
3846
3932
  none: []
3847
3933
  };
3848
3934
  function isWebFrontend(value) {
@@ -3874,6 +3960,7 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
3874
3960
  "ts-rest",
3875
3961
  "garph",
3876
3962
  "graphql-yoga",
3963
+ "apollo-server",
3877
3964
  "openapi",
3878
3965
  "none"
3879
3966
  ];
@@ -3892,7 +3979,7 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
3892
3979
  "openapi",
3893
3980
  "none"
3894
3981
  ];
3895
- if (includesAstro && astroIntegration && astroIntegration !== "react") return [
3982
+ if (includesAstro && astroIntegration !== "react") return [
3896
3983
  "orpc",
3897
3984
  "graphql-yoga",
3898
3985
  "openapi",
@@ -3904,6 +3991,7 @@ function getReactOnlyApiDisplayName(api) {
3904
3991
  if (api === "trpc") return "tRPC";
3905
3992
  if (api === "ts-rest") return "ts-rest";
3906
3993
  if (api === "openapi") return "OpenAPI";
3994
+ if (api === "apollo-server") return "Apollo Server";
3907
3995
  return "garph";
3908
3996
  }
3909
3997
  function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration) {
@@ -3917,7 +4005,7 @@ function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration)
3917
4005
  const includesRedwood = frontends.includes("redwood");
3918
4006
  const includesFresh = frontends.includes("fresh");
3919
4007
  const includesSolidStart = frontends.includes("solid-start");
3920
- const isReactOnlyApi = api === "trpc" || api === "ts-rest" || api === "garph";
4008
+ const isReactOnlyApi = api === "trpc" || api === "ts-rest" || api === "garph" || api === "apollo-server";
3921
4009
  if ((includesNuxt || includesSvelte || includesSolid || includesSolidStart) && isReactOnlyApi) {
3922
4010
  const incompatibleFrontend = includesNuxt ? "nuxt" : includesSvelte ? "svelte" : includesSolid ? "solid" : "solid-start";
3923
4011
  return {
@@ -3980,14 +4068,14 @@ function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration)
3980
4068
  },
3981
4069
  suggestions: ["Use --api none with Fresh"]
3982
4070
  };
3983
- if (includesAstro && astroIntegration && astroIntegration !== "react" && isReactOnlyApi) return {
4071
+ if (includesAstro && astroIntegration !== "react" && isReactOnlyApi) return {
3984
4072
  code: "ASTRO_API_REQUIRES_REACT_INTEGRATION",
3985
4073
  message: `${getReactOnlyApiDisplayName(api)} API requires React integration with Astro.`,
3986
4074
  category: "api",
3987
4075
  optionId: api,
3988
4076
  provided: {
3989
4077
  api,
3990
- "astro-integration": astroIntegration
4078
+ "astro-integration": astroIntegration ?? "none"
3991
4079
  },
3992
4080
  suggestions: [
3993
4081
  "Use --api orpc (works with all Astro integrations)",
@@ -4299,6 +4387,7 @@ const DEFAULT_STACK_SELECTION = {
4299
4387
  shadcnRadius: "default",
4300
4388
  cms: "none",
4301
4389
  search: "none",
4390
+ vectorDb: "none",
4302
4391
  fileStorage: "none",
4303
4392
  codeQuality: [],
4304
4393
  documentation: [],
@@ -4307,7 +4396,7 @@ const DEFAULT_STACK_SELECTION = {
4307
4396
  versionChannel: "stable",
4308
4397
  examples: [],
4309
4398
  aiSdk: "none",
4310
- aiDocs: ["claude-md"],
4399
+ aiDocs: ["claude-md", "agents-md"],
4311
4400
  git: "true",
4312
4401
  install: "true",
4313
4402
  api: "trpc",
@@ -4443,6 +4532,7 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
4443
4532
  shadcnRadius: "shadcnRadius",
4444
4533
  cms: "cms",
4445
4534
  search: "search",
4535
+ vectorDb: "vectorDb",
4446
4536
  fileStorage: "fileStorage",
4447
4537
  codeQuality: "codeQuality",
4448
4538
  documentation: "documentation",
@@ -4599,6 +4689,7 @@ const STACK_SELECTION_URL_KEYS = {
4599
4689
  shadcnRadius: "scr",
4600
4690
  cms: "cms",
4601
4691
  search: "srch",
4692
+ vectorDb: "vdb",
4602
4693
  fileStorage: "fs",
4603
4694
  codeQuality: "cq",
4604
4695
  documentation: "doc",
@@ -4813,6 +4904,7 @@ const CLI_SCALAR_CONFIG_FIELDS = [
4813
4904
  ["rateLimit", "rateLimit"],
4814
4905
  ["i18n", "i18n"],
4815
4906
  ["search", "search"],
4907
+ ["vectorDb", "vectorDb"],
4816
4908
  ["fileStorage", "fileStorage"],
4817
4909
  ["analytics", "analytics"],
4818
4910
  ["mobileNavigation", "mobileNavigation"],
@@ -5047,6 +5139,8 @@ const COMMAND_ADDONS = new Set([
5047
5139
  "turborepo",
5048
5140
  "nx",
5049
5141
  "docker-compose",
5142
+ "devcontainer",
5143
+ "github-actions",
5050
5144
  "ultracite",
5051
5145
  "fumadocs",
5052
5146
  "oxlint",
@@ -5149,6 +5243,7 @@ const GRAPH_TYPESCRIPT_BACKEND_PART_SELECTION_KEYS = [
5149
5243
  ["rateLimit", "rateLimit"],
5150
5244
  ["cms", "cms"],
5151
5245
  ["search", "search"],
5246
+ ["vectorDb", "vectorDb"],
5152
5247
  ["fileStorage", "fileStorage"]
5153
5248
  ];
5154
5249
  const GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS = [
@@ -5223,6 +5318,7 @@ const GRAPH_TYPESCRIPT_BACKEND_PART_CLI_KEYS = [
5223
5318
  ["rateLimit", "rateLimit"],
5224
5319
  ["cms", "cms"],
5225
5320
  ["search", "search"],
5321
+ ["vectorDb", "vectorDb"],
5226
5322
  ["fileStorage", "fileStorage"]
5227
5323
  ];
5228
5324
  const GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS = [
@@ -5696,6 +5792,7 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
5696
5792
  rateLimit: stack.rateLimit,
5697
5793
  i18n: stack.i18n,
5698
5794
  search: stack.search,
5795
+ vectorDb: stack.vectorDb,
5699
5796
  fileStorage: stack.fileStorage,
5700
5797
  rustWebFramework: stack.rustWebFramework,
5701
5798
  rustFrontend: stack.rustFrontend,
@@ -5900,6 +5997,7 @@ function generateTypeScriptCommand(selection, projectName) {
5900
5997
  `--rate-limit ${selection.rateLimit}`,
5901
5998
  `--i18n ${selection.i18n}`,
5902
5999
  `--search ${selection.search}`,
6000
+ `--vector-db ${selection.vectorDb}`,
5903
6001
  `--file-storage ${selection.fileStorage}`,
5904
6002
  `--cms ${selection.cms}`,
5905
6003
  `--effect ${selection.backendLibraries}`,
@@ -6109,4 +6207,4 @@ function generateStackSelectionCommand(selection) {
6109
6207
 
6110
6208
  //#endregion
6111
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 };
6112
- //# sourceMappingURL=stack-translation-9PxvYAJB.mjs.map
6210
+ //# sourceMappingURL=stack-translation-CAU_sdNI.mjs.map