@better-fullstack/types 2.1.8 → 2.2.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 (44) hide show
  1. package/dist/{defaults-DNnZX9er.mjs → defaults-DgL5YPQY.mjs} +12 -1
  2. package/dist/defaults-DgL5YPQY.mjs.map +1 -0
  3. package/dist/{defaults-Cpkx-Eu7.d.mts → defaults-DyNR1d-V.d.mts} +2 -2
  4. package/dist/defaults-DyNR1d-V.d.mts.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 +110 -5
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/json-schema.d.mts +1814 -362
  12. package/dist/json-schema.d.mts.map +1 -1
  13. package/dist/json-schema.mjs +94 -2
  14. package/dist/json-schema.mjs.map +1 -1
  15. package/dist/{schemas-DOb4t_el.d.mts → schemas-D9kkuJz7.d.mts} +1811 -645
  16. package/dist/schemas-D9kkuJz7.d.mts.map +1 -0
  17. package/dist/{schemas-BXDvWDRp.mjs → schemas-l7hOhH8U.mjs} +161 -6
  18. package/dist/schemas-l7hOhH8U.mjs.map +1 -0
  19. package/dist/schemas.d.mts +2 -2
  20. package/dist/schemas.mjs +2 -2
  21. package/dist/{stack-graph-BAad0vv4.mjs → stack-graph-C8r3fTh4.mjs} +180 -27
  22. package/dist/stack-graph-C8r3fTh4.mjs.map +1 -0
  23. package/dist/{stack-graph-0MDSuSPQ.d.mts → stack-graph-F6UKYYR0.d.mts} +2 -2
  24. package/dist/{stack-graph-0MDSuSPQ.d.mts.map → stack-graph-F6UKYYR0.d.mts.map} +1 -1
  25. package/dist/stack-graph.d.mts +3 -3
  26. package/dist/stack-graph.mjs +2 -2
  27. package/dist/{stack-translation-CnNmU8Z5.d.mts → stack-translation-BNHNx5_b.d.mts} +31 -9
  28. package/dist/stack-translation-BNHNx5_b.d.mts.map +1 -0
  29. package/dist/{stack-translation-DwSS9Vc2.mjs → stack-translation-Kr0TyRAm.mjs} +703 -81
  30. package/dist/stack-translation-Kr0TyRAm.mjs.map +1 -0
  31. package/dist/stack-translation.d.mts +4 -4
  32. package/dist/stack-translation.mjs +3 -3
  33. package/dist/{types-CcWal512.d.mts → types-C7RpHf2e.d.mts} +14 -3
  34. package/dist/types-C7RpHf2e.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-BAad0vv4.mjs.map +0 -1
  42. package/dist/stack-translation-CnNmU8Z5.d.mts.map +0 -1
  43. package/dist/stack-translation-DwSS9Vc2.mjs.map +0 -1
  44. 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 { $i as SERVER_DEPLOY_VALUES, $n as JAVA_AUTH_VALUES, $r as PYTHON_WEB_FRAMEWORK_VALUES, A as CSS_FRAMEWORK_VALUES, Ai as RUST_OBSERVABILITY_VALUES, An as GO_WEB_FRAMEWORK_VALUES, At as EMAIL_VALUES, B as DOTNET_JOB_QUEUE_VALUES, Br as PYTHON_AI_VALUES, Ca as TESTING_VALUES, Ci as RUST_CACHING_VALUES, Cn as GO_ORM_VALUES, Cr as MOBILE_PUSH_VALUES, Ct as ELIXIR_OBSERVABILITY_VALUES, Da as UI_LIBRARY_VALUES, Di as RUST_LIBRARIES_VALUES, Dn as GO_TEMPLATING_VALUES, Dt as ELIXIR_TESTING_VALUES, Ei as RUST_FRONTEND_VALUES, En as GO_REALTIME_VALUES, Er as MOBILE_UI_VALUES, Et as ELIXIR_REALTIME_VALUES, G as DOTNET_VALIDATION_VALUES, Gr as PYTHON_GRAPHQL_VALUES, H as DOTNET_ORM_VALUES, Hr as PYTHON_AUTH_VALUES, I as DOTNET_API_VALUES, Ir as ORM_VALUES, Jr as PYTHON_QUALITY_VALUES, K as DOTNET_WEB_FRAMEWORK_VALUES, Kr as PYTHON_OBSERVABILITY_VALUES, L as DOTNET_AUTH_VALUES, Mi as RUST_REALTIME_VALUES, N as DATABASE_SETUP_VALUES, Ni as RUST_TEMPLATING_VALUES, O as CMS_VALUES, Oa as VALIDATION_VALUES, Oi as RUST_LOGGING_VALUES, On as GO_TESTING_VALUES, Ot as ELIXIR_VALIDATION_VALUES, P as DATABASE_VALUES, Pa as WEB_DEPLOY_VALUES, Pi as RUST_WEB_FRAMEWORK_VALUES, Pr as OBSERVABILITY_VALUES, Qi as SEARCH_VALUES, Qn as JAVA_API_VALUES, Qr as PYTHON_VALIDATION_VALUES, R as DOTNET_CACHING_VALUES, Si as RUST_AUTH_VALUES, Sn as GO_OBSERVABILITY_VALUES, Sr as MOBILE_OTA_VALUES, St as ELIXIR_LIBRARIES_VALUES, T as CACHING_VALUES, Ti as RUST_ERROR_HANDLING_VALUES, Tn as GO_QUALITY_VALUES, Tr as MOBILE_TESTING_VALUES, Tt as ELIXIR_QUALITY_VALUES, U as DOTNET_REALTIME_VALUES, Ur as PYTHON_CACHING_VALUES, V as DOTNET_OBSERVABILITY_VALUES, Vr as PYTHON_API_VALUES, W as DOTNET_TESTING_VALUES, Wr as PYTHON_CLI_VALUES, Xr as PYTHON_TASK_QUEUE_VALUES, Yn as I18N_VALUES, Yr as PYTHON_REALTIME_VALUES, Zr as PYTHON_TESTING_VALUES, _n as GO_CONFIG_VALUES, _t as ELIXIR_HTTP_SERVER_VALUES, a as ANALYTICS_VALUES, an as FILE_UPLOAD_VALUES, ar as JAVA_TESTING_LIBRARIES_VALUES, bi as RUNTIME_VALUES, bn as GO_MESSAGE_QUEUE_VALUES, br as MOBILE_DEEP_LINKING_VALUES, bt as ELIXIR_JOBS_VALUES, c as API_VALUES, ct as EFFECT_VALUES, d as AUTH_VALUES, dt as ELIXIR_AUTH_VALUES, er as JAVA_BUILD_TOOL_VALUES, ft as ELIXIR_CACHING_VALUES, gn as GO_CLI_VALUES, gt as ELIXIR_EMAIL_VALUES, hn as GO_CACHING_VALUES, ht as ELIXIR_DOCUMENTATION_VALUES, i as AI_VALUES, in as FILE_STORAGE_VALUES, ir as JAVA_ORM_VALUES, ji as RUST_ORM_VALUES, jt as EXAMPLES_VALUES, ka as VECTOR_DB_VALUES, ki as RUST_MESSAGE_QUEUE_VALUES, kn as GO_VALIDATION_VALUES, kt as ELIXIR_WEB_FRAMEWORK_VALUES, l as APP_PLATFORM_ADDON_VALUES, lt as ELIXIR_API_VALUES, mn as GO_AUTH_VALUES, mt as ELIXIR_DEPLOY_VALUES, nr as JAVA_LIBRARIES_VALUES, o as ANIMATION_VALUES, on as FORMS_VALUES, or as JAVA_WEB_FRAMEWORK_VALUES, pn as GO_API_VALUES, pt as ELIXIR_CLUSTERING_VALUES, qr as PYTHON_ORM_VALUES, rn as FEATURE_FLAGS_VALUES, rr as JAVA_LOGGING_VALUES, sa as STATE_MANAGEMENT_VALUES, sn as FRONTEND_VALUES, sr as JOB_QUEUE_VALUES, t as ADDONS_VALUES, tr as JAVA_LANGUAGE_VALUES, ut as ELIXIR_APPLICATION_FRAMEWORK_VALUES, va as StackPartRoleSchema, vi as RATE_LIMIT_VALUES, vn as GO_DI_VALUES, vr as LOGGING_VALUES, vt as ELIXIR_HTTP_VALUES, wi as RUST_CLI_VALUES, wn as GO_PROTO_TOOLING_VALUES, wr as MOBILE_STORAGE_VALUES, wt as ELIXIR_ORM_VALUES, xi as RUST_API_VALUES, xn as GO_MIGRATIONS_VALUES, xr as MOBILE_NAVIGATION_VALUES, y as BACKEND_VALUES, yi as REALTIME_VALUES, yn as GO_LOGGING_VALUES, yt as ELIXIR_I18N_VALUES, z as DOTNET_DEPLOY_VALUES, zr as PAYMENTS_VALUES } from "./schemas-l7hOhH8U.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));
@@ -552,26 +587,26 @@ const LEGACY_BACKEND_ARRAY_CATEGORIES_BY_ECOSYSTEM = {
552
587
  };
553
588
  const CODE_QUALITY_ADDONS = new Set([
554
589
  "biome",
590
+ "eslint",
591
+ "prettier",
555
592
  "oxlint",
556
593
  "ultracite",
557
594
  "lefthook",
558
595
  "husky"
559
596
  ]);
560
597
  const DOCUMENTATION_ADDONS = new Set(["starlight", "fumadocs"]);
561
- const FRONTEND_APP_PLATFORM_ADDONS = new Set([
562
- "pwa",
563
- "tauri",
564
- "wxt",
565
- "opentui"
566
- ]);
598
+ const FRONTEND_APP_PLATFORM_ADDONS = new Set(APP_PLATFORM_ADDON_VALUES);
567
599
  const FRONTEND_DATA_FETCHING_ADDONS = new Set([
568
600
  "swr",
601
+ "apollo-client",
569
602
  "tanstack-query",
570
603
  "tanstack-table",
571
604
  "tanstack-virtual",
572
605
  "tanstack-db",
573
606
  "tanstack-pacer"
574
607
  ]);
608
+ const FRONTEND_HTTP_CLIENT_ADDONS = new Set(["axios"]);
609
+ const FRONTEND_LIBRARY_ADDONS = new Set(["firebase"]);
575
610
  const FRONTEND_TESTING_ADDONS = new Set(["msw", "storybook"]);
576
611
  const WORKSPACE_TOOLING_ADDONS = new Set([
577
612
  "turborepo",
@@ -582,7 +617,9 @@ const WORKSPACE_TOOLING_ADDONS = new Set([
582
617
  "ruler",
583
618
  "mcp",
584
619
  "skills",
585
- "backend-utils"
620
+ "backend-utils",
621
+ "graphql-codegen",
622
+ "openapi-typescript"
586
623
  ]);
587
624
  const DOCKER_COMPOSE_COMPATIBLE_ECOSYSTEMS = new Set([
588
625
  "typescript",
@@ -597,7 +634,9 @@ const LEGACY_ADDON_GRAPH_ROLES = new Set([
597
634
  "dataFetching",
598
635
  "documentation",
599
636
  "testing",
600
- "workspaceTooling"
637
+ "workspaceTooling",
638
+ "httpClient",
639
+ "libraries"
601
640
  ]);
602
641
  const LEGACY_ARRAY_CATEGORIES = new Set([
603
642
  "addons",
@@ -632,6 +671,16 @@ function getAddonStackPartBinding(toolId) {
632
671
  ecosystem: "typescript",
633
672
  ownerRole: "frontend"
634
673
  };
674
+ if (FRONTEND_HTTP_CLIENT_ADDONS.has(toolId)) return {
675
+ role: "httpClient",
676
+ ecosystem: "typescript",
677
+ ownerRole: "frontend"
678
+ };
679
+ if (FRONTEND_LIBRARY_ADDONS.has(toolId)) return {
680
+ role: "libraries",
681
+ ecosystem: "typescript",
682
+ ownerRole: "frontend"
683
+ };
635
684
  if (FRONTEND_TESTING_ADDONS.has(toolId)) return {
636
685
  role: "testing",
637
686
  ecosystem: "typescript",
@@ -648,6 +697,7 @@ const OWNER_ROLES_BY_SCOPED_ROLE = {
648
697
  ...Object.fromEntries(Object.keys(LEGACY_MOBILE_SINGLE_CATEGORIES).map((role) => [role, ["mobile"]])),
649
698
  deploy: ["frontend", "backend"],
650
699
  dbSetup: ["database"],
700
+ migrations: ["backend"],
651
701
  ui: ["frontend", "mobile"],
652
702
  graphql: ["backend"],
653
703
  appPlatform: ["frontend"],
@@ -661,8 +711,8 @@ const OWNER_ROLES_BY_SCOPED_ROLE = {
661
711
  buildTool: ["backend"],
662
712
  cli: ["backend"],
663
713
  errorHandling: ["backend"],
664
- httpClient: ["backend"],
665
- libraries: ["backend"]
714
+ httpClient: ["frontend", "backend"],
715
+ libraries: ["frontend", "backend"]
666
716
  };
667
717
  const FRESH_UNSUPPORTED_STATE_MANAGEMENT_TOOLS = new Set([
668
718
  "nanostores",
@@ -760,7 +810,13 @@ const LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM = {
760
810
  jobQueue: "goMessageQueue",
761
811
  caching: "goCaching",
762
812
  config: "goConfig",
763
- observability: "goObservability"
813
+ observability: "goObservability",
814
+ validation: "goValidation",
815
+ codeQuality: "goQuality",
816
+ migrations: "goMigrations",
817
+ templating: "goTemplating",
818
+ buildTool: "goProtoTooling",
819
+ libraries: "goDI"
764
820
  },
765
821
  java: {
766
822
  buildTool: "javaBuildTool",
@@ -783,6 +839,11 @@ const LEGACY_EXTRA_CATEGORIES_BY_ECOSYSTEM = {
783
839
  observability: "elixirObservability",
784
840
  testing: "elixirTesting",
785
841
  codeQuality: "elixirQuality",
842
+ i18n: "elixirI18n",
843
+ runtime: "elixirHttpServer",
844
+ libraries: "elixirApplicationFramework",
845
+ documentation: "elixirDocumentation",
846
+ config: "elixirClustering",
786
847
  deploy: "elixirDeploy"
787
848
  }
788
849
  };
@@ -868,6 +929,8 @@ const STACK_TOOL_DEFINITIONS = [
868
929
  }),
869
930
  ...defineTools(ADDONS_VALUES.filter((value) => FRONTEND_APP_PLATFORM_ADDONS.has(value)), "appPlatform", "typescript", void 0, { allowMultiple: true }),
870
931
  ...defineTools(ADDONS_VALUES.filter((value) => FRONTEND_DATA_FETCHING_ADDONS.has(value)), "dataFetching", "typescript", void 0, { allowMultiple: true }),
932
+ ...defineTools(ADDONS_VALUES.filter((value) => FRONTEND_HTTP_CLIENT_ADDONS.has(value)), "httpClient", "typescript", void 0, { allowMultiple: true }),
933
+ ...defineTools(ADDONS_VALUES.filter((value) => FRONTEND_LIBRARY_ADDONS.has(value)), "libraries", "typescript", void 0, { allowMultiple: true }),
871
934
  ...defineTools(ADDONS_VALUES.filter((value) => FRONTEND_TESTING_ADDONS.has(value)), "testing", "typescript", void 0, { allowMultiple: true }),
872
935
  ...defineTools(ADDONS_VALUES.filter((value) => WORKSPACE_TOOLING_ADDONS.has(value)), "workspaceTooling", "universal", void 0, {
873
936
  allowMultiple: true,
@@ -954,6 +1017,12 @@ const STACK_TOOL_DEFINITIONS = [
954
1017
  ...defineTools(["meilisearch", "bleve"], "search", "go", "search"),
955
1018
  ...defineTools(GO_CONFIG_VALUES, "config", "go", "goConfig"),
956
1019
  ...defineTools(GO_OBSERVABILITY_VALUES, "observability", "go", "goObservability"),
1020
+ ...defineTools(GO_VALIDATION_VALUES, "validation", "go", "goValidation"),
1021
+ ...defineTools(GO_QUALITY_VALUES, "codeQuality", "go", "goQuality"),
1022
+ ...defineTools(GO_MIGRATIONS_VALUES, "migrations", "go", "goMigrations"),
1023
+ ...defineTools(GO_TEMPLATING_VALUES, "templating", "go", "goTemplating"),
1024
+ ...defineTools(GO_PROTO_TOOLING_VALUES, "buildTool", "go", "goProtoTooling"),
1025
+ ...defineTools(GO_DI_VALUES, "libraries", "go", "goDI"),
957
1026
  ...defineTools(JAVA_WEB_FRAMEWORK_VALUES, "backend", "java", "javaWebFramework"),
958
1027
  ...defineTools(JAVA_LANGUAGE_VALUES, "language", "java", "javaLanguage"),
959
1028
  ...defineTools(JAVA_BUILD_TOOL_VALUES, "buildTool", "java", "javaBuildTool"),
@@ -992,6 +1061,14 @@ const STACK_TOOL_DEFINITIONS = [
992
1061
  ...defineTools(ELIXIR_OBSERVABILITY_VALUES, "observability", "elixir", "elixirObservability"),
993
1062
  ...defineTools(ELIXIR_TESTING_VALUES, "testing", "elixir", "elixirTesting"),
994
1063
  ...defineTools(ELIXIR_QUALITY_VALUES, "codeQuality", "elixir", "elixirQuality"),
1064
+ ...defineTools(ELIXIR_I18N_VALUES, "i18n", "elixir", "elixirI18n"),
1065
+ ...defineTools(ELIXIR_HTTP_SERVER_VALUES, "runtime", "elixir", "elixirHttpServer"),
1066
+ ...defineTools(ELIXIR_APPLICATION_FRAMEWORK_VALUES, "libraries", "elixir", "elixirApplicationFramework", {
1067
+ allowMultiple: true,
1068
+ ownerless: true
1069
+ }),
1070
+ ...defineTools(ELIXIR_DOCUMENTATION_VALUES, "documentation", "elixir", "elixirDocumentation", { ownerless: true }),
1071
+ ...defineTools(ELIXIR_CLUSTERING_VALUES, "config", "elixir", "elixirClustering"),
995
1072
  ...defineTools(ELIXIR_DEPLOY_VALUES, "deploy", "elixir", "elixirDeploy"),
996
1073
  {
997
1074
  toolId: "convex",
@@ -1488,6 +1565,27 @@ function createAddonCompatibilityIssue(part, context) {
1488
1565
  const backendEcosystem = context.primaryEcosystemsByRole?.backend;
1489
1566
  const runtimeTool = context.selectedToolIdsByRole?.runtime ?? "bun";
1490
1567
  const apiTool = context.selectedToolIdsByRole?.api;
1568
+ if (part.toolId === "graphql-codegen" && !apiTool?.match(/^(garph|graphql-yoga|apollo-server)$/) && frontendTool !== "redwood") return createStackGraphIssue({
1569
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1570
+ partId: part.id,
1571
+ role: part.role,
1572
+ toolId: part.toolId,
1573
+ message: "GraphQL Code Generator requires a GraphQL API selection."
1574
+ });
1575
+ if (part.toolId === "openapi-typescript" && apiTool !== "openapi") return createStackGraphIssue({
1576
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1577
+ partId: part.id,
1578
+ role: part.role,
1579
+ toolId: part.toolId,
1580
+ message: "openapi-typescript requires the OpenAPI API selection."
1581
+ });
1582
+ if (part.toolId === "openapi-typescript" && backendTool === "self") return createStackGraphIssue({
1583
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1584
+ partId: part.id,
1585
+ role: part.role,
1586
+ toolId: part.toolId,
1587
+ message: "openapi-typescript requires a standalone backend that exposes an OpenAPI schema."
1588
+ });
1491
1589
  if (part.role === "appPlatform") {
1492
1590
  if (part.toolId === "pwa" && !hasPWACompatibleFrontend(frontendTools)) return createStackGraphIssue({
1493
1591
  code: "INCOMPATIBLE_OWNER_TOOL",
@@ -1503,8 +1601,28 @@ function createAddonCompatibilityIssue(part, context) {
1503
1601
  toolId: part.toolId,
1504
1602
  message: "Tauri requires a compatible web frontend."
1505
1603
  });
1604
+ if (["electron", "capacitor"].includes(part.toolId) && ![
1605
+ "tanstack-router",
1606
+ "react-vite",
1607
+ "vanilla-vite",
1608
+ "vue",
1609
+ "solid"
1610
+ ].includes(frontendTool ?? "")) return createStackGraphIssue({
1611
+ code: "INCOMPATIBLE_OWNER_TOOL",
1612
+ partId: part.id,
1613
+ role: part.role,
1614
+ toolId: part.toolId,
1615
+ message: `${part.toolId} requires a compatible Vite SPA frontend.`
1616
+ });
1506
1617
  }
1507
1618
  if (part.role === "dataFetching") {
1619
+ if (part.toolId === "apollo-client" && !apiTool?.match(/^(garph|graphql-yoga|apollo-server)$/)) return createStackGraphIssue({
1620
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1621
+ partId: part.id,
1622
+ role: part.role,
1623
+ toolId: part.toolId,
1624
+ message: "Apollo Client requires a GraphQL API selection."
1625
+ });
1508
1626
  if (part.toolId === "tanstack-query" && apiTool && apiTool !== "none") return createStackGraphIssue({
1509
1627
  code: "INCOMPATIBLE_GRAPH_SELECTION",
1510
1628
  partId: part.id,
@@ -1777,6 +1895,20 @@ function getStackPartCompatibilityIssue(part, context) {
1777
1895
  if (addonCompatibilityIssue) return addonCompatibilityIssue;
1778
1896
  const javaCompatibilityIssue = createJavaCompatibilityIssue(part, context);
1779
1897
  if (javaCompatibilityIssue) return javaCompatibilityIssue;
1898
+ if (part.ecosystem === "go" && part.role === "migrations" && part.toolId === "golang-migrate") {
1899
+ const databaseTool = context.primaryToolIdsByRole?.database ?? "none";
1900
+ if (![
1901
+ "sqlite",
1902
+ "postgres",
1903
+ "mysql"
1904
+ ].includes(databaseTool)) return createStackGraphIssue({
1905
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1906
+ partId: part.id,
1907
+ role: part.role,
1908
+ toolId: part.toolId,
1909
+ message: "Go migrations require SQLite, PostgreSQL, or MySQL"
1910
+ });
1911
+ }
1780
1912
  if (part.ecosystem === "python" && part.role === "api" && DJANGO_API_TOOLS.has(part.toolId)) {
1781
1913
  if (context.ownerToolId !== "django") return createStackGraphIssue({
1782
1914
  code: "INCOMPATIBLE_OWNER_TOOL",
@@ -1860,17 +1992,35 @@ function getStackPartCompatibilityIssue(part, context) {
1860
1992
  });
1861
1993
  }
1862
1994
  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
- }
1995
+ if ((context.siblingToolIdsByRole?.orm ?? context.selectedToolIdsByRole?.orm) !== "ecto-sql") return createStackGraphIssue({
1996
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
1997
+ partId: part.id,
1998
+ role: part.role,
1999
+ toolId: part.toolId,
2000
+ message: "Oban requires Ecto SQL with PostgreSQL in the current Phoenix scaffold"
2001
+ });
1873
2002
  }
2003
+ if (part.ecosystem === "elixir" && ELIXIR_SQL_REPO_REQUIRED_TOOLS.has(part.toolId) && context.ownerRole === "backend") {
2004
+ const ormTool = context.siblingToolIdsByRole?.orm ?? context.selectedToolIdsByRole?.orm;
2005
+ if (!ormTool || ![
2006
+ "ecto-sql",
2007
+ "myxql",
2008
+ "ecto_sqlite3"
2009
+ ].includes(ormTool)) return createStackGraphIssue({
2010
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
2011
+ partId: part.id,
2012
+ role: part.role,
2013
+ toolId: part.toolId,
2014
+ 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"
2015
+ });
2016
+ }
2017
+ if (part.ecosystem === "elixir" && part.role === "runtime" && part.toolId === "none" && context.ownerRole === "backend" && context.ownerToolId !== "none") return createStackGraphIssue({
2018
+ code: "INCOMPATIBLE_GRAPH_SELECTION",
2019
+ partId: part.id,
2020
+ role: part.role,
2021
+ toolId: part.toolId,
2022
+ message: "Phoenix requires Bandit or Cowboy"
2023
+ });
1874
2024
  if (part.ecosystem === "elixir" && part.toolId === "live-view-streams" && context.ownerRole === "backend") {
1875
2025
  if (context.ownerToolId !== "phoenix-live-view") return createStackGraphIssue({
1876
2026
  code: "INCOMPATIBLE_OWNER_TOOL",
@@ -2086,7 +2236,10 @@ function appendUniqueLegacyArrayValue(config, category, value) {
2086
2236
  }
2087
2237
  function getLegacyArrayCategoryForPart(part) {
2088
2238
  if (part.role === "examples") return "examples";
2089
- if (LEGACY_ADDON_GRAPH_ROLES.has(part.role) && getAddonStackPartBinding(part.toolId)) return "addons";
2239
+ if (LEGACY_ADDON_GRAPH_ROLES.has(part.role)) {
2240
+ const binding = getAddonStackPartBinding(part.toolId);
2241
+ if (binding && binding.role === part.role && binding.ecosystem === part.ecosystem) return "addons";
2242
+ }
2090
2243
  const legacyCategory = findDefinition(part)?.legacyCategory;
2091
2244
  if (legacyCategory && LEGACY_ARRAY_CATEGORIES.has(legacyCategory)) return legacyCategory;
2092
2245
  }
@@ -2379,4 +2532,4 @@ function validateStackParts(parts) {
2379
2532
 
2380
2533
  //#endregion
2381
2534
  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
2535
+ //# sourceMappingURL=stack-graph-C8r3fTh4.mjs.map