@better-fullstack/types 2.1.7 → 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.
- package/dist/{defaults-DNnZX9er.mjs → defaults-DgL5YPQY.mjs} +12 -1
- package/dist/defaults-DgL5YPQY.mjs.map +1 -0
- package/dist/{defaults-Cpkx-Eu7.d.mts → defaults-DyNR1d-V.d.mts} +2 -2
- package/dist/defaults-DyNR1d-V.d.mts.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 +110 -5
- package/dist/index.mjs.map +1 -1
- package/dist/json-schema.d.mts +1814 -362
- package/dist/json-schema.d.mts.map +1 -1
- package/dist/json-schema.mjs +94 -2
- package/dist/json-schema.mjs.map +1 -1
- package/dist/{schemas-DOb4t_el.d.mts → schemas-D9kkuJz7.d.mts} +1811 -645
- package/dist/schemas-D9kkuJz7.d.mts.map +1 -0
- package/dist/{schemas-BXDvWDRp.mjs → schemas-l7hOhH8U.mjs} +161 -6
- package/dist/schemas-l7hOhH8U.mjs.map +1 -0
- package/dist/schemas.d.mts +2 -2
- package/dist/schemas.mjs +2 -2
- package/dist/{stack-graph-BAad0vv4.mjs → stack-graph-C8r3fTh4.mjs} +180 -27
- package/dist/stack-graph-C8r3fTh4.mjs.map +1 -0
- package/dist/{stack-graph-0MDSuSPQ.d.mts → stack-graph-F6UKYYR0.d.mts} +2 -2
- package/dist/{stack-graph-0MDSuSPQ.d.mts.map → stack-graph-F6UKYYR0.d.mts.map} +1 -1
- package/dist/stack-graph.d.mts +3 -3
- package/dist/stack-graph.mjs +2 -2
- package/dist/{stack-translation-Dau06ig9.d.mts → stack-translation-BNHNx5_b.d.mts} +46 -10
- package/dist/stack-translation-BNHNx5_b.d.mts.map +1 -0
- package/dist/{stack-translation-DncO452_.mjs → stack-translation-Kr0TyRAm.mjs} +755 -92
- package/dist/stack-translation-Kr0TyRAm.mjs.map +1 -0
- package/dist/stack-translation.d.mts +4 -4
- package/dist/stack-translation.mjs +3 -3
- package/dist/{types-CcWal512.d.mts → types-C7RpHf2e.d.mts} +14 -3
- package/dist/types-C7RpHf2e.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-BAad0vv4.mjs.map +0 -1
- package/dist/stack-translation-Dau06ig9.d.mts.map +0 -1
- package/dist/stack-translation-DncO452_.mjs.map +0 -1
- package/dist/types-CcWal512.d.mts.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { $n as
|
|
2
|
-
import { E as requiresChatSdkVercelAIForExamples, S as hasTauriCompatibleFrontend, _ as UI_LIBRARY_COMPATIBILITY, a as getAddonStackPartBinding, b as hasPWACompatibleFrontend, f as parseStackPartSpecs, h as validateStackParts, i as formatStackPartSpec, m as stackPartsToLegacyProjectConfigPartial, s as getStackPartCompatibilityIssueForPart, u as legacyProjectConfigToStackParts, v as getUnsupportedWebDeployFrontend, x as hasTanStackAICompatibleFrontend } from "./stack-graph-
|
|
3
|
-
import { t as createCliDefaultProjectConfigBase } from "./defaults-
|
|
1
|
+
import { $i as SERVER_DEPLOY_VALUES, $n as JAVA_AUTH_VALUES, $r as PYTHON_WEB_FRAMEWORK_VALUES, A as CSS_FRAMEWORK_VALUES, Aa as VERSION_CHANNEL_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, Fa as WORKSPACE_SHAPE_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, Rr as PACKAGE_MANAGER_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, aa as SHADCN_RADIUS_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, ea as SHADCN_BASE_COLOR_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, ia as SHADCN_ICON_LIBRARY_VALUES, in as FILE_STORAGE_VALUES, ir as JAVA_ORM_VALUES, ji as RUST_ORM_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, na as SHADCN_COLOR_THEME_VALUES, nr as JAVA_LIBRARIES_VALUES, o as ANIMATION_VALUES, oa as SHADCN_STYLE_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, r as AI_DOCS_VALUES, ra as SHADCN_FONT_VALUES, rn as FEATURE_FLAGS_VALUES, rr as JAVA_LOGGING_VALUES, sa as STATE_MANAGEMENT_VALUES, sr as JOB_QUEUE_VALUES, ta as SHADCN_BASE_VALUES, tr as JAVA_LANGUAGE_VALUES, u as ASTRO_INTEGRATION_VALUES, ut as ELIXIR_APPLICATION_FRAMEWORK_VALUES, 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, xt as ELIXIR_JSON_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
|
+
import { E as requiresChatSdkVercelAIForExamples, S as hasTauriCompatibleFrontend, _ as UI_LIBRARY_COMPATIBILITY, a as getAddonStackPartBinding, b as hasPWACompatibleFrontend, f as parseStackPartSpecs, h as validateStackParts, i as formatStackPartSpec, m as stackPartsToLegacyProjectConfigPartial, s as getStackPartCompatibilityIssueForPart, u as legacyProjectConfigToStackParts, v as getUnsupportedWebDeployFrontend, x as hasTanStackAICompatibleFrontend } from "./stack-graph-C8r3fTh4.mjs";
|
|
3
|
+
import { t as createCliDefaultProjectConfigBase } from "./defaults-DgL5YPQY.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/capabilities.ts
|
|
6
6
|
const CAPABILITY_DEFINITIONS = { auth: [
|
|
@@ -85,6 +85,14 @@ const CAPABILITY_DEFINITIONS = { auth: [
|
|
|
85
85
|
icon: "https://cdn.simpleicons.org/kinde/00A9FF",
|
|
86
86
|
color: "from-sky-400 to-cyan-600"
|
|
87
87
|
},
|
|
88
|
+
{
|
|
89
|
+
id: "passport",
|
|
90
|
+
label: "Passport.js",
|
|
91
|
+
description: "Strategy-based authentication middleware for Express applications",
|
|
92
|
+
promptHint: "Passport.js with GitHub OAuth for Express",
|
|
93
|
+
icon: "https://cdn.simpleicons.org/passport/34E27A",
|
|
94
|
+
color: "from-emerald-400 to-green-600"
|
|
95
|
+
},
|
|
88
96
|
{
|
|
89
97
|
id: "none",
|
|
90
98
|
label: "No Auth",
|
|
@@ -160,6 +168,7 @@ function getAuthDisabledReason(context, optionId) {
|
|
|
160
168
|
if (optionId === "go-better-auth") return ecosystem === "go" ? null : "GoBetterAuth is available only for Go stacks";
|
|
161
169
|
if (ecosystem === "go") return "Go stacks currently support GoBetterAuth only";
|
|
162
170
|
if (ecosystem !== "typescript") return `${capitalizeFirst(ecosystem)} stacks do not support auth integrations yet`;
|
|
171
|
+
if (webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend))) return "Auth client integrations are not yet wired for standalone Vue or Vanilla Vite frontends";
|
|
163
172
|
if (backend === "none") return "No backend selected";
|
|
164
173
|
if (optionId === "better-auth" || optionId === "better-auth-organizations") {
|
|
165
174
|
if (optionId === "better-auth-organizations" && backend === "convex") return "Better Auth organizations is currently generated for non-Convex Better Auth stacks";
|
|
@@ -196,6 +205,7 @@ function getAuthDisabledReason(context, optionId) {
|
|
|
196
205
|
}
|
|
197
206
|
return "In Better-Fullstack, Supabase Auth is currently supported only with the 'self' backend (fullstack Next.js or TanStack Start)";
|
|
198
207
|
}
|
|
208
|
+
if (optionId === "passport") return backend === "express" ? null : "Passport.js is currently scaffolded for the Express backend";
|
|
199
209
|
const nextOnlyLabel = getNextOnlyAuthLabel(optionId);
|
|
200
210
|
if (backend !== "self" && backend !== "self-next") return `In Better-Fullstack, ${nextOnlyLabel} is currently supported only with the 'self' backend (fullstack Next.js)`;
|
|
201
211
|
if (!hasNextJs) return `In Better-Fullstack, ${nextOnlyLabel} currently requires the Next.js frontend`;
|
|
@@ -239,6 +249,7 @@ function normalizeCapabilitySelection(capability, context, optionId) {
|
|
|
239
249
|
const TYPESCRIPT_CATEGORY_ORDER = [
|
|
240
250
|
"webFrontend",
|
|
241
251
|
"astroIntegration",
|
|
252
|
+
"appShells",
|
|
242
253
|
"cssFramework",
|
|
243
254
|
"uiLibrary",
|
|
244
255
|
"shadcnBase",
|
|
@@ -366,6 +377,12 @@ const GO_CATEGORY_ORDER = [
|
|
|
366
377
|
"goCaching",
|
|
367
378
|
"goConfig",
|
|
368
379
|
"goObservability",
|
|
380
|
+
"goValidation",
|
|
381
|
+
"goQuality",
|
|
382
|
+
"goMigrations",
|
|
383
|
+
"goTemplating",
|
|
384
|
+
"goProtoTooling",
|
|
385
|
+
"goDI",
|
|
369
386
|
"auth",
|
|
370
387
|
"email",
|
|
371
388
|
"observability",
|
|
@@ -424,6 +441,11 @@ const ELIXIR_CATEGORY_ORDER = [
|
|
|
424
441
|
"elixirObservability",
|
|
425
442
|
"elixirTesting",
|
|
426
443
|
"elixirQuality",
|
|
444
|
+
"elixirI18n",
|
|
445
|
+
"elixirHttpServer",
|
|
446
|
+
"elixirApplicationFramework",
|
|
447
|
+
"elixirDocumentation",
|
|
448
|
+
"elixirClustering",
|
|
427
449
|
"elixirDeploy",
|
|
428
450
|
"elixirLibraries",
|
|
429
451
|
"aiDocs",
|
|
@@ -455,6 +477,8 @@ function getCategoryOrderForEcosystem(ecosystem) {
|
|
|
455
477
|
function getCategoryDisplayName(categoryKey) {
|
|
456
478
|
const customName = {
|
|
457
479
|
i18n: "Internationalization (i18n)",
|
|
480
|
+
appShells: "App Platforms",
|
|
481
|
+
appPlatforms: "Addons",
|
|
458
482
|
mobileNavigation: "Mobile Navigation",
|
|
459
483
|
mobileUI: "Mobile UI",
|
|
460
484
|
mobileStorage: "Mobile Storage",
|
|
@@ -503,6 +527,12 @@ function getCategoryDisplayName(categoryKey) {
|
|
|
503
527
|
goCaching: "Go Caching",
|
|
504
528
|
goConfig: "Go Config",
|
|
505
529
|
goObservability: "Go Observability",
|
|
530
|
+
goValidation: "Go Validation",
|
|
531
|
+
goQuality: "Go Code Quality",
|
|
532
|
+
goMigrations: "Go Database Migrations",
|
|
533
|
+
goTemplating: "Go Templating",
|
|
534
|
+
goProtoTooling: "Go Protobuf Tooling",
|
|
535
|
+
goDI: "Go Dependency Injection",
|
|
506
536
|
javaLanguage: "Java Language",
|
|
507
537
|
javaWebFramework: "Java Web Framework",
|
|
508
538
|
javaBuildTool: "Java Build Tool",
|
|
@@ -537,6 +567,11 @@ function getCategoryDisplayName(categoryKey) {
|
|
|
537
567
|
elixirObservability: "Elixir Observability",
|
|
538
568
|
elixirTesting: "Elixir Testing",
|
|
539
569
|
elixirQuality: "Elixir Code Quality",
|
|
570
|
+
elixirI18n: "Elixir Localization",
|
|
571
|
+
elixirHttpServer: "Elixir HTTP Server",
|
|
572
|
+
elixirApplicationFramework: "Elixir Application Framework",
|
|
573
|
+
elixirDocumentation: "Elixir Documentation",
|
|
574
|
+
elixirClustering: "Elixir Clustering",
|
|
540
575
|
elixirDeploy: "Elixir Deploy",
|
|
541
576
|
elixirLibraries: "Elixir Libraries"
|
|
542
577
|
}[categoryKey];
|
|
@@ -548,6 +583,8 @@ const WEB_FRONTEND_VALUES = [
|
|
|
548
583
|
"tanstack-router",
|
|
549
584
|
"react-router",
|
|
550
585
|
"react-vite",
|
|
586
|
+
"vanilla-vite",
|
|
587
|
+
"vue",
|
|
551
588
|
"tanstack-start",
|
|
552
589
|
"next",
|
|
553
590
|
"vinext",
|
|
@@ -591,6 +628,8 @@ const BACKEND_BUILDER_VALUES = [
|
|
|
591
628
|
];
|
|
592
629
|
const CODE_QUALITY_VALUES = [
|
|
593
630
|
"biome",
|
|
631
|
+
"eslint",
|
|
632
|
+
"prettier",
|
|
594
633
|
"oxlint",
|
|
595
634
|
"ultracite",
|
|
596
635
|
"lefthook",
|
|
@@ -598,13 +637,10 @@ const CODE_QUALITY_VALUES = [
|
|
|
598
637
|
"ruler"
|
|
599
638
|
];
|
|
600
639
|
const DOCUMENTATION_VALUES = ["starlight", "fumadocs"];
|
|
640
|
+
const APP_SHELL_VALUES = APP_PLATFORM_ADDON_VALUES;
|
|
601
641
|
const APP_PLATFORM_VALUES = [
|
|
602
642
|
"turborepo",
|
|
603
643
|
"nx",
|
|
604
|
-
"pwa",
|
|
605
|
-
"tauri",
|
|
606
|
-
"wxt",
|
|
607
|
-
"opentui",
|
|
608
644
|
"mcp",
|
|
609
645
|
"skills",
|
|
610
646
|
"msw",
|
|
@@ -618,7 +654,12 @@ const APP_PLATFORM_VALUES = [
|
|
|
618
654
|
"backend-utils",
|
|
619
655
|
"devcontainer",
|
|
620
656
|
"docker-compose",
|
|
621
|
-
"github-actions"
|
|
657
|
+
"github-actions",
|
|
658
|
+
"axios",
|
|
659
|
+
"firebase",
|
|
660
|
+
"graphql-codegen",
|
|
661
|
+
"openapi-typescript",
|
|
662
|
+
"apollo-client"
|
|
622
663
|
];
|
|
623
664
|
const EXAMPLE_VALUES = ["ai", "chat-sdk"];
|
|
624
665
|
const BOOLEAN_OPTION_VALUES = ["true", "false"];
|
|
@@ -627,6 +668,7 @@ const MULTI_SELECT_CATEGORIES = new Set([
|
|
|
627
668
|
"nativeFrontend",
|
|
628
669
|
"codeQuality",
|
|
629
670
|
"documentation",
|
|
671
|
+
"appShells",
|
|
630
672
|
"appPlatforms",
|
|
631
673
|
"examples",
|
|
632
674
|
"aiDocs",
|
|
@@ -687,6 +729,7 @@ const CATEGORY_VALUE_IDS = {
|
|
|
687
729
|
mobileDeepLinking: MOBILE_DEEP_LINKING_VALUES,
|
|
688
730
|
codeQuality: CODE_QUALITY_VALUES,
|
|
689
731
|
documentation: DOCUMENTATION_VALUES,
|
|
732
|
+
appShells: APP_SHELL_VALUES,
|
|
690
733
|
appPlatforms: APP_PLATFORM_VALUES,
|
|
691
734
|
packageManager: PACKAGE_MANAGER_VALUES,
|
|
692
735
|
workspaceShape: WORKSPACE_SHAPE_VALUES,
|
|
@@ -744,6 +787,12 @@ const CATEGORY_VALUE_IDS = {
|
|
|
744
787
|
goCaching: GO_CACHING_VALUES,
|
|
745
788
|
goConfig: GO_CONFIG_VALUES,
|
|
746
789
|
goObservability: GO_OBSERVABILITY_VALUES,
|
|
790
|
+
goValidation: GO_VALIDATION_VALUES,
|
|
791
|
+
goQuality: GO_QUALITY_VALUES,
|
|
792
|
+
goMigrations: GO_MIGRATIONS_VALUES,
|
|
793
|
+
goTemplating: GO_TEMPLATING_VALUES,
|
|
794
|
+
goProtoTooling: GO_PROTO_TOOLING_VALUES,
|
|
795
|
+
goDI: GO_DI_VALUES,
|
|
747
796
|
javaLanguage: JAVA_LANGUAGE_VALUES,
|
|
748
797
|
javaWebFramework: JAVA_WEB_FRAMEWORK_VALUES,
|
|
749
798
|
javaBuildTool: JAVA_BUILD_TOOL_VALUES,
|
|
@@ -778,6 +827,11 @@ const CATEGORY_VALUE_IDS = {
|
|
|
778
827
|
elixirObservability: ELIXIR_OBSERVABILITY_VALUES,
|
|
779
828
|
elixirTesting: ELIXIR_TESTING_VALUES,
|
|
780
829
|
elixirQuality: ELIXIR_QUALITY_VALUES,
|
|
830
|
+
elixirI18n: ELIXIR_I18N_VALUES,
|
|
831
|
+
elixirHttpServer: ELIXIR_HTTP_SERVER_VALUES,
|
|
832
|
+
elixirApplicationFramework: ELIXIR_APPLICATION_FRAMEWORK_VALUES,
|
|
833
|
+
elixirDocumentation: ELIXIR_DOCUMENTATION_VALUES,
|
|
834
|
+
elixirClustering: ELIXIR_CLUSTERING_VALUES,
|
|
781
835
|
elixirDeploy: ELIXIR_DEPLOY_VALUES,
|
|
782
836
|
elixirLibraries: ELIXIR_LIBRARIES_VALUES
|
|
783
837
|
};
|
|
@@ -793,6 +847,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
793
847
|
next: "Next.js",
|
|
794
848
|
vinext: "Vinext",
|
|
795
849
|
"react-vite": "React + Vite",
|
|
850
|
+
"vanilla-vite": "Vite (Vanilla TypeScript)",
|
|
851
|
+
vue: "Vue 3 + Vite",
|
|
796
852
|
svelte: "SvelteKit",
|
|
797
853
|
redwood: "RedwoodJS"
|
|
798
854
|
},
|
|
@@ -858,17 +914,20 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
858
914
|
cms: {
|
|
859
915
|
tinacms: "TinaCMS",
|
|
860
916
|
directus: "Directus",
|
|
861
|
-
keystatic: "Keystatic"
|
|
917
|
+
keystatic: "Keystatic",
|
|
918
|
+
contentful: "Contentful"
|
|
862
919
|
},
|
|
863
920
|
auth: {
|
|
864
921
|
"better-auth-organizations": "Better Auth + Organizations",
|
|
865
922
|
auth0: "Auth0",
|
|
866
923
|
workos: "WorkOS AuthKit",
|
|
867
|
-
kinde: "Kinde"
|
|
924
|
+
kinde: "Kinde",
|
|
925
|
+
passport: "Passport.js"
|
|
868
926
|
},
|
|
869
927
|
payments: {
|
|
870
928
|
"lemon-squeezy": "Lemon Squeezy",
|
|
871
|
-
dodo: "Dodo Payments"
|
|
929
|
+
dodo: "Dodo Payments",
|
|
930
|
+
paypal: "PayPal"
|
|
872
931
|
},
|
|
873
932
|
email: {
|
|
874
933
|
"react-email": "React Email",
|
|
@@ -910,9 +969,13 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
910
969
|
typebox: "TypeBox",
|
|
911
970
|
"effect-schema": "Effect Schema"
|
|
912
971
|
},
|
|
913
|
-
testing: {
|
|
972
|
+
testing: {
|
|
973
|
+
"vitest-playwright": "Vitest + Playwright",
|
|
974
|
+
mocha: "Mocha"
|
|
975
|
+
},
|
|
914
976
|
realtime: {
|
|
915
977
|
"socket-io": "Socket.IO",
|
|
978
|
+
ws: "ws",
|
|
916
979
|
yjs: "Y.js"
|
|
917
980
|
},
|
|
918
981
|
jobQueue: {
|
|
@@ -947,7 +1010,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
947
1010
|
cssFramework: {
|
|
948
1011
|
tailwind: "Tailwind CSS",
|
|
949
1012
|
scss: "SCSS",
|
|
950
|
-
"postcss-only": "PostCSS Only"
|
|
1013
|
+
"postcss-only": "PostCSS Only",
|
|
1014
|
+
"styled-components": "styled-components"
|
|
951
1015
|
},
|
|
952
1016
|
uiLibrary: {
|
|
953
1017
|
"shadcn-ui": "shadcn/ui",
|
|
@@ -973,7 +1037,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
973
1037
|
},
|
|
974
1038
|
analytics: {
|
|
975
1039
|
plausible: "Plausible",
|
|
976
|
-
umami: "Umami"
|
|
1040
|
+
umami: "Umami",
|
|
1041
|
+
ga4: "Google Analytics 4"
|
|
977
1042
|
},
|
|
978
1043
|
mobileNavigation: {
|
|
979
1044
|
"expo-router": "Expo Router",
|
|
@@ -996,6 +1061,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
996
1061
|
mobileDeepLinking: { "expo-linking": "Expo Linking" },
|
|
997
1062
|
codeQuality: {
|
|
998
1063
|
biome: "Biome",
|
|
1064
|
+
eslint: "ESLint",
|
|
1065
|
+
prettier: "Prettier",
|
|
999
1066
|
oxlint: "Oxlint",
|
|
1000
1067
|
ultracite: "Ultracite",
|
|
1001
1068
|
lefthook: "Lefthook",
|
|
@@ -1006,10 +1073,15 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1006
1073
|
starlight: "Starlight",
|
|
1007
1074
|
fumadocs: "Fumadocs"
|
|
1008
1075
|
},
|
|
1009
|
-
|
|
1076
|
+
appShells: {
|
|
1010
1077
|
pwa: "PWA",
|
|
1078
|
+
tauri: "Tauri",
|
|
1079
|
+
electron: "Electron",
|
|
1080
|
+
capacitor: "Capacitor",
|
|
1011
1081
|
wxt: "WXT",
|
|
1012
|
-
opentui: "OpenTUI"
|
|
1082
|
+
opentui: "OpenTUI"
|
|
1083
|
+
},
|
|
1084
|
+
appPlatforms: {
|
|
1013
1085
|
mcp: "MCP",
|
|
1014
1086
|
msw: "MSW",
|
|
1015
1087
|
swr: "SWR",
|
|
@@ -1020,7 +1092,12 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1020
1092
|
"tanstack-pacer": "TanStack Pacer",
|
|
1021
1093
|
devcontainer: "DevContainer",
|
|
1022
1094
|
"docker-compose": "Docker Compose",
|
|
1023
|
-
"github-actions": "GitHub Actions"
|
|
1095
|
+
"github-actions": "GitHub Actions",
|
|
1096
|
+
axios: "Axios",
|
|
1097
|
+
firebase: "Firebase JS SDK",
|
|
1098
|
+
"graphql-codegen": "GraphQL Code Generator",
|
|
1099
|
+
"openapi-typescript": "openapi-typescript",
|
|
1100
|
+
"apollo-client": "Apollo Client"
|
|
1024
1101
|
},
|
|
1025
1102
|
versionChannel: {
|
|
1026
1103
|
stable: "Stable",
|
|
@@ -1036,6 +1113,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1036
1113
|
voltagent: "VoltAgent",
|
|
1037
1114
|
langgraph: "LangGraph.js",
|
|
1038
1115
|
"openai-agents": "OpenAI Agents SDK",
|
|
1116
|
+
"openai-sdk": "OpenAI SDK",
|
|
1117
|
+
"anthropic-sdk": "Anthropic SDK",
|
|
1039
1118
|
"google-adk": "Google ADK",
|
|
1040
1119
|
modelfusion: "ModelFusion",
|
|
1041
1120
|
langchain: "LangChain",
|
|
@@ -1104,20 +1183,27 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1104
1183
|
"actix-web": "Actix-web",
|
|
1105
1184
|
rocket: "Rocket",
|
|
1106
1185
|
poem: "Poem",
|
|
1107
|
-
loco: "Loco"
|
|
1186
|
+
loco: "Loco",
|
|
1187
|
+
warp: "Warp",
|
|
1188
|
+
salvo: "Salvo"
|
|
1108
1189
|
},
|
|
1109
1190
|
rustFrontend: {
|
|
1110
1191
|
leptos: "Leptos",
|
|
1111
|
-
dioxus: "Dioxus"
|
|
1192
|
+
dioxus: "Dioxus",
|
|
1193
|
+
yew: "Yew"
|
|
1112
1194
|
},
|
|
1113
1195
|
rustOrm: {
|
|
1114
1196
|
"sea-orm": "SeaORM",
|
|
1115
1197
|
sqlx: "SQLx",
|
|
1116
|
-
diesel: "Diesel"
|
|
1198
|
+
diesel: "Diesel",
|
|
1199
|
+
mongodb: "MongoDB Rust Driver",
|
|
1200
|
+
rusqlite: "rusqlite",
|
|
1201
|
+
"tokio-postgres": "tokio-postgres"
|
|
1117
1202
|
},
|
|
1118
1203
|
rustApi: {
|
|
1119
1204
|
"async-graphql": "async-graphql",
|
|
1120
|
-
tonic: "Tonic"
|
|
1205
|
+
tonic: "Tonic",
|
|
1206
|
+
jsonrpsee: "jsonrpsee"
|
|
1121
1207
|
},
|
|
1122
1208
|
rustCli: {
|
|
1123
1209
|
clap: "Clap",
|
|
@@ -1140,7 +1226,14 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1140
1226
|
"tokio-test": "Tokio Test",
|
|
1141
1227
|
mockall: "Mockall",
|
|
1142
1228
|
proptest: "Proptest",
|
|
1143
|
-
insta: "Insta"
|
|
1229
|
+
insta: "Insta",
|
|
1230
|
+
rand: "rand",
|
|
1231
|
+
regex: "regex",
|
|
1232
|
+
rayon: "Rayon",
|
|
1233
|
+
itertools: "Itertools",
|
|
1234
|
+
rstest: "rstest",
|
|
1235
|
+
"cargo-nextest": "cargo-nextest",
|
|
1236
|
+
"cargo-audit": "cargo-audit"
|
|
1144
1237
|
},
|
|
1145
1238
|
rustLogging: {
|
|
1146
1239
|
tracing: "Tracing",
|
|
@@ -1156,14 +1249,24 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1156
1249
|
},
|
|
1157
1250
|
rustAuth: {
|
|
1158
1251
|
oauth2: "OAuth2",
|
|
1159
|
-
torii: "Torii"
|
|
1252
|
+
torii: "Torii",
|
|
1253
|
+
openidconnect: "OpenID Connect",
|
|
1254
|
+
"tower-sessions": "tower-sessions"
|
|
1160
1255
|
},
|
|
1161
1256
|
rustRealtime: { "tokio-tungstenite": "tokio-tungstenite" },
|
|
1162
|
-
rustMessageQueue: {
|
|
1163
|
-
|
|
1257
|
+
rustMessageQueue: {
|
|
1258
|
+
lapin: "Lapin (RabbitMQ)",
|
|
1259
|
+
rdkafka: "rdkafka (Kafka)",
|
|
1260
|
+
"async-nats": "async-nats"
|
|
1261
|
+
},
|
|
1262
|
+
rustObservability: {
|
|
1263
|
+
opentelemetry: "OpenTelemetry",
|
|
1264
|
+
metrics: "metrics"
|
|
1265
|
+
},
|
|
1164
1266
|
rustTemplating: {
|
|
1165
1267
|
askama: "Askama",
|
|
1166
|
-
tera: "Tera"
|
|
1268
|
+
tera: "Tera",
|
|
1269
|
+
minijinja: "MiniJinja"
|
|
1167
1270
|
},
|
|
1168
1271
|
pythonWebFramework: {
|
|
1169
1272
|
fastapi: "FastAPI",
|
|
@@ -1239,17 +1342,24 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1239
1342
|
echo: "Echo",
|
|
1240
1343
|
fiber: "Fiber",
|
|
1241
1344
|
chi: "Chi",
|
|
1242
|
-
stdlib: "net/http"
|
|
1345
|
+
stdlib: "net/http",
|
|
1346
|
+
"go-zero": "go-zero",
|
|
1347
|
+
kratos: "Kratos",
|
|
1348
|
+
httprouter: "HttpRouter"
|
|
1243
1349
|
},
|
|
1244
1350
|
goOrm: {
|
|
1245
1351
|
gorm: "GORM",
|
|
1246
1352
|
sqlc: "sqlc",
|
|
1247
1353
|
ent: "Ent",
|
|
1248
|
-
bun: "Bun"
|
|
1354
|
+
bun: "Bun",
|
|
1355
|
+
sqlx: "sqlx"
|
|
1249
1356
|
},
|
|
1250
1357
|
goApi: {
|
|
1251
1358
|
"grpc-go": "gRPC-Go",
|
|
1252
|
-
gqlgen: "gqlgen"
|
|
1359
|
+
gqlgen: "gqlgen",
|
|
1360
|
+
"grpc-gateway": "grpc-gateway",
|
|
1361
|
+
"connect-go": "Connect-Go",
|
|
1362
|
+
"oapi-codegen": "oapi-codegen"
|
|
1253
1363
|
},
|
|
1254
1364
|
goCli: {
|
|
1255
1365
|
cobra: "Cobra",
|
|
@@ -1265,11 +1375,15 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1265
1375
|
goAuth: {
|
|
1266
1376
|
casbin: "Casbin",
|
|
1267
1377
|
jwt: "golang-jwt",
|
|
1268
|
-
goth: "Goth"
|
|
1378
|
+
goth: "Goth",
|
|
1379
|
+
oauth2: "golang.org/x/oauth2"
|
|
1269
1380
|
},
|
|
1270
1381
|
goTesting: {
|
|
1271
1382
|
testify: "Testify",
|
|
1272
|
-
gomock: "GoMock"
|
|
1383
|
+
gomock: "GoMock",
|
|
1384
|
+
testcontainers: "Testcontainers for Go",
|
|
1385
|
+
"ginkgo-gomega": "Ginkgo + Gomega",
|
|
1386
|
+
mockery: "mockery"
|
|
1273
1387
|
},
|
|
1274
1388
|
goRealtime: {
|
|
1275
1389
|
"gorilla-websocket": "Gorilla WebSocket",
|
|
@@ -1277,7 +1391,9 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1277
1391
|
},
|
|
1278
1392
|
goMessageQueue: {
|
|
1279
1393
|
nats: "NATS",
|
|
1280
|
-
watermill: "Watermill"
|
|
1394
|
+
watermill: "Watermill",
|
|
1395
|
+
"kafka-go": "kafka-go",
|
|
1396
|
+
asynq: "Asynq"
|
|
1281
1397
|
},
|
|
1282
1398
|
goCaching: {
|
|
1283
1399
|
redis: "go-redis",
|
|
@@ -1287,7 +1403,16 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1287
1403
|
viper: "Viper",
|
|
1288
1404
|
koanf: "Koanf"
|
|
1289
1405
|
},
|
|
1290
|
-
goObservability: {
|
|
1406
|
+
goObservability: {
|
|
1407
|
+
opentelemetry: "OpenTelemetry",
|
|
1408
|
+
prometheus: "Prometheus"
|
|
1409
|
+
},
|
|
1410
|
+
goValidation: { validator: "go-playground/validator" },
|
|
1411
|
+
goQuality: { "golangci-lint": "golangci-lint" },
|
|
1412
|
+
goMigrations: { "golang-migrate": "golang-migrate" },
|
|
1413
|
+
goTemplating: { templ: "templ" },
|
|
1414
|
+
goProtoTooling: { buf: "Buf" },
|
|
1415
|
+
goDI: { fx: "Uber Fx" },
|
|
1291
1416
|
javaLanguage: {
|
|
1292
1417
|
java: "Java",
|
|
1293
1418
|
kotlin: "Kotlin"
|
|
@@ -1404,21 +1529,28 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1404
1529
|
},
|
|
1405
1530
|
elixirOrm: {
|
|
1406
1531
|
ecto: "Ecto",
|
|
1407
|
-
"ecto-sql": "Ecto SQL"
|
|
1532
|
+
"ecto-sql": "Ecto SQL",
|
|
1533
|
+
myxql: "MyXQL",
|
|
1534
|
+
ecto_sqlite3: "ecto_sqlite3"
|
|
1408
1535
|
},
|
|
1409
1536
|
elixirAuth: {
|
|
1410
1537
|
"phx-gen-auth": "phx.gen.auth",
|
|
1411
1538
|
ueberauth: "Ueberauth",
|
|
1412
|
-
guardian: "Guardian"
|
|
1539
|
+
guardian: "Guardian",
|
|
1540
|
+
pow: "Pow"
|
|
1413
1541
|
},
|
|
1414
1542
|
elixirApi: {
|
|
1415
1543
|
rest: "Phoenix REST",
|
|
1416
1544
|
absinthe: "Absinthe GraphQL",
|
|
1417
|
-
grpc: "gRPC (grpc-elixir)"
|
|
1545
|
+
grpc: "gRPC (grpc-elixir)",
|
|
1546
|
+
open_api_spex: "OpenApiSpex"
|
|
1418
1547
|
},
|
|
1419
1548
|
elixirLibraries: {
|
|
1420
1549
|
broadway: "Broadway",
|
|
1421
|
-
nx: "Nx (Numerical Elixir)"
|
|
1550
|
+
nx: "Nx (Numerical Elixir)",
|
|
1551
|
+
ex_aws: "ExAws",
|
|
1552
|
+
floki: "Floki",
|
|
1553
|
+
rustler: "Rustler"
|
|
1422
1554
|
},
|
|
1423
1555
|
elixirRealtime: {
|
|
1424
1556
|
channels: "Phoenix Channels",
|
|
@@ -1436,30 +1568,48 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1436
1568
|
},
|
|
1437
1569
|
elixirHttp: {
|
|
1438
1570
|
req: "Req",
|
|
1439
|
-
finch: "Finch"
|
|
1571
|
+
finch: "Finch",
|
|
1572
|
+
tesla: "Tesla"
|
|
1440
1573
|
},
|
|
1441
1574
|
elixirJson: { jason: "Jason" },
|
|
1442
|
-
elixirEmail: {
|
|
1575
|
+
elixirEmail: {
|
|
1576
|
+
swoosh: "Swoosh",
|
|
1577
|
+
bamboo: "Bamboo"
|
|
1578
|
+
},
|
|
1443
1579
|
elixirCaching: {
|
|
1444
1580
|
cachex: "Cachex",
|
|
1445
|
-
nebulex: "Nebulex"
|
|
1581
|
+
nebulex: "Nebulex",
|
|
1582
|
+
redix: "Redix"
|
|
1446
1583
|
},
|
|
1447
1584
|
elixirObservability: {
|
|
1448
1585
|
telemetry: "Telemetry",
|
|
1449
1586
|
opentelemetry: "OpenTelemetry",
|
|
1450
|
-
prom_ex: "PromEx"
|
|
1587
|
+
prom_ex: "PromEx",
|
|
1588
|
+
sentry: "Sentry"
|
|
1451
1589
|
},
|
|
1452
1590
|
elixirTesting: {
|
|
1453
1591
|
ex_unit: "ExUnit",
|
|
1454
1592
|
mox: "Mox",
|
|
1455
1593
|
bypass: "Bypass",
|
|
1456
|
-
wallaby: "Wallaby"
|
|
1594
|
+
wallaby: "Wallaby",
|
|
1595
|
+
stream_data: "StreamData",
|
|
1596
|
+
ex_machina: "ExMachina"
|
|
1457
1597
|
},
|
|
1458
1598
|
elixirQuality: {
|
|
1459
1599
|
credo: "Credo",
|
|
1460
1600
|
dialyxir: "Dialyxir",
|
|
1461
|
-
sobelow: "Sobelow"
|
|
1462
|
-
|
|
1601
|
+
sobelow: "Sobelow",
|
|
1602
|
+
excoveralls: "ExCoveralls",
|
|
1603
|
+
mix_audit: "MixAudit"
|
|
1604
|
+
},
|
|
1605
|
+
elixirI18n: { gettext: "Gettext" },
|
|
1606
|
+
elixirHttpServer: {
|
|
1607
|
+
bandit: "Bandit",
|
|
1608
|
+
cowboy: "Cowboy"
|
|
1609
|
+
},
|
|
1610
|
+
elixirApplicationFramework: { ash: "Ash Framework" },
|
|
1611
|
+
elixirDocumentation: { ex_doc: "ExDoc" },
|
|
1612
|
+
elixirClustering: { libcluster: "libcluster" },
|
|
1463
1613
|
elixirDeploy: {
|
|
1464
1614
|
docker: "Docker",
|
|
1465
1615
|
fly: "Fly.io",
|
|
@@ -1571,6 +1721,7 @@ const OPTION_CATEGORY_METADATA = {
|
|
|
1571
1721
|
mobileDeepLinking: buildCategoryMetadata("mobileDeepLinking"),
|
|
1572
1722
|
codeQuality: buildCategoryMetadata("codeQuality"),
|
|
1573
1723
|
documentation: buildCategoryMetadata("documentation"),
|
|
1724
|
+
appShells: buildCategoryMetadata("appShells"),
|
|
1574
1725
|
appPlatforms: buildCategoryMetadata("appPlatforms"),
|
|
1575
1726
|
packageManager: buildCategoryMetadata("packageManager"),
|
|
1576
1727
|
workspaceShape: buildCategoryMetadata("workspaceShape"),
|
|
@@ -1628,6 +1779,12 @@ const OPTION_CATEGORY_METADATA = {
|
|
|
1628
1779
|
goCaching: buildCategoryMetadata("goCaching"),
|
|
1629
1780
|
goConfig: buildCategoryMetadata("goConfig"),
|
|
1630
1781
|
goObservability: buildCategoryMetadata("goObservability"),
|
|
1782
|
+
goValidation: buildCategoryMetadata("goValidation"),
|
|
1783
|
+
goQuality: buildCategoryMetadata("goQuality"),
|
|
1784
|
+
goMigrations: buildCategoryMetadata("goMigrations"),
|
|
1785
|
+
goTemplating: buildCategoryMetadata("goTemplating"),
|
|
1786
|
+
goProtoTooling: buildCategoryMetadata("goProtoTooling"),
|
|
1787
|
+
goDI: buildCategoryMetadata("goDI"),
|
|
1631
1788
|
javaLanguage: buildCategoryMetadata("javaLanguage"),
|
|
1632
1789
|
javaWebFramework: buildCategoryMetadata("javaWebFramework"),
|
|
1633
1790
|
javaBuildTool: buildCategoryMetadata("javaBuildTool"),
|
|
@@ -1662,6 +1819,11 @@ const OPTION_CATEGORY_METADATA = {
|
|
|
1662
1819
|
elixirObservability: buildCategoryMetadata("elixirObservability"),
|
|
1663
1820
|
elixirTesting: buildCategoryMetadata("elixirTesting"),
|
|
1664
1821
|
elixirQuality: buildCategoryMetadata("elixirQuality"),
|
|
1822
|
+
elixirI18n: buildCategoryMetadata("elixirI18n"),
|
|
1823
|
+
elixirHttpServer: buildCategoryMetadata("elixirHttpServer"),
|
|
1824
|
+
elixirApplicationFramework: buildCategoryMetadata("elixirApplicationFramework"),
|
|
1825
|
+
elixirDocumentation: buildCategoryMetadata("elixirDocumentation"),
|
|
1826
|
+
elixirClustering: buildCategoryMetadata("elixirClustering"),
|
|
1665
1827
|
elixirDeploy: buildCategoryMetadata("elixirDeploy"),
|
|
1666
1828
|
elixirLibraries: buildCategoryMetadata("elixirLibraries")
|
|
1667
1829
|
};
|
|
@@ -1684,6 +1846,28 @@ function normalizeOptionId(category, value) {
|
|
|
1684
1846
|
|
|
1685
1847
|
//#endregion
|
|
1686
1848
|
//#region src/compatibility.ts
|
|
1849
|
+
const KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES = new Set([
|
|
1850
|
+
"testcontainers",
|
|
1851
|
+
"rest-assured",
|
|
1852
|
+
"wiremock",
|
|
1853
|
+
"awaitility",
|
|
1854
|
+
"archunit",
|
|
1855
|
+
"jqwik"
|
|
1856
|
+
]);
|
|
1857
|
+
const KOTLIN_DROPPED_JAVA_LIBRARIES = new Set(["lombok", "mapstruct"]);
|
|
1858
|
+
function getKotlinJavaIncompatibilityReason(stack) {
|
|
1859
|
+
if (stack.javaWebFramework !== "spring-boot") return "Kotlin sources are only wired for the Spring Boot scaffold";
|
|
1860
|
+
if (!stack.javaBuildTool || stack.javaBuildTool === "none") return "Kotlin requires Maven or Gradle";
|
|
1861
|
+
if (stack.javaOrm === "jooq" || stack.javaOrm === "mybatis") return "The Kotlin scaffold supports Spring Data JPA or no ORM (jOOQ/MyBatis sources are Java-only)";
|
|
1862
|
+
if (stack.javaApi === "grpc" || stack.javaApi === "openapi-generator") return "The Kotlin scaffold supports Spring GraphQL or no API layer (gRPC/OpenAPI codegen paths are Java-only)";
|
|
1863
|
+
if (stack.email === "resend") return "The Resend email integration is Java-only in the Java ecosystem scaffold";
|
|
1864
|
+
if (stack.search === "meilisearch") return "The Meilisearch integration is Java-only in the Java ecosystem scaffold";
|
|
1865
|
+
if (stack.caching === "upstash-redis") return "The Upstash Redis integration is Java-only in the Java ecosystem scaffold";
|
|
1866
|
+
if (stack.observability === "sentry") return "The Sentry integration is Java-only in the Java ecosystem scaffold";
|
|
1867
|
+
const unsupportedTestingLibrary = (stack.javaTestingLibraries ?? []).find((library) => KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES.has(library));
|
|
1868
|
+
if (unsupportedTestingLibrary) return `The '${unsupportedTestingLibrary}' testing library is not wired for the Kotlin scaffold`;
|
|
1869
|
+
return null;
|
|
1870
|
+
}
|
|
1687
1871
|
const DEFAULT_RUNTIME = "bun";
|
|
1688
1872
|
const REVENUECAT_NATIVE_FRONTENDS = new Set([
|
|
1689
1873
|
"native-bare",
|
|
@@ -1698,6 +1882,8 @@ const PARAGLIDE_COMPATIBLE_FRONTENDS = new Set([
|
|
|
1698
1882
|
"tanstack-start",
|
|
1699
1883
|
"react-router",
|
|
1700
1884
|
"react-vite",
|
|
1885
|
+
"vanilla-vite",
|
|
1886
|
+
"vue",
|
|
1701
1887
|
"svelte",
|
|
1702
1888
|
"solid",
|
|
1703
1889
|
"solid-start",
|
|
@@ -2215,6 +2401,19 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2215
2401
|
}
|
|
2216
2402
|
}
|
|
2217
2403
|
if (nextStack.backend !== "convex" && nextStack.backend !== "none") {
|
|
2404
|
+
if (nextStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend)) && [
|
|
2405
|
+
"trpc",
|
|
2406
|
+
"orpc",
|
|
2407
|
+
"ts-rest",
|
|
2408
|
+
"garph"
|
|
2409
|
+
].includes(nextStack.api)) {
|
|
2410
|
+
nextStack.api = "graphql-yoga";
|
|
2411
|
+
changed = true;
|
|
2412
|
+
changes.push({
|
|
2413
|
+
category: "api",
|
|
2414
|
+
message: "API set to 'GraphQL Yoga' (supported by standalone Vite frontends)"
|
|
2415
|
+
});
|
|
2416
|
+
}
|
|
2218
2417
|
if (nextStack.webFrontend.some((f) => [
|
|
2219
2418
|
"nuxt",
|
|
2220
2419
|
"svelte",
|
|
@@ -2343,6 +2542,33 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2343
2542
|
});
|
|
2344
2543
|
}
|
|
2345
2544
|
}
|
|
2545
|
+
if (nextStack.payments === "paypal") {
|
|
2546
|
+
const hasWebFrontend = nextStack.webFrontend.some((f) => f !== "none");
|
|
2547
|
+
if (!hasWebFrontend || ["none", "convex"].includes(nextStack.backend)) {
|
|
2548
|
+
nextStack.payments = "none";
|
|
2549
|
+
changed = true;
|
|
2550
|
+
changes.push({
|
|
2551
|
+
category: "payments",
|
|
2552
|
+
message: hasWebFrontend ? "Payments set to 'None' (PayPal requires a standalone or fullstack backend)" : "Payments set to 'None' (PayPal requires a web frontend)"
|
|
2553
|
+
});
|
|
2554
|
+
}
|
|
2555
|
+
}
|
|
2556
|
+
if (["openai-sdk", "anthropic-sdk"].includes(nextStack.aiSdk) && ["none", "convex"].includes(nextStack.backend)) {
|
|
2557
|
+
nextStack.aiSdk = "none";
|
|
2558
|
+
changed = true;
|
|
2559
|
+
changes.push({
|
|
2560
|
+
category: "ai",
|
|
2561
|
+
message: "AI SDK set to 'None' (direct provider SDKs require a backend)"
|
|
2562
|
+
});
|
|
2563
|
+
}
|
|
2564
|
+
if (nextStack.realtime === "ws" && nextStack.backend !== "express") {
|
|
2565
|
+
nextStack.realtime = "none";
|
|
2566
|
+
changed = true;
|
|
2567
|
+
changes.push({
|
|
2568
|
+
category: "realtime",
|
|
2569
|
+
message: "Realtime set to 'None' (the ws integration requires Express)"
|
|
2570
|
+
});
|
|
2571
|
+
}
|
|
2346
2572
|
if (nextStack.email !== "none") {
|
|
2347
2573
|
if (nextStack.backend === "convex") {
|
|
2348
2574
|
nextStack.email = "none";
|
|
@@ -2646,6 +2872,23 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2646
2872
|
});
|
|
2647
2873
|
}
|
|
2648
2874
|
}
|
|
2875
|
+
const styledComponentsFrontends = new Set([
|
|
2876
|
+
"tanstack-router",
|
|
2877
|
+
"react-router",
|
|
2878
|
+
"react-vite",
|
|
2879
|
+
"tanstack-start",
|
|
2880
|
+
"next",
|
|
2881
|
+
"vinext",
|
|
2882
|
+
"redwood"
|
|
2883
|
+
]);
|
|
2884
|
+
if (nextStack.cssFramework === "styled-components" && !nextStack.webFrontend.some((frontend) => styledComponentsFrontends.has(frontend))) {
|
|
2885
|
+
nextStack.cssFramework = "none";
|
|
2886
|
+
changed = true;
|
|
2887
|
+
changes.push({
|
|
2888
|
+
category: "cssFramework",
|
|
2889
|
+
message: "CSS framework set to 'None' (styled-components requires a React frontend)"
|
|
2890
|
+
});
|
|
2891
|
+
}
|
|
2649
2892
|
if ([
|
|
2650
2893
|
"shadcn-ui",
|
|
2651
2894
|
"shadcn-svelte",
|
|
@@ -2748,6 +2991,26 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2748
2991
|
message: "Tauri removed (requires compatible frontend)"
|
|
2749
2992
|
});
|
|
2750
2993
|
}
|
|
2994
|
+
for (const platform of ["electron", "capacitor"]) if (nextStack.appPlatforms.includes(platform) && !validateAddonCompatibility(platform, nextStack.webFrontend).isCompatible) {
|
|
2995
|
+
nextStack.appPlatforms = nextStack.appPlatforms.filter((addon) => addon !== platform);
|
|
2996
|
+
changed = true;
|
|
2997
|
+
changes.push({
|
|
2998
|
+
category: "appPlatforms",
|
|
2999
|
+
message: `${platform === "electron" ? "Electron" : "Capacitor"} removed (requires compatible frontend)`
|
|
3000
|
+
});
|
|
3001
|
+
}
|
|
3002
|
+
if (nextStack.appPlatforms.includes("graphql-codegen") && ![
|
|
3003
|
+
"garph",
|
|
3004
|
+
"graphql-yoga",
|
|
3005
|
+
"apollo-server"
|
|
3006
|
+
].includes(nextStack.api) && !nextStack.webFrontend.includes("redwood")) {
|
|
3007
|
+
nextStack.appPlatforms = nextStack.appPlatforms.filter((platform) => platform !== "graphql-codegen");
|
|
3008
|
+
changed = true;
|
|
3009
|
+
changes.push({
|
|
3010
|
+
category: "appPlatforms",
|
|
3011
|
+
message: "GraphQL Code Generator removed (requires a GraphQL API selection)"
|
|
3012
|
+
});
|
|
3013
|
+
}
|
|
2751
3014
|
if (nextStack.examples.includes("ai")) {
|
|
2752
3015
|
if (nextStack.webFrontend.includes("solid") || nextStack.webFrontend.includes("solid-start")) {
|
|
2753
3016
|
nextStack.examples = nextStack.examples.filter((e) => e !== "ai");
|
|
@@ -2796,7 +3059,33 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2796
3059
|
});
|
|
2797
3060
|
}
|
|
2798
3061
|
}
|
|
2799
|
-
|
|
3062
|
+
const isFresh = nextStack.webFrontend.includes("fresh");
|
|
3063
|
+
const hasStandaloneViteFrontend = nextStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend));
|
|
3064
|
+
if (hasStandaloneViteFrontend && nextStack.forms !== "none") {
|
|
3065
|
+
nextStack.forms = "none";
|
|
3066
|
+
changed = true;
|
|
3067
|
+
changes.push({
|
|
3068
|
+
category: "forms",
|
|
3069
|
+
message: "Forms set to 'None' (standalone Vue and Vanilla integrations are not wired yet)"
|
|
3070
|
+
});
|
|
3071
|
+
}
|
|
3072
|
+
if (hasStandaloneViteFrontend && nextStack.cms !== "none" && nextStack.cms !== "contentful") {
|
|
3073
|
+
nextStack.cms = "none";
|
|
3074
|
+
changed = true;
|
|
3075
|
+
changes.push({
|
|
3076
|
+
category: "cms",
|
|
3077
|
+
message: "CMS set to 'None' (standalone Vue and Vanilla CMS templates are not wired yet)"
|
|
3078
|
+
});
|
|
3079
|
+
}
|
|
3080
|
+
if (hasStandaloneViteFrontend && nextStack.featureFlags !== "none") {
|
|
3081
|
+
nextStack.featureFlags = "none";
|
|
3082
|
+
changed = true;
|
|
3083
|
+
changes.push({
|
|
3084
|
+
category: "featureFlags",
|
|
3085
|
+
message: "Feature flags set to 'None' (standalone Vue and Vanilla client integrations are not wired yet)"
|
|
3086
|
+
});
|
|
3087
|
+
}
|
|
3088
|
+
if (isFresh) {
|
|
2800
3089
|
if (nextStack.forms === "tanstack-form") {
|
|
2801
3090
|
nextStack.forms = "none";
|
|
2802
3091
|
changed = true;
|
|
@@ -2912,21 +3201,24 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2912
3201
|
}
|
|
2913
3202
|
}
|
|
2914
3203
|
if (nextStack.javaLanguage === "kotlin") {
|
|
2915
|
-
const
|
|
2916
|
-
|
|
2917
|
-
"rest-assured",
|
|
2918
|
-
"wiremock",
|
|
2919
|
-
"awaitility",
|
|
2920
|
-
"archunit",
|
|
2921
|
-
"jqwik"
|
|
2922
|
-
]);
|
|
2923
|
-
if (!(nextStack.javaWebFramework === "spring-boot" && nextStack.javaBuildTool !== "none" && nextStack.javaOrm !== "jooq" && nextStack.javaOrm !== "mybatis" && nextStack.javaApi !== "grpc" && nextStack.javaApi !== "openapi-generator" && nextStack.email !== "resend" && nextStack.search !== "meilisearch" && nextStack.caching !== "upstash-redis" && nextStack.observability !== "sentry" && !nextStack.javaTestingLibraries.some((library) => kotlinUnsupportedTestingLibraries.has(library)))) {
|
|
3204
|
+
const kotlinBlocker = getKotlinJavaIncompatibilityReason(nextStack);
|
|
3205
|
+
if (kotlinBlocker) {
|
|
2924
3206
|
nextStack.javaLanguage = "java";
|
|
2925
3207
|
changed = true;
|
|
2926
3208
|
changes.push({
|
|
2927
3209
|
category: "javaLanguage",
|
|
2928
|
-
message:
|
|
3210
|
+
message: `Java language set to 'Java' (${kotlinBlocker})`
|
|
2929
3211
|
});
|
|
3212
|
+
} else {
|
|
3213
|
+
const kotlinLibraries = nextStack.javaLibraries.filter((library) => !KOTLIN_DROPPED_JAVA_LIBRARIES.has(library));
|
|
3214
|
+
if (kotlinLibraries.length !== nextStack.javaLibraries.length) {
|
|
3215
|
+
nextStack.javaLibraries = kotlinLibraries;
|
|
3216
|
+
changed = true;
|
|
3217
|
+
changes.push({
|
|
3218
|
+
category: "javaLibraries",
|
|
3219
|
+
message: "Java annotation-processor libraries cleared (Lombok and MapStruct are not wired for Kotlin)"
|
|
3220
|
+
});
|
|
3221
|
+
}
|
|
2930
3222
|
}
|
|
2931
3223
|
}
|
|
2932
3224
|
}
|
|
@@ -2947,7 +3239,9 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2947
3239
|
"elixirAuth",
|
|
2948
3240
|
"elixirApi",
|
|
2949
3241
|
"elixirRealtime",
|
|
2950
|
-
"elixirObservability"
|
|
3242
|
+
"elixirObservability",
|
|
3243
|
+
"elixirI18n",
|
|
3244
|
+
"elixirHttpServer"
|
|
2951
3245
|
]) {
|
|
2952
3246
|
const value = nextStack[key];
|
|
2953
3247
|
if (key !== "elixirObservability" ? value !== "none" : value === "phoenix-telemetry") {
|
|
@@ -3009,6 +3303,19 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
3009
3303
|
message: "Elixir auth set to 'None' (phx.gen.auth requires Ecto SQL with PostgreSQL)"
|
|
3010
3304
|
});
|
|
3011
3305
|
}
|
|
3306
|
+
const sqlBackedElixirOrms = new Set([
|
|
3307
|
+
"ecto-sql",
|
|
3308
|
+
"myxql",
|
|
3309
|
+
"ecto_sqlite3"
|
|
3310
|
+
]);
|
|
3311
|
+
if (nextStack.elixirAuth === "pow" && !sqlBackedElixirOrms.has(nextStack.elixirOrm)) {
|
|
3312
|
+
nextStack.elixirAuth = "none";
|
|
3313
|
+
changed = true;
|
|
3314
|
+
changes.push({
|
|
3315
|
+
category: "elixirAuth",
|
|
3316
|
+
message: "Elixir auth set to 'None' (Pow requires an Ecto SQL repository)"
|
|
3317
|
+
});
|
|
3318
|
+
}
|
|
3012
3319
|
}
|
|
3013
3320
|
if (nextStack.webDeploy !== "none" && !nextStack.webFrontend.some((f) => f !== "none")) {
|
|
3014
3321
|
nextStack.webDeploy = "none";
|
|
@@ -3018,6 +3325,16 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
3018
3325
|
message: "Web deploy set to 'None' (no web frontend)"
|
|
3019
3326
|
});
|
|
3020
3327
|
}
|
|
3328
|
+
const unsupportedWebDeployFrontend = getUnsupportedWebDeployFrontend(nextStack.webDeploy, nextStack.webFrontend);
|
|
3329
|
+
if (nextStack.webDeploy !== "none" && unsupportedWebDeployFrontend) {
|
|
3330
|
+
const webDeploy = nextStack.webDeploy;
|
|
3331
|
+
nextStack.webDeploy = "none";
|
|
3332
|
+
changed = true;
|
|
3333
|
+
changes.push({
|
|
3334
|
+
category: "webDeploy",
|
|
3335
|
+
message: `Web deploy set to 'None' ('${webDeploy}' is not wired for the '${unsupportedWebDeployFrontend}' frontend)`
|
|
3336
|
+
});
|
|
3337
|
+
}
|
|
3021
3338
|
if (nextStack.serverDeploy === "cloudflare") {
|
|
3022
3339
|
if (nextStack.runtime !== "workers" || nextStack.backend !== "hono") {
|
|
3023
3340
|
nextStack.serverDeploy = "none";
|
|
@@ -3069,6 +3386,16 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
3069
3386
|
* - Follow CLI behavior: filter options based on UPSTREAM selections only
|
|
3070
3387
|
*/
|
|
3071
3388
|
const getDisabledReason = (currentStack, category, optionId) => {
|
|
3389
|
+
const hasStandaloneViteFrontend = currentStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend));
|
|
3390
|
+
if (category === "api" && hasStandaloneViteFrontend && [
|
|
3391
|
+
"trpc",
|
|
3392
|
+
"orpc",
|
|
3393
|
+
"ts-rest",
|
|
3394
|
+
"garph"
|
|
3395
|
+
].includes(optionId)) return "Standalone Vite frontends support only GraphQL and OpenAPI API integrations";
|
|
3396
|
+
if (category === "forms" && hasStandaloneViteFrontend && optionId !== "none") return "Form library integrations are not yet wired for standalone Vue or Vanilla Vite";
|
|
3397
|
+
if (category === "cms" && hasStandaloneViteFrontend && optionId !== "none" && optionId !== "contentful") return "CMS integrations other than Contentful are not yet wired for standalone Vue or Vanilla Vite";
|
|
3398
|
+
if (category === "featureFlags" && hasStandaloneViteFrontend && optionId !== "none") return "Feature flag client integrations are not yet wired for standalone Vue or Vanilla Vite";
|
|
3072
3399
|
if (currentStack.backend === "convex") {
|
|
3073
3400
|
if (category === "runtime" && optionId !== "none") return "Convex provides its own runtime";
|
|
3074
3401
|
if (category === "database" && optionId !== "none") return "Convex provides its own database";
|
|
@@ -3132,6 +3459,31 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3132
3459
|
if (category === "backendLibraries" && optionId !== "effect-full") return "Effect backend requires Effect Platform + SQL services";
|
|
3133
3460
|
if (category === "validation" && optionId !== "effect-schema") return "Effect backend requires Effect Schema validation";
|
|
3134
3461
|
}
|
|
3462
|
+
if (category === "javaLanguage" && optionId === "kotlin" && currentStack.ecosystem === "java") {
|
|
3463
|
+
const kotlinBlocker = getKotlinJavaIncompatibilityReason(currentStack);
|
|
3464
|
+
if (kotlinBlocker) return kotlinBlocker;
|
|
3465
|
+
}
|
|
3466
|
+
if (currentStack.ecosystem === "java" && currentStack.javaLanguage === "kotlin") {
|
|
3467
|
+
if (category === "javaWebFramework" && optionId !== "spring-boot") return "Kotlin sources are only wired for the Spring Boot scaffold";
|
|
3468
|
+
if (category === "javaBuildTool" && optionId === "none") return "Kotlin requires Maven or Gradle";
|
|
3469
|
+
if (category === "javaOrm" && (optionId === "jooq" || optionId === "mybatis")) return "The Kotlin scaffold supports Spring Data JPA or no ORM (jOOQ/MyBatis sources are Java-only)";
|
|
3470
|
+
if (category === "javaApi" && (optionId === "grpc" || optionId === "openapi-generator")) return "The Kotlin scaffold supports Spring GraphQL or no API layer (gRPC/OpenAPI codegen paths are Java-only)";
|
|
3471
|
+
if (category === "javaLibraries" && KOTLIN_DROPPED_JAVA_LIBRARIES.has(optionId)) return "Java annotation-processor tooling is not wired for Kotlin (data classes replace Lombok; MapStruct would need kapt)";
|
|
3472
|
+
if (category === "javaTestingLibraries" && KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES.has(optionId)) return `The '${optionId}' testing library is not wired for the Kotlin scaffold`;
|
|
3473
|
+
if (category === "email" && optionId === "resend") return "The Resend email integration is Java-only in the Java ecosystem scaffold";
|
|
3474
|
+
if (category === "search" && optionId === "meilisearch") return "The Meilisearch integration is Java-only in the Java ecosystem scaffold";
|
|
3475
|
+
if (category === "caching" && optionId === "upstash-redis") return "The Upstash Redis integration is Java-only in the Java ecosystem scaffold";
|
|
3476
|
+
if (category === "observability" && optionId === "sentry") return "The Sentry integration is Java-only in the Java ecosystem scaffold";
|
|
3477
|
+
}
|
|
3478
|
+
if (currentStack.ecosystem === "rust") {
|
|
3479
|
+
const filterOnlyFramework = currentStack.rustWebFramework === "warp" || currentStack.rustWebFramework === "salvo";
|
|
3480
|
+
if (category === "rustApi" && filterOnlyFramework && optionId !== "none" && optionId !== "jsonrpsee") return "Warp and Salvo currently support REST or the standalone jsonrpsee server";
|
|
3481
|
+
if (category === "rustWebFramework" && (optionId === "warp" || optionId === "salvo") && currentStack.rustApi !== "none" && currentStack.rustApi !== "jsonrpsee") return "Warp and Salvo currently support REST or the standalone jsonrpsee server";
|
|
3482
|
+
if (category === "rustApi" && currentStack.rustWebFramework === "loco" && optionId === "jsonrpsee") return "Loco owns the server boot sequence; jsonrpsee is available with the other Rust frameworks";
|
|
3483
|
+
if (category === "rustWebFramework" && optionId === "loco" && currentStack.rustApi === "jsonrpsee") return "Loco owns the server boot sequence and cannot start the generated jsonrpsee server";
|
|
3484
|
+
if (category === "rustAuth" && optionId === "tower-sessions" && currentStack.rustWebFramework !== "axum") return "The generated tower-sessions middleware is wired specifically for Axum";
|
|
3485
|
+
if (category === "rustWebFramework" && optionId !== "axum" && currentStack.rustAuth === "tower-sessions") return "tower-sessions requires the generated Axum middleware stack";
|
|
3486
|
+
}
|
|
3135
3487
|
const graphDisabledReason = category === "payments" && optionId === "revenuecat" || category === "i18n" && optionId === "intlayer" ? {
|
|
3136
3488
|
handled: false,
|
|
3137
3489
|
authoritative: false,
|
|
@@ -3310,12 +3662,17 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3310
3662
|
if (category === "payments" && optionId === "revenuecat") {
|
|
3311
3663
|
if (!hasRevenueCatCompatibleNativeFrontend(currentStack.nativeFrontend)) return "RevenueCat payments requires a native frontend (native-bare, native-uniwind, or native-unistyles)";
|
|
3312
3664
|
}
|
|
3665
|
+
if (category === "payments" && optionId === "paypal") {
|
|
3666
|
+
if (!currentStack.webFrontend.some((f) => f !== "none")) return "PayPal requires a web frontend";
|
|
3667
|
+
if (["none", "convex"].includes(currentStack.backend)) return "PayPal checkout requires a standalone or fullstack backend";
|
|
3668
|
+
}
|
|
3313
3669
|
if (category === "cms" && optionId === "payload") {
|
|
3314
3670
|
if (!currentStack.webFrontend.includes("next")) return "Payload CMS v3 requires Next.js";
|
|
3315
3671
|
}
|
|
3316
3672
|
if (category === "cms" && optionId === "keystatic") {
|
|
3317
3673
|
if (!currentStack.webFrontend.includes("next")) return "Keystatic is currently scaffolded for Next.js only because @keystatic/astro is not Astro 7-compatible yet.";
|
|
3318
3674
|
}
|
|
3675
|
+
if (category === "realtime" && optionId === "ws" && currentStack.backend !== "express") return "The ws integration is currently wired for the Express backend";
|
|
3319
3676
|
if (category === "email" && optionId !== "none") {
|
|
3320
3677
|
if (currentStack.ecosystem !== "typescript") return null;
|
|
3321
3678
|
if (currentStack.backend === "convex") return "Email integration is not available with Convex backend";
|
|
@@ -3341,6 +3698,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3341
3698
|
if (currentStack.ecosystem !== "typescript") return "Vector database is only available for the TypeScript ecosystem";
|
|
3342
3699
|
}
|
|
3343
3700
|
if (category === "ai" && requiresChatSdkVercelAI(currentStack) && optionId !== "vercel-ai") return "Chat SDK example (Nuxt/Hono profile) requires Vercel AI SDK in v1";
|
|
3701
|
+
if (category === "ai" && ["openai-sdk", "anthropic-sdk"].includes(optionId) && ["none", "convex"].includes(currentStack.backend)) return "Direct AI provider SDKs require a standalone or fullstack backend";
|
|
3344
3702
|
if (category === "ai" && optionId === "tanstack-ai") {
|
|
3345
3703
|
const compatibleFrontends = [
|
|
3346
3704
|
"tanstack-router",
|
|
@@ -3362,11 +3720,32 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3362
3720
|
"tanstack-db",
|
|
3363
3721
|
"tanstack-pacer"
|
|
3364
3722
|
].includes(optionId) && currentStack.webFrontend.length === 1 && currentStack.webFrontend[0] === "astro" && (!currentStack.astroIntegration || currentStack.astroIntegration === "none")) return "TanStack libraries with Astro require a UI framework integration (React, Vue, Svelte, or Solid)";
|
|
3723
|
+
if (optionId === "graphql-codegen" && ![
|
|
3724
|
+
"garph",
|
|
3725
|
+
"graphql-yoga",
|
|
3726
|
+
"apollo-server"
|
|
3727
|
+
].includes(currentStack.api) && !currentStack.webFrontend.includes("redwood")) return "GraphQL Code Generator requires a GraphQL API selection";
|
|
3728
|
+
if (optionId === "openapi-typescript" && currentStack.api !== "openapi") return "openapi-typescript requires the OpenAPI API selection";
|
|
3729
|
+
if (optionId === "openapi-typescript" && currentStack.backend === "self") return "openapi-typescript requires a standalone backend that exposes an OpenAPI schema";
|
|
3730
|
+
if (optionId === "apollo-client" && ![
|
|
3731
|
+
"garph",
|
|
3732
|
+
"graphql-yoga",
|
|
3733
|
+
"apollo-server"
|
|
3734
|
+
].includes(currentStack.api)) return "Apollo Client requires a GraphQL API selection";
|
|
3365
3735
|
}
|
|
3366
3736
|
if (category === "cssFramework") {
|
|
3367
3737
|
if (!currentStack.webFrontend.some((f) => f !== "none")) {
|
|
3368
3738
|
if (optionId !== "none") return "CSS framework requires a web frontend";
|
|
3369
3739
|
}
|
|
3740
|
+
if (optionId === "styled-components" && !currentStack.webFrontend.some((f) => [
|
|
3741
|
+
"tanstack-router",
|
|
3742
|
+
"react-router",
|
|
3743
|
+
"react-vite",
|
|
3744
|
+
"tanstack-start",
|
|
3745
|
+
"next",
|
|
3746
|
+
"vinext",
|
|
3747
|
+
"redwood"
|
|
3748
|
+
].includes(f))) return "styled-components requires a React frontend";
|
|
3370
3749
|
if ([
|
|
3371
3750
|
"shadcn-ui",
|
|
3372
3751
|
"shadcn-svelte",
|
|
@@ -3502,6 +3881,16 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3502
3881
|
if (category === "pythonApi") {
|
|
3503
3882
|
if (optionId !== "none" && currentStack.pythonWebFramework !== "django") return "Python API frameworks currently require Django";
|
|
3504
3883
|
}
|
|
3884
|
+
if (category === "goMigrations" && optionId !== "none" && currentStack.ecosystem === "go" && ![
|
|
3885
|
+
"sqlite",
|
|
3886
|
+
"postgres",
|
|
3887
|
+
"mysql"
|
|
3888
|
+
].includes(currentStack.database)) return "Go migrations require SQLite, PostgreSQL, or MySQL";
|
|
3889
|
+
if (category === "database" && currentStack.ecosystem === "go" && currentStack.goMigrations !== "none" && ![
|
|
3890
|
+
"sqlite",
|
|
3891
|
+
"postgres",
|
|
3892
|
+
"mysql"
|
|
3893
|
+
].includes(optionId)) return "The selected Go migration tool requires SQLite, PostgreSQL, or MySQL";
|
|
3505
3894
|
if (category === "javaWebFramework") {
|
|
3506
3895
|
if (optionId !== "none" && currentStack.javaBuildTool === "none") return "Java web frameworks require Maven or Gradle";
|
|
3507
3896
|
}
|
|
@@ -3552,11 +3941,30 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3552
3941
|
"elixirObservability",
|
|
3553
3942
|
"elixirTesting",
|
|
3554
3943
|
"elixirQuality",
|
|
3944
|
+
"elixirI18n",
|
|
3945
|
+
"elixirHttpServer",
|
|
3946
|
+
"elixirApplicationFramework",
|
|
3947
|
+
"elixirDocumentation",
|
|
3948
|
+
"elixirClustering",
|
|
3555
3949
|
"elixirDeploy"
|
|
3556
3950
|
]).has(category) && optionId !== "none") {
|
|
3557
3951
|
if (currentStack.ecosystem !== "elixir") return "Elixir options only apply when the Elixir ecosystem is selected";
|
|
3558
3952
|
}
|
|
3559
3953
|
if (category === "elixirTesting" && optionId === "wallaby" && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework === "none") return "Wallaby browser tests require Phoenix";
|
|
3954
|
+
if (category === "elixirTesting" && optionId === "ex_machina" && currentStack.ecosystem === "elixir" && ![
|
|
3955
|
+
"ecto-sql",
|
|
3956
|
+
"myxql",
|
|
3957
|
+
"ecto_sqlite3"
|
|
3958
|
+
].includes(currentStack.elixirOrm)) return "ExMachina requires an Ecto SQL repository";
|
|
3959
|
+
if (category === "elixirAuth" && optionId === "pow" && currentStack.ecosystem === "elixir" && (currentStack.elixirWebFramework === "none" || ![
|
|
3960
|
+
"ecto-sql",
|
|
3961
|
+
"myxql",
|
|
3962
|
+
"ecto_sqlite3"
|
|
3963
|
+
].includes(currentStack.elixirOrm))) return "Pow requires Phoenix and an Ecto SQL repository";
|
|
3964
|
+
if ((category === "elixirApi" && optionId === "open_api_spex" || category === "elixirI18n" && optionId === "gettext") && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework === "none") return `${getCategoryDisplayName(category)} requires Phoenix`;
|
|
3965
|
+
if (category === "elixirHttpServer" && currentStack.ecosystem === "elixir" && (optionId === "none" && currentStack.elixirWebFramework !== "none" || optionId !== "none" && currentStack.elixirWebFramework === "none")) return currentStack.elixirWebFramework === "none" ? "HTTP server adapters require Phoenix" : "Phoenix requires Bandit or Cowboy";
|
|
3966
|
+
if (category === "elixirJobs" && optionId === "oban" && currentStack.ecosystem === "elixir" && currentStack.elixirOrm !== "ecto-sql") return "Oban requires the PostgreSQL Ecto SQL option";
|
|
3967
|
+
if (category === "elixirOrm" && ["myxql", "ecto_sqlite3"].includes(optionId) && currentStack.ecosystem === "elixir" && currentStack.elixirJobs === "oban") return "Oban requires PostgreSQL-backed Ecto SQL";
|
|
3560
3968
|
if (category === "elixirWebFramework" && optionId !== "none" && currentStack.ecosystem !== "elixir") return "Elixir web frameworks are available only in the Elixir ecosystem";
|
|
3561
3969
|
if (category === "elixirJson" && optionId === "none" && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework !== "none") return "Phoenix JSON scaffolds require Jason";
|
|
3562
3970
|
return null;
|
|
@@ -3601,6 +4009,11 @@ const ELIXIR_GRAPH_DISABLED_REASON_ROLES = {
|
|
|
3601
4009
|
elixirObservability: "observability",
|
|
3602
4010
|
elixirTesting: "testing",
|
|
3603
4011
|
elixirQuality: "codeQuality",
|
|
4012
|
+
elixirI18n: "i18n",
|
|
4013
|
+
elixirHttpServer: "runtime",
|
|
4014
|
+
elixirApplicationFramework: "libraries",
|
|
4015
|
+
elixirDocumentation: "documentation",
|
|
4016
|
+
elixirClustering: "config",
|
|
3604
4017
|
elixirDeploy: "deploy"
|
|
3605
4018
|
};
|
|
3606
4019
|
function getElixirGraphBinding(currentStack, category) {
|
|
@@ -3989,6 +4402,54 @@ const GRAPH_DISABLED_REASON_BINDINGS = {
|
|
|
3989
4402
|
authoritative: true,
|
|
3990
4403
|
candidateIdPrefix: "candidate:native"
|
|
3991
4404
|
},
|
|
4405
|
+
goValidation: {
|
|
4406
|
+
role: "validation",
|
|
4407
|
+
ecosystem: "go",
|
|
4408
|
+
ownerRole: "backend",
|
|
4409
|
+
ownerEcosystem: "go",
|
|
4410
|
+
currentEcosystem: "go",
|
|
4411
|
+
authoritative: true
|
|
4412
|
+
},
|
|
4413
|
+
goQuality: {
|
|
4414
|
+
role: "codeQuality",
|
|
4415
|
+
ecosystem: "go",
|
|
4416
|
+
ownerRole: "backend",
|
|
4417
|
+
ownerEcosystem: "go",
|
|
4418
|
+
currentEcosystem: "go",
|
|
4419
|
+
authoritative: true
|
|
4420
|
+
},
|
|
4421
|
+
goMigrations: {
|
|
4422
|
+
role: "migrations",
|
|
4423
|
+
ecosystem: "go",
|
|
4424
|
+
ownerRole: "backend",
|
|
4425
|
+
ownerEcosystem: "go",
|
|
4426
|
+
currentEcosystem: "go",
|
|
4427
|
+
authoritative: true
|
|
4428
|
+
},
|
|
4429
|
+
goTemplating: {
|
|
4430
|
+
role: "templating",
|
|
4431
|
+
ecosystem: "go",
|
|
4432
|
+
ownerRole: "backend",
|
|
4433
|
+
ownerEcosystem: "go",
|
|
4434
|
+
currentEcosystem: "go",
|
|
4435
|
+
authoritative: true
|
|
4436
|
+
},
|
|
4437
|
+
goProtoTooling: {
|
|
4438
|
+
role: "buildTool",
|
|
4439
|
+
ecosystem: "go",
|
|
4440
|
+
ownerRole: "backend",
|
|
4441
|
+
ownerEcosystem: "go",
|
|
4442
|
+
currentEcosystem: "go",
|
|
4443
|
+
authoritative: true
|
|
4444
|
+
},
|
|
4445
|
+
goDI: {
|
|
4446
|
+
role: "libraries",
|
|
4447
|
+
ecosystem: "go",
|
|
4448
|
+
ownerRole: "backend",
|
|
4449
|
+
ownerEcosystem: "go",
|
|
4450
|
+
currentEcosystem: "go",
|
|
4451
|
+
authoritative: true
|
|
4452
|
+
},
|
|
3992
4453
|
dotnetOrm: {
|
|
3993
4454
|
role: "orm",
|
|
3994
4455
|
ecosystem: "dotnet",
|
|
@@ -4124,6 +4585,8 @@ const WEB_FRAMEWORKS = [
|
|
|
4124
4585
|
"tanstack-router",
|
|
4125
4586
|
"react-router",
|
|
4126
4587
|
"react-vite",
|
|
4588
|
+
"vanilla-vite",
|
|
4589
|
+
"vue",
|
|
4127
4590
|
"tanstack-start",
|
|
4128
4591
|
"next",
|
|
4129
4592
|
"vinext",
|
|
@@ -4138,11 +4601,32 @@ const WEB_FRAMEWORKS = [
|
|
|
4138
4601
|
"fresh",
|
|
4139
4602
|
"none"
|
|
4140
4603
|
];
|
|
4604
|
+
const CODEGEN_COMPATIBLE_FRONTENDS = [
|
|
4605
|
+
"tanstack-router",
|
|
4606
|
+
"react-router",
|
|
4607
|
+
"react-vite",
|
|
4608
|
+
"vanilla-vite",
|
|
4609
|
+
"vue",
|
|
4610
|
+
"tanstack-start",
|
|
4611
|
+
"next",
|
|
4612
|
+
"vinext",
|
|
4613
|
+
"nuxt",
|
|
4614
|
+
"svelte",
|
|
4615
|
+
"solid",
|
|
4616
|
+
"solid-start",
|
|
4617
|
+
"astro",
|
|
4618
|
+
"qwik",
|
|
4619
|
+
"angular",
|
|
4620
|
+
"redwood",
|
|
4621
|
+
"fresh"
|
|
4622
|
+
];
|
|
4141
4623
|
const ADDON_COMPATIBILITY = {
|
|
4142
4624
|
pwa: [
|
|
4143
4625
|
"tanstack-router",
|
|
4144
4626
|
"react-router",
|
|
4145
4627
|
"react-vite",
|
|
4628
|
+
"vanilla-vite",
|
|
4629
|
+
"vue",
|
|
4146
4630
|
"solid",
|
|
4147
4631
|
"next",
|
|
4148
4632
|
"vinext",
|
|
@@ -4156,6 +4640,8 @@ const ADDON_COMPATIBILITY = {
|
|
|
4156
4640
|
"tanstack-router",
|
|
4157
4641
|
"react-router",
|
|
4158
4642
|
"react-vite",
|
|
4643
|
+
"vanilla-vite",
|
|
4644
|
+
"vue",
|
|
4159
4645
|
"nuxt",
|
|
4160
4646
|
"svelte",
|
|
4161
4647
|
"solid",
|
|
@@ -4166,7 +4652,23 @@ const ADDON_COMPATIBILITY = {
|
|
|
4166
4652
|
"redwood",
|
|
4167
4653
|
"fresh"
|
|
4168
4654
|
],
|
|
4655
|
+
electron: [
|
|
4656
|
+
"tanstack-router",
|
|
4657
|
+
"react-vite",
|
|
4658
|
+
"vanilla-vite",
|
|
4659
|
+
"vue",
|
|
4660
|
+
"solid"
|
|
4661
|
+
],
|
|
4662
|
+
capacitor: [
|
|
4663
|
+
"tanstack-router",
|
|
4664
|
+
"react-vite",
|
|
4665
|
+
"vanilla-vite",
|
|
4666
|
+
"vue",
|
|
4667
|
+
"solid"
|
|
4668
|
+
],
|
|
4169
4669
|
biome: [],
|
|
4670
|
+
eslint: [],
|
|
4671
|
+
prettier: [],
|
|
4170
4672
|
husky: [],
|
|
4171
4673
|
lefthook: [],
|
|
4172
4674
|
turborepo: [],
|
|
@@ -4190,6 +4692,55 @@ const ADDON_COMPATIBILITY = {
|
|
|
4190
4692
|
"svelte",
|
|
4191
4693
|
"solid"
|
|
4192
4694
|
],
|
|
4695
|
+
axios: [
|
|
4696
|
+
"tanstack-router",
|
|
4697
|
+
"react-router",
|
|
4698
|
+
"react-vite",
|
|
4699
|
+
"vanilla-vite",
|
|
4700
|
+
"vue",
|
|
4701
|
+
"tanstack-start",
|
|
4702
|
+
"next",
|
|
4703
|
+
"vinext",
|
|
4704
|
+
"nuxt",
|
|
4705
|
+
"svelte",
|
|
4706
|
+
"solid",
|
|
4707
|
+
"solid-start",
|
|
4708
|
+
"astro",
|
|
4709
|
+
"qwik",
|
|
4710
|
+
"angular"
|
|
4711
|
+
],
|
|
4712
|
+
firebase: [
|
|
4713
|
+
"tanstack-router",
|
|
4714
|
+
"react-router",
|
|
4715
|
+
"react-vite",
|
|
4716
|
+
"vanilla-vite",
|
|
4717
|
+
"vue",
|
|
4718
|
+
"tanstack-start",
|
|
4719
|
+
"next",
|
|
4720
|
+
"vinext",
|
|
4721
|
+
"nuxt",
|
|
4722
|
+
"svelte",
|
|
4723
|
+
"solid",
|
|
4724
|
+
"solid-start",
|
|
4725
|
+
"astro",
|
|
4726
|
+
"qwik",
|
|
4727
|
+
"angular"
|
|
4728
|
+
],
|
|
4729
|
+
"graphql-codegen": CODEGEN_COMPATIBLE_FRONTENDS,
|
|
4730
|
+
"openapi-typescript": CODEGEN_COMPATIBLE_FRONTENDS,
|
|
4731
|
+
"apollo-client": [
|
|
4732
|
+
"tanstack-router",
|
|
4733
|
+
"react-router",
|
|
4734
|
+
"react-vite",
|
|
4735
|
+
"vue",
|
|
4736
|
+
"tanstack-start",
|
|
4737
|
+
"next",
|
|
4738
|
+
"vinext",
|
|
4739
|
+
"nuxt",
|
|
4740
|
+
"svelte",
|
|
4741
|
+
"solid",
|
|
4742
|
+
"solid-start"
|
|
4743
|
+
],
|
|
4193
4744
|
swr: [
|
|
4194
4745
|
"tanstack-router",
|
|
4195
4746
|
"react-router",
|
|
@@ -4293,6 +4844,7 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
|
|
|
4293
4844
|
const includesAngular = frontends.includes("angular");
|
|
4294
4845
|
const includesRedwood = frontends.includes("redwood");
|
|
4295
4846
|
const includesFresh = frontends.includes("fresh");
|
|
4847
|
+
const includesStandaloneVite = frontends.includes("vanilla-vite") || frontends.includes("vue");
|
|
4296
4848
|
const includesNative = frontends.some((frontend) => [
|
|
4297
4849
|
"native-bare",
|
|
4298
4850
|
"native-uniwind",
|
|
@@ -4315,6 +4867,12 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
|
|
|
4315
4867
|
"garph",
|
|
4316
4868
|
"none"
|
|
4317
4869
|
];
|
|
4870
|
+
if (includesStandaloneVite) return [
|
|
4871
|
+
"graphql-yoga",
|
|
4872
|
+
"apollo-server",
|
|
4873
|
+
"openapi",
|
|
4874
|
+
"none"
|
|
4875
|
+
];
|
|
4318
4876
|
if (includesQwik || includesAngular || includesRedwood || includesFresh) return ["graphql-yoga", "none"];
|
|
4319
4877
|
const includesSolidStartApi = frontends.includes("solid-start");
|
|
4320
4878
|
if (includesNuxt || includesSvelte || includesSolid || includesSolidStartApi) return [
|
|
@@ -4349,7 +4907,23 @@ function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration)
|
|
|
4349
4907
|
const includesRedwood = frontends.includes("redwood");
|
|
4350
4908
|
const includesFresh = frontends.includes("fresh");
|
|
4351
4909
|
const includesSolidStart = frontends.includes("solid-start");
|
|
4910
|
+
const includesStandaloneVite = frontends.includes("vanilla-vite") || frontends.includes("vue");
|
|
4352
4911
|
const isReactOnlyApi = api === "trpc" || api === "ts-rest" || api === "garph" || api === "apollo-server";
|
|
4912
|
+
if (includesStandaloneVite && (api === "trpc" || api === "orpc" || api === "ts-rest" || api === "garph")) return {
|
|
4913
|
+
code: "STANDALONE_VITE_API_UNSUPPORTED",
|
|
4914
|
+
message: "Standalone Vite frontends support only GraphQL and OpenAPI API integrations.",
|
|
4915
|
+
category: "api",
|
|
4916
|
+
optionId: api,
|
|
4917
|
+
provided: {
|
|
4918
|
+
api,
|
|
4919
|
+
frontend: frontends.includes("vanilla-vite") ? "vanilla-vite" : "vue"
|
|
4920
|
+
},
|
|
4921
|
+
suggestions: [
|
|
4922
|
+
"Use --api graphql-yoga, --api apollo-server, or --api openapi",
|
|
4923
|
+
"Choose a React-based frontend for tRPC, oRPC, ts-rest, or garph",
|
|
4924
|
+
"Use --api none"
|
|
4925
|
+
]
|
|
4926
|
+
};
|
|
4353
4927
|
if ((includesNuxt || includesSvelte || includesSolid || includesSolidStart) && isReactOnlyApi) {
|
|
4354
4928
|
const incompatibleFrontend = includesNuxt ? "nuxt" : includesSvelte ? "svelte" : includesSolid ? "solid" : "solid-start";
|
|
4355
4929
|
return {
|
|
@@ -4517,21 +5091,33 @@ function getCompatibleUILibraries(frontends = [], astroIntegration) {
|
|
|
4517
5091
|
return compatibility.frontends.includes(webFrontend);
|
|
4518
5092
|
});
|
|
4519
5093
|
}
|
|
4520
|
-
function getCompatibleCSSFrameworks(uiLibrary) {
|
|
4521
|
-
|
|
5094
|
+
function getCompatibleCSSFrameworks(uiLibrary, frontends = []) {
|
|
5095
|
+
const frameworks = !uiLibrary || uiLibrary === "none" ? [
|
|
4522
5096
|
"tailwind",
|
|
4523
5097
|
"scss",
|
|
4524
5098
|
"less",
|
|
4525
5099
|
"postcss-only",
|
|
5100
|
+
"styled-components",
|
|
4526
5101
|
"none"
|
|
5102
|
+
] : [...UI_LIBRARY_COMPATIBILITY[uiLibrary].cssFrameworks];
|
|
5103
|
+
if (frontends.length === 0) return frameworks;
|
|
5104
|
+
const reactFrontends = [
|
|
5105
|
+
"tanstack-router",
|
|
5106
|
+
"react-router",
|
|
5107
|
+
"react-vite",
|
|
5108
|
+
"tanstack-start",
|
|
5109
|
+
"next",
|
|
5110
|
+
"vinext",
|
|
5111
|
+
"redwood"
|
|
4527
5112
|
];
|
|
4528
|
-
return
|
|
5113
|
+
return frontends.some((frontend) => reactFrontends.includes(frontend)) ? frameworks : frameworks.filter((framework) => framework !== "styled-components");
|
|
4529
5114
|
}
|
|
4530
5115
|
function hasWebStyling(frontends = []) {
|
|
4531
5116
|
const { web } = splitFrontends(frontends);
|
|
4532
5117
|
return web.length > 0;
|
|
4533
5118
|
}
|
|
4534
5119
|
function getCompatibleFormLibraries(frontends = []) {
|
|
5120
|
+
if (frontends.some((frontend) => ["vanilla-vite", "vue"].includes(frontend))) return ["none"];
|
|
4535
5121
|
const hasSolid = frontends.includes("solid");
|
|
4536
5122
|
const hasSolidStart = frontends.includes("solid-start");
|
|
4537
5123
|
const hasQwik = frontends.includes("qwik");
|
|
@@ -4567,6 +5153,8 @@ function evaluateCompatibility(input) {
|
|
|
4567
5153
|
["forms", input.forms],
|
|
4568
5154
|
["stateManagement", input.stateManagement],
|
|
4569
5155
|
["animation", input.animation],
|
|
5156
|
+
["cms", input.cms],
|
|
5157
|
+
["featureFlags", input.featureFlags],
|
|
4570
5158
|
["pythonApi", input.pythonApi],
|
|
4571
5159
|
["javaWebFramework", input.javaWebFramework],
|
|
4572
5160
|
["javaBuildTool", input.javaBuildTool],
|
|
@@ -4594,6 +5182,11 @@ function evaluateCompatibility(input) {
|
|
|
4594
5182
|
["elixirObservability", input.elixirObservability],
|
|
4595
5183
|
["elixirTesting", input.elixirTesting],
|
|
4596
5184
|
["elixirQuality", input.elixirQuality],
|
|
5185
|
+
["elixirI18n", input.elixirI18n],
|
|
5186
|
+
["elixirHttpServer", input.elixirHttpServer],
|
|
5187
|
+
["elixirApplicationFramework", input.elixirApplicationFramework],
|
|
5188
|
+
["elixirDocumentation", input.elixirDocumentation],
|
|
5189
|
+
["elixirClustering", input.elixirClustering],
|
|
4597
5190
|
["elixirDeploy", input.elixirDeploy]
|
|
4598
5191
|
];
|
|
4599
5192
|
for (const [category, optionId] of scalarChecks) {
|
|
@@ -4788,6 +5381,12 @@ const DEFAULT_STACK_SELECTION = {
|
|
|
4788
5381
|
goCaching: "none",
|
|
4789
5382
|
goConfig: "none",
|
|
4790
5383
|
goObservability: "none",
|
|
5384
|
+
goValidation: "none",
|
|
5385
|
+
goQuality: "none",
|
|
5386
|
+
goMigrations: "none",
|
|
5387
|
+
goTemplating: "none",
|
|
5388
|
+
goProtoTooling: "none",
|
|
5389
|
+
goDI: "none",
|
|
4791
5390
|
javaLanguage: "java",
|
|
4792
5391
|
javaWebFramework: "spring-boot",
|
|
4793
5392
|
javaBuildTool: "maven",
|
|
@@ -4822,6 +5421,11 @@ const DEFAULT_STACK_SELECTION = {
|
|
|
4822
5421
|
elixirObservability: "telemetry",
|
|
4823
5422
|
elixirTesting: "ex_unit",
|
|
4824
5423
|
elixirQuality: "credo",
|
|
5424
|
+
elixirI18n: "none",
|
|
5425
|
+
elixirHttpServer: "cowboy",
|
|
5426
|
+
elixirApplicationFramework: "none",
|
|
5427
|
+
elixirDocumentation: "none",
|
|
5428
|
+
elixirClustering: "none",
|
|
4825
5429
|
elixirDeploy: "none",
|
|
4826
5430
|
elixirLibraries: []
|
|
4827
5431
|
};
|
|
@@ -4934,6 +5538,12 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
|
|
|
4934
5538
|
goCaching: "goCaching",
|
|
4935
5539
|
goConfig: "goConfig",
|
|
4936
5540
|
goObservability: "goObservability",
|
|
5541
|
+
goValidation: "goValidation",
|
|
5542
|
+
goQuality: "goQuality",
|
|
5543
|
+
goMigrations: "goMigrations",
|
|
5544
|
+
goTemplating: "goTemplating",
|
|
5545
|
+
goProtoTooling: "goProtoTooling",
|
|
5546
|
+
goDI: "goDI",
|
|
4937
5547
|
javaLanguage: "javaLanguage",
|
|
4938
5548
|
javaWebFramework: "javaWebFramework",
|
|
4939
5549
|
javaBuildTool: "javaBuildTool",
|
|
@@ -4968,6 +5578,11 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
|
|
|
4968
5578
|
elixirObservability: "elixirObservability",
|
|
4969
5579
|
elixirTesting: "elixirTesting",
|
|
4970
5580
|
elixirQuality: "elixirQuality",
|
|
5581
|
+
elixirI18n: "elixirI18n",
|
|
5582
|
+
elixirHttpServer: "elixirHttpServer",
|
|
5583
|
+
elixirApplicationFramework: "elixirApplicationFramework",
|
|
5584
|
+
elixirDocumentation: "elixirDocumentation",
|
|
5585
|
+
elixirClustering: "elixirClustering",
|
|
4971
5586
|
elixirDeploy: "elixirDeploy",
|
|
4972
5587
|
elixirLibraries: "elixirLibraries"
|
|
4973
5588
|
};
|
|
@@ -5094,6 +5709,12 @@ const STACK_SELECTION_URL_KEYS = {
|
|
|
5094
5709
|
goCaching: "gcache",
|
|
5095
5710
|
goConfig: "gcfg",
|
|
5096
5711
|
goObservability: "gobs",
|
|
5712
|
+
goValidation: "gval",
|
|
5713
|
+
goQuality: "gqual",
|
|
5714
|
+
goMigrations: "gmig",
|
|
5715
|
+
goTemplating: "gtpl",
|
|
5716
|
+
goProtoTooling: "gproto",
|
|
5717
|
+
goDI: "gdi",
|
|
5097
5718
|
javaLanguage: "jlang",
|
|
5098
5719
|
javaWebFramework: "jwf",
|
|
5099
5720
|
javaBuildTool: "jbt",
|
|
@@ -5128,6 +5749,11 @@ const STACK_SELECTION_URL_KEYS = {
|
|
|
5128
5749
|
elixirObservability: "eobs",
|
|
5129
5750
|
elixirTesting: "etest",
|
|
5130
5751
|
elixirQuality: "eq",
|
|
5752
|
+
elixirI18n: "ei18n",
|
|
5753
|
+
elixirHttpServer: "ehs",
|
|
5754
|
+
elixirApplicationFramework: "eaf",
|
|
5755
|
+
elixirDocumentation: "edoc",
|
|
5756
|
+
elixirClustering: "ecluster",
|
|
5131
5757
|
elixirDeploy: "edeploy",
|
|
5132
5758
|
elixirLibraries: "elib"
|
|
5133
5759
|
};
|
|
@@ -5320,6 +5946,12 @@ const CLI_SCALAR_CONFIG_FIELDS = [
|
|
|
5320
5946
|
["goCaching", "goCaching"],
|
|
5321
5947
|
["goConfig", "goConfig"],
|
|
5322
5948
|
["goObservability", "goObservability"],
|
|
5949
|
+
["goValidation", "goValidation"],
|
|
5950
|
+
["goQuality", "goQuality"],
|
|
5951
|
+
["goMigrations", "goMigrations"],
|
|
5952
|
+
["goTemplating", "goTemplating"],
|
|
5953
|
+
["goProtoTooling", "goProtoTooling"],
|
|
5954
|
+
["goDI", "goDI"],
|
|
5323
5955
|
["javaLanguage", "javaLanguage"],
|
|
5324
5956
|
["javaWebFramework", "javaWebFramework"],
|
|
5325
5957
|
["javaBuildTool", "javaBuildTool"],
|
|
@@ -5350,6 +5982,11 @@ const CLI_SCALAR_CONFIG_FIELDS = [
|
|
|
5350
5982
|
["elixirObservability", "elixirObservability"],
|
|
5351
5983
|
["elixirTesting", "elixirTesting"],
|
|
5352
5984
|
["elixirQuality", "elixirQuality"],
|
|
5985
|
+
["elixirI18n", "elixirI18n"],
|
|
5986
|
+
["elixirHttpServer", "elixirHttpServer"],
|
|
5987
|
+
["elixirApplicationFramework", "elixirApplicationFramework"],
|
|
5988
|
+
["elixirDocumentation", "elixirDocumentation"],
|
|
5989
|
+
["elixirClustering", "elixirClustering"],
|
|
5353
5990
|
["elixirDeploy", "elixirDeploy"]
|
|
5354
5991
|
];
|
|
5355
5992
|
const CLI_NON_EMPTY_ARRAY_CONFIG_FIELDS = [
|
|
@@ -5429,7 +6066,13 @@ const GO_CONFIG_KEYS = [
|
|
|
5429
6066
|
"goMessageQueue",
|
|
5430
6067
|
"goCaching",
|
|
5431
6068
|
"goConfig",
|
|
5432
|
-
"goObservability"
|
|
6069
|
+
"goObservability",
|
|
6070
|
+
"goValidation",
|
|
6071
|
+
"goQuality",
|
|
6072
|
+
"goMigrations",
|
|
6073
|
+
"goTemplating",
|
|
6074
|
+
"goProtoTooling",
|
|
6075
|
+
"goDI"
|
|
5433
6076
|
];
|
|
5434
6077
|
const JAVA_CONFIG_KEYS = [
|
|
5435
6078
|
"javaLanguage",
|
|
@@ -5470,6 +6113,11 @@ const ELIXIR_CONFIG_KEYS = [
|
|
|
5470
6113
|
"elixirObservability",
|
|
5471
6114
|
"elixirTesting",
|
|
5472
6115
|
"elixirQuality",
|
|
6116
|
+
"elixirI18n",
|
|
6117
|
+
"elixirHttpServer",
|
|
6118
|
+
"elixirApplicationFramework",
|
|
6119
|
+
"elixirDocumentation",
|
|
6120
|
+
"elixirClustering",
|
|
5473
6121
|
"elixirDeploy",
|
|
5474
6122
|
"elixirLibraries"
|
|
5475
6123
|
];
|
|
@@ -5482,35 +6130,6 @@ const REACT_NATIVE_CONFIG_KEYS = [
|
|
|
5482
6130
|
"mobileOTA",
|
|
5483
6131
|
"mobileDeepLinking"
|
|
5484
6132
|
];
|
|
5485
|
-
const COMMAND_ADDONS = new Set([
|
|
5486
|
-
"pwa",
|
|
5487
|
-
"tauri",
|
|
5488
|
-
"starlight",
|
|
5489
|
-
"biome",
|
|
5490
|
-
"lefthook",
|
|
5491
|
-
"husky",
|
|
5492
|
-
"turborepo",
|
|
5493
|
-
"nx",
|
|
5494
|
-
"docker-compose",
|
|
5495
|
-
"devcontainer",
|
|
5496
|
-
"github-actions",
|
|
5497
|
-
"ultracite",
|
|
5498
|
-
"fumadocs",
|
|
5499
|
-
"oxlint",
|
|
5500
|
-
"ruler",
|
|
5501
|
-
"opentui",
|
|
5502
|
-
"mcp",
|
|
5503
|
-
"skills",
|
|
5504
|
-
"wxt",
|
|
5505
|
-
"msw",
|
|
5506
|
-
"storybook",
|
|
5507
|
-
"swr",
|
|
5508
|
-
"tanstack-query",
|
|
5509
|
-
"tanstack-table",
|
|
5510
|
-
"tanstack-virtual",
|
|
5511
|
-
"tanstack-db",
|
|
5512
|
-
"tanstack-pacer"
|
|
5513
|
-
]);
|
|
5514
6133
|
function withoutNone(values) {
|
|
5515
6134
|
return values.filter((value) => value !== "none");
|
|
5516
6135
|
}
|
|
@@ -5532,7 +6151,7 @@ function formatTypeScriptAddonsFlag(selection) {
|
|
|
5532
6151
|
...selection.appPlatforms
|
|
5533
6152
|
];
|
|
5534
6153
|
if (addons.length === 0) return "--addons none";
|
|
5535
|
-
return `--addons ${addons
|
|
6154
|
+
return `--addons ${toUniqueNonNoneArray(addons).join(" ") || "none"}`;
|
|
5536
6155
|
}
|
|
5537
6156
|
const GRAPH_TYPESCRIPT_FRONTEND_FLAG_KEYS = [["validation", "validation"], ["testing", "testing"]];
|
|
5538
6157
|
const GRAPH_SHADCN_FLAG_KEYS = [
|
|
@@ -5605,6 +6224,11 @@ const GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS = [
|
|
|
5605
6224
|
["elixirObservability", "observability"],
|
|
5606
6225
|
["elixirTesting", "testing"],
|
|
5607
6226
|
["elixirQuality", "codeQuality"],
|
|
6227
|
+
["elixirI18n", "i18n"],
|
|
6228
|
+
["elixirHttpServer", "runtime"],
|
|
6229
|
+
["elixirApplicationFramework", "libraries"],
|
|
6230
|
+
["elixirDocumentation", "documentation"],
|
|
6231
|
+
["elixirClustering", "config"],
|
|
5608
6232
|
["elixirDeploy", "deploy"]
|
|
5609
6233
|
];
|
|
5610
6234
|
const GRAPH_DATABASE_PART_SELECTION_KEYS = [["dbSetup", "dbSetup"]];
|
|
@@ -5638,6 +6262,12 @@ const GRAPH_PYTHON_BACKEND_ARRAY_PART_SELECTION_KEYS = [["pythonAi", "ai"]];
|
|
|
5638
6262
|
const GRAPH_GO_BACKEND_PART_SELECTION_KEYS = [
|
|
5639
6263
|
["goCli", "cli"],
|
|
5640
6264
|
["goLogging", "logging"],
|
|
6265
|
+
["goValidation", "validation"],
|
|
6266
|
+
["goQuality", "codeQuality"],
|
|
6267
|
+
["goMigrations", "migrations"],
|
|
6268
|
+
["goTemplating", "templating"],
|
|
6269
|
+
["goProtoTooling", "buildTool"],
|
|
6270
|
+
["goDI", "libraries"],
|
|
5641
6271
|
["caching", "caching"],
|
|
5642
6272
|
["search", "search"]
|
|
5643
6273
|
];
|
|
@@ -5697,6 +6327,11 @@ const GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS = [
|
|
|
5697
6327
|
["elixirObservability", "observability"],
|
|
5698
6328
|
["elixirTesting", "testing"],
|
|
5699
6329
|
["elixirQuality", "codeQuality"],
|
|
6330
|
+
["elixirI18n", "i18n"],
|
|
6331
|
+
["elixirHttpServer", "runtime"],
|
|
6332
|
+
["elixirApplicationFramework", "libraries"],
|
|
6333
|
+
["elixirDocumentation", "documentation"],
|
|
6334
|
+
["elixirClustering", "config"],
|
|
5700
6335
|
["elixirDeploy", "deploy"]
|
|
5701
6336
|
];
|
|
5702
6337
|
const GRAPH_DATABASE_PART_CLI_KEYS = [["dbSetup", "dbSetup"]];
|
|
@@ -5730,6 +6365,12 @@ const GRAPH_PYTHON_BACKEND_ARRAY_PART_CLI_KEYS = [["pythonAi", "ai"]];
|
|
|
5730
6365
|
const GRAPH_GO_BACKEND_PART_CLI_KEYS = [
|
|
5731
6366
|
["goCli", "cli"],
|
|
5732
6367
|
["goLogging", "logging"],
|
|
6368
|
+
["goValidation", "validation"],
|
|
6369
|
+
["goQuality", "codeQuality"],
|
|
6370
|
+
["goMigrations", "migrations"],
|
|
6371
|
+
["goTemplating", "templating"],
|
|
6372
|
+
["goProtoTooling", "buildTool"],
|
|
6373
|
+
["goDI", "libraries"],
|
|
5733
6374
|
["caching", "caching"],
|
|
5734
6375
|
["search", "search"]
|
|
5735
6376
|
];
|
|
@@ -6223,6 +6864,12 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
6223
6864
|
goCaching: stack.goCaching,
|
|
6224
6865
|
goConfig: stack.goConfig,
|
|
6225
6866
|
goObservability: stack.goObservability,
|
|
6867
|
+
goValidation: stack.goValidation,
|
|
6868
|
+
goQuality: stack.goQuality,
|
|
6869
|
+
goMigrations: stack.goMigrations,
|
|
6870
|
+
goTemplating: stack.goTemplating,
|
|
6871
|
+
goProtoTooling: stack.goProtoTooling,
|
|
6872
|
+
goDI: stack.goDI,
|
|
6226
6873
|
javaLanguage: stack.javaLanguage,
|
|
6227
6874
|
javaWebFramework: stack.javaWebFramework,
|
|
6228
6875
|
javaBuildTool: stack.javaBuildTool,
|
|
@@ -6257,6 +6904,11 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
6257
6904
|
elixirObservability: stack.elixirObservability,
|
|
6258
6905
|
elixirTesting: stack.elixirTesting,
|
|
6259
6906
|
elixirQuality: stack.elixirQuality,
|
|
6907
|
+
elixirI18n: stack.elixirI18n,
|
|
6908
|
+
elixirHttpServer: stack.elixirHttpServer,
|
|
6909
|
+
elixirApplicationFramework: stack.elixirApplicationFramework,
|
|
6910
|
+
elixirDocumentation: stack.elixirDocumentation,
|
|
6911
|
+
elixirClustering: stack.elixirClustering,
|
|
6260
6912
|
elixirDeploy: stack.elixirDeploy,
|
|
6261
6913
|
elixirLibraries: toUniqueNonNoneArray(stack.elixirLibraries),
|
|
6262
6914
|
aiDocs: toUniqueNonNoneArray(stack.aiDocs)
|
|
@@ -6511,6 +7163,12 @@ function generateGoCommand(selection, projectName) {
|
|
|
6511
7163
|
`--go-caching ${selection.goCaching}`,
|
|
6512
7164
|
`--go-config ${selection.goConfig}`,
|
|
6513
7165
|
`--go-observability ${selection.goObservability}`,
|
|
7166
|
+
`--go-validation ${selection.goValidation}`,
|
|
7167
|
+
`--go-quality ${selection.goQuality}`,
|
|
7168
|
+
`--go-migrations ${selection.goMigrations}`,
|
|
7169
|
+
`--go-templating ${selection.goTemplating}`,
|
|
7170
|
+
`--go-proto-tooling ${selection.goProtoTooling}`,
|
|
7171
|
+
`--go-di ${selection.goDI}`,
|
|
6514
7172
|
`--auth ${selection.auth}`,
|
|
6515
7173
|
`--email ${selection.email}`,
|
|
6516
7174
|
`--observability ${selection.observability}`,
|
|
@@ -6581,6 +7239,11 @@ function generateElixirCommand(selection, projectName) {
|
|
|
6581
7239
|
`--elixir-observability ${selection.elixirObservability}`,
|
|
6582
7240
|
`--elixir-testing ${selection.elixirTesting}`,
|
|
6583
7241
|
`--elixir-quality ${selection.elixirQuality}`,
|
|
7242
|
+
`--elixir-i18n ${selection.elixirI18n}`,
|
|
7243
|
+
`--elixir-http-server ${selection.elixirHttpServer}`,
|
|
7244
|
+
`--elixir-application-framework ${selection.elixirApplicationFramework}`,
|
|
7245
|
+
`--elixir-documentation ${selection.elixirDocumentation}`,
|
|
7246
|
+
`--elixir-clustering ${selection.elixirClustering}`,
|
|
6584
7247
|
`--elixir-deploy ${selection.elixirDeploy}`,
|
|
6585
7248
|
formatArrayFlag("elixir-libraries", selection.elixirLibraries),
|
|
6586
7249
|
formatArrayFlag("ai-docs", selection.aiDocs)
|
|
@@ -6606,5 +7269,5 @@ function generateStackSelectionCommand(selection) {
|
|
|
6606
7269
|
}
|
|
6607
7270
|
|
|
6608
7271
|
//#endregion
|
|
6609
|
-
export {
|
|
6610
|
-
//# sourceMappingURL=stack-translation-
|
|
7272
|
+
export { REACT_NATIVE_CATEGORY_ORDER as $, getCompatibleAddons as A, requiresChatSdkVercelAI as B, KOTLIN_DROPPED_JAVA_LIBRARIES as C, evaluateCompatibility as D, analyzeStackCompatibility as E, getKotlinJavaIncompatibilityReason as F, validateProjectName as G, splitFrontends as H, hasWebStyling as I, ELIXIR_CATEGORY_ORDER as J, CATEGORY_ORDER as K, isFrontendAllowedWithBackend as L, getCompatibleFormLibraries as M, getCompatibleUILibraries as N, getAIFrontendCompatibilityIssue as O, getDisabledReason as P, PYTHON_CATEGORY_ORDER as Q, isOptionCompatible as R, usesVirtualNoneStackSelection as S, allowedApisForFrontends as T, stackQualifiesForSingleApp as U, requiresChatSdkVercelAIForSelection as V, validateAddonCompatibility as W, JAVA_CATEGORY_ORDER as X, GO_CATEGORY_ORDER as Y, OPTION_CATEGORY_METADATA as Z, parseStackSelectionFromSearch as _, STACK_SELECTION_URL_KEYS as a, getCategoryOrderForEcosystem as at, stackSelectionToCliComparableConfig as b, cloneDefaultStackSelection as c, normalizeOptionId as ct, isArrayStackSelectionKey as d, getSupportedCapabilityOptions as dt, RUST_CATEGORY_ORDER as et, isCliDefaultStackSelection as f, normalizeCapabilitySelection as ft, normalizeStackSelectionValue as g, normalizeStackSelection as h, STACK_SELECTION_OPTION_CATEGORY_BY_KEY as i, getCategoryOptionIds as it, getCompatibleCSSFrameworks as j, getApiFrontendCompatibilityIssue as k, createStackSelectionSearchParams as l, getCapabilityDefinitions as lt, isStackSelectionDefault as m, NON_OPTION_STACK_SELECTION_KEYS as n, getCategoryCliValues as nt, VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS as o, getOptionMetadata as ot, isGraphStackSelection as p, DOTNET_CATEGORY_ORDER as q, STACK_SELECTION_KEYS as r, getCategoryDisplayName as rt, cliInputToProjectConfigPartial as s, isMultiSelectCategory as st, DEFAULT_STACK_SELECTION as t, TYPESCRIPT_CATEGORY_ORDER as tt, generateStackSelectionCommand as u, getCapabilityDisabledReason as ut, parseStackSelectionFromUrlRecord as v, KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES as w, stackSelectionToProjectConfig as x, processCliArrayOption as y, isWebFrontend as z };
|
|
7273
|
+
//# sourceMappingURL=stack-translation-Kr0TyRAm.mjs.map
|