@better-fullstack/types 2.1.8 → 2.3.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 (46) hide show
  1. package/dist/{defaults-Cpkx-Eu7.d.mts → defaults-BT-WhLPX.d.mts} +2 -2
  2. package/dist/defaults-BT-WhLPX.d.mts.map +1 -0
  3. package/dist/{defaults-DNnZX9er.mjs → defaults-Cl16mM84.mjs} +21 -1
  4. package/dist/defaults-Cl16mM84.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 +7 -7
  8. package/dist/index.d.mts.map +1 -1
  9. package/dist/index.mjs +194 -5
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/json-schema.d.mts +3076 -364
  12. package/dist/json-schema.d.mts.map +1 -1
  13. package/dist/json-schema.mjs +102 -2
  14. package/dist/json-schema.mjs.map +1 -1
  15. package/dist/{schemas-BXDvWDRp.mjs → schemas-CprYz5Sh.mjs} +301 -8
  16. package/dist/schemas-CprYz5Sh.mjs.map +1 -0
  17. package/dist/{schemas-DOb4t_el.d.mts → schemas-q5-QVYJy.d.mts} +2945 -642
  18. package/dist/schemas-q5-QVYJy.d.mts.map +1 -0
  19. package/dist/schemas.d.mts +2 -2
  20. package/dist/schemas.mjs +2 -2
  21. package/dist/{stack-graph-0MDSuSPQ.d.mts → stack-graph-CgFYIeir.d.mts} +2 -2
  22. package/dist/stack-graph-CgFYIeir.d.mts.map +1 -0
  23. package/dist/{stack-graph-BAad0vv4.mjs → stack-graph-DiLi3WuL.mjs} +228 -33
  24. package/dist/stack-graph-DiLi3WuL.mjs.map +1 -0
  25. package/dist/stack-graph.d.mts +3 -3
  26. package/dist/stack-graph.mjs +2 -2
  27. package/dist/{stack-translation-DwSS9Vc2.mjs → stack-translation-Ay-_1mNB.mjs} +1117 -98
  28. package/dist/stack-translation-Ay-_1mNB.mjs.map +1 -0
  29. package/dist/{stack-translation-CnNmU8Z5.d.mts → stack-translation-CU1kpqq3.d.mts} +53 -13
  30. package/dist/stack-translation-CU1kpqq3.d.mts.map +1 -0
  31. package/dist/stack-translation.d.mts +4 -4
  32. package/dist/stack-translation.mjs +3 -3
  33. package/dist/types-Cp7krSdb.d.mts +176 -0
  34. package/dist/types-Cp7krSdb.d.mts.map +1 -0
  35. package/dist/types.d.mts +3 -3
  36. package/package.json +2 -2
  37. package/dist/defaults-Cpkx-Eu7.d.mts.map +0 -1
  38. package/dist/defaults-DNnZX9er.mjs.map +0 -1
  39. package/dist/schemas-BXDvWDRp.mjs.map +0 -1
  40. package/dist/schemas-DOb4t_el.d.mts.map +0 -1
  41. package/dist/stack-graph-0MDSuSPQ.d.mts.map +0 -1
  42. package/dist/stack-graph-BAad0vv4.mjs.map +0 -1
  43. package/dist/stack-translation-CnNmU8Z5.d.mts.map +0 -1
  44. package/dist/stack-translation-DwSS9Vc2.mjs.map +0 -1
  45. package/dist/types-CcWal512.d.mts +0 -156
  46. package/dist/types-CcWal512.d.mts.map +0 -1
@@ -1,10 +1,12 @@
1
- import { $n as MOBILE_OTA_VALUES, $r as RUST_AUTH_VALUES, Ai as SERVER_DEPLOY_VALUES, An as JAVA_AUTH_VALUES, Ar as PYTHON_WEB_FRAMEWORK_VALUES, B as DOTNET_OBSERVABILITY_VALUES, Cr as PYTHON_OBSERVABILITY_VALUES, Ct as ELIXIR_WEB_FRAMEWORK_VALUES, D as CMS_VALUES, Dr as PYTHON_TASK_QUEUE_VALUES, En as I18N_VALUES, Er as PYTHON_REALTIME_VALUES, F as DOTNET_API_VALUES, Fn as JAVA_ORM_VALUES, G as DOTNET_WEB_FRAMEWORK_VALUES, H as DOTNET_REALTIME_VALUES, I as DOTNET_AUTH_VALUES, In as JAVA_TESTING_LIBRARIES_VALUES, Jt as FILE_UPLOAD_VALUES, Kt as FEATURE_FLAGS_VALUES, L as DOTNET_CACHING_VALUES, Ln as JAVA_WEB_FRAMEWORK_VALUES, M as DATABASE_SETUP_VALUES, Mn as JAVA_LANGUAGE_VALUES, N as DATABASE_VALUES, Nn as JAVA_LIBRARIES_VALUES, Or as PYTHON_TESTING_VALUES, Pn as JAVA_LOGGING_VALUES, Qn as MOBILE_NAVIGATION_VALUES, Qr as RUST_API_VALUES, R as DOTNET_DEPLOY_VALUES, Ri as STATE_MANAGEMENT_VALUES, Rn as JOB_QUEUE_VALUES, Sr as PYTHON_GRAPHQL_VALUES, St as ELIXIR_VALIDATION_VALUES, Tr as PYTHON_QUALITY_VALUES, Tt as EXAMPLES_VALUES, U as DOTNET_TESTING_VALUES, V as DOTNET_ORM_VALUES, W as DOTNET_VALIDATION_VALUES, Xr as REALTIME_VALUES, Xt as FRONTEND_VALUES, Yi as StackPartRoleSchema, Yn as LOGGING_VALUES, Yr as RATE_LIMIT_VALUES, Yt as FORMS_VALUES, Zn as MOBILE_DEEP_LINKING_VALUES, Zr as RUNTIME_VALUES, _r as PYTHON_AI_VALUES, _t as ELIXIR_OBSERVABILITY_VALUES, a as ANALYTICS_VALUES, aa as VALIDATION_VALUES, ai as RUST_LOGGING_VALUES, an as GO_CLI_VALUES, br as PYTHON_CACHING_VALUES, bt as ELIXIR_REALTIME_VALUES, c as API_VALUES, ci as RUST_ORM_VALUES, cn as GO_MESSAGE_QUEUE_VALUES, ct as ELIXIR_API_VALUES, da as WEB_DEPLOY_VALUES, di as RUST_WEB_FRAMEWORK_VALUES, dn as GO_REALTIME_VALUES, dr as OBSERVABILITY_VALUES, dt as ELIXIR_DEPLOY_VALUES, ea as TESTING_VALUES, ei as RUST_CACHING_VALUES, er as MOBILE_PUSH_VALUES, fn as GO_TESTING_VALUES, ft as ELIXIR_EMAIL_VALUES, gr as PAYMENTS_VALUES, gt as ELIXIR_LIBRARIES_VALUES, i as AI_VALUES, ia as UI_LIBRARY_VALUES, ii as RUST_LIBRARIES_VALUES, in as GO_CACHING_VALUES, jn as JAVA_BUILD_TOOL_VALUES, k as CSS_FRAMEWORK_VALUES, ki as SEARCH_VALUES, kn as JAVA_API_VALUES, kr as PYTHON_VALIDATION_VALUES, li as RUST_REALTIME_VALUES, ln as GO_OBSERVABILITY_VALUES, lt as ELIXIR_AUTH_VALUES, mt as ELIXIR_JOBS_VALUES, ni as RUST_ERROR_HANDLING_VALUES, nn as GO_API_VALUES, nr as MOBILE_TESTING_VALUES, o as ANIMATION_VALUES, oa as VECTOR_DB_VALUES, oi as RUST_MESSAGE_QUEUE_VALUES, on as GO_CONFIG_VALUES, pn as GO_WEB_FRAMEWORK_VALUES, pr as ORM_VALUES, pt as ELIXIR_HTTP_VALUES, qt as FILE_STORAGE_VALUES, ri as RUST_FRONTEND_VALUES, rn as GO_AUTH_VALUES, rr as MOBILE_UI_VALUES, si as RUST_OBSERVABILITY_VALUES, sn as GO_LOGGING_VALUES, st as EFFECT_VALUES, t as ADDONS_VALUES, ti as RUST_CLI_VALUES, tr as MOBILE_STORAGE_VALUES, u as AUTH_VALUES, ui as RUST_TEMPLATING_VALUES, un as GO_ORM_VALUES, ut as ELIXIR_CACHING_VALUES, v as BACKEND_VALUES, vr as PYTHON_API_VALUES, vt as ELIXIR_ORM_VALUES, w as CACHING_VALUES, wr as PYTHON_ORM_VALUES, wt as EMAIL_VALUES, xr as PYTHON_CLI_VALUES, xt as ELIXIR_TESTING_VALUES, yr as PYTHON_AUTH_VALUES, yt as ELIXIR_QUALITY_VALUES, z as DOTNET_JOB_QUEUE_VALUES } from "./schemas-BXDvWDRp.mjs";
1
+ import { $r as PYTHON_MEDIA_VALUES, A as CSS_FRAMEWORK_VALUES, An as GO_TESTING_VALUES, At as ELIXIR_VALIDATION_VALUES, B as DOTNET_JOB_QUEUE_VALUES, Bi as RUST_AUTH_VALUES, Br as ORM_VALUES, Cn as GO_MIGRATIONS_VALUES, Cr as MOBILE_LIBRARIES_VALUES, Dn as GO_QUALITY_VALUES, Dr as MOBILE_STORAGE_VALUES, Dt as ELIXIR_QUALITY_VALUES, En as GO_PROTO_TOOLING_VALUES, Er as MOBILE_PUSH_VALUES, Et as ELIXIR_ORM_VALUES, G as DOTNET_TESTING_VALUES, Ga as UI_LIBRARY_VALUES, Gi as RUST_LIBRARIES_VALUES, Gr as PYTHON_API_VALUES, H as DOTNET_OBSERVABILITY_VALUES, Hi as RUST_CLI_VALUES, I as DOTNET_API_VALUES, Ia as StackPartRoleSchema, Ii as RATE_LIMIT_VALUES, Ji as RUST_OBSERVABILITY_VALUES, Jr as PYTHON_CLI_VALUES, K as DOTNET_VALIDATION_VALUES, Ka as VALIDATION_VALUES, Ki as RUST_LOGGING_VALUES, Kr as PYTHON_AUTH_VALUES, L as DOTNET_AUTH_VALUES, Li as REALTIME_VALUES, Mn as GO_WEB_FRAMEWORK_VALUES, Mt as EMAIL_VALUES, N as DATABASE_SETUP_VALUES, Nt as EXAMPLES_VALUES, O as CMS_VALUES, On as GO_REALTIME_VALUES, Or as MOBILE_TESTING_VALUES, Ot as ELIXIR_REALTIME_VALUES, P as DATABASE_VALUES, Qa as WEB_DEPLOY_VALUES, Qi as RUST_WEB_FRAMEWORK_VALUES, Qr as PYTHON_HTTP_CLIENT_VALUES, R as DOTNET_CACHING_VALUES, Ri as RUNTIME_VALUES, Rr as OBSERVABILITY_VALUES, Sn as GO_MESSAGE_QUEUE_VALUES, Sr as MOBILE_DEEP_LINKING_VALUES, St as ELIXIR_JOBS_VALUES, T as CACHING_VALUES, Ta as STATE_MANAGEMENT_VALUES, Tn as GO_ORM_VALUES, Tr as MOBILE_OTA_VALUES, Tt as ELIXIR_OBSERVABILITY_VALUES, U as DOTNET_ORM_VALUES, Ui as RUST_ERROR_HANDLING_VALUES, Ur as PAYMENTS_VALUES, V as DOTNET_LIBRARIES_VALUES, Va as TESTING_VALUES, Vi as RUST_CACHING_VALUES, W as DOTNET_REALTIME_VALUES, Wi as RUST_FRONTEND_VALUES, Wr as PYTHON_AI_VALUES, Xi as RUST_REALTIME_VALUES, Xr as PYTHON_DATA_VALUES, Yi as RUST_ORM_VALUES, Yr as PYTHON_CLOUD_SDK_VALUES, Zi as RUST_TEMPLATING_VALUES, Zn as I18N_VALUES, Zr as PYTHON_GRAPHQL_VALUES, _a as SERVER_DEPLOY_VALUES, _n as GO_CACHING_VALUES, _t as ELIXIR_DOCUMENTATION_VALUES, a as ANALYTICS_VALUES, ai as PYTHON_REALTIME_VALUES, an as FEATURE_FLAGS_VALUES, ar as JAVA_LOGGING_VALUES, bn as GO_DI_VALUES, br as LOGGING_VALUES, bt as ELIXIR_HTTP_VALUES, c as API_VALUES, ci as PYTHON_TESTING_VALUES, cn as FORMS_VALUES, cr as JAVA_WEB_FRAMEWORK_VALUES, d as AUTH_VALUES, dt as ELIXIR_API_VALUES, ei as PYTHON_MESSAGE_QUEUE_VALUES, er as JAVA_API_VALUES, ft as ELIXIR_APPLICATION_FRAMEWORK_VALUES, ga as SEARCH_VALUES, gn as GO_AUTH_VALUES, gt as ELIXIR_DEPLOY_VALUES, hn as GO_API_VALUES, ht as ELIXIR_CLUSTERING_VALUES, i as AI_VALUES, ii as PYTHON_QUALITY_VALUES, ir as JAVA_LIBRARIES_VALUES, jn as GO_VALIDATION_VALUES, jt as ELIXIR_WEB_FRAMEWORK_VALUES, kn as GO_TEMPLATING_VALUES, kr as MOBILE_UI_VALUES, kt as ELIXIR_TESTING_VALUES, l as APP_PLATFORM_ADDON_VALUES, li as PYTHON_VALIDATION_VALUES, ln as FRONTEND_VALUES, lr as JOB_QUEUE_VALUES, mt as ELIXIR_CACHING_VALUES, ni as PYTHON_ORM_VALUES, nr as JAVA_BUILD_TOOL_VALUES, o as ANIMATION_VALUES, oi as PYTHON_SERVER_VALUES, on as FILE_STORAGE_VALUES, or as JAVA_ORM_VALUES, pt as ELIXIR_AUTH_VALUES, q as DOTNET_WEB_FRAMEWORK_VALUES, qa as VECTOR_DB_VALUES, qi as RUST_MESSAGE_QUEUE_VALUES, qr as PYTHON_CACHING_VALUES, ri as PYTHON_PACKAGE_MANAGER_VALUES, rr as JAVA_LANGUAGE_VALUES, si as PYTHON_TASK_QUEUE_VALUES, sn as FILE_UPLOAD_VALUES, sr as JAVA_TESTING_LIBRARIES_VALUES, t as ADDONS_VALUES, ti as PYTHON_OBSERVABILITY_VALUES, tr as JAVA_AUTH_VALUES, ui as PYTHON_WEB_FRAMEWORK_VALUES, ut as EFFECT_VALUES, vn as GO_CLI_VALUES, vt as ELIXIR_EMAIL_VALUES, wn as GO_OBSERVABILITY_VALUES, wr as MOBILE_NAVIGATION_VALUES, wt as ELIXIR_LIBRARIES_VALUES, xn as GO_LOGGING_VALUES, xt as ELIXIR_I18N_VALUES, y as BACKEND_VALUES, yn as GO_CONFIG_VALUES, yt as ELIXIR_HTTP_SERVER_VALUES, z as DOTNET_DEPLOY_VALUES, zi as RUST_API_VALUES } from "./schemas-CprYz5Sh.mjs";
2
2
 
3
3
  //#region src/stack-compatibility-rules.ts
4
4
  const WEB_FRAMEWORKS = [
5
5
  "tanstack-router",
6
6
  "react-router",
7
7
  "react-vite",
8
+ "vanilla-vite",
9
+ "vue",
8
10
  "tanstack-start",
9
11
  "next",
10
12
  "vinext",
@@ -20,6 +22,16 @@ const WEB_FRAMEWORKS = [
20
22
  "none"
21
23
  ];
22
24
  const WEB_DEPLOY_COMPATIBLE_FRONTENDS = {
25
+ cloudflare: [
26
+ "tanstack-router",
27
+ "react-router",
28
+ "tanstack-start",
29
+ "next",
30
+ "nuxt",
31
+ "svelte",
32
+ "solid",
33
+ "astro"
34
+ ],
23
35
  render: [
24
36
  "tanstack-router",
25
37
  "react-router",
@@ -46,6 +58,8 @@ const hasPWACompatibleFrontend = (webFrontend) => webFrontend.some((frontend) =>
46
58
  "tanstack-router",
47
59
  "react-router",
48
60
  "react-vite",
61
+ "vanilla-vite",
62
+ "vue",
49
63
  "solid",
50
64
  "next",
51
65
  "vinext",
@@ -55,6 +69,8 @@ const hasTauriCompatibleFrontend = (webFrontend) => webFrontend.some((frontend)
55
69
  "tanstack-router",
56
70
  "react-router",
57
71
  "react-vite",
72
+ "vanilla-vite",
73
+ "vue",
58
74
  "nuxt",
59
75
  "svelte",
60
76
  "solid",
@@ -66,6 +82,8 @@ const hasDockerComposeCompatibleFrontend = (webFrontend) => webFrontend.some((fr
66
82
  "tanstack-router",
67
83
  "react-router",
68
84
  "react-vite",
85
+ "vanilla-vite",
86
+ "vue",
69
87
  "solid",
70
88
  "next",
71
89
  "vinext",
@@ -101,6 +119,8 @@ const UI_LIBRARY_COMPATIBILITY = {
101
119
  "tanstack-router",
102
120
  "react-router",
103
121
  "react-vite",
122
+ "vanilla-vite",
123
+ "vue",
104
124
  "tanstack-start",
105
125
  "next",
106
126
  "vinext",
@@ -131,6 +151,7 @@ const UI_LIBRARY_COMPATIBILITY = {
131
151
  "scss",
132
152
  "less",
133
153
  "postcss-only",
154
+ "styled-components",
134
155
  "none"
135
156
  ]
136
157
  },
@@ -319,6 +340,7 @@ const UI_LIBRARY_COMPATIBILITY = {
319
340
  "scss",
320
341
  "less",
321
342
  "postcss-only",
343
+ "styled-components",
322
344
  "none"
323
345
  ]
324
346
  }
@@ -401,6 +423,8 @@ const PARAGLIDE_COMPATIBLE_FRONTENDS = new Set([
401
423
  "tanstack-start",
402
424
  "react-router",
403
425
  "react-vite",
426
+ "vanilla-vite",
427
+ "vue",
404
428
  "svelte",
405
429
  "solid",
406
430
  "solid-start",
@@ -410,12 +434,16 @@ const TYPESCRIPT_TRPC_INCOMPATIBLE_FRONTENDS = new Set([
410
434
  "nuxt",
411
435
  "svelte",
412
436
  "solid",
413
- "solid-start"
437
+ "solid-start",
438
+ "vanilla-vite",
439
+ "vue"
414
440
  ]);
415
441
  const TYPESCRIPT_APOLLO_SERVER_COMPATIBLE_FRONTENDS = new Set([
416
442
  "tanstack-router",
417
443
  "react-router",
418
444
  "react-vite",
445
+ "vanilla-vite",
446
+ "vue",
419
447
  "tanstack-start",
420
448
  "next",
421
449
  "vinext"
@@ -426,11 +454,18 @@ const BETTER_AUTH_UNSUPPORTED_ORM_TOOLS = new Set([
426
454
  "sequelize"
427
455
  ]);
428
456
  const ELIXIR_ECTO_REQUIRED_TOOLS = new Set(["absinthe"]);
429
- const ELIXIR_ECTO_SQL_REQUIRED_TOOLS = new Set(["oban", "phx-gen-auth"]);
457
+ const ELIXIR_ECTO_SQL_REQUIRED_TOOLS = new Set(["oban"]);
458
+ const ELIXIR_SQL_REPO_REQUIRED_TOOLS = new Set([
459
+ "pow",
460
+ "ex_machina",
461
+ "phx-gen-auth"
462
+ ]);
430
463
  const ELIXIR_PHOENIX_REQUIRED_ROLE_MESSAGES = {
431
464
  auth: "Elixir auth scaffolds require Phoenix",
432
465
  api: "Elixir API scaffolds require Phoenix",
433
- realtime: "Elixir realtime scaffolds require Phoenix"
466
+ realtime: "Elixir realtime scaffolds require Phoenix",
467
+ i18n: "Elixir Internationalization requires Phoenix",
468
+ runtime: "HTTP server adapters require Phoenix"
434
469
  };
435
470
  const ELIXIR_UNSUPPORTED_GRAPH_TOOL_MESSAGES = {};
436
471
  const ELIXIR_UNSUPPORTED_GRAPH_TOOLS = new Set(Object.keys(ELIXIR_UNSUPPORTED_GRAPH_TOOL_MESSAGES));
@@ -532,12 +567,14 @@ const LEGACY_MOBILE_SINGLE_CATEGORIES = {
532
567
  ota: "mobileOTA",
533
568
  deepLinking: "mobileDeepLinking"
534
569
  };
570
+ const LEGACY_MOBILE_ARRAY_CATEGORIES = { libraries: "mobileLibraries" };
535
571
  const LEGACY_BACKEND_ARRAY_CATEGORIES_BY_ECOSYSTEM = {
536
572
  rust: { libraries: "rustLibraries" },
537
573
  python: {
538
574
  ai: "pythonAi",
539
575
  testing: "pythonTesting",
540
- cli: "pythonCli"
576
+ cli: "pythonCli",
577
+ data: "pythonData"
541
578
  },
542
579
  go: { testing: "goTesting" },
543
580
  java: {
@@ -546,32 +583,33 @@ const LEGACY_BACKEND_ARRAY_CATEGORIES_BY_ECOSYSTEM = {
546
583
  },
547
584
  dotnet: {
548
585
  testing: "dotnetTesting",
549
- observability: "dotnetObservability"
586
+ observability: "dotnetObservability",
587
+ libraries: "dotnetLibraries"
550
588
  },
551
589
  elixir: { libraries: "elixirLibraries" }
552
590
  };
553
591
  const CODE_QUALITY_ADDONS = new Set([
554
592
  "biome",
593
+ "eslint",
594
+ "prettier",
555
595
  "oxlint",
556
596
  "ultracite",
557
597
  "lefthook",
558
598
  "husky"
559
599
  ]);
560
600
  const DOCUMENTATION_ADDONS = new Set(["starlight", "fumadocs"]);
561
- const FRONTEND_APP_PLATFORM_ADDONS = new Set([
562
- "pwa",
563
- "tauri",
564
- "wxt",
565
- "opentui"
566
- ]);
601
+ const FRONTEND_APP_PLATFORM_ADDONS = new Set(APP_PLATFORM_ADDON_VALUES);
567
602
  const FRONTEND_DATA_FETCHING_ADDONS = new Set([
568
603
  "swr",
604
+ "apollo-client",
569
605
  "tanstack-query",
570
606
  "tanstack-table",
571
607
  "tanstack-virtual",
572
608
  "tanstack-db",
573
609
  "tanstack-pacer"
574
610
  ]);
611
+ const FRONTEND_HTTP_CLIENT_ADDONS = new Set(["axios"]);
612
+ const FRONTEND_LIBRARY_ADDONS = new Set(["firebase"]);
575
613
  const FRONTEND_TESTING_ADDONS = new Set(["msw", "storybook"]);
576
614
  const WORKSPACE_TOOLING_ADDONS = new Set([
577
615
  "turborepo",
@@ -582,7 +620,9 @@ const WORKSPACE_TOOLING_ADDONS = new Set([
582
620
  "ruler",
583
621
  "mcp",
584
622
  "skills",
585
- "backend-utils"
623
+ "backend-utils",
624
+ "graphql-codegen",
625
+ "openapi-typescript"
586
626
  ]);
587
627
  const DOCKER_COMPOSE_COMPATIBLE_ECOSYSTEMS = new Set([
588
628
  "typescript",
@@ -597,7 +637,9 @@ const LEGACY_ADDON_GRAPH_ROLES = new Set([
597
637
  "dataFetching",
598
638
  "documentation",
599
639
  "testing",
600
- "workspaceTooling"
640
+ "workspaceTooling",
641
+ "httpClient",
642
+ "libraries"
601
643
  ]);
602
644
  const LEGACY_ARRAY_CATEGORIES = new Set([
603
645
  "addons",
@@ -606,11 +648,14 @@ const LEGACY_ARRAY_CATEGORIES = new Set([
606
648
  "pythonAi",
607
649
  "javaLibraries",
608
650
  "javaTestingLibraries",
651
+ "mobileLibraries",
652
+ "dotnetLibraries",
609
653
  "dotnetTesting",
610
654
  "dotnetObservability",
611
655
  "goTesting",
612
656
  "pythonTesting",
613
657
  "pythonCli",
658
+ "pythonData",
614
659
  "elixirLibraries"
615
660
  ]);
616
661
  function getAddonStackPartBinding(toolId) {
@@ -632,6 +677,16 @@ function getAddonStackPartBinding(toolId) {
632
677
  ecosystem: "typescript",
633
678
  ownerRole: "frontend"
634
679
  };
680
+ if (FRONTEND_HTTP_CLIENT_ADDONS.has(toolId)) return {
681
+ role: "httpClient",
682
+ ecosystem: "typescript",
683
+ ownerRole: "frontend"
684
+ };
685
+ if (FRONTEND_LIBRARY_ADDONS.has(toolId)) return {
686
+ role: "libraries",
687
+ ecosystem: "typescript",
688
+ ownerRole: "frontend"
689
+ };
635
690
  if (FRONTEND_TESTING_ADDONS.has(toolId)) return {
636
691
  role: "testing",
637
692
  ecosystem: "typescript",
@@ -645,9 +700,10 @@ function getAddonStackPartBinding(toolId) {
645
700
  const OWNER_ROLES_BY_SCOPED_ROLE = {
646
701
  ...Object.fromEntries([...Object.keys(LEGACY_TYPESCRIPT_BACKEND_SINGLE_CATEGORIES), ...Object.keys(LEGACY_TYPESCRIPT_BACKEND_INFRA_CATEGORIES)].map((role) => [role, ["backend"]])),
647
702
  ...Object.fromEntries(Object.keys(LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES).map((role) => [role, ["frontend"]])),
648
- ...Object.fromEntries(Object.keys(LEGACY_MOBILE_SINGLE_CATEGORIES).map((role) => [role, ["mobile"]])),
703
+ ...Object.fromEntries([...Object.keys(LEGACY_MOBILE_SINGLE_CATEGORIES), ...Object.keys(LEGACY_MOBILE_ARRAY_CATEGORIES)].map((role) => [role, ["mobile"]])),
649
704
  deploy: ["frontend", "backend"],
650
705
  dbSetup: ["database"],
706
+ migrations: ["backend"],
651
707
  ui: ["frontend", "mobile"],
652
708
  graphql: ["backend"],
653
709
  appPlatform: ["frontend"],
@@ -661,8 +717,18 @@ const OWNER_ROLES_BY_SCOPED_ROLE = {
661
717
  buildTool: ["backend"],
662
718
  cli: ["backend"],
663
719
  errorHandling: ["backend"],
664
- httpClient: ["backend"],
665
- libraries: ["backend"]
720
+ httpClient: ["frontend", "backend"],
721
+ libraries: [
722
+ "frontend",
723
+ "mobile",
724
+ "backend"
725
+ ],
726
+ cloudSdk: ["backend"],
727
+ data: ["backend"],
728
+ media: ["backend"],
729
+ server: ["backend"],
730
+ packageManager: ["backend"],
731
+ messageQueue: ["backend"]
666
732
  };
667
733
  const FRESH_UNSUPPORTED_STATE_MANAGEMENT_TOOLS = new Set([
668
734
  "nanostores",
@@ -751,7 +817,13 @@ const LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM = {
751
817
  codeQuality: "pythonQuality",
752
818
  caching: "pythonCaching",
753
819
  realtime: "pythonRealtime",
754
- observability: "pythonObservability"
820
+ observability: "pythonObservability",
821
+ cloudSdk: "pythonCloudSdk",
822
+ httpClient: "pythonHttpClient",
823
+ media: "pythonMedia",
824
+ server: "pythonServer",
825
+ packageManager: "pythonPackageManager",
826
+ messageQueue: "pythonMessageQueue"
755
827
  },
756
828
  go: {
757
829
  cli: "goCli",
@@ -760,7 +832,13 @@ const LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM = {
760
832
  jobQueue: "goMessageQueue",
761
833
  caching: "goCaching",
762
834
  config: "goConfig",
763
- observability: "goObservability"
835
+ observability: "goObservability",
836
+ validation: "goValidation",
837
+ codeQuality: "goQuality",
838
+ migrations: "goMigrations",
839
+ templating: "goTemplating",
840
+ buildTool: "goProtoTooling",
841
+ libraries: "goDI"
764
842
  },
765
843
  java: {
766
844
  buildTool: "javaBuildTool",
@@ -783,6 +861,11 @@ const LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM = {
783
861
  observability: "elixirObservability",
784
862
  testing: "elixirTesting",
785
863
  codeQuality: "elixirQuality",
864
+ i18n: "elixirI18n",
865
+ runtime: "elixirHttpServer",
866
+ libraries: "elixirApplicationFramework",
867
+ documentation: "elixirDocumentation",
868
+ config: "elixirClustering",
786
869
  deploy: "elixirDeploy"
787
870
  }
788
871
  };
@@ -821,6 +904,7 @@ const GRAPH_PROJECTION_DEFAULT_LEGACY_CATEGORIES = [
821
904
  ...Object.values(LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES),
822
905
  ...Object.values(LEGACY_DATABASE_SINGLE_CATEGORIES),
823
906
  ...Object.values(LEGACY_MOBILE_SINGLE_CATEGORIES),
907
+ ...Object.values(LEGACY_MOBILE_ARRAY_CATEGORIES),
824
908
  ...Object.values(LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM).flatMap((categories) => Object.values(categories)),
825
909
  ...Object.values(LEGACY_SHARED_BACKEND_SINGLE_CATEGORIES_BY_ECOSYSTEM).flatMap((categories) => Object.values(categories))
826
910
  ];
@@ -868,6 +952,8 @@ const STACK_TOOL_DEFINITIONS = [
868
952
  }),
869
953
  ...defineTools(ADDONS_VALUES.filter((value) => FRONTEND_APP_PLATFORM_ADDONS.has(value)), "appPlatform", "typescript", void 0, { allowMultiple: true }),
870
954
  ...defineTools(ADDONS_VALUES.filter((value) => FRONTEND_DATA_FETCHING_ADDONS.has(value)), "dataFetching", "typescript", void 0, { allowMultiple: true }),
955
+ ...defineTools(ADDONS_VALUES.filter((value) => FRONTEND_HTTP_CLIENT_ADDONS.has(value)), "httpClient", "typescript", void 0, { allowMultiple: true }),
956
+ ...defineTools(ADDONS_VALUES.filter((value) => FRONTEND_LIBRARY_ADDONS.has(value)), "libraries", "typescript", void 0, { allowMultiple: true }),
871
957
  ...defineTools(ADDONS_VALUES.filter((value) => FRONTEND_TESTING_ADDONS.has(value)), "testing", "typescript", void 0, { allowMultiple: true }),
872
958
  ...defineTools(ADDONS_VALUES.filter((value) => WORKSPACE_TOOLING_ADDONS.has(value)), "workspaceTooling", "universal", void 0, {
873
959
  allowMultiple: true,
@@ -902,6 +988,7 @@ const STACK_TOOL_DEFINITIONS = [
902
988
  ...defineTools(MOBILE_PUSH_VALUES, "push", "react-native", "mobilePush"),
903
989
  ...defineTools(MOBILE_OTA_VALUES, "ota", "react-native", "mobileOTA"),
904
990
  ...defineTools(MOBILE_DEEP_LINKING_VALUES, "deepLinking", "react-native", "mobileDeepLinking"),
991
+ ...defineTools(MOBILE_LIBRARIES_VALUES, "libraries", "react-native", "mobileLibraries", { allowMultiple: true }),
905
992
  ...defineTools(RUST_WEB_FRAMEWORK_VALUES, "backend", "rust", "rustWebFramework"),
906
993
  ...defineTools(RUST_FRONTEND_VALUES, "frontend", "rust", "rustFrontend"),
907
994
  ...defineTools(RUST_ORM_VALUES, "orm", "rust", "rustOrm"),
@@ -938,6 +1025,13 @@ const STACK_TOOL_DEFINITIONS = [
938
1025
  ...defineTools(PYTHON_REALTIME_VALUES, "realtime", "python", "pythonRealtime"),
939
1026
  ...defineTools(PYTHON_OBSERVABILITY_VALUES, "observability", "python", "pythonObservability"),
940
1027
  ...defineTools(PYTHON_CLI_VALUES, "cli", "python", "pythonCli", { allowMultiple: true }),
1028
+ ...defineTools(PYTHON_CLOUD_SDK_VALUES, "cloudSdk", "python", "pythonCloudSdk"),
1029
+ ...defineTools(PYTHON_HTTP_CLIENT_VALUES, "httpClient", "python", "pythonHttpClient"),
1030
+ ...defineTools(PYTHON_DATA_VALUES, "data", "python", "pythonData", { allowMultiple: true }),
1031
+ ...defineTools(PYTHON_MEDIA_VALUES, "media", "python", "pythonMedia"),
1032
+ ...defineTools(PYTHON_SERVER_VALUES, "server", "python", "pythonServer"),
1033
+ ...defineTools(PYTHON_PACKAGE_MANAGER_VALUES, "packageManager", "python", "pythonPackageManager"),
1034
+ ...defineTools(PYTHON_MESSAGE_QUEUE_VALUES, "messageQueue", "python", "pythonMessageQueue"),
941
1035
  ...defineTools(GO_WEB_FRAMEWORK_VALUES, "backend", "go", "goWebFramework"),
942
1036
  ...defineTools(GO_ORM_VALUES, "orm", "go", "goOrm"),
943
1037
  ...defineTools(GO_API_VALUES, "api", "go", "goApi"),
@@ -954,6 +1048,12 @@ const STACK_TOOL_DEFINITIONS = [
954
1048
  ...defineTools(["meilisearch", "bleve"], "search", "go", "search"),
955
1049
  ...defineTools(GO_CONFIG_VALUES, "config", "go", "goConfig"),
956
1050
  ...defineTools(GO_OBSERVABILITY_VALUES, "observability", "go", "goObservability"),
1051
+ ...defineTools(GO_VALIDATION_VALUES, "validation", "go", "goValidation"),
1052
+ ...defineTools(GO_QUALITY_VALUES, "codeQuality", "go", "goQuality"),
1053
+ ...defineTools(GO_MIGRATIONS_VALUES, "migrations", "go", "goMigrations"),
1054
+ ...defineTools(GO_TEMPLATING_VALUES, "templating", "go", "goTemplating"),
1055
+ ...defineTools(GO_PROTO_TOOLING_VALUES, "buildTool", "go", "goProtoTooling"),
1056
+ ...defineTools(GO_DI_VALUES, "libraries", "go", "goDI"),
957
1057
  ...defineTools(JAVA_WEB_FRAMEWORK_VALUES, "backend", "java", "javaWebFramework"),
958
1058
  ...defineTools(JAVA_LANGUAGE_VALUES, "language", "java", "javaLanguage"),
959
1059
  ...defineTools(JAVA_BUILD_TOOL_VALUES, "buildTool", "java", "javaBuildTool"),
@@ -978,6 +1078,7 @@ const STACK_TOOL_DEFINITIONS = [
978
1078
  ...defineTools(DOTNET_VALIDATION_VALUES, "validation", "dotnet", "dotnetValidation"),
979
1079
  ...defineTools(DOTNET_CACHING_VALUES, "caching", "dotnet", "dotnetCaching"),
980
1080
  ...defineTools(DOTNET_DEPLOY_VALUES, "deploy", "dotnet", "dotnetDeploy"),
1081
+ ...defineTools(DOTNET_LIBRARIES_VALUES, "libraries", "dotnet", "dotnetLibraries", { allowMultiple: true }),
981
1082
  ...defineTools(ELIXIR_WEB_FRAMEWORK_VALUES, "backend", "elixir", "elixirWebFramework"),
982
1083
  ...defineTools(ELIXIR_ORM_VALUES, "orm", "elixir", "elixirOrm"),
983
1084
  ...defineTools(ELIXIR_AUTH_VALUES, "auth", "elixir", "elixirAuth"),
@@ -992,6 +1093,14 @@ const STACK_TOOL_DEFINITIONS = [
992
1093
  ...defineTools(ELIXIR_OBSERVABILITY_VALUES, "observability", "elixir", "elixirObservability"),
993
1094
  ...defineTools(ELIXIR_TESTING_VALUES, "testing", "elixir", "elixirTesting"),
994
1095
  ...defineTools(ELIXIR_QUALITY_VALUES, "codeQuality", "elixir", "elixirQuality"),
1096
+ ...defineTools(ELIXIR_I18N_VALUES, "i18n", "elixir", "elixirI18n"),
1097
+ ...defineTools(ELIXIR_HTTP_SERVER_VALUES, "runtime", "elixir", "elixirHttpServer"),
1098
+ ...defineTools(ELIXIR_APPLICATION_FRAMEWORK_VALUES, "libraries", "elixir", "elixirApplicationFramework", {
1099
+ allowMultiple: true,
1100
+ ownerless: true
1101
+ }),
1102
+ ...defineTools(ELIXIR_DOCUMENTATION_VALUES, "documentation", "elixir", "elixirDocumentation", { ownerless: true }),
1103
+ ...defineTools(ELIXIR_CLUSTERING_VALUES, "config", "elixir", "elixirClustering"),
995
1104
  ...defineTools(ELIXIR_DEPLOY_VALUES, "deploy", "elixir", "elixirDeploy"),
996
1105
  {
997
1106
  toolId: "convex",
@@ -1488,6 +1597,27 @@ function createAddonCompatibilityIssue(part, context) {
1488
1597
  const backendEcosystem = context.primaryEcosystemsByRole?.backend;
1489
1598
  const runtimeTool = context.selectedToolIdsByRole?.runtime ?? "bun";
1490
1599
  const apiTool = context.selectedToolIdsByRole?.api;
1600
+ if (part.toolId === "graphql-codegen" && !apiTool?.match(/^(garph|graphql-yoga|apollo-server)$/) && frontendTool !== "redwood") return createStackGraphIssue({
1601
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1602
+ partId: part.id,
1603
+ role: part.role,
1604
+ toolId: part.toolId,
1605
+ message: "GraphQL Code Generator requires a GraphQL API selection."
1606
+ });
1607
+ if (part.toolId === "openapi-typescript" && apiTool !== "openapi") return createStackGraphIssue({
1608
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1609
+ partId: part.id,
1610
+ role: part.role,
1611
+ toolId: part.toolId,
1612
+ message: "openapi-typescript requires the OpenAPI API selection."
1613
+ });
1614
+ if (part.toolId === "openapi-typescript" && backendTool === "self") return createStackGraphIssue({
1615
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1616
+ partId: part.id,
1617
+ role: part.role,
1618
+ toolId: part.toolId,
1619
+ message: "openapi-typescript requires a standalone backend that exposes an OpenAPI schema."
1620
+ });
1491
1621
  if (part.role === "appPlatform") {
1492
1622
  if (part.toolId === "pwa" && !hasPWACompatibleFrontend(frontendTools)) return createStackGraphIssue({
1493
1623
  code: "INCOMPATIBLE_OWNER_TOOL",
@@ -1503,8 +1633,28 @@ function createAddonCompatibilityIssue(part, context) {
1503
1633
  toolId: part.toolId,
1504
1634
  message: "Tauri requires a compatible web frontend."
1505
1635
  });
1636
+ if (["electron", "capacitor"].includes(part.toolId) && ![
1637
+ "tanstack-router",
1638
+ "react-vite",
1639
+ "vanilla-vite",
1640
+ "vue",
1641
+ "solid"
1642
+ ].includes(frontendTool ?? "")) return createStackGraphIssue({
1643
+ code: "INCOMPATIBLE_OWNER_TOOL",
1644
+ partId: part.id,
1645
+ role: part.role,
1646
+ toolId: part.toolId,
1647
+ message: `${part.toolId} requires a compatible Vite SPA frontend.`
1648
+ });
1506
1649
  }
1507
1650
  if (part.role === "dataFetching") {
1651
+ if (part.toolId === "apollo-client" && !apiTool?.match(/^(garph|graphql-yoga|apollo-server)$/)) return createStackGraphIssue({
1652
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1653
+ partId: part.id,
1654
+ role: part.role,
1655
+ toolId: part.toolId,
1656
+ message: "Apollo Client requires a GraphQL API selection."
1657
+ });
1508
1658
  if (part.toolId === "tanstack-query" && apiTool && apiTool !== "none") return createStackGraphIssue({
1509
1659
  code: "INCOMPATIBLE_GRAPH_SELECTION",
1510
1660
  partId: part.id,
@@ -1777,6 +1927,20 @@ function getStackPartCompatibilityIssue(part, context) {
1777
1927
  if (addonCompatibilityIssue) return addonCompatibilityIssue;
1778
1928
  const javaCompatibilityIssue = createJavaCompatibilityIssue(part, context);
1779
1929
  if (javaCompatibilityIssue) return javaCompatibilityIssue;
1930
+ if (part.ecosystem === "go" && part.role === "migrations" && part.toolId === "golang-migrate") {
1931
+ const databaseTool = context.primaryToolIdsByRole?.database ?? "none";
1932
+ if (![
1933
+ "sqlite",
1934
+ "postgres",
1935
+ "mysql"
1936
+ ].includes(databaseTool)) return createStackGraphIssue({
1937
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1938
+ partId: part.id,
1939
+ role: part.role,
1940
+ toolId: part.toolId,
1941
+ message: "Go migrations require SQLite, PostgreSQL, or MySQL"
1942
+ });
1943
+ }
1780
1944
  if (part.ecosystem === "python" && part.role === "api" && DJANGO_API_TOOLS.has(part.toolId)) {
1781
1945
  if (context.ownerToolId !== "django") return createStackGraphIssue({
1782
1946
  code: "INCOMPATIBLE_OWNER_TOOL",
@@ -1860,17 +2024,35 @@ function getStackPartCompatibilityIssue(part, context) {
1860
2024
  });
1861
2025
  }
1862
2026
  if (part.ecosystem === "elixir" && ELIXIR_ECTO_SQL_REQUIRED_TOOLS.has(part.toolId) && (!context.ownerRole || context.ownerRole === "backend")) {
1863
- if ((context.siblingToolIdsByRole?.orm ?? context.selectedToolIdsByRole?.orm) !== "ecto-sql") {
1864
- const message = part.toolId === "phx-gen-auth" ? "phx.gen.auth requires Ecto SQL with PostgreSQL in the current Phoenix scaffold" : "Oban requires Ecto SQL with PostgreSQL in the current Phoenix scaffold";
1865
- return createStackGraphIssue({
1866
- code: "INCOMPATIBLE_GRAPH_SELECTION",
1867
- partId: part.id,
1868
- role: part.role,
1869
- toolId: part.toolId,
1870
- message
1871
- });
1872
- }
2027
+ if ((context.siblingToolIdsByRole?.orm ?? context.selectedToolIdsByRole?.orm) !== "ecto-sql") return createStackGraphIssue({
2028
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
2029
+ partId: part.id,
2030
+ role: part.role,
2031
+ toolId: part.toolId,
2032
+ message: "Oban requires Ecto SQL with PostgreSQL in the current Phoenix scaffold"
2033
+ });
1873
2034
  }
2035
+ if (part.ecosystem === "elixir" && ELIXIR_SQL_REPO_REQUIRED_TOOLS.has(part.toolId) && context.ownerRole === "backend") {
2036
+ const ormTool = context.siblingToolIdsByRole?.orm ?? context.selectedToolIdsByRole?.orm;
2037
+ if (!ormTool || ![
2038
+ "ecto-sql",
2039
+ "myxql",
2040
+ "ecto_sqlite3"
2041
+ ].includes(ormTool)) return createStackGraphIssue({
2042
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
2043
+ partId: part.id,
2044
+ role: part.role,
2045
+ toolId: part.toolId,
2046
+ message: part.toolId === "pow" ? "Pow requires Phoenix and an Ecto SQL repository" : part.toolId === "phx-gen-auth" ? "phx.gen.auth requires an Ecto SQL repository" : "ExMachina requires an Ecto SQL repository"
2047
+ });
2048
+ }
2049
+ if (part.ecosystem === "elixir" && part.role === "runtime" && part.toolId === "none" && context.ownerRole === "backend" && context.ownerToolId !== "none") return createStackGraphIssue({
2050
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
2051
+ partId: part.id,
2052
+ role: part.role,
2053
+ toolId: part.toolId,
2054
+ message: "Phoenix requires Bandit or Cowboy"
2055
+ });
1874
2056
  if (part.ecosystem === "elixir" && part.toolId === "live-view-streams" && context.ownerRole === "backend") {
1875
2057
  if (context.ownerToolId !== "phoenix-live-view") return createStackGraphIssue({
1876
2058
  code: "INCOMPATIBLE_OWNER_TOOL",
@@ -2086,7 +2268,10 @@ function appendUniqueLegacyArrayValue(config, category, value) {
2086
2268
  }
2087
2269
  function getLegacyArrayCategoryForPart(part) {
2088
2270
  if (part.role === "examples") return "examples";
2089
- if (LEGACY_ADDON_GRAPH_ROLES.has(part.role) && getAddonStackPartBinding(part.toolId)) return "addons";
2271
+ if (LEGACY_ADDON_GRAPH_ROLES.has(part.role)) {
2272
+ const binding = getAddonStackPartBinding(part.toolId);
2273
+ if (binding && binding.role === part.role && binding.ecosystem === part.ecosystem) return "addons";
2274
+ }
2090
2275
  const legacyCategory = findDefinition(part)?.legacyCategory;
2091
2276
  if (legacyCategory && LEGACY_ARRAY_CATEGORIES.has(legacyCategory)) return legacyCategory;
2092
2277
  }
@@ -2119,7 +2304,17 @@ function legacyProjectConfigToStackParts(config, source = "legacy") {
2119
2304
  addLegacyPart(parts, "api", "typescript", config.api, source, capabilityOwner);
2120
2305
  addLegacyPart(parts, "auth", config.ecosystem ?? "typescript", config.auth, source, capabilityOwner);
2121
2306
  if (frontendPart?.ecosystem === "typescript") for (const [role, category] of Object.entries(LEGACY_TYPESCRIPT_FRONTEND_SINGLE_CATEGORIES)) addLegacyPart(parts, role, "typescript", config[category], source, frontendPart.id);
2122
- if (mobilePart?.ecosystem === "react-native") for (const [role, category] of Object.entries(LEGACY_MOBILE_SINGLE_CATEGORIES)) addLegacyPart(parts, role, "react-native", config[category], source, mobilePart.id);
2307
+ if (mobilePart?.ecosystem === "react-native") {
2308
+ for (const [role, category] of Object.entries(LEGACY_MOBILE_SINGLE_CATEGORIES)) addLegacyPart(parts, role, "react-native", config[category], source, mobilePart.id);
2309
+ for (const [role, category] of Object.entries(LEGACY_MOBILE_ARRAY_CATEGORIES)) {
2310
+ const values = config[category];
2311
+ if (!Array.isArray(values)) continue;
2312
+ for (const toolId of values) {
2313
+ if (typeof toolId !== "string") continue;
2314
+ addLegacyPart(parts, role, "react-native", toolId, source, mobilePart.id);
2315
+ }
2316
+ }
2317
+ }
2123
2318
  if (backendPart?.ecosystem === "typescript") {
2124
2319
  for (const [role, category] of Object.entries(LEGACY_TYPESCRIPT_BACKEND_INFRA_CATEGORIES)) addLegacyPart(parts, role, "typescript", config[category], source, backendPart.id);
2125
2320
  for (const [role, category] of Object.entries(LEGACY_TYPESCRIPT_BACKEND_SINGLE_CATEGORIES)) addLegacyPart(parts, role, "typescript", config[category], source, backendPart.id);
@@ -2265,7 +2460,7 @@ function stackGraphToLegacyProjectConfigForEcosystem(config, ecosystem) {
2265
2460
  ecosystem,
2266
2461
  frontend: [...frontend && frontend.ecosystem === "typescript" ? [frontend.toolId] : [], ...mobile && ["typescript", "react-native"].includes(ecosystem) ? [mobile.toolId] : []]
2267
2462
  };
2268
- for (const category of GRAPH_PROJECTION_DEFAULT_LEGACY_CATEGORIES) projected[category] = "none";
2463
+ for (const category of GRAPH_PROJECTION_DEFAULT_LEGACY_CATEGORIES) projected[category] = LEGACY_ARRAY_CATEGORIES.has(category) ? [] : "none";
2269
2464
  projected.addons = [];
2270
2465
  projected.examples = [];
2271
2466
  projectLegacyCategoryFromPart(projected, backend, ecosystem, parts);
@@ -2379,4 +2574,4 @@ function validateStackParts(parts) {
2379
2574
 
2380
2575
  //#endregion
2381
2576
  export { isBackendUtilsCompatibleBackend as C, requiresChatSdkVercelAIForExamples as E, hasTauriCompatibleFrontend as S, isExampleChatSdkAllowed as T, UI_LIBRARY_COMPATIBILITY as _, getAddonStackPartBinding as a, hasPWACompatibleFrontend as b, getStackPartOptions as c, materializeProvidedStackParts as d, parseStackPartSpecs as f, BACKEND_UTILS_COMPATIBLE_BACKENDS as g, validateStackParts as h, formatStackPartSpec as i, getStackToolDefinitions as l, stackPartsToLegacyProjectConfigPartial as m, STACK_TOOL_DEFINITIONS as n, getRoleTargetPath as o, stackGraphToLegacyProjectConfigForEcosystem as p, createStackPart as r, getStackPartCompatibilityIssueForPart as s, ELIXIR_UNSUPPORTED_GRAPH_TOOLS as t, legacyProjectConfigToStackParts as u, getUnsupportedWebDeployFrontend as v, isExampleAIAllowed as w, hasTanStackAICompatibleFrontend as x, hasDockerComposeCompatibleFrontend as y };
2382
- //# sourceMappingURL=stack-graph-BAad0vv4.mjs.map
2577
+ //# sourceMappingURL=stack-graph-DiLi3WuL.mjs.map