@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.
- package/dist/{defaults-Cpkx-Eu7.d.mts → defaults-BT-WhLPX.d.mts} +2 -2
- package/dist/defaults-BT-WhLPX.d.mts.map +1 -0
- package/dist/{defaults-DNnZX9er.mjs → defaults-Cl16mM84.mjs} +21 -1
- package/dist/defaults-Cl16mM84.mjs.map +1 -0
- package/dist/defaults.d.mts +3 -3
- package/dist/defaults.mjs +1 -1
- package/dist/index.d.mts +7 -7
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +194 -5
- package/dist/index.mjs.map +1 -1
- package/dist/json-schema.d.mts +3076 -364
- package/dist/json-schema.d.mts.map +1 -1
- package/dist/json-schema.mjs +102 -2
- package/dist/json-schema.mjs.map +1 -1
- package/dist/{schemas-BXDvWDRp.mjs → schemas-CprYz5Sh.mjs} +301 -8
- package/dist/schemas-CprYz5Sh.mjs.map +1 -0
- package/dist/{schemas-DOb4t_el.d.mts → schemas-q5-QVYJy.d.mts} +2945 -642
- package/dist/schemas-q5-QVYJy.d.mts.map +1 -0
- package/dist/schemas.d.mts +2 -2
- package/dist/schemas.mjs +2 -2
- package/dist/{stack-graph-0MDSuSPQ.d.mts → stack-graph-CgFYIeir.d.mts} +2 -2
- package/dist/stack-graph-CgFYIeir.d.mts.map +1 -0
- package/dist/{stack-graph-BAad0vv4.mjs → stack-graph-DiLi3WuL.mjs} +228 -33
- package/dist/stack-graph-DiLi3WuL.mjs.map +1 -0
- package/dist/stack-graph.d.mts +3 -3
- package/dist/stack-graph.mjs +2 -2
- package/dist/{stack-translation-DwSS9Vc2.mjs → stack-translation-Ay-_1mNB.mjs} +1117 -98
- package/dist/stack-translation-Ay-_1mNB.mjs.map +1 -0
- package/dist/{stack-translation-CnNmU8Z5.d.mts → stack-translation-CU1kpqq3.d.mts} +53 -13
- package/dist/stack-translation-CU1kpqq3.d.mts.map +1 -0
- package/dist/stack-translation.d.mts +4 -4
- package/dist/stack-translation.mjs +3 -3
- package/dist/types-Cp7krSdb.d.mts +176 -0
- package/dist/types-Cp7krSdb.d.mts.map +1 -0
- package/dist/types.d.mts +3 -3
- package/package.json +2 -2
- package/dist/defaults-Cpkx-Eu7.d.mts.map +0 -1
- package/dist/defaults-DNnZX9er.mjs.map +0 -1
- package/dist/schemas-BXDvWDRp.mjs.map +0 -1
- package/dist/schemas-DOb4t_el.d.mts.map +0 -1
- package/dist/stack-graph-0MDSuSPQ.d.mts.map +0 -1
- package/dist/stack-graph-BAad0vv4.mjs.map +0 -1
- package/dist/stack-translation-CnNmU8Z5.d.mts.map +0 -1
- package/dist/stack-translation-DwSS9Vc2.mjs.map +0 -1
- package/dist/types-CcWal512.d.mts +0 -156
- package/dist/types-CcWal512.d.mts.map +0 -1
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { $
|
|
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"
|
|
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: [
|
|
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
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
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)
|
|
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")
|
|
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-
|
|
2577
|
+
//# sourceMappingURL=stack-graph-DiLi3WuL.mjs.map
|